This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch fix/CAMEL-24632 in repository https://gitbox.apache.org/repos/asf/camel.git
commit bbffbf7bad5b07a838dfa0370c2a810a88c4c2aa Author: Claus Ibsen <[email protected]> AuthorDate: Mon Sep 7 14:51:02 2026 +0200 CAMEL-24632: camel-http - fix proxy scheme defaulting to https for https targets The proxyAuthScheme option incorrectly defaulted to "https" when the target endpoint was https://, causing an SSLException when the proxy is a plain HTTP proxy (the overwhelming majority of corporate proxies). The proxy connection scheme is independent of the target endpoint scheme: 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: default proxyAuthScheme to "http" unconditionally in HttpComponent, HttpEndpoint (deprecated global-option path), and update the defaultValue metadata in HttpCommonEndpoint and HttpConfiguration so tooling surfaces the correct default. Catalog and DSL regenerated. Co-Authored-By: Claude Sonnet 4.6 <[email protected]> Signed-off-by: Claus Ibsen <[email protected]> --- .../org/apache/camel/catalog/components/http.json | 4 ++-- .../org/apache/camel/catalog/components/https.json | 4 ++-- .../camel/http/common/HttpCommonEndpoint.java | 5 ++-- .../camel/http/common/HttpConfiguration.java | 4 +++- .../org/apache/camel/component/http/http.json | 4 ++-- .../org/apache/camel/component/http/https.json | 4 ++-- .../apache/camel/component/http/HttpComponent.java | 9 +++---- .../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, 63 insertions(+), 21 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 c3e70f1f685f..62bd200a838a 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,7 +65,7 @@ "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, "security": "secret", "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" }, + "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", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server host" }, "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" }, @@ -141,7 +141,7 @@ "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, "security": "secret", "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" }, + "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": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server host" }, "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" }, 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 b390e2baaa82..684054be5524 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,7 +65,7 @@ "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, "security": "secret", "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" }, + "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", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server host" }, "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" }, @@ -141,7 +141,7 @@ "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, "security": "secret", "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" }, + "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": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server host" }, "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" }, 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 84dc6fd9f138..d901c31f4247 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 @@ -183,8 +183,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 f850b79f9d52..aa47c42f7f10 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 c3e70f1f685f..62bd200a838a 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,7 +65,7 @@ "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, "security": "secret", "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" }, + "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", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server host" }, "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" }, @@ -141,7 +141,7 @@ "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, "security": "secret", "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" }, + "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": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server host" }, "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" }, 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 b390e2baaa82..684054be5524 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,7 +65,7 @@ "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, "security": "secret", "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" }, + "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", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server host" }, "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" }, @@ -141,7 +141,7 @@ "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, "security": "secret", "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" }, + "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": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Proxy server host" }, "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" }, 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 72f74b56e534..853ca554a43f 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 @@ -148,8 +148,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)") @@ -384,8 +385,8 @@ public class HttpComponent extends HttpCommonComponent implements RestProducerFa 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 bc852f021181..5a453b2e5fc4 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; @@ -291,9 +290,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 4a698fa72dc8..d04b153f4b50 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 @@ -725,11 +725,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 ab81bf36ef47..332a3b19469c 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 @@ -725,11 +725,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 5fe684ad2fc1..a6bb3487b085 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
