diff options
Diffstat (limited to 'libgo/go/websocket')
-rw-r--r-- | libgo/go/websocket/client.go | 44 | ||||
-rw-r--r-- | libgo/go/websocket/server.go | 3 | ||||
-rw-r--r-- | libgo/go/websocket/websocket.go | 2 | ||||
-rw-r--r-- | libgo/go/websocket/websocket_test.go | 9 |
4 files changed, 30 insertions, 28 deletions
diff --git a/libgo/go/websocket/client.go b/libgo/go/websocket/client.go index 78c8b7f..74bede4 100644 --- a/libgo/go/websocket/client.go +++ b/libgo/go/websocket/client.go @@ -7,7 +7,6 @@ package websocket import ( "bufio" "bytes" - "container/vector" "crypto/tls" "fmt" "http" @@ -16,20 +15,23 @@ import ( "os" "rand" "strings" + "url" ) type ProtocolError struct { - os.ErrorString + ErrorString string } +func (err *ProtocolError) String() string { return string(err.ErrorString) } + var ( - ErrBadScheme = os.ErrorString("bad scheme") + ErrBadScheme = &ProtocolError{"bad scheme"} ErrBadStatus = &ProtocolError{"bad status"} ErrBadUpgrade = &ProtocolError{"missing or bad upgrade"} ErrBadWebSocketOrigin = &ProtocolError{"missing or bad WebSocket-Origin"} ErrBadWebSocketLocation = &ProtocolError{"missing or bad WebSocket-Location"} ErrBadWebSocketProtocol = &ProtocolError{"missing or bad WebSocket-Protocol"} - ErrChallengeResponse = &ProtocolError{"mismatch challange/response"} + ErrChallengeResponse = &ProtocolError{"mismatch challenge/response"} secKeyRandomChars [0x30 - 0x21 + 0x7F - 0x3A]byte ) @@ -98,10 +100,10 @@ A trivial example client: // use msg[0:n] } */ -func Dial(url, protocol, origin string) (ws *Conn, err os.Error) { +func Dial(url_, protocol, origin string) (ws *Conn, err os.Error) { var client net.Conn - parsedUrl, err := http.ParseURL(url) + parsedUrl, err := url.Parse(url_) if err != nil { goto Error } @@ -120,14 +122,14 @@ func Dial(url, protocol, origin string) (ws *Conn, err os.Error) { goto Error } - ws, err = newClient(parsedUrl.RawPath, parsedUrl.Host, origin, url, protocol, client, handshake) + ws, err = newClient(parsedUrl.RawPath, parsedUrl.Host, origin, url_, protocol, client, handshake) if err != nil { goto Error } return Error: - return nil, &DialError{url, protocol, origin, err} + return nil, &DialError{url_, protocol, origin, err} } /* @@ -199,21 +201,21 @@ func handshake(resourceName, host, origin, location, protocol string, br *bufio. bw.WriteString("GET " + resourceName + " HTTP/1.1\r\n") // Step 6-14. push request headers in fields. - var fields vector.StringVector - fields.Push("Upgrade: WebSocket\r\n") - fields.Push("Connection: Upgrade\r\n") - fields.Push("Host: " + host + "\r\n") - fields.Push("Origin: " + origin + "\r\n") + var fields []string + fields = append(fields, "Upgrade: WebSocket\r\n") + fields = append(fields, "Connection: Upgrade\r\n") + fields = append(fields, "Host: "+host+"\r\n") + fields = append(fields, "Origin: "+origin+"\r\n") if protocol != "" { - fields.Push("Sec-WebSocket-Protocol: " + protocol + "\r\n") + fields = append(fields, "Sec-WebSocket-Protocol: "+protocol+"\r\n") } // TODO(ukai): Step 15. send cookie if any. // Step 16-23. generate keys and push Sec-WebSocket-Key<n> in fields. key1, number1 := generateKeyNumber() key2, number2 := generateKeyNumber() - fields.Push("Sec-WebSocket-Key1: " + key1 + "\r\n") - fields.Push("Sec-WebSocket-Key2: " + key2 + "\r\n") + fields = append(fields, "Sec-WebSocket-Key1: "+key1+"\r\n") + fields = append(fields, "Sec-WebSocket-Key2: "+key2+"\r\n") // Step 24. shuffle fields and send them out. for i := 1; i < len(fields); i++ { @@ -226,7 +228,7 @@ func handshake(resourceName, host, origin, location, protocol string, br *bufio. // Step 25. send CRLF. bw.WriteString("\r\n") - // Step 26. genearte 8 bytes random key. + // Step 26. generate 8 bytes random key. key3 := generateKey3() // Step 27. send it out. bw.Write(key3) @@ -235,7 +237,7 @@ func handshake(resourceName, host, origin, location, protocol string, br *bufio. } // Step 28-29, 32-40. read response from server. - resp, err := http.ReadResponse(br, "GET") + resp, err := http.ReadResponse(br, &http.Request{Method: "GET"}) if err != nil { return err } @@ -262,7 +264,7 @@ func handshake(resourceName, host, origin, location, protocol string, br *bufio. return ErrBadWebSocketProtocol } - // Step 42-43. get expected data from challange data. + // Step 42-43. get expected data from challenge data. expected, err := getChallengeResponse(number1, number2, key3) if err != nil { return err @@ -283,7 +285,7 @@ func handshake(resourceName, host, origin, location, protocol string, br *bufio. } /* -Handhake described in (soon obsolete) +Handshake described in (soon obsolete) draft-hixie-thewebsocket-protocol-75. */ func draft75handshake(resourceName, host, origin, location, protocol string, br *bufio.Reader, bw *bufio.Writer) (err os.Error) { @@ -297,7 +299,7 @@ func draft75handshake(resourceName, host, origin, location, protocol string, br } bw.WriteString("\r\n") bw.Flush() - resp, err := http.ReadResponse(br, "GET") + resp, err := http.ReadResponse(br, &http.Request{Method: "GET"}) if err != nil { return } diff --git a/libgo/go/websocket/server.go b/libgo/go/websocket/server.go index 3762652..e0e7c87 100644 --- a/libgo/go/websocket/server.go +++ b/libgo/go/websocket/server.go @@ -124,7 +124,7 @@ func (f Handler) ServeHTTP(w http.ResponseWriter, req *http.Request) { part1 := keyNumber1 / space1 part2 := keyNumber2 / space2 - // Step 8. let challenge to be concatination of part1, part2 and key3. + // Step 8. let challenge be concatenation of part1, part2 and key3. // Step 9. get MD5 fingerprint of challenge. response, err := getChallengeResponse(part1, part2, key3) if err != nil { @@ -154,7 +154,6 @@ func (f Handler) ServeHTTP(w http.ResponseWriter, req *http.Request) { f(ws) } - /* Draft75Handler is an interface to a WebSocket based on the (soon obsolete) draft-hixie-thewebsocketprotocol-75. diff --git a/libgo/go/websocket/websocket.go b/libgo/go/websocket/websocket.go index edde61b..7447cf8 100644 --- a/libgo/go/websocket/websocket.go +++ b/libgo/go/websocket/websocket.go @@ -158,7 +158,7 @@ func (ws *Conn) SetReadTimeout(nsec int64) os.Error { return os.EINVAL } -// SetWritetTimeout sets the connection's network write timeout in nanoseconds. +// SetWriteTimeout sets the connection's network write timeout in nanoseconds. func (ws *Conn) SetWriteTimeout(nsec int64) os.Error { if conn, ok := ws.rwc.(net.Conn); ok { return conn.SetWriteTimeout(nsec) diff --git a/libgo/go/websocket/websocket_test.go b/libgo/go/websocket/websocket_test.go index 10f88df..71c3c85 100644 --- a/libgo/go/websocket/websocket_test.go +++ b/libgo/go/websocket/websocket_test.go @@ -15,6 +15,7 @@ import ( "net" "sync" "testing" + "url" ) var serverAddr string @@ -150,14 +151,14 @@ func TestHTTP(t *testing.T) { // If the client did not send a handshake that matches the protocol // specification, the server should abort the WebSocket connection. - _, _, err := http.Get(fmt.Sprintf("http://%s/echo", serverAddr)) + _, err := http.Get(fmt.Sprintf("http://%s/echo", serverAddr)) if err == nil { t.Error("Get: unexpected success") return } - urlerr, ok := err.(*http.URLError) + urlerr, ok := err.(*url.Error) if !ok { - t.Errorf("Get: not URLError %#v", err) + t.Errorf("Get: not url.Error %#v", err) return } if urlerr.Error != io.ErrUnexpectedEOF { @@ -169,7 +170,7 @@ func TestHTTP(t *testing.T) { func TestHTTPDraft75(t *testing.T) { once.Do(startServer) - r, _, err := http.Get(fmt.Sprintf("http://%s/echoDraft75", serverAddr)) + r, err := http.Get(fmt.Sprintf("http://%s/echoDraft75", serverAddr)) if err != nil { t.Errorf("Get: error %#v", err) return |