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