@@ -87,8 +87,10 @@ type AuthenticationReader struct {
87
87
sizeParser ChunkSizeDecoder
88
88
transferType protocol.TransferType
89
89
padding PaddingLengthGenerator
90
- size int32
91
- paddingLen int32
90
+ size uint16
91
+ paddingLen uint16
92
+ hasSize bool
93
+ done bool
92
94
}
93
95
94
96
func NewAuthenticationReader (auth Authenticator , sizeParser ChunkSizeDecoder , reader io.Reader , transferType protocol.TransferType , paddingLen PaddingLengthGenerator ) * AuthenticationReader {
@@ -98,26 +100,24 @@ func NewAuthenticationReader(auth Authenticator, sizeParser ChunkSizeDecoder, re
98
100
sizeParser : sizeParser ,
99
101
transferType : transferType ,
100
102
padding : paddingLen ,
101
- size : - 1 ,
102
103
}
103
104
}
104
105
105
- func (r * AuthenticationReader ) readSize () (int32 , int32 , error ) {
106
- if r .size != - 1 {
107
- s := r .size
108
- r .size = - 1
109
- return s , r .paddingLen , nil
106
+ func (r * AuthenticationReader ) readSize () (uint16 , uint16 , error ) {
107
+ if r .hasSize {
108
+ r .hasSize = false
109
+ return r .size , r .paddingLen , nil
110
110
}
111
111
sizeBytes := make ([]byte , r .sizeParser .SizeBytes ())
112
112
if _ , err := io .ReadFull (r .reader , sizeBytes ); err != nil {
113
113
return 0 , 0 , err
114
114
}
115
- var padding int32
115
+ var padding uint16
116
116
if r .padding != nil {
117
- padding = int32 ( r .padding .NextPaddingLen () )
117
+ padding = r .padding .NextPaddingLen ()
118
118
}
119
119
size , err := r .sizeParser .Decode (sizeBytes )
120
- return int32 ( size ) , padding , err
120
+ return size , padding , err
121
121
}
122
122
123
123
var errSoft = newError ("waiting for more data" )
@@ -127,31 +127,36 @@ func (r *AuthenticationReader) readInternal(soft bool) (*buf.Buffer, error) {
127
127
return nil , errSoft
128
128
}
129
129
130
+ if r .done {
131
+ return nil , io .EOF
132
+ }
133
+
130
134
size , padding , err := r .readSize ()
131
135
if err != nil {
132
136
return nil , err
133
137
}
134
138
135
- if size == - 2 || size == int32 (r .auth .Overhead ())+ padding {
136
- r .size = - 2
139
+ if size == uint16 (r .auth .Overhead ())+ padding {
140
+ r .done = true
137
141
return nil , io .EOF
138
142
}
139
143
140
- if soft && size > r .reader .BufferedBytes () {
144
+ if soft && int32 ( size ) > r .reader .BufferedBytes () {
141
145
r .size = size
142
146
r .paddingLen = padding
147
+ r .hasSize = true
143
148
return nil , errSoft
144
149
}
145
150
146
- b := buf .NewSize (size )
147
- if err := b .Reset (buf .ReadFullFrom (r .reader , size )); err != nil {
151
+ b := buf .NewSize (int32 ( size ) )
152
+ if err := b .Reset (buf .ReadFullFrom (r .reader , int32 ( size ) )); err != nil {
148
153
b .Release ()
149
154
return nil , err
150
155
}
151
156
152
157
size -= padding
153
158
154
- rb , err := r .auth .Open (b .BytesTo (0 ), b .BytesTo (size ))
159
+ rb , err := r .auth .Open (b .BytesTo (0 ), b .BytesTo (int32 ( size ) ))
155
160
if err != nil {
156
161
b .Release ()
157
162
return nil , err
0 commit comments