private void ProcessReceivedBytes(byte[] buffer, int offset, int bytesTransferred) { while (bytesTransferred > 0) { if (!_handshakeCompleted) { var isCompleted = _handshakeFrame.Read(buffer, ref offset, ref bytesTransferred); if (!isCompleted) { return; } HandshakeReceived(this, new HandshakeFrameReceivedEventArgs(_handshakeFrame)); _handshakeFrame.ResetRead(); continue; } switch (_frameType) { case FrameType.Unknown: var flags = (FrameFlags)buffer[offset]; if ((flags & FrameFlags.ExtensionFrame) != 0) { _frameType = FrameType.Extension; } else if ((flags & FrameFlags.CommandFrame) != 0) { _frameType = FrameType.Command; } else { _frameType = FrameType.Message; } //do not increase offset, let the frame handle the flags. //only peek it to be able to switch state break; case FrameType.Message: var isCompleted = _inboundMessage.Read(buffer, ref offset, ref bytesTransferred); if (isCompleted) { MessageFrameReceived(_inboundMessage); _inboundMessage.ResetRead(); _frameType = FrameType.Unknown; } break; case FrameType.Extension: var isCompleted2 = _extensionFrameProcessor.Read(buffer, ref offset, ref bytesTransferred); if (isCompleted2) { _frameType = FrameType.Unknown; } break; } } }
public void frame_Should_be_able_to_parse_multiple_incoming_buffers_if_reseted_in_between() { var bufferManager = new BufferManager(8192, 1); var context = new WriterContext(bufferManager); var buffer = bufferManager.Dequeue(); bufferManager.Enqueue(buffer); var sut = new HandshakeFrame(); sut.Identity = "Client"; sut.OptionalExtensions = new[] { new HandshakeExtension("json"), new HandshakeExtension("ack") }; sut.RequiredExtensions = new[] { new HandshakeExtension("dotnet") }; sut.VersionMajor = 1; sut.Write(context); sut.ResetWrite(context); var offset = buffer.Offset; var len = context.GetPackets()[0].Count; sut.Read(buffer.Array, ref offset, ref len); sut.ResetRead(); offset = buffer.Offset; len = context.GetPackets()[0].Count; sut.Read(buffer.Array, ref offset, ref len); len.Should().Be(0); }