Skip to content

Commit

Permalink
(amihaiemil#44) ISE: Connection is still allocated
Browse files Browse the repository at this point in the history
* UnixHttpClient: swapped BasicHttpClientConnectionManager for PoolingHttpClientConnectionManager
  • Loading branch information
llorllale committed Mar 15, 2018
1 parent 81773b8 commit ba10997
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 7 deletions.
Empty file removed puzzles.xml
Empty file.
29 changes: 22 additions & 7 deletions src/main/java/com/amihaiemil/docker/UnixHttpClient.java
Expand Up @@ -37,13 +37,14 @@
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.BasicHttpClientConnectionManager;
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.HttpContext;
import java.io.File;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.function.Supplier;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;

/**
* An HttpClient which works over a UnixSocket.
Expand All @@ -53,6 +54,8 @@
* @since 0.0.1
* @checkstyle ParameterNumber (150 lines)
* @checkstyle AnonInnerLength (150 lines)
* @todo #44:30min Connection pooling is currently hardcoded at 10 connections
* max. Figure out how to make this configurable.
*/
final class UnixHttpClient implements HttpClient {

Expand All @@ -66,9 +69,9 @@ final class UnixHttpClient implements HttpClient {
* @param socketFile Unix socket on disk.
*/
UnixHttpClient(final File socketFile) {
this(
HttpClientBuilder.create().setConnectionManager(
new BasicHttpClientConnectionManager(
this(() -> {
final PoolingHttpClientConnectionManager pool =
new PoolingHttpClientConnectionManager(
RegistryBuilder
.<ConnectionSocketFactory>create()
.register(
Expand Down Expand Up @@ -98,9 +101,21 @@ public Socket connectSocket(
}
})
.build()
)
).build()
);
);
pool.setDefaultMaxPerRoute(10);
pool.setMaxTotal(10);
return HttpClientBuilder.create()
.setConnectionManager(pool)
.build();
});
}

/**
* Ctor.
* @param client The HttpClient.
*/
UnixHttpClient(final Supplier<HttpClient> client) {
this(client.get());
}

/**
Expand Down
22 changes: 22 additions & 0 deletions src/test/java/com/amihaiemil/docker/UnixHttpClientTestCase.java
Expand Up @@ -41,6 +41,8 @@

import java.io.File;
import java.io.IOException;
import org.apache.http.client.methods.HttpGet;
import org.junit.Ignore;

/**
* Unit tests for UnixHttpClient.
Expand Down Expand Up @@ -297,4 +299,24 @@ public void executesRequestWithHostHandlerAndContext() throws IOException {
decorated, Mockito.times(1)
).execute(host, req, handler, context);
}

/**
* UnixHttpClient can be executed more than once without throwing a
* ConnectionPoolTimeoutException, demonstrating its connection-pooling
* capabilities.
* @throws IOException unexpected
* @see <a href="https://github.com/amihaiemil/docker-java-api/issues/44">bug</a>
* @todo #44:30min This should be un-ignored and refactored after #41 is
* done. The unix socket server needs to be spooled up, and the url
* changed accordingly.
*/
@Ignore
@Test
public void canBeReused() throws IOException {
final HttpClient client = new UnixHttpClient(
new File("/var/run/docker.sock")
);
client.execute(new HttpGet("http://localhost/ping"));
client.execute(new HttpGet("http://localhost/ping"));
}
}

0 comments on commit ba10997

Please sign in to comment.