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); }
/// <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); } }