private void ParseControlFrameHeaders(ref ControlFrame frame, byte[] data, int offset)
{
var headers = new byte[data.Length - offset];
Array.Copy(data, offset, headers, 0, headers.Length);
if (headers.Length > 0)
ProcessorRun(ref headers, DirectionProcessType.Inbound, frame.Flags);
int headersOffset = 0;
int numberOfKeyValue = BinaryHelper.Int32FromBytes(new ArraySegment<byte>(headers, headersOffset, 4));
headersOffset += 4;
for (int i = 0; i < numberOfKeyValue; ++i)
{
int nameLength = BinaryHelper.Int32FromBytes(new ArraySegment<byte>(headers, headersOffset, 4));
headersOffset += 4;
string name = Encoding.UTF8.GetString(headers, headersOffset, nameLength);
headersOffset += nameLength;
int valLength = BinaryHelper.Int32FromBytes(new ArraySegment<byte>(headers, headersOffset, 4));
headersOffset += 4;
string val = Encoding.UTF8.GetString(headers, headersOffset, valLength);
headersOffset += valLength;
// Ensure no duplicates.
if (frame.Headers.ContainsKey(name))
{
throw new ProtocolExeption(StatusCode.InternalError);
}
frame.Headers.Add(name, val);
}
}