/// <summary> /// Handles incoming raw frames and translates them into WebSocketFrame(s) /// </summary> /// <param name="channel"></param> /// <param name="request"></param> private void HandleIncomingFrames(ISockNetChannel channel, ref object data) { if (!(data is ChunkedBuffer)) { return; } ChunkedBuffer stream = (ChunkedBuffer)data; long startingPosition = stream.ReadPosition; try { WebSocketFrame frame = WebSocketFrame.ParseFrame(stream.Stream); if (combineContinuations) { if (frame.IsFinished) { UpdateContinuation(ref continuationFrame, frame); data = continuationFrame; continuationFrame = null; } else { UpdateContinuation(ref continuationFrame, frame); } } else { data = frame; } if (SockNetLogger.DebugEnabled) { SockNetLogger.Log(SockNetLogger.LogLevel.DEBUG, this, "Received WebSocket message. Size: {0}, Type: {1}, IsFinished: {2}", frame.Data.Length, Enum.GetName(typeof(WebSocketFrame.WebSocketFrameOperation), frame.Operation), frame.IsFinished); } } catch (EndOfStreamException) { // websocket frame isn't done stream.ReadPosition = startingPosition; } catch (ArgumentOutOfRangeException) { // websocket frame isn't done stream.ReadPosition = startingPosition; } catch (Exception e) { SockNetLogger.Log(SockNetLogger.LogLevel.ERROR, this, "Unable to parse web-socket request", e); channel.Close(); } }
public void TestTextFrameMasking() { WebSocketFrame frame = WebSocketFrame.CreateTextFrame("this is some really great text!", true, false, true); MemoryStream stream = new MemoryStream(); frame.Write(stream, true); stream.Position = 0; WebSocketFrame readFrame = WebSocketFrame.ParseFrame(stream); Assert.AreEqual(frame.DataAsString, readFrame.DataAsString); }