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 2011/09/11 16:12:19 UTC

svn commit: r1169460 - in /httpcomponents/httpcore/trunk/httpcore-nio/src: main/java/org/apache/http/nio/protocol/ test/java/org/apache/http/nio/protocol/

Author: olegk
Date: Sun Sep 11 14:12:18 2011
New Revision: 1169460

URL: http://svn.apache.org/viewvc?rev=1169460&view=rev
Log:
Added more protocol test cases for HttpAsyncServiceHandler

Modified:
    httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/BasicAsyncRequestProducer.java
    httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncServiceHandler.java
    httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestHttpAsyncHandlers.java

Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/BasicAsyncRequestProducer.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/BasicAsyncRequestProducer.java?rev=1169460&r1=1169459&r2=1169460&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/BasicAsyncRequestProducer.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/BasicAsyncRequestProducer.java Sun Sep 11 14:12:18 2011
@@ -76,10 +76,14 @@ public class BasicAsyncRequestProducer i
         this.request = request;
         if (request instanceof HttpEntityEnclosingRequest) {
             HttpEntity entity = ((HttpEntityEnclosingRequest) request).getEntity();
-            if (entity instanceof ProducingNHttpEntity) {
-                this.producer = (ProducingNHttpEntity) entity;
+            if (entity != null) {
+                if (entity instanceof ProducingNHttpEntity) {
+                    this.producer = (ProducingNHttpEntity) entity;
+                } else {
+                    this.producer = new NHttpEntityWrapper(entity);
+                }
             } else {
-                this.producer = new NHttpEntityWrapper(entity);
+                this.producer = null;
             }
         } else {
             this.producer = null;

Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncServiceHandler.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncServiceHandler.java?rev=1169460&r1=1169459&r2=1169460&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncServiceHandler.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncServiceHandler.java Sun Sep 11 14:12:18 2011
@@ -351,15 +351,25 @@ public class HttpAsyncServiceHandler imp
         HttpAsyncRequestConsumer<?> consumer = httpExchange.getRequestConsumer();
         consumer.requestCompleted(context);
         httpExchange.setRequestState(MessageState.COMPLETED);
-        Exception ex = consumer.getException();
-        if (ex != null) {
-            HttpAsyncResponseProducer responseProducer = handleException(ex);
+        Exception exception = consumer.getException();
+        if (exception != null) {
+            HttpAsyncResponseProducer responseProducer = handleException(exception);
             httpExchange.setResponseProducer(responseProducer);
             conn.requestOutput();
         } else {
             Object result = consumer.getResult();
             HttpAsyncResponseTrigger trigger = new ResponseTriggerImpl(httpExchange, conn);
-            handler.handle(result, trigger, context);
+            try {
+                handler.handle(result, trigger, context);
+            } catch (HttpException ex) {
+                HttpAsyncResponseProducer responseProducer = handleException(ex);
+                httpExchange.setResponseProducer(responseProducer);
+                conn.requestOutput();
+            } catch (IOException ex) {
+                HttpAsyncResponseProducer responseProducer = handleException(ex);
+                httpExchange.setResponseProducer(responseProducer);
+                conn.requestOutput();
+            }
         }
     }
 
@@ -405,7 +415,8 @@ public class HttpAsyncServiceHandler imp
         if (this.handlerResolver != null) {
             String requestURI = request.getRequestLine().getUri();
             handler = (HttpAsyncRequestHandler<Object>) this.handlerResolver.lookup(requestURI);
-        } else {
+        }
+        if (handler == null) {
             handler = new NullRequestHandler();
         }
         return handler;

Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestHttpAsyncHandlers.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestHttpAsyncHandlers.java?rev=1169460&r1=1169459&r2=1169460&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestHttpAsyncHandlers.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestHttpAsyncHandlers.java Sun Sep 11 14:12:18 2011
@@ -27,6 +27,7 @@
 
 package org.apache.http.nio.protocol;
 
+import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.util.Queue;
 import java.util.concurrent.ConcurrentLinkedQueue;
@@ -150,8 +151,6 @@ public class TestHttpAsyncHandlers exten
             queue.add(future);
         }
 
-        Assert.assertEquals("Test client status", IOReactorStatus.ACTIVE, this.client.getStatus());
-
         while (!queue.isEmpty()) {
             Future<HttpResponse> future = queue.remove();
             HttpResponse response = future.get();
@@ -161,6 +160,38 @@ public class TestHttpAsyncHandlers exten
     }
 
     @Test
+    public void testHttpHeads() throws Exception {
+        HttpAsyncRequestHandlerRegistry registry = new HttpAsyncRequestHandlerRegistry();
+        registry.register("*", new BufferingAsyncRequestHandler(new SimpleRequestHandler()));
+        InetSocketAddress address = start(registry, null);
+
+        this.connpool.setDefaultMaxPerRoute(3);
+        this.connpool.setMaxTotal(3);
+
+        String pattern = RndTestPatternGenerator.generateText();
+        int count = RndTestPatternGenerator.generateCount(1000);
+
+        HttpHost target = new HttpHost("localhost", address.getPort());
+
+        Queue<Future<HttpResponse>> queue = new ConcurrentLinkedQueue<Future<HttpResponse>>();
+        for (int i = 0; i < 30; i++) {
+            BasicHttpRequest request = new BasicHttpRequest("HEAD", createRequestUri(pattern, count));
+            Future<HttpResponse> future = this.executor.execute(
+                    new BasicAsyncRequestProducer(target, request),
+                    new BasicAsyncResponseConsumer(),
+                    this.connpool);
+            queue.add(future);
+        }
+
+        while (!queue.isEmpty()) {
+            Future<HttpResponse> future = queue.remove();
+            HttpResponse response = future.get();
+            Assert.assertNotNull(response);
+            Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
+        }
+    }
+
+    @Test
     public void testHttpPostsWithContentLength() throws Exception {
         HttpAsyncRequestHandlerRegistry registry = new HttpAsyncRequestHandlerRegistry();
         registry.register("*", new BufferingAsyncRequestHandler(new SimpleRequestHandler()));
@@ -188,8 +219,6 @@ public class TestHttpAsyncHandlers exten
             queue.add(future);
         }
 
-        Assert.assertEquals("Test client status", IOReactorStatus.ACTIVE, this.client.getStatus());
-
         while (!queue.isEmpty()) {
             Future<HttpResponse> future = queue.remove();
             HttpResponse response = future.get();
@@ -227,8 +256,6 @@ public class TestHttpAsyncHandlers exten
             queue.add(future);
         }
 
-        Assert.assertEquals("Test client status", IOReactorStatus.ACTIVE, this.client.getStatus());
-
         while (!queue.isEmpty()) {
             Future<HttpResponse> future = queue.remove();
             HttpResponse response = future.get();
@@ -265,8 +292,6 @@ public class TestHttpAsyncHandlers exten
             queue.add(future);
         }
 
-        Assert.assertEquals("Test client status", IOReactorStatus.ACTIVE, this.client.getStatus());
-
         while (!queue.isEmpty()) {
             Future<HttpResponse> future = queue.remove();
             HttpResponse response = future.get();
@@ -276,6 +301,40 @@ public class TestHttpAsyncHandlers exten
     }
 
     @Test
+    public void testHttpPostsNoEntity() throws Exception {
+        HttpAsyncRequestHandlerRegistry registry = new HttpAsyncRequestHandlerRegistry();
+        registry.register("*", new BufferingAsyncRequestHandler(new SimpleRequestHandler()));
+        InetSocketAddress address = start(registry, null);
+
+        this.connpool.setDefaultMaxPerRoute(3);
+        this.connpool.setMaxTotal(3);
+
+        String pattern = RndTestPatternGenerator.generateText();
+        int count = RndTestPatternGenerator.generateCount(1000);
+
+        HttpHost target = new HttpHost("localhost", address.getPort());
+
+        Queue<Future<HttpResponse>> queue = new ConcurrentLinkedQueue<Future<HttpResponse>>();
+        for (int i = 0; i < 30; i++) {
+            BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest(
+                    "POST", createRequestUri(pattern, count));
+            request.setEntity(null);
+            Future<HttpResponse> future = this.executor.execute(
+                    new BasicAsyncRequestProducer(target, request),
+                    new BasicAsyncResponseConsumer(),
+                    this.connpool);
+            queue.add(future);
+        }
+
+        while (!queue.isEmpty()) {
+            Future<HttpResponse> future = queue.remove();
+            HttpResponse response = future.get();
+            Assert.assertNotNull(response);
+            Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
+        }
+    }
+
+    @Test
     public void testHttpPostsWithExpectContinue() throws Exception {
         HttpAsyncRequestHandlerRegistry registry = new HttpAsyncRequestHandlerRegistry();
         registry.register("*", new BufferingAsyncRequestHandler(new SimpleRequestHandler()));
@@ -304,8 +363,6 @@ public class TestHttpAsyncHandlers exten
             queue.add(future);
         }
 
-        Assert.assertEquals("Test client status", IOReactorStatus.ACTIVE, this.client.getStatus());
-
         while (!queue.isEmpty()) {
             Future<HttpResponse> future = queue.remove();
             HttpResponse response = future.get();
@@ -369,7 +426,156 @@ public class TestHttpAsyncHandlers exten
             queue.add(future);
         }
 
-        Assert.assertEquals("Test client status", IOReactorStatus.ACTIVE, this.client.getStatus());
+        Future<HttpResponse> future1 = queue.remove();
+        HttpResponse response1 = future1.get();
+        Assert.assertEquals(HttpStatus.SC_OK, response1.getStatusLine().getStatusCode());
+
+        Future<HttpResponse> future2 = queue.remove();
+        HttpResponse response2 = future2.get();
+        Assert.assertEquals(HttpStatus.SC_OK, response2.getStatusLine().getStatusCode());
+
+        Future<HttpResponse> future3 = queue.remove();
+        HttpResponse response3 = future3.get();
+        Assert.assertEquals(HttpStatus.SC_EXPECTATION_FAILED, response3.getStatusLine().getStatusCode());
+    }
+
+    @Test
+    public void testHttpHeadsDelayedResponse() throws Exception {
+
+        class DelayedRequestHandler implements HttpAsyncRequestHandler<HttpRequest> {
+
+            private final SimpleRequestHandler requestHandler;
+
+            public DelayedRequestHandler() {
+                super();
+                this.requestHandler = new SimpleRequestHandler();
+            }
+
+            public HttpAsyncRequestConsumer<HttpRequest> processRequest(
+                    final HttpRequest request,
+                    final HttpContext context) {
+                return new BasicAsyncRequestConsumer();
+            }
+
+            public void handle(
+                    final HttpRequest request,
+                    final HttpAsyncResponseTrigger trigger,
+                    final HttpContext context) throws HttpException, IOException {
+                ProtocolVersion ver = request.getRequestLine().getProtocolVersion();
+                if (!ver.lessEquals(HttpVersion.HTTP_1_1)) {
+                    ver = HttpVersion.HTTP_1_1;
+                }
+                final BasicHttpResponse response = new BasicHttpResponse(ver, HttpStatus.SC_OK, "OK");
+                new Thread() {
+                    @Override
+                    public void run() {
+                        // Wait a bit, to make sure this is delayed.
+                        try { Thread.sleep(100); } catch(InterruptedException ie) {}
+                        // Set the entity after delaying...
+                        try {
+                            requestHandler.handle(request, response, context);
+                        } catch (Exception ex) {
+                            response.setStatusCode(HttpStatus.SC_INTERNAL_SERVER_ERROR);
+                        }
+                        trigger.submitResponse(new BasicAsyncResponseProducer(response));
+                    }
+                }.start();
+            }
+
+        }
+
+        HttpAsyncRequestHandlerRegistry registry = new HttpAsyncRequestHandlerRegistry();
+        registry.register("*", new DelayedRequestHandler());
+        InetSocketAddress address = start(registry, null);
+
+        this.connpool.setDefaultMaxPerRoute(3);
+        this.connpool.setMaxTotal(3);
+
+        String pattern = RndTestPatternGenerator.generateText();
+        int count = RndTestPatternGenerator.generateCount(1000);
+
+        HttpHost target = new HttpHost("localhost", address.getPort());
+
+        Queue<Future<HttpResponse>> queue = new ConcurrentLinkedQueue<Future<HttpResponse>>();
+        for (int i = 0; i < 30; i++) {
+            BasicHttpRequest request = new BasicHttpRequest("HEAD", createRequestUri(pattern, count));
+            Future<HttpResponse> future = this.executor.execute(
+                    new BasicAsyncRequestProducer(target, request),
+                    new BasicAsyncResponseConsumer(),
+                    this.connpool);
+            queue.add(future);
+        }
+
+        while (!queue.isEmpty()) {
+            Future<HttpResponse> future = queue.remove();
+            HttpResponse response = future.get();
+            Assert.assertNotNull(response);
+            Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
+        }
+    }
+
+    @Test
+    public void testHttpPostsWithExpectationVerificationDelayedResponse() throws Exception {
+        HttpAsyncExpectationVerifier expectationVerifier = new HttpAsyncExpectationVerifier() {
+
+            public void verify(
+                    final HttpRequest request,
+                    final HttpAsyncContinueTrigger trigger,
+                    final HttpContext context) throws HttpException {
+                new Thread() {
+                    @Override
+                    public void run() {
+                        // Wait a bit, to make sure this is delayed.
+                        try { Thread.sleep(100); } catch(InterruptedException ie) {}
+                        // Set the entity after delaying...
+                        ProtocolVersion ver = request.getRequestLine().getProtocolVersion();
+                        String s = request.getRequestLine().getUri();
+                        if (!s.equals("AAAAAx10")) {
+                            if (!ver.lessEquals(HttpVersion.HTTP_1_1)) {
+                                ver = HttpVersion.HTTP_1_1;
+                            }
+                            BasicHttpResponse response = new BasicHttpResponse(ver,
+                                    HttpStatus.SC_EXPECTATION_FAILED, "Expectation failed");
+                            response.setEntity(NStringEntity.create("Expectation failed"));
+                            trigger.submitResponse(new BasicAsyncResponseProducer(response));
+                        } else {
+                            trigger.continueRequest();
+                        }
+                    }
+                }.start();
+            }
+
+        };
+
+        HttpAsyncRequestHandlerRegistry registry = new HttpAsyncRequestHandlerRegistry();
+        registry.register("*", new BufferingAsyncRequestHandler(new SimpleRequestHandler()));
+        InetSocketAddress address = start(registry, expectationVerifier);
+
+        BasicHttpEntityEnclosingRequest request1 = new BasicHttpEntityEnclosingRequest(
+                "POST", createRequestUri("AAAAA", 10));
+        request1.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, true);
+        request1.setEntity(NStringEntity.create(createExpectedString("AAAAA", 10)));
+        BasicHttpEntityEnclosingRequest request2 = new BasicHttpEntityEnclosingRequest(
+                "POST", createRequestUri("AAAAA", 10));
+        request2.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, true);
+        request2.setEntity(NStringEntity.create(createExpectedString("AAAAA", 10)));
+        BasicHttpEntityEnclosingRequest request3 = new BasicHttpEntityEnclosingRequest(
+                "POST", createRequestUri("BBBBB", 10));
+        request3.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, true);
+        request3.setEntity(NStringEntity.create(createExpectedString("BBBBB", 10)));
+
+        HttpRequest[] requests = new HttpRequest[] { request1, request2, request3 };
+
+        HttpHost target = new HttpHost("localhost", address.getPort());
+
+        Queue<Future<HttpResponse>> queue = new ConcurrentLinkedQueue<Future<HttpResponse>>();
+        for (int i = 0; i < requests.length; i++) {
+            Future<HttpResponse> future = this.executor.execute(
+                    new BasicAsyncRequestProducer(target, requests[i]),
+                    new BasicAsyncResponseConsumer(),
+                    this.connpool);
+            queue.add(future);
+        }
 
         Future<HttpResponse> future1 = queue.remove();
         HttpResponse response1 = future1.get();
@@ -384,4 +590,89 @@ public class TestHttpAsyncHandlers exten
         Assert.assertEquals(HttpStatus.SC_EXPECTATION_FAILED, response3.getStatusLine().getStatusCode());
     }
 
+    @Test
+    public void testHttpExceptionInHandler() throws Exception {
+
+        class FailingRequestHandler implements HttpAsyncRequestHandler<HttpRequest> {
+
+            public FailingRequestHandler() {
+                super();
+            }
+
+            public HttpAsyncRequestConsumer<HttpRequest> processRequest(
+                    final HttpRequest request,
+                    final HttpContext context) {
+                return new BasicAsyncRequestConsumer();
+            }
+
+            public void handle(
+                    final HttpRequest request,
+                    final HttpAsyncResponseTrigger trigger,
+                    final HttpContext context) throws HttpException, IOException {
+                throw new HttpException("Boom");
+            }
+
+        }
+
+        HttpAsyncRequestHandlerRegistry registry = new HttpAsyncRequestHandlerRegistry();
+        registry.register("*", new FailingRequestHandler());
+        InetSocketAddress address = start(registry, null);
+
+        this.connpool.setDefaultMaxPerRoute(3);
+        this.connpool.setMaxTotal(3);
+
+        String pattern = RndTestPatternGenerator.generateText();
+        int count = RndTestPatternGenerator.generateCount(1000);
+
+        HttpHost target = new HttpHost("localhost", address.getPort());
+
+        Queue<Future<HttpResponse>> queue = new ConcurrentLinkedQueue<Future<HttpResponse>>();
+        for (int i = 0; i < 1; i++) {
+            BasicHttpRequest request = new BasicHttpRequest("GET", createRequestUri(pattern, count));
+            Future<HttpResponse> future = this.executor.execute(
+                    new BasicAsyncRequestProducer(target, request),
+                    new BasicAsyncResponseConsumer(),
+                    this.connpool);
+            queue.add(future);
+        }
+
+        while (!queue.isEmpty()) {
+            Future<HttpResponse> future = queue.remove();
+            HttpResponse response = future.get();
+            Assert.assertNotNull(response);
+            Assert.assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatusLine().getStatusCode());
+        }
+    }
+
+    @Test
+    public void testNoServiceHandler() throws Exception {
+        HttpAsyncRequestHandlerRegistry registry = new HttpAsyncRequestHandlerRegistry();
+        InetSocketAddress address = start(registry, null);
+
+        this.connpool.setDefaultMaxPerRoute(3);
+        this.connpool.setMaxTotal(3);
+
+        String pattern = RndTestPatternGenerator.generateText();
+        int count = RndTestPatternGenerator.generateCount(1000);
+
+        HttpHost target = new HttpHost("localhost", address.getPort());
+
+        Queue<Future<HttpResponse>> queue = new ConcurrentLinkedQueue<Future<HttpResponse>>();
+        for (int i = 0; i < 30; i++) {
+            BasicHttpRequest request = new BasicHttpRequest("GET", createRequestUri(pattern, count));
+            Future<HttpResponse> future = this.executor.execute(
+                    new BasicAsyncRequestProducer(target, request),
+                    new BasicAsyncResponseConsumer(),
+                    this.connpool);
+            queue.add(future);
+        }
+
+        while (!queue.isEmpty()) {
+            Future<HttpResponse> future = queue.remove();
+            HttpResponse response = future.get();
+            Assert.assertNotNull(response);
+            Assert.assertEquals(HttpStatus.SC_NOT_IMPLEMENTED, response.getStatusLine().getStatusCode());
+        }
+    }
+
 }