Update cached Content-Length when setting raw header.

This commit is contained in:
Cesar Blum Silveira 2016-10-11 13:55:05 -07:00
parent f8813a600d
commit a15b1e2805
3 changed files with 21 additions and 1 deletions

View File

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

View File

@ -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<InvalidOperationException>(() => ((IHeaderDictionary)headers)["Content-Length"] = "bad");
}
[Fact]
public void ThrowsWhenSettingRawContentLengthToNonNumericValue()
{
var headers = new FrameResponseHeaders();
Assert.Throws<InvalidOperationException>(() => 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()
{

View File

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