diff options
author | Fumitoshi Ukai <ukai@google.com> | 2013-05-12 13:50:10 +0900 |
---|---|---|
committer | Mikio Hara <mikioh.mikioh@gmail.com> | 2013-05-12 13:50:10 +0900 |
commit | 0005f0a0c0c361196e53cd81bb023f8f563b85cf (patch) | |
tree | 07fce9f83758fa83523f358660e27b24f31b013a /websocket/hybi_test.go | |
parent | 94458b3b475d36ace16e4fe3a3ea82c8f290d15a (diff) | |
download | net-0005f0a0c0c361196e53cd81bb023f8f563b85cf.tar.gz |
go.net/websocket: allow server configurable
Add websocket.Server to configure WebSocket server handler.
- Config.Header is additional headers to send, so you can use it
to send cookies or so.
To read cookies, you can use Conn.Request().Header.
- factor out Handshake.
You can set func to check origin, subprotocol etc.
Handler checks origin by default.
Fixes golang/go#4198.
Fixes golang/go#5178.
R=golang-dev, mikioh.mikioh, crobin
CC=golang-dev
https://golang.org/cl/8731044
Diffstat (limited to 'websocket/hybi_test.go')
-rw-r--r-- | websocket/hybi_test.go | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/websocket/hybi_test.go b/websocket/hybi_test.go index b527e0b..01ed9e9 100644 --- a/websocket/hybi_test.go +++ b/websocket/hybi_test.go @@ -92,6 +92,71 @@ Sec-WebSocket-Protocol: chat } } +func TestHybiClientHandshakeWithHeader(t *testing.T) { + b := bytes.NewBuffer([]byte{}) + bw := bufio.NewWriter(b) + br := bufio.NewReader(strings.NewReader(`HTTP/1.1 101 Switching Protocols +Upgrade: websocket +Connection: Upgrade +Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= +Sec-WebSocket-Protocol: chat + +`)) + var err error + config := new(Config) + config.Location, err = url.ParseRequestURI("ws://server.example.com/chat") + if err != nil { + t.Fatal("location url", err) + } + config.Origin, err = url.ParseRequestURI("http://example.com") + if err != nil { + t.Fatal("origin url", err) + } + config.Protocol = append(config.Protocol, "chat") + config.Protocol = append(config.Protocol, "superchat") + config.Version = ProtocolVersionHybi13 + config.Header = http.Header(make(map[string][]string)) + config.Header.Add("User-Agent", "test") + + config.handshakeData = map[string]string{ + "key": "dGhlIHNhbXBsZSBub25jZQ==", + } + err = hybiClientHandshake(config, br, bw) + if err != nil { + t.Errorf("handshake failed: %v", err) + } + req, err := http.ReadRequest(bufio.NewReader(b)) + if err != nil { + t.Fatalf("read request: %v", err) + } + if req.Method != "GET" { + t.Errorf("request method expected GET, but got %q", req.Method) + } + if req.URL.Path != "/chat" { + t.Errorf("request path expected /chat, but got %q", req.URL.Path) + } + if req.Proto != "HTTP/1.1" { + t.Errorf("request proto expected HTTP/1.1, but got %q", req.Proto) + } + if req.Host != "server.example.com" { + t.Errorf("request Host expected server.example.com, but got %v", req.Host) + } + var expectedHeader = map[string]string{ + "Connection": "Upgrade", + "Upgrade": "websocket", + "Sec-Websocket-Key": config.handshakeData["key"], + "Origin": config.Origin.String(), + "Sec-Websocket-Protocol": "chat, superchat", + "Sec-Websocket-Version": fmt.Sprintf("%d", ProtocolVersionHybi13), + "User-Agent": "test", + } + for k, v := range expectedHeader { + if req.Header.Get(k) != v { + t.Errorf(fmt.Sprintf("%s expected %q but got %q", k, v, req.Header.Get(k))) + } + } +} + func TestHybiClientHandshakeHybi08(t *testing.T) { b := bytes.NewBuffer([]byte{}) bw := bufio.NewWriter(b) |