public void Test()
        {
            var service = Substitute.For<IBodyDecoder>();
            var context = Substitute.For<IPipelineHandlerContext>();
            var request = new HttpRequest("GET", "/", "HTTP/1.1");
            request.Body = new MemoryStream(Encoding.ASCII.GetBytes("Hello world!"));
            var msg = new ReceivedHttpRequest(request);
            var sut  = new BodyDecoder(service, 65535, 65535);
            sut.HandleUpstream(context, msg);
            var received = new Received(new IPEndPoint(IPAddress.Loopback, 9231), Substitute.For<IBufferReader>());

            sut.HandleUpstream(context, received);
        }
        /// <summary>
        /// Handle an message
        /// </summary>
        /// <param name="context">Context unique for this handler instance</param>
        /// <param name="message">Message to process</param>
        public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            if (message is Closed)
            {
                _bodyBytesLeft = 0;
                _headerParser.Reset();
            }
            else if (message is Received)
            {
                var msg = (Received) message;

                // complete the body
                if (_bodyBytesLeft > 0)
                {
                    var bytesToSend = Math.Min(_bodyBytesLeft, msg.BufferReader.RemainingLength);
                    _bodyBytesLeft -= bytesToSend;
                    context.SendUpstream(message);
                    return;
                }

                _headerParser.Parse(msg.BufferReader);
                if (_headerCompleted)
                {
                    var request = (IRequest) _message;

                    var ourRequest = _message as HttpRequest;
                    if (ourRequest != null)
                        ourRequest.RemoteEndPoint = msg.RemoteEndPoint as IPEndPoint;
                    request.AddHeader("RemoteAddress", msg.RemoteEndPoint.ToString());

                    var receivedHttpRequest = new ReceivedHttpRequest(request);

                    _headerParser.Reset();
                    _headerCompleted = false;

                    context.SendUpstream(receivedHttpRequest);
                    if (msg.BufferReader.RemainingLength > 0)
                        context.SendUpstream(msg);
                }

                return;
            }

            context.SendUpstream(message);
        }
        /// <summary>
        /// Handle an message
        /// </summary>
        /// <param name="context">Context unique for this handler instance</param>
        /// <param name="message">Message to process</param>
        public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            if (message is Closed)
            {
                _bodyBytesLeft = 0;
                _headerParser.Reset();
            }
            else if (message is Received)
            {
                var msg = (Received) message;

                // complete the body
                if (_bodyBytesLeft > 0)
                {
                    var bytesToSend = Math.Min(_bodyBytesLeft, msg.BufferReader.RemainingLength);
                    _bodyBytesLeft -= bytesToSend;
                    context.SendUpstream(message);
                    return;
                }

                _headerParser.Parse(msg.BufferReader);
                if (_headerCompleted)
                {
                    var recivedHttpMsg = new ReceivedHttpRequest((IRequest) _message);
                    _headerParser.Reset();
                    _headerCompleted = false;

                    context.SendUpstream(recivedHttpMsg);
                    if (msg.BufferReader.RemainingLength > 0)
                        context.SendUpstream(msg);
                }

                return;
            }

            context.SendUpstream(message);
        }
Пример #4
0
 /// <summary>
 /// Invokes the <see cref="IErrorFormatter.Format"/> and guards against any exceptions that it might throw.
 /// </summary>
 /// <param name="response">Response to send back</param>
 /// <param name="msg">Request pipeline message</param>
 /// <param name="exception">Caught exception</param>
 protected virtual void FormatException(IResponse response, ReceivedHttpRequest msg, HttpException exception)
 {
     var formatterContext = new ErrorFormatterContext(exception, msg.HttpRequest, response);
     try
     {
         _formatter.Format(formatterContext);
     }
     catch (Exception err)
     {
         _logger.Error(
             string.Format("Formatter '{0}' failed to process request.", _formatter.GetType().FullName), err);
         var formatter = new SimpleErrorFormatter();
         formatter.Format(formatterContext);
     }
 }