|
15 | 15 | using Microsoft.AspNetCore.StaticFiles.Infrastructure;
|
16 | 16 | using Microsoft.Extensions.FileProviders;
|
17 | 17 | using Microsoft.Extensions.Logging;
|
| 18 | +using Microsoft.Extensions.Primitives; |
18 | 19 | using Microsoft.Net.Http.Headers;
|
19 | 20 |
|
20 | 21 | namespace Microsoft.AspNetCore.StaticFiles
|
@@ -228,21 +229,32 @@ private void ComputeRange()
|
228 | 229 | return;
|
229 | 230 | }
|
230 | 231 |
|
231 |
| - var rangeHeader = _requestHeaders.Range; |
232 |
| - if (rangeHeader == null) |
| 232 | + var rawRangeHeader = _request.Headers[HeaderNames.Range]; |
| 233 | + if (StringValues.IsNullOrEmpty(rawRangeHeader)) |
233 | 234 | {
|
234 | 235 | return;
|
235 | 236 | }
|
236 | 237 |
|
237 |
| - if (rangeHeader.Ranges.Count > 1) |
| 238 | + // Perf: Check for a single entry before parsing it |
| 239 | + if (rawRangeHeader.Count > 1 || rawRangeHeader[0].IndexOf(',') >= 0) |
238 | 240 | {
|
239 | 241 | // The spec allows for multiple ranges but we choose not to support them because the client may request
|
240 | 242 | // very strange ranges (e.g. each byte separately, overlapping ranges, etc.) that could negatively
|
241 | 243 | // impact the server. Ignore the header and serve the response normally.
|
242 |
| - _logger.LogMultipleFileRanges(rangeHeader.ToString()); |
| 244 | + _logger.LogMultipleFileRanges(rawRangeHeader.ToString()); |
243 | 245 | return;
|
244 | 246 | }
|
245 | 247 |
|
| 248 | + var rangeHeader = _requestHeaders.Range; |
| 249 | + if (rangeHeader == null) |
| 250 | + { |
| 251 | + // Invalid |
| 252 | + return; |
| 253 | + } |
| 254 | + |
| 255 | + // Already verified above |
| 256 | + Debug.Assert(rangeHeader.Ranges.Count == 1); |
| 257 | + |
246 | 258 | // 14.27 If-Range
|
247 | 259 | var ifRangeHeader = _requestHeaders.IfRange;
|
248 | 260 | if (ifRangeHeader != null)
|
|
0 commit comments