/// <summary>Creates a new IncomingRequestFrame.</summary> /// <param name="protocol">The Ice protocol.</param> /// <param name="data">The frame data as an array segment.</param> public IncomingRequestFrame(Protocol protocol, ArraySegment <byte> data) { Data = data; Protocol = protocol; var istr = new InputStream(Protocol.GetEncoding(), data); Identity = new Identity(istr); Facet = istr.ReadFacet(); Operation = istr.ReadString(); IsIdempotent = istr.ReadOperationMode() != OperationMode.Normal; Context = istr.ReadContext(); Payload = Data.Slice(istr.Pos); (int size, Encoding encoding) = istr.ReadEncapsulationHeader(); if (protocol == Protocol.Ice1 && size + 4 != Payload.Count) { // The payload holds an encapsulation and the encapsulation must use up the full buffer with ice1. // "4" corresponds to fixed-length size with the 1.1 encoding. throw new InvalidDataException($"invalid request encapsulation size: {size}"); } else { // TODO: with ice2, the payload is followed by a context, and the size is not fixed-length. // TODO: read the compression status from the encapsulation data } Encoding = encoding; }
/// <summary>Creates a new IncomingRequestFrame.</summary> /// <param name="communicator">The communicator to use when initializing the stream.</param> /// <param name="data">The frame data as an array segment.</param> public IncomingRequestFrame(Communicator communicator, ArraySegment <byte> data) { _communicator = communicator; Data = data; var istr = new InputStream(communicator, Ice1Definitions.Encoding, data); Identity = new Identity(istr); Facet = istr.ReadFacet(); Operation = istr.ReadString(); IsIdempotent = istr.ReadOperationMode() != OperationMode.Normal; Context = istr.ReadContext(); Payload = Data.Slice(istr.Pos); (int size, Encoding encoding) = istr.ReadEncapsulationHeader(); if (size + 4 != Payload.Count) { throw new InvalidDataException($"invalid request encapsulation size: {size}"); } Encoding = encoding; }
/// <summary>Creates a new IncomingRequestFrame.</summary> /// <param name="protocol">The Ice protocol.</param> /// <param name="data">The frame data as an array segment.</param> /// <param name="sizeMax">The maximum payload size, checked during decompress.</param> public IncomingRequestFrame(Protocol protocol, ArraySegment <byte> data, int sizeMax) : base(data, protocol, sizeMax) { var istr = new InputStream(Data, Protocol.GetEncoding()); Identity = new Identity(istr); Facet = istr.ReadFacet(); Operation = istr.ReadString(); IsIdempotent = istr.ReadOperationMode() != OperationMode.Normal; if (Protocol == Protocol.Ice1) { Context = istr.ReadContext(); } else { Context = ImmutableDictionary <string, string> .Empty; } (int size, int sizeLength, Encoding encoding) = Data.Slice(istr.Pos).AsReadOnlySpan().ReadEncapsulationHeader(Protocol.GetEncoding()); Encapsulation = Data.Slice(istr.Pos, size + sizeLength); Payload = Data.Slice(0, istr.Pos + size + sizeLength); if (Protocol == Protocol.Ice2 && BinaryContext.TryGetValue(0, out ReadOnlyMemory <byte> value)) { Context = value.Read(ContextHelper.IceReader); } if (protocol == Protocol.Ice1 && size + 4 + istr.Pos != data.Count) { // The payload holds an encapsulation and the encapsulation must use up the full buffer with ice1. // "4" corresponds to fixed-length size with the 1.1 encoding. throw new InvalidDataException($"invalid request encapsulation size: {size}"); } Encoding = encoding; HasCompressedPayload = Encoding == Encoding.V2_0 && Encapsulation[sizeLength + 2] != 0; }