Esempio n. 1
0
        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;
                }
            }
        }
Esempio n. 2
0
        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);
        }