server_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. // Copyright 2013 The Gorilla WebSocket Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package websocket
  5. import (
  6. "bufio"
  7. "bytes"
  8. "net"
  9. "net/http"
  10. "reflect"
  11. "strings"
  12. "testing"
  13. )
  14. var subprotocolTests = []struct {
  15. h string
  16. protocols []string
  17. }{
  18. {"", nil},
  19. {"foo", []string{"foo"}},
  20. {"foo,bar", []string{"foo", "bar"}},
  21. {"foo, bar", []string{"foo", "bar"}},
  22. {" foo, bar", []string{"foo", "bar"}},
  23. {" foo, bar ", []string{"foo", "bar"}},
  24. }
  25. func TestSubprotocols(t *testing.T) {
  26. for _, st := range subprotocolTests {
  27. r := http.Request{Header: http.Header{"Sec-Websocket-Protocol": {st.h}}}
  28. protocols := Subprotocols(&r)
  29. if !reflect.DeepEqual(st.protocols, protocols) {
  30. t.Errorf("SubProtocols(%q) returned %#v, want %#v", st.h, protocols, st.protocols)
  31. }
  32. }
  33. }
  34. var isWebSocketUpgradeTests = []struct {
  35. ok bool
  36. h http.Header
  37. }{
  38. {false, http.Header{"Upgrade": {"websocket"}}},
  39. {false, http.Header{"Connection": {"upgrade"}}},
  40. {true, http.Header{"Connection": {"upgRade"}, "Upgrade": {"WebSocket"}}},
  41. }
  42. func TestIsWebSocketUpgrade(t *testing.T) {
  43. for _, tt := range isWebSocketUpgradeTests {
  44. ok := IsWebSocketUpgrade(&http.Request{Header: tt.h})
  45. if tt.ok != ok {
  46. t.Errorf("IsWebSocketUpgrade(%v) returned %v, want %v", tt.h, ok, tt.ok)
  47. }
  48. }
  49. }
  50. var checkSameOriginTests = []struct {
  51. ok bool
  52. r *http.Request
  53. }{
  54. {false, &http.Request{Host: "example.org", Header: map[string][]string{"Origin": {"https://other.org"}}}},
  55. {true, &http.Request{Host: "example.org", Header: map[string][]string{"Origin": {"https://example.org"}}}},
  56. {true, &http.Request{Host: "Example.org", Header: map[string][]string{"Origin": {"https://example.org"}}}},
  57. }
  58. func TestCheckSameOrigin(t *testing.T) {
  59. for _, tt := range checkSameOriginTests {
  60. ok := checkSameOrigin(tt.r)
  61. if tt.ok != ok {
  62. t.Errorf("checkSameOrigin(%+v) returned %v, want %v", tt.r, ok, tt.ok)
  63. }
  64. }
  65. }
  66. type reuseTestResponseWriter struct {
  67. brw *bufio.ReadWriter
  68. http.ResponseWriter
  69. }
  70. func (resp *reuseTestResponseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) {
  71. return fakeNetConn{strings.NewReader(""), &bytes.Buffer{}}, resp.brw, nil
  72. }
  73. var bufioReuseTests = []struct {
  74. n int
  75. reuse bool
  76. }{
  77. {4096, true},
  78. {128, false},
  79. }
  80. func TestBufioReuse(t *testing.T) {
  81. for i, tt := range bufioReuseTests {
  82. br := bufio.NewReaderSize(strings.NewReader(""), tt.n)
  83. bw := bufio.NewWriterSize(&bytes.Buffer{}, tt.n)
  84. resp := &reuseTestResponseWriter{
  85. brw: bufio.NewReadWriter(br, bw),
  86. }
  87. upgrader := Upgrader{}
  88. c, err := upgrader.Upgrade(resp, &http.Request{
  89. Method: "GET",
  90. Header: http.Header{
  91. "Upgrade": []string{"websocket"},
  92. "Connection": []string{"upgrade"},
  93. "Sec-Websocket-Key": []string{"dGhlIHNhbXBsZSBub25jZQ=="},
  94. "Sec-Websocket-Version": []string{"13"},
  95. }}, nil)
  96. if err != nil {
  97. t.Fatal(err)
  98. }
  99. if reuse := c.br == br; reuse != tt.reuse {
  100. t.Errorf("%d: buffered reader reuse=%v, want %v", i, reuse, tt.reuse)
  101. }
  102. writeBuf := bufioWriterBuffer(c.UnderlyingConn(), bw)
  103. if reuse := &c.writeBuf[0] == &writeBuf[0]; reuse != tt.reuse {
  104. t.Errorf("%d: write buffer reuse=%v, want %v", i, reuse, tt.reuse)
  105. }
  106. }
  107. }