public void ReceiveResponse(out ITransportHeaders responseHeaders, out Stream responseStream)
        {
            // transport signature
            if (!MatchPreamble())
                BinaryWireProtocol.ThrowException(BinaryWireProtocol.StatusCode.InvalidMessageFormat);
            // operation opcode
            byte operation = _reader.ReadByte();
            if (operation != BinaryWireProtocol.OperationType.Reply)
                BinaryWireProtocol.ThrowException(BinaryWireProtocol.StatusCode.InvalidMessageFormat);
            // content length
            int contentLength = _reader.ReadInt32();
            // response headers
            responseHeaders = ReadHeaders();
            // set special headers
            responseHeaders[BinaryWireProtocol.WellKnownHeaders.ConnectionId] = _connectionId;

            // create stream for response reading
            if (contentLength == -1)
            {
                responseStream = new ChunkedReadStream(_bufferedStream);
            }
            else
            {
                responseStream = new FixedReadStream(_bufferedStream, contentLength);
            }
        }
        public void ReceiveRequest(out ITransportHeaders requestHeaders, out Stream requestStream)
        {
            // transport signature
            if (!MatchPreamble())
                BinaryWireProtocol.ThrowException(BinaryWireProtocol.StatusCode.InvalidMessageFormat);
            // operation opcode
            byte operation = _reader.ReadByte();
            if (operation != BinaryWireProtocol.OperationType.Request && operation != BinaryWireProtocol.OperationType.OneWayRequest)
                BinaryWireProtocol.ThrowException(BinaryWireProtocol.StatusCode.InvalidMessageFormat);
            // content length
            int contentLength = _reader.ReadInt32();
            // request uri
            string requestUri = _reader.ReadString();
            if (!CheckRequestUri(requestUri))
                BinaryWireProtocol.ThrowException(BinaryWireProtocol.StatusCode.InvalidRequestUri);
            // request headers
            requestHeaders = ReadHeaders();
            // set special headers
            requestHeaders[BinaryWireProtocol.WellKnownHeaders.ConnectionId] = _connectionId;
            requestHeaders[BinaryWireProtocol.WellKnownHeaders.RequestUri] = requestUri;

            // create stream for request reading
            if (contentLength == -1)
            {
                requestStream = new ChunkedReadStream(_bufferedStream);
            }
            else
            {
                requestStream = new FixedReadStream(_bufferedStream, contentLength);
            }

            // set client principal
            RemotingService.ClientPrincipal = _transport.ClientPrincipal;
        }