public void SequenceLongerThanPayloadLengthWorks() { var maskingKey = WebSocketHeader.GenerateMaskingKey(); var payloadString = "This is a test payload."; var payload = GenerateMaskedPayload(payloadString, maskingKey); var encoder = new WebSocketPayloadReader(new WebSocketHeader(true, WebSocketOpcode.Binary, true, (ulong)payload.Length, maskingKey)); var first = new TestSequenceSegment(payload); var last = first.AddSegment(new byte[64]); var sequence = new ReadOnlySequence <byte>(first, 0, last, last.Memory.Length); SequencePosition pos = default; encoder.TryParseMessage(in sequence, ref pos, ref pos, out var outputSequence); Assert.Equal(pos, sequence.GetPosition(payload.Length)); Assert.Equal(payloadString, Encoding.UTF8.GetString(outputSequence.First.ToArray())); }
private ReadOnlySequence <byte> SegmentArray(byte[] data, int numSegments) { TestSequenceSegment currentSegment = null; TestSequenceSegment firstSegment = null; var stride = data.Length / numSegments; var totalConsumed = 0; for (var i = 0; i < data.Length - stride; i += stride) { var slice = new byte[stride]; Array.Copy(data, i, slice, 0, stride); if (currentSegment == null) { currentSegment = new TestSequenceSegment(slice); firstSegment = currentSegment; } else { currentSegment = currentSegment.AddSegment(slice); } totalConsumed += stride; } if (totalConsumed < data.Length) { var sliceLength = data.Length - totalConsumed; var finalSlice = new byte[sliceLength]; Array.Copy(data, totalConsumed, finalSlice, 0, sliceLength); currentSegment = currentSegment.AddSegment(finalSlice); } return(new ReadOnlySequence <byte>(firstSegment, 0, currentSegment, currentSegment.Memory.Length)); }