Skip to content
This repository was archived by the owner on Dec 12, 2018. It is now read-only.

Commit cba6cae

Browse files
author
Jose Luis Barrueta
authored
Merge pull request #1268 from stormpath/Issue-1265
Issue 1265
2 parents bf79ba5 + 0132ecf commit cba6cae

File tree

4 files changed

+52
-31
lines changed

4 files changed

+52
-31
lines changed

extensions/httpclient/src/main/java/com/stormpath/sdk/impl/http/httpclient/HttpClientRequestExecutor.java

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
package com.stormpath.sdk.impl.http.httpclient;
1717

1818
import com.stormpath.sdk.client.AuthenticationScheme;
19-
import com.stormpath.sdk.impl.authc.credentials.ClientCredentials;
2019
import com.stormpath.sdk.client.Proxy;
20+
import com.stormpath.sdk.impl.authc.credentials.ClientCredentials;
2121
import com.stormpath.sdk.impl.http.HttpHeaders;
2222
import com.stormpath.sdk.impl.http.MediaType;
2323
import com.stormpath.sdk.impl.http.QueryString;
@@ -32,25 +32,28 @@
3232
import com.stormpath.sdk.impl.http.support.DefaultRequest;
3333
import com.stormpath.sdk.impl.http.support.DefaultResponse;
3434
import com.stormpath.sdk.lang.Assert;
35+
import org.apache.http.Consts;
3536
import org.apache.http.Header;
3637
import org.apache.http.HeaderElement;
3738
import org.apache.http.HttpEntity;
3839
import org.apache.http.HttpEntityEnclosingRequest;
3940
import org.apache.http.HttpHost;
4041
import org.apache.http.HttpResponse;
4142
import org.apache.http.HttpStatus;
42-
import org.apache.http.HttpVersion;
4343
import org.apache.http.NoHttpResponseException;
4444
import org.apache.http.auth.AuthScope;
45+
import org.apache.http.auth.Credentials;
4546
import org.apache.http.auth.UsernamePasswordCredentials;
47+
import org.apache.http.client.CredentialsProvider;
48+
import org.apache.http.client.HttpClient;
49+
import org.apache.http.client.config.RequestConfig;
4650
import org.apache.http.client.entity.GzipDecompressingEntity;
4751
import org.apache.http.client.methods.HttpRequestBase;
48-
import org.apache.http.client.params.AllClientPNames;
49-
import org.apache.http.client.params.ClientPNames;
52+
import org.apache.http.config.ConnectionConfig;
5053
import org.apache.http.conn.ConnectTimeoutException;
51-
import org.apache.http.conn.params.ConnRoutePNames;
52-
import org.apache.http.impl.client.DefaultHttpClient;
53-
import org.apache.http.impl.conn.PoolingClientConnectionManager;
54+
import org.apache.http.impl.client.BasicCredentialsProvider;
55+
import org.apache.http.impl.client.HttpClientBuilder;
56+
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
5457
import org.apache.http.util.EntityUtils;
5558
import org.slf4j.Logger;
5659
import org.slf4j.LoggerFactory;
@@ -93,7 +96,7 @@ public class HttpClientRequestExecutor implements RequestExecutor {
9396

9497
private final RequestAuthenticator requestAuthenticator;
9598

96-
private DefaultHttpClient httpClient;
99+
private HttpClient httpClient;
97100

98101
private BackoffStrategy backoffStrategy;
99102

@@ -150,9 +153,8 @@ public HttpClientRequestExecutor(ClientCredentials clientCredentials, Proxy prox
150153

151154
this.requestAuthenticator = factory.create(authenticationScheme, clientCredentials);
152155

153-
this.httpClientRequestFactory = new HttpClientRequestFactory();
156+
PoolingHttpClientConnectionManager connMgr = new PoolingHttpClientConnectionManager();
154157

155-
PoolingClientConnectionManager connMgr = new PoolingClientConnectionManager();
156158
if (MAX_CONNECTIONS_TOTAL >= MAX_CONNECTIONS_PER_ROUTE) {
157159
connMgr.setDefaultMaxPerRoute(MAX_CONNECTIONS_PER_ROUTE);
158160
connMgr.setMaxTotal(MAX_CONNECTIONS_TOTAL);
@@ -170,28 +172,34 @@ public HttpClientRequestExecutor(ClientCredentials clientCredentials, Proxy prox
170172
}
171173

172174
// The connectionTimeout value is specified in seconds in Stormpath configuration settings.
173-
// Therefore, multiply it by 1000 to be milliseconds since DefaultHttpClient expects milliseconds.
175+
// Therefore, multiply it by 1000 to be milliseconds since RequestConfig expects milliseconds.
174176
int connectionTimeoutAsMilliseconds = connectionTimeout * 1000;
175177

176-
this.httpClient = new DefaultHttpClient(connMgr);
177-
httpClient.getParams().setParameter(AllClientPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
178-
httpClient.getParams().setParameter(AllClientPNames.SO_TIMEOUT, connectionTimeoutAsMilliseconds);
179-
httpClient.getParams().setParameter(AllClientPNames.CONNECTION_TIMEOUT, connectionTimeoutAsMilliseconds);
180-
httpClient.getParams().setParameter(ClientPNames.HANDLE_REDIRECTS, false);
181-
httpClient.getParams().setParameter("http.protocol.content-charset", "UTF-8");
178+
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(connectionTimeoutAsMilliseconds)
179+
.setSocketTimeout(connectionTimeoutAsMilliseconds).setRedirectsEnabled(false).build();
180+
181+
ConnectionConfig connectionConfig = ConnectionConfig.custom().setCharset(Consts.UTF_8).build();
182+
183+
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create().setDefaultRequestConfig(requestConfig)
184+
.disableCookieManagement().setDefaultConnectionConfig(connectionConfig).setConnectionManager(connMgr);
185+
186+
this.httpClientRequestFactory = new HttpClientRequestFactory(requestConfig);
182187

183188
if (proxy != null) {
184189
//We have some proxy setting to use!
185190
HttpHost httpProxyHost = new HttpHost(proxy.getHost(), proxy.getPort());
186-
httpClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, httpProxyHost);
191+
httpClientBuilder.setProxy(httpProxyHost);
187192

188193
if (proxy.isAuthenticationRequired()) {
189-
httpClient.getCredentialsProvider().setCredentials(
190-
new AuthScope(proxy.getHost(), proxy.getPort()),
191-
new UsernamePasswordCredentials(proxy.getUsername(), proxy.getPassword()));
194+
AuthScope authScope = new AuthScope(proxy.getHost(), proxy.getPort());
195+
Credentials credentials = new UsernamePasswordCredentials(proxy.getUsername(), proxy.getPassword());
196+
CredentialsProvider credentialsProviderProvider = new BasicCredentialsProvider();
197+
credentialsProviderProvider.setCredentials(authScope, credentials);
198+
httpClientBuilder.setDefaultCredentialsProvider(credentialsProviderProvider);
192199
}
193-
194200
}
201+
202+
this.httpClient = httpClientBuilder.build();
195203
}
196204

197205
public int getNumRetries() {
@@ -213,7 +221,7 @@ public void setBackoffStrategy(BackoffStrategy backoffStrategy) {
213221
this.backoffStrategy = backoffStrategy;
214222
}
215223

216-
public void setHttpClient(DefaultHttpClient httpClient) {
224+
public void setHttpClient(HttpClient httpClient) {
217225
this.httpClient = httpClient;
218226
}
219227

extensions/httpclient/src/main/java/com/stormpath/sdk/impl/http/httpclient/HttpClientRequestFactory.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,11 @@
2020
import com.stormpath.sdk.impl.http.Request;
2121
import com.stormpath.sdk.impl.http.RestException;
2222
import com.stormpath.sdk.impl.util.RequestUtils;
23+
import com.stormpath.sdk.lang.Assert;
2324
import com.stormpath.sdk.lang.Strings;
2425
import org.apache.http.HttpEntity;
26+
import org.apache.http.HttpVersion;
27+
import org.apache.http.client.config.RequestConfig;
2528
import org.apache.http.client.methods.HttpDelete;
2629
import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
2730
import org.apache.http.client.methods.HttpGet;
@@ -30,7 +33,6 @@
3033
import org.apache.http.client.methods.HttpPut;
3134
import org.apache.http.client.methods.HttpRequestBase;
3235
import org.apache.http.entity.BufferedHttpEntity;
33-
import org.apache.http.params.CoreProtocolPNames;
3436

3537
import java.io.IOException;
3638
import java.io.InputStream;
@@ -45,6 +47,13 @@
4547
*/
4648
class HttpClientRequestFactory {
4749

50+
private final RequestConfig defaultRequestConfig;
51+
52+
HttpClientRequestFactory(RequestConfig defaultRequestConfig) {
53+
Assert.notNull(defaultRequestConfig, "defaultRequestConfig");
54+
this.defaultRequestConfig = defaultRequestConfig;
55+
}
56+
4857
/**
4958
* Creates an HttpClient method object based on the specified request and
5059
* populates any parameters, headers, etc. from the original request.
@@ -84,7 +93,7 @@ HttpRequestBase createHttpClientRequest(Request request, HttpEntity previousEnti
8493
// large amounts of data and want to find out as early as possible if an operation will fail. We
8594
// don't want to do this for all operations since it will cause extra latency in the network
8695
// interaction.
87-
base.getParams().setParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, true);
96+
base.setConfig(RequestConfig.copy(defaultRequestConfig).setExpectContinueEnabled(true).build());
8897

8998
if (previousEntity != null) {
9099
((HttpEntityEnclosingRequestBase)base).setEntity(previousEntity);
@@ -100,6 +109,8 @@ HttpRequestBase createHttpClientRequest(Request request, HttpEntity previousEnti
100109
throw new IllegalArgumentException("Unrecognized HttpMethod: " + method);
101110
}
102111

112+
base.setProtocolVersion(HttpVersion.HTTP_1_1);
113+
103114
applyHeaders(base, request);
104115

105116
return base;

extensions/httpclient/src/test/groovy/com/stormpath/sdk/client/ClientsTest.groovy

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,9 @@ public class ClientsTest {
5959
//match what is set in stormpath.properties since it can't be created/deleted while testing
6060
assertEquals client.dataStore.cacheManager.defaultTimeToLive, new Duration(300, TimeUnit.SECONDS)
6161
assertEquals client.dataStore.cacheManager.defaultTimeToIdle, new Duration(300, TimeUnit.SECONDS)
62-
assertEquals(client.dataStore.requestExecutor.httpClient.getParams().getParameter(AllClientPNames.SO_TIMEOUT), 30 * 1000)
63-
assertEquals(client.dataStore.requestExecutor.httpClient.getParams().getParameter(AllClientPNames.CONNECTION_TIMEOUT), 30 * 1000)
62+
63+
assertEquals(client.dataStore.requestExecutor.httpClient.defaultConfig.socketTimeout, 30 * 1000)
64+
assertEquals(client.dataStore.requestExecutor.httpClient.defaultConfig.connectTimeout, 30 * 1000)
6465
}
6566

6667
@Test
@@ -195,8 +196,9 @@ public class ClientsTest {
195196
def builder = Clients.builder().setConnectionTimeout(990)
196197
assertEquals(builder.clientConfig.connectionTimeout, 990)
197198
def client = builder.build()
198-
assertEquals(client.dataStore.requestExecutor.httpClient.getParams().getParameter(AllClientPNames.SO_TIMEOUT), 990000)
199-
assertEquals(client.dataStore.requestExecutor.httpClient.getParams().getParameter(AllClientPNames.CONNECTION_TIMEOUT), 990000)
199+
200+
assertEquals(client.dataStore.requestExecutor.httpClient.defaultConfig.socketTimeout, 990000)
201+
assertEquals(client.dataStore.requestExecutor.httpClient.defaultConfig.connectTimeout, 990000)
200202
}
201203

202204
/* @since 1.0.RC3 */

extensions/httpclient/src/test/groovy/com/stormpath/sdk/impl/client/DefaultClientTest.groovy

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,8 @@ class DefaultClientTest {
8181
Client client = new DefaultClient(apiKeyCredentials, apiKeyResolver, baseUrlResolver, proxy, cacheManager, authcScheme, null, connectionTimeout)
8282

8383
assertEquals(client.dataStore.requestExecutor.requestAuthenticator.apiKeyCredentials, apiKeyCredentials)
84-
assertEquals(client.dataStore.requestExecutor.httpClient.getParams().getParameter(AllClientPNames.SO_TIMEOUT), connectionTimeout * 1000)
85-
assertEquals(client.dataStore.requestExecutor.httpClient.getParams().getParameter(AllClientPNames.CONNECTION_TIMEOUT), connectionTimeout * 1000)
84+
assertEquals(client.dataStore.requestExecutor.httpClient.defaultConfig.socketTimeout, connectionTimeout * 1000)
85+
assertEquals(client.dataStore.requestExecutor.httpClient.defaultConfig.connectTimeout, connectionTimeout * 1000)
8686

8787
verify(apiKeyCredentials, proxy, cacheManager)
8888
}

0 commit comments

Comments
 (0)