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)
|
public void SetRawContentLength(StringValues value, byte[] raw)
|
||||||
{
|
{
|
||||||
|
_contentLength = ParseContentLength(value);
|
||||||
_bits |= 2048L;
|
_bits |= 2048L;
|
||||||
_headers._ContentLength = value;
|
_headers._ContentLength = value;
|
||||||
_headers._rawContentLength = raw;
|
_headers._rawContentLength = raw;
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.AspNetCore.Server.Kestrel;
|
using Microsoft.AspNetCore.Server.Kestrel;
|
||||||
using Microsoft.AspNetCore.Server.Kestrel.Internal;
|
using Microsoft.AspNetCore.Server.Kestrel.Internal;
|
||||||
|
|
@ -166,6 +167,14 @@ namespace Microsoft.AspNetCore.Server.KestrelTests
|
||||||
Assert.Throws<InvalidOperationException>(() => ((IHeaderDictionary)headers)["Content-Length"] = "bad");
|
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]
|
[Fact]
|
||||||
public void ThrowsWhenAssigningHeaderContentLengthToNonNumericValue()
|
public void ThrowsWhenAssigningHeaderContentLengthToNonNumericValue()
|
||||||
{
|
{
|
||||||
|
|
@ -193,6 +202,15 @@ namespace Microsoft.AspNetCore.Server.KestrelTests
|
||||||
Assert.Equal(42, headers.HeaderContentLengthValue);
|
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]
|
[Fact]
|
||||||
public void ContentLengthValueCanBeReadAsLongAfterAssigningHeader()
|
public void ContentLengthValueCanBeReadAsLongAfterAssigningHeader()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -242,7 +242,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Internal.Http
|
||||||
}}")}
|
}}")}
|
||||||
{Each(loop.Headers.Where(header => header.EnhancedSetter), header => $@"
|
{Each(loop.Headers.Where(header => header.EnhancedSetter), header => $@"
|
||||||
public void SetRaw{header.Identifier}(StringValues value, byte[] raw)
|
public void SetRaw{header.Identifier}(StringValues value, byte[] raw)
|
||||||
{{
|
{{{If(loop.ClassName == "FrameResponseHeaders" && header.Identifier == "ContentLength", () => @"
|
||||||
|
_contentLength = ParseContentLength(value);")}
|
||||||
{header.SetBit()};
|
{header.SetBit()};
|
||||||
_headers._{header.Identifier} = value;
|
_headers._{header.Identifier} = value;
|
||||||
_headers._raw{header.Identifier} = raw;
|
_headers._raw{header.Identifier} = raw;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue