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

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


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

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

View the commit online:
http://git.shibboleth.net/view/?p=java-shib-attribute.git;a=commit;h=6535f2e6343dae5a232d21b0ef28ee36e360ca5b

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

commit 6535f2e6343dae5a232d21b0ef28ee36e360ca5b
Author: Brent Putman <putmanb at georgetown.edu>
AuthorDate: Thu Feb 2 23:42:23 2023 -0500

    JSSH-16: Update to Apache HttpClient 5.x
    
    Initial refactor.
---
 shib-attribute-resolver-api/pom.xml                |  4 ++--
 .../dc/http/HTTPResponseMappingStrategy.java       |  6 ++---
 .../idp/attribute/resolver/dc/http/HTTPSearch.java |  2 +-
 shib-attribute-resolver-impl/pom.xml               |  9 ++++----
 .../dc/http/impl/AbstractHTTPSearchBuilder.java    | 26 ++++++++++------------
 .../resolver/dc/http/impl/HTTPDataConnector.java   |  2 +-
 .../http/impl/ScriptedResponseMappingStrategy.java | 25 ++++++++++-----------
 .../dc/http/impl/TemplatedBodyBuilder.java         | 17 +++++++-------
 .../dc/http/impl/HTTPDataConnectorTest.java        |  4 ++--
 9 files changed, 46 insertions(+), 49 deletions(-)

diff --git a/shib-attribute-resolver-api/pom.xml b/shib-attribute-resolver-api/pom.xml
index a811bc170..dbe8c0444 100644
--- a/shib-attribute-resolver-api/pom.xml
+++ b/shib-attribute-resolver-api/pom.xml
@@ -71,8 +71,8 @@
         </dependency>
 
         <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpclient</artifactId>
+            <groupId>${httpclient.groupId}</groupId>
+            <artifactId>${httpclient.artifactId}</artifactId>
         </dependency>
         
         <!-- Provided Dependencies -->
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/HTTPResponseMappingStrategy.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/HTTPResponseMappingStrategy.java
index 382694c3d..380033bf9 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/HTTPResponseMappingStrategy.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/HTTPResponseMappingStrategy.java
@@ -19,16 +19,16 @@ package net.shibboleth.idp.attribute.resolver.dc.http;
 
 import java.util.Map;
 
-import org.apache.http.client.ResponseHandler;
+import org.apache.hc.core5.http.io.HttpClientResponseHandler;
 
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.resolver.dc.MappingStrategy;
 
 /**
- * Strategy for processing an {@link org.apache.http.client.HttpClient} response into a map of 
+ * Strategy for processing an {@link org.apache.hc.client5.http.classic.HttpClient} response into a map of 
  * {@link net.shibboleth.idp.attribute.IdPAttribute}s.
  */
 public interface HTTPResponseMappingStrategy extends MappingStrategy<Map<String,IdPAttribute>>,
-    ResponseHandler<Map<String,IdPAttribute>> {
+    HttpClientResponseHandler<Map<String,IdPAttribute>> {
     
 }
\ No newline at end of file
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/HTTPSearch.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/HTTPSearch.java
index ad4259842..df5b18ecd 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/HTTPSearch.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/HTTPSearch.java
@@ -23,7 +23,7 @@ import java.util.Map;
 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.security.httpclient.HttpClientSecurityParameters;
 
 import net.shibboleth.idp.attribute.IdPAttribute;
diff --git a/shib-attribute-resolver-impl/pom.xml b/shib-attribute-resolver-impl/pom.xml
index cbc4f203f..fe9aeeb3d 100644
--- a/shib-attribute-resolver-impl/pom.xml
+++ b/shib-attribute-resolver-impl/pom.xml
@@ -74,13 +74,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>
+
         <dependency>
             <groupId>org.apache.velocity</groupId>
             <artifactId>velocity-engine-core</artifactId>
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/AbstractHTTPSearchBuilder.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/AbstractHTTPSearchBuilder.java
index 1af7ba1a5..2fa9b2cc1 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/AbstractHTTPSearchBuilder.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/AbstractHTTPSearchBuilder.java
@@ -18,7 +18,6 @@
 package net.shibboleth.idp.attribute.resolver.dc.http.impl;
 
 import java.io.IOException;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -26,11 +25,10 @@ import java.util.stream.Collectors;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import org.apache.http.HttpRequest;
-import org.apache.http.client.HttpClient;
-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.opensaml.security.httpclient.HttpClientSecurityParameters;
 import org.opensaml.security.httpclient.HttpClientSecuritySupport;
 
@@ -140,7 +138,7 @@ public abstract class AbstractHTTPSearchBuilder extends AbstractInitializableCom
     @Nonnull public HTTPSearch build(@Nonnull final AttributeResolutionContext resolutionContext,
             @Nonnull final Map<String, List<IdPAttributeValue>> dependencyAttributes) throws ResolutionException {
         
-        final HttpUriRequest request = getHttpRequest(resolutionContext, dependencyAttributes);
+        final ClassicHttpRequest request = getHttpRequest(resolutionContext, dependencyAttributes);
         
         for (final Pair<String,String> entry : headerList) {
             request.setHeader(entry.getFirst(), entry.getSecond());
@@ -158,7 +156,7 @@ public abstract class AbstractHTTPSearchBuilder extends AbstractInitializableCom
 
             /** {@inheritDoc} */
             public String toString() {
-                return request.getRequestLine().getUri();
+                return request.getRequestUri();
             }
             
             /** {@inheritDoc} */
@@ -169,8 +167,8 @@ public abstract class AbstractHTTPSearchBuilder extends AbstractInitializableCom
                 @Nonnull HttpClientContext clientContext = HttpClientContext.create();
                 HttpClientSecuritySupport.marshalSecurityParameters(clientContext, securityParameters, true);
                 HttpClientSecuritySupport.addDefaultTLSTrustEngineCriteria(clientContext, request);
-                @Nonnull final Map<String,IdPAttribute> results = client.execute(request, mappingStrategy, clientContext);
-                HttpClientSecuritySupport.checkTLSCredentialEvaluated(clientContext, request.getURI().getScheme());
+                @Nonnull final Map<String,IdPAttribute> results = client.execute(request, clientContext, mappingStrategy);
+                HttpClientSecuritySupport.checkTLSCredentialEvaluated(clientContext, request.getScheme());
                 return results;
             }
             
@@ -200,10 +198,10 @@ public abstract class AbstractHTTPSearchBuilder extends AbstractInitializableCom
      * @param resolutionContext the context of the resolution
      * @param dependencyAttributes made available to the request
      * 
-     * @return the {@link HttpRequest} to use
+     * @return the {@link ClassicHttpRequest} to use
      * @throws ResolutionException if an error occurs
      */
-    @Nonnull protected HttpUriRequest getHttpRequest(@Nonnull final AttributeResolutionContext resolutionContext,
+    @Nonnull protected ClassicHttpRequest getHttpRequest(@Nonnull final AttributeResolutionContext resolutionContext,
             @Nonnull final Map<String,List<IdPAttributeValue>> dependencyAttributes) throws ResolutionException {
         
         // Default just wraps a computed URL into a GET.
@@ -223,11 +221,11 @@ public abstract class AbstractHTTPSearchBuilder extends AbstractInitializableCom
      * 
      * @return the cache key
      */
-    @Nullable protected String getResultCacheKey(@Nonnull final HttpUriRequest request,
+    @Nullable protected String getResultCacheKey(@Nonnull final ClassicHttpRequest request,
             @Nonnull final AttributeResolutionContext resolutionContext,
             @Nonnull final Map<String, List<IdPAttributeValue>> dependencyAttributes) {
         if (request instanceof HttpGet) {
-            return ((HttpGet) request).getURI().toString();
+            return request.getRequestUri();
         }
         return null;
     }
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnector.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnector.java
index 31d806f57..05ea4ea79 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnector.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnector.java
@@ -27,7 +27,7 @@ import java.util.Map;
 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.security.httpclient.HttpClientSecurityParameters;
 
 import net.shibboleth.idp.attribute.IdPAttribute;
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/ScriptedResponseMappingStrategy.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/ScriptedResponseMappingStrategy.java
index b35c1e9d0..f7e2af0a0 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/ScriptedResponseMappingStrategy.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/ScriptedResponseMappingStrategy.java
@@ -32,10 +32,10 @@ import javax.annotation.Nullable;
 import javax.script.ScriptContext;
 import javax.script.ScriptException;
 
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.entity.ContentType;
+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.slf4j.Logger;
 
 import net.shibboleth.idp.attribute.IdPAttribute;
@@ -127,7 +127,7 @@ public final class ScriptedResponseMappingStrategy extends AbstractScriptEvaluat
     
     /** {@inheritDoc} */
     @SuppressWarnings("unchecked")
-    public Map<String,IdPAttribute> handleResponse(final HttpResponse response) throws IOException {
+    public Map<String,IdPAttribute> handleResponse(final ClassicHttpResponse response) throws IOException {
         
         log.debug("{} Handling HTTP response", getLogPrefix());
         
@@ -205,12 +205,10 @@ public final class ScriptedResponseMappingStrategy extends AbstractScriptEvaluat
      * 
      * @throws IOException if the status is unacceptable
      */
-    private void checkStatus(@Nonnull final HttpResponse response) throws IOException {
+    private void checkStatus(@Nonnull final ClassicHttpResponse response) throws IOException {
         if (!acceptStatuses.isEmpty()) {
-            if (response.getStatusLine() == null
-                    || !acceptStatuses.contains(response.getStatusLine().getStatusCode())) {
-                log.debug("{} Unacceptable HTTP status: {}", getLogPrefix(),
-                        response.getStatusLine() != null ? response.getStatusLine().getStatusCode() : "unknown");
+            if (!acceptStatuses.contains(response.getCode())) {
+                log.debug("{} Unacceptable HTTP status: {}", getLogPrefix(), response.getCode());
                 throw new IOException(getLogPrefix() + " HTTP status unknown or unacceptable");
             }
         }
@@ -226,10 +224,11 @@ public final class ScriptedResponseMappingStrategy extends AbstractScriptEvaluat
     private void checkContentType(@Nonnull final HttpEntity entity) throws IOException {
         if (!acceptTypes.isEmpty()) {
             
-            final ContentType contentType = ContentType.get(entity);
-            if (contentType == null || !acceptTypes.contains(contentType.getMimeType())) {
+            final String rawContentType = entity.getContentType();
+            final String mimeType = rawContentType != null ? ContentType.parse(rawContentType).getMimeType() : null;
+            if (mimeType == null || !acceptTypes.contains(mimeType)) {
                 log.debug("{} Unacceptable Content-Type: {}", getLogPrefix(),
-                        contentType != null ? contentType.getMimeType() : "unknown");
+                        mimeType != null ? mimeType : "unknown");
                 throw new IOException(getLogPrefix() + " Content-Type unknown or unacceptable");
             }
         }
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/TemplatedBodyBuilder.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/TemplatedBodyBuilder.java
index b2922e8e3..4d1237f23 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/TemplatedBodyBuilder.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/TemplatedBodyBuilder.java
@@ -24,12 +24,11 @@ import java.util.Map;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.client.methods.HttpPut;
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.entity.ContentType;
-import org.apache.http.entity.StringEntity;
+import org.apache.hc.client5.http.classic.methods.HttpPost;
+import org.apache.hc.client5.http.classic.methods.HttpPut;
+import org.apache.hc.core5.http.ClassicHttpRequest;
+import org.apache.hc.core5.http.ContentType;
+import org.apache.hc.core5.http.io.entity.StringEntity;
 import org.apache.velocity.VelocityContext;
 import org.apache.velocity.app.VelocityEngine;
 import org.apache.velocity.exception.VelocityException;
@@ -320,7 +319,7 @@ public class TemplatedBodyBuilder extends AbstractHTTPSearchBuilder {
 
     /** {@inheritDoc} */
     @Override
-    @Nonnull protected HttpUriRequest getHttpRequest(@Nonnull final AttributeResolutionContext resolutionContext,
+    @Nonnull protected ClassicHttpRequest getHttpRequest(@Nonnull final AttributeResolutionContext resolutionContext,
             @Nonnull final Map<String, List<IdPAttributeValue>> dependencyAttributes) throws ResolutionException {
 
         final VelocityContext context = new VelocityContext();
@@ -349,7 +348,7 @@ public class TemplatedBodyBuilder extends AbstractHTTPSearchBuilder {
 
         final String url;
         final String body;
-        final HttpEntityEnclosingRequestBase request;
+        final ClassicHttpRequest request;
         
         try {
             url = merge(urlTemplate, context);
@@ -378,7 +377,7 @@ public class TemplatedBodyBuilder extends AbstractHTTPSearchBuilder {
 
     /** {@inheritDoc} */
     @Override
-    @Nullable @NotEmpty protected String getResultCacheKey(@Nonnull final HttpUriRequest request,
+    @Nullable @NotEmpty protected String getResultCacheKey(@Nonnull final ClassicHttpRequest request,
             @Nonnull final AttributeResolutionContext resolutionContext,
             @Nonnull final Map<String, List<IdPAttributeValue>> dependencyAttributes) {
         
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnectorTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnectorTest.java
index 453374eae..e4f53d18d 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnectorTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnectorTest.java
@@ -31,8 +31,8 @@ import java.util.Set;
 
 import javax.script.ScriptException;
 
-import org.apache.http.HttpStatus;
-import org.apache.http.conn.socket.LayeredConnectionSocketFactory;
+import org.apache.hc.client5.http.socket.LayeredConnectionSocketFactory;
+import org.apache.hc.core5.http.HttpStatus;
 import org.opensaml.saml.metadata.resolver.impl.FileBackedHTTPMetadataResolver;
 import org.opensaml.security.credential.impl.StaticCredentialResolver;
 import org.opensaml.security.httpclient.HttpClientSecurityParameters;

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


More information about the commits mailing list