예제 #1
0
        public QueryResult Filter(ref SequenceReader <byte> reader)
        {
            var package = _currentPackage;

            if (package == null)
            {
                package            = _currentPackage = new QueryResult();
                _currentPartReader = PackagePartReader.PackagePartReader.NewReader;
            }

            while (true)
            {
                if (_currentPartReader.Process(package, ref reader, out IPackagePartReader nextPartReader, out bool needMoreData))
                {
                    Reset();
                    return(package);
                }

                if (nextPartReader != null)
                {
                    _currentPartReader = nextPartReader;
                }

                if (needMoreData || reader.Remaining <= 0)
                {
                    return(null);
                }
            }
        }
예제 #2
0
        public virtual TPackageInfo Filter(ref SequenceReader <byte> reader)
        {
            var package = _currentPackage;

            if (package == null)
            {
                package            = _currentPackage = CreatePackage();
                _currentPartReader = GetFirstPartReader();
            }

            while (true)
            {
                if (_currentPartReader.Process(package, ref reader, out IPackagePartReader <TPackageInfo> nextPartReader, out bool needMoreData))
                {
                    Reset();
                    return(package);
                }

                if (nextPartReader != null)
                {
                    _currentPartReader = nextPartReader;
                }

                if (needMoreData || reader.Remaining <= 0)
                {
                    return(null);
                }
            }
        }
예제 #3
0
 /// <summary>
 /// 分件阅读器切换后
 /// </summary>
 /// <param name="currentPartReader">当前分件阅读器</param>
 /// <param name="nextPartReader">下一个分件阅读器</param>
 protected override void OnPartReaderSwitched(IPackagePartReader <WebSocketPackage> currentPartReader, IPackagePartReader <WebSocketPackage> nextPartReader)
 {
     if (currentPartReader is FixPartReader)
     {
         // not final fragment or is the last fragment of multiple fragments message
         // _consumed = 0 means we are ready to preserve the bytes
         if (!CurrentPackage.FIN || CurrentPackage.Head != null)
         {
             _consumed = 0;
         }
     }
 }
예제 #4
0
        public CachedPkgPartReader1Facts()
        {
            using (var scope = Repo2IoC.BeginScope())
            {
                _client = scope.Resolve <IR2RestClient>();
                _readr  = scope.Resolve <IPackagePartReader>();
                _cache  = _readr as CachedPkgPartReader1;
            }
            var cfg = UploaderConfigFile.Parse(UploaderCfg.Localhost);

            _client.SetCredentials(cfg);
        }
예제 #5
0
        public override bool Process(QueryResult package, ref SequenceReader <byte> reader, out IPackagePartReader nextPartReader, out bool needMoreData)
        {
            reader.TryRead(out byte firstByte);

            if (firstByte == 0xFF)
            {
                needMoreData   = false;
                nextPartReader = ErrorCodePartReader;
                return(false);
            }
            else if (firstByte == 0x00)
            {
                throw new NotSupportedException();
            }
            else if (firstByte == 0xFB)
            {
                throw new NotSupportedException();
            }
            else
            {
                throw new NotImplementedException();
            }
        }
예제 #6
0
        public override bool Process(WebSocketPackage package, object filterContext, 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);

            var opCode = (OpCode)(firstByte & 0x0f);

            if (opCode != OpCode.Continuation)
            {
                package.OpCode = opCode;
            }

            package.OpCodeByte = firstByte;

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

            if (package.PayloadLength >= 126)
            {
                nextPartReader = ExtendedLengthReader;
            }
            else
            {
                if (package.HasMask)
                {
                    nextPartReader = MaskKeyReader;
                }
                else
                {
                    if (TryInitIfEmptyMessage(package))
                    {
                        nextPartReader = null;
                        return(true);
                    }

                    nextPartReader = PayloadDataReader;
                }
            }

            return(false);
        }
예제 #7
0
        public override bool Process(QueryResult package, ref SequenceReader <byte> reader, out IPackagePartReader nextPartReader, out bool needMoreData)
        {
            if (reader.Length < 2)
            {
                nextPartReader = null;
                needMoreData   = true;
                return(false);
            }

            reader.TryReadBigEndian(out short errorCode);
            package.ErrorCode = errorCode;
            nextPartReader    = ErrorMessagePartRealer;
            needMoreData      = false;
            return(false);
        }
예제 #8
0
 public abstract bool Process(WebSocketPackage package, ref SequenceReader <byte> reader, out IPackagePartReader <WebSocketPackage> nextPartReader, out bool needMoreData);
예제 #9
0
        public override bool Process(WebSocketPackage package, object filterContext, ref SequenceReader <byte> reader, out IPackagePartReader <WebSocketPackage> 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);

            if (TryInitIfEmptyMessage(package))
            {
                nextPartReader = null;
                return(true);
            }

            nextPartReader = PayloadDataReader;
            return(false);
        }
예제 #10
0
        public override bool Process(WebSocketPackage package, 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 short 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);
        }
예제 #11
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);
        }
 /// <summary>
 /// µ±·Ö¼þÔĶÁÆ÷Çл»
 /// </summary>
 /// <param name="currentPartReader"></param>
 /// <param name="nextPartReader"></param>
 protected virtual void OnPartReaderSwitched(IPackagePartReader <TPackageInfo> currentPartReader, IPackagePartReader <TPackageInfo> nextPartReader)
 {
 }
예제 #13
0
        public override bool Process(WebSocketPackage package, ref SequenceReader <byte> reader, out IPackagePartReader <WebSocketPackage> nextPartReader, out bool needMoreData)
        {
            nextPartReader = null;

            long required = package.PayloadLength;

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

            needMoreData = false;

            var seq = reader.Sequence.Slice(reader.Consumed, required);

            if (package.HasMask)
            {
                DecodeMask(seq, package.MaskKey);
            }

            if (package.Data.Length == 0)
            {
                package.Data = seq;
            }
            else
            {
                package.Data = ConcactSequence(package.Data, seq);
            }

            try
            {
                if (package.FIN)
                {
                    if (package.OpCode == OpCode.Text)
                    {
                        package.Message = package.Data.GetString(Encoding.UTF8);
                        package.Data    = default;
                    }

                    return(true);
                }
                else
                {
                    // start to process next fragment
                    nextPartReader = FixPartReader;
                    return(false);
                }
            }
            finally
            {
                reader.Advance(required);
            }
        }
예제 #14
0
 public abstract bool Process(QueryResult package, ref SequenceReader <byte> reader, out IPackagePartReader <QueryResult> nextPartReader, out bool needMoreData);
예제 #15
0
 static PackagePartReader()
 {
     PackageHeadReader      = new PackageHeadReader();
     ErrorCodePartReader    = new ErrorCodePartReader();
     ErrorMessagePartRealer = new ErrorMessagePartReader();
 }
예제 #16
0
        public override bool Process(QueryResult package, ref SequenceReader <byte> reader, out IPackagePartReader nextPartReader, out bool needMoreData)
        {
            nextPartReader = null;

            if (!reader.TryReadTo(out ReadOnlySequence <byte> data, 0x00, false))
            {
                needMoreData = true;
                return(false);
            }

            reader.Advance(1);
            package.ErrorMessage = data.GetString(Encoding.UTF8);
            needMoreData         = false;
            return(true);
        }
예제 #17
0
 public virtual void Reset()
 {
     _currentPackage    = null;
     _currentPartReader = null;
 }
        /// <summary>
        /// 有效负载数据读取过程
        /// </summary>
        /// <param name="package">WebSocet包</param>
        /// <param name="filterContext">筛选器上下文</param>
        /// <param name="reader">序列阅读器</param>
        /// <param name="nextPartReader">下一分件阅读器</param>
        /// <param name="needMoreData">需要更多数据</param>
        /// <returns></returns>
        public override bool Process(WebSocketPackage package, object filterContext, ref SequenceReader <byte> reader, out IPackagePartReader <WebSocketPackage> nextPartReader, out bool needMoreData)
        {
            nextPartReader = null;

            long required = package.PayloadLength;

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

            needMoreData = false;

            var seq = reader.Sequence.Slice(reader.Consumed, required);

            if (package.HasMask)
            {
                DecodeMask(ref seq, package.MaskKey);
            }

            try
            {
                // single fragment
                if (package.FIN && package.Head == null)
                {
                    package.Data = seq;
                }
                else
                {
                    package.ConcatSequence(ref seq);
                }

                if (package.FIN)
                {
                    if (package.Head != null)
                    {
                        package.BuildData();
                    }

                    var websocketFilterContext = filterContext as WebSocketPipelineFilterContext;

                    if (websocketFilterContext != null && websocketFilterContext.Extensions != null && websocketFilterContext.Extensions.Count > 0)
                    {
                        foreach (var extension in websocketFilterContext.Extensions)
                        {
                            try
                            {
                                extension.Decode(package);
                            }
                            catch (Exception e)
                            {
                                throw new Exception($"Problem happened when decode with the extension {extension.Name}.", e);
                            }
                        }
                    }

                    var data = package.Data;

                    if (package.OpCode == OpCode.Text)
                    {
                        package.Message = data.GetString(Encoding.UTF8);
                        package.Data    = default;
                    }
                    else
                    {
                        package.Data = data.CopySequence();
                    }

                    return(true);
                }
                else
                {
                    // start to process next fragment
                    nextPartReader = FixPartReader;
                    return(false);
                }
            }
            finally
            {
                reader.Advance(required);
            }
        }