Skip to content

Commit 629582c

Browse files
[JAVA-15036] Upgraded to apache client 5.2 (#13334)
Co-authored-by: panagiotiskakos <panagiotis.kakos@libra-is.com>
1 parent e6685e5 commit 629582c

2 files changed

Lines changed: 233 additions & 75 deletions

File tree

Lines changed: 117 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,129 +1,171 @@
11
package com.baeldung.httpclient;
22

3+
import static org.hamcrest.MatcherAssert.assertThat;
34
import static org.hamcrest.Matchers.equalTo;
4-
import static org.junit.Assert.assertThat;
5+
import static org.junit.jupiter.api.Assertions.assertThrows;
6+
import static org.mockito.Mockito.when;
7+
8+
import org.junit.jupiter.api.Disabled;
9+
import org.junit.jupiter.api.Test;
10+
511

612
import java.io.IOException;
713
import java.util.Timer;
814
import java.util.TimerTask;
15+
import java.util.concurrent.TimeUnit;
916

10-
import org.apache.http.HttpResponse;
11-
import org.apache.http.client.config.RequestConfig;
12-
import org.apache.http.client.methods.CloseableHttpResponse;
13-
import org.apache.http.client.methods.HttpGet;
14-
import org.apache.http.client.params.ClientPNames;
15-
import org.apache.http.config.SocketConfig;
16-
import org.apache.http.conn.ConnectTimeoutException;
17-
import org.apache.http.impl.client.CloseableHttpClient;
18-
import org.apache.http.impl.client.DefaultHttpClient;
19-
import org.apache.http.impl.client.HttpClientBuilder;
20-
import org.apache.http.params.CoreConnectionPNames;
21-
import org.apache.http.params.HttpParams;
22-
import org.junit.After;
23-
import org.junit.Ignore;
24-
import org.junit.Test;
25-
26-
public class HttpClientTimeoutLiveTest {
27-
28-
private CloseableHttpResponse response;
29-
30-
@After
31-
public final void after() throws IllegalStateException, IOException {
32-
ResponseUtil.closeResponse(response);
33-
}
17+
import org.apache.hc.client5.http.ConnectTimeoutException;
18+
import org.apache.hc.client5.http.classic.methods.HttpGet;
19+
import org.apache.hc.client5.http.config.ConnectionConfig;
20+
import org.apache.hc.client5.http.config.RequestConfig;
21+
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
22+
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
23+
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
3424

35-
// tests
36-
@Test
37-
public final void givenUsingOldApi_whenSettingTimeoutViaParameter_thenCorrect() throws IOException {
38-
39-
DefaultHttpClient httpClient = new DefaultHttpClient();
40-
int timeout = 5; // seconds
41-
HttpParams httpParams = httpClient.getParams();
42-
httpParams.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, timeout * 1000);
43-
httpParams.setParameter(CoreConnectionPNames.SO_TIMEOUT, timeout * 1000);
44-
httpParams.setParameter(ClientPNames.CONN_MANAGER_TIMEOUT, new Long(timeout * 1000));
45-
46-
final HttpGet request = new HttpGet("http://www.github.com");
47-
HttpResponse execute = httpClient.execute(request);
48-
assertThat(execute.getStatusLine().getStatusCode(), equalTo(200));
49-
}
25+
import org.apache.hc.client5.http.impl.io.BasicHttpClientConnectionManager;
5026

51-
@Test
52-
public final void givenUsingNewApi_whenSettingTimeoutViaRequestConfig_thenCorrect() throws IOException {
53-
final int timeout = 2;
54-
final RequestConfig config = RequestConfig.custom().setConnectTimeout(timeout * 1000).setConnectionRequestTimeout(timeout * 1000).setSocketTimeout(timeout * 1000).build();
55-
final CloseableHttpClient client = HttpClientBuilder.create().setDefaultRequestConfig(config).build();
56-
final HttpGet request = new HttpGet("http://www.github.com");
27+
import org.apache.hc.core5.http.HttpStatus;
28+
import org.apache.hc.core5.http.io.SocketConfig;
29+
import org.apache.hc.core5.util.Timeout;
5730

58-
response = client.execute(request);
5931

60-
assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
61-
}
32+
import com.baeldung.handler.CustomHttpClientResponseHandler;
33+
34+
class HttpClientTimeoutLiveTest {
6235

6336
@Test
64-
public final void givenUsingNewApi_whenSettingTimeoutViaSocketConfig_thenCorrect() throws IOException {
37+
void givenUsingNewApi_whenSettingTimeoutViaHighLevelApi_thenCorrect() throws IOException {
6538
final int timeout = 2;
6639

67-
final SocketConfig config = SocketConfig.custom().setSoTimeout(timeout * 1000).build();
68-
final CloseableHttpClient client = HttpClientBuilder.create().setDefaultSocketConfig(config).build();
40+
ConnectionConfig connConfig = ConnectionConfig.custom()
41+
.setConnectTimeout(timeout, TimeUnit.MILLISECONDS)
42+
.setSocketTimeout(timeout, TimeUnit.MILLISECONDS)
43+
.build();
44+
45+
RequestConfig requestConfig = RequestConfig.custom()
46+
.setConnectionRequestTimeout(Timeout.ofMilliseconds(2000L))
47+
.build();
48+
49+
BasicHttpClientConnectionManager cm = new BasicHttpClientConnectionManager();
50+
cm.setConnectionConfig(connConfig);
51+
6952

7053
final HttpGet request = new HttpGet("http://www.github.com");
7154

72-
response = client.execute(request);
55+
try (CloseableHttpClient client = HttpClientBuilder.create()
56+
.setDefaultRequestConfig(requestConfig)
57+
.setConnectionManager(cm)
58+
.build();
59+
60+
CloseableHttpResponse response = (CloseableHttpResponse) client
61+
.execute(request, new CustomHttpClientResponseHandler())) {
7362

74-
assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
63+
final int statusCode = response.getCode();
64+
assertThat(statusCode, equalTo(HttpStatus.SC_OK));
65+
}
7566
}
7667

7768
@Test
78-
public final void givenUsingNewApi_whenSettingTimeoutViaHighLevelApi_thenCorrect() throws IOException {
79-
final int timeout = 5;
69+
void givenUsingNewApi_whenSettingTimeoutViaSocketConfig_thenCorrect() throws IOException {
70+
final int timeout = 2000;
71+
final SocketConfig config = SocketConfig.custom().setSoTimeout(timeout, TimeUnit.MILLISECONDS).build();
8072

81-
final RequestConfig config = RequestConfig.custom().setConnectTimeout(timeout * 1000).setConnectionRequestTimeout(timeout * 1000).setSocketTimeout(timeout * 1000).build();
82-
final CloseableHttpClient client = HttpClientBuilder.create().setDefaultRequestConfig(config).build();
73+
BasicHttpClientConnectionManager cm = new BasicHttpClientConnectionManager();
74+
cm.setSocketConfig(config);
8375

8476
final HttpGet request = new HttpGet("http://www.github.com");
8577

86-
response = client.execute(request);
78+
try (CloseableHttpClient client = HttpClientBuilder.create()
79+
.setConnectionManager(cm)
80+
.build();
8781

88-
assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
82+
CloseableHttpResponse response = (CloseableHttpResponse) client
83+
.execute(request, new CustomHttpClientResponseHandler())) {
84+
85+
final int statusCode = response.getCode();
86+
assertThat(statusCode, equalTo(HttpStatus.SC_OK));
87+
}
8988
}
9089

90+
9191
/**
9292
* This simulates a timeout against a domain with multiple routes/IPs to it (not a single raw IP)
9393
*/
94-
@Test(expected = ConnectTimeoutException.class)
95-
@Ignore
96-
public final void givenTimeoutIsConfigured_whenTimingOut_thenTimeoutException() throws IOException {
94+
@Disabled
95+
void givenTimeoutIsConfigured_whenTimingOut_thenTimeoutException() throws IOException {
9796
final int timeout = 3;
9897

99-
final RequestConfig config = RequestConfig.custom().setConnectTimeout(timeout * 1000).setConnectionRequestTimeout(timeout * 1000).setSocketTimeout(timeout * 1000).build();
100-
final CloseableHttpClient client = HttpClientBuilder.create().setDefaultRequestConfig(config).build();
98+
ConnectionConfig connConfig = ConnectionConfig.custom()
99+
.setConnectTimeout(timeout, TimeUnit.MILLISECONDS)
100+
.setSocketTimeout(timeout, TimeUnit.MILLISECONDS)
101+
.build();
102+
103+
RequestConfig requestConfig = RequestConfig.custom()
104+
.setConnectionRequestTimeout(Timeout.ofMilliseconds(3000L))
105+
.build();
106+
107+
BasicHttpClientConnectionManager cm = new BasicHttpClientConnectionManager();
108+
cm.setConnectionConfig(connConfig);
101109

102110
final HttpGet request = new HttpGet("http://www.google.com:81");
103-
client.execute(request);
111+
112+
assertThrows(ConnectTimeoutException.class, () -> {
113+
try (CloseableHttpClient client = HttpClientBuilder.create()
114+
.setDefaultRequestConfig(requestConfig)
115+
.setConnectionManager(cm)
116+
.build();
117+
118+
CloseableHttpResponse response = (CloseableHttpResponse) client
119+
.execute(request, new CustomHttpClientResponseHandler())) {
120+
121+
final int statusCode = response.getCode();
122+
assertThat(statusCode, equalTo(HttpStatus.SC_OK));
123+
}
124+
});
104125
}
105126

106127
@Test
107-
public void whenSecuredRestApiIsConsumed_then200OK() throws IOException {
108-
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
128+
void whenSecuredRestApiIsConsumed_then200OK() throws IOException {
129+
int timeout = 20000; // milliseconds
130+
131+
ConnectionConfig connConfig = ConnectionConfig.custom()
132+
.setConnectTimeout(timeout, TimeUnit.MILLISECONDS)
133+
.setSocketTimeout(timeout, TimeUnit.MILLISECONDS)
134+
.build();
135+
136+
RequestConfig requestConfig = RequestConfig.custom()
137+
.setConnectionRequestTimeout(Timeout.ofMilliseconds(20000L))
138+
.build();
109139

110-
int timeout = 20; // seconds
111-
RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(timeout * 1000)
112-
.setConnectTimeout(timeout * 1000).setSocketTimeout(timeout * 1000).build();
113140
HttpGet getMethod = new HttpGet("http://localhost:8082/httpclient-simple/api/bars/1");
114141
getMethod.setConfig(requestConfig);
115142

116-
int hardTimeout = 5; // seconds
143+
144+
BasicHttpClientConnectionManager cm = new BasicHttpClientConnectionManager();
145+
cm.setConnectionConfig(connConfig);
146+
147+
int hardTimeout = 5000; // milliseconds
117148
TimerTask task = new TimerTask() {
118149
@Override
119150
public void run() {
120151
getMethod.abort();
121152
}
122153
};
123-
new Timer(true).schedule(task, hardTimeout * 1000);
154+
new Timer(true).schedule(task, hardTimeout);
155+
156+
try (CloseableHttpClient client = HttpClientBuilder.create()
157+
.setDefaultRequestConfig(requestConfig)
158+
.setConnectionManager(cm)
159+
.build();
160+
161+
CloseableHttpResponse response = (CloseableHttpResponse) client
162+
.execute(getMethod, new CustomHttpClientResponseHandler())) {
163+
164+
final int statusCode = response.getCode();
165+
System.out.println("HTTP Status of response: " + statusCode);
166+
assertThat(statusCode, equalTo(HttpStatus.SC_OK));
167+
}
124168

125-
HttpResponse response = httpClient.execute(getMethod);
126-
System.out.println("HTTP Status of response: " + response.getStatusLine().getStatusCode());
127169
}
128170

129171
}
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
package com.baeldung.httpclient;
2+
3+
import static org.hamcrest.MatcherAssert.assertThat;
4+
import static org.hamcrest.Matchers.equalTo;
5+
import static org.junit.jupiter.api.Assertions.assertThrows;
6+
7+
import java.io.IOException;
8+
import java.util.Timer;
9+
import java.util.TimerTask;
10+
11+
import org.apache.http.HttpResponse;
12+
import org.apache.http.client.config.RequestConfig;
13+
import org.apache.http.client.methods.CloseableHttpResponse;
14+
import org.apache.http.client.methods.HttpGet;
15+
import org.apache.http.config.SocketConfig;
16+
import org.apache.http.conn.ConnectTimeoutException;
17+
import org.apache.http.impl.client.CloseableHttpClient;
18+
import org.apache.http.impl.client.HttpClientBuilder;
19+
20+
import org.junit.jupiter.api.AfterEach;
21+
import org.junit.jupiter.api.Disabled;
22+
import org.junit.jupiter.api.Test;
23+
24+
class HttpClientTimeoutV4LiveTest {
25+
26+
private CloseableHttpResponse response;
27+
28+
@AfterEach
29+
public final void after() throws IllegalStateException, IOException {
30+
ResponseUtil.closeResponse(response);
31+
}
32+
33+
34+
@Test
35+
void givenUsingNewApi_whenSettingTimeoutViaRequestConfig_thenCorrect() throws IOException {
36+
final int timeout = 2;
37+
final RequestConfig config = RequestConfig.custom().setConnectTimeout(timeout * 1000).setConnectionRequestTimeout(timeout * 1000).setSocketTimeout(timeout * 1000).build();
38+
final CloseableHttpClient client = HttpClientBuilder.create().setDefaultRequestConfig(config).build();
39+
final HttpGet request = new HttpGet("http://www.github.com");
40+
41+
response = client.execute(request);
42+
43+
assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
44+
}
45+
46+
@Test
47+
void givenUsingNewApi_whenSettingTimeoutViaSocketConfig_thenCorrect() throws IOException {
48+
final int timeout = 2;
49+
50+
final SocketConfig config = SocketConfig.custom().setSoTimeout(timeout * 1000).build();
51+
final CloseableHttpClient client = HttpClientBuilder.create().setDefaultSocketConfig(config).build();
52+
53+
final HttpGet request = new HttpGet("http://www.github.com");
54+
55+
response = client.execute(request);
56+
57+
assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
58+
}
59+
60+
@Test
61+
void givenUsingNewApi_whenSettingTimeoutViaHighLevelApi_thenCorrect() throws IOException {
62+
final int timeout = 5;
63+
64+
final RequestConfig config = RequestConfig.custom().setConnectTimeout(timeout * 1000).setConnectionRequestTimeout(timeout * 1000).setSocketTimeout(timeout * 1000).build();
65+
final CloseableHttpClient client = HttpClientBuilder.create().setDefaultRequestConfig(config).build();
66+
67+
final HttpGet request = new HttpGet("http://www.github.com");
68+
69+
response = client.execute(request);
70+
71+
assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
72+
}
73+
74+
/**
75+
* This simulates a timeout against a domain with multiple routes/IPs to it (not a single raw IP)
76+
*/
77+
@Test
78+
@Disabled
79+
public final void givenTimeoutIsConfigured_whenTimingOut_thenTimeoutException() throws IOException {
80+
final int timeout = 3;
81+
82+
final RequestConfig config = RequestConfig.custom().setConnectTimeout(timeout * 1000).setConnectionRequestTimeout(timeout * 1000).setSocketTimeout(timeout * 1000).build();
83+
final CloseableHttpClient client = HttpClientBuilder.create().setDefaultRequestConfig(config).build();
84+
85+
final HttpGet request = new HttpGet("http://www.google.com:81");
86+
87+
assertThrows(ConnectTimeoutException.class, () -> {
88+
client.execute(request);
89+
});
90+
91+
}
92+
93+
@Test
94+
void whenSecuredRestApiIsConsumed_then200OK() throws IOException {
95+
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
96+
97+
int timeout = 20; // seconds
98+
RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(timeout * 1000)
99+
.setConnectTimeout(timeout * 1000).setSocketTimeout(timeout * 1000).build();
100+
HttpGet getMethod = new HttpGet("http://localhost:8082/httpclient-simple/api/bars/1");
101+
getMethod.setConfig(requestConfig);
102+
103+
int hardTimeout = 5; // seconds
104+
TimerTask task = new TimerTask() {
105+
@Override
106+
public void run() {
107+
getMethod.abort();
108+
}
109+
};
110+
new Timer(true).schedule(task, hardTimeout * 1000);
111+
112+
HttpResponse response = httpClient.execute(getMethod);
113+
System.out.println("HTTP Status of response: " + response.getStatusLine().getStatusCode());
114+
}
115+
116+
}

0 commit comments

Comments
 (0)