Add test for ensuring HPACK lowercase header names

- ensure lowercase mask only applied to uppercase letters
This commit is contained in:
John Luo 2018-06-21 19:57:07 -07:00
parent 126122fa0e
commit 423d5432be
2 changed files with 88 additions and 29 deletions

View File

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

View File

@ -10,20 +10,61 @@ 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()
{ {
var encoder = new HPackEncoder(); get
{
var data = new TheoryData<KeyValuePair<string, string>[], byte[], int?>();
var statusCode = 200; // Lowercase header name letters only
var headers = new [] 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>("date", "Mon, 24 Jul 2017 19:22:30 GMT"),
new KeyValuePair<string, string>("content-type", "text/html; charset=utf-8"), new KeyValuePair<string, string>("content-type", "text/html; charset=utf-8"),
new KeyValuePair<string, string>("server", "Kestrel") new KeyValuePair<string, string>("server", "Kestrel")
}; },
new byte[]
var expectedPayload = new byte[]
{ {
0x88, 0x00, 0x04, 0x64, 0x61, 0x74, 0x65, 0x1d, 0x88, 0x00, 0x04, 0x64, 0x61, 0x74, 0x65, 0x1d,
0x4d, 0x6f, 0x6e, 0x2c, 0x20, 0x32, 0x34, 0x20, 0x4d, 0x6f, 0x6e, 0x2c, 0x20, 0x32, 0x34, 0x20,
@ -37,10 +78,28 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
0x74, 0x66, 0x2d, 0x38, 0x00, 0x06, 0x73, 0x65, 0x74, 0x66, 0x2d, 0x38, 0x00, 0x06, 0x73, 0x65,
0x72, 0x76, 0x65, 0x72, 0x07, 0x4b, 0x65, 0x73, 0x72, 0x76, 0x65, 0x72, 0x07, 0x4b, 0x65, 0x73,
0x74, 0x72, 0x65, 0x6c 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 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++)