public LitePacketParserWithCustomProcessor()
        {
            var connection = new Mock <ILiteConnection>();

            _token        = new LiteDataToken(connection.Object);
            _packetParser = new LitePacketParser(new CustomVariablePacketProcessor());
        }
Пример #2
0
        public void ParseIncomingDataWithInvalidSizeTest()
        {
            _packetParser = new LitePacketParser(_packetProcessor);
            var token = new LiteDataToken();

            Assert.Throws <InvalidOperationException>(() => _packetParser.ParseIncomingData(token, _invalidBuffer, 32));
        }
        public void ParseIncomingDataWithHeaderTest(int bytesTransfered)
        {
            _packetParser = new LitePacketParser(new DefaultLitePacketProcessor(includeHeader: true));

            var connection             = new Mock <ILiteConnection>();
            var token                  = new LiteDataToken(connection.Object);
            var numberOfReceivesNeeded = _buffer.Length / bytesTransfered + 1;
            var receviedMessages       = new List <byte[]>();

            for (var i = 0; i < numberOfReceivesNeeded; i++)
            {
                var incomingBuffer = _buffer.Skip(i * bytesTransfered).Take(bytesTransfered).ToArray();

                IEnumerable <byte[]> messages = _packetParser.ParseIncomingData(token, incomingBuffer, Math.Min(bytesTransfered, incomingBuffer.Length));

                if (messages.Any())
                {
                    receviedMessages.AddRange(messages);
                }
            }

            Assert.Single(receviedMessages);

            var messageContent = Encoding.UTF8.GetString(_buffer);

            Assert.Equal(messageContent, Encoding.UTF8.GetString(receviedMessages.Single().ToArray()));
        }
Пример #4
0
        public override bool ParseHeader(LiteDataToken token, byte[] buffer, int bytesTransfered)
        {
            int bufferRemainingBytes = bytesTransfered - token.DataStartOffset;

            if (bufferRemainingBytes <= 0)
            {
                return(false);
            }

            var  data    = new List <byte>();
            int  numRead = 0;
            byte read;

            do
            {
                read = buffer[token.DataStartOffset++];
                int value = (read & 0b01111111);

                data.Add((byte)(value << (7 * numRead)));

                numRead++;
                if (numRead > 5)
                {
                    throw new InvalidOperationException("VarInt32 is too big.");
                }
            } while ((read & 0b10000000) != 0);

            token.HeaderData = token.HeaderData is null?data.ToArray() : token.HeaderData.Concat(data).ToArray();

            return(true);
        }
Пример #5
0
        /// <summary>
        /// Parses incoming buffer for a specified connection.
        /// </summary>
        /// <param name="token">Client token information.</param>
        /// <param name="buffer">Received buffer.</param>
        /// <param name="bytesTransfered">Number of bytes transfered throught the network.</param>
        /// <returns>A collection containing all messages as byte arrays.</returns>
        public IEnumerable <byte[]> ParseIncomingData(LiteDataToken token, byte[] buffer, int bytesTransfered)
        {
            var messages = new List <byte[]>();

            while (token.DataStartOffset < bytesTransfered)
            {
                if (!token.IsHeaderComplete)
                {
                    token.IsHeaderComplete = _packetProcessor.ParseHeader(token, buffer, bytesTransfered);
                }

                if (token.IsHeaderComplete && token.HeaderData is not null)
                {
                    _packetProcessor.ParseContent(token, buffer, bytesTransfered);
                }

                if (token.IsMessageComplete)
                {
                    messages.Add(BuildClientMessageData(token));
                    token.Reset();
                }
            }

            token.DataStartOffset = 0;

            return(messages);
        }
 /// <summary>
 /// Creates a new <see cref="LiteDefaultConnectionToken"/> instance with a <see cref="ILiteConnection"/>.
 /// </summary>
 /// <param name="connection">Current connection.</param>
 /// <param name="handlerAction">Action to execute when a packet message is being processed.</param>
 public LiteQueuedConnectionToken(ILiteConnection connection, Action <ILiteConnection, byte[]> handlerAction)
 {
     Connection                      = connection;
     _handlerAction                  = handlerAction;
     DataToken                       = new LiteDataToken(Connection);
     _receiveMessageQueue            = new BlockingCollection <byte[]>();
     _receiveCancellationTokenSource = new CancellationTokenSource();
     _receiveCancellationToken       = _receiveCancellationTokenSource.Token;
     Task.Factory.StartNew(OnProcessMessageQueue,
                           _receiveCancellationToken,
                           TaskCreationOptions.LongRunning,
                           TaskScheduler.Default);
 }
Пример #7
0
        public void ParseIncomingDataTest(int bytesTransfered)
        {
            _packetParser = new LitePacketParser(_packetProcessor);
            var token = new LiteDataToken();
            var numberOfReceivesNeeded = _buffer.Length / bytesTransfered + 1;
            var receviedMessages       = new List <byte[]>();

            for (var i = 0; i < numberOfReceivesNeeded; i++)
            {
                var incomingBuffer = _buffer.Skip(i * bytesTransfered).Take(bytesTransfered).ToArray();

                IEnumerable <byte[]> messages = _packetParser.ParseIncomingData(token, incomingBuffer, Math.Min(bytesTransfered, incomingBuffer.Length));

                if (messages.Any())
                {
                    receviedMessages.AddRange(messages);
                }
            }

            Assert.Single(receviedMessages);
            Assert.Equal(_messageContent, Encoding.UTF8.GetString(receviedMessages.Single().Skip(sizeof(int)).ToArray()));
        }
Пример #8
0
        /// <summary>
        /// Builds the received message data based on the given data token.
        /// </summary>
        /// <param name="token">Client data token.</param>
        /// <returns>Client received data.</returns>
        private byte[] BuildClientMessageData(LiteDataToken token)
        {
            if (token.MessageSize is null)
            {
                throw new ArgumentNullException("An error occurred: Message size cannot be null.");
            }

            var bufferSize = _packetProcessor.IncludeHeader ? _packetProcessor.HeaderSize + token.MessageSize.Value : token.MessageSize.Value;
            var buffer     = new byte[bufferSize];

            if (_packetProcessor.IncludeHeader)
            {
                Array.Copy(token.HeaderData, 0, buffer, 0, _packetProcessor.HeaderSize);
                Array.Copy(token.MessageData, 0, buffer, _packetProcessor.HeaderSize, token.MessageSize.Value);
            }
            else
            {
                Array.Copy(token.MessageData, 0, buffer, 0, token.MessageSize.Value);
            }

            return(buffer);
        }
Пример #9
0
 /// <summary>
 /// Creates a new <see cref="LiteDefaultConnectionToken"/> instance with a <see cref="ILiteConnection"/>.
 /// </summary>
 /// <param name="connection">Current connection.</param>
 /// <param name="handlerAction">Action to execute when a packet message is being processed.</param>
 public LiteDefaultConnectionToken(ILiteConnection connection, Action <ILiteConnection, byte[]> handlerAction)
 {
     Connection     = connection;
     _handlerAction = handlerAction;
     DataToken      = new LiteDataToken();
 }
Пример #10
0
 public LitePacketParserWithCustomProcessor()
 {
     _token        = new LiteDataToken();
     _packetParser = new LitePacketParser(new CustomVariablePacketProcessor());
 }