Add test for ensuring HPACK lowercase header names
- ensure lowercase mask only applied to uppercase letters
This commit is contained in:
parent
126122fa0e
commit
423d5432be
|
|
@ -141,7 +141,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2.HPack
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer[i++] = (byte)(s[j] | (lowercase ? toLowerMask : 0));
|
buffer[i++] = (byte)(s[j] | (lowercase && s[j] >= (byte)'A' && s[j] <= (byte)'Z' ? toLowerMask : 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
length = i;
|
length = i;
|
||||||
|
|
|
||||||
|
|
@ -10,37 +10,96 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
|
||||||
{
|
{
|
||||||
public class HPackEncoderTests
|
public class HPackEncoderTests
|
||||||
{
|
{
|
||||||
[Fact]
|
public static TheoryData<KeyValuePair<string, string>[], byte[], int?> SinglePayloadData
|
||||||
public void EncodesHeadersInSinglePayloadWhenSpaceAvailable()
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
var data = new TheoryData<KeyValuePair<string, string>[], byte[], int?>();
|
||||||
|
|
||||||
|
// Lowercase header name letters only
|
||||||
|
data.Add(
|
||||||
|
new[]
|
||||||
|
{
|
||||||
|
new KeyValuePair<string, string>("CustomHeader", "CustomValue"),
|
||||||
|
},
|
||||||
|
new byte[]
|
||||||
|
{
|
||||||
|
// 0 12 c u s t o m
|
||||||
|
0x00, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d,
|
||||||
|
// h e a d e r 11 C
|
||||||
|
0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x0b, 0x43,
|
||||||
|
// u s t o m V a l
|
||||||
|
0x75, 0x73, 0x74, 0x6f, 0x6d, 0x56, 0x61, 0x6c,
|
||||||
|
// u e
|
||||||
|
0x75, 0x65
|
||||||
|
},
|
||||||
|
null);
|
||||||
|
// Lowercase header name letters only
|
||||||
|
data.Add(
|
||||||
|
new[]
|
||||||
|
{
|
||||||
|
new KeyValuePair<string, string>("CustomHeader!#$%&'*+-.^_`|~", "CustomValue"),
|
||||||
|
},
|
||||||
|
new byte[]
|
||||||
|
{
|
||||||
|
// 0 27 c u s t o m
|
||||||
|
0x00, 0x1b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d,
|
||||||
|
// h e a d e r ! #
|
||||||
|
0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x21, 0x23,
|
||||||
|
// $ % & ' * + - .
|
||||||
|
0x24, 0x25, 0x26, 0x27, 0x2a, 0x2b, 0x2d, 0x2e,
|
||||||
|
// ^ _ ` | ~ 11 C u
|
||||||
|
0x5e, 0x5f, 0x60, 0x7c, 0x7e, 0x0b, 0x43, 0x75,
|
||||||
|
// s t o m V a l u
|
||||||
|
0x73, 0x74, 0x6f, 0x6d, 0x56, 0x61, 0x6c, 0x75,
|
||||||
|
// e
|
||||||
|
0x65
|
||||||
|
},
|
||||||
|
null);
|
||||||
|
// Single Payload
|
||||||
|
data.Add(
|
||||||
|
new[]
|
||||||
|
{
|
||||||
|
new KeyValuePair<string, string>("date", "Mon, 24 Jul 2017 19:22:30 GMT"),
|
||||||
|
new KeyValuePair<string, string>("content-type", "text/html; charset=utf-8"),
|
||||||
|
new KeyValuePair<string, string>("server", "Kestrel")
|
||||||
|
},
|
||||||
|
new byte[]
|
||||||
|
{
|
||||||
|
0x88, 0x00, 0x04, 0x64, 0x61, 0x74, 0x65, 0x1d,
|
||||||
|
0x4d, 0x6f, 0x6e, 0x2c, 0x20, 0x32, 0x34, 0x20,
|
||||||
|
0x4a, 0x75, 0x6c, 0x20, 0x32, 0x30, 0x31, 0x37,
|
||||||
|
0x20, 0x31, 0x39, 0x3a, 0x32, 0x32, 0x3a, 0x33,
|
||||||
|
0x30, 0x20, 0x47, 0x4d, 0x54, 0x00, 0x0c, 0x63,
|
||||||
|
0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74,
|
||||||
|
0x79, 0x70, 0x65, 0x18, 0x74, 0x65, 0x78, 0x74,
|
||||||
|
0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, 0x20, 0x63,
|
||||||
|
0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x75,
|
||||||
|
0x74, 0x66, 0x2d, 0x38, 0x00, 0x06, 0x73, 0x65,
|
||||||
|
0x72, 0x76, 0x65, 0x72, 0x07, 0x4b, 0x65, 0x73,
|
||||||
|
0x74, 0x72, 0x65, 0x6c
|
||||||
|
},
|
||||||
|
200);
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Theory]
|
||||||
|
[MemberData(nameof(SinglePayloadData))]
|
||||||
|
public void EncodesHeadersInSinglePayloadWhenSpaceAvailable(KeyValuePair<string, string>[] headers, byte[] expectedPayload, int? statusCode)
|
||||||
{
|
{
|
||||||
var encoder = new HPackEncoder();
|
var encoder = new HPackEncoder();
|
||||||
|
|
||||||
var statusCode = 200;
|
|
||||||
var headers = new []
|
|
||||||
{
|
|
||||||
new KeyValuePair<string, string>("date", "Mon, 24 Jul 2017 19:22:30 GMT"),
|
|
||||||
new KeyValuePair<string, string>("content-type", "text/html; charset=utf-8"),
|
|
||||||
new KeyValuePair<string, string>("server", "Kestrel")
|
|
||||||
};
|
|
||||||
|
|
||||||
var expectedPayload = new byte[]
|
|
||||||
{
|
|
||||||
0x88, 0x00, 0x04, 0x64, 0x61, 0x74, 0x65, 0x1d,
|
|
||||||
0x4d, 0x6f, 0x6e, 0x2c, 0x20, 0x32, 0x34, 0x20,
|
|
||||||
0x4a, 0x75, 0x6c, 0x20, 0x32, 0x30, 0x31, 0x37,
|
|
||||||
0x20, 0x31, 0x39, 0x3a, 0x32, 0x32, 0x3a, 0x33,
|
|
||||||
0x30, 0x20, 0x47, 0x4d, 0x54, 0x00, 0x0c, 0x63,
|
|
||||||
0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74,
|
|
||||||
0x79, 0x70, 0x65, 0x18, 0x74, 0x65, 0x78, 0x74,
|
|
||||||
0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, 0x20, 0x63,
|
|
||||||
0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x75,
|
|
||||||
0x74, 0x66, 0x2d, 0x38, 0x00, 0x06, 0x73, 0x65,
|
|
||||||
0x72, 0x76, 0x65, 0x72, 0x07, 0x4b, 0x65, 0x73,
|
|
||||||
0x74, 0x72, 0x65, 0x6c
|
|
||||||
};
|
|
||||||
|
|
||||||
var payload = new byte[1024];
|
var payload = new byte[1024];
|
||||||
Assert.True(encoder.BeginEncode(statusCode, headers, payload, out var length));
|
var length = 0;
|
||||||
|
if (statusCode.HasValue)
|
||||||
|
{
|
||||||
|
Assert.True(encoder.BeginEncode(statusCode.Value, headers, payload, out length));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Assert.True(encoder.BeginEncode(headers, payload, out length));
|
||||||
|
}
|
||||||
Assert.Equal(expectedPayload.Length, length);
|
Assert.Equal(expectedPayload.Length, length);
|
||||||
|
|
||||||
for (var i = 0; i < length; i++)
|
for (var i = 0; i < length; i++)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue