[
https://issues.apache.org/jira/browse/CAMEL-19843?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Peter Palaga updated CAMEL-19843:
---------------------------------
Description:
When implementing a [REST to SOAP
bridge|https://github.com/apache/camel-quarkus/pull/5271] on Camel Quarkus, it
turns out that Vert.x (the HTTP server of Quarkus) does not accept the
{{:status}} header propagated from CXF message:
{code}
10:27:39,596 INFO [app] 10:27:38,426 HTTP Request to /jaxrs/request failed,
error id: 9ce52cd2-3b97-4bbb-9971-1cbbfa20844b-1:
java.lang.IllegalArgumentException: a header name cannot contain some
prohibited characters, such as : :status
10:27:39,596 INFO [app] at
io.vertx.core.http.impl.HttpUtils.validateHeaderName0(HttpUtils.java:913)
10:27:39,596 INFO [app] at
io.vertx.core.http.impl.HttpUtils.validateHeaderName(HttpUtils.java:885)
10:27:39,597 INFO [app] at
io.vertx.core.http.impl.HttpUtils.validateHeader(HttpUtils.java:772)
10:27:39,597 INFO [app] at
io.vertx.core.http.impl.headers.HeadersMultiMap.add0(HeadersMultiMap.java:616)
10:27:39,597 INFO [app] at
io.vertx.core.http.impl.headers.HeadersMultiMap.set0(HeadersMultiMap.java:633)
10:27:39,597 INFO [app] at
io.vertx.core.http.impl.headers.HeadersMultiMap.set(HeadersMultiMap.java:184)
10:27:39,597 INFO [app] at
io.vertx.core.http.impl.headers.HeadersMultiMap.set(HeadersMultiMap.java:189)
10:27:39,597 INFO [app] at
io.vertx.core.http.impl.Http1xServerResponse.putHeader(Http1xServerResponse.java:193)
10:27:39,597 INFO [app] at
io.vertx.core.http.impl.Http1xServerResponse.putHeader(Http1xServerResponse.java:67)
10:27:39,598 INFO [app] at
org.apache.camel.component.platform.http.vertx.VertxPlatformHttpSupport.toHttpResponse(VertxPlatformHttpSupport.java:89)
{code}
This happens with {{HttpClientHTTPConduit}} using HTTP/2 capable
{{java.net.http.HttpClient}} as the underlying HTTP client. That's the default
in CXF 4.x. Another condition is that the service must also run on a HTTP/2
enabled HTTP server. Jetty 11 used in Camel tests does not seem to have HTTP/2
enabled.
{{:status}} is a standard pseudo-header of HTTP/2 and HTTP/3 specified by
[RFC-7540|https://datatracker.ietf.org/doc/html/rfc7540#section-8.1.2.4].
If CXF is configured to use the older {{URLConnectionHTTPConduitFactory}} using
the HTTP/1.1 only {{java.net.HttpURLConnection}} then the issue does not occur.
Note that {{URLConnectionHTTPConduitFactory}} is set by default by Quarkus CXF
2.3.1 and 2.2.3 because of
https://github.com/quarkiverse/quarkus-cxf/issues/992 (thus overriding the CXF
4.x default). It was also the default in CXF 3.x used by Camel 3.x.
I think the solution should be to filter out all HTTP pseudo-headers when
propagating the headers from the CXF message to the Camel message. The reason
is, that the info present in pseudo-headers is also available through
programmatic API and for HTTP status, it is indeed there as
{{CamelHttpResponseCode}} header. Any comments about that?
was:
When implementing a [REST to SOAP
bridge|https://github.com/apache/camel-quarkus/pull/5271] on Camel Quarkus, it
turns out that Vert.x (the HTTP server of Quarkus) does not accept the
{{:status}} header propagated from CXF message:
{code}
10:27:39,596 INFO [app] 10:27:38,426 HTTP Request to /jaxrs/request failed,
error id: 9ce52cd2-3b97-4bbb-9971-1cbbfa20844b-1:
java.lang.IllegalArgumentException: a header name cannot contain some
prohibited characters, such as : :status
10:27:39,596 INFO [app] at
io.vertx.core.http.impl.HttpUtils.validateHeaderName0(HttpUtils.java:913)
10:27:39,596 INFO [app] at
io.vertx.core.http.impl.HttpUtils.validateHeaderName(HttpUtils.java:885)
10:27:39,597 INFO [app] at
io.vertx.core.http.impl.HttpUtils.validateHeader(HttpUtils.java:772)
10:27:39,597 INFO [app] at
io.vertx.core.http.impl.headers.HeadersMultiMap.add0(HeadersMultiMap.java:616)
10:27:39,597 INFO [app] at
io.vertx.core.http.impl.headers.HeadersMultiMap.set0(HeadersMultiMap.java:633)
10:27:39,597 INFO [app] at
io.vertx.core.http.impl.headers.HeadersMultiMap.set(HeadersMultiMap.java:184)
10:27:39,597 INFO [app] at
io.vertx.core.http.impl.headers.HeadersMultiMap.set(HeadersMultiMap.java:189)
10:27:39,597 INFO [app] at
io.vertx.core.http.impl.Http1xServerResponse.putHeader(Http1xServerResponse.java:193)
10:27:39,597 INFO [app] at
io.vertx.core.http.impl.Http1xServerResponse.putHeader(Http1xServerResponse.java:67)
10:27:39,598 INFO [app] at
org.apache.camel.component.platform.http.vertx.VertxPlatformHttpSupport.toHttpResponse(VertxPlatformHttpSupport.java:89)
{code}
This happens with {{HttpClientHTTPConduit}} using HTTP/2 capable
{{java.net.http.HttpClient}} as the underlying HTTP client. That's the default
in CXF 4.x.
{{:status}} is a standard pseudo-header of HTTP/2 and HTTP/3 specified by
[RFC-7540|https://datatracker.ietf.org/doc/html/rfc7540#section-8.1.2.4].
If CXF is configured to use the older {{URLConnectionHTTPConduitFactory}} using
the HTTP/1.1 only {{java.net.HttpURLConnection}} then the issue does not occur.
Note that {{URLConnectionHTTPConduitFactory}} is set by default by Quarkus CXF
2.3.1 and 2.2.3 because of
https://github.com/quarkiverse/quarkus-cxf/issues/992 (thus overriding the CXF
4.x default). It was also the default in CXF 3.x used by Camel 3.x.
I think the solution should be to filter out all HTTP pseudo-headers when
propagating the headers from the CXF message to the Camel message. The reason
is, that the info present in pseudo-headers is also available through
programmatic API and for HTTP status, it is indeed there as
{{CamelHttpResponseCode}} header. Any comments about that?
> HTTP/2 pseudo-headers such as :status should not be propagated from CXF
> message to Camel message
> ------------------------------------------------------------------------------------------------
>
> Key: CAMEL-19843
> URL: https://issues.apache.org/jira/browse/CAMEL-19843
> Project: Camel
> Issue Type: Bug
> Reporter: Peter Palaga
> Assignee: Peter Palaga
> Priority: Major
>
> When implementing a [REST to SOAP
> bridge|https://github.com/apache/camel-quarkus/pull/5271] on Camel Quarkus,
> it turns out that Vert.x (the HTTP server of Quarkus) does not accept the
> {{:status}} header propagated from CXF message:
> {code}
> 10:27:39,596 INFO [app] 10:27:38,426 HTTP Request to /jaxrs/request failed,
> error id: 9ce52cd2-3b97-4bbb-9971-1cbbfa20844b-1:
> java.lang.IllegalArgumentException: a header name cannot contain some
> prohibited characters, such as : :status
> 10:27:39,596 INFO [app] at
> io.vertx.core.http.impl.HttpUtils.validateHeaderName0(HttpUtils.java:913)
> 10:27:39,596 INFO [app] at
> io.vertx.core.http.impl.HttpUtils.validateHeaderName(HttpUtils.java:885)
> 10:27:39,597 INFO [app] at
> io.vertx.core.http.impl.HttpUtils.validateHeader(HttpUtils.java:772)
> 10:27:39,597 INFO [app] at
> io.vertx.core.http.impl.headers.HeadersMultiMap.add0(HeadersMultiMap.java:616)
> 10:27:39,597 INFO [app] at
> io.vertx.core.http.impl.headers.HeadersMultiMap.set0(HeadersMultiMap.java:633)
> 10:27:39,597 INFO [app] at
> io.vertx.core.http.impl.headers.HeadersMultiMap.set(HeadersMultiMap.java:184)
> 10:27:39,597 INFO [app] at
> io.vertx.core.http.impl.headers.HeadersMultiMap.set(HeadersMultiMap.java:189)
> 10:27:39,597 INFO [app] at
> io.vertx.core.http.impl.Http1xServerResponse.putHeader(Http1xServerResponse.java:193)
> 10:27:39,597 INFO [app] at
> io.vertx.core.http.impl.Http1xServerResponse.putHeader(Http1xServerResponse.java:67)
> 10:27:39,598 INFO [app] at
> org.apache.camel.component.platform.http.vertx.VertxPlatformHttpSupport.toHttpResponse(VertxPlatformHttpSupport.java:89)
> {code}
> This happens with {{HttpClientHTTPConduit}} using HTTP/2 capable
> {{java.net.http.HttpClient}} as the underlying HTTP client. That's the
> default in CXF 4.x. Another condition is that the service must also run on a
> HTTP/2 enabled HTTP server. Jetty 11 used in Camel tests does not seem to
> have HTTP/2 enabled.
> {{:status}} is a standard pseudo-header of HTTP/2 and HTTP/3 specified by
> [RFC-7540|https://datatracker.ietf.org/doc/html/rfc7540#section-8.1.2.4].
> If CXF is configured to use the older {{URLConnectionHTTPConduitFactory}}
> using the HTTP/1.1 only {{java.net.HttpURLConnection}} then the issue does
> not occur. Note that {{URLConnectionHTTPConduitFactory}} is set by default by
> Quarkus CXF 2.3.1 and 2.2.3 because of
> https://github.com/quarkiverse/quarkus-cxf/issues/992 (thus overriding the
> CXF 4.x default). It was also the default in CXF 3.x used by Camel 3.x.
> I think the solution should be to filter out all HTTP pseudo-headers when
> propagating the headers from the CXF message to the Camel message. The reason
> is, that the info present in pseudo-headers is also available through
> programmatic API and for HTTP status, it is indeed there as
> {{CamelHttpResponseCode}} header. Any comments about that?
--
This message was sent by Atlassian Jira
(v8.20.10#820010)