diff --git a/src/main/java/Diadoc/Api/ConnectionSettings.java b/src/main/java/Diadoc/Api/ConnectionSettings.java index 43dcfda8..e1b374b1 100644 --- a/src/main/java/Diadoc/Api/ConnectionSettings.java +++ b/src/main/java/Diadoc/Api/ConnectionSettings.java @@ -4,8 +4,12 @@ public class ConnectionSettings { private int maxTotalConnections; private int maxConnectionsPerRoute; + private int connectionRequestTimeout; + private int connectTimeout; + private int socketTimeout; - public ConnectionSettings(int maxTotalConnections, int maxConnectionsPerRoute) { + public ConnectionSettings(int maxTotalConnections, int maxConnectionsPerRoute, + int connectionRequestTimeout, int connectTimeout, int socketTimeout) { var maxConnections = 10; if(maxTotalConnections > maxConnections || maxConnectionsPerRoute > maxConnections){ throw new IllegalArgumentException("Max connections can't be more " + maxConnections); @@ -13,6 +17,9 @@ public ConnectionSettings(int maxTotalConnections, int maxConnectionsPerRoute) { this.maxTotalConnections = maxTotalConnections; this.maxConnectionsPerRoute = maxConnectionsPerRoute; + this.connectionRequestTimeout = connectionRequestTimeout; + this.connectTimeout = connectTimeout; + this.socketTimeout = socketTimeout; } public int getMaxTotalConnections() { @@ -22,4 +29,16 @@ public int getMaxTotalConnections() { public int getMaxConnectionsPerRoute() { return maxConnectionsPerRoute; } + + public int getConnectionRequestTimeout() { + return connectionRequestTimeout; + } + + public int getConnectTimeout() { + return connectTimeout; + } + + public int getSocketTimeout() { + return socketTimeout; + } } diff --git a/src/main/java/Diadoc/Api/httpClient/DiadocHttpClient.java b/src/main/java/Diadoc/Api/httpClient/DiadocHttpClient.java index 365efd8d..d1e724b2 100644 --- a/src/main/java/Diadoc/Api/httpClient/DiadocHttpClient.java +++ b/src/main/java/Diadoc/Api/httpClient/DiadocHttpClient.java @@ -15,6 +15,7 @@ import org.apache.http.client.methods.RequestBuilder; import org.apache.http.client.utils.URIBuilder; import org.apache.http.config.RegistryBuilder; +import org.apache.http.config.SocketConfig; import org.apache.http.conn.socket.ConnectionSocketFactory; import org.apache.http.conn.socket.PlainConnectionSocketFactory; import org.apache.http.conn.ssl.NoopHostnameVerifier; @@ -40,6 +41,7 @@ public class DiadocHttpClient { private CloseableHttpClient httpClient; private String baseUrl; + private ConnectionSettings connectionSettings; public DiadocHttpClient( CredentialsProvider credentialsProvider, @@ -56,6 +58,10 @@ public DiadocHttpClient( if(connectionSettings != null) { connectionManager.setMaxTotal(connectionSettings.getMaxTotalConnections()); connectionManager.setDefaultMaxPerRoute(connectionSettings.getMaxConnectionsPerRoute()); + // https://issues.apache.org/jira/browse/HTTPCLIENT-1478 + if (connectionSettings.getConnectTimeout() > 0) { + connectionManager.setDefaultSocketConfig(SocketConfig.custom().setSoTimeout(connectionSettings.getConnectTimeout()).build()); + } } var httpClientBuilder = HttpClients .custom() @@ -72,6 +78,7 @@ public DiadocHttpClient( httpClient = httpClientBuilder.build(); this.baseUrl = baseUrl; + this.connectionSettings = connectionSettings; } public String getBaseUrl() { @@ -146,7 +153,19 @@ private DiadocResponseInfo getRawResponse(HttpResponse response) throws IOExcept } private HttpUriRequest createRequest(RequestBuilder requestBuilder) { - var requestConfig = RequestConfig.custom().setAuthenticationEnabled(false).build(); + var requestConfigBuilder = RequestConfig.custom(); + if (connectionSettings != null) { + if (connectionSettings.getSocketTimeout() > 0) { + requestConfigBuilder.setSocketTimeout(connectionSettings.getSocketTimeout()); + } + if (connectionSettings.getConnectTimeout() > 0) { + requestConfigBuilder.setConnectTimeout(connectionSettings.getConnectTimeout()); + } + if (connectionSettings.getConnectionRequestTimeout() > 0) { + requestConfigBuilder.setConnectionRequestTimeout(connectionSettings.getConnectionRequestTimeout()); + } + } + var requestConfig = requestConfigBuilder.setAuthenticationEnabled(false).build(); return requestBuilder.setConfig(requestConfig).build(); }