Peter Palaga created CAMEL-19843:
------------------------------------
Summary: 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
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?
--
This message was sent by Atlassian Jira
(v8.20.10#820010)