You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2015/02/23 13:31:01 UTC

svn commit: r1661656 - in /httpcomponents/httpcore/branches/4.4.x: 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/

Author: olegk
Date: Mon Feb 23 12:31:00 2015
New Revision: 1661656

URL: http://svn.apache.org/r1661656
Log:
HttpService to handle response messages that are not intended to enclose a content entity

Modified:
    httpcomponents/httpcore/branches/4.4.x/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncService.java
    httpcomponents/httpcore/branches/4.4.x/httpcore/src/main/java/org/apache/http/protocol/HttpService.java
    httpcomponents/httpcore/branches/4.4.x/httpcore/src/test/java/org/apache/http/protocol/TestHttpService.java

Modified: httpcomponents/httpcore/branches/4.4.x/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncService.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/branches/4.4.x/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncService.java?rev=1661656&r1=1661655&r2=1661656&view=diff
==============================================================================
--- httpcomponents/httpcore/branches/4.4.x/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncService.java (original)
+++ httpcomponents/httpcore/branches/4.4.x/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncService.java Mon Feb 23 12:31:00 2015
@@ -553,14 +553,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/branches/4.4.x/httpcore/src/main/java/org/apache/http/protocol/HttpService.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/branches/4.4.x/httpcore/src/main/java/org/apache/http/protocol/HttpService.java?rev=1661656&r1=1661655&r2=1661656&view=diff
==============================================================================
--- httpcomponents/httpcore/branches/4.4.x/httpcore/src/main/java/org/apache/http/protocol/HttpService.java (original)
+++ httpcomponents/httpcore/branches/4.4.x/httpcore/src/main/java/org/apache/http/protocol/HttpService.java Mon Feb 23 12:31:00 2015
@@ -300,11 +300,11 @@ public class HttpService {
 
         context.setAttribute(HttpCoreContext.HTTP_CONNECTION, conn);
 
+        HttpRequest request = null;
         HttpResponse response = null;
 
         try {
-
-            final HttpRequest request = conn.receiveRequestHeader();
+            request = conn.receiveRequestHeader();
             if (request instanceof HttpEntityEnclosingRequest) {
 
                 if (((HttpEntityEnclosingRequest) request).expectContinue()) {
@@ -358,7 +358,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)) {
@@ -366,6 +368,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/branches/4.4.x/httpcore/src/test/java/org/apache/http/protocol/TestHttpService.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/branches/4.4.x/httpcore/src/test/java/org/apache/http/protocol/TestHttpService.java?rev=1661656&r1=1661655&r2=1661656&view=diff
==============================================================================
--- httpcomponents/httpcore/branches/4.4.x/httpcore/src/test/java/org/apache/http/protocol/TestHttpService.java (original)
+++ httpcomponents/httpcore/branches/4.4.x/httpcore/src/test/java/org/apache/http/protocol/TestHttpService.java Mon Feb 23 12:31:00 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)).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.<HttpResponse>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)).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.<HttpResponse>any());
+        Mockito.verify(conn).flush();
+        Mockito.verify(conn, Mockito.never()).close();
+    }
 
 }