You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by se...@apache.org on 2011/09/27 02:06:07 UTC

svn commit: r1176137 - in /httpcomponents/httpclient/trunk/httpclient/src: main/java/org/apache/http/impl/client/DefaultHttpRequestRetryHandler.java test/java/org/apache/http/impl/client/TestAbortHandling.java

Author: sebb
Date: Tue Sep 27 00:06:07 2011
New Revision: 1176137

URL: http://svn.apache.org/viewvc?rev=1176137&view=rev
Log:
HTTPCLIENT-1120 - DefaultHttpRequestRetryHandler#retryRequest should not retry aborted requests
Part two - still need to test connection abort (and fix if necessary)

Added:
    httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/TestAbortHandling.java   (with props)
Modified:
    httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/DefaultHttpRequestRetryHandler.java

Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/DefaultHttpRequestRetryHandler.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/DefaultHttpRequestRetryHandler.java?rev=1176137&r1=1176136&r2=1176137&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/DefaultHttpRequestRetryHandler.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/DefaultHttpRequestRetryHandler.java Tue Sep 27 00:06:07 2011
@@ -155,8 +155,15 @@ public class DefaultHttpRequestRetryHand
         return !(request instanceof HttpEntityEnclosingRequest);
     }
 
+    /**
+     * @since 4.2
+     */
     protected boolean requestIsAborted(final HttpRequest request) {
-        return (request instanceof HttpUriRequest && ((HttpUriRequest)request).isAborted());
+        HttpRequest req = request;
+        if (request instanceof RequestWrapper) { // does not forward request to original
+            req = ((RequestWrapper) request).getOriginal();
+        }
+        return (req instanceof HttpUriRequest && ((HttpUriRequest)req).isAborted());
     }
 
 }

Added: httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/TestAbortHandling.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/TestAbortHandling.java?rev=1176137&view=auto
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/TestAbortHandling.java (added)
+++ httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/TestAbortHandling.java Tue Sep 27 00:06:07 2011
@@ -0,0 +1,108 @@
+/*
+ * ====================================================================
+ *
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+package org.apache.http.impl.client;
+
+import java.io.IOException;
+import java.util.concurrent.CountDownLatch;
+
+import org.apache.http.HttpException;
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.localserver.BasicServerTestBase;
+import org.apache.http.localserver.LocalTestServer;
+import org.apache.http.protocol.BasicHttpContext;
+import org.apache.http.protocol.ExecutionContext;
+import org.apache.http.protocol.HttpContext;
+import org.apache.http.protocol.HttpRequestHandler;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ *  Tests for Abort handling.
+ */
+public class TestAbortHandling extends BasicServerTestBase {
+
+    @Before
+    public void setUp() throws Exception {
+        this.localServer = new LocalTestServer(null, null);
+        this.localServer.registerDefaultHandlers();
+        this.localServer.start();
+        this.httpclient = new DefaultHttpClient();
+    }
+
+    @Test
+    public void testAbortRetry_HTTPCLIENT_1120() throws Exception {
+        int port = this.localServer.getServiceAddress().getPort();
+        final CountDownLatch wait = new CountDownLatch(1);
+        
+        this.localServer.register("*", new HttpRequestHandler(){
+            public void handle(HttpRequest request, HttpResponse response,
+                    HttpContext context) throws HttpException, IOException {
+                try {
+                    wait.countDown(); // trigger abort
+                    Thread.sleep(2000); // allow time for abort to happen
+                    response.setStatusCode(HttpStatus.SC_OK);
+                    StringEntity entity = new StringEntity("Whatever");
+                    response.setEntity(entity);
+                } catch (Exception e) {
+                    response.setStatusCode(HttpStatus.SC_REQUEST_TIMEOUT);
+                }
+            }});
+
+        String s = "http://localhost:" + port + "/path";
+        final HttpGet httpget = new HttpGet(s);
+
+        Thread t = new Thread() {
+             @Override
+            public void run(){
+                 try {
+                    wait.await();
+                } catch (InterruptedException e) {
+                }
+                 httpget.abort();
+             }
+        };
+
+        t.start();
+        
+        HttpContext context = new BasicHttpContext();
+        try {
+            this.httpclient.execute(getServerHttp(), httpget, context);
+        } catch (IOException e) {
+        }
+
+        HttpRequest reqWrapper = (HttpRequest) context.getAttribute(ExecutionContext.HTTP_REQUEST);
+        Assert.assertNotNull("Request should exist",reqWrapper);
+        Assert.assertEquals(1,((RequestWrapper) reqWrapper).getExecCount());
+    }
+
+    // TODO add similar test for connection abort
+}

Propchange: httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/TestAbortHandling.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/TestAbortHandling.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision