From a15b1e28055cdc16f3c2d5424c21925266b84001 Mon Sep 17 00:00:00 2001 From: Cesar Blum Silveira Date: Tue, 11 Oct 2016 13:55:05 -0700 Subject: [PATCH] Update cached Content-Length when setting raw header. --- .../Internal/Http/FrameHeaders.Generated.cs | 1 + .../FrameResponseHeadersTests.cs | 18 ++++++++++++++++++ .../KnownHeaders.cs | 3 ++- 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs index 88fa8d6ac7..82931f5681 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs @@ -6083,6 +6083,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Internal.Http } public void SetRawContentLength(StringValues value, byte[] raw) { + _contentLength = ParseContentLength(value); _bits |= 2048L; _headers._ContentLength = value; _headers._rawContentLength = raw; diff --git a/test/Microsoft.AspNetCore.Server.KestrelTests/FrameResponseHeadersTests.cs b/test/Microsoft.AspNetCore.Server.KestrelTests/FrameResponseHeadersTests.cs index ff27b37cf9..c21d6b2423 100644 --- a/test/Microsoft.AspNetCore.Server.KestrelTests/FrameResponseHeadersTests.cs +++ b/test/Microsoft.AspNetCore.Server.KestrelTests/FrameResponseHeadersTests.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Text; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Server.Kestrel; using Microsoft.AspNetCore.Server.Kestrel.Internal; @@ -166,6 +167,14 @@ namespace Microsoft.AspNetCore.Server.KestrelTests Assert.Throws(() => ((IHeaderDictionary)headers)["Content-Length"] = "bad"); } + [Fact] + public void ThrowsWhenSettingRawContentLengthToNonNumericValue() + { + var headers = new FrameResponseHeaders(); + + Assert.Throws(() => headers.SetRawContentLength("bad", Encoding.ASCII.GetBytes("bad"))); + } + [Fact] public void ThrowsWhenAssigningHeaderContentLengthToNonNumericValue() { @@ -193,6 +202,15 @@ namespace Microsoft.AspNetCore.Server.KestrelTests Assert.Equal(42, headers.HeaderContentLengthValue); } + [Fact] + public void ContentLengthValueCanBeReadAsLongAfterSettingRawHeader() + { + var headers = new FrameResponseHeaders(); + headers.SetRawContentLength("42", Encoding.ASCII.GetBytes("42")); + + Assert.Equal(42, headers.HeaderContentLengthValue); + } + [Fact] public void ContentLengthValueCanBeReadAsLongAfterAssigningHeader() { diff --git a/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs b/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs index 7d8b57256f..8cb51355ac 100644 --- a/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs +++ b/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs @@ -242,7 +242,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Internal.Http }}")} {Each(loop.Headers.Where(header => header.EnhancedSetter), header => $@" public void SetRaw{header.Identifier}(StringValues value, byte[] raw) - {{ + {{{If(loop.ClassName == "FrameResponseHeaders" && header.Identifier == "ContentLength", () => @" + _contentLength = ParseContentLength(value);")} {header.SetBit()}; _headers._{header.Identifier} = value; _headers._raw{header.Identifier} = raw;