Skip to content

Commit bfcc051

Browse files
Adopt apache http client 5
LMCROSSITXSADEPLOY-1549
1 parent ed0670b commit bfcc051

18 files changed

Lines changed: 231 additions & 394 deletions

File tree

multiapps-controller-core-test/pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414

1515
<dependencies>
1616
<dependency>
17-
<groupId>org.apache.httpcomponents</groupId>
18-
<artifactId>httpclient</artifactId>
17+
<groupId>org.apache.httpcomponents.client5</groupId>
18+
<artifactId>httpclient5</artifactId>
1919
</dependency>
2020
<dependency>
2121
<groupId>org.cloudfoundry.multiapps</groupId>

multiapps-controller-core-test/src/main/java/module-info.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
exports org.cloudfoundry.multiapps.controller.core.test;
44

5-
requires transitive org.apache.httpcomponents.httpcore;
65
requires transitive org.cloudfoundry.multiapps.mta;
76

8-
requires org.apache.httpcomponents.httpclient;
7+
requires org.apache.httpcomponents.client5.httpclient5;
8+
requires org.apache.httpcomponents.core5.httpcore5;
99
requires org.cloudfoundry.multiapps.common;
1010
requires org.cloudfoundry.multiapps.common.test;
1111
requires org.junit.jupiter.api;

multiapps-controller-core-test/src/main/java/org/cloudfoundry/multiapps/controller/core/test/HttpClientMock.java

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22

33
import java.io.IOException;
44
import java.util.List;
5-
6-
import org.apache.http.HttpHost;
7-
import org.apache.http.HttpResponse;
8-
import org.apache.http.client.ResponseHandler;
9-
import org.apache.http.impl.client.CloseableHttpClient;
10-
import org.apache.http.protocol.HttpContext;
5+
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
6+
import org.apache.hc.core5.http.ClassicHttpRequest;
7+
import org.apache.hc.core5.http.HttpHost;
8+
import org.apache.hc.core5.http.HttpResponse;
9+
import org.apache.hc.core5.http.io.HttpClientResponseHandler;
10+
import org.apache.hc.core5.http.protocol.HttpContext;
1111
import org.cloudfoundry.multiapps.common.Nullable;
1212
import org.immutables.value.Value;
1313
import org.mockito.ArgumentMatchers;
@@ -23,9 +23,6 @@ public abstract class HttpClientMock {
2323
@Nullable
2424
public abstract Throwable getException();
2525

26-
@Nullable
27-
public abstract String getResponseHandlerReturnValue();
28-
2926
@Value.Derived
3027
public CloseableHttpClient getMock() {
3128
try {
@@ -49,12 +46,10 @@ public CloseableHttpClient getMock() {
4946
Mockito.when(httpClient.execute(ArgumentMatchers.<HttpHost> any(), ArgumentMatchers.any(),
5047
ArgumentMatchers.<HttpContext> any()))
5148
.thenAnswer(answer);
49+
Mockito.when(
50+
httpClient.execute(ArgumentMatchers.<ClassicHttpRequest> any(), ArgumentMatchers.<HttpClientResponseHandler<Object>> any()))
51+
.thenAnswer(answer);
5252

53-
if (getResponseHandlerReturnValue() != null) {
54-
Mockito.when(httpClient.execute(ArgumentMatchers.any(), ArgumentMatchers.any(),
55-
ArgumentMatchers.<ResponseHandler<Object>> any()))
56-
.thenReturn(getResponseHandlerReturnValue());
57-
}
5853
return httpClient;
5954
} catch (IOException e) {
6055
throw new IllegalStateException(e);

multiapps-controller-core-test/src/main/java/org/cloudfoundry/multiapps/controller/core/test/HttpMocks.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
package org.cloudfoundry.multiapps.controller.core.test;
22

33
import java.util.function.UnaryOperator;
4-
5-
import org.apache.http.client.methods.CloseableHttpResponse;
6-
import org.apache.http.impl.client.CloseableHttpClient;
4+
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
5+
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
76

87
public class HttpMocks {
98

multiapps-controller-core-test/src/main/java/org/cloudfoundry/multiapps/controller/core/test/HttpResponseMock.java

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,12 @@
33
import java.nio.charset.StandardCharsets;
44
import java.util.Map;
55
import java.util.Map.Entry;
6-
7-
import org.apache.http.Header;
8-
import org.apache.http.HttpEntity;
9-
import org.apache.http.HttpResponse;
10-
import org.apache.http.ProtocolVersion;
11-
import org.apache.http.StatusLine;
12-
import org.apache.http.client.methods.CloseableHttpResponse;
13-
import org.apache.http.entity.StringEntity;
14-
import org.apache.http.message.BasicHeader;
15-
import org.apache.http.message.BasicStatusLine;
6+
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
7+
import org.apache.hc.core5.http.Header;
8+
import org.apache.hc.core5.http.HttpEntity;
9+
import org.apache.hc.core5.http.HttpResponse;
10+
import org.apache.hc.core5.http.io.entity.StringEntity;
11+
import org.apache.hc.core5.http.message.BasicHeader;
1612
import org.immutables.value.Value;
1713
import org.mockito.Mockito;
1814

@@ -28,18 +24,14 @@ public abstract class HttpResponseMock {
2824
@Value.Derived
2925
public CloseableHttpResponse getMock() {
3026
CloseableHttpResponse response = Mockito.mock(CloseableHttpResponse.class);
31-
Mockito.when(response.getStatusLine())
32-
.thenReturn(createStatusLine(getStatusCode()));
27+
Mockito.when(response.getCode())
28+
.thenReturn(getStatusCode());
3329
Mockito.when(response.getEntity())
3430
.thenReturn(createHttpEntity(getBody()));
3531
mockHeaders(response);
3632
return response;
3733
}
3834

39-
private static StatusLine createStatusLine(int statusCode) {
40-
return new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), statusCode, null);
41-
}
42-
4335
private static HttpEntity createHttpEntity(String body) {
4436
return new StringEntity(body, StandardCharsets.UTF_8);
4537
}

multiapps-controller-core/pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,5 +111,9 @@
111111
<groupId>jakarta.inject</groupId>
112112
<artifactId>jakarta.inject-api</artifactId>
113113
</dependency>
114+
<dependency>
115+
<groupId>org.apache.httpcomponents.client5</groupId>
116+
<artifactId>httpclient5</artifactId>
117+
</dependency>
114118
</dependencies>
115119
</project>

multiapps-controller-core/src/main/java/module-info.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@
5959
requires org.apache.commons.collections4;
6060
requires org.apache.commons.io;
6161
requires org.apache.commons.lang3;
62-
requires org.apache.httpcomponents.httpclient;
63-
requires org.apache.httpcomponents.httpcore;
62+
requires org.apache.httpcomponents.client5.httpclient5;
63+
requires org.apache.httpcomponents.core5.httpcore5;
6464
requires org.cloudfoundry.multiapps.common;
6565
requires org.cloudfoundry.multiapps.controller.api;
6666
requires org.slf4j;

multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/CloudControllerHeaderConfiguration.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
package org.cloudfoundry.multiapps.controller.core.cf;
22

33
import java.util.Map;
4-
54
import org.apache.commons.lang3.RandomStringUtils;
65
import org.apache.commons.lang3.StringUtils;
7-
import org.apache.http.HttpHeaders;
6+
import org.apache.hc.core5.http.HttpHeaders;
87
import org.cloudfoundry.multiapps.controller.core.Constants;
98

109
public class CloudControllerHeaderConfiguration {

multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/http/CookieSpecification.java

Lines changed: 0 additions & 45 deletions
This file was deleted.

multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/http/CsrfHttpClient.java

Lines changed: 39 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1,105 +1,54 @@
11
package org.cloudfoundry.multiapps.controller.core.http;
22

3-
import java.io.Closeable;
43
import java.io.IOException;
5-
import java.util.Arrays;
64
import java.util.List;
75
import java.util.Map;
86
import java.util.Map.Entry;
9-
10-
import org.apache.http.Header;
11-
import org.apache.http.HttpHost;
12-
import org.apache.http.HttpRequest;
13-
import org.apache.http.HttpResponse;
14-
import org.apache.http.HttpStatus;
15-
import org.apache.http.client.HttpClient;
16-
import org.apache.http.client.ResponseHandler;
17-
import org.apache.http.client.methods.HttpGet;
18-
import org.apache.http.client.methods.HttpHead;
19-
import org.apache.http.client.methods.HttpOptions;
20-
import org.apache.http.client.methods.HttpUriRequest;
21-
import org.apache.http.conn.ClientConnectionManager;
22-
import org.apache.http.params.HttpParams;
23-
import org.apache.http.protocol.HttpContext;
24-
import org.apache.http.util.EntityUtils;
25-
26-
public class CsrfHttpClient implements HttpClient, Closeable {
7+
import org.apache.hc.client5.http.classic.methods.HttpGet;
8+
import org.apache.hc.client5.http.classic.methods.HttpHead;
9+
import org.apache.hc.client5.http.classic.methods.HttpOptions;
10+
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
11+
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
12+
import org.apache.hc.core5.http.ClassicHttpRequest;
13+
import org.apache.hc.core5.http.ClassicHttpResponse;
14+
import org.apache.hc.core5.http.Header;
15+
import org.apache.hc.core5.http.HttpHost;
16+
import org.apache.hc.core5.http.HttpRequest;
17+
import org.apache.hc.core5.http.HttpStatus;
18+
import org.apache.hc.core5.http.io.entity.EntityUtils;
19+
import org.apache.hc.core5.http.protocol.HttpContext;
20+
import org.apache.hc.core5.io.CloseMode;
21+
22+
public class CsrfHttpClient extends CloseableHttpClient {
2723

2824
public static final String CSRF_TOKEN_HEADER_NAME = "X-CSRF-TOKEN";
2925
public static final String CSRF_TOKEN_HEADER_FETCH_VALUE = "Fetch";
3026
public static final String CSRF_TOKEN_HEADER_REQUIRED_VALUE = "Required";
31-
private static final List<String> NON_PROTECTED_METHODS = Arrays.asList(HttpGet.METHOD_NAME, HttpOptions.METHOD_NAME,
32-
HttpHead.METHOD_NAME);
27+
private static final List<String> NON_PROTECTED_METHODS = List.of(HttpGet.METHOD_NAME, HttpOptions.METHOD_NAME,
28+
HttpHead.METHOD_NAME);
3329

34-
private final HttpClient delegate;
30+
private final CloseableHttpClient delegate;
3531
private String csrfToken;
3632
private final String csrfGetTokenUrl;
3733
private final Map<String, String> httpRequestHeaders;
3834
private boolean isTokenInitialized;
3935

40-
public CsrfHttpClient(HttpClient httpClient, String csrfGetTokenUrl, Map<String, String> httpRequestHeaders) {
36+
public CsrfHttpClient(CloseableHttpClient httpClient, String csrfGetTokenUrl, Map<String, String> httpRequestHeaders) {
4137
this.delegate = httpClient;
4238
this.csrfGetTokenUrl = csrfGetTokenUrl;
4339
this.httpRequestHeaders = httpRequestHeaders;
4440
}
4541

4642
@Override
47-
public HttpParams getParams() {
48-
return delegate.getParams();
49-
}
50-
51-
@Override
52-
public ClientConnectionManager getConnectionManager() {
53-
return delegate.getConnectionManager();
54-
}
55-
56-
@Override
57-
public HttpResponse execute(HttpUriRequest request) throws IOException {
58-
return executeRequest(request, () -> delegate.execute(request));
59-
}
60-
61-
@Override
62-
public HttpResponse execute(HttpUriRequest request, HttpContext context) throws IOException {
63-
return executeRequest(request, () -> delegate.execute(request, context));
64-
}
65-
66-
@Override
67-
public HttpResponse execute(HttpHost target, HttpRequest request) throws IOException {
68-
return executeRequest(request, () -> delegate.execute(target, request));
69-
}
70-
71-
@Override
72-
public HttpResponse execute(HttpHost target, HttpRequest request, HttpContext context) throws IOException {
43+
protected CloseableHttpResponse doExecute(HttpHost target, ClassicHttpRequest request, HttpContext context) throws IOException {
7344
return executeRequest(request, () -> delegate.execute(target, request, context));
7445
}
7546

76-
@Override
77-
public <T> T execute(HttpUriRequest request, ResponseHandler<? extends T> responseHandler) throws IOException {
78-
return executeRequest(request, () -> delegate.execute(request, responseHandler));
79-
}
80-
81-
@Override
82-
public <T> T execute(HttpUriRequest request, ResponseHandler<? extends T> responseHandler, HttpContext context) throws IOException {
83-
return executeRequest(request, () -> delegate.execute(request, responseHandler, context));
84-
}
85-
86-
@Override
87-
public <T> T execute(HttpHost target, HttpRequest request, ResponseHandler<? extends T> responseHandler) throws IOException {
88-
return executeRequest(request, () -> delegate.execute(target, request, responseHandler));
89-
}
90-
91-
@Override
92-
public <T> T execute(HttpHost target, HttpRequest request, ResponseHandler<? extends T> responseHandler, HttpContext context)
93-
throws IOException {
94-
return executeRequest(request, () -> delegate.execute(target, request, responseHandler, context));
95-
}
96-
9747
private <T> T executeRequest(HttpRequest request, Executor<T> executionSupplier) throws IOException {
9848
T result = executeWithCsrfTokenSetting(request, executionSupplier);
99-
if (!(result instanceof HttpResponse)) {
49+
if (!(result instanceof ClassicHttpResponse response)) {
10050
return result;
10151
}
102-
HttpResponse response = (HttpResponse) result;
10352
if (isRetryNeeded(request, response)) {
10453
result = executeWithCsrfTokenSetting(request, executionSupplier);
10554
}
@@ -130,8 +79,7 @@ private void setCrsfToken(HttpRequest request) throws IOException {
13079
}
13180

13281
private boolean isProtectionRequired(HttpRequest request) {
133-
return !NON_PROTECTED_METHODS.contains(request.getRequestLine()
134-
.getMethod());
82+
return !NON_PROTECTED_METHODS.contains(request.getMethod());
13583
}
13684

13785
private void initializeToken(boolean force) throws IOException {
@@ -151,20 +99,20 @@ private String fetchNewCsrfToken() throws IOException {
15199
HttpGet fetchTokenRequest = new HttpGet(csrfGetTokenUrl);
152100
fetchTokenRequest.addHeader(CSRF_TOKEN_HEADER_NAME, CSRF_TOKEN_HEADER_FETCH_VALUE);
153101
setHttpRequestHeaders(fetchTokenRequest);
154-
HttpResponse response = delegate.execute(fetchTokenRequest);
155-
EntityUtils.consume(response.getEntity());
156-
if (response.containsHeader(CSRF_TOKEN_HEADER_NAME)) {
157-
return response.getFirstHeader(CSRF_TOKEN_HEADER_NAME)
158-
.getValue();
159-
}
160-
161-
return null;
102+
return delegate.execute(fetchTokenRequest, response -> {
103+
EntityUtils.consume(response.getEntity());
104+
if (response.containsHeader(CSRF_TOKEN_HEADER_NAME)) {
105+
return response.getFirstHeader(CSRF_TOKEN_HEADER_NAME)
106+
.getValue();
107+
}
108+
return null;
109+
});
162110
}
163111

164112
/**
165113
* Checks if a request has failed due to an expired session(token is not valid anymore) and regenerates the token if needed.
166114
*/
167-
private boolean isRetryNeeded(HttpRequest request, HttpResponse response) throws IOException {
115+
private boolean isRetryNeeded(HttpRequest request, ClassicHttpResponse response) throws IOException {
168116
if (!isProtectionRequired(request)) {
169117
// The request was not protected so the error was not caused by
170118
// missing token.
@@ -173,8 +121,7 @@ private boolean isRetryNeeded(HttpRequest request, HttpResponse response) throws
173121

174122
// The token was initialized but probably the session has expired. If it
175123
// is so, then the token needs to be regenerated and request retried.
176-
if (isTokenInitialized && (response.getStatusLine()
177-
.getStatusCode() == HttpStatus.SC_FORBIDDEN)) {
124+
if (isTokenInitialized && (response.getCode() == HttpStatus.SC_FORBIDDEN)) {
178125

179126
Header csrfTokenHeader = response.getFirstHeader(CSRF_TOKEN_HEADER_NAME);
180127

@@ -195,9 +142,12 @@ private boolean isRetryNeeded(HttpRequest request, HttpResponse response) throws
195142

196143
@Override
197144
public void close() throws IOException {
198-
if (delegate instanceof Closeable) {
199-
((Closeable) delegate).close();
200-
}
145+
delegate.close();
146+
}
147+
148+
@Override
149+
public void close(CloseMode closeMode) {
150+
delegate.close(closeMode);
201151
}
202152

203153
private interface Executor<T> {

0 commit comments

Comments
 (0)