public static HTTP2FrameHeaderAndPayload CreateWindowUpdateFrame(UInt32 streamId, UInt32 windowSizeIncrement) { // https://httpwg.org/specs/rfc7540.html#WINDOW_UPDATE HTTP2FrameHeaderAndPayload frame = new HTTP2FrameHeaderAndPayload(); frame.Type = HTTP2FrameTypes.WINDOW_UPDATE; frame.Flags = 0; frame.StreamId = streamId; frame.Payload = BufferPool.Get(4, true); frame.PayloadLength = 4; BufferHelper.SetBit(0, 0, 0); BufferHelper.SetUInt31(frame.Payload, 0, windowSizeIncrement); return(frame); }
// This method encodes a string without huffman encoding private static void EncodeRawStringTo(string str, byte[] buffer, ref UInt32 offset) { uint requiredBytesForStr = (uint)System.Text.Encoding.UTF8.GetByteCount(str); int requiredBytesForLengthPrefix = RequiredBytesToEncodeInteger((UInt32)requiredBytesForStr, 7); UInt32 originalOffset = offset; buffer[offset] = 0; EncodeInteger(requiredBytesForStr, 7, buffer, ref offset); // Zero out the huffman flag buffer[originalOffset] = BufferHelper.SetBit(buffer[originalOffset], 0, false); if (offset != originalOffset + requiredBytesForLengthPrefix) { throw new Exception(string.Format("offset({0}) != originalOffset({1}) + requiredBytesForLengthPrefix({1})", offset, originalOffset, requiredBytesForLengthPrefix)); } System.Text.Encoding.UTF8.GetBytes(str, 0, str.Length, buffer, (int)offset); offset += requiredBytesForStr; }
private static void AddCodePointToBuffer(HuffmanEncoder.TableEntry code, byte[] buffer, ref UInt32 offset, ref byte bufferBitIdx, bool finishOnBoundary = false) { for (byte codeBitIdx = 1; codeBitIdx <= code.Bits; ++codeBitIdx) { byte bit = code.GetBitAtIdx(codeBitIdx); buffer[offset] = BufferHelper.SetBit(buffer[offset], bufferBitIdx, bit); // octet boundary reached, proceed to the next octet if (++bufferBitIdx == 8) { if (++offset < buffer.Length) { buffer[offset] = 0; } if (finishOnBoundary) { return; } bufferBitIdx = 0; } } }