mirror of
https://github.com/golang/go
synced 2024-11-22 09:44:40 -07:00
websocket: tweak hybi ReadHandshake to supports Firefox implementation
Firefox Websocket implementation send a "Connection: keep-alive, upgrade" header during the handshake (and as descripted on the last hybi draft the "Connection" header must include, but doesn't need to be equal to, "upgrade": '4. A "Connection" header field that includes the token "Upgrade", treated as an ASCII case-insensitive value.' From: http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17#page-23 R=golang-dev, ukai, cw, rsc CC=golang-dev https://golang.org/cl/5233059
This commit is contained in:
parent
6c1f4ff15f
commit
d296fa1c95
@ -476,7 +476,7 @@ func (c *hybiServerHandshaker) ReadHandshake(buf *bufio.Reader, req *http.Reques
|
|||||||
// HTTP version can be safely ignored.
|
// HTTP version can be safely ignored.
|
||||||
|
|
||||||
if strings.ToLower(req.Header.Get("Upgrade")) != "websocket" ||
|
if strings.ToLower(req.Header.Get("Upgrade")) != "websocket" ||
|
||||||
strings.ToLower(req.Header.Get("Connection")) != "upgrade" {
|
!strings.Contains(strings.ToLower(req.Header.Get("Connection")), "upgrade") {
|
||||||
return http.StatusBadRequest, ErrNotWebSocket
|
return http.StatusBadRequest, ErrNotWebSocket
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -533,3 +533,52 @@ func TestHybiClientReadWithMasking(t *testing.T) {
|
|||||||
t.Errorf("read 1st frame, expect %q, but got %q", os.EOF, err)
|
t.Errorf("read 1st frame, expect %q, but got %q", os.EOF, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test the hybiServerHandshaker supports firefox implementation and
|
||||||
|
// checks Connection request header include (but it's not necessary
|
||||||
|
// equal to) "upgrade"
|
||||||
|
func TestHybiServerFirefoxHandshake(t *testing.T) {
|
||||||
|
config := new(Config)
|
||||||
|
handshaker := &hybiServerHandshaker{Config: config}
|
||||||
|
br := bufio.NewReader(strings.NewReader(`GET /chat HTTP/1.1
|
||||||
|
Host: server.example.com
|
||||||
|
Upgrade: websocket
|
||||||
|
Connection: keep-alive, upgrade
|
||||||
|
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
|
||||||
|
Origin: http://example.com
|
||||||
|
Sec-WebSocket-Protocol: chat, superchat
|
||||||
|
Sec-WebSocket-Version: 13
|
||||||
|
|
||||||
|
`))
|
||||||
|
req, err := http.ReadRequest(br)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("request", err)
|
||||||
|
}
|
||||||
|
code, err := handshaker.ReadHandshake(br, req)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("handshake failed: %v", err)
|
||||||
|
}
|
||||||
|
if code != http.StatusSwitchingProtocols {
|
||||||
|
t.Errorf("status expected %q but got %q", http.StatusSwitchingProtocols, code)
|
||||||
|
}
|
||||||
|
b := bytes.NewBuffer([]byte{})
|
||||||
|
bw := bufio.NewWriter(b)
|
||||||
|
|
||||||
|
config.Protocol = []string{"chat"}
|
||||||
|
|
||||||
|
err = handshaker.AcceptHandshake(bw)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("handshake response failed: %v", err)
|
||||||
|
}
|
||||||
|
expectedResponse := strings.Join([]string{
|
||||||
|
"HTTP/1.1 101 Switching Protocols",
|
||||||
|
"Upgrade: websocket",
|
||||||
|
"Connection: Upgrade",
|
||||||
|
"Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=",
|
||||||
|
"Sec-WebSocket-Protocol: chat",
|
||||||
|
"", ""}, "\r\n")
|
||||||
|
|
||||||
|
if b.String() != expectedResponse {
|
||||||
|
t.Errorf("handshake expected %q but got %q", expectedResponse, b.String())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user