/// <summary>
 /// Process Protocol Data frame.
 /// </summary>
 /// <param name="frame">The data frame.</param>
 private void ProcessDataFrame(DataFrame frame)
 {
     if (this.OnStreamFrame != null)
     {
         Http2Stream stream = this.streamsStore.GetStreamById(frame.StreamId);
         if (stream == null)
         {
             this.SendRST(frame.StreamId, StatusCode.InvalidStream);
         }
         else
         {
             if (stream.Session.IsFlowControlEnabled)
             {
                 //TODO: incomment this when server will be able to handle window update
                 //if (stream.CurrentWindowBalanceFromServer <= 0)
                     // this.SendWindowUpdate(stream, stream.Session.CurrentWindowBalanceToServer);
                 //stream.UpdateWindowBalance(-frame.Data.Length);
             }
             receivedDataBuffer.AddRange(frame.Data);
             if (frame.IsFinal && this.OnStreamFrame != null)
             {
                  this.OnStreamFrame(this, new StreamDataEventArgs(stream, new ProtocolData(receivedDataBuffer.ToArray()), frame.IsFinal));
                 this.receivedDataBuffer.Clear();
             }
         }
     }
 }
        /// <summary>
        /// Serializes the data frame.
        /// </summary>
        /// <param name="frame">The frame.</param>
        /// <returns>Binary representation of the frame.</returns>
        private static byte[] SerializeDataFrame(DataFrame frame)
        {
            var data = new byte[8 + frame.Length];
            BinaryHelper.Int32ToBytes(frame.StreamId, new ArraySegment<byte>(data, 0, 4));
            data[4] = Convert.ToByte(frame.Flags | (frame.IsFinal ? 0x01 : 0x00));
            BinaryHelper.Int32ToBytes(frame.Length, new ArraySegment<byte>(data, 5, 3));
            Buffer.BlockCopy(frame.Data, 0, data, 8, frame.Length);

            return data;
        }
        /// <summary>
        /// Deserialize Http2 data frame
        /// </summary>
        /// <param name="frameData">The data.</param>
        /// <returns>Deserialized frame.</returns>
        private static BaseFrame DeserializeDataFrame(byte[] frameData)
        {
            var data = frameData;

            var frame = new DataFrame();
            ParseDataFrameHeader(ref frame, data);
            frame.Length = data.Length - 8;
            frame.Data = new byte[frame.Length];
            Buffer.BlockCopy(data, 8, frame.Data, 0, frame.Length);

            return frame;
        }
 /// <summary>
 /// Parses HTTP header of Http2 data frame.
 /// </summary>
 /// <param name="frame">The frame.</param>
 /// <param name="data">The data.</param>
 private static void ParseDataFrameHeader(ref DataFrame frame, byte[] data)
 {
     frame.StreamId = BinaryHelper.Int32FromBytes(new ArraySegment<byte>(data, 0, 4), 0);
     frame.Flags = data[4];
     frame.IsFinal = (frame.Flags & 0x01) != 0;
 }
 /// <summary>
 /// Builds the data frame.
 /// </summary>
 /// <param name="streamId">The stream id.</param>
 /// <param name="data">The data.</param>
 /// <returns>Returns DataFrame.</returns>
 public DataFrame BuildDataFrame(int streamId, ProtocolData data)
 {
     DataFrame frame = new DataFrame { Data = data.Data, StreamId = streamId, Length = data.Data.Length };
     return frame;
 }