public void can_write_to_our_context()
        {
            var buffer = new byte[] {1, 2, 3, 4, 5, 6, 7};
            var mgr = new BufferManager(100, 10);
            var context = new WriterContext(mgr);

            var sut = new ByteBufferWriter(buffer, 0, buffer.Length);
            sut.Write(context);

            context.GetPackets()[0].Buffer.Should().BeSubsetOf(buffer);
        }
        public void can_do_partial_write()
        {
            var buffer = new byte[] { 1, 2, 3, 4, 5, 6, 7 };
            var mgr = new BufferManager(100, 10);
            var context = new WriterContext(mgr);
            context.BytesLeftToEnqueue = 4;

            var sut = new ByteBufferWriter(buffer, 0, buffer.Length);
            var actual = sut.Write(context);

            actual.Should().BeFalse();
        }
        public void partial_bytes_are_copied()
        {
            var buffer = new byte[] { 1, 2, 3, 4, 5, 6, 7 };
            var mgr = new BufferManager(100, 10);
            var context = new WriterContext(mgr);
            context.BytesLeftToEnqueue = 4;

            var sut = new ByteBufferWriter(buffer, 0, buffer.Length);
            sut.Write(context);

            context.GetPackets()[0].Buffer[3].Should().Be(4);
        }
        public void serialize_and_deserialize_should_be_compatible()
        {
            var mgr = new BufferManager(65535, 10);
            var ctx = new WriterContext(mgr);
            var msg1 =new SharpMessaging.Frames.ErrorFrame("Help!");
            msg1.Write(ctx);

            var buf = ctx.GetPackets()[0].Buffer;
            var offset = ctx.GetPackets()[0].Offset;
            var len = ctx.GetPackets()[0].Count;
            var msg2 = new SharpMessaging.Frames.ErrorFrame();
            msg2.Read(buf, ref offset, ref len);

            msg2.ErrorMessage.Should().Be("Help!");
        }
        public void can_continue_on_a_partial_write()
        {
            var buffer = new byte[] { 1, 2, 3, 4, 5, 6, 7 };
            var mgr = new BufferManager(100, 10);
            var context = new WriterContext(mgr);
            context.BytesLeftToEnqueue = 4;

            var sut = new ByteBufferWriter(buffer, 0, buffer.Length);
            context.BytesLeftToEnqueue = 4;
            sut.Write(context);
            context.BytesLeftToEnqueue = 10;
            var actual = sut.Write(context);

            actual.Should().BeTrue();
            var packet = context.GetPackets()[1];
            packet.Buffer[packet.Offset + 2].Should().Be(7);
        }
        public void code_decode_test()
        {
            var bufMgr = new BufferManager(65535, 1);
            var context = new WriterContext(bufMgr);
            var buf = bufMgr.Dequeue();
            bufMgr.Enqueue(buf);

            var sut = new MessageFrame();
            sut.SequenceNumber = 22;
            var payload = Encoding.UTF8.GetBytes("Hello world");
            sut.PayloadBuffer = new ArraySegment<byte>(payload, 0, payload.Length);
            sut.Write(context);

            var pos = 0;
            var len = context.GetPackets().First().Count;
            var frame2 = new MessageFrame();
            frame2.Read(buf.Array, ref pos, ref len);
            frame2.SequenceNumber.Should().Be(22);
            Encoding.ASCII.GetString(sut.PayloadBuffer.Array, 0, sut.PayloadBuffer.Count).Should().Be("Hello world");
        }
        public Connection(string identity, IExtensionService extensionRegistry, bool isServer,
                          BufferManager bufferManager)
        {
            _identity            = identity ?? "FastSocket v" + Major + "" + Minor;
            _readArgs            = new SocketAsyncEventArgs();
            _readArgs.Completed += OnReadCompleted;

            _writeArgs            = new SocketAsyncEventArgs();
            _writeArgs.Completed += OnWriteCompleted;
            //_writeArgs.SendPacketsFlags = TransmitFileOptions.UseKernelApc;

            _extensionFrameProcessor = new ExtensionFrameProcessor(extensionRegistry.CreateFrame, OnExtension);
            _writerContext           = new WriterContext(bufferManager);

            ExtensionFrameReceived = frame => { };
            HandshakeReceived      = (o, e) => { };
            MessageFrameReceived   = frame => { };
            WriteCompleted         = i => { };
            Disconnected           = (o, e) => { };
            Fault = (o, e) => { };
        }
        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");
        }
Example #9
0
        public Connection(string identity, IExtensionService extensionRegistry, bool isServer,
            BufferManager bufferManager)
        {
            _identity = identity ?? "FastSocket v" + Major + "" + Minor;
            _readArgs = new SocketAsyncEventArgs();
            _readArgs.Completed += OnReadCompleted;

            _writeArgs = new SocketAsyncEventArgs();
            _writeArgs.Completed += OnWriteCompleted;
            //_writeArgs.SendPacketsFlags = TransmitFileOptions.UseKernelApc;

            _extensionFrameProcessor = new ExtensionFrameProcessor(extensionRegistry.CreateFrame, OnExtension);
            _writerContext = new WriterContext(bufferManager);

            ExtensionFrameReceived = frame => { };
            HandshakeReceived = (o, e) => { };
            MessageFrameReceived = frame => { };
            WriteCompleted = i => { };
            Disconnected = (o, e) => { };
            Fault = (o, e) => { };
        }
        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);
        }
        /// <summary>
        /// </summary>
        /// <param name="e"></param>
        /// <param name="context">Used to enqueue bytes for delivery.</param>
        /// <returns><c>true</c> if more buffers can be appened.</returns>
        public bool Write(WriterContext context)
        {
            //_sendCompleted = true when previous send is done. Init everything for this send.
            if (_sendBuffer == WriterContext.EmptySegment)
                _sendBuffer = context.DequeueBuffer();
            var offset = _sendBuffer.Offset;
            if (_sendCompleted)
            {
                var buffer = _sendBuffer.Array;
                var len = GetContentLength();
                if (len > 512)
                    _flags = _flags | FrameFlags.LargeFrame;

                buffer[offset++] = (byte) _flags;
                buffer[offset++] = _extensionId;
                if (len > 512)
                {
                    var lenBuffer = BitConverter.GetBytes(len);
                    if (BitConverter.IsLittleEndian)
                        Array.Reverse(lenBuffer);
                    buffer[offset++] = lenBuffer[0];
                    buffer[offset++] = lenBuffer[1];
                    buffer[offset++] = lenBuffer[2];
                    buffer[offset++] = lenBuffer[3];
                }
                else
                {
                    buffer[offset++] = (byte) len;
                }

                var bytesLeft = _sendBuffer.Count - (offset - _sendBuffer.Offset);
                _sendCompleted = WritePayload(buffer, ref offset, bytesLeft);
            }
            else
            {
                var buffer = _sendBuffer.Array;
                _sendCompleted = WritePayload(buffer, ref offset, _sendBuffer.Count);
            }

            var bytesWritten = offset - _sendBuffer.Offset;
            context.Enqueue(_sendBuffer.Array, _sendBuffer.Offset, bytesWritten);
            return _sendCompleted;
        }
Example #12
0
        /// <summary>
        /// </summary>
        /// <param name="e"></param>
        /// <param name="context">Used to enqueue bytes for delivery.</param>
        /// <returns><c>true</c> if more buffers can be appened.</returns>
        public bool Write(WriterContext context)
        {
            if (_writeBytesLeftCorCurrentState != -1)
            {
                var bytesToCopy = Math.Min(_writeBuffer.Count, _writeBytesLeftCorCurrentState);
                bytesToCopy = Math.Min(bytesToCopy, context.BytesLeftToEnqueue);
                if (bytesToCopy < 10)
                    return false;

                if (_payloadStream != null)
                {
                    _payloadStream.Write(_writeBuffer.Array, 0, bytesToCopy);
                }
                else
                {
                    Buffer.BlockCopy(_payloadBuffer.Array, _writePayloadBufferOffset, _writeBuffer.Array,
                        _writeBuffer.Offset, bytesToCopy);
                }
                _writeBytesLeftCorCurrentState -= bytesToCopy;
                _writePayloadBufferOffset += bytesToCopy;
                context.Enqueue(new ArraySegment<byte>(_writeBuffer.Array, _writeBuffer.Offset, bytesToCopy));
                if (_writeBytesLeftCorCurrentState == 0)
                {
                    return true;
                }

                return false;
            }

            _writeBuffer = context.DequeueBuffer();
            _writePayloadBufferOffset = 0;
            var offset = _writeBuffer.Offset;
            var payloadLength = 0;
            if (_payloadStream != null)
            {
                _writeBuffer.Array[offset++] = _payloadStream.Length > byte.MaxValue
                    ? (byte) FrameFlags.LargeFrame
                    : (byte) 0;
                payloadLength = (int) _payloadStream.Length;
            }
            else
            {
                if(_writeBuffer == WriterContext.EmptySegment)
                    throw new InvalidOperationException("If no serializer is used, you have to use either PayloadStream or PayloadBuffer property.");

                _writeBuffer.Array[offset++] = PayloadBuffer.Count > byte.MaxValue
                    ? (byte) FrameFlags.LargeFrame
                    : (byte) 0;
                payloadLength = PayloadBuffer.Count;
            }

            var buf = BitConverter.GetBytes(SequenceNumber);
            if (BitConverter.IsLittleEndian)
                Array.Reverse(buf);
            _writeBuffer.Array[offset++] = buf[0];
            _writeBuffer.Array[offset++] = buf[1];
            _writeBuffer.Array[offset++] = (byte) Destination.Length;
            if (Destination.Length > 0)
            {
                Encoding.ASCII.GetBytes(Destination, 0, Destination.Length, _writeBuffer.Array, offset);
                offset += Destination.Length;
            }

            if (_properties != null && _properties.Count > 0)
            {
                var filters = EncodeFilters();
                var filterLen = BitConverter.GetBytes((short) filters.Length);
                if (BitConverter.IsLittleEndian)
                    Array.Reverse(filterLen);
                _writeBuffer.Array[offset++] = filterLen[0];
                _writeBuffer.Array[offset++] = filterLen[1];
                Encoding.ASCII.GetBytes(filters, 0, filters.Length, _writeBuffer.Array, offset);
                offset += filters.Length;
            }
            else
            {
                _writeBuffer.Array[offset++] = 0;
                _writeBuffer.Array[offset++] = 0;
            }

            //length
            if (payloadLength > byte.MaxValue)
            {
                buf = BitConverter.GetBytes(payloadLength);
                if (BitConverter.IsLittleEndian)
                    Array.Reverse(buf);
                _writeBuffer.Array[offset++] = buf[0];
                _writeBuffer.Array[offset++] = buf[1];
                _writeBuffer.Array[offset++] = buf[2];
                _writeBuffer.Array[offset++] = buf[3];
            }
            else
            {
                _writeBuffer.Array[offset++] = (byte) payloadLength;
            }

            _writeBytesLeftCorCurrentState = payloadLength;
            var payloadBytesToCopy = Math.Min(_writeBuffer.Count - (offset - _writeBuffer.Offset),
                _writeBytesLeftCorCurrentState);
            if (_payloadStream != null)
            {
                _payloadStream.Write(_writeBuffer.Array, offset, payloadBytesToCopy);
            }
            else
            {
                Buffer.BlockCopy(_payloadBuffer.Array, _writePayloadBufferOffset, _writeBuffer.Array, offset,
                    payloadBytesToCopy);
            }
            payloadBytesToCopy = Math.Min(payloadBytesToCopy, context.BytesLeftToEnqueue);
            _writeBytesLeftCorCurrentState -= payloadBytesToCopy;
            _writePayloadBufferOffset += payloadBytesToCopy;
            var size = (offset - _writeBuffer.Offset) + payloadBytesToCopy;
            context.Enqueue(_writeBuffer.Array, _writeBuffer.Offset, size);

            if (_writeBytesLeftCorCurrentState == 0)
                return true;
            return false;
        }
 /// <summary>
 /// </summary>
 /// <param name="e"></param>
 /// <param name="context">Used to enqueue bytes for delivery.</param>
 /// <returns><c>true</c> if more buffers can be appened.</returns>
 public bool Write(WriterContext context)
 {
     return false;
 }
 public void WriteCompleted(WriterContext context)
 {
 }
 /// <summary>
 /// </summary>
 /// <param name="e"></param>
 /// <param name="context">Used to enqueue bytes for delivery.</param>
 /// <returns><c>true</c> if more buffers can be appened.</returns>
 public bool Write(WriterContext context)
 {
     _writeBuffer = context.DequeueBuffer();
     var len = CopyTo(_writeBuffer.Array, _writeBuffer.Offset);
     context.Enqueue(new SendPacketsElement(_writeBuffer.Array, _writeBuffer.Offset, len));
     return true;
 }
 /// <summary>
 ///     Connection have been lost. Reset state and return buffers.
 /// </summary>
 /// <param name="context"></param>
 public void ResetWrite(WriterContext context)
 {
     if (_writeBuffer.Count != 0)
     {
         context.ReturnBuffer(_writeBuffer);
         _writeBuffer = new ArraySegment<byte>();
     }
 }
        public void serialize_Simplistic_filter()
        {
            var bufferManager = new BufferManager(8192, 1);
            var context = new WriterContext(bufferManager);
            var buffer = bufferManager.Dequeue();
            bufferManager.Enqueue(buffer);
            var expected = new byte[]
            {
                0, //flags,
                0, 2, // sequence number,
                2, //destination length,
                (byte)'M', (byte)'Q',
                0, 16, // filter length
                (byte)'l', (byte)'a', (byte)'s', (byte)'t', (byte)'_', (byte)'n', (byte)'a', (byte)'m', (byte)'e', //filter part 1
                (byte)':', (byte)'k', (byte)'a', (byte)'l', (byte)'l', (byte)'e', (byte)';', //filter part 2
                6, //payload length
                (byte) 'm', (byte) 'o', (byte) 't', (byte) 'h', (byte)'e', (byte)'r' //payload
            };

            var sut = new MessageFrame();
            sut.SequenceNumber = 2;
            sut.Destination = "MQ";
            sut.Properties.Add("last_name", "kalle");
            var payload = Encoding.ASCII.GetBytes("mother");
            sut.PayloadBuffer = new ArraySegment<byte>(payload, 0, payload.Length);
            var actual = sut.Write(context);

            for (int i = 0; i < expected.Length; i++)
            {
                if (expected[i] != buffer.Array[i])
                    throw new InvalidOperationException("Differs at " + i);
            }
        }
        public void doing_a_partial_payload_write_properly()
        {
            var bufMgr = new BufferManager(5010, 1);
            var context = new WriterContext(bufMgr);
            var buf1 = bufMgr.Dequeue();
            bufMgr.Enqueue(buf1);
            var sut = new MessageFrame();
            sut.SequenceNumber = 22;
            var payload = Encoding.ASCII.GetBytes("Hello world".PadRight(10000));
            sut.PayloadBuffer = new ArraySegment<byte>(payload, 0, payload.Length);

            var actual1 = sut.Write(context);
            var pos = 0;
            var len = context.GetPackets().First().Count;
            var frame2 = new MessageFrame();
            frame2.Read(buf1.Array, ref pos, ref len);

            var actual2 = sut.Write(context);
            pos = 0;
            len = context.GetPackets().Last().Count;
            frame2.Read(buf1.Array, ref pos, ref len);

            frame2.SequenceNumber.Should().Be(22);
            frame2.IsFlaggedAsSmall.Should().BeFalse();
            Encoding.ASCII.GetString(sut.PayloadBuffer.Array, 0, sut.PayloadBuffer.Count).TrimEnd(' ').Should().Be("Hello world");
            actual1.Should().BeFalse();
            actual2.Should().BeTrue();
        }
 /// <summary>
 ///     Connection have been lost. Reset state and return buffers.
 /// </summary>
 /// <param name="context"></param>
 public void ResetWrite(WriterContext context)
 {
     if (_sendBuffer != WriterContext.EmptySegment)
     {
         context.ReturnBuffer(_sendBuffer);
         _sendBuffer = WriterContext.EmptySegment;
     }
 }
Example #20
0
        /// <summary>
        ///     Connection have been lost. Reset state and return buffers.
        /// </summary>
        /// <param name="context"></param>
        public void ResetWrite(WriterContext context)
        {
            if (_writeBuffer != WriterContext.EmptySegment)
            {
                context.ReturnBuffer(_writeBuffer);
                _writeBuffer = WriterContext.EmptySegment;
            }

            _writePayloadBufferOffset = 0;
            _writeBytesLeftCorCurrentState = -1;
        }
 /// <summary>
 ///     Connection have been lost. Reset state and return buffers.
 /// </summary>
 /// <param name="context"></param>
 public void ResetWrite(WriterContext context)
 {
 }
 /// <summary>
 ///     Connection have been lost. Reset state and return buffers.
 /// </summary>
 /// <param name="context"></param>
 public void ResetWrite(WriterContext context)
 {
 }