private byte[] SerializeControlFrame(ControlFrame frame)
{
var byteList = new List<byte>();
byteList.Add((byte)(((frame.Version & 0xFF00) >> 8) | 0x80));
byteList.Add((byte)(frame.Version & 0x00FF));
byteList.Add((byte)(((Int16)frame.Type & 0xFF00) >> 8));
byteList.Add((byte)((Int16)frame.Type & 0x00FF));
var headersArray = new byte[0];
switch (frame.Type)
{
case FrameType.SynStream:
byteList.Add(Convert.ToByte(frame.Flags | (frame.IsFinal ? 0x01 : 0x00)));
headersArray = SerializeControlFrameHeaders(frame.Headers);
if (headersArray.Length > 0)
{
ProcessorRun(ref headersArray, DirectionProcessType.Outbound, frame.Flags);
}
byteList.AddRange(BinaryHelper.Int32ToBytes(headersArray.Length + 10, 3));
byteList.AddRange(BinaryHelper.Int32ToBytes(frame.StreamId));
byteList.AddRange(BinaryHelper.Int32ToBytes(0));
byteList.Add(Convert.ToByte(frame.Priority >> 5));
byteList.Add(Unused);
break;
case FrameType.RTS:
byteList.Add(0);
byteList.AddRange(BinaryHelper.Int32ToBytes(headersArray.Length + 8, 3));
byteList.AddRange(BinaryHelper.Int32ToBytes(frame.StreamId));
byteList.AddRange(BinaryHelper.Int32ToBytes((int)frame.StatusCode));
break;
case FrameType.SynReply:
byteList.Add(frame.Flags);
headersArray = SerializeControlFrameHeaders(frame.Headers);
if (headersArray.Length > 0)
{
ProcessorRun(ref headersArray, DirectionProcessType.Outbound, frame.Flags);
}
byteList.AddRange(BinaryHelper.Int32ToBytes(headersArray.Length + 4, 3));
byteList.AddRange(BinaryHelper.Int32ToBytes(frame.StreamId));
break;
case FrameType.GoAway:
byteList.Add(frame.Flags);
byteList.AddRange(BinaryHelper.Int32ToBytes(frame.Length,3));
byteList.AddRange(BinaryHelper.Int32ToBytes(frame.StreamId));
byteList.AddRange(BinaryHelper.Int32ToBytes((int)frame.StatusCode));
break;
case FrameType.Ping:
byteList.Add(frame.Flags);
byteList.AddRange(BinaryHelper.Int32ToBytes(frame.Length,3));
byteList.AddRange(BinaryHelper.Int32ToBytes(frame.StreamId));
break;
case FrameType.WindowUpdate:
byteList.Add(frame.Flags);
byteList.AddRange(BinaryHelper.Int32ToBytes(frame.Length,3));
byteList.AddRange(BinaryHelper.Int32ToBytes(frame.StreamId));
byteList.AddRange(BinaryHelper.Int64ToBytes(((WindowUpdateFrame)frame).DeltaWindowSize));
break;
case FrameType.Settings:
byteList.Add(frame.Flags);
byteList.AddRange(BinaryHelper.Int32ToBytes(frame.Length,3));
byteList.AddRange(BinaryHelper.Int32ToBytes(frame.NumberOfEntries));
break;
}
byteList.AddRange(headersArray);
return byteList.ToArray();
}