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.go103
1 files changed, 45 insertions, 58 deletions
diff --git a/vendor/github.com/gorilla/websocket/conn.go b/vendor/github.com/gorilla/websocket/conn.go
index 221e6cf79..49399b120 100644
--- a/vendor/github.com/gorilla/websocket/conn.go
+++ b/vendor/github.com/gorilla/websocket/conn.go
@@ -10,7 +10,6 @@ import (
"encoding/binary"
"errors"
"io"
- "log"
"net"
"strconv"
"strings"
@@ -193,13 +192,6 @@ func newMaskKey() [4]byte {
return k
}
-func hideTempErr(err error) error {
- if e, ok := err.(net.Error); ok {
- err = &netError{msg: e.Error(), timeout: e.Timeout()}
- }
- return err
-}
-
func isControl(frameType int) bool {
return frameType == CloseMessage || frameType == PingMessage || frameType == PongMessage
}
@@ -365,7 +357,6 @@ 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
@@ -379,9 +370,7 @@ func (c *Conn) read(n int) ([]byte, error) {
if err == io.EOF {
err = errUnexpectedEOF
}
- if _, err := c.br.Discard(len(p)); err != nil {
- return p, err
- }
+ c.br.Discard(len(p))
return p, err
}
@@ -396,9 +385,7 @@ func (c *Conn) write(frameType int, deadline time.Time, buf0, buf1 []byte) error
return err
}
- if err := c.conn.SetWriteDeadline(deadline); err != nil {
- return c.writeFatal(err)
- }
+ c.conn.SetWriteDeadline(deadline)
if len(buf1) == 0 {
_, err = c.conn.Write(buf0)
} else {
@@ -408,7 +395,7 @@ func (c *Conn) write(frameType int, deadline time.Time, buf0, buf1 []byte) error
return c.writeFatal(err)
}
if frameType == CloseMessage {
- _ = c.writeFatal(ErrCloseSent)
+ c.writeFatal(ErrCloseSent)
}
return nil
}
@@ -447,21 +434,27 @@ func (c *Conn) WriteControl(messageType int, data []byte, deadline time.Time) er
maskBytes(key, 0, buf[6:])
}
- d := 1000 * time.Hour
- if !deadline.IsZero() {
- d = time.Until(deadline)
+ if deadline.IsZero() {
+ // No timeout for zero time.
+ <-c.mu
+ } else {
+ d := time.Until(deadline)
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()
@@ -471,15 +464,13 @@ func (c *Conn) WriteControl(messageType int, data []byte, deadline time.Time) er
return err
}
- if err := c.conn.SetWriteDeadline(deadline); err != nil {
- return c.writeFatal(err)
- }
+ c.conn.SetWriteDeadline(deadline)
_, err = c.conn.Write(buf)
if err != nil {
return c.writeFatal(err)
}
if messageType == CloseMessage {
- _ = c.writeFatal(ErrCloseSent)
+ c.writeFatal(ErrCloseSent)
}
return err
}
@@ -490,9 +481,7 @@ func (c *Conn) beginMessage(mw *messageWriter, messageType int) error {
// probably better to return an error in this situation, but we cannot
// change this without breaking existing applications.
if c.writer != nil {
- if err := c.writer.Close(); err != nil {
- log.Printf("websocket: discarding writer close error: %v", err)
- }
+ c.writer.Close()
c.writer = nil
}
@@ -645,7 +634,7 @@ func (w *messageWriter) flushFrame(final bool, extra []byte) error {
}
if final {
- _ = w.endMessage(errWriteClosed)
+ w.endMessage(errWriteClosed)
return nil
}
@@ -832,9 +821,7 @@ func (c *Conn) advanceFrame() (int, error) {
rsv2 := p[0]&rsv2Bit != 0
rsv3 := p[0]&rsv3Bit != 0
mask := p[1]&maskBit != 0
- if err := c.setReadRemaining(int64(p[1] & 0x7f)); err != nil {
- return noFrame, err
- }
+ c.setReadRemaining(int64(p[1] & 0x7f))
c.readDecompress = false
if rsv1 {
@@ -939,9 +926,7 @@ func (c *Conn) advanceFrame() (int, error) {
}
if c.readLimit > 0 && c.readLength > c.readLimit {
- if err := c.WriteControl(CloseMessage, FormatCloseMessage(CloseMessageTooBig, ""), time.Now().Add(writeWait)); err != nil {
- return noFrame, err
- }
+ c.WriteControl(CloseMessage, FormatCloseMessage(CloseMessageTooBig, ""), time.Now().Add(writeWait))
return noFrame, ErrReadLimit
}
@@ -953,9 +938,7 @@ func (c *Conn) advanceFrame() (int, error) {
var payload []byte
if c.readRemaining > 0 {
payload, err = c.read(int(c.readRemaining))
- if err := c.setReadRemaining(0); err != nil {
- return noFrame, err
- }
+ c.setReadRemaining(0)
if err != nil {
return noFrame, err
}
@@ -1002,9 +985,7 @@ func (c *Conn) handleProtocolError(message string) error {
if len(data) > maxControlFramePayloadSize {
data = data[:maxControlFramePayloadSize]
}
- if err := c.WriteControl(CloseMessage, data, time.Now().Add(writeWait)); err != nil {
- return err
- }
+ c.WriteControl(CloseMessage, data, time.Now().Add(writeWait))
return errors.New("websocket: " + message)
}
@@ -1021,9 +1002,7 @@ func (c *Conn) handleProtocolError(message string) error {
func (c *Conn) NextReader() (messageType int, r io.Reader, err error) {
// Close previous reader, only relevant for decompression.
if c.reader != nil {
- if err := c.reader.Close(); err != nil {
- log.Printf("websocket: discarding reader close error: %v", err)
- }
+ c.reader.Close()
c.reader = nil
}
@@ -1033,7 +1012,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 = hideTempErr(err)
+ c.readErr = err
break
}
@@ -1073,15 +1052,13 @@ func (r *messageReader) Read(b []byte) (int, error) {
b = b[:c.readRemaining]
}
n, err := c.br.Read(b)
- c.readErr = hideTempErr(err)
+ c.readErr = err
if c.isServer {
c.readMaskPos = maskBytes(c.readMaskKey, c.readMaskPos, b[:n])
}
rem := c.readRemaining
rem -= int64(n)
- if err := c.setReadRemaining(rem); err != nil {
- return 0, err
- }
+ c.setReadRemaining(rem)
if c.readRemaining > 0 && c.readErr == io.EOF {
c.readErr = errUnexpectedEOF
}
@@ -1096,7 +1073,7 @@ func (r *messageReader) Read(b []byte) (int, error) {
frameType, err := c.advanceFrame()
switch {
case err != nil:
- c.readErr = hideTempErr(err)
+ c.readErr = err
case frameType == TextMessage || frameType == BinaryMessage:
c.readErr = errors.New("websocket: internal error, unexpected text or binary in Reader")
}
@@ -1163,9 +1140,7 @@ func (c *Conn) SetCloseHandler(h func(code int, text string) error) {
if h == nil {
h = func(code int, text string) error {
message := FormatCloseMessage(code, "")
- if err := c.WriteControl(CloseMessage, message, time.Now().Add(writeWait)); err != nil {
- return err
- }
+ c.WriteControl(CloseMessage, message, time.Now().Add(writeWait))
return nil
}
}
@@ -1265,3 +1240,15 @@ 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]
+}