diff options
-rw-r--r-- | eaaf-springboot-utils/pom.xml | 8 | ||||
-rw-r--r-- | eaaf_core_utils/src/main/java/at/gv/egiz/eaaf/core/impl/http/HttpClientFactory.java | 132 | ||||
-rw-r--r-- | pom.xml | 73 |
3 files changed, 123 insertions, 90 deletions
diff --git a/eaaf-springboot-utils/pom.xml b/eaaf-springboot-utils/pom.xml index fc26e150..1208512e 100644 --- a/eaaf-springboot-utils/pom.xml +++ b/eaaf-springboot-utils/pom.xml @@ -60,11 +60,15 @@ <scope>provided</scope> </dependency> <dependency> - <groupId>ch.qos.logback</groupId> - <artifactId>logback-access</artifactId> + <groupId>ch.qos.logback.access</groupId> + <artifactId>common</artifactId> <scope>provided</scope> </dependency> <dependency> + <groupId>ch.qos.logback.access</groupId> + <artifactId>logback-access-tomcat</artifactId> + </dependency> + <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-to-slf4j</artifactId> <scope>provided</scope> diff --git a/eaaf_core_utils/src/main/java/at/gv/egiz/eaaf/core/impl/http/HttpClientFactory.java b/eaaf_core_utils/src/main/java/at/gv/egiz/eaaf/core/impl/http/HttpClientFactory.java index ceffe26c..9b51ccd1 100644 --- a/eaaf_core_utils/src/main/java/at/gv/egiz/eaaf/core/impl/http/HttpClientFactory.java +++ b/eaaf_core_utils/src/main/java/at/gv/egiz/eaaf/core/impl/http/HttpClientFactory.java @@ -22,14 +22,13 @@ import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; import org.apache.hc.client5.http.impl.classic.HttpClients; import org.apache.hc.client5.http.impl.io.BasicHttpClientConnectionManager; import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager; +import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder; import org.apache.hc.client5.http.impl.routing.DefaultProxyRoutePlanner; import org.apache.hc.client5.http.io.HttpClientConnectionManager; import org.apache.hc.client5.http.protocol.RedirectStrategy; -import org.apache.hc.client5.http.socket.ConnectionSocketFactory; -import org.apache.hc.client5.http.socket.LayeredConnectionSocketFactory; -import org.apache.hc.client5.http.socket.PlainConnectionSocketFactory; +import org.apache.hc.client5.http.ssl.DefaultClientTlsStrategy; import org.apache.hc.client5.http.ssl.NoopHostnameVerifier; -import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory; +import org.apache.hc.client5.http.ssl.TlsSocketStrategy; import org.apache.hc.core5.http.HttpException; import org.apache.hc.core5.http.HttpHost; import org.apache.hc.core5.http.HttpRequest; @@ -40,6 +39,7 @@ import org.apache.hc.core5.http.config.RegistryBuilder; import org.apache.hc.core5.http.io.SocketConfig; import org.apache.hc.core5.http.protocol.HttpContext; import org.apache.hc.core5.pool.PoolConcurrencyPolicy; +import org.apache.hc.core5.pool.PoolReusePolicy; import org.apache.hc.core5.util.TimeValue; import org.springframework.beans.factory.annotation.Autowired; @@ -185,7 +185,7 @@ public class HttpClientFactory implements IHttpClientFactory { injectBasicAuthenticationIfRequired(builder, config); // inject authentication if required - final LayeredConnectionSocketFactory sslConnectionFactory = getSslContext(config); + final DefaultClientTlsStrategy sslConnectionFactory = getSslContext(config); // set pool connection if required final HttpClientConnectionManager connectionManager = injectConnectionManager(builder, @@ -252,7 +252,7 @@ public class HttpClientFactory implements IHttpClientFactory { injectBasicAuthenticationIfRequired(defaultHttpClientBuilder, defaultHttpClientConfig); // inject authentication if required - final LayeredConnectionSocketFactory sslConnectionFactory = + final DefaultClientTlsStrategy sslConnectionFactory = getSslContext(defaultHttpClientConfig); // set pool connection if required @@ -379,7 +379,7 @@ public class HttpClientFactory implements IHttpClientFactory { } @Nonnull - private LayeredConnectionSocketFactory getSslContext(final HttpClientConfiguration httpClientConfig) + private DefaultClientTlsStrategy getSslContext(final HttpClientConfiguration httpClientConfig) throws EaafException { SSLContext sslContext = null; if (httpClientConfig.getAuthMode().equals(HttpClientConfiguration.ClientAuthMode.SSL)) { @@ -410,10 +410,9 @@ public class HttpClientFactory implements IHttpClientFactory { } - final LayeredConnectionSocketFactory sslSocketFactory = - new SSLConnectionSocketFactory(sslContext, hostnameVerifier); + DefaultClientTlsStrategy tslStrategy = new DefaultClientTlsStrategy(sslContext, hostnameVerifier); log.debug("HTTP client-builder successfuly initialized"); - return sslSocketFactory; + return tslStrategy; } @@ -431,7 +430,7 @@ public class HttpClientFactory implements IHttpClientFactory { @Nonnull private HttpClientConnectionManager injectConnectionManager( - HttpClientBuilder builder, final LayeredConnectionSocketFactory sslConnectionFactory) + HttpClientBuilder builder, final DefaultClientTlsStrategy sslConnectionFactory) throws EaafConfigurationException { if (basicConfig.getBasicConfigurationBoolean(PROP_CONFIG_CLIENT_HTTP_CONNECTION_POOL_USE, true)) { @@ -441,34 +440,39 @@ public class HttpClientFactory implements IHttpClientFactory { TimeUnit.SECONDS); log.debug("Set {} seconds as time-to-life for pooled http connections"); - final PoolingHttpClientConnectionManager connectionPool = new PoolingHttpClientConnectionManager( - getDefaultRegistry(sslConnectionFactory), - PoolConcurrencyPolicy.STRICT, timeToLife, null); - connectionPool.setDefaultMaxPerRoute(Integer.parseInt( - basicConfig.getBasicConfiguration(PROP_CONFIG_CLIENT_HTTP_CONNECTION_POOL_MAXPERROUTE, - DEFAULT_CONFIG_CLIENT_HTTP_CONNECTION_POOL_MAXPERROUTE))); - connectionPool.setMaxTotal(Integer.parseInt( - basicConfig.getBasicConfiguration(PROP_CONFIG_CLIENT_HTTP_CONNECTION_POOL_MAXTOTAL, - DEFAULT_CONFIG_CLIENT_HTTP_CONNECTION_POOL_MAXTOTAL))); - connectionPool.setDefaultSocketConfig(SocketConfig.custom() - .setSoTimeout( - Integer.parseInt( - basicConfig.getBasicConfiguration( - PROP_CONFIG_CLIENT_HTTP_CONNECTION_TIMEOUT_SOCKET, - DEFAULT_CONFIG_CLIENT_HTTP_CONNECTION_TIMEOUT_SOCKET)), TimeUnit.SECONDS) - .build()); - connectionPool.setDefaultConnectionConfig(ConnectionConfig.custom() - .setConnectTimeout(Long.parseLong( - basicConfig.getBasicConfiguration( - PROP_CONFIG_CLIENT_HTTP_CONNECTION_TIMEOUT_CONNECTION, - DEFAULT_CONFIG_CLIENT_HTTP_CONNECTION_TIMEOUT_CONNECTION)), TimeUnit.SECONDS) - .setValidateAfterInactivity(Integer.parseInt( - basicConfig.getBasicConfiguration( - PROP_CONFIG_CLIENT_HTTP_CONNECTION_POOL_VALIDATION_INACTIVITY, - DEFAULT_CONFIG_CLIENT_HTTP_CONNECTION_POOL_VALIDATION_INACTIVITY)), TimeUnit.SECONDS) - .build()); - - + final PoolingHttpClientConnectionManager connectionPool = PoolingHttpClientConnectionManagerBuilder + .create() + .setTlsSocketStrategy(sslConnectionFactory) + .setDefaultSocketConfig( + SocketConfig.custom() + .setSoTimeout( + Integer.parseInt( + basicConfig.getBasicConfiguration( + PROP_CONFIG_CLIENT_HTTP_CONNECTION_TIMEOUT_SOCKET, + DEFAULT_CONFIG_CLIENT_HTTP_CONNECTION_TIMEOUT_SOCKET)), TimeUnit.SECONDS) + .build()) + .setDefaultConnectionConfig( + ConnectionConfig.custom() + .setTimeToLive(timeToLife) + .setConnectTimeout(Long.parseLong( + basicConfig.getBasicConfiguration( + PROP_CONFIG_CLIENT_HTTP_CONNECTION_TIMEOUT_CONNECTION, + DEFAULT_CONFIG_CLIENT_HTTP_CONNECTION_TIMEOUT_CONNECTION)), TimeUnit.SECONDS) + .setValidateAfterInactivity(Integer.parseInt( + basicConfig.getBasicConfiguration( + PROP_CONFIG_CLIENT_HTTP_CONNECTION_POOL_VALIDATION_INACTIVITY, + DEFAULT_CONFIG_CLIENT_HTTP_CONNECTION_POOL_VALIDATION_INACTIVITY)), + TimeUnit.SECONDS) + .build()) + .setMaxConnPerRoute(Integer.parseInt( + basicConfig.getBasicConfiguration(PROP_CONFIG_CLIENT_HTTP_CONNECTION_POOL_MAXPERROUTE, + DEFAULT_CONFIG_CLIENT_HTTP_CONNECTION_POOL_MAXPERROUTE))) + .setMaxConnTotal(Integer.parseInt( + basicConfig.getBasicConfiguration(PROP_CONFIG_CLIENT_HTTP_CONNECTION_POOL_MAXTOTAL, + DEFAULT_CONFIG_CLIENT_HTTP_CONNECTION_POOL_MAXTOTAL))) + .setPoolConcurrencyPolicy(PoolConcurrencyPolicy.STRICT) + .setConnPoolPolicy(PoolReusePolicy.FIFO) + .build(); builder.setConnectionManager(connectionPool); log.debug("Initalize http-client pool with, maxTotal: {} maxPerRoute: {}", connectionPool.getMaxTotal(), connectionPool.getDefaultMaxPerRoute()); @@ -476,25 +480,25 @@ public class HttpClientFactory implements IHttpClientFactory { } else { log.debug("Building http-client without Connection-Pool ... "); - final BasicHttpClientConnectionManager basicPool = new BasicHttpClientConnectionManager( - getDefaultRegistry(sslConnectionFactory)); - - basicPool.setSocketConfig(SocketConfig.custom() - .setSoTimeout( - Integer.parseInt( - basicConfig.getBasicConfiguration( - PROP_CONFIG_CLIENT_HTTP_CONNECTION_TIMEOUT_SOCKET, - DEFAULT_CONFIG_CLIENT_HTTP_CONNECTION_TIMEOUT_SOCKET)), TimeUnit.SECONDS) - .build()); - basicPool.setConnectionConfig(ConnectionConfig.custom() - .setConnectTimeout( - Long.parseLong(basicConfig.getBasicConfiguration( - PROP_CONFIG_CLIENT_HTTP_CONNECTION_TIMEOUT_CONNECTION, - DEFAULT_CONFIG_CLIENT_HTTP_CONNECTION_TIMEOUT_CONNECTION)), TimeUnit.SECONDS) - .build()); - - + BasicHttpClientConnectionManager basicPool = BasicHttpClientConnectionManager + .create(getDefaultRegistry(sslConnectionFactory)); + basicPool.setSocketConfig( + SocketConfig.custom() + .setSoTimeout( + Integer.parseInt( + basicConfig.getBasicConfiguration( + PROP_CONFIG_CLIENT_HTTP_CONNECTION_TIMEOUT_SOCKET, + DEFAULT_CONFIG_CLIENT_HTTP_CONNECTION_TIMEOUT_SOCKET)), TimeUnit.SECONDS) + .build()); + basicPool.setConnectionConfig( + ConnectionConfig.custom() + .setConnectTimeout( + Long.parseLong(basicConfig.getBasicConfiguration( + PROP_CONFIG_CLIENT_HTTP_CONNECTION_TIMEOUT_CONNECTION, + DEFAULT_CONFIG_CLIENT_HTTP_CONNECTION_TIMEOUT_CONNECTION)), TimeUnit.SECONDS) + .build()); + builder.setConnectionManager(basicPool); return basicPool; @@ -502,6 +506,7 @@ public class HttpClientFactory implements IHttpClientFactory { } + private RequestConfig buildDefaultRequestConfig(HttpClientConfiguration config) { final RequestConfig requestConfig = RequestConfig.custom() @@ -541,11 +546,12 @@ public class HttpClientFactory implements IHttpClientFactory { } - private static Registry<ConnectionSocketFactory> getDefaultRegistry( - final LayeredConnectionSocketFactory sslConnectionFactory) { - final RegistryBuilder<ConnectionSocketFactory> builder = - RegistryBuilder.<ConnectionSocketFactory>create() - .register("http", PlainConnectionSocketFactory.getSocketFactory()); + private static Registry<TlsSocketStrategy> getDefaultRegistry( + final DefaultClientTlsStrategy sslConnectionFactory) { + + final RegistryBuilder<TlsSocketStrategy> builder = + RegistryBuilder.<TlsSocketStrategy>create() + .register("http", DefaultClientTlsStrategy.createDefault()); if (sslConnectionFactory != null) { log.trace("Inject own SSLSocketFactory into pooled connection"); @@ -553,7 +559,7 @@ public class HttpClientFactory implements IHttpClientFactory { } else { log.trace("Inject default SSLSocketFactory into pooled connection"); - builder.register("https", SSLConnectionSocketFactory.getSocketFactory()); + builder.register("https", DefaultClientTlsStrategy.createDefault()); } @@ -47,9 +47,9 @@ <io.grpc-core.version>1.53.0</io.grpc-core.version> <!-- Other third-party libs --> - <spring-boot-starter-web.version>3.1.10</spring-boot-starter-web.version> - <org.springframework.version>6.0.18</org.springframework.version> - <org.apache.tomcat.embed.version>10.1.20</org.apache.tomcat.embed.version> + <spring-boot-starter-web.version>3.3.4</spring-boot-starter-web.version> + <org.springframework.version>6.1.14</org.springframework.version> + <org.apache.tomcat.embed.version>10.1.31</org.apache.tomcat.embed.version> <org.opensaml.version>5.0.0</org.opensaml.version> <org.apache.santuario.xmlsec.version>3.0.4</org.apache.santuario.xmlsec.version> <org.cryptacular.version>1.2.6</org.cryptacular.version> @@ -57,51 +57,54 @@ <!-- currently, SSL Client authentication with re-recognition doesn't work with bctls-jdk18o > 1.71.1 --> <org.bouncycastle.bctls-jdk18on.version>1.71.1</org.bouncycastle.bctls-jdk18on.version> - <org.slf4j.version>2.0.12</org.slf4j.version> - <log4j.version>2.23.1</log4j.version> - <ch.qos.logback.version>1.4.14</ch.qos.logback.version> + <org.slf4j.version>2.0.16</org.slf4j.version> + <log4j.version>2.24.1</log4j.version> + <ch.qos.logback.version>1.5.11</ch.qos.logback.version> + <logback.access.common.version>2.0.3</logback.access.common.version> + <logback-access-tomcat.version>2.0.4</logback-access-tomcat.version> <org.owasp.encoder.version>1.2.3</org.owasp.encoder.version> - <org.apache.commons-lang3.version>3.14.0</org.apache.commons-lang3.version> - <org.apache.commons-text.version>1.11.0</org.apache.commons-text.version> + <org.apache.commons-lang3.version>3.17.0</org.apache.commons-lang3.version> + <org.apache.commons-text.version>1.12.0</org.apache.commons-text.version> <org.apache.commons-collections4>4.4</org.apache.commons-collections4> - <commons-io.version>2.16.0</commons-io.version> - <commons-codec.version>1.16.1</commons-codec.version> + <commons-io.version>2.17.0</commons-io.version> + <commons-codec.version>1.17.1</commons-codec.version> <commons-fileupload2.version>2.0.0-M1</commons-fileupload2.version> <jakarta.servlet-api>6.0.0</jakarta.servlet-api> <jakarta.annotation-api.version>2.1.1</jakarta.annotation-api.version> - <joda-time.version>2.12.7</joda-time.version> + <joda-time.version>2.13.0</joda-time.version> <org.apache.velocity.version>2.3</org.apache.velocity.version> - <com.google.guava.version>33.1.0-jre</com.google.guava.version> + <com.google.guava.version>33.3.1-jre</com.google.guava.version> <org.bitbucket.b_c.jose4j.version>0.9.6</org.bitbucket.b_c.jose4j.version> <jsr305.version>3.0.2</jsr305.version> - <httpclient.version>5.2.3</httpclient.version> + <httpcore5.version>5.3.1</httpcore5.version> + <httpclient.version>5.4</httpclient.version> <com.fasterxml.jackson.core.version>2.17.0</com.fasterxml.jackson.core.version> <com.fasterxml.jackson.databind.version>2.17.0</com.fasterxml.jackson.databind.version> - <gson.version>2.10.1</gson.version> + <gson.version>2.11.0</gson.version> <jaxen.jaxen.version>2.0.0</jaxen.jaxen.version> <xerces.version>2.12.2</xerces.version> <xalan.version>2.7.1</xalan.version> - <woodstox-core.version>6.6.2</woodstox-core.version> + <woodstox-core.version>6.7.0</woodstox-core.version> <snakeyaml.version>2.2</snakeyaml.version> <!-- jUnit testing --> - <surefire.version>3.1.2</surefire.version> - <junit-jupiter-api.version>5.10.0</junit-jupiter-api.version> - <mockito-junit-jupiter.version>5.5.0</mockito-junit-jupiter.version> - <com.squareup.okhttp3.version>4.11.0</com.squareup.okhttp3.version> - <com.squareup.okio.version>3.5.0</com.squareup.okio.version> + <surefire.version>3.5.1</surefire.version> + <junit-jupiter-api.version>5.11.3</junit-jupiter-api.version> + <mockito-junit-jupiter.version>5.14.2</mockito-junit-jupiter.version> + <com.squareup.okhttp3.version>4.12.0</com.squareup.okhttp3.version> + <com.squareup.okio.version>3.9.1</com.squareup.okio.version> <org.powermock.version>2.0.9</org.powermock.version> <!-- Code helper plug-ins --> - <org.projectlombok.lombok.version>1.18.28</org.projectlombok.lombok.version> + <org.projectlombok.lombok.version>1.18.34</org.projectlombok.lombok.version> <!-- Code quality checks --> <jacoco-maven-plugin.version>0.8.10</jacoco-maven-plugin.version> @@ -544,11 +547,16 @@ <artifactId>log4j-to-slf4j</artifactId> <version>${log4j.version}</version> </dependency> - <dependency> - <groupId>ch.qos.logback</groupId> - <artifactId>logback-access</artifactId> - <version>${ch.qos.logback.version}</version> + <dependency> + <groupId>ch.qos.logback.access</groupId> + <artifactId>common</artifactId> + <version>${logback.access.common.version}</version> </dependency> + <dependency> + <groupId>ch.qos.logback.access</groupId> + <artifactId>logback-access-tomcat</artifactId> + <version>${logback-access-tomcat.version}</version> + </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> @@ -650,10 +658,25 @@ </dependency> <dependency> + <groupId>org.apache.httpcomponents.core5</groupId> + <artifactId>httpcore5</artifactId> + <version>${httpcore5.version}</version> + </dependency> + <dependency> + <groupId>org.apache.httpcomponents.core5</groupId> + <artifactId>httpcore5-h2</artifactId> + <version>${httpcore5.version}</version> + </dependency> + <dependency> <groupId>org.apache.httpcomponents.client5</groupId> <artifactId>httpclient5</artifactId> <version>${httpclient.version}</version> </dependency> + <dependency> + <groupId>org.apache.httpcomponents.client5</groupId> + <artifactId>httpclient5-cache</artifactId> + <version>${httpclient.version}</version> + </dependency> <dependency> <groupId>org.owasp.encoder</groupId> |