Add logging to RangeHelper.cs
This commit is contained in:
parent
f3e0943e52
commit
f8692d14e4
|
|
@ -6,6 +6,8 @@ using System.Diagnostics;
|
|||
using System.Linq;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Http.Headers;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Logging.Abstractions;
|
||||
using Microsoft.Extensions.Primitives;
|
||||
using Microsoft.Net.Http.Headers;
|
||||
|
||||
|
|
@ -16,21 +18,32 @@ namespace Microsoft.AspNetCore.Internal
|
|||
/// </summary>
|
||||
internal static class RangeHelper
|
||||
{
|
||||
// Is temporary to avoid build break
|
||||
public static (bool isRangeRequest, RangeItemHeaderValue range) ParseRange(
|
||||
HttpContext context,
|
||||
RequestHeaders requestHeaders,
|
||||
long length)
|
||||
{
|
||||
return ParseRange(context, requestHeaders, length, NullLogger.Instance);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the normalized form of the requested range if the Range Header in the <see cref="HttpContext.Request"/> is valid.
|
||||
/// </summary>
|
||||
/// <param name="context">The <see cref="HttpContext"/> associated with the request.</param>
|
||||
/// <param name="requestHeaders">The <see cref="RequestHeaders"/> associated with the given <paramref name="context"/>.</param>
|
||||
/// <param name="length">The total length of the file representation requested.</param>
|
||||
/// <param name="logger">The <see cref="ILogger"/>.</param>
|
||||
/// <returns>A boolean value which represents if the <paramref name="requestHeaders"/> contain a single valid
|
||||
/// range request. A <see cref="RangeItemHeaderValue"/> which represents the normalized form of the
|
||||
/// range parsed from the <paramref name="requestHeaders"/> or <c>null</c> if it cannot be normalized.</returns>
|
||||
/// <remark>If the Range header exists but cannot be parsed correctly, or if the provided length is 0, then the range request cannot be satisfied (status 416).
|
||||
/// This results in (<c>true</c>,<c>null</c>) return values.</remark>
|
||||
public static (bool, RangeItemHeaderValue) ParseRange(
|
||||
public static (bool isRangeRequest, RangeItemHeaderValue range) ParseRange(
|
||||
HttpContext context,
|
||||
RequestHeaders requestHeaders,
|
||||
long length)
|
||||
long length,
|
||||
ILogger logger)
|
||||
{
|
||||
var rawRangeHeader = context.Request.Headers[HeaderNames.Range];
|
||||
if (StringValues.IsNullOrEmpty(rawRangeHeader))
|
||||
|
|
@ -41,6 +54,8 @@ namespace Microsoft.AspNetCore.Internal
|
|||
// Perf: Check for a single entry before parsing it
|
||||
if (rawRangeHeader.Count > 1 || rawRangeHeader[0].IndexOf(',') >= 0)
|
||||
{
|
||||
logger.LogWarning("Multiple ranges are not supported.");
|
||||
|
||||
// The spec allows for multiple ranges but we choose not to support them because the client may request
|
||||
// very strange ranges (e.g. each byte separately, overlapping ranges, etc.) that could negatively
|
||||
// impact the server. Ignore the header and serve the response normally.
|
||||
|
|
|
|||
|
|
@ -257,7 +257,7 @@ namespace Microsoft.AspNetCore.StaticFiles
|
|||
return;
|
||||
}
|
||||
|
||||
(_isRangeRequest, _range) = RangeHelper.ParseRange(_context, _requestHeaders, _length);
|
||||
(_isRangeRequest, _range) = RangeHelper.ParseRange(_context, _requestHeaders, _length, _logger);
|
||||
}
|
||||
|
||||
public void ApplyResponseHeaders(int statusCode)
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.AspNetCore.Http" Version="$(MicrosoftAspNetCoreHttpPackageVersion)" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="$(MicrosoftExtensionsLoggingAbstractionsPackageVersion)" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Http.Extensions" Version="$(MicrosoftAspNetCoreHttpExtensionsPackageVersion)" />
|
||||
</ItemGroup>
|
||||
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.Extensions.Logging.Abstractions;
|
||||
using Microsoft.Net.Http.Headers;
|
||||
using Xunit;
|
||||
|
||||
|
|
@ -65,7 +66,7 @@ namespace Microsoft.AspNetCore.Internal
|
|||
httpContext.Request.Headers[HeaderNames.Range] = range;
|
||||
|
||||
// Act
|
||||
var (isRangeRequest, parsedRangeResult) = RangeHelper.ParseRange(httpContext, httpContext.Request.GetTypedHeaders(), 10);
|
||||
var (isRangeRequest, parsedRangeResult) = RangeHelper.ParseRange(httpContext, httpContext.Request.GetTypedHeaders(), 10, NullLogger.Instance);
|
||||
|
||||
// Assert
|
||||
Assert.False(isRangeRequest);
|
||||
|
|
@ -82,7 +83,7 @@ namespace Microsoft.AspNetCore.Internal
|
|||
httpContext.Request.Headers[HeaderNames.Range] = range;
|
||||
|
||||
// Act
|
||||
var (isRangeRequest, parsedRangeResult) = RangeHelper.ParseRange(httpContext, httpContext.Request.GetTypedHeaders(), 10);
|
||||
var (isRangeRequest, parsedRangeResult) = RangeHelper.ParseRange(httpContext, httpContext.Request.GetTypedHeaders(), 10, NullLogger.Instance);
|
||||
|
||||
// Assert
|
||||
Assert.False(isRangeRequest);
|
||||
|
|
@ -98,7 +99,7 @@ namespace Microsoft.AspNetCore.Internal
|
|||
httpContext.Request.Headers[HeaderNames.Range] = range.ToString();
|
||||
|
||||
// Act
|
||||
var (isRangeRequest, parsedRange) = RangeHelper.ParseRange(httpContext, httpContext.Request.GetTypedHeaders(), 4);
|
||||
var (isRangeRequest, parsedRange) = RangeHelper.ParseRange(httpContext, httpContext.Request.GetTypedHeaders(), 4, NullLogger.Instance);
|
||||
|
||||
// Assert
|
||||
Assert.True(isRangeRequest);
|
||||
|
|
|
|||
Loading…
Reference in New Issue