Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,15 @@
import org.apache.commons.codec.digest.HmacUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.apache.http.Header;
import org.apache.http.HeaderElement;
import org.apache.http.HttpHost;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.StatusLine;
import org.apache.http.client.CookieStore;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
Expand Down Expand Up @@ -97,6 +99,12 @@ public class ApacheCloudStackClient {
*/
private int requestValidity = 30;

/**
* The http client connection timeout
* The default value is {@value #connectionTimeout} seconds .
*/
private int connectionTimeout = 60;

/**
* This parameter controls if the expiration of requests is activated or not.
* It is activated by default. The validity of requests if defined by {@value #requestValidity} property.
Expand Down Expand Up @@ -184,12 +192,24 @@ protected HttpContext createHttpContextWithAuthenticatedSessionUsingUserCredenti
return createHttpContextWithAuthenticatedSessionUsingUserCredentials(httpClient);
}

/**
* It creates a {@link RequestConfig} object with configured {@link #connectionTimeout} value.
* This can be used to set on a HttpClient its connect timeout, connection request timeout and socket timeout.
* @return returns the created RequestConfig object
*/
protected RequestConfig createRequestConfig() {
return RequestConfig.custom()
.setConnectTimeout(connectionTimeout * (int) DateUtils.MILLIS_PER_SECOND)
.setConnectionRequestTimeout(connectionTimeout * (int) DateUtils.MILLIS_PER_SECOND)
.setSocketTimeout(connectionTimeout * (int) DateUtils.MILLIS_PER_SECOND).build();
}

/**
* It creates an {@link CloseableHttpClient} object.
* If {@link #validateServerHttpsCertificate} indicates that we should not validate HTTPS server certificate, we use an insecure SSL factory; the insecure factory is created using {@link #createInsecureSslFactory()}.
*/
protected CloseableHttpClient createHttpClient() {
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create().setDefaultRequestConfig(createRequestConfig());
if (!validateServerHttpsCertificate) {
SSLConnectionSocketFactory sslsf = createInsecureSslFactory();
httpClientBuilder.setSSLSocketFactory(sslsf);
Expand Down Expand Up @@ -465,4 +485,8 @@ public void setRequestValidity(int requestValidity) {
public void setShouldRequestsExpire(boolean shouldRequestsExpire) {
this.shouldRequestsExpire = shouldRequestsExpire;
}

public void setConnectionTimeout(int connectionTimeout) {
this.connectionTimeout = connectionTimeout;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,15 @@
import br.com.autonomiccs.apacheCloudStack.client.beans.ApacheCloudStackUser;
import br.com.autonomiccs.apacheCloudStack.exceptions.ApacheCloudStackClientRequestRuntimeException;
import br.com.autonomiccs.apacheCloudStack.exceptions.ApacheCloudStackClientRuntimeException;
import org.apache.commons.lang3.time.DateUtils;
import org.apache.http.Header;
import org.apache.http.HeaderElement;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.CookieStore;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
Expand Down Expand Up @@ -133,6 +135,26 @@ public void executeRequestTestExceptionWhenExecutingRequest() throws IOException
Mockito.verify(httpClientMock).close();
}

private void testRequestConfig(final RequestConfig config, final int timeout) {
Assert.assertEquals(config.getConnectTimeout(), timeout * (int) DateUtils.MILLIS_PER_SECOND);
Assert.assertEquals(config.getConnectionRequestTimeout(), timeout * (int) DateUtils.MILLIS_PER_SECOND);
Assert.assertEquals(config.getSocketTimeout(), timeout * (int) DateUtils.MILLIS_PER_SECOND);
}

@Test
public void createRequestConfigDefaultTest() {
RequestConfig config = apacheCloudStackClient.createRequestConfig();
testRequestConfig(config, 60);
}

@Test
public void createRequestConfigCustomValueTest() {
int timeout = 30;
apacheCloudStackClient.setConnectionTimeout(timeout);
RequestConfig config = apacheCloudStackClient.createRequestConfig();
testRequestConfig(config, timeout);
}

@Test
public void createHttpClientTestValidateServerHttpsCertificateTrue() {
configureExecuteAndVerifyTestForCreateHttpClient(true, 0);
Expand All @@ -148,6 +170,7 @@ private void configureExecuteAndVerifyTestForCreateHttpClient(boolean shouldVeri
CloseableHttpClient httpClient = apacheCloudStackClient.createHttpClient();

Assert.assertNotNull(httpClient);
Mockito.verify(apacheCloudStackClient, Mockito.times(1)).createRequestConfig();
Mockito.verify(apacheCloudStackClient, Mockito.times(numberOfCreateUnsecureSslFactoryCalls)).createInsecureSslFactory();
}

Expand Down