Update cached Content-Length when setting raw header.
This commit is contained in:
parent
f8813a600d
commit
a15b1e2805
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue