[java-shib-metadata] branch main updated: JSMD-10: Consider whether to switch to non-caching HttpClient ...

Codeberg noreply at shibboleth.net
Wed Jan 14 02:37:26 UTC 2026


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

codeberg pushed a commit to branch main
in repository java-shib-metadata.

View the commit online:
https://codeberg.org/Shibboleth/java-shib-metadata/commit/9448897a098c28d77e59331ec8b14a221815a4b1

The following commit(s) were added to refs/heads/main by this push:
     new 9448897a JSMD-10: Consider whether to switch to non-caching HttpClient ...
9448897a is described below

commit 9448897a098c28d77e59331ec8b14a221815a4b1
Author: Brent Putman <putmanb at georgetown.edu>
AuthorDate: Tue Jan 13 20:29:25 2026 -0500

    JSMD-10: Consider whether to switch to non-caching HttpClient ...
    
    Consider whether to switch to non-caching HttpClient in dynamic
    provider.
    
    Added flag to control behavior.
---
 .../AbstractDynamicHTTPMetadataProviderParser.java | 25 +++++++++++----
 .../main/resources/schema/shibboleth-metadata.xsd  |  6 ++++
 .../DynamicHTTPMetadataProviderParserTest.java     | 36 ++++++++++++++++++++++
 .../dynamic-httpCaching-noneViaAttribute.xml       | 17 ++++++++++
 .../metadata/dynamic-httpCaching-viaAttribute.xml  | 17 ++++++++++
 5 files changed, 95 insertions(+), 6 deletions(-)

diff --git a/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/AbstractDynamicHTTPMetadataProviderParser.java b/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/AbstractDynamicHTTPMetadataProviderParser.java
index e94062fe..f477af1e 100644
--- a/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/AbstractDynamicHTTPMetadataProviderParser.java
+++ b/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/AbstractDynamicHTTPMetadataProviderParser.java
@@ -30,6 +30,7 @@ import net.shibboleth.shared.primitive.StringSupport;
 import net.shibboleth.shared.spring.util.SpringSupport;
 import net.shibboleth.shared.xml.AttributeSupport;
 import net.shibboleth.shared.xml.ElementSupport;
+import net.shibboleth.spring.http.HttpClientFactoryBean;
 import net.shibboleth.spring.http.InMemoryCachingHttpClientFactoryBean;
 
 /**
@@ -37,8 +38,14 @@ import net.shibboleth.spring.http.InMemoryCachingHttpClientFactoryBean;
  */
 public abstract class AbstractDynamicHTTPMetadataProviderParser extends AbstractDynamicMetadataProviderParser {
 
-    /** Default caching type . */
-    @Nonnull private static final Class<?> DEFAULT_CACHING_CLASS = InMemoryCachingHttpClientFactoryBean.class;
+    /** Default flag for use of caching HttpClient. */
+    @Nonnull private static final Boolean DEFAULT_USE_CACHING_HTTP_CLIENT = Boolean.TRUE;
+
+    /** Default caching HttpClient class. */
+    @Nonnull private static final Class<?> DEFAULT_CACHING_CLIENT_CLASS = InMemoryCachingHttpClientFactoryBean.class;
+
+    /** Default non-caching HttpClient class. */
+    @Nonnull private static final Class<?> DEFAULT_NON_CACHING_CLIENT_CLASS = HttpClientFactoryBean.class;
 
     /** Default max total connections. */
     @Nonnull private static final Integer DEFAULT_MAX_CONNECTIONS_TOTAL = 100;
@@ -83,7 +90,8 @@ public abstract class AbstractDynamicHTTPMetadataProviderParser extends Abstract
         if (element.hasAttributeNS(null, "httpClientRef")) {
             builder.addConstructorArgReference(
                     AttributeSupport.ensureAttributeValue(element, null, "httpClientRef"));
-            if (element.hasAttributeNS(null, "connectionTimeout")
+            if (element.hasAttributeNS(null, "useCachingHttpClient")
+                    || element.hasAttributeNS(null, "connectionTimeout")
                     || element.hasAttributeNS(null, "connectionRequestTimeout")
                     || element.hasAttributeNS(null, "socketTimeout")
                     || element.hasAttributeNS(null, "responseTimeout")
@@ -94,8 +102,8 @@ public abstract class AbstractDynamicHTTPMetadataProviderParser extends Abstract
                     || element.hasAttributeNS(null, "disregardTLSCertificate")
                     || element.hasAttributeNS(null, "proxyHost") || element.hasAttributeNS(null, "proxyPort")
                     || element.hasAttributeNS(null, "proxyUser") || element.hasAttributeNS(null, "proxyPassword")) {
-                log.warn("httpClientRef overrides settings for connectionTimeout, responseTimeout, "
-                    + "requestTimeout, requestTimeoutCorePoolSize, "
+                log.warn("httpClientRef overrides settings for useCachingHttpClient, "
+                    + "connectionTimeout, responseTimeout, requestTimeout, requestTimeoutCorePoolSize, "
                     + "connectionRequestTimeout, socketTimeout, maxConnectionsTotal, maxConnectionsPerRoute, "
                     + "disregardTLSCertificate, proxyHost, proxyPort, "
                     + "proxyUser and proxyPassword");
@@ -125,10 +133,15 @@ public abstract class AbstractDynamicHTTPMetadataProviderParser extends Abstract
     @Nonnull private BeanDefinition buildHttpClient(@Nonnull final Element element,
             @Nonnull final ParserContext parserContext, @Nullable final BeanDefinition httpClientSecurityParameters) {
 
+        Boolean useCachingHttpClient = StringSupport.booleanOf(element.getAttributeNS(null, "useCachingHttpClient"));
+        if (useCachingHttpClient == null ) {
+            useCachingHttpClient = DEFAULT_USE_CACHING_HTTP_CLIENT;
+        }
+
         final BeanDefinitionBuilder clientBuilder = 
                 HTTPMetadataProvidersParserSupport.buildCommonClientBuilder(element,
                         parserContext,
-                        DEFAULT_CACHING_CLASS ,
+                        useCachingHttpClient ? DEFAULT_CACHING_CLIENT_CLASS : DEFAULT_NON_CACHING_CLIENT_CLASS,
                         httpClientSecurityParameters);
 
         // Set up non standard defaults
diff --git a/shib-metadata-spring/src/main/resources/schema/shibboleth-metadata.xsd b/shib-metadata-spring/src/main/resources/schema/shibboleth-metadata.xsd
index cc5eb363..45c77ce2 100644
--- a/shib-metadata-spring/src/main/resources/schema/shibboleth-metadata.xsd
+++ b/shib-metadata-spring/src/main/resources/schema/shibboleth-metadata.xsd
@@ -531,6 +531,12 @@
                         <documentation>Password for the HTTP proxy through which connections will be made.</documentation>
                     </annotation>
                 </attribute>
+                <attribute name="useCachingHttpClient" type="shibmd:string">
+                    <annotation>
+                        <documentation>Flag indicating whether to use a caching HttpClient instance.
+                        Defaults to: true</documentation>
+                    </annotation>
+                </attribute>
                 <!-- Need to deal with socket factory -->
             </extension>
         </complexContent>
diff --git a/shib-metadata-spring/src/test/java/net/shibboleth/spring/metadata/DynamicHTTPMetadataProviderParserTest.java b/shib-metadata-spring/src/test/java/net/shibboleth/spring/metadata/DynamicHTTPMetadataProviderParserTest.java
index fbe796c5..21e03b75 100644
--- a/shib-metadata-spring/src/test/java/net/shibboleth/spring/metadata/DynamicHTTPMetadataProviderParserTest.java
+++ b/shib-metadata-spring/src/test/java/net/shibboleth/spring/metadata/DynamicHTTPMetadataProviderParserTest.java
@@ -333,6 +333,42 @@ public class DynamicHTTPMetadataProviderParserTest extends AbstractMetadataParse
         Assert.assertEquals(ed.getEntityID(), entityID);
     }
 
+    @Test
+    public void testHttpCachingNoneViaAttribute() throws Exception {
+        MockPropertySource propSource = singletonPropertySource(PROP_MDURL, 
+                RepositorySupport.buildHTTPResourceURL(REPO_OPENSAML, TEMPLATE_URL, false));
+        
+        final FunctionDrivenDynamicHTTPMetadataResolver resolver = getBean(FunctionDrivenDynamicHTTPMetadataResolver.class, 
+                propSource, "dynamic-httpCaching-noneViaAttribute.xml", "beans.xml", "httpClient.xml");
+        
+        final String entityID = "https://www.example.org/sp";
+        
+        final CriteriaSet criteriaSet = new CriteriaSet( new EntityIdCriterion(entityID));
+        
+        final EntityDescriptor ed = resolver.resolveSingle(criteriaSet);
+        Assert.assertNotNull(ed);
+        assert ed != null;
+        Assert.assertEquals(ed.getEntityID(), entityID);
+    }
+
+    @Test
+    public void testHttpCachingViaAttribute() throws Exception {
+        MockPropertySource propSource = singletonPropertySource(PROP_MDURL, 
+                RepositorySupport.buildHTTPResourceURL(REPO_OPENSAML, TEMPLATE_URL, false));
+        
+        final FunctionDrivenDynamicHTTPMetadataResolver resolver = getBean(FunctionDrivenDynamicHTTPMetadataResolver.class, 
+                propSource, "dynamic-httpCaching-viaAttribute.xml", "beans.xml", "httpClient.xml");
+        
+        final String entityID = "https://www.example.org/sp";
+        
+        final CriteriaSet criteriaSet = new CriteriaSet( new EntityIdCriterion(entityID));
+        
+        final EntityDescriptor ed = resolver.resolveSingle(criteriaSet);
+        Assert.assertNotNull(ed);
+        assert ed != null;
+        Assert.assertEquals(ed.getEntityID(), entityID);
+    }
+
     @Test
     public void testHttpCachingMemory() throws Exception {
         MockPropertySource propSource = singletonPropertySource(PROP_MDURL, 
diff --git a/shib-metadata-spring/src/test/resources/net/shibboleth/spring/metadata/dynamic-httpCaching-noneViaAttribute.xml b/shib-metadata-spring/src/test/resources/net/shibboleth/spring/metadata/dynamic-httpCaching-noneViaAttribute.xml
new file mode 100644
index 00000000..ca5b9fc9
--- /dev/null
+++ b/shib-metadata-spring/src/test/resources/net/shibboleth/spring/metadata/dynamic-httpCaching-noneViaAttribute.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata:MetadataProvider xmlns="urn:oasis:names:tc:SAML:2.0:metadata"
+	xmlns:metadata="urn:mace:shibboleth:2.0:metadata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:metadata http://shibboleth.net/schema/idp/shibboleth-metadata.xsd
+                       urn:oasis:names:tc:SAML:2.0:metadata http://docs.oasis-open.org/security/saml/v2.0/saml-schema-metadata-2.0.xsd"
+
+	id="dynamicHttpCachingNone" 
+    useCachingHttpClient="false"
+    xsi:type="metadata:DynamicHTTPMetadataProvider" >
+    
+    <!-- Note: use of the transformRef here is mostly just to facilitate testing. -->
+    <metadata:Template transformRef="digester.SHA1HexLower">
+        %{metadataURL}
+    </metadata:Template>
+
+</metadata:MetadataProvider>
+                                   
\ No newline at end of file
diff --git a/shib-metadata-spring/src/test/resources/net/shibboleth/spring/metadata/dynamic-httpCaching-viaAttribute.xml b/shib-metadata-spring/src/test/resources/net/shibboleth/spring/metadata/dynamic-httpCaching-viaAttribute.xml
new file mode 100644
index 00000000..5472e0bc
--- /dev/null
+++ b/shib-metadata-spring/src/test/resources/net/shibboleth/spring/metadata/dynamic-httpCaching-viaAttribute.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata:MetadataProvider xmlns="urn:oasis:names:tc:SAML:2.0:metadata"
+	xmlns:metadata="urn:mace:shibboleth:2.0:metadata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:metadata http://shibboleth.net/schema/idp/shibboleth-metadata.xsd
+                       urn:oasis:names:tc:SAML:2.0:metadata http://docs.oasis-open.org/security/saml/v2.0/saml-schema-metadata-2.0.xsd"
+
+	id="dynamicHttpCachingNone" 
+    useCachingHttpClient="true"
+    xsi:type="metadata:DynamicHTTPMetadataProvider" >
+    
+    <!-- Note: use of the transformRef here is mostly just to facilitate testing. -->
+    <metadata:Template transformRef="digester.SHA1HexLower">
+        %{metadataURL}
+    </metadata:Template>
+
+</metadata:MetadataProvider>
+                                   
\ No newline at end of file

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


More information about the commits mailing list