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