From 2224f7d90220e09bc8281e2a648591309ea7ce93 Mon Sep 17 00:00:00 2001
From: hsiegeln <37154749+hsiegeln@users.noreply.github.com>
Date: Sun, 19 Apr 2026 15:39:57 +0200
Subject: [PATCH] feat(http): core outbound HTTP interfaces and property
records
---
cameleer-server-core/pom.xml | 4 ++++
.../core/http/OutboundHttpClientFactory.java | 8 ++++++++
.../core/http/OutboundHttpProperties.java | 20 +++++++++++++++++++
.../core/http/OutboundHttpRequestContext.java | 20 +++++++++++++++++++
.../cameleer/server/core/http/TrustMode.java | 7 +++++++
5 files changed, 59 insertions(+)
create mode 100644 cameleer-server-core/src/main/java/com/cameleer/server/core/http/OutboundHttpClientFactory.java
create mode 100644 cameleer-server-core/src/main/java/com/cameleer/server/core/http/OutboundHttpProperties.java
create mode 100644 cameleer-server-core/src/main/java/com/cameleer/server/core/http/OutboundHttpRequestContext.java
create mode 100644 cameleer-server-core/src/main/java/com/cameleer/server/core/http/TrustMode.java
diff --git a/cameleer-server-core/pom.xml b/cameleer-server-core/pom.xml
index 9c959ab3..b93977fd 100644
--- a/cameleer-server-core/pom.xml
+++ b/cameleer-server-core/pom.xml
@@ -37,6 +37,10 @@
spring-security-core
provided
+
+ org.apache.httpcomponents.client5
+ httpclient5
+
com.fasterxml.jackson.datatype
jackson-datatype-jsr310
diff --git a/cameleer-server-core/src/main/java/com/cameleer/server/core/http/OutboundHttpClientFactory.java b/cameleer-server-core/src/main/java/com/cameleer/server/core/http/OutboundHttpClientFactory.java
new file mode 100644
index 00000000..64bf0f35
--- /dev/null
+++ b/cameleer-server-core/src/main/java/com/cameleer/server/core/http/OutboundHttpClientFactory.java
@@ -0,0 +1,8 @@
+package com.cameleer.server.core.http;
+
+import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
+
+public interface OutboundHttpClientFactory {
+ /** Returns a memoized client configured for the given TLS/timeout context. */
+ CloseableHttpClient clientFor(OutboundHttpRequestContext context);
+}
diff --git a/cameleer-server-core/src/main/java/com/cameleer/server/core/http/OutboundHttpProperties.java b/cameleer-server-core/src/main/java/com/cameleer/server/core/http/OutboundHttpProperties.java
new file mode 100644
index 00000000..cb586ef9
--- /dev/null
+++ b/cameleer-server-core/src/main/java/com/cameleer/server/core/http/OutboundHttpProperties.java
@@ -0,0 +1,20 @@
+package com.cameleer.server.core.http;
+
+import java.time.Duration;
+import java.util.List;
+
+public record OutboundHttpProperties(
+ boolean trustAll,
+ List trustedCaPemPaths,
+ Duration defaultConnectTimeout,
+ Duration defaultReadTimeout,
+ String proxyUrl,
+ String proxyUsername,
+ String proxyPassword
+) {
+ public OutboundHttpProperties {
+ trustedCaPemPaths = trustedCaPemPaths == null ? List.of() : List.copyOf(trustedCaPemPaths);
+ if (defaultConnectTimeout == null) defaultConnectTimeout = Duration.ofMillis(2000);
+ if (defaultReadTimeout == null) defaultReadTimeout = Duration.ofMillis(5000);
+ }
+}
diff --git a/cameleer-server-core/src/main/java/com/cameleer/server/core/http/OutboundHttpRequestContext.java b/cameleer-server-core/src/main/java/com/cameleer/server/core/http/OutboundHttpRequestContext.java
new file mode 100644
index 00000000..a09ef217
--- /dev/null
+++ b/cameleer-server-core/src/main/java/com/cameleer/server/core/http/OutboundHttpRequestContext.java
@@ -0,0 +1,20 @@
+package com.cameleer.server.core.http;
+
+import java.time.Duration;
+import java.util.List;
+
+public record OutboundHttpRequestContext(
+ TrustMode trustMode,
+ List trustedCaPemPaths,
+ Duration connectTimeout,
+ Duration readTimeout
+) {
+ public OutboundHttpRequestContext {
+ if (trustMode == null) trustMode = TrustMode.SYSTEM_DEFAULT;
+ trustedCaPemPaths = trustedCaPemPaths == null ? List.of() : List.copyOf(trustedCaPemPaths);
+ }
+
+ public static OutboundHttpRequestContext systemDefault() {
+ return new OutboundHttpRequestContext(TrustMode.SYSTEM_DEFAULT, List.of(), null, null);
+ }
+}
diff --git a/cameleer-server-core/src/main/java/com/cameleer/server/core/http/TrustMode.java b/cameleer-server-core/src/main/java/com/cameleer/server/core/http/TrustMode.java
new file mode 100644
index 00000000..a1db2e8c
--- /dev/null
+++ b/cameleer-server-core/src/main/java/com/cameleer/server/core/http/TrustMode.java
@@ -0,0 +1,7 @@
+package com.cameleer.server.core.http;
+
+public enum TrustMode {
+ SYSTEM_DEFAULT,
+ TRUST_ALL,
+ TRUST_PATHS
+}