This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch backport/26167-to-camel-4.18.x in repository https://gitbox.apache.org/repos/asf/camel.git
commit 88bf93993adfa0ac4ebff210949ab036c7ec32d3 Author: Claus Ibsen <[email protected]> AuthorDate: Mon Sep 7 16:51:58 2026 +0200 CAMEL-24632: camel-http - fix proxy scheme defaulting to https for https targets HttpComponent.configureHttpProxy() was deriving the proxy connection scheme from the target endpoint scheme (secure ? "https" : "http"), which is wrong. The proxy connection scheme is independent of the target: connecting to an HTTPS target through an HTTP proxy uses a plain HTTP CONNECT tunnel, with TLS established end-to-end inside that tunnel. Fix defaults proxyAuthScheme to "http" unconditionally in HttpComponent, HttpEndpoint (deprecated global-options path), and updates the defaultValue metadata in HttpCommonEndpoint and HttpConfiguration. The unused boolean secure parameter is also removed from configureHttpProxy(). Catalog and DSL regenerated. Closes #26167 Co-Authored-By: Claude Sonnet 4.6 <[email protected]> --- .../org/apache/camel/catalog/components/http.json | 10 ++++---- .../org/apache/camel/catalog/components/https.json | 10 ++++---- .../camel/http/common/HttpCommonEndpoint.java | 5 ++-- .../camel/http/common/HttpConfiguration.java | 4 +++- .../org/apache/camel/component/http/http.json | 10 ++++---- .../org/apache/camel/component/http/https.json | 10 ++++---- .../apache/camel/component/http/HttpComponent.java | 13 +++++----- .../apache/camel/component/http/HttpEndpoint.java | 5 ++-- .../camel/component/http/HttpProxyServerTest.java | 28 ++++++++++++++++++++++ .../component/dsl/HttpComponentBuilderFactory.java | 6 ++++- .../dsl/HttpsComponentBuilderFactory.java | 6 ++++- .../endpoint/dsl/HttpEndpointBuilderFactory.java | 5 +++- 12 files changed, 73 insertions(+), 39 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/http.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/http.json index 2996cd89cec1..663c7e985746 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/http.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/http.json @@ -65,9 +65,8 @@ "proxyAuthNtHost": { "index": 35, "kind": "property", "displayName": "Proxy Auth Nt Host", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Proxy authentication domain (workstation name) to use with NTLM (NTLM is deprecated)" }, "proxyAuthPassword": { "index": 36, "kind": "property", "displayName": "Proxy Auth Password", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "Proxy server password" }, "proxyAuthPort": { "index": 37, "kind": "property", "displayName": "Proxy Auth Port", "group": "proxy", "label": "producer,proxy", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": true, "autowired": false, "secret": false, "description": "Proxy server port" }, - "proxyAuthScheme": { "index": 38, "kind": "property", "displayName": "Proxy Auth Scheme", "group": "proxy", "label": "producer,proxy", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "http", "https" ], "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server authentication protocol scheme to use" }, - "proxyAuthUsername": { "index": 39, "kind": "property", "displayName": "Proxy Auth Username", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "Proxy server username" }, - "proxyHost": { "index": 40, "kind": "property", "displayName": "Proxy Host", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server host" }, + "proxyAuthScheme": { "index": 38, "kind": "property", "displayName": "Proxy Auth Scheme", "group": "proxy", "label": "producer,proxy", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "http", "https" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "http", "description": "Proxy server connection protocol scheme. Defaults to http regardless of the target endpoint scheme, because most corporate HTTP proxies expect a plain HTTP con [...] + "proxyAuthUsername": { "index": 39, "kind": "property", "displayName": "Proxy Auth Username", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "security": "secret", "description": "Proxy server username" }, "proxyHost": { "index": 40, "kind": "property", "displayName": "Proxy Host", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string [...] "proxyPort": { "index": 41, "kind": "property", "displayName": "Proxy Port", "group": "proxy", "label": "producer,proxy", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server port" }, "sslContextParameters": { "index": 42, "kind": "property", "displayName": "Ssl Context Parameters", "group": "security", "label": "security", "required": false, "type": "object", "javaType": "org.apache.camel.support.jsse.SSLContextParameters", "deprecated": false, "autowired": false, "secret": false, "description": "To configure security using SSLContextParameters. Important: Only one instance of org.apache.camel.support.jsse.SSLContextParameters is supported per HttpComponent. If y [...] "useGlobalSslContextParameters": { "index": 43, "kind": "property", "displayName": "Use Global Ssl Context Parameters", "group": "security", "label": "security", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Enable usage of global SSL context parameters." }, @@ -139,9 +138,8 @@ "proxyAuthNtHost": { "index": 42, "kind": "parameter", "displayName": "Proxy Auth Nt Host", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": true, "autowired": false, "secret": false, "description": "Proxy authentication domain (workstation name) to use with NTLM" }, "proxyAuthPassword": { "index": 43, "kind": "parameter", "displayName": "Proxy Auth Password", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "Proxy server password" }, "proxyAuthPort": { "index": 44, "kind": "parameter", "displayName": "Proxy Auth Port", "group": "proxy", "label": "producer,proxy", "required": false, "type": "integer", "javaType": "int", "deprecated": true, "autowired": false, "secret": false, "description": "Proxy server port" }, - "proxyAuthScheme": { "index": 45, "kind": "parameter", "displayName": "Proxy Auth Scheme", "group": "proxy", "label": "producer,proxy", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "http", "https" ], "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server authentication protocol scheme to use" }, - "proxyAuthUsername": { "index": 46, "kind": "parameter", "displayName": "Proxy Auth Username", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "Proxy server username" }, - "proxyHost": { "index": 47, "kind": "parameter", "displayName": "Proxy Host", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server host" }, + "proxyAuthScheme": { "index": 45, "kind": "parameter", "displayName": "Proxy Auth Scheme", "group": "proxy", "label": "producer,proxy", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "http", "https" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "http", "description": "Proxy server connection protocol scheme. Defaults to http regardless of the target endpoint scheme, because most corporate HTTP proxies expect a plain HTTP co [...] + "proxyAuthUsername": { "index": 46, "kind": "parameter", "displayName": "Proxy Auth Username", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "security": "secret", "description": "Proxy server username" }, "proxyHost": { "index": 47, "kind": "parameter", "displayName": "Proxy Host", "group": "proxy", "label": "producer,proxy", "required": false, "type": "stri [...] "proxyPort": { "index": 48, "kind": "parameter", "displayName": "Proxy Port", "group": "proxy", "label": "producer,proxy", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server port" }, "authBearerToken": { "index": 49, "kind": "parameter", "displayName": "Auth Bearer Token", "group": "security", "label": "producer,security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "Authentication bearer token" }, "authDomain": { "index": 50, "kind": "parameter", "displayName": "Auth Domain", "group": "security", "label": "producer,security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": true, "autowired": false, "secret": false, "description": "Authentication domain to use with NTLM" }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/https.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/https.json index fe41cde06977..c3ef1e65854d 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/https.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/https.json @@ -65,9 +65,8 @@ "proxyAuthNtHost": { "index": 35, "kind": "property", "displayName": "Proxy Auth Nt Host", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Proxy authentication domain (workstation name) to use with NTLM (NTLM is deprecated)" }, "proxyAuthPassword": { "index": 36, "kind": "property", "displayName": "Proxy Auth Password", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "Proxy server password" }, "proxyAuthPort": { "index": 37, "kind": "property", "displayName": "Proxy Auth Port", "group": "proxy", "label": "producer,proxy", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": true, "autowired": false, "secret": false, "description": "Proxy server port" }, - "proxyAuthScheme": { "index": 38, "kind": "property", "displayName": "Proxy Auth Scheme", "group": "proxy", "label": "producer,proxy", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "http", "https" ], "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server authentication protocol scheme to use" }, - "proxyAuthUsername": { "index": 39, "kind": "property", "displayName": "Proxy Auth Username", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "Proxy server username" }, - "proxyHost": { "index": 40, "kind": "property", "displayName": "Proxy Host", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server host" }, + "proxyAuthScheme": { "index": 38, "kind": "property", "displayName": "Proxy Auth Scheme", "group": "proxy", "label": "producer,proxy", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "http", "https" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "http", "description": "Proxy server connection protocol scheme. Defaults to http regardless of the target endpoint scheme, because most corporate HTTP proxies expect a plain HTTP con [...] + "proxyAuthUsername": { "index": 39, "kind": "property", "displayName": "Proxy Auth Username", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "security": "secret", "description": "Proxy server username" }, "proxyHost": { "index": 40, "kind": "property", "displayName": "Proxy Host", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string [...] "proxyPort": { "index": 41, "kind": "property", "displayName": "Proxy Port", "group": "proxy", "label": "producer,proxy", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server port" }, "sslContextParameters": { "index": 42, "kind": "property", "displayName": "Ssl Context Parameters", "group": "security", "label": "security", "required": false, "type": "object", "javaType": "org.apache.camel.support.jsse.SSLContextParameters", "deprecated": false, "autowired": false, "secret": false, "description": "To configure security using SSLContextParameters. Important: Only one instance of org.apache.camel.support.jsse.SSLContextParameters is supported per HttpComponent. If y [...] "useGlobalSslContextParameters": { "index": 43, "kind": "property", "displayName": "Use Global Ssl Context Parameters", "group": "security", "label": "security", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Enable usage of global SSL context parameters." }, @@ -139,9 +138,8 @@ "proxyAuthNtHost": { "index": 42, "kind": "parameter", "displayName": "Proxy Auth Nt Host", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": true, "autowired": false, "secret": false, "description": "Proxy authentication domain (workstation name) to use with NTLM" }, "proxyAuthPassword": { "index": 43, "kind": "parameter", "displayName": "Proxy Auth Password", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "Proxy server password" }, "proxyAuthPort": { "index": 44, "kind": "parameter", "displayName": "Proxy Auth Port", "group": "proxy", "label": "producer,proxy", "required": false, "type": "integer", "javaType": "int", "deprecated": true, "autowired": false, "secret": false, "description": "Proxy server port" }, - "proxyAuthScheme": { "index": 45, "kind": "parameter", "displayName": "Proxy Auth Scheme", "group": "proxy", "label": "producer,proxy", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "http", "https" ], "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server authentication protocol scheme to use" }, - "proxyAuthUsername": { "index": 46, "kind": "parameter", "displayName": "Proxy Auth Username", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "Proxy server username" }, - "proxyHost": { "index": 47, "kind": "parameter", "displayName": "Proxy Host", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server host" }, + "proxyAuthScheme": { "index": 45, "kind": "parameter", "displayName": "Proxy Auth Scheme", "group": "proxy", "label": "producer,proxy", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "http", "https" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "http", "description": "Proxy server connection protocol scheme. Defaults to http regardless of the target endpoint scheme, because most corporate HTTP proxies expect a plain HTTP co [...] + "proxyAuthUsername": { "index": 46, "kind": "parameter", "displayName": "Proxy Auth Username", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "security": "secret", "description": "Proxy server username" }, "proxyHost": { "index": 47, "kind": "parameter", "displayName": "Proxy Host", "group": "proxy", "label": "producer,proxy", "required": false, "type": "stri [...] "proxyPort": { "index": 48, "kind": "parameter", "displayName": "Proxy Port", "group": "proxy", "label": "producer,proxy", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server port" }, "authBearerToken": { "index": 49, "kind": "parameter", "displayName": "Auth Bearer Token", "group": "security", "label": "producer,security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "Authentication bearer token" }, "authDomain": { "index": 50, "kind": "parameter", "displayName": "Auth Domain", "group": "security", "label": "producer,security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": true, "autowired": false, "secret": false, "description": "Authentication domain to use with NTLM" }, diff --git a/components/camel-http-common/src/main/java/org/apache/camel/http/common/HttpCommonEndpoint.java b/components/camel-http-common/src/main/java/org/apache/camel/http/common/HttpCommonEndpoint.java index d40daa207ba8..77dec461d9db 100644 --- a/components/camel-http-common/src/main/java/org/apache/camel/http/common/HttpCommonEndpoint.java +++ b/components/camel-http-common/src/main/java/org/apache/camel/http/common/HttpCommonEndpoint.java @@ -186,8 +186,9 @@ public abstract class HttpCommonEndpoint extends DefaultEndpoint private String proxyHost; @UriParam(label = "producer,proxy", description = "Proxy server port") private int proxyPort; - @UriParam(label = "producer,proxy", enums = "http,https", - description = "Proxy server authentication protocol scheme to use") + @UriParam(label = "producer,proxy", enums = "http,https", defaultValue = "http", + description = "Proxy server connection protocol scheme. Defaults to http regardless of the target endpoint scheme," + + " because most corporate HTTP proxies expect a plain HTTP connection on their listener port.") private String proxyAuthScheme; @UriParam(label = "producer,proxy", enums = "Basic,Bearer,NTLM", description = "Proxy authentication method to use (NTLM is deprecated)") diff --git a/components/camel-http-common/src/main/java/org/apache/camel/http/common/HttpConfiguration.java b/components/camel-http-common/src/main/java/org/apache/camel/http/common/HttpConfiguration.java index 85325a126567..69b9cb3416d7 100644 --- a/components/camel-http-common/src/main/java/org/apache/camel/http/common/HttpConfiguration.java +++ b/components/camel-http-common/src/main/java/org/apache/camel/http/common/HttpConfiguration.java @@ -68,7 +68,9 @@ public class HttpConfiguration implements Serializable { private String proxyHost; @Metadata(label = "producer,proxy", description = "Proxy port to use") private int proxyPort; - @Metadata(label = "producer,proxy", enums = "http,https", description = "Authentication scheme to use") + @Metadata(label = "producer,proxy", enums = "http,https", defaultValue = "http", + description = "Proxy server connection protocol scheme. Defaults to http regardless of the target endpoint scheme," + + " because most corporate HTTP proxies expect a plain HTTP connection on their listener port.") private String proxyAuthScheme; @Metadata(label = "producer,proxy", enums = "Basic,Bearer,NTLM", description = "Proxy authentication method to use") private String proxyAuthMethod; diff --git a/components/camel-http/src/generated/resources/META-INF/org/apache/camel/component/http/http.json b/components/camel-http/src/generated/resources/META-INF/org/apache/camel/component/http/http.json index 2996cd89cec1..663c7e985746 100644 --- a/components/camel-http/src/generated/resources/META-INF/org/apache/camel/component/http/http.json +++ b/components/camel-http/src/generated/resources/META-INF/org/apache/camel/component/http/http.json @@ -65,9 +65,8 @@ "proxyAuthNtHost": { "index": 35, "kind": "property", "displayName": "Proxy Auth Nt Host", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Proxy authentication domain (workstation name) to use with NTLM (NTLM is deprecated)" }, "proxyAuthPassword": { "index": 36, "kind": "property", "displayName": "Proxy Auth Password", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "Proxy server password" }, "proxyAuthPort": { "index": 37, "kind": "property", "displayName": "Proxy Auth Port", "group": "proxy", "label": "producer,proxy", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": true, "autowired": false, "secret": false, "description": "Proxy server port" }, - "proxyAuthScheme": { "index": 38, "kind": "property", "displayName": "Proxy Auth Scheme", "group": "proxy", "label": "producer,proxy", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "http", "https" ], "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server authentication protocol scheme to use" }, - "proxyAuthUsername": { "index": 39, "kind": "property", "displayName": "Proxy Auth Username", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "Proxy server username" }, - "proxyHost": { "index": 40, "kind": "property", "displayName": "Proxy Host", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server host" }, + "proxyAuthScheme": { "index": 38, "kind": "property", "displayName": "Proxy Auth Scheme", "group": "proxy", "label": "producer,proxy", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "http", "https" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "http", "description": "Proxy server connection protocol scheme. Defaults to http regardless of the target endpoint scheme, because most corporate HTTP proxies expect a plain HTTP con [...] + "proxyAuthUsername": { "index": 39, "kind": "property", "displayName": "Proxy Auth Username", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "security": "secret", "description": "Proxy server username" }, "proxyHost": { "index": 40, "kind": "property", "displayName": "Proxy Host", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string [...] "proxyPort": { "index": 41, "kind": "property", "displayName": "Proxy Port", "group": "proxy", "label": "producer,proxy", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server port" }, "sslContextParameters": { "index": 42, "kind": "property", "displayName": "Ssl Context Parameters", "group": "security", "label": "security", "required": false, "type": "object", "javaType": "org.apache.camel.support.jsse.SSLContextParameters", "deprecated": false, "autowired": false, "secret": false, "description": "To configure security using SSLContextParameters. Important: Only one instance of org.apache.camel.support.jsse.SSLContextParameters is supported per HttpComponent. If y [...] "useGlobalSslContextParameters": { "index": 43, "kind": "property", "displayName": "Use Global Ssl Context Parameters", "group": "security", "label": "security", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Enable usage of global SSL context parameters." }, @@ -139,9 +138,8 @@ "proxyAuthNtHost": { "index": 42, "kind": "parameter", "displayName": "Proxy Auth Nt Host", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": true, "autowired": false, "secret": false, "description": "Proxy authentication domain (workstation name) to use with NTLM" }, "proxyAuthPassword": { "index": 43, "kind": "parameter", "displayName": "Proxy Auth Password", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "Proxy server password" }, "proxyAuthPort": { "index": 44, "kind": "parameter", "displayName": "Proxy Auth Port", "group": "proxy", "label": "producer,proxy", "required": false, "type": "integer", "javaType": "int", "deprecated": true, "autowired": false, "secret": false, "description": "Proxy server port" }, - "proxyAuthScheme": { "index": 45, "kind": "parameter", "displayName": "Proxy Auth Scheme", "group": "proxy", "label": "producer,proxy", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "http", "https" ], "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server authentication protocol scheme to use" }, - "proxyAuthUsername": { "index": 46, "kind": "parameter", "displayName": "Proxy Auth Username", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "Proxy server username" }, - "proxyHost": { "index": 47, "kind": "parameter", "displayName": "Proxy Host", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server host" }, + "proxyAuthScheme": { "index": 45, "kind": "parameter", "displayName": "Proxy Auth Scheme", "group": "proxy", "label": "producer,proxy", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "http", "https" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "http", "description": "Proxy server connection protocol scheme. Defaults to http regardless of the target endpoint scheme, because most corporate HTTP proxies expect a plain HTTP co [...] + "proxyAuthUsername": { "index": 46, "kind": "parameter", "displayName": "Proxy Auth Username", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "security": "secret", "description": "Proxy server username" }, "proxyHost": { "index": 47, "kind": "parameter", "displayName": "Proxy Host", "group": "proxy", "label": "producer,proxy", "required": false, "type": "stri [...] "proxyPort": { "index": 48, "kind": "parameter", "displayName": "Proxy Port", "group": "proxy", "label": "producer,proxy", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server port" }, "authBearerToken": { "index": 49, "kind": "parameter", "displayName": "Auth Bearer Token", "group": "security", "label": "producer,security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "Authentication bearer token" }, "authDomain": { "index": 50, "kind": "parameter", "displayName": "Auth Domain", "group": "security", "label": "producer,security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": true, "autowired": false, "secret": false, "description": "Authentication domain to use with NTLM" }, diff --git a/components/camel-http/src/generated/resources/META-INF/org/apache/camel/component/http/https.json b/components/camel-http/src/generated/resources/META-INF/org/apache/camel/component/http/https.json index fe41cde06977..c3ef1e65854d 100644 --- a/components/camel-http/src/generated/resources/META-INF/org/apache/camel/component/http/https.json +++ b/components/camel-http/src/generated/resources/META-INF/org/apache/camel/component/http/https.json @@ -65,9 +65,8 @@ "proxyAuthNtHost": { "index": 35, "kind": "property", "displayName": "Proxy Auth Nt Host", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Proxy authentication domain (workstation name) to use with NTLM (NTLM is deprecated)" }, "proxyAuthPassword": { "index": 36, "kind": "property", "displayName": "Proxy Auth Password", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "Proxy server password" }, "proxyAuthPort": { "index": 37, "kind": "property", "displayName": "Proxy Auth Port", "group": "proxy", "label": "producer,proxy", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": true, "autowired": false, "secret": false, "description": "Proxy server port" }, - "proxyAuthScheme": { "index": 38, "kind": "property", "displayName": "Proxy Auth Scheme", "group": "proxy", "label": "producer,proxy", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "http", "https" ], "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server authentication protocol scheme to use" }, - "proxyAuthUsername": { "index": 39, "kind": "property", "displayName": "Proxy Auth Username", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "Proxy server username" }, - "proxyHost": { "index": 40, "kind": "property", "displayName": "Proxy Host", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server host" }, + "proxyAuthScheme": { "index": 38, "kind": "property", "displayName": "Proxy Auth Scheme", "group": "proxy", "label": "producer,proxy", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "http", "https" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "http", "description": "Proxy server connection protocol scheme. Defaults to http regardless of the target endpoint scheme, because most corporate HTTP proxies expect a plain HTTP con [...] + "proxyAuthUsername": { "index": 39, "kind": "property", "displayName": "Proxy Auth Username", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "security": "secret", "description": "Proxy server username" }, "proxyHost": { "index": 40, "kind": "property", "displayName": "Proxy Host", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string [...] "proxyPort": { "index": 41, "kind": "property", "displayName": "Proxy Port", "group": "proxy", "label": "producer,proxy", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server port" }, "sslContextParameters": { "index": 42, "kind": "property", "displayName": "Ssl Context Parameters", "group": "security", "label": "security", "required": false, "type": "object", "javaType": "org.apache.camel.support.jsse.SSLContextParameters", "deprecated": false, "autowired": false, "secret": false, "description": "To configure security using SSLContextParameters. Important: Only one instance of org.apache.camel.support.jsse.SSLContextParameters is supported per HttpComponent. If y [...] "useGlobalSslContextParameters": { "index": 43, "kind": "property", "displayName": "Use Global Ssl Context Parameters", "group": "security", "label": "security", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Enable usage of global SSL context parameters." }, @@ -139,9 +138,8 @@ "proxyAuthNtHost": { "index": 42, "kind": "parameter", "displayName": "Proxy Auth Nt Host", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": true, "autowired": false, "secret": false, "description": "Proxy authentication domain (workstation name) to use with NTLM" }, "proxyAuthPassword": { "index": 43, "kind": "parameter", "displayName": "Proxy Auth Password", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "Proxy server password" }, "proxyAuthPort": { "index": 44, "kind": "parameter", "displayName": "Proxy Auth Port", "group": "proxy", "label": "producer,proxy", "required": false, "type": "integer", "javaType": "int", "deprecated": true, "autowired": false, "secret": false, "description": "Proxy server port" }, - "proxyAuthScheme": { "index": 45, "kind": "parameter", "displayName": "Proxy Auth Scheme", "group": "proxy", "label": "producer,proxy", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "http", "https" ], "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server authentication protocol scheme to use" }, - "proxyAuthUsername": { "index": 46, "kind": "parameter", "displayName": "Proxy Auth Username", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "Proxy server username" }, - "proxyHost": { "index": 47, "kind": "parameter", "displayName": "Proxy Host", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server host" }, + "proxyAuthScheme": { "index": 45, "kind": "parameter", "displayName": "Proxy Auth Scheme", "group": "proxy", "label": "producer,proxy", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "http", "https" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "http", "description": "Proxy server connection protocol scheme. Defaults to http regardless of the target endpoint scheme, because most corporate HTTP proxies expect a plain HTTP co [...] + "proxyAuthUsername": { "index": 46, "kind": "parameter", "displayName": "Proxy Auth Username", "group": "proxy", "label": "producer,proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "security": "secret", "description": "Proxy server username" }, "proxyHost": { "index": 47, "kind": "parameter", "displayName": "Proxy Host", "group": "proxy", "label": "producer,proxy", "required": false, "type": "stri [...] "proxyPort": { "index": 48, "kind": "parameter", "displayName": "Proxy Port", "group": "proxy", "label": "producer,proxy", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server port" }, "authBearerToken": { "index": 49, "kind": "parameter", "displayName": "Auth Bearer Token", "group": "security", "label": "producer,security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "Authentication bearer token" }, "authDomain": { "index": 50, "kind": "parameter", "displayName": "Auth Domain", "group": "security", "label": "producer,security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": true, "autowired": false, "secret": false, "description": "Authentication domain to use with NTLM" }, diff --git a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpComponent.java b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpComponent.java index 1ea32a4d868b..06bcf41b22cf 100644 --- a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpComponent.java +++ b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpComponent.java @@ -138,8 +138,9 @@ public class HttpComponent extends HttpCommonComponent implements RestProducerFa @Metadata(label = "producer,proxy", description = "Comma-separated list of hosts that should bypass the proxy. " + "Supports wildcards, e.g., localhost,*.example.com,192.168.*.") protected String nonProxyHosts; - @Metadata(label = "producer,proxy", enums = "http,https", - description = "Proxy server authentication protocol scheme to use") + @Metadata(label = "producer,proxy", enums = "http,https", defaultValue = "http", + description = "Proxy server connection protocol scheme. Defaults to http regardless of the target endpoint scheme," + + " because most corporate HTTP proxies expect a plain HTTP connection on their listener port.") protected String proxyAuthScheme; @Metadata(label = "producer,proxy", enums = "Basic,Digest,NTLM", description = "Proxy authentication method to use (NTLM is deprecated)") @@ -250,7 +251,7 @@ public class HttpComponent extends HttpCommonComponent implements RestProducerFa } HttpCredentialsHelper credentialsProvider = new HttpCredentialsHelper(); configurer = configureBasicAuthentication(parameters, configurer, credentialsProvider, targetUri); - configurer = configureHttpProxy(parameters, configurer, secure, credentialsProvider); + configurer = configureHttpProxy(parameters, configurer, credentialsProvider); configurer = configureOAuth2Authentication(parameters, configurer, targetUri); return configurer; @@ -365,14 +366,14 @@ public class HttpComponent extends HttpCommonComponent implements RestProducerFa } private HttpClientConfigurer configureHttpProxy( - Map<String, Object> parameters, HttpClientConfigurer configurer, boolean secure, + Map<String, Object> parameters, HttpClientConfigurer configurer, HttpCredentialsHelper credentialsProvider) { String nonProxyhosts = getParameter(parameters, "nonProxyHosts", String.class, getNonProxyHosts()); String proxyAuthScheme = getParameter(parameters, "proxyAuthScheme", String.class, getProxyAuthScheme()); if (proxyAuthScheme == null) { - // fallback and use either http or https depending on secure - proxyAuthScheme = secure ? "https" : "http"; + // proxy connection itself uses http by default regardless of the target endpoint scheme + proxyAuthScheme = "http"; } // these are old names and are deprecated String proxyAuthHost = getParameter(parameters, "proxyAuthHost", String.class, getProxyAuthHost()); diff --git a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpEndpoint.java b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpEndpoint.java index 2dfe94efe325..180446c2673f 100644 --- a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpEndpoint.java +++ b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpEndpoint.java @@ -33,7 +33,6 @@ import org.apache.camel.Processor; import org.apache.camel.Producer; import org.apache.camel.api.management.ManagedAttribute; import org.apache.camel.api.management.ManagedResource; -import org.apache.camel.http.base.HttpHelper; import org.apache.camel.http.base.cookie.CookieHandler; import org.apache.camel.http.common.HttpCommonEndpoint; import org.apache.camel.spi.Metadata; @@ -281,9 +280,9 @@ public class HttpEndpoint extends HttpCommonEndpoint implements LineNumberAware String host = getCamelContext().getGlobalOption("http.proxyHost"); int port = Integer.parseInt(getCamelContext().getGlobalOption("http.proxyPort")); String scheme = getCamelContext().getGlobalOption("http.proxyScheme"); - // fallback and use either http or https depending on secure + // proxy connection uses http by default regardless of the target endpoint scheme if (scheme == null) { - scheme = HttpHelper.isSecureConnection(getEndpointUri()) ? "https" : "http"; + scheme = "http"; } LOG.warn( "CamelContext global options [http.proxyHost,http.proxyPort,http.proxyScheme] detected." diff --git a/components/camel-http/src/test/java/org/apache/camel/component/http/HttpProxyServerTest.java b/components/camel-http/src/test/java/org/apache/camel/component/http/HttpProxyServerTest.java index 66fc164d9bb3..a34122f39ffb 100644 --- a/components/camel-http/src/test/java/org/apache/camel/component/http/HttpProxyServerTest.java +++ b/components/camel-http/src/test/java/org/apache/camel/component/http/HttpProxyServerTest.java @@ -16,6 +16,7 @@ */ package org.apache.camel.component.http; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -26,6 +27,8 @@ import org.apache.camel.component.http.handler.HeaderValidationHandler; import org.apache.camel.component.http.interceptor.RequestProxyBasicAuth; import org.apache.camel.component.http.interceptor.ResponseProxyBasicUnauthorized; import org.apache.camel.util.URISupport; +import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; +import org.apache.hc.core5.http.HttpHost; import org.apache.hc.core5.http.HttpRequestInterceptor; import org.apache.hc.core5.http.HttpResponseInterceptor; import org.apache.hc.core5.http.impl.bootstrap.HttpServer; @@ -37,6 +40,7 @@ import org.apache.hc.core5.http.protocol.ResponseContent; import org.junit.jupiter.api.Test; import static org.apache.camel.component.http.HttpMethods.GET; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; public class HttpProxyServerTest extends BaseHttpTest { @@ -143,6 +147,30 @@ public class HttpProxyServerTest extends BaseHttpTest { assertExchange(exchange); } + @Test + public void httpsTargetWithProxyDefaultsToHttpProxyScheme() throws Exception { + // CAMEL-24632: proxy scheme must default to "http" regardless of the target endpoint scheme + HttpEndpoint endpoint = context.getEndpoint( + "https://www.example.com?proxyHost=myproxy&proxyPort=8080", HttpEndpoint.class); + + HttpClientConfigurer configurer = endpoint.getHttpClientConfigurer(); + assertThat(configurer).isNotNull(); + + HttpClientBuilder builder = HttpClientBuilder.create(); + configurer.configureHttpClient(builder); + + Field proxyField = HttpClientBuilder.class.getDeclaredField("proxy"); + proxyField.setAccessible(true); + HttpHost proxy = (HttpHost) proxyField.get(builder); + + assertThat(proxy).isNotNull(); + assertThat(proxy.getHostName()).isEqualTo("myproxy"); + assertThat(proxy.getPort()).isEqualTo(8080); + assertThat(proxy.getSchemeName()) + .as("Proxy scheme must be http even when the target endpoint is https") + .isEqualTo("http"); + } + private String getHost() { return "127.0.0.1"; } diff --git a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/HttpComponentBuilderFactory.java b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/HttpComponentBuilderFactory.java index 9b3f2a288b52..007f100059c3 100644 --- a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/HttpComponentBuilderFactory.java +++ b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/HttpComponentBuilderFactory.java @@ -722,11 +722,15 @@ public interface HttpComponentBuilderFactory { return this; } + /** - * Proxy server authentication protocol scheme to use. + * Proxy server connection protocol scheme. Defaults to http regardless + * of the target endpoint scheme, because most corporate HTTP proxies + * expect a plain HTTP connection on their listener port. * * The option is a: <code>java.lang.String</code> type. * + * Default: http * Group: proxy * * @param proxyAuthScheme the value to set diff --git a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/HttpsComponentBuilderFactory.java b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/HttpsComponentBuilderFactory.java index 7cfd2d987342..f4babcc43578 100644 --- a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/HttpsComponentBuilderFactory.java +++ b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/HttpsComponentBuilderFactory.java @@ -722,11 +722,15 @@ public interface HttpsComponentBuilderFactory { return this; } + /** - * Proxy server authentication protocol scheme to use. + * Proxy server connection protocol scheme. Defaults to http regardless + * of the target endpoint scheme, because most corporate HTTP proxies + * expect a plain HTTP connection on their listener port. * * The option is a: <code>java.lang.String</code> type. * + * Default: http * Group: proxy * * @param proxyAuthScheme the value to set diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/HttpEndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/HttpEndpointBuilderFactory.java index 13c79e4f6aef..3095712efc6b 100644 --- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/HttpEndpointBuilderFactory.java +++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/HttpEndpointBuilderFactory.java @@ -546,10 +546,13 @@ public interface HttpEndpointBuilderFactory { return this; } /** - * Proxy server authentication protocol scheme to use. + * Proxy server connection protocol scheme. Defaults to http regardless + * of the target endpoint scheme, because most corporate HTTP proxies + * expect a plain HTTP connection on their listener port. * * The option is a: <code>java.lang.String</code> type. * + * Default: http * Group: proxy * * @param proxyAuthScheme the value to set
