Return-Path: X-Original-To: apmail-hc-commits-archive@www.apache.org Delivered-To: apmail-hc-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id B185C10078 for ; Mon, 23 Feb 2015 12:31:34 +0000 (UTC) Received: (qmail 85559 invoked by uid 500); 23 Feb 2015 12:31:28 -0000 Delivered-To: apmail-hc-commits-archive@hc.apache.org Received: (qmail 85521 invoked by uid 500); 23 Feb 2015 12:31:28 -0000 Mailing-List: contact commits-help@hc.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: "HttpComponents Project" Delivered-To: mailing list commits@hc.apache.org Received: (qmail 85512 invoked by uid 99); 23 Feb 2015 12:31:28 -0000 Received: from eris.apache.org (HELO hades.apache.org) (140.211.11.105) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 23 Feb 2015 12:31:28 +0000 Received: from hades.apache.org (localhost [127.0.0.1]) by hades.apache.org (ASF Mail Server at hades.apache.org) with ESMTP id 3597AAC0110 for ; Mon, 23 Feb 2015 12:31:28 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1661657 - in /httpcomponents/httpcore/trunk: httpcore-nio/src/main/java/org/apache/http/nio/protocol/ httpcore/src/main/java/org/apache/http/protocol/ httpcore/src/test/java/org/apache/http/protocol/ Date: Mon, 23 Feb 2015 12:31:28 -0000 To: commits@hc.apache.org From: olegk@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20150223123128.3597AAC0110@hades.apache.org> Author: olegk Date: Mon Feb 23 12:31:27 2015 New Revision: 1661657 URL: http://svn.apache.org/r1661657 Log: HttpService to handle response messages that are not intended to enclose a content entity Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncService.java httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/protocol/HttpService.java httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/protocol/TestHttpService.java Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncService.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncService.java?rev=1661657&r1=1661656&r2=1661657&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncService.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncService.java Mon Feb 23 12:31:27 2015 @@ -499,14 +499,6 @@ public class HttpAsyncService implements this.exceptionLogger.log(ex); } - private void closeConnection(final NHttpConnection conn) { - try { - conn.close(); - } catch (final IOException ex) { - log(ex); - } - } - private void shutdownConnection(final NHttpConnection conn) { try { conn.shutdown(); Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/protocol/HttpService.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/protocol/HttpService.java?rev=1661657&r1=1661656&r2=1661657&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/protocol/HttpService.java (original) +++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/protocol/HttpService.java Mon Feb 23 12:31:27 2015 @@ -157,11 +157,12 @@ public class HttpService { context.setAttribute(HttpCoreContext.HTTP_CONNECTION, conn); + HttpRequest request = null; HttpResponse response = null; try { - final HttpRequest request = conn.receiveRequestHeader(); + request = conn.receiveRequestHeader(); final Header expect = request.getFirstHeader(HttpHeaders.EXPECT); final boolean expectContinue = expect != null && "100-continue".equalsIgnoreCase(expect.getValue()); if (expectContinue) { @@ -212,7 +213,9 @@ public class HttpService { this.processor.process(response, context); conn.sendResponseHeader(response); - conn.sendResponseEntity(response); + if (canResponseHaveBody(request, response)) { + conn.sendResponseEntity(response); + } conn.flush(); if (!this.connStrategy.keepAlive(response, context)) { @@ -220,6 +223,17 @@ public class HttpService { } } + private boolean canResponseHaveBody(final HttpRequest request, final HttpResponse response) { + if (request != null && "HEAD".equalsIgnoreCase(request.getRequestLine().getMethod())) { + return false; + } + final int status = response.getStatusLine().getStatusCode(); + return status >= HttpStatus.SC_OK + && status != HttpStatus.SC_NO_CONTENT + && status != HttpStatus.SC_NOT_MODIFIED + && status != HttpStatus.SC_RESET_CONTENT; + } + /** * Handles the given exception and generates an HTTP response to be sent * back to the client to inform about the exceptional condition encountered Modified: httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/protocol/TestHttpService.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/protocol/TestHttpService.java?rev=1661657&r1=1661656&r2=1661657&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/protocol/TestHttpService.java (original) +++ httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/protocol/TestHttpService.java Mon Feb 23 12:31:27 2015 @@ -154,7 +154,7 @@ public class TestHttpService { } @Test - public void testExecutionEntityEclosingRequest() throws Exception { + public void testExecutionEntityEnclosingRequest() throws Exception { final HttpProcessor httprocessor = Mockito.mock(HttpProcessor.class); final ConnectionReuseStrategy connReuseStrategy = Mockito.mock(ConnectionReuseStrategy.class); final HttpResponseFactory responseFactory = Mockito.mock(HttpResponseFactory.class); @@ -196,7 +196,7 @@ public class TestHttpService { } @Test - public void testExecutionEntityEclosingRequestWithExpectContinue() throws Exception { + public void testExecutionEntityEnclosingRequestWithExpectContinue() throws Exception { final HttpProcessor httprocessor = Mockito.mock(HttpProcessor.class); final ConnectionReuseStrategy connReuseStrategy = Mockito.mock(ConnectionReuseStrategy.class); final HttpResponseFactory responseFactory = Mockito.mock(HttpResponseFactory.class); @@ -242,7 +242,7 @@ public class TestHttpService { } @Test - public void testExecutionEntityEclosingRequestCustomExpectationVerifier() throws Exception { + public void testExecutionEntityEnclosingRequestCustomExpectationVerifier() throws Exception { final HttpProcessor httprocessor = Mockito.mock(HttpProcessor.class); final ConnectionReuseStrategy connReuseStrategy = Mockito.mock(ConnectionReuseStrategy.class); final HttpResponseFactory responseFactory = Mockito.mock(HttpResponseFactory.class); @@ -509,5 +509,79 @@ public class TestHttpService { Mockito.verify(conn).flush(); Mockito.verify(conn, Mockito.never()).close(); } + + @Test + public void testNoContentResponse() throws Exception { + final HttpProcessor httprocessor = Mockito.mock(HttpProcessor.class); + final ConnectionReuseStrategy connReuseStrategy = Mockito.mock(ConnectionReuseStrategy.class); + final HttpResponseFactory responseFactory = Mockito.mock(HttpResponseFactory.class); + final HttpRequestHandlerMapper handlerResolver = Mockito.mock(HttpRequestHandlerMapper.class); + final HttpRequestHandler requestHandler = Mockito.mock(HttpRequestHandler.class); + + final HttpService httpservice = new HttpService( + httprocessor, + connReuseStrategy, + responseFactory, + handlerResolver); + final HttpCoreContext context = HttpCoreContext.create(); + final HttpServerConnection conn = Mockito.mock(HttpServerConnection.class); + final HttpRequest request = new BasicHttpRequest("GET", "/"); + + Mockito.when(conn.receiveRequestHeader()).thenReturn(request); + final HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_NO_CONTENT, "No Content"); + Mockito.when(responseFactory.newHttpResponse(HttpVersion.HTTP_1_1, 200, context)).thenReturn(response); + Mockito.when(handlerResolver.lookup(request, context)).thenReturn(requestHandler); + Mockito.when(connReuseStrategy.keepAlive(response, context)).thenReturn(Boolean.TRUE); + + httpservice.handleRequest(conn, context); + + Assert.assertSame(conn, context.getConnection()); + Assert.assertSame(request, context.getRequest()); + + Mockito.verify(httprocessor).process(response, context); + Mockito.verify(requestHandler).handle(request, response, context); + + Mockito.verify(conn).sendResponseHeader(response); + Mockito.verify(conn, Mockito.never()).sendResponseEntity(Mockito.any()); + Mockito.verify(conn).flush(); + Mockito.verify(conn, Mockito.never()).close(); + } + + @Test + public void testResponseToHead() throws Exception { + final HttpProcessor httprocessor = Mockito.mock(HttpProcessor.class); + final ConnectionReuseStrategy connReuseStrategy = Mockito.mock(ConnectionReuseStrategy.class); + final HttpResponseFactory responseFactory = Mockito.mock(HttpResponseFactory.class); + final HttpRequestHandlerMapper handlerResolver = Mockito.mock(HttpRequestHandlerMapper.class); + final HttpRequestHandler requestHandler = Mockito.mock(HttpRequestHandler.class); + + final HttpService httpservice = new HttpService( + httprocessor, + connReuseStrategy, + responseFactory, + handlerResolver); + final HttpCoreContext context = HttpCoreContext.create(); + final HttpServerConnection conn = Mockito.mock(HttpServerConnection.class); + final HttpRequest request = new BasicHttpRequest("HEAD", "/"); + + Mockito.when(conn.receiveRequestHeader()).thenReturn(request); + final HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK"); + Mockito.when(responseFactory.newHttpResponse(HttpVersion.HTTP_1_1, 200, context)).thenReturn(response); + Mockito.when(handlerResolver.lookup(request, context)).thenReturn(requestHandler); + Mockito.when(connReuseStrategy.keepAlive(response, context)).thenReturn(Boolean.TRUE); + + httpservice.handleRequest(conn, context); + + Assert.assertSame(conn, context.getConnection()); + Assert.assertSame(request, context.getRequest()); + + Mockito.verify(httprocessor).process(response, context); + Mockito.verify(requestHandler).handle(request, response, context); + + Mockito.verify(conn).sendResponseHeader(response); + Mockito.verify(conn, Mockito.never()).sendResponseEntity(Mockito.any()); + Mockito.verify(conn).flush(); + Mockito.verify(conn, Mockito.never()).close(); + } }