Add logging to RangeHelper.cs

This commit is contained in:
Kiran Challa 2017-12-28 13:08:20 -08:00
parent f3e0943e52
commit f8692d14e4
4 changed files with 23 additions and 6 deletions

View File

@ -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.

View File

@ -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)

View File

@ -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>

View File

@ -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);