Skip to content

Commit 4101dc3

Browse files
authored
Merge pull request #73 from digipost/httpclientbuilder5
Oppgrader fra httplclientbuilder v3 til v5
2 parents 8b11f4b + 0c71994 commit 4101dc3

17 files changed

Lines changed: 150 additions & 176 deletions

NOTICE

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,9 @@ Licensed under Apache 2 - http://www.apache.org/licenses/LICENSE-2.0.html
99
This software includes third party software subject to the following licenses:
1010

1111
Angus Activation Registries under EDL 1.0
12-
Apache Commons Codec under Apache License, Version 2.0
1312
Apache Commons Lang under Apache License, Version 2.0
1413
Apache HttpClient under Apache License, Version 2.0
15-
Apache HttpCore under Apache License, Version 2.0
14+
Apache HttpComponents Core HTTP/1.1 under Apache License, Version 2.0
1615
Bouncy Castle ASN.1 Extension and Utility APIs under Bouncy Castle Licence
1716
Bouncy Castle PKIX, CMS, EAC, TSP, PKCS, OCSP, CMP, and CRMF APIs under Bouncy Castle Licence
1817
Bouncy Castle Provider under Bouncy Castle Licence

pom.xml

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<parent>
2424
<groupId>no.digipost</groupId>
2525
<artifactId>digipost-open-super-pom</artifactId>
26-
<version>14</version>
26+
<version>15</version>
2727
</parent>
2828

2929
<artifactId>digipost-useragreements-api-client-java</artifactId>
@@ -76,25 +76,29 @@
7676
<scope>test</scope>
7777
</dependency>
7878
<dependency>
79-
<groupId>org.apache.httpcomponents</groupId>
80-
<artifactId>httpclient</artifactId>
81-
<version>4.5.14</version>
79+
<groupId>org.apache.httpcomponents.client5</groupId>
80+
<artifactId>httpclient5</artifactId>
81+
<version>5.4.4</version>
8282
<exclusions>
8383
<exclusion>
8484
<groupId>commons-logging</groupId>
8585
<artifactId>commons-logging</artifactId>
8686
</exclusion>
87+
<exclusion>
88+
<groupId>org.apache.httpcomponents.core5</groupId>
89+
<artifactId>httpcore5-h2</artifactId>
90+
</exclusion>
8791
</exclusions>
8892
</dependency>
8993
<dependency>
90-
<groupId>org.apache.httpcomponents</groupId>
91-
<artifactId>httpcore</artifactId>
92-
<version>4.4.16</version>
94+
<groupId>org.apache.httpcomponents.core5</groupId>
95+
<artifactId>httpcore5</artifactId>
96+
<version>5.3.4</version>
9397
</dependency>
9498
<dependency>
9599
<groupId>no.digipost</groupId>
96-
<artifactId>http-client-builder3</artifactId>
97-
<version>3.0.1</version>
100+
<artifactId>http-client-builder5</artifactId>
101+
<version>5.0.1</version>
98102
</dependency>
99103
<dependency>
100104
<groupId>com.google.guava</groupId>
@@ -370,10 +374,10 @@
370374
<include>org.checkerframework:checker-compat-qual</include>
371375
<include>org.codehaus.mojo:animal-sniffer-annotations</include>
372376
<include>com.google.errorprone:error_prone_annotations</include>
373-
<include>no.digipost:http-client-builder3</include>
374-
<include>org.apache.httpcomponents:httpclient</include>
377+
<include>no.digipost:http-client-builder5</include>
378+
<include>org.apache.httpcomponents.client5:httpclient5</include>
375379
<include>commons-codec:commons-codec</include>
376-
<include>org.apache.httpcomponents:httpcore</include>
380+
<include>org.apache.httpcomponents.core5:httpcore5</include>
377381
<include>org.jboss.logging:jboss-logging</include>
378382
<include>org.jboss.xnio:xnio-api</include>
379383
</includes>

src/main/java/no/digipost/api/useragreements/client/ApiService.java

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,19 @@
1818
import jakarta.xml.bind.JAXB;
1919
import no.digipost.api.useragreements.client.response.StreamingRateLimitedResponse;
2020
import no.digipost.cache2.inmemory.SingleCached;
21-
import org.apache.http.HttpEntity;
22-
import org.apache.http.HttpHeaders;
23-
import org.apache.http.client.ResponseHandler;
24-
import org.apache.http.client.methods.CloseableHttpResponse;
25-
import org.apache.http.client.methods.HttpDelete;
26-
import org.apache.http.client.methods.HttpGet;
27-
import org.apache.http.client.methods.HttpPost;
28-
import org.apache.http.client.methods.HttpRequestBase;
29-
import org.apache.http.client.utils.URIBuilder;
30-
import org.apache.http.entity.ByteArrayEntity;
31-
import org.apache.http.impl.client.CloseableHttpClient;
21+
import org.apache.hc.client5.http.classic.methods.HttpDelete;
22+
import org.apache.hc.client5.http.classic.methods.HttpGet;
23+
import org.apache.hc.client5.http.classic.methods.HttpPost;
24+
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
25+
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
26+
import org.apache.hc.core5.http.ClassicHttpRequest;
27+
import org.apache.hc.core5.http.ContentType;
28+
import org.apache.hc.core5.http.HttpEntity;
29+
import org.apache.hc.core5.http.HttpHeaders;
30+
import org.apache.hc.core5.http.HttpRequest;
31+
import org.apache.hc.core5.http.io.HttpClientResponseHandler;
32+
import org.apache.hc.core5.http.io.entity.ByteArrayEntity;
33+
import org.apache.hc.core5.net.URIBuilder;
3234

3335
import java.io.ByteArrayOutputStream;
3436
import java.io.IOException;
@@ -61,30 +63,30 @@ public ApiService(final URI serviceEndpoint, final BrokerId brokerId, final Clos
6163
this.httpClient = httpClient;
6264
}
6365

64-
public IdentificationResult identifyUser(final SenderId senderId, final UserId userId, final String requestTrackingId, final ResponseHandler<IdentificationResult> handler) {
66+
public IdentificationResult identifyUser(final SenderId senderId, final UserId userId, final String requestTrackingId, final HttpClientResponseHandler<IdentificationResult> handler) {
6567
return executeHttpRequest(newPostRequest(getEntryPoint().getIdentificationUri(), requestTrackingId, new Identification(userId.serialize())), handler);
6668
}
6769

68-
public void createAgreement(final SenderId senderId, final Agreement agreement, final String requestTrackingId, final ResponseHandler<Void> handler) {
70+
public void createAgreement(final SenderId senderId, final Agreement agreement, final String requestTrackingId, final HttpClientResponseHandler<Void> handler) {
6971
executeHttpRequest(newPostRequest(new URIBuilder(serviceEndpoint).setPath(userAgreementsPath(senderId)), requestTrackingId, agreement), handler);
7072
}
7173

72-
public GetAgreementResult getAgreement(final SenderId senderId, final AgreementType agreementType, final UserId userId, final String requestTrackingId, final ResponseHandler<GetAgreementResult> handler) {
74+
public GetAgreementResult getAgreement(final SenderId senderId, final AgreementType agreementType, final UserId userId, final String requestTrackingId, final HttpClientResponseHandler<GetAgreementResult> handler) {
7375
URIBuilder uriBuilder = new URIBuilder(serviceEndpoint)
7476
.setPath(userAgreementsPath(senderId))
7577
.setParameter("user-id", userId.serialize())
7678
.setParameter("agreement-type", agreementType.getType());
7779
return executeHttpRequest(newGetRequest(uriBuilder, requestTrackingId), handler);
7880
}
7981

80-
public Agreements getAgreements(final SenderId senderId, final UserId userId, final String requestTrackingId, final ResponseHandler<Agreements> handler) {
82+
public Agreements getAgreements(final SenderId senderId, final UserId userId, final String requestTrackingId, final HttpClientResponseHandler<Agreements> handler) {
8183
URIBuilder uriBuilder = new URIBuilder(serviceEndpoint)
8284
.setPath(userAgreementsPath(senderId))
8385
.setParameter("user-id", userId.serialize());
8486
return executeHttpRequest(newGetRequest(uriBuilder, requestTrackingId), handler);
8587
}
8688

87-
public void deleteAgrement(final SenderId senderId, final AgreementType agreementType, final UserId userId, final String requestTrackingId, final ResponseHandler<Void> handler) {
89+
public void deleteAgrement(final SenderId senderId, final AgreementType agreementType, final UserId userId, final String requestTrackingId, final HttpClientResponseHandler<Void> handler) {
8890
URIBuilder uriBuilder = new URIBuilder(serviceEndpoint)
8991
.setPath(userAgreementsPath(senderId))
9092
.setParameter("user-id", userId.serialize())
@@ -93,7 +95,7 @@ public void deleteAgrement(final SenderId senderId, final AgreementType agreemen
9395
executeHttpRequest(withRequestTrackingHeader(deleteAgreementRequest, requestTrackingId), handler);
9496
}
9597

96-
public Documents getDocuments(final SenderId senderId, final AgreementType agreementType, final UserId userId, final GetDocumentsQuery query, final String requestTrackingId, final ResponseHandler<Documents> handler) {
98+
public Documents getDocuments(final SenderId senderId, final AgreementType agreementType, final UserId userId, final GetDocumentsQuery query, final String requestTrackingId, final HttpClientResponseHandler<Documents> handler) {
9799
URIBuilder uriBuilder = new URIBuilder(serviceEndpoint)
98100
.setPath(userDocumentsPath(senderId))
99101
.setParameter(UserId.QUERY_PARAM_NAME, userId.serialize())
@@ -111,14 +113,14 @@ private void setGetDocumentsQueryParams(final URIBuilder uriBuilder, final GetDo
111113
}
112114
}
113115

114-
public Document getDocument(final SenderId senderId, final AgreementType agreementType, final long documentId, final String requestTrackingId, final ResponseHandler<Document> handler) {
116+
public Document getDocument(final SenderId senderId, final AgreementType agreementType, final long documentId, final String requestTrackingId, final HttpClientResponseHandler<Document> handler) {
115117
URIBuilder uriBuilder = new URIBuilder(serviceEndpoint)
116118
.setPath(userDocumentsPath(senderId) + "/" + documentId)
117119
.setParameter(AgreementType.QUERY_PARAM_NAME, agreementType.getType());
118120
return executeHttpRequest(newGetRequest(uriBuilder, requestTrackingId), handler);
119121
}
120122

121-
public DocumentCount getDocumentCount(final SenderId senderId, final AgreementType agreementType, final UserId userId, final GetDocumentsQuery query, final String requestTrackingId, final ResponseHandler<DocumentCount> handler) {
123+
public DocumentCount getDocumentCount(final SenderId senderId, final AgreementType agreementType, final UserId userId, final GetDocumentsQuery query, final String requestTrackingId, final HttpClientResponseHandler<DocumentCount> handler) {
122124
URIBuilder uriBuilder = new URIBuilder(serviceEndpoint)
123125
.setPath(userDocumentsPath(senderId) + "/count")
124126
.setParameter(UserId.QUERY_PARAM_NAME, userId.serialize())
@@ -127,7 +129,7 @@ public DocumentCount getDocumentCount(final SenderId senderId, final AgreementTy
127129
return executeHttpRequest(newGetRequest(uriBuilder, requestTrackingId), handler);
128130
}
129131

130-
public DocumentContent getDocumentContent(final SenderId senderId, final AgreementType agreementType, final long documentId, final String requestTrackingId, final ResponseHandler<DocumentContent> handler) {
132+
public DocumentContent getDocumentContent(final SenderId senderId, final AgreementType agreementType, final long documentId, final String requestTrackingId, final HttpClientResponseHandler<DocumentContent> handler) {
131133
URIBuilder uriBuilder = new URIBuilder(serviceEndpoint)
132134
.setPath(userDocumentsPath(senderId) + "/" + documentId + "/content")
133135
.setParameter(AgreementType.QUERY_PARAM_NAME, agreementType.getType());
@@ -167,7 +169,7 @@ private static String userDocumentsPath(final SenderId senderId) {
167169
return "/" + senderId.serialize() + "/" + USER_DOCUMENTS_PATH;
168170
}
169171

170-
private <T> T executeHttpRequest(final HttpRequestBase request, final ResponseHandler<T> handler) {
172+
private <T> T executeHttpRequest(final ClassicHttpRequest request, final HttpClientResponseHandler<T> handler) {
171173
try {
172174
request.setHeader(X_Digipost_UserId, brokerId.serialize());
173175
return httpClient.execute(request, handler);
@@ -203,12 +205,12 @@ private static URI buildUri(URIBuilder builder) {
203205
}
204206
}
205207

206-
private static <REQ extends HttpRequestBase> REQ withCommonHeaders(REQ request, String requestTrackingId) {
208+
private static <REQ extends HttpRequest> REQ withCommonHeaders(REQ request, String requestTrackingId) {
207209
request.setHeader(HttpHeaders.ACCEPT, DIGIPOST_MEDIA_TYPE_USERS_V2);
208210
return withRequestTrackingHeader(request, requestTrackingId);
209211
}
210212

211-
private static <REQ extends HttpRequestBase> REQ withRequestTrackingHeader(REQ request, final String requestTrackingId) {
213+
private static <REQ extends HttpRequest> REQ withRequestTrackingHeader(REQ request, final String requestTrackingId) {
212214
if (requestTrackingId != null && !requestTrackingId.isEmpty()) {
213215
request.setHeader("X-Digipost-Request-Id", requestTrackingId);
214216
}
@@ -218,7 +220,7 @@ private static <REQ extends HttpRequestBase> REQ withRequestTrackingHeader(REQ r
218220
private static HttpEntity marshallJaxbEntity(final Object obj) {
219221
ByteArrayOutputStream bao = new ByteArrayOutputStream(1024);
220222
JAXB.marshal(obj, bao);
221-
return new ByteArrayEntity(bao.toByteArray());
223+
return new ByteArrayEntity(bao.toByteArray(), ContentType.APPLICATION_XML);
222224
}
223225

224226
public EntryPoint getEntryPoint() {

src/main/java/no/digipost/api/useragreements/client/DigipostUserAgreementsClient.java

Lines changed: 15 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,13 @@
2323
import no.digipost.api.useragreements.client.response.StreamingRateLimitedResponse;
2424
import no.digipost.api.useragreements.client.security.CryptoUtil;
2525
import no.digipost.api.useragreements.client.security.PrivateKeySigner;
26-
import no.digipost.http.client3.DigipostHttpClientFactory;
27-
import no.digipost.http.client3.DigipostHttpClientSettings;
28-
import org.apache.http.HttpHost;
29-
import org.apache.http.HttpStatus;
30-
import org.apache.http.StatusLine;
31-
import org.apache.http.client.ResponseHandler;
32-
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
33-
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
34-
import org.apache.http.impl.client.HttpClientBuilder;
35-
import org.apache.http.ssl.SSLContextBuilder;
26+
import no.digipost.http.client.HttpClientFactory;
27+
import no.digipost.http.client.HttpClientSettings;
28+
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
29+
import org.apache.hc.core5.http.HttpHost;
30+
import org.apache.hc.core5.http.HttpStatus;
31+
import org.apache.hc.core5.http.io.HttpClientResponseHandler;
32+
import org.apache.hc.core5.http.message.StatusLine;
3633

3734
import java.io.InputStream;
3835
import java.net.URI;
@@ -89,7 +86,7 @@ public GetAgreementResult getAgreement(final SenderId senderId, final AgreementT
8986
Objects.requireNonNull(type, "agreementType cannot be null");
9087
Objects.requireNonNull(userId, "userId cannot be null");
9188
return apiService.getAgreement(senderId, type, userId, requestTrackingId, response -> {
92-
StatusLine status = response.getStatusLine();
89+
StatusLine status = new StatusLine(response);
9390
if (isOkResponse(status.getStatusCode())) {
9491
return new GetAgreementResult(unmarshallEntity(response, Agreement.class));
9592
} else {
@@ -171,11 +168,11 @@ public StreamingRateLimitedResponse<UserId> getAgreementOwners(final SenderId se
171168
return apiService.getAgreementOwners(senderId, agreementType, requestTrackingId);
172169
}
173170

174-
private ResponseHandler<Void> voidOkHandler() {
171+
private HttpClientResponseHandler<Void> voidOkHandler() {
175172
return response -> mapOkResponseOrThrowException(response, r -> null);
176173
}
177174

178-
private <T> ResponseHandler<T> singleJaxbEntityHandler(Class<T> responseType) {
175+
private <T> HttpClientResponseHandler<T> singleJaxbEntityHandler(Class<T> responseType) {
179176
return response -> mapOkResponseOrThrowException(response, r -> unmarshallEntity(r, responseType));
180177
}
181178

@@ -208,7 +205,7 @@ private Builder(BrokerId brokerId, InputStream certificateP12File, String certif
208205
this.certificatePassword = certificatePassword;
209206
this.privateKey = Optional.ofNullable(privateKey);
210207
serviceEndpoint(PRODUCTION_ENDPOINT);
211-
httpClientBuilder = DigipostHttpClientFactory.createBuilder(DigipostHttpClientSettings.DEFAULT);
208+
httpClientBuilder = HttpClientFactory.createBuilder(HttpClientSettings.DEFAULT);
212209
}
213210

214211
public Builder useProxy(final HttpHost proxyHost) {
@@ -226,30 +223,14 @@ public Builder setHttpClientBuilder(final HttpClientBuilder httpClientBuilder) {
226223
return this;
227224
}
228225

229-
public Builder veryDangerouslyDisableCertificateVerificationWhichIsAbsolutelyUnfitForProductionCode() {
230-
if (this.serviceEndpoint.compareTo(PRODUCTION_ENDPOINT) == 0) {
231-
throw new RuntimeException("You should never ever disable certificate verification when connecting to the production endpoint");
232-
}
233-
SSLContextBuilder sslContextBuilder= new SSLContextBuilder();
234-
try {
235-
sslContextBuilder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
236-
SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContextBuilder.build(), (hostname, session) -> true);
237-
httpClientBuilder.setSSLSocketFactory(sslConnectionSocketFactory);
238-
} catch (Exception e) {
239-
throw new RuntimeException("Could not disable certificate verification: " + e.getMessage(), e);
240-
}
241-
System.err.println("Not checking validity of certificates for any hostnames");
242-
return this;
243-
}
244-
245226
public DigipostUserAgreementsClient build() {
246227
CryptoUtil.addBouncyCastleProviderAndVerify_AES256_CBC_Support();
247228

248-
httpClientBuilder.addInterceptorLast(new RequestDateInterceptor());
249-
httpClientBuilder.addInterceptorLast(new RequestUserAgentInterceptor());
229+
httpClientBuilder.addRequestInterceptorLast(new RequestDateInterceptor());
230+
httpClientBuilder.addRequestInterceptorLast(new RequestUserAgentInterceptor());
250231
PrivateKeySigner pkSigner = privateKey.map(PrivateKeySigner::new).orElseGet(() -> new PrivateKeySigner(certificateP12File, certificatePassword));
251-
httpClientBuilder.addInterceptorLast(new RequestSignatureInterceptor(pkSigner, new RequestContentSHA256Filter()));
252-
httpClientBuilder.addInterceptorLast(new ResponseDateInterceptor());
232+
httpClientBuilder.addRequestInterceptorLast(new RequestSignatureInterceptor(pkSigner, new RequestContentSHA256Filter()));
233+
httpClientBuilder.addResponseInterceptorLast(new ResponseDateInterceptor());
253234
proxyHost.ifPresent(httpClientBuilder::setProxy);
254235

255236
ApiService apiService = new ApiService(serviceEndpoint, brokerId, httpClientBuilder.build());

src/main/java/no/digipost/api/useragreements/client/ServerSignatureException.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
*/
1616
package no.digipost.api.useragreements.client;
1717

18-
import org.apache.http.StatusLine;
18+
19+
import org.apache.hc.core5.http.message.StatusLine;
1920

2021
public class ServerSignatureException extends UnexpectedResponseException {
2122
public ServerSignatureException(final StatusLine status, final String errorMessage) {

src/main/java/no/digipost/api/useragreements/client/UnexpectedResponseException.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
*/
1616
package no.digipost.api.useragreements.client;
1717

18-
import org.apache.http.StatusLine;
18+
19+
import org.apache.hc.core5.http.message.StatusLine;
1920

2021
import static java.lang.String.format;
2122

src/main/java/no/digipost/api/useragreements/client/filters/request/RequestContentHashFilter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
*/
1616
package no.digipost.api.useragreements.client.filters.request;
1717

18-
import org.apache.http.HttpRequest;
18+
import org.apache.hc.core5.http.HttpRequest;
1919
import org.bouncycastle.crypto.ExtendedDigest;
2020
import org.slf4j.Logger;
2121
import org.slf4j.LoggerFactory;

src/main/java/no/digipost/api/useragreements/client/filters/request/RequestDateInterceptor.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,25 +16,26 @@
1616
package no.digipost.api.useragreements.client.filters.request;
1717

1818
import no.digipost.api.useragreements.client.util.DateUtils;
19-
import org.apache.http.HttpException;
20-
import org.apache.http.HttpRequest;
21-
import org.apache.http.HttpRequestInterceptor;
22-
import org.apache.http.protocol.HttpContext;
19+
import org.apache.hc.core5.http.EntityDetails;
20+
import org.apache.hc.core5.http.HttpException;
21+
import org.apache.hc.core5.http.HttpRequest;
22+
import org.apache.hc.core5.http.HttpRequestInterceptor;
23+
import org.apache.hc.core5.http.protocol.HttpContext;
2324
import org.slf4j.Logger;
2425
import org.slf4j.LoggerFactory;
2526

2627
import java.io.IOException;
2728
import java.time.ZonedDateTime;
2829

2930
import static no.digipost.api.useragreements.client.util.DateUtils.GMT;
30-
import static org.apache.http.HttpHeaders.DATE;
31+
import static org.apache.hc.core5.http.HttpHeaders.DATE;
3132

3233
public class RequestDateInterceptor implements HttpRequestInterceptor {
3334

3435
private final Logger log = LoggerFactory.getLogger(getClass());
3536

3637
@Override
37-
public void process(HttpRequest httpRequest, HttpContext httpContext) throws HttpException, IOException {
38+
public void process(HttpRequest httpRequest, EntityDetails entityDetails, HttpContext httpContext) throws HttpException, IOException {
3839
setDateHeader(httpRequest);
3940
}
4041

src/main/java/no/digipost/api/useragreements/client/filters/request/RequestMessageSignatureUtil.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
*/
1616
package no.digipost.api.useragreements.client.filters.request;
1717

18-
import org.apache.http.HttpHeaders;
18+
19+
import org.apache.hc.core5.http.HttpHeaders;
1920

2021
import java.util.Arrays;
2122
import java.util.List;

0 commit comments

Comments
 (0)