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"); }
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; }
/// <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; } }
/// <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) { }