conn.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819
  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. "math/rand"
  12. "net"
  13. "strconv"
  14. "time"
  15. )
  16. // Close codes defined in RFC 6455, section 11.7.
  17. const (
  18. CloseNormalClosure = 1000
  19. CloseGoingAway = 1001
  20. CloseProtocolError = 1002
  21. CloseUnsupportedData = 1003
  22. CloseNoStatusReceived = 1005
  23. CloseAbnormalClosure = 1006
  24. CloseInvalidFramePayloadData = 1007
  25. ClosePolicyViolation = 1008
  26. CloseMessageTooBig = 1009
  27. CloseMandatoryExtension = 1010
  28. CloseInternalServerErr = 1011
  29. CloseTLSHandshake = 1015
  30. )
  31. // The message types are defined in RFC 6455, section 11.8.
  32. const (
  33. // TextMessage denotes a text data message. The text message payload is
  34. // interpreted as UTF-8 encoded text data.
  35. TextMessage = 1
  36. // BinaryMessage denotes a binary data message.
  37. BinaryMessage = 2
  38. // CloseMessage denotes a close control message. The optional message
  39. // payload contains a numeric code and text. Use the FormatCloseMessage
  40. // function to format a close message payload.
  41. CloseMessage = 8
  42. // PingMessage denotes a ping control message. The optional message payload
  43. // is UTF-8 encoded text.
  44. PingMessage = 9
  45. // PongMessage denotes a ping control message. The optional message payload
  46. // is UTF-8 encoded text.
  47. PongMessage = 10
  48. )
  49. var (
  50. continuationFrame = 0
  51. noFrame = -1
  52. )
  53. var (
  54. // ErrCloseSent is returned when the application writes a message to the
  55. // connection after sending a close message.
  56. ErrCloseSent = errors.New("websocket: close sent")
  57. // ErrReadLimit is returned when reading a message that is larger than the
  58. // read limit set for the connection.
  59. ErrReadLimit = errors.New("websocket: read limit exceeded")
  60. )
  61. // netError satisfies the net Error interface.
  62. type netError struct {
  63. msg string
  64. temporary bool
  65. timeout bool
  66. }
  67. func (e *netError) Error() string { return e.msg }
  68. func (e *netError) Temporary() bool { return e.temporary }
  69. func (e *netError) Timeout() bool { return e.timeout }
  70. // closeError represents close frame.
  71. type closeError struct {
  72. code int
  73. text string
  74. }
  75. func (e *closeError) Error() string {
  76. return "websocket: close " + strconv.Itoa(e.code) + " " + e.text
  77. }
  78. var (
  79. errWriteTimeout = &netError{msg: "websocket: write timeout", timeout: true}
  80. errUnexpectedEOF = &closeError{code: CloseAbnormalClosure, text: io.ErrUnexpectedEOF.Error()}
  81. errBadWriteOpCode = errors.New("websocket: bad write message type")
  82. errWriteClosed = errors.New("websocket: write closed")
  83. errInvalidControlFrame = errors.New("websocket: invalid control frame")
  84. )
  85. const (
  86. maxFrameHeaderSize = 2 + 8 + 4 // Fixed header + length + mask
  87. maxControlFramePayloadSize = 125
  88. finalBit = 1 << 7
  89. maskBit = 1 << 7
  90. writeWait = time.Second
  91. )
  92. func hideTempErr(err error) error {
  93. if e, ok := err.(net.Error); ok && e.Temporary() {
  94. err = struct{ error }{err}
  95. }
  96. return err
  97. }
  98. func isControl(frameType int) bool {
  99. return frameType == CloseMessage || frameType == PingMessage || frameType == PongMessage
  100. }
  101. func isData(frameType int) bool {
  102. return frameType == TextMessage || frameType == BinaryMessage
  103. }
  104. func maskBytes(key [4]byte, pos int, b []byte) int {
  105. for i := range b {
  106. b[i] ^= key[pos&3]
  107. pos++
  108. }
  109. return pos & 3
  110. }
  111. func newMaskKey() [4]byte {
  112. n := rand.Uint32()
  113. return [4]byte{byte(n), byte(n >> 8), byte(n >> 16), byte(n >> 24)}
  114. }
  115. // Conn represents a WebSocket connection.
  116. type Conn struct {
  117. conn net.Conn
  118. isServer bool
  119. subprotocol string
  120. // Write fields
  121. mu chan bool // used as mutex to protect write to conn and closeSent
  122. closeSent bool // true if close message was sent
  123. // Message writer fields.
  124. writeErr error
  125. writeBuf []byte // frame is constructed in this buffer.
  126. writePos int // end of data in writeBuf.
  127. writeFrameType int // type of the current frame.
  128. writeSeq int // incremented to invalidate message writers.
  129. writeDeadline time.Time
  130. // Read fields
  131. readErr error
  132. br *bufio.Reader
  133. readRemaining int64 // bytes remaining in current frame.
  134. readFinal bool // true the current message has more frames.
  135. readSeq int // incremented to invalidate message readers.
  136. readLength int64 // Message size.
  137. readLimit int64 // Maximum message size.
  138. readMaskPos int
  139. readMaskKey [4]byte
  140. handlePong func(string) error
  141. handlePing func(string) error
  142. }
  143. func newConn(conn net.Conn, isServer bool, readBufSize, writeBufSize int) *Conn {
  144. mu := make(chan bool, 1)
  145. mu <- true
  146. c := &Conn{
  147. isServer: isServer,
  148. br: bufio.NewReaderSize(conn, readBufSize),
  149. conn: conn,
  150. mu: mu,
  151. readFinal: true,
  152. writeBuf: make([]byte, writeBufSize+maxFrameHeaderSize),
  153. writeFrameType: noFrame,
  154. writePos: maxFrameHeaderSize,
  155. }
  156. c.SetPingHandler(nil)
  157. c.SetPongHandler(nil)
  158. return c
  159. }
  160. // Subprotocol returns the negotiated protocol for the connection.
  161. func (c *Conn) Subprotocol() string {
  162. return c.subprotocol
  163. }
  164. // Close closes the underlying network connection without sending or waiting for a close frame.
  165. func (c *Conn) Close() error {
  166. return c.conn.Close()
  167. }
  168. // LocalAddr returns the local network address.
  169. func (c *Conn) LocalAddr() net.Addr {
  170. return c.conn.LocalAddr()
  171. }
  172. // RemoteAddr returns the remote network address.
  173. func (c *Conn) RemoteAddr() net.Addr {
  174. return c.conn.RemoteAddr()
  175. }
  176. // Write methods
  177. func (c *Conn) write(frameType int, deadline time.Time, bufs ...[]byte) error {
  178. <-c.mu
  179. defer func() { c.mu <- true }()
  180. if c.closeSent {
  181. return ErrCloseSent
  182. } else if frameType == CloseMessage {
  183. c.closeSent = true
  184. }
  185. c.conn.SetWriteDeadline(deadline)
  186. for _, buf := range bufs {
  187. if len(buf) > 0 {
  188. n, err := c.conn.Write(buf)
  189. if n != len(buf) {
  190. // Close on partial write.
  191. c.conn.Close()
  192. }
  193. if err != nil {
  194. return err
  195. }
  196. }
  197. }
  198. return nil
  199. }
  200. // WriteControl writes a control message with the given deadline. The allowed
  201. // message types are CloseMessage, PingMessage and PongMessage.
  202. func (c *Conn) WriteControl(messageType int, data []byte, deadline time.Time) error {
  203. if !isControl(messageType) {
  204. return errBadWriteOpCode
  205. }
  206. if len(data) > maxControlFramePayloadSize {
  207. return errInvalidControlFrame
  208. }
  209. b0 := byte(messageType) | finalBit
  210. b1 := byte(len(data))
  211. if !c.isServer {
  212. b1 |= maskBit
  213. }
  214. buf := make([]byte, 0, maxFrameHeaderSize+maxControlFramePayloadSize)
  215. buf = append(buf, b0, b1)
  216. if c.isServer {
  217. buf = append(buf, data...)
  218. } else {
  219. key := newMaskKey()
  220. buf = append(buf, key[:]...)
  221. buf = append(buf, data...)
  222. maskBytes(key, 0, buf[6:])
  223. }
  224. d := time.Hour * 1000
  225. if !deadline.IsZero() {
  226. d = deadline.Sub(time.Now())
  227. if d < 0 {
  228. return errWriteTimeout
  229. }
  230. }
  231. timer := time.NewTimer(d)
  232. select {
  233. case <-c.mu:
  234. timer.Stop()
  235. case <-timer.C:
  236. return errWriteTimeout
  237. }
  238. defer func() { c.mu <- true }()
  239. if c.closeSent {
  240. return ErrCloseSent
  241. } else if messageType == CloseMessage {
  242. c.closeSent = true
  243. }
  244. c.conn.SetWriteDeadline(deadline)
  245. n, err := c.conn.Write(buf)
  246. if n != 0 && n != len(buf) {
  247. c.conn.Close()
  248. }
  249. return err
  250. }
  251. // NextWriter returns a writer for the next message to send. The writer's
  252. // Close method flushes the complete message to the network.
  253. //
  254. // There can be at most one open writer on a connection. NextWriter closes the
  255. // previous writer if the application has not already done so.
  256. //
  257. // The NextWriter method and the writers returned from the method cannot be
  258. // accessed by more than one goroutine at a time.
  259. func (c *Conn) NextWriter(messageType int) (io.WriteCloser, error) {
  260. if c.writeErr != nil {
  261. return nil, c.writeErr
  262. }
  263. if c.writeFrameType != noFrame {
  264. if err := c.flushFrame(true, nil); err != nil {
  265. return nil, err
  266. }
  267. }
  268. if !isControl(messageType) && !isData(messageType) {
  269. return nil, errBadWriteOpCode
  270. }
  271. c.writeFrameType = messageType
  272. return messageWriter{c, c.writeSeq}, nil
  273. }
  274. func (c *Conn) flushFrame(final bool, extra []byte) error {
  275. length := c.writePos - maxFrameHeaderSize + len(extra)
  276. // Check for invalid control frames.
  277. if isControl(c.writeFrameType) &&
  278. (!final || length > maxControlFramePayloadSize) {
  279. c.writeSeq++
  280. c.writeFrameType = noFrame
  281. c.writePos = maxFrameHeaderSize
  282. return errInvalidControlFrame
  283. }
  284. b0 := byte(c.writeFrameType)
  285. if final {
  286. b0 |= finalBit
  287. }
  288. b1 := byte(0)
  289. if !c.isServer {
  290. b1 |= maskBit
  291. }
  292. // Assume that the frame starts at beginning of c.writeBuf.
  293. framePos := 0
  294. if c.isServer {
  295. // Adjust up if mask not included in the header.
  296. framePos = 4
  297. }
  298. switch {
  299. case length >= 65536:
  300. c.writeBuf[framePos] = b0
  301. c.writeBuf[framePos+1] = b1 | 127
  302. binary.BigEndian.PutUint64(c.writeBuf[framePos+2:], uint64(length))
  303. case length > 125:
  304. framePos += 6
  305. c.writeBuf[framePos] = b0
  306. c.writeBuf[framePos+1] = b1 | 126
  307. binary.BigEndian.PutUint16(c.writeBuf[framePos+2:], uint16(length))
  308. default:
  309. framePos += 8
  310. c.writeBuf[framePos] = b0
  311. c.writeBuf[framePos+1] = b1 | byte(length)
  312. }
  313. if !c.isServer {
  314. key := newMaskKey()
  315. copy(c.writeBuf[maxFrameHeaderSize-4:], key[:])
  316. maskBytes(key, 0, c.writeBuf[maxFrameHeaderSize:c.writePos])
  317. if len(extra) > 0 {
  318. c.writeErr = errors.New("websocket: internal error, extra used in client mode")
  319. return c.writeErr
  320. }
  321. }
  322. // Write the buffers to the connection.
  323. c.writeErr = c.write(c.writeFrameType, c.writeDeadline, c.writeBuf[framePos:c.writePos], extra)
  324. // Setup for next frame.
  325. c.writePos = maxFrameHeaderSize
  326. c.writeFrameType = continuationFrame
  327. if final {
  328. c.writeSeq++
  329. c.writeFrameType = noFrame
  330. }
  331. return c.writeErr
  332. }
  333. type messageWriter struct {
  334. c *Conn
  335. seq int
  336. }
  337. func (w messageWriter) err() error {
  338. c := w.c
  339. if c.writeSeq != w.seq {
  340. return errWriteClosed
  341. }
  342. if c.writeErr != nil {
  343. return c.writeErr
  344. }
  345. return nil
  346. }
  347. func (w messageWriter) ncopy(max int) (int, error) {
  348. n := len(w.c.writeBuf) - w.c.writePos
  349. if n <= 0 {
  350. if err := w.c.flushFrame(false, nil); err != nil {
  351. return 0, err
  352. }
  353. n = len(w.c.writeBuf) - w.c.writePos
  354. }
  355. if n > max {
  356. n = max
  357. }
  358. return n, nil
  359. }
  360. func (w messageWriter) write(final bool, p []byte) (int, error) {
  361. if err := w.err(); err != nil {
  362. return 0, err
  363. }
  364. if len(p) > 2*len(w.c.writeBuf) && w.c.isServer {
  365. // Don't buffer large messages.
  366. err := w.c.flushFrame(final, p)
  367. if err != nil {
  368. return 0, err
  369. }
  370. return len(p), nil
  371. }
  372. nn := len(p)
  373. for len(p) > 0 {
  374. n, err := w.ncopy(len(p))
  375. if err != nil {
  376. return 0, err
  377. }
  378. copy(w.c.writeBuf[w.c.writePos:], p[:n])
  379. w.c.writePos += n
  380. p = p[n:]
  381. }
  382. return nn, nil
  383. }
  384. func (w messageWriter) Write(p []byte) (int, error) {
  385. return w.write(false, p)
  386. }
  387. func (w messageWriter) WriteString(p string) (int, error) {
  388. if err := w.err(); err != nil {
  389. return 0, err
  390. }
  391. nn := len(p)
  392. for len(p) > 0 {
  393. n, err := w.ncopy(len(p))
  394. if err != nil {
  395. return 0, err
  396. }
  397. copy(w.c.writeBuf[w.c.writePos:], p[:n])
  398. w.c.writePos += n
  399. p = p[n:]
  400. }
  401. return nn, nil
  402. }
  403. func (w messageWriter) ReadFrom(r io.Reader) (nn int64, err error) {
  404. if err := w.err(); err != nil {
  405. return 0, err
  406. }
  407. for {
  408. if w.c.writePos == len(w.c.writeBuf) {
  409. err = w.c.flushFrame(false, nil)
  410. if err != nil {
  411. break
  412. }
  413. }
  414. var n int
  415. n, err = r.Read(w.c.writeBuf[w.c.writePos:])
  416. w.c.writePos += n
  417. nn += int64(n)
  418. if err != nil {
  419. if err == io.EOF {
  420. err = nil
  421. }
  422. break
  423. }
  424. }
  425. return nn, err
  426. }
  427. func (w messageWriter) Close() error {
  428. if err := w.err(); err != nil {
  429. return err
  430. }
  431. return w.c.flushFrame(true, nil)
  432. }
  433. // WriteMessage is a helper method for getting a writer using NextWriter,
  434. // writing the message and closing the writer.
  435. func (c *Conn) WriteMessage(messageType int, data []byte) error {
  436. wr, err := c.NextWriter(messageType)
  437. if err != nil {
  438. return err
  439. }
  440. w := wr.(messageWriter)
  441. if _, err := w.write(true, data); err != nil {
  442. return err
  443. }
  444. if c.writeSeq == w.seq {
  445. if err := c.flushFrame(true, nil); err != nil {
  446. return err
  447. }
  448. }
  449. return nil
  450. }
  451. // SetWriteDeadline sets the write deadline on the underlying network
  452. // connection. After a write has timed out, the websocket state is corrupt and
  453. // all future writes will return an error. A zero value for t means writes will
  454. // not time out
  455. func (c *Conn) SetWriteDeadline(t time.Time) error {
  456. c.writeDeadline = t
  457. return nil
  458. }
  459. // Read methods
  460. // readFull is like io.ReadFull except that io.EOF is never returned.
  461. func (c *Conn) readFull(p []byte) (err error) {
  462. var n int
  463. for n < len(p) && err == nil {
  464. var nn int
  465. nn, err = c.br.Read(p[n:])
  466. n += nn
  467. }
  468. if n == len(p) {
  469. err = nil
  470. } else if err == io.EOF {
  471. err = errUnexpectedEOF
  472. }
  473. return
  474. }
  475. func (c *Conn) advanceFrame() (int, error) {
  476. // 1. Skip remainder of previous frame.
  477. if c.readRemaining > 0 {
  478. if _, err := io.CopyN(ioutil.Discard, c.br, c.readRemaining); err != nil {
  479. return noFrame, err
  480. }
  481. }
  482. // 2. Read and parse first two bytes of frame header.
  483. var b [8]byte
  484. if err := c.readFull(b[:2]); err != nil {
  485. return noFrame, err
  486. }
  487. final := b[0]&finalBit != 0
  488. frameType := int(b[0] & 0xf)
  489. reserved := int((b[0] >> 4) & 0x7)
  490. mask := b[1]&maskBit != 0
  491. c.readRemaining = int64(b[1] & 0x7f)
  492. if reserved != 0 {
  493. return noFrame, c.handleProtocolError("unexpected reserved bits " + strconv.Itoa(reserved))
  494. }
  495. switch frameType {
  496. case CloseMessage, PingMessage, PongMessage:
  497. if c.readRemaining > maxControlFramePayloadSize {
  498. return noFrame, c.handleProtocolError("control frame length > 125")
  499. }
  500. if !final {
  501. return noFrame, c.handleProtocolError("control frame not final")
  502. }
  503. case TextMessage, BinaryMessage:
  504. if !c.readFinal {
  505. return noFrame, c.handleProtocolError("message start before final message frame")
  506. }
  507. c.readFinal = final
  508. case continuationFrame:
  509. if c.readFinal {
  510. return noFrame, c.handleProtocolError("continuation after final message frame")
  511. }
  512. c.readFinal = final
  513. default:
  514. return noFrame, c.handleProtocolError("unknown opcode " + strconv.Itoa(frameType))
  515. }
  516. // 3. Read and parse frame length.
  517. switch c.readRemaining {
  518. case 126:
  519. if err := c.readFull(b[:2]); err != nil {
  520. return noFrame, err
  521. }
  522. c.readRemaining = int64(binary.BigEndian.Uint16(b[:2]))
  523. case 127:
  524. if err := c.readFull(b[:8]); err != nil {
  525. return noFrame, err
  526. }
  527. c.readRemaining = int64(binary.BigEndian.Uint64(b[:8]))
  528. }
  529. // 4. Handle frame masking.
  530. if mask != c.isServer {
  531. return noFrame, c.handleProtocolError("incorrect mask flag")
  532. }
  533. if mask {
  534. c.readMaskPos = 0
  535. if err := c.readFull(c.readMaskKey[:]); err != nil {
  536. return noFrame, err
  537. }
  538. }
  539. // 5. For text and binary messages, enforce read limit and return.
  540. if frameType == continuationFrame || frameType == TextMessage || frameType == BinaryMessage {
  541. c.readLength += c.readRemaining
  542. if c.readLimit > 0 && c.readLength > c.readLimit {
  543. c.WriteControl(CloseMessage, FormatCloseMessage(CloseMessageTooBig, ""), time.Now().Add(writeWait))
  544. return noFrame, ErrReadLimit
  545. }
  546. return frameType, nil
  547. }
  548. // 6. Read control frame payload.
  549. var payload []byte
  550. if c.readRemaining > 0 {
  551. payload = make([]byte, c.readRemaining)
  552. c.readRemaining = 0
  553. if err := c.readFull(payload); err != nil {
  554. return noFrame, err
  555. }
  556. if c.isServer {
  557. maskBytes(c.readMaskKey, 0, payload)
  558. }
  559. }
  560. // 7. Process control frame payload.
  561. switch frameType {
  562. case PongMessage:
  563. if err := c.handlePong(string(payload)); err != nil {
  564. return noFrame, err
  565. }
  566. case PingMessage:
  567. if err := c.handlePing(string(payload)); err != nil {
  568. return noFrame, err
  569. }
  570. case CloseMessage:
  571. c.WriteControl(CloseMessage, []byte{}, time.Now().Add(writeWait))
  572. closeCode := CloseNoStatusReceived
  573. closeText := ""
  574. if len(payload) >= 2 {
  575. closeCode = int(binary.BigEndian.Uint16(payload))
  576. closeText = string(payload[2:])
  577. }
  578. switch closeCode {
  579. case CloseNormalClosure, CloseGoingAway:
  580. return noFrame, io.EOF
  581. default:
  582. return noFrame, &closeError{code: closeCode, text: closeText}
  583. }
  584. }
  585. return frameType, nil
  586. }
  587. func (c *Conn) handleProtocolError(message string) error {
  588. c.WriteControl(CloseMessage, FormatCloseMessage(CloseProtocolError, message), time.Now().Add(writeWait))
  589. return errors.New("websocket: " + message)
  590. }
  591. // NextReader returns the next data message received from the peer. The
  592. // returned messageType is either TextMessage or BinaryMessage.
  593. //
  594. // There can be at most one open reader on a connection. NextReader discards
  595. // the previous message if the application has not already consumed it.
  596. //
  597. // The NextReader method and the readers returned from the method cannot be
  598. // accessed by more than one goroutine at a time.
  599. func (c *Conn) NextReader() (messageType int, r io.Reader, err error) {
  600. c.readSeq++
  601. c.readLength = 0
  602. for c.readErr == nil {
  603. frameType, err := c.advanceFrame()
  604. if err != nil {
  605. c.readErr = hideTempErr(err)
  606. break
  607. }
  608. if frameType == TextMessage || frameType == BinaryMessage {
  609. return frameType, messageReader{c, c.readSeq}, nil
  610. }
  611. }
  612. return noFrame, nil, c.readErr
  613. }
  614. type messageReader struct {
  615. c *Conn
  616. seq int
  617. }
  618. func (r messageReader) Read(b []byte) (int, error) {
  619. if r.seq != r.c.readSeq {
  620. return 0, io.EOF
  621. }
  622. for r.c.readErr == nil {
  623. if r.c.readRemaining > 0 {
  624. if int64(len(b)) > r.c.readRemaining {
  625. b = b[:r.c.readRemaining]
  626. }
  627. n, err := r.c.br.Read(b)
  628. r.c.readErr = hideTempErr(err)
  629. if r.c.isServer {
  630. r.c.readMaskPos = maskBytes(r.c.readMaskKey, r.c.readMaskPos, b[:n])
  631. }
  632. r.c.readRemaining -= int64(n)
  633. return n, r.c.readErr
  634. }
  635. if r.c.readFinal {
  636. r.c.readSeq++
  637. return 0, io.EOF
  638. }
  639. frameType, err := r.c.advanceFrame()
  640. switch {
  641. case err != nil:
  642. r.c.readErr = hideTempErr(err)
  643. case frameType == TextMessage || frameType == BinaryMessage:
  644. r.c.readErr = errors.New("websocket: internal error, unexpected text or binary in Reader")
  645. }
  646. }
  647. err := r.c.readErr
  648. if err == io.EOF && r.seq == r.c.readSeq {
  649. err = errUnexpectedEOF
  650. }
  651. return 0, err
  652. }
  653. // ReadMessage is a helper method for getting a reader using NextReader and
  654. // reading from that reader to a buffer.
  655. func (c *Conn) ReadMessage() (messageType int, p []byte, err error) {
  656. var r io.Reader
  657. messageType, r, err = c.NextReader()
  658. if err != nil {
  659. return messageType, nil, err
  660. }
  661. p, err = ioutil.ReadAll(r)
  662. return messageType, p, err
  663. }
  664. // SetReadDeadline sets the read deadline on the underlying network connection.
  665. // After a read has timed out, the websocket connection state is corrupt and
  666. // all future reads will return an error. A zero value for t means reads will
  667. // not time out.
  668. func (c *Conn) SetReadDeadline(t time.Time) error {
  669. return c.conn.SetReadDeadline(t)
  670. }
  671. // SetReadLimit sets the maximum size for a message read from the peer. If a
  672. // message exceeds the limit, the connection sends a close frame to the peer
  673. // and returns ErrReadLimit to the application.
  674. func (c *Conn) SetReadLimit(limit int64) {
  675. c.readLimit = limit
  676. }
  677. // SetPingHandler sets the handler for ping messages received from the peer.
  678. // The default ping handler sends a pong to the peer.
  679. func (c *Conn) SetPingHandler(h func(string) error) {
  680. if h == nil {
  681. h = func(message string) error {
  682. c.WriteControl(PongMessage, []byte(message), time.Now().Add(writeWait))
  683. return nil
  684. }
  685. }
  686. c.handlePing = h
  687. }
  688. // SetPongHandler sets then handler for pong messages received from the peer.
  689. // The default pong handler does nothing.
  690. func (c *Conn) SetPongHandler(h func(string) error) {
  691. if h == nil {
  692. h = func(string) error { return nil }
  693. }
  694. c.handlePong = h
  695. }
  696. // UnderlyingConn returns the internal net.Conn. This can be used to further
  697. // modifications to connection specific flags.
  698. func (c *Conn) UnderlyingConn() net.Conn {
  699. return c.conn
  700. }
  701. // FormatCloseMessage formats closeCode and text as a WebSocket close message.
  702. func FormatCloseMessage(closeCode int, text string) []byte {
  703. buf := make([]byte, 2+len(text))
  704. binary.BigEndian.PutUint16(buf, uint16(closeCode))
  705. copy(buf[2:], text)
  706. return buf
  707. }