sdbd-demo.git

git clone https://git.crispbyte.dev/sdbd-demo.git

commit
742ef42
parent
3f2ac92
author
CheddarCrisp
date
2024-01-10 01:59:06 +0100 CET
Implement encoder
1 files changed,  +29, -1
M SDBD.Codec/Codec.cs
+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 }