Example #1
0
        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()));
        }
Example #2
0
        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));
        }