@@ -22,15 +22,14 @@ type CommonConn struct {
22
22
PreWrite []byte
23
23
GCM * GCM
24
24
PeerPadding []byte
25
- PeerInBytes [] byte
25
+ rawInput bytes. Buffer // PeerInBytes
26
26
PeerGCM * GCM
27
27
input bytes.Reader // PeerCache
28
28
}
29
29
30
30
func NewCommonConn (conn net.Conn ) * CommonConn {
31
31
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 ,
34
33
}
35
34
}
36
35
@@ -93,11 +92,11 @@ func (c *CommonConn) Read(b []byte) (int, error) {
93
92
if c .input .Len () > 0 {
94
93
return c .input .Read (b )
95
94
}
96
- peerHeader := c . PeerInBytes [: 5 ]
95
+ peerHeader := make ([] byte , 5 )
97
96
if _ , err := io .ReadFull (c .Conn , peerHeader ); err != nil {
98
97
return 0 , err
99
98
}
100
- l , err := DecodeHeader (c . PeerInBytes [: 5 ] ) // l: 17~17000
99
+ l , err := DecodeHeader (peerHeader ) // l: 17~17000
101
100
if err != nil {
102
101
if c .Client != nil && errors .Is (err , ErrInvalidHeader ) { // client's 0-RTT
103
102
c .Client .RWLock .Lock ()
@@ -110,7 +109,8 @@ func (c *CommonConn) Read(b []byte) (int, error) {
110
109
return 0 , err
111
110
}
112
111
c .Client = nil
113
- peerData := c .PeerInBytes [5 : 5 + l ]
112
+ c .rawInput .Grow (l )
113
+ peerData := c .rawInput .Bytes ()[:l ]
114
114
if _ , err := io .ReadFull (c .Conn , peerData ); err != nil {
115
115
return 0 , err
116
116
}
@@ -120,7 +120,7 @@ func (c *CommonConn) Read(b []byte) (int, error) {
120
120
}
121
121
var newGCM * GCM
122
122
if bytes .Equal (c .PeerGCM .Nonce [:], MaxNonce ) {
123
- newGCM = NewGCM (c . PeerInBytes [: 5 + l ] , c .UnitedKey )
123
+ newGCM = NewGCM (append ( peerHeader , peerData ... ) , c .UnitedKey )
124
124
}
125
125
_ , err = c .PeerGCM .Open (dst [:0 ], nil , peerData , peerHeader )
126
126
if newGCM != nil {
0 commit comments