@@ -23,15 +23,14 @@ type CommonConn struct {
2323 PreWrite []byte
2424 GCM * GCM
2525 PeerPadding []byte
26- PeerInBytes [] byte
26+ rawInput bytes. Buffer // PeerInBytes
2727 PeerGCM * GCM
2828 input bytes.Reader // PeerCache
2929}
3030
3131func NewCommonConn (conn net.Conn ) * CommonConn {
3232 return & CommonConn {
33- Conn : conn ,
34- PeerInBytes : make ([]byte , 5 + 17000 ), // no need to use sync.Pool, because we are always reading
33+ Conn : conn ,
3534 }
3635}
3736
@@ -94,11 +93,11 @@ func (c *CommonConn) Read(b []byte) (int, error) {
9493 if c .input .Len () > 0 {
9594 return c .input .Read (b )
9695 }
97- peerHeader := c . PeerInBytes [: 5 ]
96+ peerHeader := make ([] byte , 5 )
9897 if _ , err := io .ReadFull (c .Conn , peerHeader ); err != nil {
9998 return 0 , err
10099 }
101- l , err := DecodeHeader (c . PeerInBytes [: 5 ] ) // l: 17~17000
100+ l , err := DecodeHeader (peerHeader ) // l: 17~17000
102101 if err != nil {
103102 if c .Client != nil && errors .Is (err , ErrInvalidHeader ) { // client's 0-RTT
104103 c .Client .RWLock .Lock ()
@@ -111,7 +110,8 @@ func (c *CommonConn) Read(b []byte) (int, error) {
111110 return 0 , err
112111 }
113112 c .Client = nil
114- peerData := c .PeerInBytes [5 : 5 + l ]
113+ c .rawInput .Grow (l )
114+ peerData := c .rawInput .Bytes ()[:l ]
115115 if _ , err := io .ReadFull (c .Conn , peerData ); err != nil {
116116 return 0 , err
117117 }
@@ -121,7 +121,7 @@ func (c *CommonConn) Read(b []byte) (int, error) {
121121 }
122122 var newGCM * GCM
123123 if bytes .Equal (c .PeerGCM .Nonce [:], MaxNonce ) {
124- newGCM = NewGCM (c . PeerInBytes [: 5 + l ] , c .UnitedKey )
124+ newGCM = NewGCM (append ( peerHeader , peerData ... ) , c .UnitedKey )
125125 }
126126 _ , err = c .PeerGCM .Open (dst [:0 ], nil , peerData , peerHeader )
127127 if newGCM != nil {
0 commit comments