/// <summary> /// Handle an message /// </summary> /// <param name="context">Context unique for this handler instance</param> /// <param name="message">Message to process</param> /// <remarks> /// All messages that can't be handled MUST be send up the chain using <see cref="IPipelineHandlerContext.SendUpstream"/>. /// </remarks> public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message) { var httpmsg = message as ReceivedHttpRequest; if (httpmsg != null) { if (httpmsg.HttpRequest.ContentLength > _sizeLimit) { var response = httpmsg.HttpRequest.CreateResponse(HttpStatusCode.RequestEntityTooLarge, string.Format("Max body size is {0} bytes.", _sizeLimit)); context.SendDownstream(new SendHttpResponse(httpmsg.HttpRequest, response)); return; } if (httpmsg.HttpRequest.ContentLength == 0) { context.SendUpstream(message); return; } _currentMessage = httpmsg.HttpRequest; return; // don't send the request upwards. } var msg = message as Received; if (msg != null) { if (_currentMessage == null) { throw new InvalidOperationException("Current message is not set. We have no way of knowing when to stop decoding the body."); } var result = ParseBody(msg.BufferReader); if (!result) { return; } _currentMessage.Body.Position = 0; _decoderService.Decode((IRequest)_currentMessage); context.SendUpstream(new ReceivedHttpRequest((HttpRequest)_currentMessage)); _currentMessage = null; return; } // pass on all other messages context.SendUpstream(message); }