[java-opensaml] branch main updated: JSSH-16: Update to Apache HttpClient 5.x

Brent Putman putmanb at georgetown.edu
Tue Feb 21 19:31:11 UTC 2023


This is an automated email from the git hooks/post-receive script.

putmanb pushed a commit to branch main
in repository java-opensaml.

View the commit online:
http://git.shibboleth.net/view/?p=java-opensaml.git;a=commit;h=8de17c9a6a9857ae59718f4c93ce685a8de0113d

The following commit(s) were added to refs/heads/main by this push:
     new 8de17c9a6 JSSH-16: Update to Apache HttpClient 5.x
8de17c9a6 is described below

commit 8de17c9a6a9857ae59718f4c93ce685a8de0113d
Author: Brent Putman <putmanb at georgetown.edu>
AuthorDate: Thu Feb 2 03:15:35 2023 -0500

    JSSH-16: Update to Apache HttpClient 5.x
    
    Initial refactor.
---
 opensaml-core-impl/pom.xml                         |  8 ++--
 .../opensaml/core/metrics/impl/HTTPReporter.java   | 26 ++++++------
 opensaml-messaging-api/pom.xml                     |  8 ++--
 .../httpclient/HttpClientRequestContext.java       |  5 ++-
 .../AbstractHttpClientResponseMessageDecoder.java  |  8 ++--
 .../BaseHttpClientResponseXMLMessageDecoder.java   |  1 -
 .../HttpClientResponseMessageDecoder.java          |  6 +--
 .../AbstractHttpClientRequestMessageEncoder.java   |  8 ++--
 .../HttpClientRequestMessageEncoder.java           |  6 +--
 opensaml-saml-impl/pom.xml                         | 11 +++--
 ...ecordServerTLSEntityAuthenticationtHandler.java |  3 +-
 .../impl/AbstractDynamicHTTPMetadataResolver.java  | 49 ++++++++++------------
 .../impl/FileBackedHTTPMetadataResolver.java       |  2 +-
 .../FunctionDrivenDynamicHTTPMetadataResolver.java |  2 +-
 .../resolver/impl/HTTPMetadataResolver.java        | 30 ++++++-------
 .../resolver/filter/impl/EntityRoleFilterTest.java |  2 +-
 .../AbstractDynamicHTTPMetadataResolverTest.java   | 32 +++++++-------
 .../resolver/impl/HTTPMetadataResolverTest.java    |  2 +-
 .../src/test/resources/logback-test.xml            | 16 ++++++-
 opensaml-security-api/pom.xml                      |  2 +-
 .../HttpClientSecurityConfiguration.java           |  2 +-
 .../HttpClientSecurityContextHandler.java          | 10 ++---
 .../httpclient/HttpClientSecurityParameters.java   | 12 +++---
 .../httpclient/HttpClientSecuritySupport.java      | 25 ++++++-----
 .../messaging/HttpClientSecurityContext.java       |  3 +-
 .../httpclient/HttpClientSecuritySupportTest.java  | 10 ++---
 .../SecurityEnhancedHTTPResourceTest.java          |  2 +-
 opensaml-security-impl/pom.xml                     |  7 ++--
 .../impl/BasicHttpClientSecurityConfiguration.java | 10 ++---
 .../impl/SecurityEnhancedHttpClientSupport.java    |  3 +-
 .../impl/SecurityEnhancedTLSSocketFactory.java     | 11 ++---
 .../ThreadLocalClientTLSCredentialHandler.java     |  8 ++--
 .../impl/ThreadLocalServerTLSHandler.java          |  8 ++--
 .../BasicHttpClientSecurityConfigurationTest.java  |  8 ++--
 ...icHttpClientSecurityParametersResolverTest.java |  4 +-
 .../httpclient/impl/MockTLSSocketFactory.java      |  9 ++--
 .../impl/SecurityEnhancedTLSSocketFactoryTest.java | 21 +++++-----
 opensaml-soap-api/pom.xml                          |  9 ++--
 .../http/AbstractPipelineHttpSOAPClient.java       | 28 ++++++-------
 .../opensaml/soap/client/http/HttpSOAPClient.java  | 28 ++++++-------
 opensaml-soap-impl/pom.xml                         | 10 ++---
 .../http/impl/HttpClientResponseSOAP11Decoder.java | 16 +++----
 .../http/impl/HttpClientRequestSOAP11Encoder.java  | 14 +++----
 .../impl/HttpClientResponseSOAP11DecoderTest.java  | 24 ++++++-----
 .../impl/HttpClientRequestSOAP11EncoderTest.java   | 10 ++---
 opensaml-spring/pom.xml                            |  2 +-
 .../spring/tls/TLSSocketFactoryFactoryBean.java    |  3 +-
 47 files changed, 265 insertions(+), 259 deletions(-)

diff --git a/opensaml-core-impl/pom.xml b/opensaml-core-impl/pom.xml
index 76878c4f7..fd51cdc76 100644
--- a/opensaml-core-impl/pom.xml
+++ b/opensaml-core-impl/pom.xml
@@ -52,12 +52,12 @@
         </dependency>    
 
         <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpclient</artifactId>
+            <groupId>${httpclient.groupId}</groupId>
+            <artifactId>${httpclient.artifactId}</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpcore</artifactId>
+            <groupId>${httpclient.httpcore.groupId}</groupId>
+            <artifactId>${httpclient.httpcore.artifactId}</artifactId>
         </dependency>
 
         <!-- Provided Dependencies -->
diff --git a/opensaml-core-impl/src/main/java/org/opensaml/core/metrics/impl/HTTPReporter.java b/opensaml-core-impl/src/main/java/org/opensaml/core/metrics/impl/HTTPReporter.java
index 85d937f2f..ec5e03f3a 100644
--- a/opensaml-core-impl/src/main/java/org/opensaml/core/metrics/impl/HTTPReporter.java
+++ b/opensaml-core-impl/src/main/java/org/opensaml/core/metrics/impl/HTTPReporter.java
@@ -28,14 +28,14 @@ import java.util.concurrent.TimeUnit;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.entity.EntityBuilder;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.entity.ContentType;
+import org.apache.hc.client5.http.classic.HttpClient;
+import org.apache.hc.client5.http.classic.methods.HttpPost;
+import org.apache.hc.client5.http.entity.EntityBuilder;
+import org.apache.hc.client5.http.protocol.HttpClientContext;
+import org.apache.hc.core5.http.ContentType;
+import org.apache.hc.core5.http.HttpRequest;
+import org.apache.hc.core5.http.HttpResponse;
+import org.apache.hc.core5.http.HttpStatus;
 import org.opensaml.security.httpclient.HttpClientSecurityParameters;
 import org.opensaml.security.httpclient.HttpClientSecuritySupport;
 import org.slf4j.Logger;
@@ -266,13 +266,13 @@ public class HTTPReporter extends ScheduledReporter implements InitializableComp
                 entityBuilder.setBinary(output.toByteArray());
                 httpRequest.setEntity(entityBuilder.build());
 
-                final HttpResponse response = httpClient.execute(httpRequest, httpContext);
-                HttpClientSecuritySupport.checkTLSCredentialEvaluated(httpContext, httpRequest.getURI().getScheme());
+                final HttpResponse response = httpClient.executeOpen(null, httpRequest, httpContext);
+                HttpClientSecuritySupport.checkTLSCredentialEvaluated(httpContext, httpRequest.getScheme());
                 
-                if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
+                if (response.getCode() == HttpStatus.SC_OK) {
                     log.debug("Metrics delivered successfully to collector");
                 } else {
-                    log.error("Collector responded with HTTP status {}", response.getStatusLine().getStatusCode());
+                    log.error("Collector responded with HTTP status {}", response.getCode());
                 }
             } catch (final IOException e) {
                 log.error("Error sending metric registry to collection point {}", collectorURL, e);
@@ -295,7 +295,7 @@ public class HTTPReporter extends ScheduledReporter implements InitializableComp
      * @param request the HTTP client request
      * @return the client context instance
      */
-    @Nonnull private HttpClientContext buildHttpContext(@Nonnull final HttpUriRequest request) {
+    @Nonnull private HttpClientContext buildHttpContext(@Nonnull final HttpRequest request) {
         final HttpClientContext clientContext = HttpClientContext.create();
         HttpClientSecuritySupport.marshalSecurityParameters(clientContext, httpClientSecurityParameters, false);
         HttpClientSecuritySupport.addDefaultTLSTrustEngineCriteria(clientContext, request);
diff --git a/opensaml-messaging-api/pom.xml b/opensaml-messaging-api/pom.xml
index e7185abc8..0c996e563 100644
--- a/opensaml-messaging-api/pom.xml
+++ b/opensaml-messaging-api/pom.xml
@@ -34,14 +34,14 @@
         	<artifactId>guava</artifactId>
         </dependency>
 
+
         <dependency>
             <groupId>${httpclient.groupId}</groupId>
-            <artifactId>httpclient</artifactId>
+            <artifactId>${httpclient.artifactId}</artifactId>
         </dependency>
-
         <dependency>
-            <groupId>${httpclient.groupId}</groupId>
-            <artifactId>httpcore</artifactId>
+            <groupId>${httpclient.httpcore.groupId}</groupId>
+            <artifactId>${httpclient.httpcore.artifactId}</artifactId>
         </dependency>
 
         <!-- Provided Dependencies -->
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/context/httpclient/HttpClientRequestContext.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/context/httpclient/HttpClientRequestContext.java
index b569b079d..eeac9117a 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/context/httpclient/HttpClientRequestContext.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/context/httpclient/HttpClientRequestContext.java
@@ -19,11 +19,12 @@ package org.opensaml.messaging.context.httpclient;
 
 import javax.annotation.Nullable;
 
-import org.apache.http.client.protocol.HttpClientContext;
+import org.apache.hc.client5.http.protocol.HttpClientContext;
 import org.opensaml.messaging.context.BaseContext;
 
 /**
- * A context impl holding data related to the execution of an {@link org.apache.http.client.HttpClient} request.
+ * A context impl holding data related to the execution of an {@link org.apache.hc.client5.http.classic.HttpClient}
+ * request.
  */
 public final class HttpClientRequestContext extends BaseContext {
     
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/httpclient/AbstractHttpClientResponseMessageDecoder.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/httpclient/AbstractHttpClientResponseMessageDecoder.java
index cd428cd55..7e0c36ad0 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/httpclient/AbstractHttpClientResponseMessageDecoder.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/httpclient/AbstractHttpClientResponseMessageDecoder.java
@@ -19,7 +19,7 @@ package org.opensaml.messaging.decoder.httpclient;
 
 import javax.annotation.Nullable;
 
-import org.apache.http.HttpResponse;
+import org.apache.hc.core5.http.ClassicHttpResponse;
 import org.opensaml.messaging.decoder.AbstractMessageDecoder;
 import org.opensaml.messaging.decoder.MessageDecodingException;
 
@@ -32,15 +32,15 @@ public abstract class AbstractHttpClientResponseMessageDecoder extends AbstractM
         implements HttpClientResponseMessageDecoder {
 
     /** The HTTP client response. */
-    private HttpResponse response;
+    private ClassicHttpResponse response;
 
     /** {@inheritDoc} */
-    @Nullable public HttpResponse getHttpResponse() {
+    @Nullable public ClassicHttpResponse getHttpResponse() {
         return response;
     }
 
     /** {@inheritDoc} */
-    public synchronized void setHttpResponse(@Nullable final HttpResponse clientResponse) {
+    public synchronized void setHttpResponse(@Nullable final ClassicHttpResponse clientResponse) {
         checkSetterPreconditions();
 
         response = clientResponse;
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/httpclient/BaseHttpClientResponseXMLMessageDecoder.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/httpclient/BaseHttpClientResponseXMLMessageDecoder.java
index 0042c0cb3..36b2978b7 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/httpclient/BaseHttpClientResponseXMLMessageDecoder.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/httpclient/BaseHttpClientResponseXMLMessageDecoder.java
@@ -27,7 +27,6 @@ import net.shibboleth.shared.xml.ParserPool;
 import net.shibboleth.shared.xml.SerializeSupport;
 import net.shibboleth.shared.xml.XMLParserException;
 
-import org.apache.http.HttpResponse;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
 import org.opensaml.core.xml.io.MarshallingException;
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/httpclient/HttpClientResponseMessageDecoder.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/httpclient/HttpClientResponseMessageDecoder.java
index 0899adbea..8f9455188 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/httpclient/HttpClientResponseMessageDecoder.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/httpclient/HttpClientResponseMessageDecoder.java
@@ -19,7 +19,7 @@ package org.opensaml.messaging.decoder.httpclient;
 
 import javax.annotation.Nullable;
 
-import org.apache.http.HttpResponse;
+import org.apache.hc.core5.http.ClassicHttpResponse;
 import org.opensaml.messaging.decoder.MessageDecoder;
 
 
@@ -33,13 +33,13 @@ public interface HttpClientResponseMessageDecoder extends MessageDecoder {
      * 
      * @return the HTTP client response
      */
-    @Nullable HttpResponse getHttpResponse();
+    @Nullable ClassicHttpResponse getHttpResponse();
     
     /**
      * Set the HTTP client response on which to operate.
      * 
      * @param response the HTTP client response 
      */
-    void setHttpResponse(@Nullable final HttpResponse response);
+    void setHttpResponse(@Nullable final ClassicHttpResponse response);
     
 }
\ No newline at end of file
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/httpclient/AbstractHttpClientRequestMessageEncoder.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/httpclient/AbstractHttpClientRequestMessageEncoder.java
index a53d6eb07..0bb1077b8 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/httpclient/AbstractHttpClientRequestMessageEncoder.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/httpclient/AbstractHttpClientRequestMessageEncoder.java
@@ -19,7 +19,7 @@ package org.opensaml.messaging.encoder.httpclient;
 
 import javax.annotation.Nullable;
 
-import org.apache.http.HttpRequest;
+import org.apache.hc.core5.http.ClassicHttpRequest;
 import org.opensaml.messaging.encoder.AbstractMessageEncoder;
 import org.opensaml.messaging.encoder.servlet.HttpServletResponseMessageEncoder;
 
@@ -32,15 +32,15 @@ public abstract class AbstractHttpClientRequestMessageEncoder extends AbstractMe
         implements HttpClientRequestMessageEncoder {
 
     /** The HTTP client request. */
-    @Nullable private HttpRequest request;
+    @Nullable private ClassicHttpRequest request;
 
     /** {@inheritDoc} */
-    @Nullable public HttpRequest getHttpRequest() {
+    @Nullable public ClassicHttpRequest getHttpRequest() {
         return request;
     }
 
     /** {@inheritDoc} */
-    public synchronized void setHttpRequest(@Nullable final HttpRequest httpRequest) {
+    public synchronized void setHttpRequest(@Nullable final ClassicHttpRequest httpRequest) {
         checkSetterPreconditions();
 
         request = httpRequest;
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/httpclient/HttpClientRequestMessageEncoder.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/httpclient/HttpClientRequestMessageEncoder.java
index 223a14d5b..ba64ff655 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/httpclient/HttpClientRequestMessageEncoder.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/httpclient/HttpClientRequestMessageEncoder.java
@@ -19,7 +19,7 @@ package org.opensaml.messaging.encoder.httpclient;
 
 import javax.annotation.Nullable;
 
-import org.apache.http.HttpRequest;
+import org.apache.hc.core5.http.ClassicHttpRequest;
 import org.opensaml.messaging.encoder.MessageEncoder;
 
 /**
@@ -32,13 +32,13 @@ public interface HttpClientRequestMessageEncoder extends MessageEncoder {
      * 
      * @return the HTTP client request
      */
-    @Nullable HttpRequest getHttpRequest();
+    @Nullable ClassicHttpRequest getHttpRequest();
     
     /**
      * Set the HTTP client request on which to operate.
      * 
      * @param request the HTTP client request
      */
-    void setHttpRequest(@Nullable final HttpRequest request);
+    void setHttpRequest(@Nullable final ClassicHttpRequest request);
 
 }
diff --git a/opensaml-saml-impl/pom.xml b/opensaml-saml-impl/pom.xml
index 583d44506..7a22fa85e 100644
--- a/opensaml-saml-impl/pom.xml
+++ b/opensaml-saml-impl/pom.xml
@@ -134,13 +134,12 @@
 
         <dependency>
             <groupId>${httpclient.groupId}</groupId>
-            <artifactId>httpclient</artifactId>
-        </dependency> 
-
+            <artifactId>${httpclient.artifactId}</artifactId>
+        </dependency>
         <dependency>
-            <groupId>${httpclient.groupId}</groupId>
-            <artifactId>httpcore</artifactId>
-        </dependency> 
+            <groupId>${httpclient.httpcore.groupId}</groupId>
+            <artifactId>${httpclient.httpcore.artifactId}</artifactId>
+        </dependency>
 
         <!-- Provided Dependencies -->
         <dependency>
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/binding/security/impl/CheckAndRecordServerTLSEntityAuthenticationtHandler.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/binding/security/impl/CheckAndRecordServerTLSEntityAuthenticationtHandler.java
index 61d6d9e26..7d4868163 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/binding/security/impl/CheckAndRecordServerTLSEntityAuthenticationtHandler.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/binding/security/impl/CheckAndRecordServerTLSEntityAuthenticationtHandler.java
@@ -20,8 +20,7 @@ package org.opensaml.saml.common.binding.security.impl;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.protocol.HttpClientContext;
+import org.apache.hc.client5.http.protocol.HttpClientContext;
 import org.opensaml.messaging.context.InOutOperationContext;
 import org.opensaml.messaging.context.MessageContext;
 import org.opensaml.messaging.context.httpclient.HttpClientRequestContext;
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/AbstractDynamicHTTPMetadataResolver.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/AbstractDynamicHTTPMetadataResolver.java
index 8e97e76f5..1423c7a97 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/AbstractDynamicHTTPMetadataResolver.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/AbstractDynamicHTTPMetadataResolver.java
@@ -30,14 +30,13 @@ import java.util.stream.Collectors;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import org.apache.http.Header;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.ResponseHandler;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.client.protocol.HttpClientContext;
+import org.apache.hc.client5.http.classic.HttpClient;
+import org.apache.hc.client5.http.classic.methods.HttpGet;
+import org.apache.hc.client5.http.protocol.HttpClientContext;
+import org.apache.hc.core5.http.ClassicHttpRequest;
+import org.apache.hc.core5.http.ClassicHttpResponse;
+import org.apache.hc.core5.http.HttpStatus;
+import org.apache.hc.core5.http.io.HttpClientResponseHandler;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSource;
@@ -93,7 +92,7 @@ public abstract class AbstractDynamicHTTPMetadataResolver extends AbstractDynami
     @NonnullAfterInit private Set<MediaType> supportedMediaTypes;
     
     /** HttpClient ResponseHandler instance to use. */
-    @Nonnull private ResponseHandler<XMLObject> responseHandler;
+    @Nonnull private HttpClientResponseHandler<XMLObject> responseHandler;
         
     /** Optional HttpClient security parameters.*/
     @Nullable private HttpClientSecurityParameters httpClientSecurityParameters;
@@ -257,7 +256,7 @@ public abstract class AbstractDynamicHTTPMetadataResolver extends AbstractDynami
     @Nullable protected XMLObject fetchFromOriginSource(@Nonnull final CriteriaSet criteria) 
             throws IOException {
             
-        final HttpUriRequest request = buildHttpRequest(criteria);
+        final ClassicHttpRequest request = buildHttpRequest(criteria);
         if (request == null) {
             log.debug("{} Could not build request based on input criteria, unable to query", getLogPrefix());
             return null;
@@ -266,9 +265,9 @@ public abstract class AbstractDynamicHTTPMetadataResolver extends AbstractDynami
         final HttpClientContext context = buildHttpClientContext(request);
         
         try {
-            MDC.put(MDC_ATTRIB_CURRENT_REQUEST_URI, request.getURI().toString());
-            final XMLObject result = httpClient.execute(request, responseHandler, context);
-            HttpClientSecuritySupport.checkTLSCredentialEvaluated(context, request.getURI().getScheme());
+            MDC.put(MDC_ATTRIB_CURRENT_REQUEST_URI, request.getRequestUri());
+            final XMLObject result = httpClient.execute(request, context, responseHandler);
+            HttpClientSecuritySupport.checkTLSCredentialEvaluated(context, request.getScheme());
             return result;
         } finally {
             MDC.remove(MDC_ATTRIB_CURRENT_REQUEST_URI);
@@ -281,7 +280,7 @@ public abstract class AbstractDynamicHTTPMetadataResolver extends AbstractDynami
      * @param criteria the input criteria set
      * @return the newly constructed request, or null if it can not be built from the supplied criteria
      */
-    @Nullable protected HttpUriRequest buildHttpRequest(@Nonnull final CriteriaSet criteria) {
+    @Nullable protected ClassicHttpRequest buildHttpRequest(@Nonnull final CriteriaSet criteria) {
         final String url = buildRequestURL(criteria);
         log.debug("{} Built request URL of: {}", getLogPrefix(), url);
         
@@ -316,7 +315,7 @@ public abstract class AbstractDynamicHTTPMetadataResolver extends AbstractDynami
      * 
      * @return a new instance of {@link HttpClientContext}
      */
-    protected HttpClientContext buildHttpClientContext(@Nonnull final HttpUriRequest request) {
+    protected HttpClientContext buildHttpClientContext(@Nonnull final ClassicHttpRequest request) {
         final HttpClientContext context = HttpClientContext.create();
         
         HttpClientSecuritySupport.marshalSecurityParameters(context, httpClientSecurityParameters, true);
@@ -328,13 +327,13 @@ public abstract class AbstractDynamicHTTPMetadataResolver extends AbstractDynami
     /**
      * Basic HttpClient response handler for processing metadata fetch requests.
      */
-    public class BasicMetadataResponseHandler implements ResponseHandler<XMLObject> {
+    public class BasicMetadataResponseHandler implements HttpClientResponseHandler<XMLObject> {
 
         /** {@inheritDoc} */
         @Override
-        public XMLObject handleResponse(@Nonnull final HttpResponse response) throws IOException {
+        public XMLObject handleResponse(@Nonnull final ClassicHttpResponse response) throws IOException {
             
-            final int httpStatusCode = response.getStatusLine().getStatusCode();
+            final int httpStatusCode = response.getCode();
             
             final String currentRequestURI = MDC.get(MDC_ATTRIB_CURRENT_REQUEST_URI);
             
@@ -380,18 +379,14 @@ public abstract class AbstractDynamicHTTPMetadataResolver extends AbstractDynami
          * @param response the received response
          * @throws ResolverException if the response was not valid, or if there is a fatal error validating the response
          */
-        protected void validateHttpResponse(@Nonnull final HttpResponse response) throws ResolverException {
+        protected void validateHttpResponse(@Nonnull final ClassicHttpResponse response) throws ResolverException {
             if (!getSupportedMediaTypes().isEmpty()) {
-                String contentTypeValue = null;
-                final Header contentType = response.getEntity().getContentType();
-                if (contentType != null && contentType.getValue() != null) {
-                    contentTypeValue = StringSupport.trimOrNull(contentType.getValue());
-                }
-                log.debug("{} Saw raw Content-Type from response header '{}'", getLogPrefix(), contentTypeValue);
+                final String contentType = StringSupport.trimOrNull(response.getEntity().getContentType());
+                log.debug("{} Saw raw Content-Type from response header '{}'", getLogPrefix(), contentType);
                 
-                if (!MediaTypeSupport.validateContentType(contentTypeValue, getSupportedMediaTypes(), true, false)) {
+                if (!MediaTypeSupport.validateContentType(contentType, getSupportedMediaTypes(), true, false)) {
                     throw new ResolverException("HTTP response specified an unsupported Content-Type MIME type: " 
-                            + contentTypeValue);
+                            + contentType);
                 }
             }
         }
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/FileBackedHTTPMetadataResolver.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/FileBackedHTTPMetadataResolver.java
index 1b14bbbdd..2f7006cfc 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/FileBackedHTTPMetadataResolver.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/FileBackedHTTPMetadataResolver.java
@@ -28,7 +28,7 @@ import java.util.Timer;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import org.apache.http.client.HttpClient;
+import org.apache.hc.client5.http.classic.HttpClient;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.saml.metadata.resolver.filter.MetadataFilterContext;
 import org.opensaml.saml.metadata.resolver.filter.data.impl.MetadataSource;
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/FunctionDrivenDynamicHTTPMetadataResolver.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/FunctionDrivenDynamicHTTPMetadataResolver.java
index a8610f3ca..2e2f549ff 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/FunctionDrivenDynamicHTTPMetadataResolver.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/FunctionDrivenDynamicHTTPMetadataResolver.java
@@ -23,7 +23,7 @@ import java.util.function.Function;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import org.apache.http.client.HttpClient;
+import org.apache.hc.client5.http.classic.HttpClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/HTTPMetadataResolver.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/HTTPMetadataResolver.java
index 5f59ce8d8..94de0a5f6 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/HTTPMetadataResolver.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/HTTPMetadataResolver.java
@@ -26,15 +26,15 @@ import java.util.Timer;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import org.apache.http.Header;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.util.EntityUtils;
+import org.apache.hc.client5.http.classic.HttpClient;
+import org.apache.hc.client5.http.classic.methods.HttpGet;
+import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
+import org.apache.hc.client5.http.protocol.HttpClientContext;
+import org.apache.hc.core5.http.ClassicHttpRequest;
+import org.apache.hc.core5.http.ClassicHttpResponse;
+import org.apache.hc.core5.http.Header;
+import org.apache.hc.core5.http.HttpStatus;
+import org.apache.hc.core5.http.io.entity.EntityUtils;
 import org.opensaml.security.httpclient.HttpClientSecurityParameters;
 import org.opensaml.security.httpclient.HttpClientSecuritySupport;
 import org.slf4j.Logger;
@@ -203,13 +203,13 @@ public class HTTPMetadataResolver extends AbstractReloadingMetadataResolver {
     protected byte[] fetchMetadata() throws ResolverException {
         final HttpGet httpGet = buildHttpGet();
         final HttpClientContext context = buildHttpClientContext(httpGet);
-        HttpResponse response = null;
+        ClassicHttpResponse response = null;
 
         try {
             log.debug("{} Attempting to fetch metadata document from '{}'", getLogPrefix(), metadataURI);
-            response = httpClient.execute(httpGet, context);
+            response = httpClient.executeOpen(null, httpGet, context);
             HttpClientSecuritySupport.checkTLSCredentialEvaluated(context, metadataURI.getScheme());
-            final int httpStatusCode = response.getStatusLine().getStatusCode();
+            final int httpStatusCode = response.getCode();
 
             if (httpStatusCode == HttpStatus.SC_NOT_MODIFIED) {
                 log.debug("{} Metadata document from '{}' has not changed since last retrieval", 
@@ -273,7 +273,7 @@ public class HTTPMetadataResolver extends AbstractReloadingMetadataResolver {
      * 
      * @return a new instance of {@link HttpClientContext}
      */
-    protected HttpClientContext buildHttpClientContext(@Nonnull final HttpUriRequest request) {
+    protected HttpClientContext buildHttpClientContext(@Nonnull final ClassicHttpRequest request) {
         // TODO Really request should be @Nonnull, change when we remove deprecated buildHttpClientContext()
         final HttpClientContext context = HttpClientContext.create();
         
@@ -288,7 +288,7 @@ public class HTTPMetadataResolver extends AbstractReloadingMetadataResolver {
      * 
      * @param response GetMethod containing a valid HTTP response
      */
-    protected void processConditionalRetrievalHeaders(final HttpResponse response) {
+    protected void processConditionalRetrievalHeaders(final ClassicHttpResponse response) {
         Header httpHeader = response.getFirstHeader("ETag");
         if (httpHeader != null) {
             cachedMetadataETag = httpHeader.getValue();
@@ -309,7 +309,7 @@ public class HTTPMetadataResolver extends AbstractReloadingMetadataResolver {
      * 
      * @throws ResolverException thrown if there is a problem getting the raw metadata bytes from the response
      */
-    protected byte[] getMetadataBytesFromResponse(final HttpResponse response) throws ResolverException {
+    protected byte[] getMetadataBytesFromResponse(final ClassicHttpResponse response) throws ResolverException {
         log.debug("{} Attempting to extract metadata from response to request for metadata from '{}'", 
                 getLogPrefix(), getMetadataURI());
         try {
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/filter/impl/EntityRoleFilterTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/filter/impl/EntityRoleFilterTest.java
index 107187443..4e8526a92 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/filter/impl/EntityRoleFilterTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/filter/impl/EntityRoleFilterTest.java
@@ -22,7 +22,7 @@ import java.util.ArrayList;
 
 import javax.xml.namespace.QName;
 
-import org.apache.http.client.HttpClient;
+import org.apache.hc.client5.http.classic.HttpClient;
 import org.opensaml.core.testing.XMLObjectBaseTestCase;
 import org.opensaml.saml.metadata.resolver.impl.HTTPMetadataResolver;
 import org.opensaml.saml.metadata.resolver.impl.HTTPMetadataResolverTest;
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/impl/AbstractDynamicHTTPMetadataResolverTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/impl/AbstractDynamicHTTPMetadataResolverTest.java
index 84cf7753c..4e5f4b6b6 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/impl/AbstractDynamicHTTPMetadataResolverTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/impl/AbstractDynamicHTTPMetadataResolverTest.java
@@ -19,14 +19,12 @@ package org.opensaml.saml.metadata.resolver.impl;
 
 import java.io.ByteArrayOutputStream;
 
-import org.apache.http.HttpHeaders;
-import org.apache.http.HttpStatus;
-import org.apache.http.ProtocolVersion;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.ResponseHandler;
-import org.apache.http.entity.ByteArrayEntity;
-import org.apache.http.message.BasicHeader;
-import org.apache.http.message.BasicHttpResponse;
+import org.apache.hc.client5.http.classic.HttpClient;
+import org.apache.hc.core5.http.ContentType;
+import org.apache.hc.core5.http.HttpStatus;
+import org.apache.hc.core5.http.io.HttpClientResponseHandler;
+import org.apache.hc.core5.http.io.entity.ByteArrayEntity;
+import org.apache.hc.core5.http.message.BasicClassicHttpResponse;
 import org.opensaml.core.criterion.EntityIdCriterion;
 import org.opensaml.core.testing.XMLObjectBaseTestCase;
 import org.opensaml.core.xml.XMLObject;
@@ -117,11 +115,10 @@ public class AbstractDynamicHTTPMetadataResolverTest extends XMLObjectBaseTestCa
     
     @Test
     public void testResponseHandlerXMLObjectSource() throws Exception {
-        ResponseHandler<XMLObject> responseHandler = resolver.new BasicMetadataResponseHandler();
+        HttpClientResponseHandler<XMLObject> responseHandler = resolver.new BasicMetadataResponseHandler();
         
-        BasicHttpResponse httpResponse = new BasicHttpResponse(new ProtocolVersion("HTTP", 1, 1), HttpStatus.SC_OK, "OK");
-        ByteArrayEntity entity = new ByteArrayEntity(entityDescriptorBytes);
-        entity.setContentType(new BasicHeader(HttpHeaders.CONTENT_TYPE, "text/xml"));
+        BasicClassicHttpResponse httpResponse = new BasicClassicHttpResponse(HttpStatus.SC_OK, "OK");
+        ByteArrayEntity entity = new ByteArrayEntity(entityDescriptorBytes, ContentType.TEXT_XML);
         httpResponse.setEntity(entity);
         
         XMLObject result = responseHandler.handleResponse(httpResponse);
@@ -133,9 +130,9 @@ public class AbstractDynamicHTTPMetadataResolverTest extends XMLObjectBaseTestCa
     
     @Test
     public void testResponseHandlerBadStatusCode() throws Exception {
-        ResponseHandler<XMLObject> responseHandler = resolver.new BasicMetadataResponseHandler();
+        HttpClientResponseHandler<XMLObject> responseHandler = resolver.new BasicMetadataResponseHandler();
         
-        BasicHttpResponse httpResponse = new BasicHttpResponse(new ProtocolVersion("HTTP", 1, 1), HttpStatus.SC_INTERNAL_SERVER_ERROR, "Internal Error");
+        BasicClassicHttpResponse httpResponse = new BasicClassicHttpResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, "Internal Error");
         
         XMLObject result = responseHandler.handleResponse(httpResponse);
         Assert.assertNull(result);
@@ -143,11 +140,10 @@ public class AbstractDynamicHTTPMetadataResolverTest extends XMLObjectBaseTestCa
     
     @Test
     public void testResponseHandlerUnsupportedContentType() throws Exception {
-        ResponseHandler<XMLObject> responseHandler = resolver.new BasicMetadataResponseHandler();
+        HttpClientResponseHandler<XMLObject> responseHandler = resolver.new BasicMetadataResponseHandler();
         
-        BasicHttpResponse httpResponse = new BasicHttpResponse(new ProtocolVersion("HTTP", 1, 1), HttpStatus.SC_OK, "OK");
-        ByteArrayEntity entity = new ByteArrayEntity(entityDescriptorBytes);
-        entity.setContentType(new BasicHeader(HttpHeaders.CONTENT_TYPE, "application/foobar"));
+        BasicClassicHttpResponse httpResponse = new BasicClassicHttpResponse(HttpStatus.SC_OK, "OK");
+        ByteArrayEntity entity = new ByteArrayEntity(entityDescriptorBytes, ContentType.create("application/foobar"));
         httpResponse.setEntity(entity);
         
         XMLObject result = responseHandler.handleResponse(httpResponse);
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/impl/HTTPMetadataResolverTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/impl/HTTPMetadataResolverTest.java
index 0c3afa9d4..e5656f557 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/impl/HTTPMetadataResolverTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/impl/HTTPMetadataResolverTest.java
@@ -25,7 +25,7 @@ import java.security.cert.X509Certificate;
 import java.util.Collections;
 import java.util.Set;
 
-import org.apache.http.conn.socket.LayeredConnectionSocketFactory;
+import org.apache.hc.client5.http.socket.LayeredConnectionSocketFactory;
 import org.opensaml.core.criterion.EntityIdCriterion;
 import org.opensaml.core.testing.XMLObjectBaseTestCase;
 import org.opensaml.saml.saml2.metadata.EntityDescriptor;
diff --git a/opensaml-saml-impl/src/test/resources/logback-test.xml b/opensaml-saml-impl/src/test/resources/logback-test.xml
index 5933e433c..ce1720f5c 100644
--- a/opensaml-saml-impl/src/test/resources/logback-test.xml
+++ b/opensaml-saml-impl/src/test/resources/logback-test.xml
@@ -8,11 +8,15 @@
         </encoder>
     </appender>
     
-    <logger name="org.apache.http">
+    <logger name="org.apache.hc">
         <level value="WARN"/>
     </logger>
     
-    <logger name="org.apache.http.wire">
+    <logger name="org.apache.hc.core5.http.wire">
+        <level value="WARN"/>
+    </logger>
+    
+    <logger name="org.apache.hc.client5.http.wire">
         <level value="WARN"/>
     </logger>
     
@@ -36,6 +40,14 @@
         <level value="INFO"/>
     </logger>
     
+    <logger name="org.opensaml.saml.metadata.resolver.impl.HTTPMetadataResolver">
+        <level value="INFO"/>
+    </logger>
+    
+    <logger name="net.shibboleth.shared.httpclient.RequestConnectionClose">
+        <level value="INFO"/>
+    </logger>
+    
     <logger name="org.opensaml.messaging">
         <level value="INFO"/>
     </logger>
diff --git a/opensaml-security-api/pom.xml b/opensaml-security-api/pom.xml
index de82f425b..ffee7ccb3 100644
--- a/opensaml-security-api/pom.xml
+++ b/opensaml-security-api/pom.xml
@@ -69,7 +69,7 @@
 
         <dependency>
             <groupId>${httpclient.groupId}</groupId>
-            <artifactId>httpclient</artifactId>
+            <artifactId>${httpclient.artifactId}</artifactId>
         </dependency>
 
         <!-- Provided Dependencies -->
diff --git a/opensaml-security-api/src/main/java/org/opensaml/security/httpclient/HttpClientSecurityConfiguration.java b/opensaml-security-api/src/main/java/org/opensaml/security/httpclient/HttpClientSecurityConfiguration.java
index 1fb9ceb80..959f20aef 100644
--- a/opensaml-security-api/src/main/java/org/opensaml/security/httpclient/HttpClientSecurityConfiguration.java
+++ b/opensaml-security-api/src/main/java/org/opensaml/security/httpclient/HttpClientSecurityConfiguration.java
@@ -22,7 +22,7 @@ import java.util.List;
 import javax.annotation.Nullable;
 import javax.net.ssl.HostnameVerifier;
 
-import org.apache.http.client.CredentialsProvider;
+import org.apache.hc.client5.http.auth.CredentialsProvider;
 import org.opensaml.security.trust.TrustEngine;
 import org.opensaml.security.x509.X509Credential;
 
diff --git a/opensaml-security-api/src/main/java/org/opensaml/security/httpclient/HttpClientSecurityContextHandler.java b/opensaml-security-api/src/main/java/org/opensaml/security/httpclient/HttpClientSecurityContextHandler.java
index ff9fce74c..069a727ee 100644
--- a/opensaml-security-api/src/main/java/org/opensaml/security/httpclient/HttpClientSecurityContextHandler.java
+++ b/opensaml-security-api/src/main/java/org/opensaml/security/httpclient/HttpClientSecurityContextHandler.java
@@ -21,8 +21,8 @@ import java.io.IOException;
 
 import javax.annotation.Nullable;
 
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.client.protocol.HttpClientContext;
+import org.apache.hc.client5.http.protocol.HttpClientContext;
+import org.apache.hc.core5.http.ClassicHttpRequest;
 
 import net.shibboleth.shared.component.AbstractInitializableComponent;
 import net.shibboleth.shared.httpclient.HttpClientContextHandler;
@@ -59,7 +59,7 @@ public class HttpClientSecurityContextHandler extends AbstractInitializableCompo
     }
     
     /** {@inheritDoc} */
-    public void invokeBefore(final HttpClientContext context, final HttpUriRequest request) throws IOException {
+    public void invokeBefore(final HttpClientContext context, final ClassicHttpRequest request) throws IOException {
         checkComponentActive();
         
         HttpClientSecuritySupport.marshalSecurityParameters(context, httpClientSecurityParameters, false);
@@ -67,10 +67,10 @@ public class HttpClientSecurityContextHandler extends AbstractInitializableCompo
     }
 
     /** {@inheritDoc} */
-    public void invokeAfter(final HttpClientContext context, final HttpUriRequest request) throws IOException {
+    public void invokeAfter(final HttpClientContext context, final ClassicHttpRequest request) throws IOException {
         checkComponentActive();
         
-        HttpClientSecuritySupport.checkTLSCredentialEvaluated(context, request.getURI().getScheme());
+        HttpClientSecuritySupport.checkTLSCredentialEvaluated(context, request.getScheme());
     }
 
 }
\ No newline at end of file
diff --git a/opensaml-security-api/src/main/java/org/opensaml/security/httpclient/HttpClientSecurityParameters.java b/opensaml-security-api/src/main/java/org/opensaml/security/httpclient/HttpClientSecurityParameters.java
index 77e3addcc..94af2f80b 100644
--- a/opensaml-security-api/src/main/java/org/opensaml/security/httpclient/HttpClientSecurityParameters.java
+++ b/opensaml-security-api/src/main/java/org/opensaml/security/httpclient/HttpClientSecurityParameters.java
@@ -27,11 +27,11 @@ import javax.net.ssl.HostnameVerifier;
 import net.shibboleth.shared.primitive.StringSupport;
 import net.shibboleth.shared.resolver.CriteriaSet;
 
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.UsernamePasswordCredentials;
-import org.apache.http.client.AuthCache;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.impl.client.BasicCredentialsProvider;
+import org.apache.hc.client5.http.auth.AuthCache;
+import org.apache.hc.client5.http.auth.AuthScope;
+import org.apache.hc.client5.http.auth.CredentialsProvider;
+import org.apache.hc.client5.http.auth.UsernamePasswordCredentials;
+import org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider;
 import org.opensaml.security.trust.TrustEngine;
 import org.opensaml.security.x509.X509Credential;
 
@@ -147,7 +147,7 @@ public class HttpClientSecurityParameters {
         if (credentials != null) {
             AuthScope authScope = scope;
             if (authScope == null) {
-                authScope = new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT);
+                authScope = new AuthScope(null, -1);
             }
             final BasicCredentialsProvider provider = new BasicCredentialsProvider();
             provider.setCredentials(authScope, credentials);
diff --git a/opensaml-security-api/src/main/java/org/opensaml/security/httpclient/HttpClientSecuritySupport.java b/opensaml-security-api/src/main/java/org/opensaml/security/httpclient/HttpClientSecuritySupport.java
index 2500c75b6..bcbb6c13c 100644
--- a/opensaml-security-api/src/main/java/org/opensaml/security/httpclient/HttpClientSecuritySupport.java
+++ b/opensaml-security-api/src/main/java/org/opensaml/security/httpclient/HttpClientSecuritySupport.java
@@ -26,14 +26,15 @@ import static org.opensaml.security.httpclient.HttpClientSecurityConstants.CONTE
 import static org.opensaml.security.httpclient.HttpClientSecurityConstants.CONTEXT_KEY_TRUST_ENGINE;
 import static org.opensaml.security.httpclient.HttpClientSecurityConstants.CONTEXT_KEY_SERVER_TLS_FAILURE_IS_FATAL;
 
+import java.net.URISyntaxException;
 import java.util.Collections;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.net.ssl.SSLPeerUnverifiedException;
 
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.client.protocol.HttpClientContext;
+import org.apache.hc.client5.http.protocol.HttpClientContext;
+import org.apache.hc.core5.http.HttpRequest;
 import org.opensaml.core.config.ConfigurationService;
 import org.opensaml.security.credential.UsageType;
 import org.opensaml.security.criteria.UsageCriterion;
@@ -45,7 +46,7 @@ import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.resolver.CriteriaSet;
 
 /**
- * Support class for working with {@link org.apache.http.client.HttpClient} security features.
+ * Support class for working with {@link org.apache.hc.client5.http.classic.HttpClient} security features.
  */
 public final class HttpClientSecuritySupport {
     
@@ -71,25 +72,29 @@ public final class HttpClientSecuritySupport {
      * @param request the current HTTP request
      */
     public static void addDefaultTLSTrustEngineCriteria(@Nonnull final HttpClientContext context, 
-            @Nonnull final HttpUriRequest request) {
+            @Nonnull final HttpRequest request) {
         
-        if ("https".equalsIgnoreCase(request.getURI().getScheme()) 
+        if ("https".equalsIgnoreCase(request.getScheme()) 
                 && context.getAttribute(CONTEXT_KEY_TRUST_ENGINE) != null) {
-            
+
             CriteriaSet criteria = (CriteriaSet) context.getAttribute(CONTEXT_KEY_CRITERIA_SET);
             if (criteria == null) {
                 criteria = new CriteriaSet();
                 context.setAttribute(CONTEXT_KEY_CRITERIA_SET, criteria);
             }
-            
+
             if (!criteria.contains(UsageCriterion.class)) {
                 criteria.add(new UsageCriterion(UsageType.SIGNING));
             }
-            
+
             if (!criteria.contains(TrustedNamesCriterion.class)) {
-                criteria.add(new TrustedNamesCriterion(Collections.singleton(request.getURI().getHost())));
+                try {
+                    criteria.add(new TrustedNamesCriterion(Collections.singleton(request.getUri().getHost())));
+                } catch (URISyntaxException e) {
+                    LOG.error("HttpRequest URI was invalid, got not extract hostname for TrustedNamesCriterion", e);
+                }
             }
-            
+
         }
     }
     
diff --git a/opensaml-security-api/src/main/java/org/opensaml/security/messaging/HttpClientSecurityContext.java b/opensaml-security-api/src/main/java/org/opensaml/security/messaging/HttpClientSecurityContext.java
index 3942ae708..4d7082297 100644
--- a/opensaml-security-api/src/main/java/org/opensaml/security/messaging/HttpClientSecurityContext.java
+++ b/opensaml-security-api/src/main/java/org/opensaml/security/messaging/HttpClientSecurityContext.java
@@ -28,7 +28,8 @@ import org.opensaml.security.httpclient.HttpClientSecurityParameters;
 import net.shibboleth.shared.resolver.CriteriaSet;
 
 /**
- * A context implementation holding parameters related to {@link org.apache.http.client.HttpClient} security features.
+ * A context implementation holding parameters related to {@link org.apache.hc.client5.http.classic.HttpClient}
+ * security features.
  */
 public final class HttpClientSecurityContext extends BaseContext {
     
diff --git a/opensaml-security-api/src/test/java/org/opensaml/security/httpclient/HttpClientSecuritySupportTest.java b/opensaml-security-api/src/test/java/org/opensaml/security/httpclient/HttpClientSecuritySupportTest.java
index 462dc315e..463a6b082 100644
--- a/opensaml-security-api/src/test/java/org/opensaml/security/httpclient/HttpClientSecuritySupportTest.java
+++ b/opensaml-security-api/src/test/java/org/opensaml/security/httpclient/HttpClientSecuritySupportTest.java
@@ -41,11 +41,11 @@ import javax.net.ssl.SSLPeerUnverifiedException;
 import net.shibboleth.shared.logic.ConstraintViolationException;
 import net.shibboleth.shared.resolver.CriteriaSet;
 
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.conn.ssl.DefaultHostnameVerifier;
-import org.apache.http.impl.client.BasicCredentialsProvider;
+import org.apache.hc.client5.http.auth.CredentialsProvider;
+import org.apache.hc.client5.http.classic.methods.HttpGet;
+import org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider;
+import org.apache.hc.client5.http.protocol.HttpClientContext;
+import org.apache.hc.client5.http.ssl.DefaultHostnameVerifier;
 import org.opensaml.security.SecurityException;
 import org.opensaml.security.credential.UsageType;
 import org.opensaml.security.criteria.UsageCriterion;
diff --git a/opensaml-security-api/src/test/java/org/opensaml/security/httpclient/SecurityEnhancedHTTPResourceTest.java b/opensaml-security-api/src/test/java/org/opensaml/security/httpclient/SecurityEnhancedHTTPResourceTest.java
index 73b3d52f3..e7b8bdf37 100644
--- a/opensaml-security-api/src/test/java/org/opensaml/security/httpclient/SecurityEnhancedHTTPResourceTest.java
+++ b/opensaml-security-api/src/test/java/org/opensaml/security/httpclient/SecurityEnhancedHTTPResourceTest.java
@@ -29,7 +29,7 @@ import net.shibboleth.shared.spring.httpclient.resource.HTTPResource;
 import net.shibboleth.shared.testing.RepositorySupport;
 import net.shibboleth.shared.testing.ResourceTestHelper;
 
-import org.apache.http.client.HttpClient;
+import org.apache.hc.client5.http.classic.HttpClient;
 import org.springframework.core.io.ClassPathResource;
 import org.testng.Assert;
 import org.testng.annotations.BeforeClass;
diff --git a/opensaml-security-impl/pom.xml b/opensaml-security-impl/pom.xml
index fa0338ddd..7157a3f41 100644
--- a/opensaml-security-impl/pom.xml
+++ b/opensaml-security-impl/pom.xml
@@ -57,13 +57,12 @@
 
         <dependency>
             <groupId>${httpclient.groupId}</groupId>
-            <artifactId>httpclient</artifactId>
+            <artifactId>${httpclient.artifactId}</artifactId>
             <optional>true</optional>
         </dependency>
-
         <dependency>
-            <groupId>${httpclient.groupId}</groupId>
-            <artifactId>httpcore</artifactId>
+            <groupId>${httpclient.httpcore.groupId}</groupId>
+            <artifactId>${httpclient.httpcore.artifactId}</artifactId>
             <optional>true</optional>
         </dependency>
 
diff --git a/opensaml-security-impl/src/main/java/org/opensaml/security/httpclient/impl/BasicHttpClientSecurityConfiguration.java b/opensaml-security-impl/src/main/java/org/opensaml/security/httpclient/impl/BasicHttpClientSecurityConfiguration.java
index 465518929..4a79ff22f 100644
--- a/opensaml-security-impl/src/main/java/org/opensaml/security/httpclient/impl/BasicHttpClientSecurityConfiguration.java
+++ b/opensaml-security-impl/src/main/java/org/opensaml/security/httpclient/impl/BasicHttpClientSecurityConfiguration.java
@@ -24,10 +24,10 @@ import java.util.List;
 import javax.annotation.Nullable;
 import javax.net.ssl.HostnameVerifier;
 
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.UsernamePasswordCredentials;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.impl.client.BasicCredentialsProvider;
+import org.apache.hc.client5.http.auth.AuthScope;
+import org.apache.hc.client5.http.auth.CredentialsProvider;
+import org.apache.hc.client5.http.auth.UsernamePasswordCredentials;
+import org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider;
 import org.opensaml.security.httpclient.HttpClientSecurityConfiguration;
 import org.opensaml.security.trust.TrustEngine;
 import org.opensaml.security.x509.X509Credential;
@@ -117,7 +117,7 @@ public class BasicHttpClientSecurityConfiguration implements HttpClientSecurityC
         if (credentials != null) {
             AuthScope authScope = scope;
             if (authScope == null) {
-                authScope = new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT);
+                authScope = new AuthScope(null, -1);
             }
             final BasicCredentialsProvider provider = new BasicCredentialsProvider();
             provider.setCredentials(authScope, credentials);
diff --git a/opensaml-security-impl/src/main/java/org/opensaml/security/httpclient/impl/SecurityEnhancedHttpClientSupport.java b/opensaml-security-impl/src/main/java/org/opensaml/security/httpclient/impl/SecurityEnhancedHttpClientSupport.java
index 9a4fba64a..d44fe19fc 100644
--- a/opensaml-security-impl/src/main/java/org/opensaml/security/httpclient/impl/SecurityEnhancedHttpClientSupport.java
+++ b/opensaml-security-impl/src/main/java/org/opensaml/security/httpclient/impl/SecurityEnhancedHttpClientSupport.java
@@ -25,8 +25,7 @@ import javax.net.ssl.TrustManager;
 import javax.net.ssl.X509KeyManager;
 import javax.net.ssl.X509TrustManager;
 
-import org.apache.http.client.HttpClient;
-import org.apache.http.conn.socket.LayeredConnectionSocketFactory;
+import org.apache.hc.client5.http.socket.LayeredConnectionSocketFactory;
 import org.opensaml.security.trust.TrustEngine;
 import org.opensaml.security.x509.tls.impl.ThreadLocalX509CredentialKeyManager;
 import org.opensaml.security.x509.tls.impl.ThreadLocalX509TrustManager;
diff --git a/opensaml-security-impl/src/main/java/org/opensaml/security/httpclient/impl/SecurityEnhancedTLSSocketFactory.java b/opensaml-security-impl/src/main/java/org/opensaml/security/httpclient/impl/SecurityEnhancedTLSSocketFactory.java
index 8fc2b5629..9e3fa3fbb 100644
--- a/opensaml-security-impl/src/main/java/org/opensaml/security/httpclient/impl/SecurityEnhancedTLSSocketFactory.java
+++ b/opensaml-security-impl/src/main/java/org/opensaml/security/httpclient/impl/SecurityEnhancedTLSSocketFactory.java
@@ -28,10 +28,11 @@ import javax.net.ssl.SSLPeerUnverifiedException;
 import javax.net.ssl.SSLSocket;
 import javax.net.ssl.X509TrustManager;
 
-import org.apache.http.HttpHost;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.conn.socket.LayeredConnectionSocketFactory;
-import org.apache.http.protocol.HttpContext;
+import org.apache.hc.client5.http.protocol.HttpClientContext;
+import org.apache.hc.client5.http.socket.LayeredConnectionSocketFactory;
+import org.apache.hc.core5.http.HttpHost;
+import org.apache.hc.core5.http.protocol.HttpContext;
+import org.apache.hc.core5.util.TimeValue;
 import org.opensaml.security.credential.UsageType;
 import org.opensaml.security.criteria.UsageCriterion;
 import org.opensaml.security.httpclient.HttpClientSecurityConstants;
@@ -139,7 +140,7 @@ public class SecurityEnhancedTLSSocketFactory implements LayeredConnectionSocket
 
 // CheckStyle: ParameterNumber OFF
     /** {@inheritDoc} */
-    public Socket connectSocket(final int connectTimeout, final Socket sock, final HttpHost host,
+    public Socket connectSocket(TimeValue connectTimeout, final Socket sock, final HttpHost host,
             final InetSocketAddress remoteAddress, final InetSocketAddress localAddress,
             final HttpContext context) throws IOException {
         
diff --git a/opensaml-security-impl/src/main/java/org/opensaml/security/httpclient/impl/ThreadLocalClientTLSCredentialHandler.java b/opensaml-security-impl/src/main/java/org/opensaml/security/httpclient/impl/ThreadLocalClientTLSCredentialHandler.java
index 462b748c3..a8f33c0b6 100644
--- a/opensaml-security-impl/src/main/java/org/opensaml/security/httpclient/impl/ThreadLocalClientTLSCredentialHandler.java
+++ b/opensaml-security-impl/src/main/java/org/opensaml/security/httpclient/impl/ThreadLocalClientTLSCredentialHandler.java
@@ -21,8 +21,8 @@ import java.io.IOException;
 
 import javax.annotation.Nonnull;
 
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.client.protocol.HttpClientContext;
+import org.apache.hc.client5.http.protocol.HttpClientContext;
+import org.apache.hc.core5.http.ClassicHttpRequest;
 import org.opensaml.security.x509.tls.impl.ThreadLocalX509CredentialContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -39,14 +39,14 @@ public class ThreadLocalClientTLSCredentialHandler implements HttpClientContextH
     private final Logger log = LoggerFactory.getLogger(ThreadLocalClientTLSCredentialHandler.class);
 
     /** {@inheritDoc} */
-    public void invokeBefore(@Nonnull final HttpClientContext context, @Nonnull final HttpUriRequest request)
+    public void invokeBefore(@Nonnull final HttpClientContext context, @Nonnull final ClassicHttpRequest request)
             throws IOException {
         // Do nothing here
         
     }
 
     /** {@inheritDoc} */
-    public void invokeAfter(@Nonnull final HttpClientContext context, @Nonnull final HttpUriRequest request)
+    public void invokeAfter(@Nonnull final HttpClientContext context, @Nonnull final ClassicHttpRequest request)
             throws IOException {
         log.trace("Clearing thread-local client TLS X509Credential");
         ThreadLocalX509CredentialContext.clearCurrent();
diff --git a/opensaml-security-impl/src/main/java/org/opensaml/security/httpclient/impl/ThreadLocalServerTLSHandler.java b/opensaml-security-impl/src/main/java/org/opensaml/security/httpclient/impl/ThreadLocalServerTLSHandler.java
index ffdaa9a26..5cc2f922c 100644
--- a/opensaml-security-impl/src/main/java/org/opensaml/security/httpclient/impl/ThreadLocalServerTLSHandler.java
+++ b/opensaml-security-impl/src/main/java/org/opensaml/security/httpclient/impl/ThreadLocalServerTLSHandler.java
@@ -21,8 +21,8 @@ import java.io.IOException;
 
 import javax.annotation.Nonnull;
 
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.client.protocol.HttpClientContext;
+import org.apache.hc.client5.http.protocol.HttpClientContext;
+import org.apache.hc.core5.http.ClassicHttpRequest;
 import org.opensaml.security.httpclient.HttpClientSecurityConstants;
 import org.opensaml.security.x509.tls.impl.ThreadLocalX509TrustEngineContext;
 import org.slf4j.Logger;
@@ -40,14 +40,14 @@ public class ThreadLocalServerTLSHandler implements HttpClientContextHandler {
     private final Logger log = LoggerFactory.getLogger(ThreadLocalServerTLSHandler.class);
 
     /** {@inheritDoc} */
-    public void invokeBefore(@Nonnull final HttpClientContext context, @Nonnull final HttpUriRequest request)
+    public void invokeBefore(@Nonnull final HttpClientContext context, @Nonnull final ClassicHttpRequest request)
             throws IOException {
         // Do nothing here
         
     }
 
     /** {@inheritDoc} */
-    public void invokeAfter(@Nonnull final HttpClientContext context, @Nonnull final HttpUriRequest request)
+    public void invokeAfter(@Nonnull final HttpClientContext context, @Nonnull final ClassicHttpRequest request)
             throws IOException {
         
         log.trace("Saw ThreadLocalX509TrustEngineContext.getTrusted: {}",
diff --git a/opensaml-security-impl/src/test/java/org/opensaml/security/httpclient/impl/BasicHttpClientSecurityConfigurationTest.java b/opensaml-security-impl/src/test/java/org/opensaml/security/httpclient/impl/BasicHttpClientSecurityConfigurationTest.java
index 38a9cf6dd..5eab2907b 100644
--- a/opensaml-security-impl/src/test/java/org/opensaml/security/httpclient/impl/BasicHttpClientSecurityConfigurationTest.java
+++ b/opensaml-security-impl/src/test/java/org/opensaml/security/httpclient/impl/BasicHttpClientSecurityConfigurationTest.java
@@ -22,9 +22,9 @@ import java.net.URISyntaxException;
 import java.security.cert.CertificateException;
 import java.util.Collections;
 
-import org.apache.http.auth.UsernamePasswordCredentials;
-import org.apache.http.conn.ssl.DefaultHostnameVerifier;
-import org.apache.http.impl.client.BasicCredentialsProvider;
+import org.apache.hc.client5.http.auth.UsernamePasswordCredentials;
+import org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider;
+import org.apache.hc.client5.http.ssl.DefaultHostnameVerifier;
 import org.opensaml.security.SecurityException;
 import org.opensaml.security.credential.CredentialSupport;
 import org.opensaml.security.trust.TrustEngine;
@@ -80,7 +80,7 @@ public class BasicHttpClientSecurityConfigurationTest {
     @Test
     public void testCredentialsProvider() {
         BasicHttpClientSecurityConfiguration config = new BasicHttpClientSecurityConfiguration();
-        config.setBasicCredentials(new UsernamePasswordCredentials("test", "test"));
+        config.setBasicCredentials(new UsernamePasswordCredentials("test", "test".toCharArray()));
         
         Assert.assertNotNull(config.getCredentialsProvider());
     }
diff --git a/opensaml-security-impl/src/test/java/org/opensaml/security/httpclient/impl/BasicHttpClientSecurityParametersResolverTest.java b/opensaml-security-impl/src/test/java/org/opensaml/security/httpclient/impl/BasicHttpClientSecurityParametersResolverTest.java
index 49ddf87f4..54c77e068 100644
--- a/opensaml-security-impl/src/test/java/org/opensaml/security/httpclient/impl/BasicHttpClientSecurityParametersResolverTest.java
+++ b/opensaml-security-impl/src/test/java/org/opensaml/security/httpclient/impl/BasicHttpClientSecurityParametersResolverTest.java
@@ -23,8 +23,8 @@ import java.security.KeyException;
 import java.security.cert.CertificateException;
 import java.util.Collections;
 
-import org.apache.http.conn.ssl.DefaultHostnameVerifier;
-import org.apache.http.impl.client.BasicCredentialsProvider;
+import org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider;
+import org.apache.hc.client5.http.ssl.DefaultHostnameVerifier;
 import org.opensaml.security.SecurityException;
 import org.opensaml.security.credential.CredentialSupport;
 import org.opensaml.security.crypto.KeySupport;
diff --git a/opensaml-security-impl/src/test/java/org/opensaml/security/httpclient/impl/MockTLSSocketFactory.java b/opensaml-security-impl/src/test/java/org/opensaml/security/httpclient/impl/MockTLSSocketFactory.java
index 2af8d0f0e..ea80e9e48 100644
--- a/opensaml-security-impl/src/test/java/org/opensaml/security/httpclient/impl/MockTLSSocketFactory.java
+++ b/opensaml-security-impl/src/test/java/org/opensaml/security/httpclient/impl/MockTLSSocketFactory.java
@@ -24,9 +24,10 @@ import java.net.UnknownHostException;
 import java.security.cert.Certificate;
 import java.util.List;
 
-import org.apache.http.HttpHost;
-import org.apache.http.conn.socket.LayeredConnectionSocketFactory;
-import org.apache.http.protocol.HttpContext;
+import org.apache.hc.client5.http.socket.LayeredConnectionSocketFactory;
+import org.apache.hc.core5.http.HttpHost;
+import org.apache.hc.core5.http.protocol.HttpContext;
+import org.apache.hc.core5.util.TimeValue;
 
 /**
  * Mock HttpClient SSL/TLS socket factory.
@@ -49,7 +50,7 @@ public class MockTLSSocketFactory implements LayeredConnectionSocketFactory {
     }
 
     /** {@inheritDoc} */
-    public Socket connectSocket(int connectTimeout, Socket sock, HttpHost host, InetSocketAddress remoteAddress,
+    public Socket connectSocket(TimeValue connectTimeout, Socket sock, HttpHost host, InetSocketAddress remoteAddress,
             InetSocketAddress localAddress, HttpContext context) throws IOException {
         return this.socket;
     }
diff --git a/opensaml-security-impl/src/test/java/org/opensaml/security/httpclient/impl/SecurityEnhancedTLSSocketFactoryTest.java b/opensaml-security-impl/src/test/java/org/opensaml/security/httpclient/impl/SecurityEnhancedTLSSocketFactoryTest.java
index f0d6634d5..8a0202bc4 100644
--- a/opensaml-security-impl/src/test/java/org/opensaml/security/httpclient/impl/SecurityEnhancedTLSSocketFactoryTest.java
+++ b/opensaml-security-impl/src/test/java/org/opensaml/security/httpclient/impl/SecurityEnhancedTLSSocketFactoryTest.java
@@ -26,10 +26,11 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 
-import org.apache.http.HttpHost;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.conn.socket.LayeredConnectionSocketFactory;
-import org.apache.http.protocol.HttpContext;
+import org.apache.hc.client5.http.protocol.HttpClientContext;
+import org.apache.hc.client5.http.socket.LayeredConnectionSocketFactory;
+import org.apache.hc.core5.http.HttpHost;
+import org.apache.hc.core5.http.protocol.HttpContext;
+import org.apache.hc.core5.util.TimeValue;
 import org.opensaml.security.credential.impl.StaticCredentialResolver;
 import org.opensaml.security.httpclient.HttpClientSecurityConstants;
 import org.opensaml.security.trust.impl.ExplicitKeyTrustEngine;
@@ -72,7 +73,7 @@ public class SecurityEnhancedTLSSocketFactoryTest {
         securityEnhancedSocketFactory = new SecurityEnhancedTLSSocketFactory(buildInnerSSLFactory(null, hostname));
         Socket socket = securityEnhancedSocketFactory.createSocket(httpContext);
 
-        securityEnhancedSocketFactory.connectSocket(0, socket, new HttpHost(hostname, 80, "http"), null, null, httpContext);
+        securityEnhancedSocketFactory.connectSocket(TimeValue.ofMilliseconds(0), socket, new HttpHost("http", hostname, 80), null, null, httpContext);
 
         Assert.assertFalse(ThreadLocalX509TrustEngineContext.haveCurrent());
         Assert.assertFalse(HttpClientSupport.getDynamicContextHandlerList(
@@ -91,7 +92,7 @@ public class SecurityEnhancedTLSSocketFactoryTest {
                 Collections.singletonList((Certificate)cred.getEntityCertificate()), hostname));
         Socket socket = securityEnhancedSocketFactory.createSocket(httpContext);
 
-        securityEnhancedSocketFactory.connectSocket(0, socket, new HttpHost(hostname, 443, "https"), null, null, httpContext);
+        securityEnhancedSocketFactory.connectSocket(TimeValue.ofMilliseconds(0), socket, new HttpHost("https", hostname, 443), null, null, httpContext);
 
         Assert.assertFalse(ThreadLocalX509TrustEngineContext.haveCurrent());
         Assert.assertFalse(HttpClientSupport.getDynamicContextHandlerList(
@@ -112,7 +113,7 @@ public class SecurityEnhancedTLSSocketFactoryTest {
                 Collections.singletonList((Certificate)cred.getEntityCertificate()), hostname));
         Socket socket = securityEnhancedSocketFactory.createSocket(httpContext);
 
-        securityEnhancedSocketFactory.connectSocket(0, socket, new HttpHost(hostname, 443, "https"), null, null, httpContext);
+        securityEnhancedSocketFactory.connectSocket(TimeValue.ofMilliseconds(0), socket, new HttpHost("https", hostname, 443), null, null, httpContext);
        
         Assert.assertTrue(ThreadLocalX509TrustEngineContext.haveCurrent());
         Assert.assertSame(ThreadLocalX509TrustEngineContext.getTrustEngine(), trustEngine);
@@ -139,7 +140,7 @@ public class SecurityEnhancedTLSSocketFactoryTest {
                 Collections.singletonList((Certificate)cred.getEntityCertificate()), hostname));
         Socket socket = securityEnhancedSocketFactory.createSocket(httpContext);
 
-        securityEnhancedSocketFactory.connectSocket(0, socket, new HttpHost(hostname, 443, "https"), null, null, httpContext);
+        securityEnhancedSocketFactory.connectSocket(TimeValue.ofMilliseconds(0), socket, new HttpHost("https", hostname, 443), null, null, httpContext);
        
         Assert.assertTrue(ThreadLocalX509TrustEngineContext.haveCurrent());
         Assert.assertSame(ThreadLocalX509TrustEngineContext.getTrustEngine(), trustEngine);
@@ -167,7 +168,7 @@ public class SecurityEnhancedTLSSocketFactoryTest {
                 Collections.singletonList((Certificate)cred.getEntityCertificate()), hostname));
         Socket socket = securityEnhancedSocketFactory.createSocket(httpContext);
 
-        securityEnhancedSocketFactory.connectSocket(0, socket, new HttpHost(hostname, 443, "https"), null, null, httpContext);
+        securityEnhancedSocketFactory.connectSocket(TimeValue.ofMilliseconds(0), socket, new HttpHost("https", hostname, 443), null, null, httpContext);
        
         Assert.assertTrue(ThreadLocalX509TrustEngineContext.haveCurrent());
         Assert.assertSame(ThreadLocalX509TrustEngineContext.getTrustEngine(), trustEngine);
@@ -189,7 +190,7 @@ public class SecurityEnhancedTLSSocketFactoryTest {
         securityEnhancedSocketFactory = new SecurityEnhancedTLSSocketFactory(buildInnerSSLFactory(null, hostname));
         Socket socket = securityEnhancedSocketFactory.createSocket(httpContext);
 
-        securityEnhancedSocketFactory.connectSocket(0, socket, new HttpHost(hostname, 443, "https"), null, null, httpContext);
+        securityEnhancedSocketFactory.connectSocket(TimeValue.ofMilliseconds(0), socket, new HttpHost("https", hostname, 443), null, null, httpContext);
         
         Assert.assertFalse(ThreadLocalX509TrustEngineContext.haveCurrent());
         Assert.assertFalse(HttpClientSupport.getDynamicContextHandlerList(
diff --git a/opensaml-soap-api/pom.xml b/opensaml-soap-api/pom.xml
index 19c06ffa3..15f44c93d 100644
--- a/opensaml-soap-api/pom.xml
+++ b/opensaml-soap-api/pom.xml
@@ -47,13 +47,12 @@
         </dependency>
 
         <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpclient</artifactId>
+            <groupId>${httpclient.groupId}</groupId>
+            <artifactId>${httpclient.artifactId}</artifactId>
         </dependency>
-
         <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpcore</artifactId>
+            <groupId>${httpclient.httpcore.groupId}</groupId>
+            <artifactId>${httpclient.httpcore.artifactId}</artifactId>
         </dependency>
 
         <!-- Provided Dependencies -->
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/client/http/AbstractPipelineHttpSOAPClient.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/client/http/AbstractPipelineHttpSOAPClient.java
index 4c26315e6..19db0bb00 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/client/http/AbstractPipelineHttpSOAPClient.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/client/http/AbstractPipelineHttpSOAPClient.java
@@ -29,12 +29,12 @@ import javax.annotation.Nullable;
 import javax.annotation.concurrent.ThreadSafe;
 import javax.net.ssl.SSLException;
 
-import org.apache.http.HttpResponse;
-import org.apache.http.client.ClientProtocolException;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.client.protocol.HttpClientContext;
+import org.apache.hc.client5.http.ClientProtocolException;
+import org.apache.hc.client5.http.classic.HttpClient;
+import org.apache.hc.client5.http.classic.methods.HttpPost;
+import org.apache.hc.client5.http.protocol.HttpClientContext;
+import org.apache.hc.core5.http.ClassicHttpRequest;
+import org.apache.hc.core5.http.ClassicHttpResponse;
 import org.opensaml.messaging.context.InOutOperationContext;
 import org.opensaml.messaging.context.httpclient.HttpClientRequestContext;
 import org.opensaml.messaging.decoder.MessageDecodingException;
@@ -194,7 +194,7 @@ public abstract class AbstractPipelineHttpSOAPClient
                 pipeline.getOutboundPayloadMessageHandler().invoke(operationContext.getOutboundMessageContext());
             }
             
-            final HttpUriRequest httpRequest = buildHttpRequest(endpoint, operationContext);
+            final ClassicHttpRequest httpRequest = buildHttpRequest(endpoint, operationContext);
             // Request encoding + outbound transport handling
             final HttpClientRequestMessageEncoder encoder = pipeline.getEncoder();
             encoder.setHttpRequest(httpRequest);
@@ -209,8 +209,8 @@ public abstract class AbstractPipelineHttpSOAPClient
             
             // HttpClient execution
             final HttpClientContext httpContext = buildHttpContext(httpRequest, operationContext);
-            final HttpResponse httpResponse = getHttpClient().execute(httpRequest, httpContext);
-            HttpClientSecuritySupport.checkTLSCredentialEvaluated(httpContext, httpRequest.getURI().getScheme());
+            final ClassicHttpResponse httpResponse = getHttpClient().executeOpen(null, httpRequest, httpContext);
+            HttpClientSecuritySupport.checkTLSCredentialEvaluated(httpContext, httpRequest.getScheme());
             
             // Response decoding
             final HttpClientResponseMessageDecoder decoder = pipeline.getDecoder();
@@ -297,13 +297,13 @@ public abstract class AbstractPipelineHttpSOAPClient
             throws SOAPException;
         
     /**
-     * Build the {@link HttpUriRequest} instance to be executed by the HttpClient.
+     * Build the {@link ClassicHttpRequest} instance to be executed by the HttpClient.
      * 
      * @param endpoint the endpoint to which the message will be sent
      * @param operationContext the current operation context
      * @return the HTTP request to be executed
      */
-    @Nonnull protected HttpUriRequest buildHttpRequest(@Nonnull @NotEmpty final String endpoint, 
+    @Nonnull protected ClassicHttpRequest buildHttpRequest(@Nonnull @NotEmpty final String endpoint, 
             @Nonnull final InOutOperationContext operationContext) {
         return new HttpPost(endpoint);
     }
@@ -315,7 +315,7 @@ public abstract class AbstractPipelineHttpSOAPClient
      * @param operationContext the current operation context
      * @return the client context instance
      */
-    @Nonnull protected HttpClientContext buildHttpContext(@Nonnull final HttpUriRequest request, 
+    @Nonnull protected HttpClientContext buildHttpContext(@Nonnull final ClassicHttpRequest request, 
             @Nonnull final InOutOperationContext operationContext) {
         
         final HttpClientContext clientContext = resolveClientContext(operationContext);
@@ -327,7 +327,7 @@ public abstract class AbstractPipelineHttpSOAPClient
         
         HttpClientSecuritySupport.marshalSecurityParameters(clientContext, getHttpClientSecurityParameters(), false);
         
-        if ("https".equalsIgnoreCase(request.getURI().getScheme()) 
+        if ("https".equalsIgnoreCase(request.getScheme()) 
                 && clientContext.getAttribute(CONTEXT_KEY_TRUST_ENGINE) != null) {
             
             if (clientContext.getAttribute(CONTEXT_KEY_CRITERIA_SET) == null) {
@@ -408,7 +408,7 @@ public abstract class AbstractPipelineHttpSOAPClient
      * @param operationContext the current operation context
      * @return the new criteria set instance
      */
-    @Nonnull protected CriteriaSet buildTLSCriteriaSet(@Nonnull final HttpUriRequest request, 
+    @Nonnull protected CriteriaSet buildTLSCriteriaSet(@Nonnull final ClassicHttpRequest request, 
             @Nonnull final InOutOperationContext operationContext) {
         
         final CriteriaSet criteriaSet = new CriteriaSet();
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/client/http/HttpSOAPClient.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/client/http/HttpSOAPClient.java
index 2624c8cf4..b0789b410 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/client/http/HttpSOAPClient.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/client/http/HttpSOAPClient.java
@@ -28,14 +28,14 @@ import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.annotation.concurrent.ThreadSafe;
 
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.ByteArrayEntity;
-import org.apache.http.entity.ContentType;
+import org.apache.hc.client5.http.classic.HttpClient;
+import org.apache.hc.client5.http.classic.methods.HttpPost;
+import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
+import org.apache.hc.core5.http.ClassicHttpResponse;
+import org.apache.hc.core5.http.ContentType;
+import org.apache.hc.core5.http.HttpEntity;
+import org.apache.hc.core5.http.HttpStatus;
+import org.apache.hc.core5.http.io.entity.ByteArrayEntity;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
 import org.opensaml.core.xml.io.Marshaller;
@@ -211,10 +211,10 @@ public class HttpSOAPClient extends AbstractInitializableComponent implements SO
         try {
             post = createPostMethod(endpoint, soapRequestParams, soapCtx.getEnvelope());
 
-            HttpResponse response = null;
+            ClassicHttpResponse response = null;
             try {
-                response = httpClient.execute(post);
-                final int code = response.getStatusLine().getStatusCode();
+                response = httpClient.executeOpen(null, post, null);
+                final int code = response.getCode();
                 log.debug("Received HTTP status code of {} when POSTing SOAP message to {}", code, endpoint);
 
                 if (code == HttpStatus.SC_OK) {
@@ -291,7 +291,7 @@ public class HttpSOAPClient extends AbstractInitializableComponent implements SO
                         SerializeSupport.prettyPrintXML(marshaller.marshall(message)));
             }
             SerializeSupport.writeNode(marshaller.marshall(message), arrayOut);
-            return new ByteArrayEntity(arrayOut.toByteArray(), ContentType.create("text/xml", charset));
+            return new ByteArrayEntity(arrayOut.toByteArray(), ContentType.TEXT_XML);
         } catch (final MarshallingException e) {
             throw new SOAPClientException("Unable to marshall SOAP envelope", e);
         }
@@ -305,7 +305,7 @@ public class HttpSOAPClient extends AbstractInitializableComponent implements SO
      * 
      * @throws SOAPClientException thrown if there is a problem reading the response from the {@link HttpPost}
      */
-    protected void processSuccessfulResponse(@Nonnull final HttpResponse httpResponse,
+    protected void processSuccessfulResponse(@Nonnull final ClassicHttpResponse httpResponse,
             @Nonnull final InOutOperationContext context) throws SOAPClientException {
         try {
             if (httpResponse.getEntity() == null) {
@@ -330,7 +330,7 @@ public class HttpSOAPClient extends AbstractInitializableComponent implements SO
      * @throws SOAPClientException thrown if the response can not be read from the {@link HttpPost}
      * @throws SOAPFaultException an exception containing the SOAP fault
      */
-    protected void processFaultResponse(@Nonnull final HttpResponse httpResponse,
+    protected void processFaultResponse(@Nonnull final ClassicHttpResponse httpResponse,
             @Nonnull final InOutOperationContext context) throws SOAPClientException, SOAPFaultException {
         try {
             if (httpResponse.getEntity() == null) {
diff --git a/opensaml-soap-impl/pom.xml b/opensaml-soap-impl/pom.xml
index 18d2ac2f1..82a8e9267 100644
--- a/opensaml-soap-impl/pom.xml
+++ b/opensaml-soap-impl/pom.xml
@@ -73,16 +73,14 @@
         </dependency>
 
         <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpclient</artifactId>
+            <groupId>${httpclient.groupId}</groupId>
+            <artifactId>${httpclient.artifactId}</artifactId>
         </dependency>
-
         <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpcore</artifactId>
+            <groupId>${httpclient.httpcore.groupId}</groupId>
+            <artifactId>${httpclient.httpcore.artifactId}</artifactId>
         </dependency>
 
-
         <!-- Provided Dependencies -->
         <dependency>
             <groupId>jakarta.servlet</groupId>
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/client/soap11/decoder/http/impl/HttpClientResponseSOAP11Decoder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/client/soap11/decoder/http/impl/HttpClientResponseSOAP11Decoder.java
index 2262f9da9..8d2988913 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/client/soap11/decoder/http/impl/HttpClientResponseSOAP11Decoder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/client/soap11/decoder/http/impl/HttpClientResponseSOAP11Decoder.java
@@ -22,9 +22,9 @@ import java.util.List;
 
 import javax.xml.namespace.QName;
 
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-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.HttpStatus;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.messaging.context.MessageContext;
 import org.opensaml.messaging.decoder.MessageDecodingException;
@@ -83,11 +83,11 @@ public class HttpClientResponseSOAP11Decoder extends BaseHttpClientResponseXMLMe
     /** {@inheritDoc} */
     protected void doDecode() throws MessageDecodingException {
         final MessageContext messageContext = new MessageContext();
-        final HttpResponse response = getHttpResponse();
+        final ClassicHttpResponse response = getHttpResponse();
         
         log.debug("Unmarshalling SOAP message");
         try {
-            final int responseStatusCode = response.getStatusLine().getStatusCode();
+            final int responseStatusCode = response.getCode();
             
             switch(responseStatusCode) {
                 case HttpStatus.SC_OK:
@@ -139,7 +139,7 @@ public class HttpClientResponseSOAP11Decoder extends BaseHttpClientResponseXMLMe
      * @throws MessageDecodingException  if message can not be unmarshalled
      * @throws IOException if there is a problem with the response entity input stream
      */
-    protected void processSuccessResponse(final HttpResponse httpResponse, final SOAP11Context soapContext) 
+    protected void processSuccessResponse(final ClassicHttpResponse httpResponse, final SOAP11Context soapContext) 
             throws MessageDecodingException, IOException {
         
         if (httpResponse.getEntity() == null) {
@@ -154,7 +154,7 @@ public class HttpClientResponseSOAP11Decoder extends BaseHttpClientResponseXMLMe
         }
         
         soapContext.setEnvelope(soapMessage);
-        soapContext.setHTTPResponseStatus(httpResponse.getStatusLine().getStatusCode());
+        soapContext.setHTTPResponseStatus(httpResponse.getCode());
     }
 
     /**
@@ -166,7 +166,7 @@ public class HttpClientResponseSOAP11Decoder extends BaseHttpClientResponseXMLMe
      * @throws MessageDecodingException if message can not be unmarshalled
      * @throws IOException if there is a problem with the response entity input stream
      */
-    protected MessageDecodingException buildFaultException(final HttpResponse response) 
+    protected MessageDecodingException buildFaultException(final ClassicHttpResponse response) 
             throws MessageDecodingException, IOException {
         
         if (response.getEntity() == null) {
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/client/soap11/encoder/http/impl/HttpClientRequestSOAP11Encoder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/client/soap11/encoder/http/impl/HttpClientRequestSOAP11Encoder.java
index 8b4fdccab..a41891900 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/client/soap11/encoder/http/impl/HttpClientRequestSOAP11Encoder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/client/soap11/encoder/http/impl/HttpClientRequestSOAP11Encoder.java
@@ -24,11 +24,11 @@ import java.util.List;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpRequest;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.ByteArrayEntity;
-import org.apache.http.entity.ContentType;
+import org.apache.hc.client5.http.classic.methods.HttpPost;
+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.io.entity.ByteArrayEntity;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.XMLObjectBuilderFactory;
 import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
@@ -83,7 +83,7 @@ public class HttpClientRequestSOAP11Encoder extends BaseHttpClientRequestXMLMess
      * 
      * <p>This encoder implementation only operates on instances of {@link HttpPost}.</p>
      */
-    public synchronized void setHttpRequest(final HttpRequest httpRequest) {
+    public synchronized void setHttpRequest(final ClassicHttpRequest httpRequest) {
         if (!(httpRequest instanceof HttpPost)) {
             throw new IllegalArgumentException("HttpClient SOAP message encoder only operates on HttpPost");
         }
@@ -130,7 +130,7 @@ public class HttpClientRequestSOAP11Encoder extends BaseHttpClientRequestXMLMess
         try {
             final ByteArrayOutputStream arrayOut = new ByteArrayOutputStream();
             SerializeSupport.writeNode(XMLObjectSupport.marshall(message), arrayOut);
-            return new ByteArrayEntity(arrayOut.toByteArray(), ContentType.create("text/xml", charset));
+            return new ByteArrayEntity(arrayOut.toByteArray(), ContentType.TEXT_XML, charset.name());
         } catch (final MarshallingException e) {
             throw new MessageEncodingException("Unable to marshall SOAP envelope", e);
         }
diff --git a/opensaml-soap-impl/src/test/java/org/opensaml/soap/client/soap11/decoder/http/impl/HttpClientResponseSOAP11DecoderTest.java b/opensaml-soap-impl/src/test/java/org/opensaml/soap/client/soap11/decoder/http/impl/HttpClientResponseSOAP11DecoderTest.java
index 71a31111c..f58d29b6d 100644
--- a/opensaml-soap-impl/src/test/java/org/opensaml/soap/client/soap11/decoder/http/impl/HttpClientResponseSOAP11DecoderTest.java
+++ b/opensaml-soap-impl/src/test/java/org/opensaml/soap/client/soap11/decoder/http/impl/HttpClientResponseSOAP11DecoderTest.java
@@ -25,11 +25,13 @@ import javax.xml.namespace.QName;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.xml.SerializeSupport;
 
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.HttpVersion;
-import org.apache.http.entity.ByteArrayEntity;
-import org.apache.http.message.BasicHttpResponse;
+import org.apache.hc.core5.http.ClassicHttpResponse;
+import org.apache.hc.core5.http.ContentType;
+import org.apache.hc.core5.http.HttpStatus;
+import org.apache.hc.core5.http.HttpVersion;
+import org.apache.hc.core5.http.io.entity.ByteArrayEntity;
+import org.apache.hc.core5.http.message.BasicClassicHttpResponse;
+import org.apache.hc.core5.http.message.BasicHttpResponse;
 import org.opensaml.core.testing.XMLObjectBaseTestCase;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.mock.SimpleXMLObject;
@@ -63,7 +65,7 @@ public class HttpClientResponseSOAP11DecoderTest extends XMLObjectBaseTestCase {
     public void testDecodeToPayload() throws ComponentInitializationException, MessageDecodingException, MarshallingException, IOException {
         Envelope envelope = buildMessageSkeleton();
         envelope.getBody().getUnknownXMLObjects().add(buildXMLObject(simpleXMLObjectQName));
-        HttpResponse httpResponse = buildResponse(HttpStatus.SC_OK, envelope);
+        ClassicHttpResponse httpResponse = buildResponse(HttpStatus.SC_OK, envelope);
         
         decoder.setBodyHandler(new TestPayloadBodyHandler());
         decoder.setHttpResponse(httpResponse);
@@ -87,7 +89,7 @@ public class HttpClientResponseSOAP11DecoderTest extends XMLObjectBaseTestCase {
     public void testDecodeToEnvelope() throws ComponentInitializationException, MessageDecodingException, MarshallingException, IOException {
         Envelope envelope = buildMessageSkeleton();
         envelope.getBody().getUnknownXMLObjects().add(buildXMLObject(simpleXMLObjectQName));
-        HttpResponse httpResponse = buildResponse(HttpStatus.SC_OK, envelope);
+        ClassicHttpResponse httpResponse = buildResponse(HttpStatus.SC_OK, envelope);
         
         decoder.setBodyHandler(new TestEnvelopeBodyHandler());
         decoder.setHttpResponse(httpResponse);
@@ -113,7 +115,7 @@ public class HttpClientResponseSOAP11DecoderTest extends XMLObjectBaseTestCase {
         
         Envelope envelope = buildMessageSkeleton();
         envelope.getBody().getUnknownXMLObjects().add(fault);
-        HttpResponse httpResponse = buildResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, envelope);
+        ClassicHttpResponse httpResponse = buildResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, envelope);
         
         decoder.setBodyHandler(new TestPayloadBodyHandler());
         decoder.setHttpResponse(httpResponse);
@@ -122,15 +124,15 @@ public class HttpClientResponseSOAP11DecoderTest extends XMLObjectBaseTestCase {
         decoder.decode();
     }
     
-    private HttpResponse buildResponse(int statusResponseCode, Envelope envelope) throws MarshallingException, IOException {
-        BasicHttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, statusResponseCode, null);
+    private ClassicHttpResponse buildResponse(int statusResponseCode, Envelope envelope) throws MarshallingException, IOException {
+        BasicClassicHttpResponse response = new BasicClassicHttpResponse(statusResponseCode, null);
         Element envelopeElement = XMLObjectSupport.marshall(envelope);
         
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         SerializeSupport.writeNode(envelopeElement, baos);
         baos.flush();
         
-        ByteArrayEntity entity = new ByteArrayEntity(baos.toByteArray());
+        ByteArrayEntity entity = new ByteArrayEntity(baos.toByteArray(), ContentType.TEXT_XML);
         response.setEntity(entity);
         return response;
     }
diff --git a/opensaml-soap-impl/src/test/java/org/opensaml/soap/client/soap11/encoder/http/impl/HttpClientRequestSOAP11EncoderTest.java b/opensaml-soap-impl/src/test/java/org/opensaml/soap/client/soap11/encoder/http/impl/HttpClientRequestSOAP11EncoderTest.java
index 91e3d9a78..d00dcdf21 100644
--- a/opensaml-soap-impl/src/test/java/org/opensaml/soap/client/soap11/encoder/http/impl/HttpClientRequestSOAP11EncoderTest.java
+++ b/opensaml-soap-impl/src/test/java/org/opensaml/soap/client/soap11/encoder/http/impl/HttpClientRequestSOAP11EncoderTest.java
@@ -17,7 +17,7 @@
 
 package org.opensaml.soap.client.soap11.encoder.http.impl;
 
-import org.apache.http.client.methods.HttpPost;
+import org.apache.hc.client5.http.classic.methods.HttpPost;
 import org.opensaml.core.testing.XMLObjectBaseTestCase;
 import org.opensaml.core.xml.mock.SimpleXMLObject;
 import org.opensaml.messaging.context.MessageContext;
@@ -68,8 +68,8 @@ public class HttpClientRequestSOAP11EncoderTest extends XMLObjectBaseTestCase {
         
         Assert.assertNotNull(request.getEntity());
         
-        Assert.assertTrue(request.getEntity().getContentType().getValue().startsWith("text/xml;"), "Unexpected content type");
-        Assert.assertEquals(request.getEntity().getContentType().getElements()[0].getParameterByName("charset").getValue(), "UTF-8", "Unexpected character encoding");
+        Assert.assertTrue(request.getEntity().getContentType().startsWith("text/xml;"), "Unexpected content type");
+        Assert.assertEquals(request.getEntity().getContentEncoding(), "UTF-8", "Unexpected character encoding");
         Assert.assertEquals(request.getFirstHeader("SOAPAction").getValue(), "");
     }
 
@@ -98,8 +98,8 @@ public class HttpClientRequestSOAP11EncoderTest extends XMLObjectBaseTestCase {
         
         Assert.assertNotNull(request.getEntity());
         
-        Assert.assertTrue(request.getEntity().getContentType().getValue().startsWith("text/xml;"), "Unexpected content type");
-        Assert.assertEquals(request.getEntity().getContentType().getElements()[0].getParameterByName("charset").getValue(), "UTF-8", "Unexpected character encoding");
+        Assert.assertTrue(request.getEntity().getContentType().startsWith("text/xml;"), "Unexpected content type");
+        Assert.assertEquals(request.getEntity().getContentEncoding(), "UTF-8", "Unexpected character encoding");
         Assert.assertEquals(request.getFirstHeader("SOAPAction").getValue(), "urn:test:action:foo");
     }
 
diff --git a/opensaml-spring/pom.xml b/opensaml-spring/pom.xml
index e2f4ba863..9447780dd 100644
--- a/opensaml-spring/pom.xml
+++ b/opensaml-spring/pom.xml
@@ -81,7 +81,7 @@
 
         <dependency>
             <groupId>${httpclient.groupId}</groupId>
-            <artifactId>httpclient</artifactId>
+            <artifactId>${httpclient.artifactId}</artifactId>
         </dependency>
 
         <dependency>
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/tls/TLSSocketFactoryFactoryBean.java b/opensaml-spring/src/main/java/org/opensaml/spring/tls/TLSSocketFactoryFactoryBean.java
index 56f2b57ef..611a02feb 100644
--- a/opensaml-spring/src/main/java/org/opensaml/spring/tls/TLSSocketFactoryFactoryBean.java
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/tls/TLSSocketFactoryFactoryBean.java
@@ -19,8 +19,7 @@ package org.opensaml.spring.tls;
 
 import javax.annotation.Nullable;
 
-import org.apache.http.client.HttpClient;
-import org.apache.http.conn.socket.LayeredConnectionSocketFactory;
+import org.apache.hc.client5.http.socket.LayeredConnectionSocketFactory;
 import org.opensaml.security.httpclient.HttpClientSecurityParameters;
 import org.opensaml.security.httpclient.impl.SecurityEnhancedHttpClientSupport;
 import org.opensaml.security.trust.TrustEngine;

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the commits mailing list