diff --git a/TODO b/TODO index 9f1dc80..0461eb8 100644 --- a/TODO +++ b/TODO @@ -1,3 +1 @@ -1.long polling -2.connect timeout -3.namespace \ No newline at end of file +1.connect timeout \ No newline at end of file diff --git a/client.go b/client.go index df3aa2d..ad9176e 100644 --- a/client.go +++ b/client.go @@ -1,17 +1,15 @@ package socketio_client import ( - "net/http" "net/url" "reflect" + "path" + "strings" ) -var defaultTransport = "websocket" - type Options struct { Transport string //protocol name string,websocket polling... Query map[string]string //url的附加的参数 - } type Client struct { @@ -19,41 +17,36 @@ type Client struct { conn *clientConn - events map[string]*caller - acks map[int]*caller + events map[string]*caller + acks map[int]*caller id int namespace string } func NewClient(uri string, opts *Options) (client *Client, err error) { - exist := false - for _, b := range transports { - if b == opts.Transport { - exist = true - } - } - if !exist { - opts.Transport = defaultTransport - } - request := &http.Request{} - request.URL, err = url.Parse(uri) + url, err := url.Parse(uri) if err != nil { return } - q := request.URL.Query() + url.Path = path.Join("/socket.io",url.Path) + url.Path = url.EscapedPath() + if strings.HasSuffix(url.Path,"socket.io"){ + url.Path+="/" + } + q := url.Query() for k, v := range opts.Query { q.Set(k, v) } - request.URL.RawQuery = q.Encode() + url.RawQuery = q.Encode() - socket, err := newClientConn(opts.Transport, request) + socket, err := newClientConn(opts.Transport, url) if err != nil { return } client = &Client{ - opts: opts, + opts: opts, conn: socket, events: make(map[string]*caller), diff --git a/client_conn.go b/client_conn.go index 0f06985..977aab1 100644 --- a/client_conn.go +++ b/client_conn.go @@ -11,6 +11,7 @@ import ( "github.com/googollee/go-engine.io/websocket" "io" "net/http" + "net/url" "strings" "sync" "time" @@ -55,6 +56,7 @@ const ( type clientConn struct { id string transportName string + url *url.URL request *http.Request writerLocker sync.Mutex transportLocker sync.RWMutex @@ -70,13 +72,18 @@ type clientConn struct { pingChan chan bool } -func newClientConn(transportName string, r *http.Request) (client *clientConn, err error) { +func newClientConn(transportName string, u *url.URL) (client *clientConn, err error) { if transportName == "" { - transportName = "polling" + transportName = "websocket" + } + + _, exists := creaters[transportName] + if !exists { + return nil, InvalidError } client = &clientConn{ - request: r, + url: u, transportName: transportName, state: stateNormal, pingTimeout: 60000 * time.Millisecond, @@ -245,6 +252,12 @@ func (c *clientConn) OnClose(server transport.Client) { func (c *clientConn) onOpen() error { + var err error + c.request, err = http.NewRequest("GET", c.url.String(), nil) + if err != nil { + return err + } + creater, exists := creaters["polling"] if !exists { return InvalidError @@ -316,29 +329,35 @@ func (c *clientConn) onOpen() error { } //fmt.Println(string(p2)) - //upgrade - creater, exists = creaters["websocket"] - if !exists { - return InvalidError - } + if c.transportName == "polling" { + //over + } else if c.transportName == "websocket" { + //upgrade + creater, exists = creaters["websocket"] + if !exists { + return InvalidError + } - c.request.URL.Scheme = "ws" - q.Set("sid", c.id) - q.Set("transport", "websocket") - c.request.URL.RawQuery = q.Encode() + c.request.URL.Scheme = "ws" + q.Set("sid", c.id) + q.Set("transport", "websocket") + c.request.URL.RawQuery = q.Encode() - transport, err = creater.Client(c.request) - if err != nil { - return err - } - c.setUpgrading("websocket", transport) + transport, err = creater.Client(c.request) + if err != nil { + return err + } + c.setUpgrading("websocket", transport) - w, err := c.getUpgrade().NextWriter(message.MessageText, parser.PING) - if err != nil { - return err + w, err := c.getUpgrade().NextWriter(message.MessageText, parser.PING) + if err != nil { + return err + } + w.Write([]byte("probe")) + w.Close() + } else { + return InvalidError } - w.Write([]byte("probe")) - w.Close() //fmt.Println("end") diff --git a/example/main.go b/example/main.go index 0f983e7..feab087 100644 --- a/example/main.go +++ b/example/main.go @@ -10,12 +10,13 @@ import ( func main() { opts := &socketio_client.Options{ - Transport: "websocket", + //Transport:"polling", + Transport:"websocket", Query: make(map[string]string), } opts.Query["user"] = "user" opts.Query["pwd"] = "pass" - uri := "http://192.168.1.70:9090/socket.io/" + uri := "http://192.168.1.70:9090" client, err := socketio_client.NewClient(uri, opts) if err != nil { diff --git a/example/test.go b/example/test.go index 572fec9..0e143d7 100644 --- a/example/test.go +++ b/example/test.go @@ -11,12 +11,13 @@ import ( func main() { opts := &socketio_client.Options{ + //Transport:"polling", Transport:"websocket", Query:make(map[string]string), } opts.Query["uid"] = "1" opts.Query["cid"] = "conf_123" - uri := "http://192.168.1.70:9090/socket.io/" + uri := "http://192.168.1.70:9090" client,err := socketio_client.NewClient(uri,opts) if err != nil {