summaryrefslogtreecommitdiff
path: root/vendor/github.com/gorilla/websocket/conn.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/gorilla/websocket/conn.go')
-rw-r--r--vendor/github.com/gorilla/websocket/conn.go72
1 files changed, 28 insertions, 44 deletions
diff --git a/vendor/github.com/gorilla/websocket/conn.go b/vendor/github.com/gorilla/websocket/conn.go
index 49399b120..5161ef81f 100644
--- a/vendor/github.com/gorilla/websocket/conn.go
+++ b/vendor/github.com/gorilla/websocket/conn.go
@@ -6,10 +6,11 @@ package websocket
import (
"bufio"
- "crypto/rand"
"encoding/binary"
"errors"
"io"
+ "io/ioutil"
+ "math/rand"
"net"
"strconv"
"strings"
@@ -180,16 +181,16 @@ var (
errInvalidControlFrame = errors.New("websocket: invalid control frame")
)
-// maskRand is an io.Reader for generating mask bytes. The reader is initialized
-// to crypto/rand Reader. Tests swap the reader to a math/rand reader for
-// reproducible results.
-var maskRand = rand.Reader
-
-// newMaskKey returns a new 32 bit value for masking client frames.
func newMaskKey() [4]byte {
- var k [4]byte
- _, _ = io.ReadFull(maskRand, k[:])
- return k
+ n := rand.Uint32()
+ return [4]byte{byte(n), byte(n >> 8), byte(n >> 16), byte(n >> 24)}
+}
+
+func hideTempErr(err error) error {
+ if e, ok := err.(net.Error); ok && e.Temporary() {
+ err = &netError{msg: e.Error(), timeout: e.Timeout()}
+ }
+ return err
}
func isControl(frameType int) bool {
@@ -357,6 +358,7 @@ func (c *Conn) RemoteAddr() net.Addr {
// Write methods
func (c *Conn) writeFatal(err error) error {
+ err = hideTempErr(err)
c.writeErrMu.Lock()
if c.writeErr == nil {
c.writeErr = err
@@ -434,27 +436,21 @@ func (c *Conn) WriteControl(messageType int, data []byte, deadline time.Time) er
maskBytes(key, 0, buf[6:])
}
- if deadline.IsZero() {
- // No timeout for zero time.
- <-c.mu
- } else {
- d := time.Until(deadline)
+ d := 1000 * time.Hour
+ if !deadline.IsZero() {
+ d = deadline.Sub(time.Now())
if d < 0 {
return errWriteTimeout
}
- select {
- case <-c.mu:
- default:
- timer := time.NewTimer(d)
- select {
- case <-c.mu:
- timer.Stop()
- case <-timer.C:
- return errWriteTimeout
- }
- }
}
+ timer := time.NewTimer(d)
+ select {
+ case <-c.mu:
+ timer.Stop()
+ case <-timer.C:
+ return errWriteTimeout
+ }
defer func() { c.mu <- struct{}{} }()
c.writeErrMu.Lock()
@@ -799,7 +795,7 @@ func (c *Conn) advanceFrame() (int, error) {
// 1. Skip remainder of previous frame.
if c.readRemaining > 0 {
- if _, err := io.CopyN(io.Discard, c.br, c.readRemaining); err != nil {
+ if _, err := io.CopyN(ioutil.Discard, c.br, c.readRemaining); err != nil {
return noFrame, err
}
}
@@ -1012,7 +1008,7 @@ func (c *Conn) NextReader() (messageType int, r io.Reader, err error) {
for c.readErr == nil {
frameType, err := c.advanceFrame()
if err != nil {
- c.readErr = err
+ c.readErr = hideTempErr(err)
break
}
@@ -1052,7 +1048,7 @@ func (r *messageReader) Read(b []byte) (int, error) {
b = b[:c.readRemaining]
}
n, err := c.br.Read(b)
- c.readErr = err
+ c.readErr = hideTempErr(err)
if c.isServer {
c.readMaskPos = maskBytes(c.readMaskKey, c.readMaskPos, b[:n])
}
@@ -1073,7 +1069,7 @@ func (r *messageReader) Read(b []byte) (int, error) {
frameType, err := c.advanceFrame()
switch {
case err != nil:
- c.readErr = err
+ c.readErr = hideTempErr(err)
case frameType == TextMessage || frameType == BinaryMessage:
c.readErr = errors.New("websocket: internal error, unexpected text or binary in Reader")
}
@@ -1098,7 +1094,7 @@ func (c *Conn) ReadMessage() (messageType int, p []byte, err error) {
if err != nil {
return messageType, nil, err
}
- p, err = io.ReadAll(r)
+ p, err = ioutil.ReadAll(r)
return messageType, p, err
}
@@ -1165,7 +1161,7 @@ func (c *Conn) SetPingHandler(h func(appData string) error) {
err := c.WriteControl(PongMessage, []byte(message), time.Now().Add(writeWait))
if err == ErrCloseSent {
return nil
- } else if _, ok := err.(net.Error); ok {
+ } else if e, ok := err.(net.Error); ok && e.Temporary() {
return nil
}
return err
@@ -1240,15 +1236,3 @@ func FormatCloseMessage(closeCode int, text string) []byte {
copy(buf[2:], text)
return buf
}
-
-var messageTypes = map[int]string{
- TextMessage: "TextMessage",
- BinaryMessage: "BinaryMessage",
- CloseMessage: "CloseMessage",
- PingMessage: "PingMessage",
- PongMessage: "PongMessage",
-}
-
-func FormatMessageType(mt int) string {
- return messageTypes[mt]
-}