Пример #1
0
        public override TPackageInfo Filter(ref SequenceReader <byte> reader)
        {
            if (!_foundHeader)
            {
                if (reader.Length < _headerSize)
                {
                    return(null);
                }

                var header     = reader.Sequence.Slice(0, _headerSize);
                var bodyLength = GetBodyLengthFromHeader(header);

                if (bodyLength < 0)
                {
                    throw new ProtocolException("Failed to get body length from the package header.");
                }

                if (bodyLength == 0)
                {
                    return(DecodePackage(header));
                }

                _foundHeader = true;
                _totalSize   = _headerSize + bodyLength;
            }

            var totalSize = _totalSize;

            if (reader.Length < totalSize)
            {
                return(null);
            }

            var pack = reader.Sequence.Slice(0, totalSize);

            try
            {
                return(DecodePackage(pack));
            }
            finally
            {
                reader.Advance(totalSize);
            }
        }
Пример #2
0
        public override bool Process(WebSocketPackage package, ref SequenceReader <byte> reader, out IPackagePartReader <WebSocketPackage> nextPartReader, out bool needMoreData)
        {
            if (reader.Length < 2)
            {
                nextPartReader = null;
                needMoreData   = true;
                return(false);
            }

            needMoreData = false;

            reader.TryRead(out byte firstByte);
            package.OpCode     = (OpCode)(firstByte & 0x0f);
            package.OpCodeByte = firstByte;

            reader.TryRead(out byte secondByte);
            package.PayloadLength = secondByte & 0x7f;
            package.HasMask       = (secondByte & 0x80) == 0x80;

            if (package.PayloadLength >= 126)
            {
                nextPartReader = ExtendedLenghtReader;
            }
            else
            {
                if (package.HasMask)
                {
                    nextPartReader = MaskKeyReader;
                }
                else
                {
                    // no body
                    if (package.PayloadLength == 0)
                    {
                        nextPartReader = null;
                        return(true);
                    }

                    nextPartReader = PayloadDataReader;
                }
            }

            return(false);
        }
Пример #3
0
        public override bool Process(WebSocketPackage package, object filterContext, ref SequenceReader <byte> reader, out IPackagePartReader <WebSocketPackage> nextPartReader, out bool needMoreData)
        {
            int required;

            if (package.PayloadLength == 126)
            {
                required = 2;
            }
            else
            {
                required = 8;
            }

            if (reader.Remaining < required)
            {
                nextPartReader = null;
                needMoreData   = true;
                return(false);
            }

            needMoreData = false;

            if (required == 2)
            {
                reader.TryReadBigEndian(out ushort len);
                package.PayloadLength = len;
            }
            else // required == 8 (long)
            {
                reader.TryReadBigEndian(out long len);
                package.PayloadLength = len;
            }

            if (package.HasMask)
            {
                nextPartReader = MaskKeyReader;
            }
            else
            {
                nextPartReader = PayloadDataReader;
            }

            return(false);
        }
Пример #4
0
            public RemoteProcedureCallMetadata(ReadOnlySequence <byte> metadata)
            {
                var reader = new SequenceReader <byte>(metadata);

                if (!reader.TryReadBigEndian(out UInt16 version))
                {
                    throw new ArgumentOutOfRangeException(nameof(version), $"Invalid RPC Metadata.");
                }
                if (version != VERSION)
                {
                    throw new ArgumentOutOfRangeException(nameof(version), $"Unsupported RPC Version {version}, expected {VERSION}.");
                }
                if (!reader.TryReadBigEndian(out UInt16 servicelength))
                {
                    throw new ArgumentOutOfRangeException(nameof(servicelength), $"Invalid RPC Metadata.");
                }
                if (reader.TryRead(out string service, servicelength))
                {
                    Service = service;
                }
                else
                {
                    throw new ArgumentOutOfRangeException(nameof(service), $"Invalid RPC Metadata.");
                }
                if (!reader.TryReadBigEndian(out UInt16 methodlength))
                {
                    throw new ArgumentOutOfRangeException(nameof(methodlength), $"Invalid RPC Metadata.");
                }
                if (reader.TryRead(out string method, methodlength))
                {
                    Method = method;
                }
                else
                {
                    throw new ArgumentOutOfRangeException(nameof(method), $"Invalid RPC Metadata.");
                }
                if (!reader.TryReadBigEndian(out UInt16 tracinglength))
                {
                    throw new ArgumentOutOfRangeException(nameof(tracinglength), $"Invalid RPC Metadata.");
                }
                Tracing = reader.Sequence.Slice(reader.Position, tracinglength);
                reader.Advance(tracinglength);
                Metadata = reader.Sequence.Slice(reader.Position, reader.Remaining);
            }
Пример #5
0
        public void TryReadToSpan_Sequence(bool advancePastDelimiter)
        {
            ReadOnlySequence <byte> bytes = SequenceFactory.Create(new byte[][] {
                new byte[] { 0, 0 },
                new byte[] { 1, 1, 2, 2 },
                new byte[] { },
                new byte[] { 3, 3, 4, 4, 5, 5, 6, 6 }
            });

            SequenceReader <byte> baseReader = new SequenceReader <byte>(bytes);

            for (byte i = 0; i < bytes.Length / 2 - 1; i++)
            {
                byte[] expected = new byte[i * 2 + 1];
                for (int j = 0; j < expected.Length - 1; j++)
                {
                    expected[j] = (byte)(j / 2);
                }
                expected[i * 2] = i;
                ReadOnlySpan <byte>   searchFor = new byte[] { i, (byte)(i + 1) };
                SequenceReader <byte> copy      = baseReader;

                Assert.True(copy.TryReadTo(out ReadOnlySpan <byte> sp, searchFor, advancePastDelimiter));
                Assert.True(sp.SequenceEqual(expected));

                copy = baseReader;
                Assert.True(copy.TryReadTo(out ReadOnlySequence <byte> seq, searchFor, advancePastDelimiter));
                Assert.True(seq.ToArray().AsSpan().SequenceEqual(expected));
            }

            bytes = SequenceFactory.Create(new byte[][] {
                new byte[] { 47, 42, 66, 32, 42, 32, 66, 42, 47 }   // /*b * b*/
            });

            baseReader = new SequenceReader <byte>(bytes);
            SequenceReader <byte> copyReader = baseReader;

            Assert.True(copyReader.TryReadTo(out ReadOnlySpan <byte> span, new byte[] { 42, 47 }, advancePastDelimiter));    //  */
            Assert.True(span.SequenceEqual(new byte[] { 47, 42, 66, 32, 42, 32, 66 }));

            copyReader = baseReader;
            Assert.True(copyReader.TryReadTo(out ReadOnlySequence <byte> sequence, new byte[] { 42, 47 }, advancePastDelimiter));    //  */
            Assert.True(sequence.ToArray().AsSpan().SequenceEqual(new byte[] { 47, 42, 66, 32, 42, 32, 66 }));
        }
        public override TPackageInfo Filter(ref SequenceReader <byte> reader)
        {
            if (!_foundHeader)
            {
                if (reader.Length < _headerSize)
                {
                    return(null);
                }

                var header     = reader.Sequence.Slice(0, _headerSize);
                var bodyLength = GetBodyLengthFromHeader(header);

                if (bodyLength < 0)
                {
                    throw new ProtocolException("Failed to get body length from the package header.");
                }

                if (bodyLength == 0)
                {
                    return(DecodePackage(header));
                }

                _foundHeader = true;
                _totalSize   = _headerSize + bodyLength;

                return(Filter(ref reader));
            }

            var totalSize = _totalSize;

            var sequence = reader.Sequence;

            if (reader.Length > totalSize)
            {
                sequence = sequence.Slice(0, totalSize);
            }

            var package = DecodePackage(sequence);

            // mark the data consumed
            reader.Advance(totalSize);

            return(package);
        }
Пример #7
0
        public HttpRequestInfo Filter(ref SequenceReader <byte> reader)
        {
            lock (lockObj)
            {
                try
                {
                    if (_httpRequestInfo == null || (_httpRequestInfo != null && _httpRequestInfo.FilterStatus == FilterStatus.Completed))
                    {
                        raw = new List <byte>();
                        _httpRequestInfo = new HttpRequestInfo();
                    }

                    raw.AddRange(reader.Sequence.ToArray());

                    LoadRequestLine(ref reader);
                    LoadRequestHeader(ref reader);
                    LoadRequestBody(ref reader);

                    if (_httpRequestInfo.FilterStatus != FilterStatus.Completed)
                    {
                        return(null);
                    }

                    _httpRequestInfo.Raw     = raw.ToArray();
                    _httpRequestInfo.BaseUrl = _httpRequestInfo.Headers["Host"];
                    _httpRequestInfo.Success = true;
                    _httpRequestInfo.Message = "HTTP请求解析成功";
                    return(_httpRequestInfo);
                }
                catch (Exception ex)
                {
                    LogHelper.Error($"http解析异常:{ex}");
                    _httpRequestInfo.FilterStatus = FilterStatus.Completed;
                    return(new HttpRequestInfo()
                    {
                        Success = false, Message = ex.Message
                    });
                }
                finally
                {
                    Reset();
                }
            }
        }
Пример #8
0
        public object ReadValue(ref SequenceReader <byte> reader, int meta)
        {
            /*
             * (in big endian)
             * 1 bit sign (1= non-negative, 0= negative)
             * 17 bits year*13+month (year 0-9999, month 0-12)
             * 5 bits day (0-31)
             * 5 bits hour (0-23)
             * 6 bits minute (0-59)
             * 6 bits second (0-59)
             * (5 bytes in total)
             + fractional-seconds storage (size depends on meta)
             */

            reader.TryReadBigEndian(out int totalValue0);
            reader.TryRead(out byte totalValue1);

            var totalValue = (long)totalValue0 * 256 + totalValue1;

            if (totalValue == 0)
            {
                return(null);
            }

            var seconds = (int)(totalValue & 0x3F);

            totalValue = totalValue >> 6;
            var minutes = (int)(totalValue & 0x3F);

            totalValue = totalValue >> 6;
            var hours = (int)(totalValue & 0x1F);

            totalValue = totalValue >> 5;
            var days = (int)(totalValue & 0x1F);

            totalValue = totalValue >> 5;
            var yearMonths = (int)(totalValue & 0x01FFFF);

            var year  = yearMonths / 13;
            var month = yearMonths % 13;
            var fsp   = ReadFractionalSeconds(ref reader, meta);

            return(new DateTime(year, month, days, hours, minutes, seconds, fsp / 1000));
        }
Пример #9
0
        private bool TryParseRecord(ref SequenceReader <byte> reader, long baseOffset, out RecordBatch.Record message)
        {
            message = default;
            if (!reader.TryReadVarint64(out long length))
            {
                return(false);
            }
            if (!reader.TryReadByte(out var attributes))
            {
                return(false);
            }
            if (!reader.TryReadVarint64(out long timestampDelta))
            {
                return(false);
            }
            if (!reader.TryReadVarint64(out long offsetDelta))
            {
                return(false);
            }
            if (!reader.TryReadCompactBytes(out var key))
            {
                return(false);
            }
            if (!reader.TryReadCompactBytes(out var value))
            {
                return(false);
            }
            if (!reader.TryReadArray <RecordBatch.Record.Header>(TryParseRecordHeader, out var headers, useVarIntLength: true))
            {
                return(false);
            }

            message = new RecordBatch.Record
            {
                Attributes     = attributes,
                TimeStampDelta = timestampDelta,
                OffsetDelta    = offsetDelta,
                Offset         = baseOffset + offsetDelta,
                Key            = key.ToArray(),
                Value          = value.ToArray(),
                Headers        = headers
            };
            return(true);
        }
Пример #10
0
        public override bool Process(WebSocketPackage package, ref SequenceReader <byte> reader, out IDataFramePartReader nextPartReader, out bool needMoreData)
        {
            int required = 4;

            if (reader.Remaining < required)
            {
                nextPartReader = null;
                needMoreData   = true;
                return(false);
            }

            needMoreData = false;

            package.MaskKey = reader.Sequence.Slice(reader.Consumed, 4).ToArray();
            reader.Advance(4);

            nextPartReader = PayloadDataReader;
            return(false);
        }
        private int[] ReadColumnMetadata(ref SequenceReader <byte> reader, byte[] columnTypes)
        {
            var columnMetadata = new int[columnTypes.Length];

            for (int i = 0; i < columnTypes.Length; i++)
            {
                switch ((ColumnType)columnTypes[i])
                {
                case ColumnType.FLOAT:
                case ColumnType.DOUBLE:
                case ColumnType.BLOB:
                case ColumnType.JSON:
                case ColumnType.GEOMETRY:
                    columnMetadata[i] = (int)reader.ReadLong(1);
                    break;

                case ColumnType.BIT:
                case ColumnType.VARCHAR:
                case ColumnType.NEWDECIMAL:
                    columnMetadata[i] = (int)reader.ReadLong(2);
                    break;

                case ColumnType.SET:
                case ColumnType.ENUM:
                case ColumnType.STRING:
                    reader.TryReadBigEndian(out short value);
                    columnMetadata[i] = (int)value;
                    break;

                case ColumnType.TIME_V2:
                case ColumnType.DATETIME_V2:
                case ColumnType.TIMESTAMP_V2:
                    columnMetadata[i] = (int)reader.ReadLong(1);
                    break;

                default:
                    columnMetadata[i] = 0;
                    break;
                }
            }

            return(columnMetadata);
        }
        private List <string[]> ReadTypeValues(ref SequenceReader <byte> reader)
        {
            var result = new List <string[]>();

            while (reader.Remaining > 0)
            {
                int valuesCount = (int)reader.ReadLengthEncodedInteger();
                var typeValues  = new string[valuesCount];

                for (var i = 0; i < valuesCount; i++)
                {
                    typeValues[i] = reader.ReadLengthEncodedString();
                }

                result.Add(typeValues);
            }

            return(result);
        }
Пример #13
0
        public void DifferentFormsWorkTogether()
        {
            // InOriginForm
            var rawTarget = "/a%20path%20with%20spaces?q=123&w=xyzw12";
            var path      = "/a path with spaces";
            var query     = "?q=123&w=xyzw12";

            Http1Connection.Reset();
            var ros    = new ReadOnlySequence <byte>(Encoding.ASCII.GetBytes($"POST {rawTarget} HTTP/1.1\r\n"));
            var reader = new SequenceReader <byte>(ros);

            Assert.True(Parser.ParseRequestLine(ParsingHandler, ref reader));

            // Equal the inputs.
            Assert.Equal(rawTarget, Http1Connection.RawTarget);
            Assert.Equal(path, Http1Connection.Path);
            Assert.Equal(query, Http1Connection.QueryString);

            // But not the same as the inputs.
            Assert.NotSame(rawTarget, Http1Connection.RawTarget);
            Assert.NotSame(path, Http1Connection.Path);
            Assert.NotSame(query, Http1Connection.QueryString);

            InAuthorityForm();

            InOriginForm();
            InAbsoluteForm();

            InOriginForm();
            InAsteriskForm();

            InAuthorityForm();
            InAsteriskForm();

            InAbsoluteForm();
            InAuthorityForm();

            InAbsoluteForm();
            InAsteriskForm();

            InAbsoluteForm();
            InAuthorityForm();
        }
        private void ParseData()
        {
            if (!_parser.ParseRequestLine(new Adapter(this), _buffer, out var consumed, out var examined))
            {
                ErrorUtilities.ThrowInvalidRequestHeaders();
            }

            _buffer = _buffer.Slice(consumed, _buffer.End);
            var reader = new SequenceReader <byte>(_buffer);

            if (!_parser.ParseHeaders(new Adapter(this), ref reader))
            {
                ErrorUtilities.ThrowInvalidRequestHeaders();
            }

            Connection.EnsureHostHeaderExists();

            Connection.Reset();
        }
        private void VerifyRawHeaders(string rawHeaders, IEnumerable <string> expectedHeaderNames, IEnumerable <string> expectedHeaderValues)
        {
            Assert.True(expectedHeaderNames.Count() == expectedHeaderValues.Count(), $"{nameof(expectedHeaderNames)} and {nameof(expectedHeaderValues)} sizes must match");

            var parser = CreateParser(_nullTrace);
            var buffer = new ReadOnlySequence <byte>(Encoding.ASCII.GetBytes(rawHeaders));

            var requestHandler = new RequestHandler();
            var reader         = new SequenceReader <byte>(buffer);

            Assert.True(parser.ParseHeaders(requestHandler, ref reader));

            var parsedHeaders = requestHandler.Headers.ToArray();

            Assert.Equal(expectedHeaderNames.Count(), parsedHeaders.Length);
            Assert.Equal(expectedHeaderNames, parsedHeaders.Select(t => t.Key));
            Assert.Equal(expectedHeaderValues, parsedHeaders.Select(t => t.Value));
            Assert.True(buffer.Slice(reader.Position).IsEmpty);
        }
        private static void ParseLine(ref ReadOnlySequence <byte> lineBuffer, Span <string?> fieldResult, ref int index, bool isEol, bool isHeader = false, byte fieldDelimiter = 44)
        {
            var sequenceReader = new SequenceReader <byte>(lineBuffer);

            char[] fieldBuffer = ArrayPool <char> .Shared.Rent(64);

            do
            {
                var fieldSpan = CsvParser.ParseField(ref sequenceReader, fieldDelimiter, isEol, fieldBuffer.AsSpan());
                if (fieldSpan.Length == 1 && fieldSpan[0] == Char.MinValue)
                {
                    if (!isHeader && sequenceReader.End)
                    {
                        index++;
                    }

                    break;
                }

                if (isHeader)
                {
                    Span <char> charsResult = stackalloc char[fieldSpan.Length];
                    try
                    {
                        fieldResult[index++] = fieldSpan == String.Empty ? null : new string(FormatField(fieldSpan, charsResult));
                    }
                    catch (ArgumentNullException)
                    {
                        ArrayPool <char> .Shared.Return(fieldBuffer);

                        throw;
                    }
                }
                else
                {
                    fieldResult[index++] = fieldSpan.IsEmpty ? null : new string(fieldSpan);
                }
            } while (!sequenceReader.End);

            ArrayPool <char> .Shared.Return(fieldBuffer);

            lineBuffer = lineBuffer.Slice(sequenceReader.Position);
        }
Пример #17
0
        private SequencePosition GetFrameLength(ReadOnlySequence <byte> buffer, out int length)
        {
            if (buffer.Length < 4)
            {
                throw new ArgumentException();
            }

            var seqReader = new SequenceReader <byte>(buffer);

            if (seqReader.TryReadLittleEndian(out length))
            {
                seqReader.Advance(4);
                return(seqReader.Position);
            }
            else
            {
                throw new ArgumentException();
            }
        }
Пример #18
0
        public void Filter(ref SequenceReader <byte> reader)
        {
            if (!_foundHeader)
            {
                if (reader.Length < _headerSize)
                {
                    //return null;
                    Console.WriteLine("");
                }

                _foundHeader = true;
                var header     = reader.Sequence.Slice(0, _headerSize);
                var bodyLength = GetBodyLengthFromHeader(header);

                if (bodyLength < 0)
                {
                    throw new Exception("Failed to get body length from the package header.");
                }
                else if (bodyLength == 0)
                {
                    reader.Advance(_headerSize);
                    // return DecodePackage(header);
                }
                else
                {
                    _totalSize = _headerSize + bodyLength;
                }
            }
            var totalSize = _totalSize;

            if (reader.Length > totalSize)
            {
                reader.Advance(totalSize);
                // return DecodePackage(reader.Sequence.Slice(0, totalSize));
            }
            else if (reader.Length == totalSize)
            {
                reader.Advance(totalSize);
                //return DecodePackage(reader.Sequence);
            }

            //  return null;
        }
Пример #19
0
        public override VersionMessage Deserialize(ReadOnlySpan <byte> data)
        {
            var reader = new SequenceReader <byte>(new ReadOnlySequence <byte>(data.ToArray()));

            var message = new VersionMessage();

            message.Version         = reader.ReadInt();
            message.Services        = reader.ReadULong();
            message.Timestamp       = DateTimeOffset.FromUnixTimeSeconds(reader.ReadLong());
            message.ReceiverAddress = reader.ReadNetworkAddress();
            // from here down, if version >= 106
            message.SenderAddress = reader.ReadNetworkAddress();
            message.Nonce         = reader.ReadULong();
            message.UserAgent     = reader.ReadVarString();
            message.StartHeight   = reader.ReadInt();
            // from here down, if version >= 70001
            message.Relay = reader.ReadBool();
            return(message);
        }
        private static long ProcessLine(ref ReadOnlySequence <byte> buffer)
        {
            long str = 0;

            if (buffer.IsSingleSegment)
            {
                var span = buffer.FirstSpan;
                int consumed;
                while (span.Length > 0)
                {
                    var newLine = span.IndexOf((byte)'\n');

                    if (newLine == -1)
                    {
                        break;
                    }

                    var line = span.Slice(0, newLine);
                    str += ParseRow(line);

                    consumed = line.Length + 1;
                    span     = span.Slice(consumed);
                    buffer   = buffer.Slice(consumed);
                }
            }
            else
            {
                var sequenceReader = new SequenceReader <byte>(buffer);

                while (!sequenceReader.End)
                {
                    while (sequenceReader.TryReadTo(out ReadOnlySpan <byte> line, (byte)'\n'))
                    {
                        str += ParseRow(line);
                    }

                    buffer = buffer.Slice(sequenceReader.Position);
                    sequenceReader.Advance(buffer.Length);
                }
            }

            return(str);
        }
        public LogEvent Decode(ReadOnlySequence <byte> buffer, object context)
        {
            var reader = new SequenceReader <byte>(buffer);

            reader.Advance(4); // 3 + 1

            // ok byte
            reader.TryRead(out byte ok);

            if (ok == 0xFF)
            {
                var errorLogEvent = new ErrorEvent();
                errorLogEvent.DecodeBody(ref reader, context);
                return(errorLogEvent);
            }

            reader.TryReadLittleEndian(out int seconds);
            var timestamp = LogEvent.GetTimestapmFromUnixEpoch(seconds);

            reader.TryRead(out byte eventTypeValue);
            var eventType = (LogEventType)eventTypeValue;

            var log = CreateLogEvent(eventType, context);

            log.Timestamp = timestamp;
            log.EventType = eventType;

            reader.TryReadLittleEndian(out int serverID);
            log.ServerID = serverID;

            reader.TryReadLittleEndian(out int eventSize);
            log.EventSize = eventSize;

            reader.TryReadLittleEndian(out int position);
            log.Position = position;

            reader.TryReadLittleEndian(out short flags);
            log.Flags = (LogEventFlag)flags;

            log.DecodeBody(ref reader, context);

            return(log);
        }
Пример #22
0
 public override bool TryParseFrame(SequenceReader <byte> reader, out BasicFrame frame, out SequencePosition consumedTo)
 {
     if (reader.TryReadLittleEndian(out int messageId) &&
         reader.TryReadLittleEndian(out int length) &&
         reader.Remaining >= length)
     {
         frame = new BasicFrame
         {
             MessageId = messageId
         };
         var payload = reader.Sequence.Slice(reader.Position, length);
         frame.Payload = payload.Lease();
         consumedTo    = payload.End;
         return(true);
     }
     frame      = default;
     consumedTo = default;
     return(false);
 }
Пример #23
0
        public override TPackageInfo Filter(ref SequenceReader <byte> reader)
        {
            var terminator     = _terminator;
            var terminatorSpan = terminator.Span;

            if (!reader.TryReadTo(out ReadOnlySequence <byte> pack, terminatorSpan, advancePastDelimiter: false))
            {
                return(null);
            }

            try
            {
                return(DecodePackage(pack));
            }
            finally
            {
                reader.Advance(terminator.Length);
            }
        }
 protected string ReadString(ref SequenceReader <byte> reader, out long length)
 {
     if (reader.TryReadTo(out ReadOnlySequence <byte> seq, 0x00, false))
     {
         length = seq.Length + 1;
         var result = seq.GetString(Encoding.UTF8);
         reader.Advance(1);
         return(result);
     }
     else
     {
         length = reader.Remaining;
         seq    = reader.Sequence;
         seq    = seq.Slice(reader.Consumed);
         var result = seq.GetString(Encoding.UTF8);
         reader.Advance(length);
         return(result);
     }
 }
        public override TPackageInfo Filter(ref SequenceReader <byte> reader)
        {
            var terminator = new ReadOnlySpan <byte>(_terminator);

            if (!reader.TryReadToAny(out ReadOnlySpan <byte> pack, terminator, advancePastDelimiter: false))
            {
                return(null);
            }

            for (var i = 0; i < _terminator.Length - 1; i++)
            {
                if (!reader.IsNext(_terminator, advancePast: true))
                {
                    return(null);
                }
            }

            return(ResolvePackage(pack));
        }
Пример #26
0
    private static bool TryRead32BitLittleEndian <T>(ReadOnlySequence <byte> source, out T value)
        where T : unmanaged
    {
        Debug.Assert(sizeof(T) == 4);

        var reader = new SequenceReader <byte>(source);

        if (reader.TryReadLittleEndian(out int intValue))
        {
            T *pValue = (T *)&intValue;
            value = *pValue;
            return(true);
        }
        else
        {
            value = default;
            return(false);
        }
    }
Пример #27
0
        private bool TryParseMember(ref SequenceReader <byte> reader, out JoinGroupResponse.Member member)
        {
            member = default;
            if (!reader.TryReadString(out var memberId))
            {
                return(false);
            }
            if (!reader.TryReadString(out var groupInstanceId))
            {
                return(false);
            }
            if (!reader.TryReadBytes(out var metadata))
            {
                return(false);
            }

            member = new JoinGroupResponse.Member(memberId, groupInstanceId, metadata.ToArray());
            return(true);
        }
        public WebSocketPackage Filter(ref SequenceReader <byte> reader)
        {
            var package = _currentPackage;

            if (package == null)
            {
                _currentPackage    = package = new WebSocketPackage();
                _currentPartReader = DataFramePartReader.NewReader;
            }

            if (!_currentPartReader.Process(package, ref reader, out IDataFramePartReader nextPartReader))
            {
                _currentPartReader = nextPartReader;
                return(null);
            }

            Reset();
            return(package);
        }
Пример #29
0
        public void PastEmptySegments()
        {
            ReadOnlySequence <byte> bytes = SequenceFactory.Create(new byte[][] {
                new byte[] { 0 },
                new byte[] { },
                new byte[] { },
                new byte[] { }
            });

            SequenceReader <byte> reader = new SequenceReader <byte>(bytes);

            reader.Advance(1);
            Assert.Equal(0, reader.CurrentSpanIndex);
            Assert.Equal(0, reader.CurrentSpan.Length);
            Assert.False(reader.TryPeek(out byte value));
            ReadOnlySequence <byte> sequence = reader.Sequence.Slice(reader.Position);

            Assert.Equal(0, sequence.Length);
        }
Пример #30
0
    private static bool TryRead64BitBigEndian <T>(ReadOnlySequence <byte> source, out T value)
        where T : unmanaged
    {
        Debug.Assert(sizeof(T) == 8);

        var reader = new SequenceReader <byte>(source);

        if (reader.TryReadBigEndian(out long longValue))
        {
            T *pValue = (T *)&longValue;
            value = *pValue;
            return(true);
        }
        else
        {
            value = default;
            return(false);
        }
    }