public DraftHybi10DataReader() { m_Frame = new WebSocketDataFrame(new ArraySegmentList()); m_PartReader = DataFramePartReader.NewReader; }
public WebSocketCommandInfo GetCommandInfo(byte[] readBuffer, int offset, int length, out int left) { this.AddArraySegment(m_Frame.InnerData, readBuffer, offset, length, true); IDataFramePartReader nextPartReader; int thisLength = m_PartReader.Process(m_LastPartLength, m_Frame, out nextPartReader); if (thisLength < 0) { left = 0; return(null); } else { left = thisLength; if (left > 0) { m_Frame.InnerData.TrimEnd(left); } //Means this part reader is the last one if (nextPartReader == null) { WebSocketCommandInfo commandInfo; if (m_Frame.FIN) { if (m_PreviousFrames != null && m_PreviousFrames.Count > 0) { m_PreviousFrames.Add(m_Frame); m_Frame = new WebSocketDataFrame(new ArraySegmentList()); commandInfo = new WebSocketCommandInfo(m_PreviousFrames); m_PreviousFrames = null; } else { commandInfo = new WebSocketCommandInfo(m_Frame); m_Frame.Clear(); } } else { if (m_PreviousFrames == null) { m_PreviousFrames = new List <WebSocketDataFrame>(); } m_PreviousFrames.Add(m_Frame); m_Frame = new WebSocketDataFrame(new ArraySegmentList()); commandInfo = null; } //BufferSegments.ClearSegements(); m_LastPartLength = 0; m_PartReader = DataFramePartReader.NewReader; return(commandInfo); } else { m_LastPartLength = m_Frame.InnerData.Count - thisLength; m_PartReader = nextPartReader; return(null); } } }
/// <summary> /// Initializes a new instance of the <see cref="WebSocketCommandInfo"/> class. /// </summary> /// <param name="frame">The frame.</param> /// <param name="left">The left.</param> public WebSocketCommandInfo(WebSocketDataFrame frame) { Key = frame.OpCode.ToString(); int length = (int)frame.ActualPayloadLength; int offset = frame.InnerData.Count - (int)frame.ActualPayloadLength; if (frame.HasMask && length > 0) { frame.InnerData.DecodeMask(frame.MaskKey, offset, length); } if (frame.OpCode == OpCode.Close) { if (length >= 2) { var closeStatusCode = frame.InnerData.ToArrayData(offset, 2); CloseStatusCode = closeStatusCode[0] * 256 + closeStatusCode[1]; if (length > 2) { Text = frame.InnerData.Decode(Encoding.UTF8, offset + 2, length - 2); } else { Text = string.Empty; } return; } } if (frame.OpCode != 2) { if (length > 0) Text = frame.InnerData.Decode(Encoding.UTF8, offset, length); else Text = string.Empty; } else { if (length > 0) Data = frame.InnerData.ToArrayData(offset, length); else Data = new byte[0]; } }