Skip to content

Commit 9cfdd54

Browse files
committed
Bug fix: classic connection managers fail to take #isConsistent() flag into account when re-using persistent connections
1 parent 76a12fc commit 9cfdd54

3 files changed

Lines changed: 9 additions & 3 deletions

File tree

httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/BasicHttpClientConnectionManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ public synchronized void release(final ConnectionEndpoint endpoint, final Object
265265
this.conn.close(CloseMode.GRACEFUL);
266266
}
267267
this.updated = System.currentTimeMillis();
268-
if (!this.conn.isOpen()) {
268+
if (!this.conn.isOpen() && !this.conn.isConsistent()) {
269269
this.conn = null;
270270
this.route = null;
271271
this.conn = null;

httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/PoolingHttpClientConnectionManager.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ public void release(final ConnectionEndpoint endpoint, final Object state, final
355355
if (conn != null && keepAlive == null) {
356356
conn.close(CloseMode.GRACEFUL);
357357
}
358-
boolean reusable = conn != null && conn.isOpen();
358+
boolean reusable = conn != null && conn.isOpen() && conn.isConsistent();
359359
try {
360360
if (reusable) {
361361
entry.updateState(state);
@@ -371,6 +371,10 @@ public void release(final ConnectionEndpoint endpoint, final Object state, final
371371
log.debug(ConnPoolSupport.getId(endpoint) + ": connection " + ConnPoolSupport.getId(conn) +
372372
" can be kept alive " + s);
373373
}
374+
} else {
375+
if (this.log.isDebugEnabled()) {
376+
this.log.debug(ConnPoolSupport.getId(endpoint) + ": connection is not kept alive");
377+
}
374378
}
375379
} catch (final RuntimeException ex) {
376380
reusable = false;

httpclient5/src/test/java/org/apache/hc/client5/http/impl/io/TestPoolingHttpClientConnectionManager.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ public void testLeaseRelease() throws Exception {
107107
Mockito.when(plainSocketFactory.createSocket(Mockito.<HttpContext>any())).thenReturn(socket);
108108

109109
Mockito.when(conn.isOpen()).thenReturn(true);
110+
Mockito.when(conn.isConsistent()).thenReturn(true);
110111
Mockito.when(future.isCancelled()).thenReturn(false);
111112
Mockito.when(future.get(1, TimeUnit.SECONDS)).thenReturn(entry);
112113
Mockito.when(pool.lease(
@@ -213,7 +214,8 @@ public void testReleaseReusable() throws Exception {
213214
Mockito.<Timeout>any(),
214215
Mockito.<FutureCallback<PoolEntry<HttpRoute, ManagedHttpClientConnection>>>eq(null)))
215216
.thenReturn(future);
216-
Mockito.when(conn.isOpen()).thenReturn(Boolean.TRUE);
217+
Mockito.when(conn.isOpen()).thenReturn(true);
218+
Mockito.when(conn.isConsistent()).thenReturn(true);
217219

218220
final LeaseRequest connRequest1 = mgr.lease("some-id", route, null);
219221
final ConnectionEndpoint endpoint1 = connRequest1.get(Timeout.ofSeconds(1));

0 commit comments

Comments
 (0)