public void Decode(HTTP2Stream context, Stream stream, List <KeyValuePair <string, string> > to) { int headerType = stream.ReadByte(); while (headerType != -1) { byte firstDataByte = (byte)headerType; // https://http2.github.io/http2-spec/compression.html#indexed.header.representation if (BufferHelper.ReadBit(firstDataByte, 0) == 1) { var header = ReadIndexedHeader(firstDataByte, stream); if (HTTPManager.Logger.Level <= Logger.Loglevels.Information) { HTTPManager.Logger.Information("HPACKEncoder", string.Format("[{0}] Decode - IndexedHeader: {1}", context.Id, header.ToString())); } to.Add(header); } else if (BufferHelper.ReadValue(firstDataByte, 0, 1) == 1) { // https://http2.github.io/http2-spec/compression.html#literal.header.with.incremental.indexing if (BufferHelper.ReadValue(firstDataByte, 2, 7) == 0) { // Literal Header Field with Incremental Indexing — New Name var header = ReadLiteralHeaderFieldWithIncrementalIndexing_NewName(firstDataByte, stream); if (HTTPManager.Logger.Level <= Logger.Loglevels.Information) { HTTPManager.Logger.Information("HPACKEncoder", string.Format("[{0}] Decode - LiteralHeaderFieldWithIncrementalIndexing_NewName: {1}", context.Id, header.ToString())); } this.responseTable.Add(header); to.Add(header); } else { // Literal Header Field with Incremental Indexing — Indexed Name var header = ReadLiteralHeaderFieldWithIncrementalIndexing_IndexedName(firstDataByte, stream); if (HTTPManager.Logger.Level <= Logger.Loglevels.Information) { HTTPManager.Logger.Information("HPACKEncoder", string.Format("[{0}] Decode - LiteralHeaderFieldWithIncrementalIndexing_IndexedName: {1}", context.Id, header.ToString())); } this.responseTable.Add(header); to.Add(header); } } else if (BufferHelper.ReadValue(firstDataByte, 0, 3) == 0) { // https://http2.github.io/http2-spec/compression.html#literal.header.without.indexing if (BufferHelper.ReadValue(firstDataByte, 4, 7) == 0) { // Literal Header Field without Indexing — New Name var header = ReadLiteralHeaderFieldwithoutIndexing_NewName(firstDataByte, stream); if (HTTPManager.Logger.Level <= Logger.Loglevels.Information) { HTTPManager.Logger.Information("HPACKEncoder", string.Format("[{0}] Decode - LiteralHeaderFieldwithoutIndexing_NewName: {1}", context.Id, header.ToString())); } to.Add(header); } else { // Literal Header Field without Indexing — Indexed Name var header = ReadLiteralHeaderFieldwithoutIndexing_IndexedName(firstDataByte, stream); if (HTTPManager.Logger.Level <= Logger.Loglevels.Information) { HTTPManager.Logger.Information("HPACKEncoder", string.Format("[{0}] Decode - LiteralHeaderFieldwithoutIndexing_IndexedName: {1}", context.Id, header.ToString())); } to.Add(header); } } else if (BufferHelper.ReadValue(firstDataByte, 0, 3) == 1) { // https://http2.github.io/http2-spec/compression.html#literal.header.never.indexed if (BufferHelper.ReadValue(firstDataByte, 4, 7) == 0) { // Literal Header Field Never Indexed — New Name var header = ReadLiteralHeaderFieldNeverIndexed_NewName(firstDataByte, stream); if (HTTPManager.Logger.Level <= Logger.Loglevels.Information) { HTTPManager.Logger.Information("HPACKEncoder", string.Format("[{0}] Decode - LiteralHeaderFieldNeverIndexed_NewName: {1}", context.Id, header.ToString())); } to.Add(header); } else { // Literal Header Field Never Indexed — Indexed Name var header = ReadLiteralHeaderFieldNeverIndexed_IndexedName(firstDataByte, stream); if (HTTPManager.Logger.Level <= Logger.Loglevels.Information) { HTTPManager.Logger.Information("HPACKEncoder", string.Format("[{0}] Decode - LiteralHeaderFieldNeverIndexed_IndexedName: {1}", context.Id, header.ToString())); } to.Add(header); } } else if (BufferHelper.ReadValue(firstDataByte, 0, 2) == 1) { // https://http2.github.io/http2-spec/compression.html#encoding.context.update UInt32 newMaxSize = DecodeInteger(5, firstDataByte, stream); if (HTTPManager.Logger.Level <= Logger.Loglevels.Information) { HTTPManager.Logger.Information("HPACKEncoder", string.Format("[{0}] Decode - Dynamic Table Size Update: {1}", context.Id, newMaxSize)); } //this.settingsRegistry[HTTP2Settings.HEADER_TABLE_SIZE] = (UInt16)newMaxSize; this.responseTable.MaxDynamicTableSize = (UInt16)newMaxSize; } else { // ERROR } headerType = stream.ReadByte(); } }