Skip to content

Commit

Permalink
Merge pull request #12522 from Lakith-Rambukkanage/vMaster-conn-timeo…
Browse files Browse the repository at this point in the history
…ut-param

Add http client connection timeout tuning param config
  • Loading branch information
Lakith-Rambukkanage committed Aug 26, 2024
2 parents 3bb8a2d + 6a9ab67 commit 525c578
Show file tree
Hide file tree
Showing 7 changed files with 26 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public class HttpClientConfigurationDTO {

private int connectionLimit;
private int maximumConnectionsPerRoute;
private int connectionTimeout;
private boolean proxyEnabled;
private String proxyHost;
private int proxyPort;
Expand Down Expand Up @@ -87,13 +88,18 @@ public SSLContext getSslContext() {
return sslContext;
}

public int getConnectionTimeout() {
return connectionTimeout;
}

/**
* Builder class for @code{HTTPClientConfigurationDTO}
*/
public static class Builder {

private int connectionLimit;
private int maximumConnectionsPerRoute;
private int connectionTimeout;
private boolean proxyEnabled;
private String proxyHost;
private int proxyPort;
Expand All @@ -104,9 +110,11 @@ public static class Builder {
private SSLContext sslContext;
private HostnameVerifier hostnameVerifier;

public Builder withConnectionParams(int connectionLimit, int maximumConnectionsPerRoute) {
public Builder withConnectionParams(int connectionLimit, int maximumConnectionsPerRoute,
int connectionTimeout) {
this.connectionLimit = connectionLimit;
this.maximumConnectionsPerRoute = maximumConnectionsPerRoute;
this.connectionTimeout = connectionTimeout;
return this;
}

Expand Down Expand Up @@ -138,6 +146,7 @@ public HttpClientConfigurationDTO build() {
HttpClientConfigurationDTO configuration = new HttpClientConfigurationDTO();
configuration.connectionLimit = this.connectionLimit;
configuration.maximumConnectionsPerRoute = this.maximumConnectionsPerRoute;
configuration.connectionTimeout = this.connectionTimeout;
configuration.proxyEnabled = this.proxyEnabled;
configuration.proxyHost = this.proxyHost;
configuration.proxyPort = this.proxyPort;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ public static HttpClient getHttpClient(String protocol, HttpClientConfigurationD

int maxTotal = clientConfiguration.getConnectionLimit();
int defaultMaxPerRoute = clientConfiguration.getMaximumConnectionsPerRoute();
int connectionTimeout = clientConfiguration.getConnectionTimeout();

boolean proxyEnabled = clientConfiguration.isProxyEnabled();
String proxyHost = clientConfiguration.getProxyHost();
Expand All @@ -102,7 +103,10 @@ public static HttpClient getHttpClient(String protocol, HttpClientConfigurationD
pool.setMaxTotal(maxTotal);
pool.setDefaultMaxPerRoute(defaultMaxPerRoute);

RequestConfig params = RequestConfig.custom().build();
RequestConfig.Builder requestConfigBuilder = RequestConfig.custom();
requestConfigBuilder.setConnectTimeout(connectionTimeout);
RequestConfig params = requestConfigBuilder.build();

HttpClientBuilder clientBuilder = HttpClients.custom().setConnectionManager(pool)
.setDefaultRequestConfig(params);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ public class CommonAPIUtilTestCase {
private static ClientAndServer proxyServer;
int connectionLimit = 100;
int maximumConnectionsPerRoute = 10;
int connectionTimeout = -1;
static String trustStorePath = Objects.requireNonNull(CommonAPIUtilTestCase.class.getClassLoader()
.getResource("client-truststore.jks")).getPath();
static String trustStorePassword = "wso2carbon";
Expand Down Expand Up @@ -91,7 +92,7 @@ public void testGetHttpClientWithProxy() {
// directly to the backend.
HttpGet httpGetWithTLS = new HttpGet("http://localhost:" + mockServer.getPort() + "/hello");
HttpClientConfigurationDTO nonProxyHostBasedProxyConfig = builder
.withConnectionParams(connectionLimit, maximumConnectionsPerRoute)
.withConnectionParams(connectionLimit, maximumConnectionsPerRoute, connectionTimeout)
.withSSLContext(sslContext)
// proxyProtocol here is https (due to existing limitation)
.withProxy(proxyHost, proxyServer.getPort(), proxyUsername, "random", proxyProtocol,
Expand All @@ -109,7 +110,7 @@ public void testGetHttpClientWithProxy() {

// Given the proxy configuration, checks if the call is successfully routed via the proxy server.
HttpClientConfigurationDTO configuration = builder
.withConnectionParams(connectionLimit, maximumConnectionsPerRoute)
.withConnectionParams(connectionLimit, maximumConnectionsPerRoute, connectionTimeout)
.withSSLContext(sslContext)
.withProxy(proxyHost, proxyServer.getPort(), proxyUsername, proxyPassword, proxyProtocol, nonProxyHosts)
.build();
Expand All @@ -129,7 +130,7 @@ public void testGetHttpClientWithProxy() {

// Given the proxy configuration with wrong credentials, checks if the call fails at the proxy server.
HttpClientConfigurationDTO configWithWrongProxyCredentials = builder
.withConnectionParams(connectionLimit, maximumConnectionsPerRoute)
.withConnectionParams(connectionLimit, maximumConnectionsPerRoute, connectionTimeout)
.withSSLContext(sslContext)
.withProxy(proxyHost, proxyServer.getPort(), proxyUsername, "random", proxyProtocol, nonProxyHosts)
.build();
Expand All @@ -148,7 +149,7 @@ public void testGetHttpClientWithoutProxy() {
HttpGet httpsGet = new HttpGet("https://localhost:" + mockServer.getPort() + "/hello");
HttpClientConfigurationDTO.Builder builder = new HttpClientConfigurationDTO.Builder();
HttpClientConfigurationDTO configuration = builder
.withConnectionParams(connectionLimit, maximumConnectionsPerRoute)
.withConnectionParams(connectionLimit, maximumConnectionsPerRoute, connectionTimeout)
.withSSLContext(sslContext)
.build();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1512,6 +1512,7 @@ private OAuthConstants() {

public static final String HTTP_CLIENT_MAX_TOTAL = "HttpClient.MaxTotal";
public static final String HTTP_CLIENT_DEFAULT_MAX_PER_ROUTE = "HttpClient.DefaultMaxPerRoute";
public static final String HTTP_CLIENT_CONNECTION_TIMEOUT = "HttpClient.ConnectionTimeout";

public static final String PROXY_ENABLE = "ProxyConfig.Enable";
public static final String PROXY_HOST = "ProxyConfig.Host";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1022,6 +1022,7 @@ void populateHttpClientConfiguration() {

int maxTotal = Integer.parseInt(configuration.getFirstProperty(APIConstants.HTTP_CLIENT_MAX_TOTAL));
int defaultMaxPerRoute = Integer.parseInt(configuration.getFirstProperty(APIConstants.HTTP_CLIENT_DEFAULT_MAX_PER_ROUTE));
int connectionTimeout = Integer.parseInt(configuration.getFirstProperty(APIConstants.HTTP_CLIENT_CONNECTION_TIMEOUT));

boolean proxyEnabled = Boolean.parseBoolean(configuration.getFirstProperty(APIConstants.PROXY_ENABLE));

Expand Down Expand Up @@ -1071,7 +1072,8 @@ public boolean verify(String urlHostName, SSLSession session) {
default:
hostnameVerifier = new BrowserHostnameVerifier();
}
configuration.setHttpClientConfiguration(builder.withConnectionParams(maxTotal, defaultMaxPerRoute)
configuration.setHttpClientConfiguration(builder
.withConnectionParams(maxTotal, defaultMaxPerRoute, connectionTimeout)
.withSSLContext(sslContext, hostnameVerifier).build());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
"apim.api_quota_limit.enable": false,
"apim.http_client.max_total": "100",
"apim.http_client.default_max_per_route": "50",
"apim.http_client.connection_timeout": "-1",
"apim.key_manager.service_url": "https://localhost:${mgt.transport.https.port}${carbon.context}services/",
"apim.key_manager.username": "${admin.username}",
"apim.key_manager.password": "${admin.password}",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
<HttpClient>
<MaxTotal>{{apim.http_client.max_total}}</MaxTotal>
<DefaultMaxPerRoute>{{apim.http_client.default_max_per_route}}</DefaultMaxPerRoute>
<ConnectionTimeout>{{apim.http_client.connection_timeout}}</ConnectionTimeout>
</HttpClient>


Expand Down

0 comments on commit 525c578

Please sign in to comment.