Esempio n. 1
0
        public async Task MultiSegmentSendWillNotSendEmptyEndOfMessageFrame()
        {
            using (var feature = new TestWebSocketConnectionFeature())
            {
                var serverSocket = await feature.AcceptAsync();

                var sequence = ReadOnlySequenceFactory.CreateSegments(new byte[] { 1 }, new byte[] { 15 });
                Assert.False(sequence.IsSingleSegment);

                await serverSocket.SendAsync(sequence, WebSocketMessageType.Text);

                // Run the client socket
                var client = feature.Client.ExecuteAndCaptureFramesAsync();

                await serverSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "", default);

                var messages = await client.DefaultTimeout();

                Assert.Equal(2, messages.Received.Count);

                // First message: 1 byte, endOfMessage false
                Assert.Single(messages.Received[0].Buffer);
                Assert.Equal(1, messages.Received[0].Buffer[0]);
                Assert.False(messages.Received[0].EndOfMessage);

                // Second message: 1 byte, endOfMessage true
                Assert.Single(messages.Received[1].Buffer);
                Assert.Equal(15, messages.Received[1].Buffer[0]);
                Assert.True(messages.Received[1].EndOfMessage);
            }
        }
Esempio n. 2
0
        public void ReadUtf8MultipleBlockData()
        {
            var buffer = ReadOnlySequenceFactory.CreateSegments(_firstUtf8, _secondUtf8);
            KeyValueAccumulator accum = default;

            _formPipeReader.ParseFormValues(ref buffer, ref accum, isFinalBlock: true);
        }
        public void GlobalSetup()
        {
            // add some extra values that we won't read just to make sure we are far enough from the end of the buffer
            // which allows the parser fastpath to always kick in.
            const int paddingValueCount = 100;

            varintInputBuffers = new Dictionary <int, byte[]>();
            for (int encodedSize = 1; encodedSize <= 10; encodedSize++)
            {
                byte[] buffer = CreateBufferWithRandomVarints(random, BytesToParse / encodedSize, encodedSize, paddingValueCount);
                varintInputBuffers.Add(encodedSize, buffer);
            }

            doubleInputBuffer   = CreateBufferWithRandomDoubles(random, BytesToParse / sizeof(double), paddingValueCount);
            floatInputBuffer    = CreateBufferWithRandomFloats(random, BytesToParse / sizeof(float), paddingValueCount);
            fixedIntInputBuffer = CreateBufferWithRandomData(random, BytesToParse / sizeof(long), sizeof(long), paddingValueCount);

            stringInputBuffers = new Dictionary <int, byte[]>();
            foreach (var encodedSize in StringEncodedSizes)
            {
                byte[] buffer = CreateBufferWithStrings(BytesToParse / encodedSize, encodedSize, encodedSize < 10 ? 10 : 1);
                stringInputBuffers.Add(encodedSize, buffer);
            }

            stringInputBuffersSegmented = new Dictionary <int, ReadOnlySequence <byte> >();
            foreach (var encodedSize in StringSegmentedEncodedSizes)
            {
                byte[] buffer = CreateBufferWithStrings(BytesToParse / encodedSize, encodedSize, encodedSize < 10 ? 10 : 1);
                stringInputBuffersSegmented.Add(encodedSize, ReadOnlySequenceFactory.CreateWithContent(buffer, segmentSize: 128, addEmptySegmentDelimiters: false));
            }
        }
        public void ParseRequestLineSplitBufferWithoutNewLineDoesNotUpdateConsumed()
        {
            var parser = CreateParser(_nullTrace);
            var buffer = ReadOnlySequenceFactory.CreateSegments(
                Encoding.ASCII.GetBytes("GET "),
                Encoding.ASCII.GetBytes("/"));

            var requestHandler = new RequestHandler();
            var result         = parser.ParseRequestLine(requestHandler, buffer, out var consumed, out var examined);

            Assert.False(result);
            Assert.Equal(buffer.Start, consumed);
            Assert.Equal(buffer.End, examined);
        }
Esempio n. 5
0
    public void TryParseFormValues_ExceedValueLengthThrowsInSplitSegmentEnd()
    {
        var readOnlySequence = ReadOnlySequenceFactory.CreateSegments(Encoding.UTF8.GetBytes("foo=ba&baz=bo"), Encoding.UTF8.GetBytes("o&t=asdfasdfasd"));

        KeyValueAccumulator accumulator = default;

        var formReader = new FormPipeReader(null !);

        formReader.ValueLengthLimit = 10;

        var exception = Assert.Throws <InvalidDataException>(() => formReader.ParseFormValues(ref readOnlySequence, ref accumulator, isFinalBlock: true));

        Assert.Equal("Form value length limit 10 exceeded.", exception.Message);
    }
        public void TryParseFormValues_ExceedKeyLengthThrowsInSplitSegment()
        {
            var readOnlySequence = ReadOnlySequenceFactory.CreateSegments(Encoding.UTF8.GetBytes("fo=bar&ba"), Encoding.UTF8.GetBytes("z=boo&t="));

            KeyValueAccumulator accumulator = default;

            var formReader = new FormPipeReader(null);

            formReader.KeyLengthLimit = 2;

            var exception = Assert.Throws <InvalidDataException>(() => formReader.ParseFormValues(ref readOnlySequence, ref accumulator, isFinalBlock: true));

            Assert.Equal("Form key length limit 2 exceeded.", exception.Message);
        }
    public void GlobalSetup()
    {
        _requestMessage1 = new ReadOnlySequence <byte>(Encoding.UTF8.GetBytes("{\"protocol\":\"dummy\",\"version\":1}\u001e"));
        _requestMessage2 = new ReadOnlySequence <byte>(Encoding.UTF8.GetBytes("{\"protocol\":\"\",\"version\":10}\u001e"));
        _requestMessage3 = new ReadOnlySequence <byte>(Encoding.UTF8.GetBytes("{\"protocol\":\"\",\"version\":10,\"unknown\":null}\u001e"));
        _requestMessage4 = new ReadOnlySequence <byte>(Encoding.UTF8.GetBytes("42"));
        _requestMessage5 = ReadOnlySequenceFactory.CreateSegments(Encoding.UTF8.GetBytes("{\"protocol\":\"dummy\",\"ver"), Encoding.UTF8.GetBytes("sion\":1}\u001e"));

        _responseMessage1 = new ReadOnlySequence <byte>(Encoding.UTF8.GetBytes("{\"error\":\"dummy\"}\u001e"));
        _responseMessage2 = new ReadOnlySequence <byte>(Encoding.UTF8.GetBytes("{\"error\":\"\"}\u001e"));
        _responseMessage3 = new ReadOnlySequence <byte>(Encoding.UTF8.GetBytes("{}\u001e"));
        _responseMessage4 = new ReadOnlySequence <byte>(Encoding.UTF8.GetBytes("{\"unknown\":null}\u001e"));
        _responseMessage5 = new ReadOnlySequence <byte>(Encoding.UTF8.GetBytes("{\"error\":\"\",\"minorVersion\":34}\u001e"));
        _responseMessage6 = new ReadOnlySequence <byte>(Encoding.UTF8.GetBytes("{\"error\":\"flump flump flump\",\"minorVersion\":112}\u001e"));
    }
        public void ParseRequestLineTlsOverHttp()
        {
            var parser = CreateParser(_nullTrace);
            var buffer = ReadOnlySequenceFactory.CreateSegments(new byte[] { 0x16, 0x03, 0x01, 0x02, 0x00, 0x01, 0x00, 0xfc, 0x03, 0x03, 0x03, 0xca, 0xe0, 0xfd, 0x0a });

            var requestHandler = new RequestHandler();

            var badHttpRequestException = Assert.Throws <BadHttpRequestException>(() =>
            {
                parser.ParseRequestLine(requestHandler, buffer, out var consumed, out var examined);
            });

            Assert.Equal(badHttpRequestException.StatusCode, StatusCodes.Status400BadRequest);
            Assert.Equal(RequestRejectionReason.TlsOverHttpError, badHttpRequestException.Reason);
        }
Esempio n. 9
0
    public void TryParseFormValues_MultiSegmentFastPathWorks()
    {
        var readOnlySequence = ReadOnlySequenceFactory.CreateSegments(Encoding.UTF8.GetBytes("foo=bar&"), Encoding.UTF8.GetBytes("baz=boo"));

        KeyValueAccumulator accumulator = default;

        var formReader = new FormPipeReader(null !);

        formReader.ParseFormValues(ref readOnlySequence, ref accumulator, isFinalBlock: true);
        Assert.True(readOnlySequence.IsEmpty);

        Assert.Equal(2, accumulator.KeyCount);
        var dict = accumulator.GetResults();

        Assert.Equal("bar", dict["foo"]);
        Assert.Equal("boo", dict["baz"]);
    }
Esempio n. 10
0
        public void TestPackedRepeatedFieldCollectionNotAllocatedWhenLengthExceedsRemainingData()
        {
            uint tag    = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
            var  codec  = FieldCodec.ForFixed32(tag);
            var  stream = new MemoryStream();
            var  output = new CodedOutputStream(stream);

            output.WriteTag(tag);
            output.WriteString("A long string");
            output.WriteTag(codec.Tag);
            output.WriteRawVarint32((uint)codec.FixedSize);
            // Note that there is no content for the packed field.
            // The field length exceeds the remaining length of the buffer.
            output.Flush();
            stream.Position = 0;

            var sequence = ReadOnlySequenceFactory.CreateWithContent(stream.ToArray());

            ParseContext.Initialize(sequence, out ParseContext ctx);

            ctx.ReadTag();
            ctx.ReadString();
            ctx.ReadTag();
            var field = new RepeatedField <uint>();

            try
            {
                field.AddEntriesFrom(ref ctx, codec);
                Assert.Fail();
            }
            catch (InvalidProtocolBufferException)
            {
            }

            // Collection was not pre-initialized
            Assert.AreEqual(0, field.Count);
        }
 internal SingleSegment(ReadOnlySequenceFactory <T> factory, T[] inputData) : base(factory, inputData)
 {
 }
Esempio n. 12
0
 internal ReadableBufferReaderFacts(ReadOnlySequenceFactory factory)
 {
     Factory = factory;
 }
Esempio n. 13
0
 internal SegmentPerByte(ReadOnlySequenceFactory factory) : base(factory)
 {
 }
Esempio n. 14
0
 internal SingleSegment(ReadOnlySequenceFactory factory) : base(factory)
 {
 }
Esempio n. 15
0
 internal Array(ReadOnlySequenceFactory factory) : base(factory)
 {
 }
Esempio n. 16
0
 public Perf_ReadOnlySequence_Slice(ReadOnlySequenceFactory <T> factory)
 {
     Factory = factory;
 }
Esempio n. 17
0
 public Perf_ReadOnlySequence_Slice_Byte(ReadOnlySequenceFactory <byte> factory) : base(factory)
 {
 }
Esempio n. 18
0
 public Perf_ReadOnlySequence_Slice_Char(ReadOnlySequenceFactory <char> factory) : base(factory)
 {
 }