Exemple #1
0
            public void Consume(RequestResponseContext requestResponseContext, IConsumerByteBuffer buffer)
            {
                try
                {
                    RequestParser parser;
                    var           wasIncompleteContent = false;

                    if (!requestResponseContext.HasConsumerData)
                    {
                        parser = RequestParser.ParserFor(buffer);
                        requestResponseContext.ConsumerData(parser);
                    }
                    else
                    {
                        parser = requestResponseContext.ConsumerData <RequestParser>();
                        wasIncompleteContent = parser.IsMissingContent;
                        parser.ParseNext(buffer);
                    }

                    Context?context = null;

                    while (parser.HasFullRequest())
                    {
                        var unfilteredRequest = parser.FullRequest();
                        unfilteredRequest = EnrichRequest(requestResponseContext, unfilteredRequest);
                        DetermineKeepAlive(requestResponseContext, unfilteredRequest);
                        var request   = _serverActor._filters.Process(unfilteredRequest);
                        var completes = new ResponseCompletes(_serverActor, requestResponseContext, request.Headers.HeaderOf(RequestHeader.XCorrelationID));
                        context = new Context(requestResponseContext, request, _serverActor._world.CompletesFor(completes));
                        _dispatcher.DispatchFor(context);
                        if (wasIncompleteContent)
                        {
                            _serverActor._requestsMissingContent.Remove(requestResponseContext.Id);
                        }
                    }

                    if (parser.IsMissingContent && !_serverActor._requestsMissingContent.ContainsKey(requestResponseContext.Id))
                    {
                        if (context == null)
                        {
                            var completes = new ResponseCompletes(_serverActor, requestResponseContext);
                            context = new Context(_serverActor._world.CompletesFor(completes));
                        }
                        _serverActor._requestsMissingContent.Add(requestResponseContext.Id, new RequestResponseHttpContext(requestResponseContext, context));
                    }
                }
                catch (Exception e)
                {
                    _serverActor.Logger.Error("Request parsing failed.", e);
                    new ResponseCompletes(_serverActor, requestResponseContext, null).With(Response.Of(ResponseStatus.BadRequest, e.Message));
                }
                finally
                {
                    buffer.Release();
                }
            }