From 19e943e6b9023408d98428e9b0dccca752e9f0a9 Mon Sep 17 00:00:00 2001 From: John Luo Date: Mon, 6 Nov 2017 14:12:28 -0800 Subject: [PATCH] Update base key - Add Scheme, Host, Port and PathBase --- .../Internal/ResponseCachingKeyProvider.cs | 15 +++++++++++---- .../Internal/StringBuilderExtensions.cs | 10 ++++++---- .../ResponseCachingKeyProviderTests.cs | 8 ++++---- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/Microsoft.AspNetCore.ResponseCaching/Internal/ResponseCachingKeyProvider.cs b/src/Microsoft.AspNetCore.ResponseCaching/Internal/ResponseCachingKeyProvider.cs index 4cb9fcf604..fe010f7cc4 100644 --- a/src/Microsoft.AspNetCore.ResponseCaching/Internal/ResponseCachingKeyProvider.cs +++ b/src/Microsoft.AspNetCore.ResponseCaching/Internal/ResponseCachingKeyProvider.cs @@ -39,7 +39,7 @@ namespace Microsoft.AspNetCore.ResponseCaching.Internal return new string[] { CreateStorageVaryByKey(context) }; } - // GET/PATH + // GETSCHEMEHOST:PORT/PATHBASE/PATH public string CreateBaseKey(ResponseCachingContext context) { if (context == null) @@ -54,15 +54,22 @@ namespace Microsoft.AspNetCore.ResponseCaching.Internal { builder .AppendUpperInvariant(request.Method) - .Append(KeyDelimiter); + .Append(KeyDelimiter) + .AppendUpperInvariant(request.Scheme) + .Append(KeyDelimiter) + .AppendUpperInvariant(request.Host.Value); if (_options.UseCaseSensitivePaths) { - builder.Append(request.Path.Value); + builder + .Append(request.PathBase.Value) + .Append(request.Path.Value); } else { - builder.AppendUpperInvariant(request.Path.Value); + builder + .AppendUpperInvariant(request.PathBase.Value) + .AppendUpperInvariant(request.Path.Value); } return builder.ToString(); diff --git a/src/Microsoft.AspNetCore.ResponseCaching/Internal/StringBuilderExtensions.cs b/src/Microsoft.AspNetCore.ResponseCaching/Internal/StringBuilderExtensions.cs index fc718ffeb0..d533fbf870 100644 --- a/src/Microsoft.AspNetCore.ResponseCaching/Internal/StringBuilderExtensions.cs +++ b/src/Microsoft.AspNetCore.ResponseCaching/Internal/StringBuilderExtensions.cs @@ -1,7 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Text; namespace Microsoft.AspNetCore.ResponseCaching.Internal @@ -10,10 +9,13 @@ namespace Microsoft.AspNetCore.ResponseCaching.Internal { internal static StringBuilder AppendUpperInvariant(this StringBuilder builder, string value) { - builder.EnsureCapacity(builder.Length + value.Length); - for (var i = 0; i < value.Length; i++) + if (string.IsNullOrEmpty(value)) { - builder.Append(char.ToUpperInvariant(value[i])); + builder.EnsureCapacity(builder.Length + value.Length); + for (var i = 0; i < value.Length; i++) + { + builder.Append(char.ToUpperInvariant(value[i])); + } } return builder; diff --git a/test/Microsoft.AspNetCore.ResponseCaching.Tests/ResponseCachingKeyProviderTests.cs b/test/Microsoft.AspNetCore.ResponseCaching.Tests/ResponseCachingKeyProviderTests.cs index dbe9996e56..1a46e23862 100644 --- a/test/Microsoft.AspNetCore.ResponseCaching.Tests/ResponseCachingKeyProviderTests.cs +++ b/test/Microsoft.AspNetCore.ResponseCaching.Tests/ResponseCachingKeyProviderTests.cs @@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.ResponseCaching.Tests private static readonly char KeyDelimiter = '\x1e'; [Fact] - public void ResponseCachingKeyProvider_CreateStorageBaseKey_IncludesOnlyNormalizedMethodAndPath() + public void ResponseCachingKeyProvider_CreateStorageBaseKey_IncludesOnlyNormalizedMethodSchemeHostPortAndPath() { var cacheKeyProvider = TestUtils.CreateTestKeyProvider(); var context = TestUtils.CreateTestContext(); @@ -24,7 +24,7 @@ namespace Microsoft.AspNetCore.ResponseCaching.Tests context.HttpContext.Request.PathBase = "/pathBase"; context.HttpContext.Request.QueryString = new QueryString("?query.Key=a&query.Value=b"); - Assert.Equal($"HEAD{KeyDelimiter}/PATH/SUBPATH", cacheKeyProvider.CreateBaseKey(context)); + Assert.Equal($"HEAD{KeyDelimiter}HTTPS{KeyDelimiter}EXAMPLE.COM:80/PATHBASE/PATH/SUBPATH", cacheKeyProvider.CreateBaseKey(context)); } [Fact] @@ -38,7 +38,7 @@ namespace Microsoft.AspNetCore.ResponseCaching.Tests context.HttpContext.Request.Method = HttpMethods.Get; context.HttpContext.Request.Path = "/Path"; - Assert.Equal($"{HttpMethods.Get}{KeyDelimiter}/PATH", cacheKeyProvider.CreateBaseKey(context)); + Assert.Equal($"{HttpMethods.Get}{KeyDelimiter}{KeyDelimiter}/PATH", cacheKeyProvider.CreateBaseKey(context)); } [Fact] @@ -52,7 +52,7 @@ namespace Microsoft.AspNetCore.ResponseCaching.Tests context.HttpContext.Request.Method = HttpMethods.Get; context.HttpContext.Request.Path = "/Path"; - Assert.Equal($"{HttpMethods.Get}{KeyDelimiter}/Path", cacheKeyProvider.CreateBaseKey(context)); + Assert.Equal($"{HttpMethods.Get}{KeyDelimiter}{KeyDelimiter}/Path", cacheKeyProvider.CreateBaseKey(context)); } [Fact]