- commit
- 742ef42
- parent
- 3f2ac92
- author
- CheddarCrisp
- date
- 2024-01-10 01:59:06 +0100 CET
Implement encoder
1 files changed,
+29,
-1
+29,
-1
1@@ -11,6 +11,34 @@ public class Codec : ICodec {
2 }
3
4 public byte[] Encode(Document document) {
5- return document.Data;
6+ var dataLength = document.Data.Length;
7+ var contentLength = new Dictionary<string, string> () {
8+ { "content-length", dataLength.ToString() }
9+ };
10+ var headers = document.Metadata.Union(contentLength);
11+
12+ var packedHeaders = packHeaders(headers);
13+ var headerLength = Convert.ToUInt16(packedHeaders.Length);
14+
15+ using var output = new MemoryStream();
16+ output.WriteByte(0x01);
17+ output.Write(BitConverter.GetBytes(headerLength));
18+ output.Write(packedHeaders);
19+ output.Write(document.Data);
20+
21+ return output.ToArray();
22+ }
23+
24+ private byte[] packHeaders(IEnumerable<KeyValuePair<string, string>> headers) {
25+ var encoder = new hpack.Encoder(0); //0 will disable dynamic table that we don't need anyways
26+
27+ using var output = new MemoryStream();
28+ using var writer = new BinaryWriter(output);
29+
30+ foreach(var (name, value) in headers) {
31+ encoder.EncodeHeader(writer, name, value);
32+ }
33+
34+ return output.ToArray();
35 }
36 }