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 System.Linq;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.AspNetCore.Http.Headers;
|
using Microsoft.AspNetCore.Http.Headers;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using Microsoft.Extensions.Logging.Abstractions;
|
||||||
using Microsoft.Extensions.Primitives;
|
using Microsoft.Extensions.Primitives;
|
||||||
using Microsoft.Net.Http.Headers;
|
using Microsoft.Net.Http.Headers;
|
||||||
|
|
||||||
|
|
@ -16,21 +18,32 @@ namespace Microsoft.AspNetCore.Internal
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal static class RangeHelper
|
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>
|
/// <summary>
|
||||||
/// Returns the normalized form of the requested range if the Range Header in the <see cref="HttpContext.Request"/> is valid.
|
/// Returns the normalized form of the requested range if the Range Header in the <see cref="HttpContext.Request"/> is valid.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="context">The <see cref="HttpContext"/> associated with the request.</param>
|
/// <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="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="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
|
/// <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 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>
|
/// 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).
|
/// <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>
|
/// 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,
|
HttpContext context,
|
||||||
RequestHeaders requestHeaders,
|
RequestHeaders requestHeaders,
|
||||||
long length)
|
long length,
|
||||||
|
ILogger logger)
|
||||||
{
|
{
|
||||||
var rawRangeHeader = context.Request.Headers[HeaderNames.Range];
|
var rawRangeHeader = context.Request.Headers[HeaderNames.Range];
|
||||||
if (StringValues.IsNullOrEmpty(rawRangeHeader))
|
if (StringValues.IsNullOrEmpty(rawRangeHeader))
|
||||||
|
|
@ -41,6 +54,8 @@ namespace Microsoft.AspNetCore.Internal
|
||||||
// Perf: Check for a single entry before parsing it
|
// Perf: Check for a single entry before parsing it
|
||||||
if (rawRangeHeader.Count > 1 || rawRangeHeader[0].IndexOf(',') >= 0)
|
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
|
// 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
|
// 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.
|
// impact the server. Ignore the header and serve the response normally.
|
||||||
|
|
|
||||||
|
|
@ -257,7 +257,7 @@ namespace Microsoft.AspNetCore.StaticFiles
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
(_isRangeRequest, _range) = RangeHelper.ParseRange(_context, _requestHeaders, _length);
|
(_isRangeRequest, _range) = RangeHelper.ParseRange(_context, _requestHeaders, _length, _logger);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ApplyResponseHeaders(int statusCode)
|
public void ApplyResponseHeaders(int statusCode)
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Http" Version="$(MicrosoftAspNetCoreHttpPackageVersion)" />
|
<PackageReference Include="Microsoft.AspNetCore.Http" Version="$(MicrosoftAspNetCoreHttpPackageVersion)" />
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="$(MicrosoftExtensionsLoggingAbstractionsPackageVersion)" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Http.Extensions" Version="$(MicrosoftAspNetCoreHttpExtensionsPackageVersion)" />
|
<PackageReference Include="Microsoft.AspNetCore.Http.Extensions" Version="$(MicrosoftAspNetCoreHttpExtensionsPackageVersion)" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
|
using Microsoft.Extensions.Logging.Abstractions;
|
||||||
using Microsoft.Net.Http.Headers;
|
using Microsoft.Net.Http.Headers;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
|
|
@ -65,7 +66,7 @@ namespace Microsoft.AspNetCore.Internal
|
||||||
httpContext.Request.Headers[HeaderNames.Range] = range;
|
httpContext.Request.Headers[HeaderNames.Range] = range;
|
||||||
|
|
||||||
// Act
|
// 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
|
||||||
Assert.False(isRangeRequest);
|
Assert.False(isRangeRequest);
|
||||||
|
|
@ -82,7 +83,7 @@ namespace Microsoft.AspNetCore.Internal
|
||||||
httpContext.Request.Headers[HeaderNames.Range] = range;
|
httpContext.Request.Headers[HeaderNames.Range] = range;
|
||||||
|
|
||||||
// Act
|
// 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
|
||||||
Assert.False(isRangeRequest);
|
Assert.False(isRangeRequest);
|
||||||
|
|
@ -98,7 +99,7 @@ namespace Microsoft.AspNetCore.Internal
|
||||||
httpContext.Request.Headers[HeaderNames.Range] = range.ToString();
|
httpContext.Request.Headers[HeaderNames.Range] = range.ToString();
|
||||||
|
|
||||||
// Act
|
// 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
|
||||||
Assert.True(isRangeRequest);
|
Assert.True(isRangeRequest);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue