Beispiel #1
0
        public void got_half_optional_text_in_first_send()
        {
            int breakPoint = 17;
            var buffer     = new byte[]
            {
                3,                                          //major
                1,                                          //minor
                0,                                          //flags
                4,                                          //id length
                (byte)'d', (byte)'a', (byte)'y', (byte)'1', //id
                0, 4,                                       //optional len (network byte order)
                (byte)'j', (byte)'s', (byte)'o', (byte)'1', //optional,
                0, 4,                                       //optional len (network byte order)
                (byte)'j', (byte)'s', (byte)'o', (byte)'n', //optional,
            };
            var offset = 0;
            var count1 = breakPoint;
            var count2 = buffer.Length - breakPoint;

            var sut = new HandshakeFrame();

            sut.Read(buffer, ref offset, ref count1);
            sut.Read(buffer, ref breakPoint, ref count2);

            sut.OptionalExtensions[0].Name.Should().Be("json");
        }
Beispiel #2
0
        public void got_only_major_in_first_send()
        {
            var buffer = new byte[]
            {
                3,                                          //major
                1,                                          //minor
                0,                                          //flags
                4,                                          //id length
                (byte)'d', (byte)'a', (byte)'y', (byte)'1', //id
                0, 4,                                       //optional len (network byte order)
                (byte)'j', (byte)'s', (byte)'o', (byte)'1', //optional,
                0, 4,                                       //optional len (network byte order)
                (byte)'j', (byte)'s', (byte)'o', (byte)'n', //optional,
            };
            var offset = 0;
            var count  = 1;

            var sut     = new HandshakeFrame();
            var actual1 = sut.Read(buffer, ref offset, ref count);

            count = buffer.Length - 1;
            var actual2 = sut.Read(buffer, ref offset, ref count);

            actual1.Should().Be(false);
            actual2.Should().Be(true);
            sut.OptionalExtensions[0].Name.Should().Be("json");
        }
Beispiel #3
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);
        }
Beispiel #4
0
        public void got_required_but_no_optional()
        {
            var buffer = new byte[]
            {
                3,                                          //major
                1,                                          //minor
                0,                                          //flags
                4,                                          //id length
                (byte)'d', (byte)'a', (byte)'y', (byte)'1', //id
                0, 4,                                       //required len (network byte order)
                (byte)'j', (byte)'s', (byte)'o', (byte)'n', //required,
                0, 0                                        //optional length
            };
            var offset = 0;
            var count  = buffer.Length;

            var sut    = new HandshakeFrame();
            var actual = sut.Read(buffer, ref offset, ref count);

            actual.Should().Be(true);
            sut.Flags.Should().Be(0);
            sut.Identity.Should().Be("day1");
            sut.RequiredExtensions[0].Name.Should().Be("json");
            sut.OptionalExtensions.Should().BeEmpty();
        }
Beispiel #5
0
        public void frame_with_extension_properties_can_be_codec()
        {
            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 Dictionary <string, string> {
                    { "Key", "Value" }
                }), new HandshakeExtension("ack") };
            sut.RequiredExtensions = new[] { new HandshakeExtension("dotnet") };
            sut.VersionMajor       = 1;
            sut.Write(context);
            sut.ResetWrite(context);

            var offset       = buffer.Offset;
            var receiveFrame = new HandshakeFrame();
            var len          = context.GetPackets()[0].Count;

            receiveFrame.Read(buffer.Array, ref offset, ref len);

            receiveFrame.OptionalExtensions[0].Properties["Key"].Should().Be("Value");
        }
Beispiel #6
0
        public void send_a_frame()
        {
            var service        = Substitute.For <IExtensionService>();
            var mgr            = new BufferManager(100, 10);
            var isDisconnected = false;

            using (var helper = new ClientServerHelper()) // wrap for cleanup
            {
                var sut = new SharpMessaging.Connection.Connection("adam", service, true, mgr);
                sut.Disconnected += (o, error) => isDisconnected = true;
                sut.Assign(helper.Server);
                sut.Send(new HandshakeFrame()
                {
                    Identity = "A"
                });
                Thread.Sleep(100);

                byte[] buffer    = new byte[65535];
                var    bytesRead = helper.Client.Receive(buffer, SocketFlags.None);
                var    frame     = new HandshakeFrame();
                var    offset    = 0;
                int    len       = bytesRead;
                frame.Read(buffer, ref offset, ref len);
                frame.Identity.Should().Be("A");
            }
        }
        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;
                }
            }
        }