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 2014/01/06 21:36:05 UTC

svn commit: r1556021 - in /httpcomponents/httpasyncclient/trunk: ./ httpasyncclient/src/main/java/org/apache/http/impl/nio/client/ httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/

Author: olegk
Date: Mon Jan  6 20:36:05 2014
New Revision: 1556021

URL: http://svn.apache.org/r1556021
Log:
HTTPASYNC-63: ConnectionShutdownException thrown in case of out-of-sequence response

Modified:
    httpcomponents/httpasyncclient/trunk/RELEASE_NOTES.txt
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl.java
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/MainClientExec.java
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolProxy.java

Modified: httpcomponents/httpasyncclient/trunk/RELEASE_NOTES.txt
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/RELEASE_NOTES.txt?rev=1556021&r1=1556020&r2=1556021&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/RELEASE_NOTES.txt (original)
+++ httpcomponents/httpasyncclient/trunk/RELEASE_NOTES.txt Mon Jan  6 20:36:05 2014
@@ -1,6 +1,9 @@
 Changes since 4.0
 -------------------
 
+* [HTTPASYNC-63] ConnectionShutdownException thrown in case of out-of-sequence response.
+  Contributed by Oleg Kalnichevski <olegk at apache.org>
+
 * [HTTPCLIENT-1442] Authentication header set by the user gets removed in case
   of proxy authentication.
   Contributed by Oleg Kalnichevski <olegk at apache.org>

Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl.java?rev=1556021&r1=1556020&r2=1556021&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl.java Mon Jan  6 20:36:05 2014
@@ -172,9 +172,10 @@ class DefaultClientExchangeHandlerImpl<T
             }
             this.completed.set(true);
         } else {
-            final NHttpClientConnection localConn = this.managedConn.get();
-            if (localConn != null &&!localConn.isOpen()) {
+            NHttpClientConnection localConn = this.managedConn.get();
+            if (localConn != null && !localConn.isOpen()) {
                 releaseConnection();
+                localConn = null;
             }
             if (localConn != null) {
                 localConn.requestOutput();

Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/MainClientExec.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/MainClientExec.java?rev=1556021&r1=1556020&r2=1556021&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/MainClientExec.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/MainClientExec.java Mon Jan  6 20:36:05 2014
@@ -364,7 +364,8 @@ class MainClientExec implements Internal
             }
         }
 
-        if (this.connReuseStrategy.keepAlive(currentResponse, localContext)) {
+        final NHttpClientConnection managedConn = connManager.getConnection();
+        if (managedConn.isOpen() && this.connReuseStrategy.keepAlive(currentResponse, localContext)) {
             final long validDuration = this.keepaliveStrategy.getKeepAliveDuration(
                     currentResponse, localContext);
             if (this.log.isDebugEnabled()) {
@@ -380,7 +381,9 @@ class MainClientExec implements Internal
             state.setReusable();
         } else {
             if (this.log.isDebugEnabled()) {
-                this.log.debug("[exchange: " + state.getId() + "] Connection cannot be kept alive");
+                if (managedConn.isOpen()) {
+                    this.log.debug("[exchange: " + state.getId() + "] Connection cannot be kept alive");
+                }
             }
             state.setNonReusable();
             connManager.releaseConnection();

Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolProxy.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolProxy.java?rev=1556021&r1=1556020&r2=1556021&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolProxy.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolProxy.java Mon Jan  6 20:36:05 2014
@@ -35,6 +35,7 @@ import java.lang.reflect.Proxy;
 import org.apache.http.HttpConnection;
 import org.apache.http.annotation.NotThreadSafe;
 import org.apache.http.impl.conn.ConnectionShutdownException;
+import org.apache.http.nio.IOControl;
 import org.apache.http.nio.NHttpClientConnection;
 import org.apache.http.nio.conn.ManagedNHttpClientConnection;
 import org.apache.http.util.Asserts;
@@ -130,7 +131,12 @@ class CPoolProxy implements InvocationHa
         } else {
             final NHttpClientConnection conn = getConnection();
             if (conn == null) {
-                throw new ConnectionShutdownException();
+                if (method.getDeclaringClass().equals(IOControl.class)) {
+                    // Ignore IOControl operations on closed connections
+                    return null;
+                } else {
+                    throw new ConnectionShutdownException();
+                }
             }
             try {
                 return method.invoke(conn, args);