-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHttp10ServerEncoderSpec.cs
More file actions
109 lines (91 loc) · 3.88 KB
/
Copy pathHttp10ServerEncoderSpec.cs
File metadata and controls
109 lines (91 loc) · 3.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
using System.Text;
using Akka.TestKit.Xunit;
using GaudiHTTP.Protocol.Syntax.Http10.Options;
using GaudiHTTP.Protocol.Syntax.Http10.Server;
using GaudiHTTP.Tests.Shared;
namespace GaudiHTTP.Tests.Protocol.Syntax.Http10.Server;
public sealed class Http10ServerEncoderSpec() : TestKit(CiQuietConfig.Instance)
{
private static Http10ServerEncoderOptions DefaultEncoderOptions() => new()
{
WriteDateHeader = true,
MaxHeaderBytes = 32 * 1024,
};
private static Http10ServerEncoder MakeEncoder(bool withDate = true) =>
new(DefaultEncoderOptions() with { WriteDateHeader = withDate });
[Fact(Timeout = 5000)]
[Trait("RFC", "RFC1945-6")]
public void Encode_should_always_return_zero()
{
var probe = CreateTestProbe();
var ctx = ServerTestContext.CreateResponse();
var buf = new byte[256];
var written = MakeEncoder(withDate: false).Encode(buf, ctx, probe.Ref);
Assert.Equal(0, written);
}
[Fact(Timeout = 5000)]
[Trait("RFC", "RFC1945-6")]
public void EncodeDeferred_should_emit_status_line_and_body()
{
var ctx = ServerTestContext.CreateResponse();
var body = "hi"u8.ToArray();
var buf = new byte[256];
var written = MakeEncoder(withDate: false).EncodeDeferred(buf, ctx, body);
var text = Encoding.ASCII.GetString(buf, 0, written);
Assert.StartsWith("HTTP/1.0 200 OK\r\n", text);
Assert.Contains("Content-Length: 2\r\n", text);
Assert.EndsWith("hi", text);
}
[Fact(Timeout = 5000)]
[Trait("RFC", "RFC9110-6.6.1")]
public void EncodeDeferred_should_inject_Date_when_WriteDateHeader_true()
{
var ctx = ServerTestContext.CreateResponse();
var buf = new byte[256];
var written = MakeEncoder(withDate: true).EncodeDeferred(buf, ctx, ReadOnlySpan<byte>.Empty);
Assert.Contains("Date: ", Encoding.ASCII.GetString(buf, 0, written));
}
[Fact(Timeout = 5000)]
public void EncodeDeferred_should_omit_Date_when_WriteDateHeader_false()
{
var ctx = ServerTestContext.CreateResponse();
var buf = new byte[256];
var written = MakeEncoder(withDate: false).EncodeDeferred(buf, ctx, ReadOnlySpan<byte>.Empty);
Assert.DoesNotContain("Date:", Encoding.ASCII.GetString(buf, 0, written));
}
[Fact(Timeout = 5000)]
[Trait("RFC", "RFC1945-7.2")]
public void EncodeDeferred_should_include_content_length_zero_for_empty_200()
{
var ctx = ServerTestContext.CreateResponse();
var buf = new byte[256];
var written = MakeEncoder(withDate: false).EncodeDeferred(buf, ctx, ReadOnlySpan<byte>.Empty);
var text = Encoding.ASCII.GetString(buf, 0, written);
Assert.Contains("Content-Length: 0", text);
}
[Fact(Timeout = 5000)]
[Trait("RFC", "RFC1945-3.3")]
public void EncodeDeferred_should_use_rfc1123_date_format_in_gmt()
{
var ctx = ServerTestContext.CreateResponse();
var buf = new byte[256];
var written = MakeEncoder(withDate: true).EncodeDeferred(buf, ctx, ReadOnlySpan<byte>.Empty);
var text = Encoding.ASCII.GetString(buf, 0, written);
var dateIdx = text.IndexOf("Date: ", StringComparison.Ordinal);
Assert.True(dateIdx >= 0);
var dateEnd = text.IndexOf("\r\n", dateIdx, StringComparison.Ordinal);
var dateValue = text[(dateIdx + 6)..dateEnd];
Assert.EndsWith("GMT", dateValue);
Assert.Contains(",", dateValue);
}
[Fact(Timeout = 5000)]
[Trait("RFC", "RFC1945-10.6")]
public void EncodeDeferred_should_include_date_header_by_default()
{
var ctx = ServerTestContext.CreateResponse();
var buf = new byte[256];
var written = MakeEncoder(withDate: true).EncodeDeferred(buf, ctx, ReadOnlySpan<byte>.Empty);
var text = Encoding.ASCII.GetString(buf, 0, written);
Assert.Contains("Date:", text);
}
}