Skip to content

Commit f14a666

Browse files
author
ladeak
committed
Status code encoding fix
1 parent af3d716 commit f14a666

3 files changed

Lines changed: 38 additions & 28 deletions

File tree

src/CHttpServer/CHttpServer/Http3/QPackEncoder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ internal void Encode(int statusCode, Http3ResponseHeaderCollection headers, Pipe
5050
if (_statusCodesEncoderTable.TryGetValue(statusCode, out var knownHeader))
5151
EncodeIndexedFieldLine(knownHeader, destinationWriter);
5252
else
53-
EncodeLiteralFieldWithLiteralValue(":status", statusCode.ToString(), destinationWriter);
53+
EncodeIndexedFieldWithLiteralValue(_statusCodesEncoderTable.First().Value, statusCode.ToString(), destinationWriter);
5454

5555
EncodeFieldLines(headers, destinationWriter);
5656
}

tests/CHttpServer.Tests/Http3/QPackDecoderTests.cs

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -274,32 +274,6 @@ public void Decode_Mix_DifferentHeaderOrder()
274274
Assert.Equal("longervalue", testHandler.Headers["longerheader"]);
275275
}
276276

277-
[Fact]
278-
public async Task EncodeStatusCode200()
279-
{
280-
var stream = new MemoryStream();
281-
var writer = new Http3FramingStreamWriter(stream, 1);
282-
var sut = new QPackDecoder();
283-
sut.Encode(200, new Http3ResponseHeaderCollection(), writer);
284-
await writer.FlushAsync(TestContext.Current.CancellationToken);
285-
286-
byte[] expected = [0, 0, 25 | 0b1100_000];
287-
expected.SequenceEqual(stream.ToArray());
288-
}
289-
290-
[Fact]
291-
public async Task EncodeStatusCode103()
292-
{
293-
var stream = new MemoryStream();
294-
var writer = new Http3FramingStreamWriter(stream, 1);
295-
var sut = new QPackDecoder();
296-
sut.Encode(200, new Http3ResponseHeaderCollection(), writer);
297-
await writer.FlushAsync(TestContext.Current.CancellationToken);
298-
299-
byte[] expected = [0, 0, 24 | 0b1100_000];
300-
expected.SequenceEqual(stream.ToArray());
301-
}
302-
303277
private class TestQPackHeaderHandler : IQPackHeaderHandler
304278
{
305279
internal Dictionary<string, string> Headers { get; } = new();

tests/CHttpServer.Tests/Http3/QPackEncoderTests.cs

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,31 @@ namespace CHttpServer.Tests.Http3;
66

77
public class QPackEncoderTests
88
{
9+
[Fact]
10+
public async Task EncodeStatusCode200()
11+
{
12+
var stream = new MemoryStream();
13+
var writer = new Http3FramingStreamWriter(stream, 1);
14+
var sut = new QPackDecoder();
15+
sut.Encode(200, new Http3ResponseHeaderCollection(), writer);
16+
await writer.FlushAsync(TestContext.Current.CancellationToken);
17+
18+
byte[] expected = [1, 3, 0, 0, 25 | 0b1100_0000];
19+
Assert.True(expected.SequenceEqual(stream.ToArray()));
20+
}
21+
22+
[Fact]
23+
public async Task EncodeStatusCode103()
24+
{
25+
var stream = new MemoryStream();
26+
var writer = new Http3FramingStreamWriter(stream, 2);
27+
var sut = new QPackDecoder();
28+
sut.Encode(103, new Http3ResponseHeaderCollection(), writer);
29+
await writer.FlushAsync(TestContext.Current.CancellationToken);
30+
byte[] expected = [2, 3, 0, 0, 24 | 0b1100_0000];
31+
Assert.True(expected.SequenceEqual(stream.ToArray()));
32+
}
33+
934
[Fact]
1035
public async Task EncodeLiteralFieldWithLiteralValue()
1136
{
@@ -62,7 +87,7 @@ public async Task EncodeIndexedFieldWithIndexedValue(byte index)
6287
}
6388

6489
[Fact]
65-
public async Task EncodeStatusCode()
90+
public async Task EncodeStatusCodeRaw200()
6691
{
6792
var stream = new MemoryStream();
6893
var pipe = PipeWriter.Create(stream);
@@ -72,6 +97,17 @@ public async Task EncodeStatusCode()
7297
Assert.True(stream.ToArray().SequenceEqual(new byte[] { 0x00, 0x00, 0xD9 }));
7398
}
7499

100+
[Fact]
101+
public async Task EncodeStatusCodeRaw8()
102+
{
103+
var stream = new MemoryStream();
104+
var pipe = PipeWriter.Create(stream);
105+
QPackDecoder sut = new();
106+
sut.Encode(8, [], pipe);
107+
await pipe.FlushAsync(TestContext.Current.CancellationToken);
108+
Assert.True(stream.ToArray().SequenceEqual(new byte[] { 0x00, 0x00, 0x7F, 0x37, 0x01, 0x38 }));
109+
}
110+
75111
[Fact]
76112
public async Task EncodeWithoutStatusCode()
77113
{

0 commit comments

Comments
 (0)