@@ -189,32 +189,77 @@ public bool TakeStartLine(ReadOnlySequence<byte> buffer, out SequencePosition co
189
189
return result ;
190
190
}
191
191
192
- public bool TakeMessageHeaders ( ReadOnlySequence < byte > buffer , bool trailers , out SequencePosition consumed , out SequencePosition examined )
192
+ public bool TakeMessageHeaders ( in ReadOnlySequence < byte > buffer , bool trailers , out SequencePosition consumed , out SequencePosition examined )
193
193
{
194
194
// Make sure the buffer is limited
195
- bool overLength = false ;
196
- if ( buffer . Length >= _remainingRequestHeadersBytesAllowed )
195
+ if ( buffer . Length > _remainingRequestHeadersBytesAllowed )
197
196
{
198
- buffer = buffer . Slice ( buffer . Start , _remainingRequestHeadersBytesAllowed ) ;
199
-
200
- // If we sliced it means the current buffer bigger than what we're
201
- // allowed to look at
202
- overLength = true ;
197
+ return TrimAndTakeMessageHeaders ( buffer , trailers , out consumed , out examined ) ;
203
198
}
204
199
205
- var result = _parser . ParseHeaders ( new Http1ParsingHandler ( this , trailers ) , buffer , out consumed , out examined , out var consumedBytes ) ;
206
- _remainingRequestHeadersBytesAllowed -= consumedBytes ;
207
-
208
- if ( ! result && overLength )
200
+ var reader = new SequenceReader < byte > ( buffer ) ;
201
+ var result = false ;
202
+ try
209
203
{
210
- BadHttpRequestException . Throw ( RequestRejectionReason . HeadersExceedMaxTotalSize ) ;
204
+ result = _parser . ParseHeaders ( new Http1ParsingHandler ( this , trailers ) , ref reader ) ;
205
+
206
+ if ( result )
207
+ {
208
+ TimeoutControl . CancelTimeout ( ) ;
209
+ }
210
+
211
+ return result ;
211
212
}
212
- if ( result )
213
+ finally
213
214
{
214
- TimeoutControl . CancelTimeout ( ) ;
215
+ consumed = reader . Position ;
216
+ _remainingRequestHeadersBytesAllowed -= ( int ) reader . Consumed ;
217
+
218
+ if ( result )
219
+ {
220
+ examined = consumed ;
221
+ }
222
+ else
223
+ {
224
+ examined = buffer . End ;
225
+ }
215
226
}
216
227
217
- return result ;
228
+ bool TrimAndTakeMessageHeaders ( in ReadOnlySequence < byte > buffer , bool trailers , out SequencePosition consumed , out SequencePosition examined )
229
+ {
230
+ var trimmedBuffer = buffer . Slice ( buffer . Start , _remainingRequestHeadersBytesAllowed ) ;
231
+
232
+ var reader = new SequenceReader < byte > ( trimmedBuffer ) ;
233
+ var result = false ;
234
+ try
235
+ {
236
+ result = _parser . ParseHeaders ( new Http1ParsingHandler ( this , trailers ) , ref reader ) ;
237
+
238
+ if ( ! result )
239
+ {
240
+ // We read the maximum allowed but didn't complete the headers.
241
+ BadHttpRequestException . Throw ( RequestRejectionReason . HeadersExceedMaxTotalSize ) ;
242
+ }
243
+
244
+ TimeoutControl . CancelTimeout ( ) ;
245
+
246
+ return result ;
247
+ }
248
+ finally
249
+ {
250
+ consumed = reader . Position ;
251
+ _remainingRequestHeadersBytesAllowed -= ( int ) reader . Consumed ;
252
+
253
+ if ( result )
254
+ {
255
+ examined = consumed ;
256
+ }
257
+ else
258
+ {
259
+ examined = trimmedBuffer . End ;
260
+ }
261
+ }
262
+ }
218
263
}
219
264
220
265
public void OnStartLine ( HttpMethod method , HttpVersion version , Span < byte > target , Span < byte > path , Span < byte > query , Span < byte > customMethod , bool pathEncoded )
0 commit comments