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); } } }
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); } } }
/// <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; } } }
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); }
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(); } }
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); }
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); }
public abstract bool Process(WebSocketPackage package, ref SequenceReader <byte> reader, out IPackagePartReader <WebSocketPackage> nextPartReader, out bool needMoreData);
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); }
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); }
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) { }
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); } }
public abstract bool Process(QueryResult package, ref SequenceReader <byte> reader, out IPackagePartReader <QueryResult> nextPartReader, out bool needMoreData);
static PackagePartReader() { PackageHeadReader = new PackageHeadReader(); ErrorCodePartReader = new ErrorCodePartReader(); ErrorMessagePartRealer = new ErrorMessagePartReader(); }
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); }
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); } }