Beispiel #1
0
        /// <summary>
        /// Handles receives one HTTP request over the given connection within the
        /// given execution context and sends a response back to the client.
        /// </summary>
        /// <remarks>
        /// Handles receives one HTTP request over the given connection within the
        /// given execution context and sends a response back to the client.
        /// </remarks>
        /// <param name="conn">the active connection to the client</param>
        /// <param name="context">the actual execution context.</param>
        /// <exception cref="System.IO.IOException">in case of an I/O error.</exception>
        /// <exception cref="Org.Apache.Http.HttpException">
        /// in case of HTTP protocol violation or a processing
        /// problem.
        /// </exception>
        public virtual void HandleRequest(HttpServerConnection conn, HttpContext context)
        {
            context.SetAttribute(HttpCoreContext.HttpConnection, conn);
            HttpResponse response = null;

            try
            {
                IHttpRequest request = conn.ReceiveRequestHeader();
                if (request is HttpEntityEnclosingRequest)
                {
                    if (((HttpEntityEnclosingRequest)request).ExpectContinue())
                    {
                        response = this.responseFactory.NewHttpResponse(HttpVersion.Http11, HttpStatus.ScContinue
                                                                        , context);
                        if (this.expectationVerifier != null)
                        {
                            try
                            {
                                this.expectationVerifier.Verify(request, response, context);
                            }
                            catch (HttpException ex)
                            {
                                response = this.responseFactory.NewHttpResponse(HttpVersion.Http10, HttpStatus.ScInternalServerError
                                                                                , context);
                                HandleException(ex, response);
                            }
                        }
                        if (response.GetStatusLine().GetStatusCode() < 200)
                        {
                            // Send 1xx response indicating the server expections
                            // have been met
                            conn.SendResponseHeader(response);
                            conn.Flush();
                            response = null;
                            conn.ReceiveRequestEntity((HttpEntityEnclosingRequest)request);
                        }
                    }
                    else
                    {
                        conn.ReceiveRequestEntity((HttpEntityEnclosingRequest)request);
                    }
                }
                context.SetAttribute(HttpCoreContext.HttpRequest, request);
                if (response == null)
                {
                    response = this.responseFactory.NewHttpResponse(HttpVersion.Http11, HttpStatus.ScOk
                                                                    , context);
                    this.processor.Process(request, context);
                    DoService(request, response, context);
                }
                // Make sure the request content is fully consumed
                if (request is HttpEntityEnclosingRequest)
                {
                    HttpEntity entity = ((HttpEntityEnclosingRequest)request).GetEntity();
                    EntityUtils.Consume(entity);
                }
            }
            catch (HttpException ex)
            {
                response = this.responseFactory.NewHttpResponse(HttpVersion.Http10, HttpStatus.ScInternalServerError
                                                                , context);
                HandleException(ex, response);
            }
            context.SetAttribute(HttpCoreContext.HttpResponse, response);
            this.processor.Process(response, context);
            conn.SendResponseHeader(response);
            conn.SendResponseEntity(response);
            conn.Flush();
            if (!this.connStrategy.KeepAlive(response, context))
            {
                conn.Close();
            }
        }