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)

Reply via email to