summaryrefslogtreecommitdiffstats
path: root/vendor/golang.org/x/net/websocket
diff options
context:
space:
mode:
authorChristopher Speller <crspeller@gmail.com>2016-11-16 19:28:52 -0500
committerGitHub <noreply@github.com>2016-11-16 19:28:52 -0500
commit0135904f7d3e1c0e763adaefe267c736616e3d26 (patch)
treec27be7588f98eaea62e0bd0c0087f2b348da9738 /vendor/golang.org/x/net/websocket
parent0b296dd8c2aefefe89787be5cc627d44cf431150 (diff)
downloadchat-0135904f7d3e1c0e763adaefe267c736616e3d26.tar.gz
chat-0135904f7d3e1c0e763adaefe267c736616e3d26.tar.bz2
chat-0135904f7d3e1c0e763adaefe267c736616e3d26.zip
Upgrading server dependancies (#4566)
Diffstat (limited to 'vendor/golang.org/x/net/websocket')
-rw-r--r--vendor/golang.org/x/net/websocket/client.go15
-rw-r--r--vendor/golang.org/x/net/websocket/dial.go24
-rw-r--r--vendor/golang.org/x/net/websocket/dial_test.go43
-rw-r--r--vendor/golang.org/x/net/websocket/websocket.go33
-rw-r--r--vendor/golang.org/x/net/websocket/websocket_test.go78
5 files changed, 181 insertions, 12 deletions
diff --git a/vendor/golang.org/x/net/websocket/client.go b/vendor/golang.org/x/net/websocket/client.go
index 20d1e1e38..69a4ac7ee 100644
--- a/vendor/golang.org/x/net/websocket/client.go
+++ b/vendor/golang.org/x/net/websocket/client.go
@@ -6,7 +6,6 @@ package websocket
import (
"bufio"
- "crypto/tls"
"io"
"net"
"net/http"
@@ -87,20 +86,14 @@ func DialConfig(config *Config) (ws *Conn, err error) {
if config.Origin == nil {
return nil, &DialError{config, ErrBadWebSocketOrigin}
}
- switch config.Location.Scheme {
- case "ws":
- client, err = net.Dial("tcp", parseAuthority(config.Location))
-
- case "wss":
- client, err = tls.Dial("tcp", parseAuthority(config.Location), config.TlsConfig)
-
- default:
- err = ErrBadScheme
+ dialer := config.Dialer
+ if dialer == nil {
+ dialer = &net.Dialer{}
}
+ client, err = dialWithDialer(dialer, config)
if err != nil {
goto Error
}
-
ws, err = NewClient(config, client)
if err != nil {
client.Close()
diff --git a/vendor/golang.org/x/net/websocket/dial.go b/vendor/golang.org/x/net/websocket/dial.go
new file mode 100644
index 000000000..2dab943a4
--- /dev/null
+++ b/vendor/golang.org/x/net/websocket/dial.go
@@ -0,0 +1,24 @@
+// Copyright 2015 The Go Authors. 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 (
+ "crypto/tls"
+ "net"
+)
+
+func dialWithDialer(dialer *net.Dialer, config *Config) (conn net.Conn, err error) {
+ switch config.Location.Scheme {
+ case "ws":
+ conn, err = dialer.Dial("tcp", parseAuthority(config.Location))
+
+ case "wss":
+ conn, err = tls.DialWithDialer(dialer, "tcp", parseAuthority(config.Location), config.TlsConfig)
+
+ default:
+ err = ErrBadScheme
+ }
+ return
+}
diff --git a/vendor/golang.org/x/net/websocket/dial_test.go b/vendor/golang.org/x/net/websocket/dial_test.go
new file mode 100644
index 000000000..aa03e30dd
--- /dev/null
+++ b/vendor/golang.org/x/net/websocket/dial_test.go
@@ -0,0 +1,43 @@
+// Copyright 2015 The Go Authors. 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 (
+ "crypto/tls"
+ "fmt"
+ "log"
+ "net"
+ "net/http/httptest"
+ "testing"
+ "time"
+)
+
+// This test depend on Go 1.3+ because in earlier versions the Dialer won't be
+// used in TLS connections and a timeout won't be triggered.
+func TestDialConfigTLSWithDialer(t *testing.T) {
+ tlsServer := httptest.NewTLSServer(nil)
+ tlsServerAddr := tlsServer.Listener.Addr().String()
+ log.Print("Test TLS WebSocket server listening on ", tlsServerAddr)
+ defer tlsServer.Close()
+ config, _ := NewConfig(fmt.Sprintf("wss://%s/echo", tlsServerAddr), "http://localhost")
+ config.Dialer = &net.Dialer{
+ Deadline: time.Now().Add(-time.Minute),
+ }
+ config.TlsConfig = &tls.Config{
+ InsecureSkipVerify: true,
+ }
+ _, err := DialConfig(config)
+ dialerr, ok := err.(*DialError)
+ if !ok {
+ t.Fatalf("DialError expected, got %#v", err)
+ }
+ neterr, ok := dialerr.Err.(*net.OpError)
+ if !ok {
+ t.Fatalf("net.OpError error expected, got %#v", dialerr.Err)
+ }
+ if !neterr.Timeout() {
+ t.Fatalf("expected timeout error, got %#v", neterr)
+ }
+}
diff --git a/vendor/golang.org/x/net/websocket/websocket.go b/vendor/golang.org/x/net/websocket/websocket.go
index 9412191de..a7731d9c9 100644
--- a/vendor/golang.org/x/net/websocket/websocket.go
+++ b/vendor/golang.org/x/net/websocket/websocket.go
@@ -32,6 +32,8 @@ const (
PingFrame = 9
PongFrame = 10
UnknownFrame = 255
+
+ DefaultMaxPayloadBytes = 32 << 20 // 32MB
)
// ProtocolError represents WebSocket protocol errors.
@@ -58,6 +60,10 @@ var (
ErrNotSupported = &ProtocolError{"not supported"}
)
+// ErrFrameTooLarge is returned by Codec's Receive method if payload size
+// exceeds limit set by Conn.MaxPayloadBytes
+var ErrFrameTooLarge = errors.New("websocket: frame payload size exceeds limit")
+
// Addr is an implementation of net.Addr for WebSocket.
type Addr struct {
*url.URL
@@ -86,6 +92,9 @@ type Config struct {
// Additional header fields to be sent in WebSocket opening handshake.
Header http.Header
+ // Dialer used when opening websocket connections.
+ Dialer *net.Dialer
+
handshakeData map[string]string
}
@@ -163,6 +172,10 @@ type Conn struct {
frameHandler
PayloadType byte
defaultCloseStatus int
+
+ // MaxPayloadBytes limits the size of frame payload received over Conn
+ // by Codec's Receive method. If zero, DefaultMaxPayloadBytes is used.
+ MaxPayloadBytes int
}
// Read implements the io.Reader interface:
@@ -299,7 +312,12 @@ func (cd Codec) Send(ws *Conn, v interface{}) (err error) {
return err
}
-// Receive receives single frame from ws, unmarshaled by cd.Unmarshal and stores in v.
+// Receive receives single frame from ws, unmarshaled by cd.Unmarshal and stores
+// in v. The whole frame payload is read to an in-memory buffer; max size of
+// payload is defined by ws.MaxPayloadBytes. If frame payload size exceeds
+// limit, ErrFrameTooLarge is returned; in this case frame is not read off wire
+// completely. The next call to Receive would read and discard leftover data of
+// previous oversized frame before processing next frame.
func (cd Codec) Receive(ws *Conn, v interface{}) (err error) {
ws.rio.Lock()
defer ws.rio.Unlock()
@@ -322,6 +340,19 @@ again:
if frame == nil {
goto again
}
+ maxPayloadBytes := ws.MaxPayloadBytes
+ if maxPayloadBytes == 0 {
+ maxPayloadBytes = DefaultMaxPayloadBytes
+ }
+ if hf, ok := frame.(*hybiFrameReader); ok && hf.header.Length > int64(maxPayloadBytes) {
+ // payload size exceeds limit, no need to call Unmarshal
+ //
+ // set frameReader to current oversized frame so that
+ // the next call to this function can drain leftover
+ // data before processing the next frame
+ ws.frameReader = frame
+ return ErrFrameTooLarge
+ }
payloadType := frame.PayloadType()
data, err := ioutil.ReadAll(frame)
if err != nil {
diff --git a/vendor/golang.org/x/net/websocket/websocket_test.go b/vendor/golang.org/x/net/websocket/websocket_test.go
index 05b7e5356..2054ce85a 100644
--- a/vendor/golang.org/x/net/websocket/websocket_test.go
+++ b/vendor/golang.org/x/net/websocket/websocket_test.go
@@ -6,6 +6,7 @@ package websocket
import (
"bytes"
+ "crypto/rand"
"fmt"
"io"
"log"
@@ -357,6 +358,26 @@ func TestDialConfigBadVersion(t *testing.T) {
}
}
+func TestDialConfigWithDialer(t *testing.T) {
+ once.Do(startServer)
+ config := newConfig(t, "/echo")
+ config.Dialer = &net.Dialer{
+ Deadline: time.Now().Add(-time.Minute),
+ }
+ _, err := DialConfig(config)
+ dialerr, ok := err.(*DialError)
+ if !ok {
+ t.Fatalf("DialError expected, got %#v", err)
+ }
+ neterr, ok := dialerr.Err.(*net.OpError)
+ if !ok {
+ t.Fatalf("net.OpError error expected, got %#v", dialerr.Err)
+ }
+ if !neterr.Timeout() {
+ t.Fatalf("expected timeout error, got %#v", neterr)
+ }
+}
+
func TestSmallBuffer(t *testing.T) {
// http://code.google.com/p/go/issues/detail?id=1145
// Read should be able to handle reading a fragment of a frame.
@@ -585,3 +606,60 @@ func TestCtrlAndData(t *testing.T) {
}
}
}
+
+func TestCodec_ReceiveLimited(t *testing.T) {
+ const limit = 2048
+ var payloads [][]byte
+ for _, size := range []int{
+ 1024,
+ 2048,
+ 4096, // receive of this message would be interrupted due to limit
+ 2048, // this one is to make sure next receive recovers discarding leftovers
+ } {
+ b := make([]byte, size)
+ rand.Read(b)
+ payloads = append(payloads, b)
+ }
+ handlerDone := make(chan struct{})
+ limitedHandler := func(ws *Conn) {
+ defer close(handlerDone)
+ ws.MaxPayloadBytes = limit
+ defer ws.Close()
+ for i, p := range payloads {
+ t.Logf("payload #%d (size %d, exceeds limit: %v)", i, len(p), len(p) > limit)
+ var recv []byte
+ err := Message.Receive(ws, &recv)
+ switch err {
+ case nil:
+ case ErrFrameTooLarge:
+ if len(p) <= limit {
+ t.Fatalf("unexpected frame size limit: expected %d bytes of payload having limit at %d", len(p), limit)
+ }
+ continue
+ default:
+ t.Fatalf("unexpected error: %v (want either nil or ErrFrameTooLarge)", err)
+ }
+ if len(recv) > limit {
+ t.Fatalf("received %d bytes of payload having limit at %d", len(recv), limit)
+ }
+ if !bytes.Equal(p, recv) {
+ t.Fatalf("received payload differs:\ngot:\t%v\nwant:\t%v", recv, p)
+ }
+ }
+ }
+ server := httptest.NewServer(Handler(limitedHandler))
+ defer server.CloseClientConnections()
+ defer server.Close()
+ addr := server.Listener.Addr().String()
+ ws, err := Dial("ws://"+addr+"/", "", "http://localhost/")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer ws.Close()
+ for i, p := range payloads {
+ if err := Message.Send(ws, p); err != nil {
+ t.Fatalf("payload #%d (size %d): %v", i, len(p), err)
+ }
+ }
+ <-handlerDone
+}