diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt index 23cea491e..64b022cb6 100644 --- a/RELEASE_NOTES.txt +++ b/RELEASE_NOTES.txt @@ -1,5 +1,9 @@ Changes since 4.1 +* [HTTPCLIENT-1069] HttpHostConnectException not correctly retried for direct and non-tunnelled + proxy connections. + Contributed by Oleg Kalnichevski + * [HTTPCLIENT-1066] Changed the way URIUtils#rewriteURI handles multiple consecutive slashes in the URI path component: multiple leading slashes will be replaced by one slash in order to avoid confusion with the authority component. The remaining content of the path will not be modified. diff --git a/httpclient/src/main/java/org/apache/http/conn/ssl/SSLSocketFactory.java b/httpclient/src/main/java/org/apache/http/conn/ssl/SSLSocketFactory.java index a900ab705..babe3440a 100644 --- a/httpclient/src/main/java/org/apache/http/conn/ssl/SSLSocketFactory.java +++ b/httpclient/src/main/java/org/apache/http/conn/ssl/SSLSocketFactory.java @@ -340,12 +340,12 @@ public class SSLSocketFactory implements LayeredSchemeSocketFactory, LayeredSock * @since 4.1 */ public Socket createSocket(final HttpParams params) throws IOException { - return new Socket(); + return this.socketfactory.createSocket(); } @Deprecated public Socket createSocket() throws IOException { - return new Socket(); + return this.socketfactory.createSocket(); } /** diff --git a/httpclient/src/main/java/org/apache/http/impl/client/DefaultRequestDirector.java b/httpclient/src/main/java/org/apache/http/impl/client/DefaultRequestDirector.java index 92f982e5f..d9818f12b 100644 --- a/httpclient/src/main/java/org/apache/http/impl/client/DefaultRequestDirector.java +++ b/httpclient/src/main/java/org/apache/http/impl/client/DefaultRequestDirector.java @@ -552,9 +552,8 @@ public class DefaultRequestDirector implements RequestDirector { final RoutedRequest req, final HttpContext context) throws HttpException, IOException { HttpRoute route = req.getRoute(); - boolean retrying = true; int connectCount = 0; - while (retrying) { + for (;;) { // Increment connect count connectCount++; try { @@ -564,7 +563,7 @@ public class DefaultRequestDirector implements RequestDirector { managedConn.setSocketTimeout(HttpConnectionParams.getSoTimeout(params)); } establishRoute(route, context); - retrying = false; + break; } catch (IOException ex) { try { managedConn.close(); @@ -596,9 +595,8 @@ public class DefaultRequestDirector implements RequestDirector { HttpRoute route = req.getRoute(); HttpResponse response = null; - boolean retrying = true; Exception retryReason = null; - while (retrying) { + for (;;) { // Increment total exec count (with redirects) execCount++; // Increment exec count for this particular request @@ -616,11 +614,24 @@ public class DefaultRequestDirector implements RequestDirector { } try { + if (!managedConn.isOpen()) { + // If we have a direct route to the target host + // just re-open connection and re-try the request + if (!route.isTunnelled()) { + this.log.debug("Reopening the direct connection."); + managedConn.open(route, context, params); + } else { + // otherwise give up + this.log.debug("Proxied connection. Need to start over."); + break; + } + } + if (this.log.isDebugEnabled()) { this.log.debug("Attempt " + execCount + " to execute request"); } response = requestExec.execute(wrapper, managedConn, context); - retrying = false; + break; } catch (IOException ex) { this.log.debug("Closing the connection."); @@ -642,18 +653,6 @@ public class DefaultRequestDirector implements RequestDirector { } else { throw ex; } - - // If we have a direct route to the target host - // just re-open connection and re-try the request - if (!route.isTunnelled()) { - this.log.debug("Reopening the direct connection."); - managedConn.open(route, context, params); - } else { - // otherwise give up - this.log.debug("Proxied connection. Need to start over."); - retrying = false; - } - } } return response;