From 742ef421dc7eb1db2fd0693fe8efb17642e7d67c Mon Sep 17 00:00:00 2001 From: CheddarCrisp Date: Tue, 9 Jan 2024 19:59:06 -0500 Subject: [PATCH] Implement encoder --- SDBD.Codec/Codec.cs | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/SDBD.Codec/Codec.cs b/SDBD.Codec/Codec.cs index b03b0de..a9593c7 100644 --- a/SDBD.Codec/Codec.cs +++ b/SDBD.Codec/Codec.cs @@ -11,6 +11,34 @@ public class Codec : ICodec { } public byte[] Encode(Document document) { - return document.Data; + var dataLength = document.Data.Length; + var contentLength = new Dictionary () { + { "content-length", dataLength.ToString() } + }; + var headers = document.Metadata.Union(contentLength); + + var packedHeaders = packHeaders(headers); + var headerLength = Convert.ToUInt16(packedHeaders.Length); + + using var output = new MemoryStream(); + output.WriteByte(0x01); + output.Write(BitConverter.GetBytes(headerLength)); + output.Write(packedHeaders); + output.Write(document.Data); + + return output.ToArray(); + } + + private byte[] packHeaders(IEnumerable> headers) { + var encoder = new hpack.Encoder(0); //0 will disable dynamic table that we don't need anyways + + using var output = new MemoryStream(); + using var writer = new BinaryWriter(output); + + foreach(var (name, value) in headers) { + encoder.EncodeHeader(writer, name, value); + } + + return output.ToArray(); } }