conn.go 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986
  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. "encoding/binary"
  8. "errors"
  9. "io"
  10. "io/ioutil"
  11. "net"
  12. "strconv"
  13. "time"
  14. "unicode/utf8"
  15. )
  16. const (
  17. // Frame header byte 0 bits from Section 5.2 of RFC 6455
  18. finalBit = 1 << 7
  19. rsv1Bit = 1 << 6
  20. rsv2Bit = 1 << 5
  21. rsv3Bit = 1 << 4
  22. // Frame header byte 1 bits from Section 5.2 of RFC 6455
  23. maskBit = 1 << 7
  24. maxFrameHeaderSize = 2 + 8 + 4 // Fixed header + length + mask
  25. maxControlFramePayloadSize = 125
  26. writeWait = time.Second
  27. defaultReadBufferSize = 4096
  28. defaultWriteBufferSize = 4096
  29. continuationFrame = 0
  30. noFrame = -1
  31. )
  32. // Close codes defined in RFC 6455, section 11.7.
  33. const (
  34. CloseNormalClosure = 1000
  35. CloseGoingAway = 1001
  36. CloseProtocolError = 1002
  37. CloseUnsupportedData = 1003
  38. CloseNoStatusReceived = 1005
  39. CloseAbnormalClosure = 1006
  40. CloseInvalidFramePayloadData = 1007
  41. ClosePolicyViolation = 1008
  42. CloseMessageTooBig = 1009
  43. CloseMandatoryExtension = 1010
  44. CloseInternalServerErr = 1011
  45. CloseServiceRestart = 1012
  46. CloseTryAgainLater = 1013
  47. CloseTLSHandshake = 1015
  48. )
  49. // The message types are defined in RFC 6455, section 11.8.
  50. const (
  51. // TextMessage denotes a text data message. The text message payload is
  52. // interpreted as UTF-8 encoded text data.
  53. TextMessage = 1
  54. // BinaryMessage denotes a binary data message.
  55. BinaryMessage = 2
  56. // CloseMessage denotes a close control message. The optional message
  57. // payload contains a numeric code and text. Use the FormatCloseMessage
  58. // function to format a close message payload.
  59. CloseMessage = 8
  60. // PingMessage denotes a ping control message. The optional message payload
  61. // is UTF-8 encoded text.
  62. PingMessage = 9
  63. // PongMessage denotes a ping control message. The optional message payload
  64. // is UTF-8 encoded text.
  65. PongMessage = 10
  66. )
  67. // ErrCloseSent is returned when the application writes a message to the
  68. // connection after sending a close message.
  69. var ErrCloseSent = errors.New("websocket: close sent")
  70. // ErrReadLimit is returned when reading a message that is larger than the
  71. // read limit set for the connection.
  72. var ErrReadLimit = errors.New("websocket: read limit exceeded")
  73. // netError satisfies the net Error interface.
  74. type netError struct {
  75. msg string
  76. temporary bool
  77. timeout bool
  78. }
  79. func (e *netError) Error() string { return e.msg }
  80. func (e *netError) Temporary() bool { return e.temporary }
  81. func (e *netError) Timeout() bool { return e.timeout }
  82. // CloseError represents close frame.
  83. type CloseError struct {
  84. // Code is defined in RFC 6455, section 11.7.
  85. Code int
  86. // Text is the optional text payload.
  87. Text string
  88. }
  89. func (e *CloseError) Error() string {
  90. s := []byte("websocket: close ")
  91. s = strconv.AppendInt(s, int64(e.Code), 10)
  92. switch e.Code {
  93. case CloseNormalClosure:
  94. s = append(s, " (normal)"...)
  95. case CloseGoingAway:
  96. s = append(s, " (going away)"...)
  97. case CloseProtocolError:
  98. s = append(s, " (protocol error)"...)
  99. case CloseUnsupportedData:
  100. s = append(s, " (unsupported data)"...)
  101. case CloseNoStatusReceived:
  102. s = append(s, " (no status)"...)
  103. case CloseAbnormalClosure:
  104. s = append(s, " (abnormal closure)"...)
  105. case CloseInvalidFramePayloadData:
  106. s = append(s, " (invalid payload data)"...)
  107. case ClosePolicyViolation:
  108. s = append(s, " (policy violation)"...)
  109. case CloseMessageTooBig:
  110. s = append(s, " (message too big)"...)
  111. case CloseMandatoryExtension:
  112. s = append(s, " (mandatory extension missing)"...)
  113. case CloseInternalServerErr:
  114. s = append(s, " (internal server error)"...)
  115. case CloseTLSHandshake:
  116. s = append(s, " (TLS handshake error)"...)
  117. }
  118. if e.Text != "" {
  119. s = append(s, ": "...)
  120. s = append(s, e.Text...)
  121. }
  122. return string(s)
  123. }
  124. // IsCloseError returns boolean indicating whether the error is a *CloseError
  125. // with one of the specified codes.
  126. func IsCloseError(err error, codes ...int) bool {
  127. if e, ok := err.(*CloseError); ok {
  128. for _, code := range codes {
  129. if e.Code == code {
  130. return true
  131. }
  132. }
  133. }
  134. return false
  135. }
  136. // IsUnexpectedCloseError returns boolean indicating whether the error is a
  137. // *CloseError with a code not in the list of expected codes.
  138. func IsUnexpectedCloseError(err error, expectedCodes ...int) bool {
  139. if e, ok := err.(*CloseError); ok {
  140. for _, code := range expectedCodes {
  141. if e.Code == code {
  142. return false
  143. }
  144. }
  145. return true
  146. }
  147. return false
  148. }
  149. var (
  150. errWriteTimeout = &netError{msg: "websocket: write timeout", timeout: true, temporary: true}
  151. errUnexpectedEOF = &CloseError{Code: CloseAbnormalClosure, Text: io.ErrUnexpectedEOF.Error()}
  152. errBadWriteOpCode = errors.New("websocket: bad write message type")
  153. errWriteClosed = errors.New("websocket: write closed")
  154. errInvalidControlFrame = errors.New("websocket: invalid control frame")
  155. )
  156. func hideTempErr(err error) error {
  157. if e, ok := err.(net.Error); ok && e.Temporary() {
  158. err = &netError{msg: e.Error(), timeout: e.Timeout()}
  159. }
  160. return err
  161. }
  162. func isControl(frameType int) bool {
  163. return frameType == CloseMessage || frameType == PingMessage || frameType == PongMessage
  164. }
  165. func isData(frameType int) bool {
  166. return frameType == TextMessage || frameType == BinaryMessage
  167. }
  168. var validReceivedCloseCodes = map[int]bool{
  169. // see http://www.iana.org/assignments/websocket/websocket.xhtml#close-code-number
  170. CloseNormalClosure: true,
  171. CloseGoingAway: true,
  172. CloseProtocolError: true,
  173. CloseUnsupportedData: true,
  174. CloseNoStatusReceived: false,
  175. CloseAbnormalClosure: false,
  176. CloseInvalidFramePayloadData: true,
  177. ClosePolicyViolation: true,
  178. CloseMessageTooBig: true,
  179. CloseMandatoryExtension: true,
  180. CloseInternalServerErr: true,
  181. CloseServiceRestart: true,
  182. CloseTryAgainLater: true,
  183. CloseTLSHandshake: false,
  184. }
  185. func isValidReceivedCloseCode(code int) bool {
  186. return validReceivedCloseCodes[code] || (code >= 3000 && code <= 4999)
  187. }
  188. type Conn struct {
  189. conn net.Conn
  190. isServer bool
  191. subprotocol string
  192. // Write fields
  193. mu chan bool // used as mutex to protect write to conn and closeSent
  194. closeSent bool // whether close message was sent
  195. writeErr error
  196. writeBuf []byte // frame is constructed in this buffer.
  197. writePos int // end of data in writeBuf.
  198. writeFrameType int // type of the current frame.
  199. writeDeadline time.Time
  200. messageWriter *messageWriter // the current low-level message writer
  201. writer io.WriteCloser // the current writer returned to the application
  202. isWriting bool // for best-effort concurrent write detection
  203. enableWriteCompression bool
  204. writeCompress bool // whether next call to flushFrame should set RSV1
  205. newCompressionWriter func(io.WriteCloser) (io.WriteCloser, error)
  206. // Read fields
  207. readErr error
  208. br *bufio.Reader
  209. readRemaining int64 // bytes remaining in current frame.
  210. readFinal bool // true the current message has more frames.
  211. readLength int64 // Message size.
  212. readLimit int64 // Maximum message size.
  213. readMaskPos int
  214. readMaskKey [4]byte
  215. handlePong func(string) error
  216. handlePing func(string) error
  217. readErrCount int
  218. messageReader *messageReader // the current low-level reader
  219. readDecompress bool // whether last read frame had RSV1 set
  220. newDecompressionReader func(io.Reader) io.Reader
  221. }
  222. func newConn(conn net.Conn, isServer bool, readBufferSize, writeBufferSize int) *Conn {
  223. mu := make(chan bool, 1)
  224. mu <- true
  225. if readBufferSize == 0 {
  226. readBufferSize = defaultReadBufferSize
  227. }
  228. if readBufferSize < maxControlFramePayloadSize {
  229. readBufferSize = maxControlFramePayloadSize
  230. }
  231. if writeBufferSize == 0 {
  232. writeBufferSize = defaultWriteBufferSize
  233. }
  234. c := &Conn{
  235. isServer: isServer,
  236. br: bufio.NewReaderSize(conn, readBufferSize),
  237. conn: conn,
  238. mu: mu,
  239. readFinal: true,
  240. writeBuf: make([]byte, writeBufferSize+maxFrameHeaderSize),
  241. writeFrameType: noFrame,
  242. writePos: maxFrameHeaderSize,
  243. enableWriteCompression: true,
  244. }
  245. c.SetPingHandler(nil)
  246. c.SetPongHandler(nil)
  247. return c
  248. }
  249. // Subprotocol returns the negotiated protocol for the connection.
  250. func (c *Conn) Subprotocol() string {
  251. return c.subprotocol
  252. }
  253. // Close closes the underlying network connection without sending or waiting for a close frame.
  254. func (c *Conn) Close() error {
  255. return c.conn.Close()
  256. }
  257. // LocalAddr returns the local network address.
  258. func (c *Conn) LocalAddr() net.Addr {
  259. return c.conn.LocalAddr()
  260. }
  261. // RemoteAddr returns the remote network address.
  262. func (c *Conn) RemoteAddr() net.Addr {
  263. return c.conn.RemoteAddr()
  264. }
  265. // Write methods
  266. func (c *Conn) write(frameType int, deadline time.Time, bufs ...[]byte) error {
  267. <-c.mu
  268. defer func() { c.mu <- true }()
  269. if c.closeSent {
  270. return ErrCloseSent
  271. } else if frameType == CloseMessage {
  272. c.closeSent = true
  273. }
  274. c.conn.SetWriteDeadline(deadline)
  275. for _, buf := range bufs {
  276. if len(buf) > 0 {
  277. n, err := c.conn.Write(buf)
  278. if n != len(buf) {
  279. // Close on partial write.
  280. c.conn.Close()
  281. }
  282. if err != nil {
  283. return err
  284. }
  285. }
  286. }
  287. return nil
  288. }
  289. // WriteControl writes a control message with the given deadline. The allowed
  290. // message types are CloseMessage, PingMessage and PongMessage.
  291. func (c *Conn) WriteControl(messageType int, data []byte, deadline time.Time) error {
  292. if !isControl(messageType) {
  293. return errBadWriteOpCode
  294. }
  295. if len(data) > maxControlFramePayloadSize {
  296. return errInvalidControlFrame
  297. }
  298. b0 := byte(messageType) | finalBit
  299. b1 := byte(len(data))
  300. if !c.isServer {
  301. b1 |= maskBit
  302. }
  303. buf := make([]byte, 0, maxFrameHeaderSize+maxControlFramePayloadSize)
  304. buf = append(buf, b0, b1)
  305. if c.isServer {
  306. buf = append(buf, data...)
  307. } else {
  308. key := newMaskKey()
  309. buf = append(buf, key[:]...)
  310. buf = append(buf, data...)
  311. maskBytes(key, 0, buf[6:])
  312. }
  313. d := time.Hour * 1000
  314. if !deadline.IsZero() {
  315. d = deadline.Sub(time.Now())
  316. if d < 0 {
  317. return errWriteTimeout
  318. }
  319. }
  320. timer := time.NewTimer(d)
  321. select {
  322. case <-c.mu:
  323. timer.Stop()
  324. case <-timer.C:
  325. return errWriteTimeout
  326. }
  327. defer func() { c.mu <- true }()
  328. if c.closeSent {
  329. return ErrCloseSent
  330. } else if messageType == CloseMessage {
  331. c.closeSent = true
  332. }
  333. c.conn.SetWriteDeadline(deadline)
  334. n, err := c.conn.Write(buf)
  335. if n != 0 && n != len(buf) {
  336. c.conn.Close()
  337. }
  338. return hideTempErr(err)
  339. }
  340. // NextWriter returns a writer for the next message to send. The writer's Close
  341. // method flushes the complete message to the network.
  342. //
  343. // There can be at most one open writer on a connection. NextWriter closes the
  344. // previous writer if the application has not already done so.
  345. func (c *Conn) NextWriter(messageType int) (io.WriteCloser, error) {
  346. if c.writeErr != nil {
  347. return nil, c.writeErr
  348. }
  349. // Close previous writer if not already closed by the application. It's
  350. // probably better to return an error in this situation, but we cannot
  351. // change this without breaking existing applications.
  352. if c.writer != nil {
  353. err := c.writer.Close()
  354. if err != nil {
  355. return nil, err
  356. }
  357. }
  358. if !isControl(messageType) && !isData(messageType) {
  359. return nil, errBadWriteOpCode
  360. }
  361. c.writeFrameType = messageType
  362. c.messageWriter = &messageWriter{c}
  363. var w io.WriteCloser = c.messageWriter
  364. if c.newCompressionWriter != nil && c.enableWriteCompression && isData(messageType) {
  365. c.writeCompress = true
  366. var err error
  367. w, err = c.newCompressionWriter(w)
  368. if err != nil {
  369. c.writer.Close()
  370. return nil, err
  371. }
  372. }
  373. return w, nil
  374. }
  375. // flushFrame writes buffered data and extra as a frame to the network. The
  376. // final argument indicates that this is the last frame in the message.
  377. func (c *Conn) flushFrame(final bool, extra []byte) error {
  378. length := c.writePos - maxFrameHeaderSize + len(extra)
  379. // Check for invalid control frames.
  380. if isControl(c.writeFrameType) &&
  381. (!final || length > maxControlFramePayloadSize) {
  382. c.messageWriter = nil
  383. c.writer = nil
  384. c.writeFrameType = noFrame
  385. c.writePos = maxFrameHeaderSize
  386. return errInvalidControlFrame
  387. }
  388. b0 := byte(c.writeFrameType)
  389. if final {
  390. b0 |= finalBit
  391. }
  392. if c.writeCompress {
  393. b0 |= rsv1Bit
  394. }
  395. c.writeCompress = false
  396. b1 := byte(0)
  397. if !c.isServer {
  398. b1 |= maskBit
  399. }
  400. // Assume that the frame starts at beginning of c.writeBuf.
  401. framePos := 0
  402. if c.isServer {
  403. // Adjust up if mask not included in the header.
  404. framePos = 4
  405. }
  406. switch {
  407. case length >= 65536:
  408. c.writeBuf[framePos] = b0
  409. c.writeBuf[framePos+1] = b1 | 127
  410. binary.BigEndian.PutUint64(c.writeBuf[framePos+2:], uint64(length))
  411. case length > 125:
  412. framePos += 6
  413. c.writeBuf[framePos] = b0
  414. c.writeBuf[framePos+1] = b1 | 126
  415. binary.BigEndian.PutUint16(c.writeBuf[framePos+2:], uint16(length))
  416. default:
  417. framePos += 8
  418. c.writeBuf[framePos] = b0
  419. c.writeBuf[framePos+1] = b1 | byte(length)
  420. }
  421. if !c.isServer {
  422. key := newMaskKey()
  423. copy(c.writeBuf[maxFrameHeaderSize-4:], key[:])
  424. maskBytes(key, 0, c.writeBuf[maxFrameHeaderSize:c.writePos])
  425. if len(extra) > 0 {
  426. c.writeErr = errors.New("websocket: internal error, extra used in client mode")
  427. return c.writeErr
  428. }
  429. }
  430. // Write the buffers to the connection with best-effort detection of
  431. // concurrent writes. See the concurrency section in the package
  432. // documentation for more info.
  433. if c.isWriting {
  434. panic("concurrent write to websocket connection")
  435. }
  436. c.isWriting = true
  437. c.writeErr = c.write(c.writeFrameType, c.writeDeadline, c.writeBuf[framePos:c.writePos], extra)
  438. if !c.isWriting {
  439. panic("concurrent write to websocket connection")
  440. }
  441. c.isWriting = false
  442. // Setup for next frame.
  443. c.writePos = maxFrameHeaderSize
  444. c.writeFrameType = continuationFrame
  445. if final {
  446. c.messageWriter = nil
  447. c.writer = nil
  448. c.writeFrameType = noFrame
  449. }
  450. return c.writeErr
  451. }
  452. type messageWriter struct{ c *Conn }
  453. func (w *messageWriter) err() error {
  454. c := w.c
  455. if c.messageWriter != w {
  456. return errWriteClosed
  457. }
  458. if c.writeErr != nil {
  459. return c.writeErr
  460. }
  461. return nil
  462. }
  463. func (w *messageWriter) ncopy(max int) (int, error) {
  464. n := len(w.c.writeBuf) - w.c.writePos
  465. if n <= 0 {
  466. if err := w.c.flushFrame(false, nil); err != nil {
  467. return 0, err
  468. }
  469. n = len(w.c.writeBuf) - w.c.writePos
  470. }
  471. if n > max {
  472. n = max
  473. }
  474. return n, nil
  475. }
  476. func (w *messageWriter) Write(p []byte) (int, error) {
  477. if err := w.err(); err != nil {
  478. return 0, err
  479. }
  480. if len(p) > 2*len(w.c.writeBuf) && w.c.isServer {
  481. // Don't buffer large messages.
  482. err := w.c.flushFrame(false, p)
  483. if err != nil {
  484. return 0, err
  485. }
  486. return len(p), nil
  487. }
  488. nn := len(p)
  489. for len(p) > 0 {
  490. n, err := w.ncopy(len(p))
  491. if err != nil {
  492. return 0, err
  493. }
  494. copy(w.c.writeBuf[w.c.writePos:], p[:n])
  495. w.c.writePos += n
  496. p = p[n:]
  497. }
  498. return nn, nil
  499. }
  500. func (w *messageWriter) WriteString(p string) (int, error) {
  501. if err := w.err(); err != nil {
  502. return 0, err
  503. }
  504. nn := len(p)
  505. for len(p) > 0 {
  506. n, err := w.ncopy(len(p))
  507. if err != nil {
  508. return 0, err
  509. }
  510. copy(w.c.writeBuf[w.c.writePos:], p[:n])
  511. w.c.writePos += n
  512. p = p[n:]
  513. }
  514. return nn, nil
  515. }
  516. func (w *messageWriter) ReadFrom(r io.Reader) (nn int64, err error) {
  517. if err := w.err(); err != nil {
  518. return 0, err
  519. }
  520. for {
  521. if w.c.writePos == len(w.c.writeBuf) {
  522. err = w.c.flushFrame(false, nil)
  523. if err != nil {
  524. break
  525. }
  526. }
  527. var n int
  528. n, err = r.Read(w.c.writeBuf[w.c.writePos:])
  529. w.c.writePos += n
  530. nn += int64(n)
  531. if err != nil {
  532. if err == io.EOF {
  533. err = nil
  534. }
  535. break
  536. }
  537. }
  538. return nn, err
  539. }
  540. func (w *messageWriter) Close() error {
  541. if err := w.err(); err != nil {
  542. return err
  543. }
  544. return w.c.flushFrame(true, nil)
  545. }
  546. // WriteMessage is a helper method for getting a writer using NextWriter,
  547. // writing the message and closing the writer.
  548. func (c *Conn) WriteMessage(messageType int, data []byte) error {
  549. w, err := c.NextWriter(messageType)
  550. if err != nil {
  551. return err
  552. }
  553. if _, ok := w.(*messageWriter); ok && c.isServer {
  554. // Optimize write as a single frame.
  555. n := copy(c.writeBuf[c.writePos:], data)
  556. c.writePos += n
  557. data = data[n:]
  558. err = c.flushFrame(true, data)
  559. return err
  560. }
  561. if _, err = w.Write(data); err != nil {
  562. return err
  563. }
  564. return w.Close()
  565. }
  566. // SetWriteDeadline sets the write deadline on the underlying network
  567. // connection. After a write has timed out, the websocket state is corrupt and
  568. // all future writes will return an error. A zero value for t means writes will
  569. // not time out.
  570. func (c *Conn) SetWriteDeadline(t time.Time) error {
  571. c.writeDeadline = t
  572. return nil
  573. }
  574. // Read methods
  575. func (c *Conn) advanceFrame() (int, error) {
  576. // 1. Skip remainder of previous frame.
  577. if c.readRemaining > 0 {
  578. if _, err := io.CopyN(ioutil.Discard, c.br, c.readRemaining); err != nil {
  579. return noFrame, err
  580. }
  581. }
  582. // 2. Read and parse first two bytes of frame header.
  583. p, err := c.read(2)
  584. if err != nil {
  585. return noFrame, err
  586. }
  587. final := p[0]&finalBit != 0
  588. frameType := int(p[0] & 0xf)
  589. mask := p[1]&maskBit != 0
  590. c.readRemaining = int64(p[1] & 0x7f)
  591. c.readDecompress = false
  592. if c.newDecompressionReader != nil && (p[0]&rsv1Bit) != 0 {
  593. c.readDecompress = true
  594. p[0] &^= rsv1Bit
  595. }
  596. if rsv := p[0] & (rsv1Bit | rsv2Bit | rsv3Bit); rsv != 0 {
  597. return noFrame, c.handleProtocolError("unexpected reserved bits 0x" + strconv.FormatInt(int64(rsv), 16))
  598. }
  599. switch frameType {
  600. case CloseMessage, PingMessage, PongMessage:
  601. if c.readRemaining > maxControlFramePayloadSize {
  602. return noFrame, c.handleProtocolError("control frame length > 125")
  603. }
  604. if !final {
  605. return noFrame, c.handleProtocolError("control frame not final")
  606. }
  607. case TextMessage, BinaryMessage:
  608. if !c.readFinal {
  609. return noFrame, c.handleProtocolError("message start before final message frame")
  610. }
  611. c.readFinal = final
  612. case continuationFrame:
  613. if c.readFinal {
  614. return noFrame, c.handleProtocolError("continuation after final message frame")
  615. }
  616. c.readFinal = final
  617. default:
  618. return noFrame, c.handleProtocolError("unknown opcode " + strconv.Itoa(frameType))
  619. }
  620. // 3. Read and parse frame length.
  621. switch c.readRemaining {
  622. case 126:
  623. p, err := c.read(2)
  624. if err != nil {
  625. return noFrame, err
  626. }
  627. c.readRemaining = int64(binary.BigEndian.Uint16(p))
  628. case 127:
  629. p, err := c.read(8)
  630. if err != nil {
  631. return noFrame, err
  632. }
  633. c.readRemaining = int64(binary.BigEndian.Uint64(p))
  634. }
  635. // 4. Handle frame masking.
  636. if mask != c.isServer {
  637. return noFrame, c.handleProtocolError("incorrect mask flag")
  638. }
  639. if mask {
  640. c.readMaskPos = 0
  641. p, err := c.read(len(c.readMaskKey))
  642. if err != nil {
  643. return noFrame, err
  644. }
  645. copy(c.readMaskKey[:], p)
  646. }
  647. // 5. For text and binary messages, enforce read limit and return.
  648. if frameType == continuationFrame || frameType == TextMessage || frameType == BinaryMessage {
  649. c.readLength += c.readRemaining
  650. if c.readLimit > 0 && c.readLength > c.readLimit {
  651. c.WriteControl(CloseMessage, FormatCloseMessage(CloseMessageTooBig, ""), time.Now().Add(writeWait))
  652. return noFrame, ErrReadLimit
  653. }
  654. return frameType, nil
  655. }
  656. // 6. Read control frame payload.
  657. var payload []byte
  658. if c.readRemaining > 0 {
  659. payload, err = c.read(int(c.readRemaining))
  660. c.readRemaining = 0
  661. if err != nil {
  662. return noFrame, err
  663. }
  664. if c.isServer {
  665. maskBytes(c.readMaskKey, 0, payload)
  666. }
  667. }
  668. // 7. Process control frame payload.
  669. switch frameType {
  670. case PongMessage:
  671. if err := c.handlePong(string(payload)); err != nil {
  672. return noFrame, err
  673. }
  674. case PingMessage:
  675. if err := c.handlePing(string(payload)); err != nil {
  676. return noFrame, err
  677. }
  678. case CloseMessage:
  679. echoMessage := []byte{}
  680. closeCode := CloseNoStatusReceived
  681. closeText := ""
  682. if len(payload) >= 2 {
  683. echoMessage = payload[:2]
  684. closeCode = int(binary.BigEndian.Uint16(payload))
  685. if !isValidReceivedCloseCode(closeCode) {
  686. return noFrame, c.handleProtocolError("invalid close code")
  687. }
  688. closeText = string(payload[2:])
  689. if !utf8.ValidString(closeText) {
  690. return noFrame, c.handleProtocolError("invalid utf8 payload in close frame")
  691. }
  692. }
  693. c.WriteControl(CloseMessage, echoMessage, time.Now().Add(writeWait))
  694. return noFrame, &CloseError{Code: closeCode, Text: closeText}
  695. }
  696. return frameType, nil
  697. }
  698. func (c *Conn) handleProtocolError(message string) error {
  699. c.WriteControl(CloseMessage, FormatCloseMessage(CloseProtocolError, message), time.Now().Add(writeWait))
  700. return errors.New("websocket: " + message)
  701. }
  702. // NextReader returns the next data message received from the peer. The
  703. // returned messageType is either TextMessage or BinaryMessage.
  704. //
  705. // There can be at most one open reader on a connection. NextReader discards
  706. // the previous message if the application has not already consumed it.
  707. //
  708. // Applications must break out of the application's read loop when this method
  709. // returns a non-nil error value. Errors returned from this method are
  710. // permanent. Once this method returns a non-nil error, all subsequent calls to
  711. // this method return the same error.
  712. func (c *Conn) NextReader() (messageType int, r io.Reader, err error) {
  713. c.messageReader = nil
  714. c.readLength = 0
  715. for c.readErr == nil {
  716. frameType, err := c.advanceFrame()
  717. if err != nil {
  718. c.readErr = hideTempErr(err)
  719. break
  720. }
  721. if frameType == TextMessage || frameType == BinaryMessage {
  722. c.messageReader = &messageReader{c}
  723. var r io.Reader = c.messageReader
  724. if c.readDecompress {
  725. r = c.newDecompressionReader(r)
  726. }
  727. return frameType, r, nil
  728. }
  729. }
  730. // Applications that do handle the error returned from this method spin in
  731. // tight loop on connection failure. To help application developers detect
  732. // this error, panic on repeated reads to the failed connection.
  733. c.readErrCount++
  734. if c.readErrCount >= 1000 {
  735. panic("repeated read on failed websocket connection")
  736. }
  737. return noFrame, nil, c.readErr
  738. }
  739. type messageReader struct{ c *Conn }
  740. func (r *messageReader) Read(b []byte) (int, error) {
  741. c := r.c
  742. if c.messageReader != r {
  743. return 0, io.EOF
  744. }
  745. for c.readErr == nil {
  746. if c.readRemaining > 0 {
  747. if int64(len(b)) > c.readRemaining {
  748. b = b[:c.readRemaining]
  749. }
  750. n, err := c.br.Read(b)
  751. c.readErr = hideTempErr(err)
  752. if c.isServer {
  753. c.readMaskPos = maskBytes(c.readMaskKey, c.readMaskPos, b[:n])
  754. }
  755. c.readRemaining -= int64(n)
  756. if c.readRemaining > 0 && c.readErr == io.EOF {
  757. c.readErr = errUnexpectedEOF
  758. }
  759. return n, c.readErr
  760. }
  761. if c.readFinal {
  762. c.messageReader = nil
  763. return 0, io.EOF
  764. }
  765. frameType, err := c.advanceFrame()
  766. switch {
  767. case err != nil:
  768. c.readErr = hideTempErr(err)
  769. case frameType == TextMessage || frameType == BinaryMessage:
  770. c.readErr = errors.New("websocket: internal error, unexpected text or binary in Reader")
  771. }
  772. }
  773. err := c.readErr
  774. if err == io.EOF && c.messageReader == r {
  775. err = errUnexpectedEOF
  776. }
  777. return 0, err
  778. }
  779. // ReadMessage is a helper method for getting a reader using NextReader and
  780. // reading from that reader to a buffer.
  781. func (c *Conn) ReadMessage() (messageType int, p []byte, err error) {
  782. var r io.Reader
  783. messageType, r, err = c.NextReader()
  784. if err != nil {
  785. return messageType, nil, err
  786. }
  787. p, err = ioutil.ReadAll(r)
  788. return messageType, p, err
  789. }
  790. // SetReadDeadline sets the read deadline on the underlying network connection.
  791. // After a read has timed out, the websocket connection state is corrupt and
  792. // all future reads will return an error. A zero value for t means reads will
  793. // not time out.
  794. func (c *Conn) SetReadDeadline(t time.Time) error {
  795. return c.conn.SetReadDeadline(t)
  796. }
  797. // SetReadLimit sets the maximum size for a message read from the peer. If a
  798. // message exceeds the limit, the connection sends a close frame to the peer
  799. // and returns ErrReadLimit to the application.
  800. func (c *Conn) SetReadLimit(limit int64) {
  801. c.readLimit = limit
  802. }
  803. // PingHandler returns the current ping handler
  804. func (c *Conn) PingHandler() func(appData string) error {
  805. return c.handlePing
  806. }
  807. // SetPingHandler sets the handler for ping messages received from the peer.
  808. // The appData argument to h is the PING frame application data. The default
  809. // ping handler sends a pong to the peer.
  810. func (c *Conn) SetPingHandler(h func(appData string) error) {
  811. if h == nil {
  812. h = func(message string) error {
  813. err := c.WriteControl(PongMessage, []byte(message), time.Now().Add(writeWait))
  814. if err == ErrCloseSent {
  815. return nil
  816. } else if e, ok := err.(net.Error); ok && e.Temporary() {
  817. return nil
  818. }
  819. return err
  820. }
  821. }
  822. c.handlePing = h
  823. }
  824. // PongHandler returns the current pong handler
  825. func (c *Conn) PongHandler() func(appData string) error {
  826. return c.handlePong
  827. }
  828. // SetPongHandler sets the handler for pong messages received from the peer.
  829. // The appData argument to h is the PONG frame application data. The default
  830. // pong handler does nothing.
  831. func (c *Conn) SetPongHandler(h func(appData string) error) {
  832. if h == nil {
  833. h = func(string) error { return nil }
  834. }
  835. c.handlePong = h
  836. }
  837. // UnderlyingConn returns the internal net.Conn. This can be used to further
  838. // modifications to connection specific flags.
  839. func (c *Conn) UnderlyingConn() net.Conn {
  840. return c.conn
  841. }
  842. // EnableWriteCompression enables and disables write compression of
  843. // subsequent text and binary messages. This function is a noop if
  844. // compression was not negotiated with the peer.
  845. func (c *Conn) EnableWriteCompression(enable bool) {
  846. c.enableWriteCompression = enable
  847. }
  848. // FormatCloseMessage formats closeCode and text as a WebSocket close message.
  849. func FormatCloseMessage(closeCode int, text string) []byte {
  850. buf := make([]byte, 2+len(text))
  851. binary.BigEndian.PutUint16(buf, uint16(closeCode))
  852. copy(buf[2:], text)
  853. return buf
  854. }