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 2012/03/09 21:34:33 UTC

svn commit: r1299037 - /httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/DefaultAsyncRequestDirector.java

Author: olegk
Date: Fri Mar  9 20:34:33 2012
New Revision: 1299037

URL: http://svn.apache.org/viewvc?rev=1299037&view=rev
Log:
Added defensive code for a fringe case when the connection leased from the pool gets immediately closed by the opposite endpoint

Modified:
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/DefaultAsyncRequestDirector.java

Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/DefaultAsyncRequestDirector.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/DefaultAsyncRequestDirector.java?rev=1299037&r1=1299036&r2=1299037&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/DefaultAsyncRequestDirector.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/DefaultAsyncRequestDirector.java Fri Mar  9 20:34:33 2012
@@ -34,6 +34,7 @@ import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.commons.logging.Log;
+import org.apache.http.ConnectionClosedException;
 import org.apache.http.ConnectionReuseStrategy;
 import org.apache.http.HttpEntityEnclosingRequest;
 import org.apache.http.HttpException;
@@ -124,6 +125,7 @@ class DefaultAsyncRequestDirector<T> imp
     private int redirectCount;
     private ByteBuffer tmpbuf;
     private boolean requestContentProduced;
+    private boolean requestSent;
     private int execCount;
 
     public DefaultAsyncRequestDirector(
@@ -275,6 +277,7 @@ class DefaultAsyncRequestDirector<T> imp
     }
 
     public void requestCompleted(final HttpContext context) {
+        this.requestSent = true;
         this.requestProducer.requestCompleted(context);
     }
 
@@ -283,6 +286,7 @@ class DefaultAsyncRequestDirector<T> imp
     }
 
     public void resetRequest() throws IOException {
+        this.requestSent = false;
         this.requestProducer.resetRequest();
     }
 
@@ -378,6 +382,9 @@ class DefaultAsyncRequestDirector<T> imp
 
     public synchronized void failed(final Exception ex) {
         try {
+            if (!this.requestSent) {
+                this.requestProducer.failed(ex);
+            }
             this.responseConsumer.failed(ex);
         } finally {
             try {
@@ -510,6 +517,9 @@ class DefaultAsyncRequestDirector<T> imp
             this.managedConn.getContext().setAttribute(HttpAsyncRequestExecutor.HTTP_HANDLER, this);
             this.managedConn.requestOutput();
             this.routeEstablished = route.equals(conn.getRoute());
+            if (!this.managedConn.isOpen()) {
+                throw new ConnectionClosedException("Connection closed");
+            }
         } catch (IOException ex) {
             failed(ex);
         } catch (RuntimeException runex) {