示例#1
0
            public void ShouldReadHeaderWithinUnsignedShortRange()
            {
                for (var i = 1; i <= UInt16.MaxValue; i = (i << 1) + 1) // i: [0x1, 0xFFFF]
                {
                    ushort chunkHeaderSize = (ushort)(i & 0xFFFF);

                    var input = new byte[chunkHeaderSize + 2 + 2]; // 0xXX, 0xXX, ..., 0x00, 0x00
                    input[0] = (byte)((chunkHeaderSize & 0xFF00) >> 8);
                    input[1] = (byte)(chunkHeaderSize & 0xFF);
                    for (int j = 2; j < chunkHeaderSize + 2; j++)
                    {
                        input[j] = Getbyte();
                    }

                    var clientMock = new Mock <ITcpSocketClient>();
                    SetupClientReadStream(clientMock, input);

                    var    chunkedInput = new ChunkedInputStream(clientMock.Object, null);
                    byte[] actual       = new byte[chunkHeaderSize];
                    chunkedInput.ReadBytes(actual);
                    for (int j = 0; j < actual.Length; j++)
                    {
                        actual[j].Should().Be(input[2 + j]);
                    }
                }
            }
示例#2
0
            public void ShouldReturnTheCorrectValue(byte[] response, sbyte correctValue)
            {
                var clientMock = new Mock <ITcpSocketClient>();

                TestHelper.TcpSocketClientSetup.SetupClientReadStream(clientMock, response);

                var chunkedInput = new ChunkedInputStream(clientMock.Object, new BigEndianTargetBitConverter(), null);
                var actual       = chunkedInput.ReadSByte();

                actual.Should().Be(correctValue); //, $"Got: {actual}, expected: {correctValue}");
            }
示例#3
0
        public Stream Create(Stream inputStream, IHttpHeader header)
        {
            if (inputStream == null)
            {
                throw new ArgumentNullException(nameof(inputStream));
            }
            if (header == null)
            {
                throw new ArgumentNullException(nameof(header));
            }


            var streamTmp = inputStream;

            var contentLength = header.Headers.ContentLength.Value;

            if (contentLength != null)
            {
                if (contentLength <= 0)
                {
                    return(new NullInputStream());
                }

                streamTmp = new FixLengthInputStream(streamTmp, contentLength.Value);
            }

            foreach (var transferEncodingValue in header.Headers.TransferEncoding.Values)
            {
                var cleanedTransferEncoding = transferEncodingValue.ToLower().Trim();

                switch (cleanedTransferEncoding)
                {
                case "identity":
                    break;

                case "gzip":
                    streamTmp = new GZipStream(streamTmp, CompressionLevel.Fastest);
                    break;

                case "deflate":
                    streamTmp = new DeflateStream(streamTmp, CompressionLevel.Fastest);
                    break;

                case "chunked":
                    streamTmp = new ChunkedInputStream(streamTmp);
                    break;

                default:
                    throw new InputTransferEncodingNotSupportedException();
                }
            }

            return(streamTmp);
        }
示例#4
0
            public void ShouldReadMessageBiggerThanChunkSize(byte[] input, byte[] correctValue)
            {
                var clientMock = new Mock <ITcpSocketClient>();

                TestHelper.TcpSocketClientSetup.SetupClientReadStream(clientMock, input);

                var chunkedInput = new ChunkedInputStream(clientMock.Object, new BigEndianTargetBitConverter(), null, 1);

                byte[] actual = new byte[3];
                chunkedInput.ReadBytes(actual);
                actual.Should().Equal(correctValue);
            }
示例#5
0
            public void ShouldReadMessageAcrossChunks(byte[] input, byte[] correctValue)
            {
                var clientMock = new Mock <ITcpSocketClient>();

                SetupClientReadStream(clientMock, input);

                var chunkedInput = new ChunkedInputStream(clientMock.Object, null);

                byte[] actual = new byte[3];
                chunkedInput.ReadBytes(actual);
                actual.Should().Equal(correctValue);
            }
示例#6
0
        public void TestReadRawVarint32()
        {
            MemoryStream ms = new MemoryStream();

            byte[] input;
            int    i;

            input = new byte[] { 216, 1, 0, 0, 0, 0, 0, };
            ms.Write(input, 0, input.Length);
            ms.Position = 0;

            i           = new ChunkedInputStream(ms).ReadRawVarint32();
            ms.Position = 0;
            Assert.AreEqual(216, i);


            input = new byte[] { 172, 2, 0xff, 0xff, 0, 0, 0, };
            ms.Write(input, 0, input.Length);
            ms.Position = 0;

            i           = new ChunkedInputStream(ms).ReadRawVarint32();
            ms.Position = 0;
            Assert.AreEqual(300, i);


            input = new byte[] { 5, 0xff, 0xff, 0xff, 0, 0, 0, };
            ms.Write(input, 0, input.Length);
            ms.Position = 0;

            i           = new ChunkedInputStream(ms).ReadRawVarint32();
            ms.Position = 0;
            Assert.AreEqual(5, i);


            input = new byte[] { 199, 232, 67, 0xff, 0, 0, 0, };
            ms.Write(input, 0, input.Length);
            ms.Position = 0;

            i           = new ChunkedInputStream(ms).ReadRawVarint32();
            ms.Position = 0;
            Assert.AreEqual(1111111, i);


            input = new byte[] { 128, 1, 0xff, 0xff, 0, 0, 0, };
            ms.Write(input, 0, input.Length);
            ms.Position = 0;

            i           = new ChunkedInputStream(ms).ReadRawVarint32();
            ms.Position = 0;
            Assert.AreEqual(128, i);
        }
示例#7
0
            public void ShouldLogBytes(byte[] input, byte[] correctValue)
            {
                var clientMock = new Mock <ITcpSocketClient>();
                var loggerMock = new Mock <ILogger>();

                loggerMock.Setup(x => x.Trace(It.IsAny <string>(), It.IsAny <object[]>(), It.IsAny <int>(), It.IsAny <int>()))
                .Callback <string, object[]>((s, o) => _output.WriteLine(s + ((byte[])o[0]).ToHexString(showX: true)));
                TestHelper.TcpSocketClientSetup.SetupClientReadStream(clientMock, input);

                var chunkedInput = new ChunkedInputStream(clientMock.Object, new BigEndianTargetBitConverter(), loggerMock.Object);

                byte[] actual = new byte[3];
                chunkedInput.ReadBytes(actual);
                actual.Should().Equal(correctValue);
                loggerMock.Verify(x => x.Trace("S: ", It.IsAny <byte[]>(), It.IsAny <int>(), It.IsAny <int>()), Times.Exactly(4));
            }
        public PackStreamMessageFormatV1(ITcpSocketClient tcpSocketClient, ILogger logger, bool supportBytes = true)
        {
            var output = new ChunkedOutputStream(tcpSocketClient, logger);
            var input  = new ChunkedInputStream(tcpSocketClient, logger);

            if (supportBytes)
            {
                Writer = new WriterV1(output);
                Reader = new ReaderV1(input);
            }
            else
            {
                Writer = new WriterBytesIncompatibleV1(output);
                Reader = new ReaderBytesIncompatibleV1(input);
            }
        }
示例#9
0
 public ReaderV1(ChunkedInputStream inputStream)
 {
     _inputStream = inputStream;
     _unpacker    = new PackStream.Unpacker(_inputStream);
 }
 public ChunkedInputStreamTest()
 {
     _memoryStream          = new MemoryStream();
     _networkStreamEmulator = new NetworkStreamEmulator(_memoryStream);
     _chunkedInputStream    = new ChunkedInputStream(_networkStreamEmulator);
 }