diff --git a/NOTICE b/NOTICE
index c38bd44..f9041c5 100644
--- a/NOTICE
+++ b/NOTICE
@@ -9,10 +9,9 @@ Licensed under Apache 2 - http://www.apache.org/licenses/LICENSE-2.0.html
This software includes third party software subject to the following licenses:
Angus Activation Registries under EDL 1.0
- Apache Commons Codec under Apache License, Version 2.0
Apache Commons Lang under Apache License, Version 2.0
Apache HttpClient under Apache License, Version 2.0
- Apache HttpCore under Apache License, Version 2.0
+ Apache HttpComponents Core HTTP/1.1 under Apache License, Version 2.0
Bouncy Castle ASN.1 Extension and Utility APIs under Bouncy Castle Licence
Bouncy Castle PKIX, CMS, EAC, TSP, PKCS, OCSP, CMP, and CRMF APIs under Bouncy Castle Licence
Bouncy Castle Provider under Bouncy Castle Licence
diff --git a/pom.xml b/pom.xml
index ea57116..3c7211b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -23,7 +23,7 @@
no.digipost
digipost-open-super-pom
- 14
+ 15
digipost-useragreements-api-client-java
@@ -76,25 +76,29 @@
test
- org.apache.httpcomponents
- httpclient
- 4.5.14
+ org.apache.httpcomponents.client5
+ httpclient5
+ 5.4.4
commons-logging
commons-logging
+
+ org.apache.httpcomponents.core5
+ httpcore5-h2
+
- org.apache.httpcomponents
- httpcore
- 4.4.16
+ org.apache.httpcomponents.core5
+ httpcore5
+ 5.3.4
no.digipost
- http-client-builder3
- 3.0.1
+ http-client-builder5
+ 5.0.1
com.google.guava
@@ -370,10 +374,10 @@
org.checkerframework:checker-compat-qual
org.codehaus.mojo:animal-sniffer-annotations
com.google.errorprone:error_prone_annotations
- no.digipost:http-client-builder3
- org.apache.httpcomponents:httpclient
+ no.digipost:http-client-builder5
+ org.apache.httpcomponents.client5:httpclient5
commons-codec:commons-codec
- org.apache.httpcomponents:httpcore
+ org.apache.httpcomponents.core5:httpcore5
org.jboss.logging:jboss-logging
org.jboss.xnio:xnio-api
diff --git a/src/main/java/no/digipost/api/useragreements/client/ApiService.java b/src/main/java/no/digipost/api/useragreements/client/ApiService.java
index 4cee090..7a6fd2a 100644
--- a/src/main/java/no/digipost/api/useragreements/client/ApiService.java
+++ b/src/main/java/no/digipost/api/useragreements/client/ApiService.java
@@ -18,17 +18,19 @@
import jakarta.xml.bind.JAXB;
import no.digipost.api.useragreements.client.response.StreamingRateLimitedResponse;
import no.digipost.cache2.inmemory.SingleCached;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpHeaders;
-import org.apache.http.client.ResponseHandler;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpDelete;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.client.methods.HttpRequestBase;
-import org.apache.http.client.utils.URIBuilder;
-import org.apache.http.entity.ByteArrayEntity;
-import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.hc.client5.http.classic.methods.HttpDelete;
+import org.apache.hc.client5.http.classic.methods.HttpGet;
+import org.apache.hc.client5.http.classic.methods.HttpPost;
+import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
+import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
+import org.apache.hc.core5.http.ClassicHttpRequest;
+import org.apache.hc.core5.http.ContentType;
+import org.apache.hc.core5.http.HttpEntity;
+import org.apache.hc.core5.http.HttpHeaders;
+import org.apache.hc.core5.http.HttpRequest;
+import org.apache.hc.core5.http.io.HttpClientResponseHandler;
+import org.apache.hc.core5.http.io.entity.ByteArrayEntity;
+import org.apache.hc.core5.net.URIBuilder;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@@ -61,15 +63,15 @@ public ApiService(final URI serviceEndpoint, final BrokerId brokerId, final Clos
this.httpClient = httpClient;
}
- public IdentificationResult identifyUser(final SenderId senderId, final UserId userId, final String requestTrackingId, final ResponseHandler handler) {
+ public IdentificationResult identifyUser(final SenderId senderId, final UserId userId, final String requestTrackingId, final HttpClientResponseHandler handler) {
return executeHttpRequest(newPostRequest(getEntryPoint().getIdentificationUri(), requestTrackingId, new Identification(userId.serialize())), handler);
}
- public void createAgreement(final SenderId senderId, final Agreement agreement, final String requestTrackingId, final ResponseHandler handler) {
+ public void createAgreement(final SenderId senderId, final Agreement agreement, final String requestTrackingId, final HttpClientResponseHandler handler) {
executeHttpRequest(newPostRequest(new URIBuilder(serviceEndpoint).setPath(userAgreementsPath(senderId)), requestTrackingId, agreement), handler);
}
- public GetAgreementResult getAgreement(final SenderId senderId, final AgreementType agreementType, final UserId userId, final String requestTrackingId, final ResponseHandler handler) {
+ public GetAgreementResult getAgreement(final SenderId senderId, final AgreementType agreementType, final UserId userId, final String requestTrackingId, final HttpClientResponseHandler handler) {
URIBuilder uriBuilder = new URIBuilder(serviceEndpoint)
.setPath(userAgreementsPath(senderId))
.setParameter("user-id", userId.serialize())
@@ -77,14 +79,14 @@ public GetAgreementResult getAgreement(final SenderId senderId, final AgreementT
return executeHttpRequest(newGetRequest(uriBuilder, requestTrackingId), handler);
}
- public Agreements getAgreements(final SenderId senderId, final UserId userId, final String requestTrackingId, final ResponseHandler handler) {
+ public Agreements getAgreements(final SenderId senderId, final UserId userId, final String requestTrackingId, final HttpClientResponseHandler handler) {
URIBuilder uriBuilder = new URIBuilder(serviceEndpoint)
.setPath(userAgreementsPath(senderId))
.setParameter("user-id", userId.serialize());
return executeHttpRequest(newGetRequest(uriBuilder, requestTrackingId), handler);
}
- public void deleteAgrement(final SenderId senderId, final AgreementType agreementType, final UserId userId, final String requestTrackingId, final ResponseHandler handler) {
+ public void deleteAgrement(final SenderId senderId, final AgreementType agreementType, final UserId userId, final String requestTrackingId, final HttpClientResponseHandler handler) {
URIBuilder uriBuilder = new URIBuilder(serviceEndpoint)
.setPath(userAgreementsPath(senderId))
.setParameter("user-id", userId.serialize())
@@ -93,7 +95,7 @@ public void deleteAgrement(final SenderId senderId, final AgreementType agreemen
executeHttpRequest(withRequestTrackingHeader(deleteAgreementRequest, requestTrackingId), handler);
}
- public Documents getDocuments(final SenderId senderId, final AgreementType agreementType, final UserId userId, final GetDocumentsQuery query, final String requestTrackingId, final ResponseHandler handler) {
+ public Documents getDocuments(final SenderId senderId, final AgreementType agreementType, final UserId userId, final GetDocumentsQuery query, final String requestTrackingId, final HttpClientResponseHandler handler) {
URIBuilder uriBuilder = new URIBuilder(serviceEndpoint)
.setPath(userDocumentsPath(senderId))
.setParameter(UserId.QUERY_PARAM_NAME, userId.serialize())
@@ -111,14 +113,14 @@ private void setGetDocumentsQueryParams(final URIBuilder uriBuilder, final GetDo
}
}
- public Document getDocument(final SenderId senderId, final AgreementType agreementType, final long documentId, final String requestTrackingId, final ResponseHandler handler) {
+ public Document getDocument(final SenderId senderId, final AgreementType agreementType, final long documentId, final String requestTrackingId, final HttpClientResponseHandler handler) {
URIBuilder uriBuilder = new URIBuilder(serviceEndpoint)
.setPath(userDocumentsPath(senderId) + "/" + documentId)
.setParameter(AgreementType.QUERY_PARAM_NAME, agreementType.getType());
return executeHttpRequest(newGetRequest(uriBuilder, requestTrackingId), handler);
}
- public DocumentCount getDocumentCount(final SenderId senderId, final AgreementType agreementType, final UserId userId, final GetDocumentsQuery query, final String requestTrackingId, final ResponseHandler handler) {
+ public DocumentCount getDocumentCount(final SenderId senderId, final AgreementType agreementType, final UserId userId, final GetDocumentsQuery query, final String requestTrackingId, final HttpClientResponseHandler handler) {
URIBuilder uriBuilder = new URIBuilder(serviceEndpoint)
.setPath(userDocumentsPath(senderId) + "/count")
.setParameter(UserId.QUERY_PARAM_NAME, userId.serialize())
@@ -127,7 +129,7 @@ public DocumentCount getDocumentCount(final SenderId senderId, final AgreementTy
return executeHttpRequest(newGetRequest(uriBuilder, requestTrackingId), handler);
}
- public DocumentContent getDocumentContent(final SenderId senderId, final AgreementType agreementType, final long documentId, final String requestTrackingId, final ResponseHandler handler) {
+ public DocumentContent getDocumentContent(final SenderId senderId, final AgreementType agreementType, final long documentId, final String requestTrackingId, final HttpClientResponseHandler handler) {
URIBuilder uriBuilder = new URIBuilder(serviceEndpoint)
.setPath(userDocumentsPath(senderId) + "/" + documentId + "/content")
.setParameter(AgreementType.QUERY_PARAM_NAME, agreementType.getType());
@@ -167,7 +169,7 @@ private static String userDocumentsPath(final SenderId senderId) {
return "/" + senderId.serialize() + "/" + USER_DOCUMENTS_PATH;
}
- private T executeHttpRequest(final HttpRequestBase request, final ResponseHandler handler) {
+ private T executeHttpRequest(final ClassicHttpRequest request, final HttpClientResponseHandler handler) {
try {
request.setHeader(X_Digipost_UserId, brokerId.serialize());
return httpClient.execute(request, handler);
@@ -203,12 +205,12 @@ private static URI buildUri(URIBuilder builder) {
}
}
- private static REQ withCommonHeaders(REQ request, String requestTrackingId) {
+ private static REQ withCommonHeaders(REQ request, String requestTrackingId) {
request.setHeader(HttpHeaders.ACCEPT, DIGIPOST_MEDIA_TYPE_USERS_V2);
return withRequestTrackingHeader(request, requestTrackingId);
}
- private static REQ withRequestTrackingHeader(REQ request, final String requestTrackingId) {
+ private static REQ withRequestTrackingHeader(REQ request, final String requestTrackingId) {
if (requestTrackingId != null && !requestTrackingId.isEmpty()) {
request.setHeader("X-Digipost-Request-Id", requestTrackingId);
}
@@ -218,7 +220,7 @@ private static REQ withRequestTrackingHeader(REQ r
private static HttpEntity marshallJaxbEntity(final Object obj) {
ByteArrayOutputStream bao = new ByteArrayOutputStream(1024);
JAXB.marshal(obj, bao);
- return new ByteArrayEntity(bao.toByteArray());
+ return new ByteArrayEntity(bao.toByteArray(), ContentType.APPLICATION_XML);
}
public EntryPoint getEntryPoint() {
diff --git a/src/main/java/no/digipost/api/useragreements/client/DigipostUserAgreementsClient.java b/src/main/java/no/digipost/api/useragreements/client/DigipostUserAgreementsClient.java
index b33b279..af8e148 100644
--- a/src/main/java/no/digipost/api/useragreements/client/DigipostUserAgreementsClient.java
+++ b/src/main/java/no/digipost/api/useragreements/client/DigipostUserAgreementsClient.java
@@ -23,16 +23,13 @@
import no.digipost.api.useragreements.client.response.StreamingRateLimitedResponse;
import no.digipost.api.useragreements.client.security.CryptoUtil;
import no.digipost.api.useragreements.client.security.PrivateKeySigner;
-import no.digipost.http.client3.DigipostHttpClientFactory;
-import no.digipost.http.client3.DigipostHttpClientSettings;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpStatus;
-import org.apache.http.StatusLine;
-import org.apache.http.client.ResponseHandler;
-import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
-import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.ssl.SSLContextBuilder;
+import no.digipost.http.client.HttpClientFactory;
+import no.digipost.http.client.HttpClientSettings;
+import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
+import org.apache.hc.core5.http.HttpHost;
+import org.apache.hc.core5.http.HttpStatus;
+import org.apache.hc.core5.http.io.HttpClientResponseHandler;
+import org.apache.hc.core5.http.message.StatusLine;
import java.io.InputStream;
import java.net.URI;
@@ -89,7 +86,7 @@ public GetAgreementResult getAgreement(final SenderId senderId, final AgreementT
Objects.requireNonNull(type, "agreementType cannot be null");
Objects.requireNonNull(userId, "userId cannot be null");
return apiService.getAgreement(senderId, type, userId, requestTrackingId, response -> {
- StatusLine status = response.getStatusLine();
+ StatusLine status = new StatusLine(response);
if (isOkResponse(status.getStatusCode())) {
return new GetAgreementResult(unmarshallEntity(response, Agreement.class));
} else {
@@ -171,11 +168,11 @@ public StreamingRateLimitedResponse getAgreementOwners(final SenderId se
return apiService.getAgreementOwners(senderId, agreementType, requestTrackingId);
}
- private ResponseHandler voidOkHandler() {
+ private HttpClientResponseHandler voidOkHandler() {
return response -> mapOkResponseOrThrowException(response, r -> null);
}
- private ResponseHandler singleJaxbEntityHandler(Class responseType) {
+ private HttpClientResponseHandler singleJaxbEntityHandler(Class responseType) {
return response -> mapOkResponseOrThrowException(response, r -> unmarshallEntity(r, responseType));
}
@@ -208,7 +205,7 @@ private Builder(BrokerId brokerId, InputStream certificateP12File, String certif
this.certificatePassword = certificatePassword;
this.privateKey = Optional.ofNullable(privateKey);
serviceEndpoint(PRODUCTION_ENDPOINT);
- httpClientBuilder = DigipostHttpClientFactory.createBuilder(DigipostHttpClientSettings.DEFAULT);
+ httpClientBuilder = HttpClientFactory.createBuilder(HttpClientSettings.DEFAULT);
}
public Builder useProxy(final HttpHost proxyHost) {
@@ -226,30 +223,14 @@ public Builder setHttpClientBuilder(final HttpClientBuilder httpClientBuilder) {
return this;
}
- public Builder veryDangerouslyDisableCertificateVerificationWhichIsAbsolutelyUnfitForProductionCode() {
- if (this.serviceEndpoint.compareTo(PRODUCTION_ENDPOINT) == 0) {
- throw new RuntimeException("You should never ever disable certificate verification when connecting to the production endpoint");
- }
- SSLContextBuilder sslContextBuilder= new SSLContextBuilder();
- try {
- sslContextBuilder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
- SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContextBuilder.build(), (hostname, session) -> true);
- httpClientBuilder.setSSLSocketFactory(sslConnectionSocketFactory);
- } catch (Exception e) {
- throw new RuntimeException("Could not disable certificate verification: " + e.getMessage(), e);
- }
- System.err.println("Not checking validity of certificates for any hostnames");
- return this;
- }
-
public DigipostUserAgreementsClient build() {
CryptoUtil.addBouncyCastleProviderAndVerify_AES256_CBC_Support();
- httpClientBuilder.addInterceptorLast(new RequestDateInterceptor());
- httpClientBuilder.addInterceptorLast(new RequestUserAgentInterceptor());
+ httpClientBuilder.addRequestInterceptorLast(new RequestDateInterceptor());
+ httpClientBuilder.addRequestInterceptorLast(new RequestUserAgentInterceptor());
PrivateKeySigner pkSigner = privateKey.map(PrivateKeySigner::new).orElseGet(() -> new PrivateKeySigner(certificateP12File, certificatePassword));
- httpClientBuilder.addInterceptorLast(new RequestSignatureInterceptor(pkSigner, new RequestContentSHA256Filter()));
- httpClientBuilder.addInterceptorLast(new ResponseDateInterceptor());
+ httpClientBuilder.addRequestInterceptorLast(new RequestSignatureInterceptor(pkSigner, new RequestContentSHA256Filter()));
+ httpClientBuilder.addResponseInterceptorLast(new ResponseDateInterceptor());
proxyHost.ifPresent(httpClientBuilder::setProxy);
ApiService apiService = new ApiService(serviceEndpoint, brokerId, httpClientBuilder.build());
diff --git a/src/main/java/no/digipost/api/useragreements/client/ServerSignatureException.java b/src/main/java/no/digipost/api/useragreements/client/ServerSignatureException.java
index 05801a9..d3f3a23 100644
--- a/src/main/java/no/digipost/api/useragreements/client/ServerSignatureException.java
+++ b/src/main/java/no/digipost/api/useragreements/client/ServerSignatureException.java
@@ -15,7 +15,8 @@
*/
package no.digipost.api.useragreements.client;
-import org.apache.http.StatusLine;
+
+import org.apache.hc.core5.http.message.StatusLine;
public class ServerSignatureException extends UnexpectedResponseException {
public ServerSignatureException(final StatusLine status, final String errorMessage) {
diff --git a/src/main/java/no/digipost/api/useragreements/client/UnexpectedResponseException.java b/src/main/java/no/digipost/api/useragreements/client/UnexpectedResponseException.java
index bece4d3..cb33940 100644
--- a/src/main/java/no/digipost/api/useragreements/client/UnexpectedResponseException.java
+++ b/src/main/java/no/digipost/api/useragreements/client/UnexpectedResponseException.java
@@ -15,7 +15,8 @@
*/
package no.digipost.api.useragreements.client;
-import org.apache.http.StatusLine;
+
+import org.apache.hc.core5.http.message.StatusLine;
import static java.lang.String.format;
diff --git a/src/main/java/no/digipost/api/useragreements/client/filters/request/RequestContentHashFilter.java b/src/main/java/no/digipost/api/useragreements/client/filters/request/RequestContentHashFilter.java
index acd24bc..12d9c3f 100644
--- a/src/main/java/no/digipost/api/useragreements/client/filters/request/RequestContentHashFilter.java
+++ b/src/main/java/no/digipost/api/useragreements/client/filters/request/RequestContentHashFilter.java
@@ -15,7 +15,7 @@
*/
package no.digipost.api.useragreements.client.filters.request;
-import org.apache.http.HttpRequest;
+import org.apache.hc.core5.http.HttpRequest;
import org.bouncycastle.crypto.ExtendedDigest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/src/main/java/no/digipost/api/useragreements/client/filters/request/RequestDateInterceptor.java b/src/main/java/no/digipost/api/useragreements/client/filters/request/RequestDateInterceptor.java
index 6162ec5..b379801 100644
--- a/src/main/java/no/digipost/api/useragreements/client/filters/request/RequestDateInterceptor.java
+++ b/src/main/java/no/digipost/api/useragreements/client/filters/request/RequestDateInterceptor.java
@@ -16,10 +16,11 @@
package no.digipost.api.useragreements.client.filters.request;
import no.digipost.api.useragreements.client.util.DateUtils;
-import org.apache.http.HttpException;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpRequestInterceptor;
-import org.apache.http.protocol.HttpContext;
+import org.apache.hc.core5.http.EntityDetails;
+import org.apache.hc.core5.http.HttpException;
+import org.apache.hc.core5.http.HttpRequest;
+import org.apache.hc.core5.http.HttpRequestInterceptor;
+import org.apache.hc.core5.http.protocol.HttpContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -27,14 +28,14 @@
import java.time.ZonedDateTime;
import static no.digipost.api.useragreements.client.util.DateUtils.GMT;
-import static org.apache.http.HttpHeaders.DATE;
+import static org.apache.hc.core5.http.HttpHeaders.DATE;
public class RequestDateInterceptor implements HttpRequestInterceptor {
private final Logger log = LoggerFactory.getLogger(getClass());
@Override
- public void process(HttpRequest httpRequest, HttpContext httpContext) throws HttpException, IOException {
+ public void process(HttpRequest httpRequest, EntityDetails entityDetails, HttpContext httpContext) throws HttpException, IOException {
setDateHeader(httpRequest);
}
diff --git a/src/main/java/no/digipost/api/useragreements/client/filters/request/RequestMessageSignatureUtil.java b/src/main/java/no/digipost/api/useragreements/client/filters/request/RequestMessageSignatureUtil.java
index 62d8306..eafe1d6 100644
--- a/src/main/java/no/digipost/api/useragreements/client/filters/request/RequestMessageSignatureUtil.java
+++ b/src/main/java/no/digipost/api/useragreements/client/filters/request/RequestMessageSignatureUtil.java
@@ -15,7 +15,8 @@
*/
package no.digipost.api.useragreements.client.filters.request;
-import org.apache.http.HttpHeaders;
+
+import org.apache.hc.core5.http.HttpHeaders;
import java.util.Arrays;
import java.util.List;
diff --git a/src/main/java/no/digipost/api/useragreements/client/filters/request/RequestSignatureInterceptor.java b/src/main/java/no/digipost/api/useragreements/client/filters/request/RequestSignatureInterceptor.java
index 2c988d9..70a12ff 100644
--- a/src/main/java/no/digipost/api/useragreements/client/filters/request/RequestSignatureInterceptor.java
+++ b/src/main/java/no/digipost/api/useragreements/client/filters/request/RequestSignatureInterceptor.java
@@ -18,12 +18,13 @@
import com.google.common.io.ByteStreams;
import no.digipost.api.useragreements.client.Headers;
import no.digipost.api.useragreements.client.security.Signer;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpEntityEnclosingRequest;
-import org.apache.http.HttpException;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpRequestInterceptor;
-import org.apache.http.protocol.HttpContext;
+import org.apache.hc.core5.http.ClassicHttpRequest;
+import org.apache.hc.core5.http.EntityDetails;
+import org.apache.hc.core5.http.HttpEntity;
+import org.apache.hc.core5.http.HttpException;
+import org.apache.hc.core5.http.HttpRequest;
+import org.apache.hc.core5.http.HttpRequestInterceptor;
+import org.apache.hc.core5.http.protocol.HttpContext;
import org.bouncycastle.util.encoders.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -57,10 +58,9 @@ private void setSignatureHeader(final HttpRequest httpRequest) {
}
@Override
- public void process(HttpRequest httpRequest, HttpContext httpContext) throws HttpException, IOException {
-
- if(httpRequest instanceof HttpEntityEnclosingRequest) {
- HttpEntityEnclosingRequest request = (HttpEntityEnclosingRequest) httpRequest;
+ public void process(HttpRequest httpRequest, EntityDetails entityDetails, HttpContext httpContext) throws HttpException, IOException {
+ if(httpRequest instanceof ClassicHttpRequest) {
+ ClassicHttpRequest request = (ClassicHttpRequest) httpRequest;
HttpEntity rqEntity = request.getEntity();
if (rqEntity == null) {
diff --git a/src/main/java/no/digipost/api/useragreements/client/filters/request/RequestToSign.java b/src/main/java/no/digipost/api/useragreements/client/filters/request/RequestToSign.java
index 8c86cd5..ba1508d 100644
--- a/src/main/java/no/digipost/api/useragreements/client/filters/request/RequestToSign.java
+++ b/src/main/java/no/digipost/api/useragreements/client/filters/request/RequestToSign.java
@@ -15,10 +15,10 @@
*/
package no.digipost.api.useragreements.client.filters.request;
-import org.apache.http.Header;
-import org.apache.http.HttpRequest;
-import java.net.URI;
+import org.apache.hc.core5.http.Header;
+import org.apache.hc.core5.http.HttpRequest;
+
import java.net.URISyntaxException;
import java.util.SortedMap;
import java.util.TreeMap;
@@ -33,13 +33,13 @@ public RequestToSign(final HttpRequest httpRequest) {
public String getMethod() {
- return clientRequest.getRequestLine().getMethod();
+ return clientRequest.getMethod();
}
public SortedMap getHeaders() {
TreeMap sortedHeaders = new TreeMap();
- Header[] headers = clientRequest.getAllHeaders();
+ Header[] headers = clientRequest.getHeaders();
for (Header header : headers) {
sortedHeaders.put(header.getName(), header.getValue());
}
@@ -48,17 +48,17 @@ public SortedMap getHeaders() {
public String getPath() {
- try {
- String path = new URI(clientRequest.getRequestLine().getUri()).getPath();
- return path != null ? path : "";
- } catch (URISyntaxException e) {
- throw new RuntimeException(e.getMessage(), e);
- }
+ String path = clientRequest.getPath();
+ return path != null ? path : "";
}
public String getParameters() {
- return queryParametersFromURI(clientRequest.getRequestLine().getUri());
+ try {
+ return queryParametersFromURI(clientRequest.getUri().toString());
+ } catch (URISyntaxException e) {
+ return "";
+ }
}
static String queryParametersFromURI(String uri){
diff --git a/src/main/java/no/digipost/api/useragreements/client/filters/request/RequestUserAgentInterceptor.java b/src/main/java/no/digipost/api/useragreements/client/filters/request/RequestUserAgentInterceptor.java
index 78de014..ff47efa 100644
--- a/src/main/java/no/digipost/api/useragreements/client/filters/request/RequestUserAgentInterceptor.java
+++ b/src/main/java/no/digipost/api/useragreements/client/filters/request/RequestUserAgentInterceptor.java
@@ -15,19 +15,20 @@
*/
package no.digipost.api.useragreements.client.filters.request;
-import org.apache.http.HttpException;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpRequestInterceptor;
-import org.apache.http.protocol.HttpContext;
+import org.apache.hc.core5.http.EntityDetails;
+import org.apache.hc.core5.http.HttpException;
+import org.apache.hc.core5.http.HttpRequest;
+import org.apache.hc.core5.http.HttpRequestInterceptor;
+import org.apache.hc.core5.http.protocol.HttpContext;
import java.io.IOException;
import static no.digipost.api.useragreements.client.util.UserAgent.DIGIPOST_USER_AGENT;
-import static org.apache.http.HttpHeaders.USER_AGENT;
+import static org.apache.hc.core5.http.HttpHeaders.USER_AGENT;
public class RequestUserAgentInterceptor implements HttpRequestInterceptor {
@Override
- public void process(HttpRequest httpRequest, HttpContext httpContext) throws HttpException, IOException {
+ public void process(HttpRequest httpRequest, EntityDetails entityDetails, HttpContext httpContext) throws HttpException, IOException {
httpRequest.setHeader(USER_AGENT, DIGIPOST_USER_AGENT);
}
}
diff --git a/src/main/java/no/digipost/api/useragreements/client/filters/response/ResponseDateInterceptor.java b/src/main/java/no/digipost/api/useragreements/client/filters/response/ResponseDateInterceptor.java
index ce12e3b..ebfa514 100644
--- a/src/main/java/no/digipost/api/useragreements/client/filters/response/ResponseDateInterceptor.java
+++ b/src/main/java/no/digipost/api/useragreements/client/filters/response/ResponseDateInterceptor.java
@@ -17,10 +17,13 @@
import no.digipost.api.useragreements.client.ServerSignatureException;
import no.digipost.api.useragreements.client.util.DateUtils;
-import org.apache.http.Header;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpResponseInterceptor;
-import org.apache.http.protocol.HttpContext;
+import org.apache.hc.core5.http.EntityDetails;
+import org.apache.hc.core5.http.Header;
+import org.apache.hc.core5.http.HttpHeaders;
+import org.apache.hc.core5.http.HttpResponse;
+import org.apache.hc.core5.http.HttpResponseInterceptor;
+import org.apache.hc.core5.http.message.StatusLine;
+import org.apache.hc.core5.http.protocol.HttpContext;
import java.time.Clock;
import java.time.ZonedDateTime;
@@ -28,7 +31,6 @@
import static java.time.ZonedDateTime.now;
import static org.apache.commons.lang3.StringUtils.isNotBlank;
-import static org.apache.http.HttpHeaders.DATE;
public class ResponseDateInterceptor implements HttpResponseInterceptor {
@@ -44,9 +46,9 @@ public ResponseDateInterceptor(Clock clock) {
}
@Override
- public void process(HttpResponse response, HttpContext context) {
+ public void process(HttpResponse response, EntityDetails entityDetails, HttpContext context) {
String dateHeader = null;
- Header firstHeader = response.getFirstHeader(DATE);
+ Header firstHeader = response.getFirstHeader(HttpHeaders.DATE);
if(firstHeader != null){
dateHeader = firstHeader.getValue();
}
@@ -54,7 +56,7 @@ public void process(HttpResponse response, HttpContext context) {
if (isNotBlank(dateHeader)) {
sjekkDato(dateHeader, response);
} else {
- throw new ServerSignatureException(response.getStatusLine(), "Respons mangler Date-header");
+ throw new ServerSignatureException(new StatusLine(response), "Respons mangler Date-header");
}
}
@@ -64,19 +66,19 @@ private void sjekkDato(final String dateOnRFC1123Format, HttpResponse response)
sjekkAtDatoHeaderIkkeErForGammel(dateOnRFC1123Format, date, response);
sjekkAtDatoHeaderIkkeErForNy(dateOnRFC1123Format, date, response);
} catch (DateTimeParseException e) {
- throw new ServerSignatureException(response.getStatusLine(), "Date-header kunne ikke parses: " + e.getMessage(), e);
+ throw new ServerSignatureException(new StatusLine(response), "Date-header kunne ikke parses: " + e.getMessage(), e);
}
}
private void sjekkAtDatoHeaderIkkeErForGammel(final String headerDate, final ZonedDateTime parsedDate, HttpResponse response) {
if (parsedDate.isBefore(now(clock).minusMinutes(AKSEPTABEL_TIDSDIFFERANSE_MINUTTER))) {
- throw new ServerSignatureException(response.getStatusLine(), "Date-header fra server er for gammel: " + headerDate);
+ throw new ServerSignatureException(new StatusLine(response), "Date-header fra server er for gammel: " + headerDate);
}
}
private void sjekkAtDatoHeaderIkkeErForNy(final String headerDate, final ZonedDateTime parsedDate, HttpResponse response) {
if (parsedDate.isAfter(now(clock).plusMinutes(AKSEPTABEL_TIDSDIFFERANSE_MINUTTER))) {
- throw new ServerSignatureException(response.getStatusLine(), "Date-header fra server er for ny: " + headerDate);
+ throw new ServerSignatureException(new StatusLine(response), "Date-header fra server er for ny: " + headerDate);
}
}
}
diff --git a/src/main/java/no/digipost/api/useragreements/client/response/ResponseUtils.java b/src/main/java/no/digipost/api/useragreements/client/response/ResponseUtils.java
index 33d1a9c..5aaa698 100644
--- a/src/main/java/no/digipost/api/useragreements/client/response/ResponseUtils.java
+++ b/src/main/java/no/digipost/api/useragreements/client/response/ResponseUtils.java
@@ -22,10 +22,11 @@
import no.digipost.api.useragreements.client.Headers;
import no.digipost.api.useragreements.client.RuntimeIOException;
import no.digipost.api.useragreements.client.UnexpectedResponseException;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.StatusLine;
-import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
+import org.apache.hc.core5.http.ClassicHttpResponse;
+import org.apache.hc.core5.http.HttpEntity;
+import org.apache.hc.core5.http.HttpResponse;
+import org.apache.hc.core5.http.message.StatusLine;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -59,7 +60,7 @@ public final class ResponseUtils {
public static T mapOkResponseOrThrowException(HttpResponse response, Function okResponseMapper) {
- final StatusLine statusLine = response.getStatusLine();
+ final StatusLine statusLine = new StatusLine(response);
if (isOkResponse(statusLine.getStatusCode())) {
return okResponseMapper.apply(response);
} else if (statusLine.getStatusCode() == 429) { // Too Many Requests
@@ -82,12 +83,12 @@ public static T unmarshallEntity(final HttpResponse response, final Class
try (Stream entityStream = unmarshallEntities(response, returnType)) {
Iterator entityIterator = entityStream.limit(2).iterator();
if (!entityIterator.hasNext()) {
- throw new UnexpectedResponseException(response.getStatusLine(), NO_ENTITY,
+ throw new UnexpectedResponseException(new StatusLine(response), NO_ENTITY,
"Message body is empty");
}
T theEntity = entityIterator.next();
if (entityIterator.hasNext()) {
- throw new UnexpectedResponseException(response.getStatusLine(), MULTIPLE_ENTITIES,
+ throw new UnexpectedResponseException(new StatusLine(response), MULTIPLE_ENTITIES,
"Message body contained more than one entity. First: " + theEntity + ", first excess one: " + entityIterator.next());
}
return theEntity;
@@ -104,7 +105,7 @@ public static Stream unmarshallEntities(final HttpResponse response, fina
try {
return JAXB.unmarshal(new ByteArrayInputStream(xml.getBytes()), returnType);
} catch (IllegalStateException | DataBindingException e) {
- throw new UnexpectedResponseException(response.getStatusLine(), ErrorCode.GENERAL_ERROR, xml, e);
+ throw new UnexpectedResponseException(new StatusLine(response), ErrorCode.GENERAL_ERROR, xml, e);
}
});
}
@@ -115,16 +116,16 @@ public static Error readErrorEntity(final HttpResponse response) {
public static InputStream getResponseEntityContent(HttpResponse response) {
Optional closeableResponse = Optional.of(response).filter(r -> r instanceof CloseableHttpResponse).map(r -> (CloseableHttpResponse) r);
- StatusLine statusLine = response.getStatusLine();
- HttpEntity entity = response.getEntity();
+ StatusLine statusLine = new StatusLine(response);
+ try {
+ HttpEntity entity = ((ClassicHttpResponse) response).getEntity();
if (entity == null) {
closeableResponse.flatMap(r -> close(r)).map(RuntimeIOException::from).ifPresent(e -> { throw e; });
return null;
}
- try {
return entity.getContent();
- } catch (UnsupportedOperationException | IOException e) {
+ } catch (UnsupportedOperationException | IOException | ClassCastException e) {
UnexpectedResponseException mainException = new UnexpectedResponseException(statusLine, ErrorCode.GENERAL_ERROR, e.getMessage(), e);
closeableResponse.flatMap(r -> close(r)).ifPresent(mainException::addSuppressed);
throw mainException;
@@ -187,7 +188,7 @@ public static Optional getValueOfFirstHeader(HttpResponse response, Stri
public static boolean isOkResponse(HttpResponse response) {
- return isOkResponse(response.getStatusLine());
+ return isOkResponse(new StatusLine(response));
}
public static boolean isOkResponse(StatusLine status) {
diff --git a/src/test/java/no/digipost/api/useragreements/client/Examples.java b/src/test/java/no/digipost/api/useragreements/client/Examples.java
index 4caed48..13e38d7 100644
--- a/src/test/java/no/digipost/api/useragreements/client/Examples.java
+++ b/src/test/java/no/digipost/api/useragreements/client/Examples.java
@@ -15,8 +15,9 @@
*/
package no.digipost.api.useragreements.client;
-import org.apache.http.HttpHost;
-import org.apache.http.impl.client.HttpClientBuilder;
+
+import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
+import org.apache.hc.core5.http.HttpHost;
import java.io.InputStream;
import java.net.URI;
@@ -34,7 +35,7 @@ public class Examples {
public void instantiate_client() {
InputStream key = getClass().getResourceAsStream("certificate.p12");
- HttpHost proxy = new HttpHost("proxy.example.com", 8080, "http");
+ HttpHost proxy = new HttpHost("proxy.example.com", 8080);
final BrokerId brokerId = BrokerId.of(1234L);
diff --git a/src/test/java/no/digipost/api/useragreements/client/filters/response/ResponseDateInterceptorTest.java b/src/test/java/no/digipost/api/useragreements/client/filters/response/ResponseDateInterceptorTest.java
index 44f3cd2..e22886a 100644
--- a/src/test/java/no/digipost/api/useragreements/client/filters/response/ResponseDateInterceptorTest.java
+++ b/src/test/java/no/digipost/api/useragreements/client/filters/response/ResponseDateInterceptorTest.java
@@ -16,12 +16,11 @@
package no.digipost.api.useragreements.client.filters.response;
import no.digipost.api.useragreements.client.ServerSignatureException;
-import org.apache.http.HttpException;
-import org.apache.http.HttpResponse;
-import org.apache.http.ProtocolVersion;
-import org.apache.http.StatusLine;
-import org.apache.http.message.BasicHeader;
-import org.apache.http.protocol.HttpContext;
+import org.apache.hc.core5.http.EntityDetails;
+import org.apache.hc.core5.http.HttpException;
+import org.apache.hc.core5.http.HttpResponse;
+import org.apache.hc.core5.http.message.BasicHeader;
+import org.apache.hc.core5.http.protocol.HttpContext;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -49,12 +48,17 @@ public class ResponseDateInterceptorTest {
@Mock
private HttpContext httpContextMock;
+ @Mock
+ private EntityDetails entityDetailsMock;
+
@Mock
private HttpResponse httpResponseMock;
@Before
public void setUp() {
- when(httpResponseMock.getStatusLine()).thenReturn(new StatusLineMock(200));
+ when(httpResponseMock.getCode()).thenReturn(200);
+ when(httpResponseMock.getReasonPhrase()).thenReturn(null);
+ when(httpResponseMock.getVersion()).thenReturn(null);
}
@Test
@@ -62,7 +66,7 @@ public void setUp() {
ResponseDateInterceptor interceptor = new ResponseDateInterceptor();
expectedException.expect(ServerSignatureException.class);
expectedException.expectMessage(containsString("Respons mangler Date-header"));
- interceptor.process(httpResponseMock, httpContextMock);
+ interceptor.process(httpResponseMock, entityDetailsMock, httpContextMock);
}
@Test
@@ -71,7 +75,7 @@ public void setUp() {
when(httpResponseMock.getFirstHeader("Date")).thenReturn(new BasicHeader("Date", "16. januar 2012 - 16:14:23"));
expectedException.expect(ServerSignatureException.class);
expectedException.expectMessage(containsString("Date-header kunne ikke parses"));
- interceptor.process(httpResponseMock, httpContextMock);
+ interceptor.process(httpResponseMock, entityDetailsMock, httpContextMock);
}
@Test
@@ -80,7 +84,7 @@ public void setUp() {
when(httpResponseMock.getFirstHeader("Date")).thenReturn(new BasicHeader("Date", "Tue, 04 Nov 2014 21:10:58 GMT"));
expectedException.expect(ServerSignatureException.class);
expectedException.expectMessage(containsString("Date-header fra server er for ny"));
- interceptor.process(httpResponseMock, httpContextMock);
+ interceptor.process(httpResponseMock, entityDetailsMock, httpContextMock);
}
@Test
@@ -89,29 +93,6 @@ public void setUp() {
when(httpResponseMock.getFirstHeader("Date")).thenReturn(new BasicHeader("Date", "Tue, 04 Nov 2014 21:10:58 GMT"));
expectedException.expect(ServerSignatureException.class);
expectedException.expectMessage(containsString("Date-header fra server er for gammel"));
- interceptor.process(httpResponseMock, httpContextMock);
- }
-
- public static class StatusLineMock implements StatusLine {
-
- private final int statusCode;
- public StatusLineMock(int statusCode){
- this.statusCode = statusCode;
- }
-
- @Override
- public ProtocolVersion getProtocolVersion() {
- return null;
- }
-
- @Override
- public int getStatusCode() {
- return statusCode;
- }
-
- @Override
- public String getReasonPhrase() {
- return null;
- }
+ interceptor.process(httpResponseMock, entityDetailsMock, httpContextMock);
}
}
diff --git a/src/test/java/no/digipost/api/useragreements/client/response/ResponseUtilsTest.java b/src/test/java/no/digipost/api/useragreements/client/response/ResponseUtilsTest.java
index 05325c1..618265d 100644
--- a/src/test/java/no/digipost/api/useragreements/client/response/ResponseUtilsTest.java
+++ b/src/test/java/no/digipost/api/useragreements/client/response/ResponseUtilsTest.java
@@ -16,10 +16,8 @@
package no.digipost.api.useragreements.client.response;
import no.digipost.api.useragreements.client.Headers;
-import org.apache.http.HttpResponse;
-import org.apache.http.ProtocolVersion;
-import org.apache.http.message.BasicHttpResponse;
-import org.apache.http.message.BasicStatusLine;
+import org.apache.hc.core5.http.HttpResponse;
+import org.apache.hc.core5.http.message.BasicHttpResponse;
import org.junit.Test;
import java.time.Clock;
@@ -85,7 +83,7 @@ public void malformedRetryAfterHeaderIncludesSuppressedException() {
private static HttpResponse tooManyRequestsResponseWithRetryAfter(String retryAfterValue) {
- HttpResponse tooManyRequestsErrorResponse = new BasicHttpResponse(new BasicStatusLine(new ProtocolVersion("http", 1, 1), 429, "Too Many Requests"));
+ HttpResponse tooManyRequestsErrorResponse = new BasicHttpResponse(429);
tooManyRequestsErrorResponse.addHeader(Headers.Retry_After, retryAfterValue);
return tooManyRequestsErrorResponse;
}