@@ -22,15 +22,14 @@ type CommonConn struct {
2222 PreWrite []byte
2323 GCM * GCM
2424 PeerPadding []byte
25- PeerInBytes [] byte
25+ rawInput bytes. Buffer // PeerInBytes
2626 PeerGCM * GCM
2727 input bytes.Reader // PeerCache
2828}
2929
3030func NewCommonConn (conn net.Conn ) * CommonConn {
3131 return & CommonConn {
32- Conn : conn ,
33- PeerInBytes : make ([]byte , 5 + 17000 ), // no need to use sync.Pool, because we are always reading
32+ Conn : conn ,
3433 }
3534}
3635
@@ -93,11 +92,11 @@ func (c *CommonConn) Read(b []byte) (int, error) {
9392 if c .input .Len () > 0 {
9493 return c .input .Read (b )
9594 }
96- peerHeader := c . PeerInBytes [: 5 ]
95+ peerHeader := make ([] byte , 5 )
9796 if _ , err := io .ReadFull (c .Conn , peerHeader ); err != nil {
9897 return 0 , err
9998 }
100- l , err := DecodeHeader (c . PeerInBytes [: 5 ] ) // l: 17~17000
99+ l , err := DecodeHeader (peerHeader ) // l: 17~17000
101100 if err != nil {
102101 if c .Client != nil && errors .Is (err , ErrInvalidHeader ) { // client's 0-RTT
103102 c .Client .RWLock .Lock ()
@@ -110,7 +109,8 @@ func (c *CommonConn) Read(b []byte) (int, error) {
110109 return 0 , err
111110 }
112111 c .Client = nil
113- peerData := c .PeerInBytes [5 : 5 + l ]
112+ c .rawInput .Grow (l )
113+ peerData := c .rawInput .Bytes ()[:l ]
114114 if _ , err := io .ReadFull (c .Conn , peerData ); err != nil {
115115 return 0 , err
116116 }
@@ -120,7 +120,7 @@ func (c *CommonConn) Read(b []byte) (int, error) {
120120 }
121121 var newGCM * GCM
122122 if bytes .Equal (c .PeerGCM .Nonce [:], MaxNonce ) {
123- newGCM = NewGCM (c . PeerInBytes [: 5 + l ] , c .UnitedKey )
123+ newGCM = NewGCM (append ( peerHeader , peerData ... ) , c .UnitedKey )
124124 }
125125 _ , err = c .PeerGCM .Open (dst [:0 ], nil , peerData , peerHeader )
126126 if newGCM != nil {
0 commit comments