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); } }
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); }
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); }
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"]); }
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) { }
internal ReadableBufferReaderFacts(ReadOnlySequenceFactory factory) { Factory = factory; }
internal SegmentPerByte(ReadOnlySequenceFactory factory) : base(factory) { }
internal SingleSegment(ReadOnlySequenceFactory factory) : base(factory) { }
internal Array(ReadOnlySequenceFactory factory) : base(factory) { }
public Perf_ReadOnlySequence_Slice(ReadOnlySequenceFactory <T> factory) { Factory = factory; }
public Perf_ReadOnlySequence_Slice_Byte(ReadOnlySequenceFactory <byte> factory) : base(factory) { }
public Perf_ReadOnlySequence_Slice_Char(ReadOnlySequenceFactory <char> factory) : base(factory) { }