From 80c1e5a7419a5aa37e40c33562c6e2c5973d00e9 Mon Sep 17 00:00:00 2001 From: Gary Burd Date: Sat, 26 Oct 2013 06:52:30 -0700 Subject: [PATCH] Add Subprotocols helper function. --- server.go | 15 +++++++++++++++ server_test.go | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 server_test.go diff --git a/server.go b/server.go index a14c586..98206c3 100644 --- a/server.go +++ b/server.go @@ -9,6 +9,7 @@ import ( "errors" "net" "net/http" + "strings" ) // HandshakeError describes an error with the handshake from the peer. @@ -104,3 +105,17 @@ func Upgrade(w http.ResponseWriter, r *http.Request, responseHeader http.Header, return c, nil } + +// Subprotocols returns the subprotocols requested by the client in the +// Sec-Websocket-Protocol header. +func Subprotocols(r *http.Request) []string { + h := strings.TrimSpace(r.Header.Get("Sec-Websocket-Protocol")) + if h == "" { + return nil + } + protocols := strings.Split(h, ",") + for i := range protocols { + protocols[i] = strings.TrimSpace(protocols[i]) + } + return protocols +} diff --git a/server_test.go b/server_test.go new file mode 100644 index 0000000..709ee04 --- /dev/null +++ b/server_test.go @@ -0,0 +1,33 @@ +// Copyright 2013 Gary Burd. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package websocket + +import ( + "net/http" + "reflect" + "testing" +) + +var subprotocolTests = []struct { + h string + protocols []string +}{ + {"", nil}, + {"foo", []string{"foo"}}, + {"foo,bar", []string{"foo", "bar"}}, + {"foo, bar", []string{"foo", "bar"}}, + {" foo, bar", []string{"foo", "bar"}}, + {" foo, bar ", []string{"foo", "bar"}}, +} + +func TestSubprotocols(t *testing.T) { + for _, st := range subprotocolTests { + r := http.Request{Header: http.Header{"Sec-Websocket-Protocol": {st.h}}} + protocols := Subprotocols(&r) + if !reflect.DeepEqual(st.protocols, protocols) { + t.Errorf("SubProtocols(%q) returned %#v, want %#v", st.h, protocols, st.protocols) + } + } +}