@@ -45,21 +45,21 @@ type Conn struct {
4545 // writeFrameLock is acquired to write a single frame.
4646 // Effectively meaning whoever holds it gets to write to bw.
4747 writeFrameLock chan struct {}
48+ writeHeaderBuf []byte
4849
4950 // Used to ensure the previous reader is read till EOF before allowing
5051 // a new one.
5152 previousReader * messageReader
5253 // readFrameLock is acquired to read from bw.
53- readFrameLock chan struct {}
54+ readFrameLock chan struct {}
55+ readHeaderBuf []byte
56+ controlPayloadBuf []byte
5457
5558 setReadTimeout chan context.Context
5659 setWriteTimeout chan context.Context
5760
5861 activePingsMu sync.Mutex
5962 activePings map [string ]chan <- struct {}
60-
61- headerBuf []byte
62- controlPayloadBuf []byte
6363}
6464
6565func (c * Conn ) init () {
@@ -77,7 +77,8 @@ func (c *Conn) init() {
7777
7878 c .activePings = make (map [string ]chan <- struct {})
7979
80- c .headerBuf = makeHeaderBuf ()
80+ c .writeHeaderBuf = makeWriteHeaderBuf ()
81+ c .readHeaderBuf = makeReadHeaderBuf ()
8182 c .controlPayloadBuf = make ([]byte , maxControlFramePayload )
8283
8384 runtime .SetFinalizer (c , func (c * Conn ) {
@@ -215,7 +216,7 @@ func (c *Conn) readFrameHeader(ctx context.Context) (header, error) {
215216 case c .setReadTimeout <- ctx :
216217 }
217218
218- h , err := readHeader (c .headerBuf , c .br )
219+ h , err := readHeader (c .readHeaderBuf , c .br )
219220 if err != nil {
220221 select {
221222 case <- c .closed :
@@ -628,7 +629,7 @@ func (c *Conn) writeFrame(ctx context.Context, fin bool, opcode opcode, p []byte
628629 }
629630 }
630631
631- b2 := marshalHeader ( h )
632+ headerBytes := writeHeader ( c . writeHeaderBuf , h )
632633
633634 err := c .acquireLock (ctx , c .writeFrameLock )
634635 if err != nil {
@@ -651,7 +652,7 @@ func (c *Conn) writeFrame(ctx context.Context, fin bool, opcode opcode, p []byte
651652 default :
652653 }
653654
654- err = xerrors .Errorf ("failed to write frame: %w" , err )
655+ err = xerrors .Errorf ("failed to write %v frame: %w" , h . opcode , err )
655656 // We need to release the lock first before closing the connection to ensure
656657 // the lock can be acquired inside close to ensure no one can access c.bw.
657658 c .releaseLock (c .writeFrameLock )
@@ -660,7 +661,7 @@ func (c *Conn) writeFrame(ctx context.Context, fin bool, opcode opcode, p []byte
660661 return err
661662 }
662663
663- _ , err = c .bw .Write (b2 )
664+ _ , err = c .bw .Write (headerBytes )
664665 if err != nil {
665666 return 0 , writeErr (err )
666667 }
0 commit comments