diff --git a/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClient.java b/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClient.java index 2c1890f80..68e0eeddf 100644 --- a/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClient.java +++ b/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClient.java @@ -3,6 +3,7 @@ import com.github.dockerjava.transport.SSLConfig; import java.net.URI; +import java.time.Duration; import java.util.Objects; public final class ApacheDockerHttpClient extends ApacheDockerHttpClientImpl { @@ -15,6 +16,10 @@ public static final class Builder { private int maxConnections = Integer.MAX_VALUE; + private Duration connectionTimeout; + + private Duration responseTimeout; + public Builder dockerHost(URI value) { this.dockerHost = Objects.requireNonNull(value, "dockerHost"); return this; @@ -30,13 +35,24 @@ public Builder maxConnections(int value) { return this; } + public Builder connectionTimeout(Duration connectionTimeout) { + this.connectionTimeout = connectionTimeout; + return this; + } + + public Builder responseTimeout(Duration responseTimeout) { + this.responseTimeout = responseTimeout; + return this; + } + public ApacheDockerHttpClient build() { Objects.requireNonNull(dockerHost, "dockerHost"); - return new ApacheDockerHttpClient(dockerHost, sslConfig, maxConnections); + return new ApacheDockerHttpClient(dockerHost, sslConfig, maxConnections, connectionTimeout, responseTimeout); } } - private ApacheDockerHttpClient(URI dockerHost, SSLConfig sslConfig, int maxConnections) { - super(dockerHost, sslConfig, maxConnections); + private ApacheDockerHttpClient(URI dockerHost, SSLConfig sslConfig, int maxConnections, Duration connectionTimeout, + Duration responseTimeout) { + super(dockerHost, sslConfig, maxConnections, connectionTimeout, responseTimeout); } } diff --git a/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClientImpl.java b/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClientImpl.java index 174270f1e..c3fbc6755 100644 --- a/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClientImpl.java +++ b/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClientImpl.java @@ -5,6 +5,7 @@ import com.github.dockerjava.transport.NamedPipeSocket; import com.github.dockerjava.transport.SSLConfig; import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase; +import org.apache.hc.client5.http.config.RequestConfig; import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; import org.apache.hc.client5.http.impl.classic.HttpClients; @@ -36,8 +37,10 @@ import java.io.InputStream; import java.net.Socket; import java.net.URI; +import java.time.Duration; import java.util.List; import java.util.Map; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -49,7 +52,9 @@ class ApacheDockerHttpClientImpl implements DockerHttpClient { protected ApacheDockerHttpClientImpl( URI dockerHost, SSLConfig sslConfig, - int maxConnections + int maxConnections, + Duration connectionTimeout, + Duration responseTimeout ) { Registry socketFactoryRegistry = createConnectionSocketFactoryRegistry(sslConfig, dockerHost); @@ -90,9 +95,18 @@ protected ApacheDockerHttpClientImpl( ); connectionManager.setMaxTotal(maxConnections); connectionManager.setDefaultMaxPerRoute(maxConnections); + RequestConfig.Builder defaultRequest = RequestConfig.custom(); + if (connectionTimeout != null) { + defaultRequest.setConnectTimeout(connectionTimeout.toNanos(), TimeUnit.NANOSECONDS); + } + if (responseTimeout != null) { + defaultRequest.setResponseTimeout(responseTimeout.toNanos(), TimeUnit.NANOSECONDS); + } + httpClient = HttpClients.custom() .setRequestExecutor(new HijackingHttpRequestExecutor(null)) .setConnectionManager(connectionManager) + .setDefaultRequestConfig(defaultRequest.build()) .disableConnectionState() .build(); } diff --git a/docker-java-transport-zerodep/src/main/java/com/github/dockerjava/httpclient5/ZerodepDockerHttpClient.java b/docker-java-transport-zerodep/src/main/java/com/github/dockerjava/httpclient5/ZerodepDockerHttpClient.java index a0d2abaaf..fcacc6d1b 100644 --- a/docker-java-transport-zerodep/src/main/java/com/github/dockerjava/httpclient5/ZerodepDockerHttpClient.java +++ b/docker-java-transport-zerodep/src/main/java/com/github/dockerjava/httpclient5/ZerodepDockerHttpClient.java @@ -1,9 +1,9 @@ package com.github.dockerjava.httpclient5; -import com.github.dockerjava.transport.SSLConfig; - import java.net.URI; +import java.time.Duration; import java.util.Objects; +import com.github.dockerjava.transport.SSLConfig; @SuppressWarnings("unused") public final class ZerodepDockerHttpClient extends ApacheDockerHttpClientImpl { @@ -16,6 +16,10 @@ public static final class Builder { private int maxConnections = Integer.MAX_VALUE; + private Duration connectionTimeout; + + private Duration responseTimeout; + public Builder dockerHost(URI value) { this.dockerHost = Objects.requireNonNull(value, "dockerHost"); return this; @@ -31,13 +35,24 @@ public Builder maxConnections(int value) { return this; } + public Builder connectionTimeout(Duration connectionTimeout) { + this.connectionTimeout = connectionTimeout; + return this; + } + + public Builder responseTimeout(Duration responseTimeout) { + this.responseTimeout = responseTimeout; + return this; + } + public ZerodepDockerHttpClient build() { Objects.requireNonNull(dockerHost, "dockerHost"); - return new ZerodepDockerHttpClient(dockerHost, sslConfig, maxConnections); + return new ZerodepDockerHttpClient(dockerHost, sslConfig, maxConnections, connectionTimeout, responseTimeout); } } - protected ZerodepDockerHttpClient(URI dockerHost, SSLConfig sslConfig, int maxConnections) { - super(dockerHost, sslConfig, maxConnections); + private ZerodepDockerHttpClient(URI dockerHost, SSLConfig sslConfig, int maxConnections, Duration connectionTimeout, + Duration responseTimeout) { + super(dockerHost, sslConfig, maxConnections, connectionTimeout, responseTimeout); } } diff --git a/docs/getting_started.md b/docs/getting_started.md index c389fba71..012b721d4 100644 --- a/docs/getting_started.md +++ b/docs/getting_started.md @@ -91,6 +91,8 @@ DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder() .dockerHost(config.getDockerHost()) .sslConfig(config.getSSLConfig()) .maxConnections(100) + .connectionTimeout(Duration.ofSeconds(30)) + .responseTimeout(Duration.ofSeconds(45)) .build(); ```