summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--eaaf-springboot-utils/pom.xml8
-rw-r--r--eaaf_core_utils/src/main/java/at/gv/egiz/eaaf/core/impl/http/HttpClientFactory.java132
-rw-r--r--pom.xml73
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());
}
diff --git a/pom.xml b/pom.xml
index 1a8d39d4..d69b1634 100644
--- a/pom.xml
+++ b/pom.xml
@@ -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>