Claus Ibsen created CAMEL-25563:
-----------------------------------
Summary: camel-http - send each value of a multi-value header as
its own HTTP header line
Key: CAMEL-25563
URL: https://issues.apache.org/jira/browse/CAMEL-25563
Project: Camel
Issue Type: Improvement
Components: camel-http
Reporter: Claus Ibsen
Fix For: 4.24.0
h3. Problem
When a message header has two or more values (a {{List}}, a collection or an
array), the camel-http producer sends them as a single header line with the
{{toString()}} of the list, brackets included:
{code}
Accept: [text/plain, application/json]
{code}
See {{HttpProducer.applyHeader}} ({{multiValues.size() > 1 ?
multiValues.toString() : multiValues.get(0)}}).
This is not valid HTTP. A receiver that reads it as a list (RFC 9110 section
5.3) sees the values {{[text/plain}} and {{application/json]}}. It does not
round-trip in Camel either: a Camel HTTP consumer turns repeated header lines
into a {{List}}, but this arrives as the plain string {{"[text/plain,
application/json]"}}. For {{Set-Cookie}}, folding values into one line is never
valid.
h3. Expected
Send one header line per value, like every mainstream HTTP client (JDK
{{HttpClient}}, Apache HttpClient {{addHeader}}, OkHttp, Netty, Vert.x, Spring
{{HttpHeaders}}, curl with {{-H}} twice) and like the other Camel HTTP
components already do: camel-http-common (servlet/jetty), camel-netty-http,
camel-undertow and camel-platform-http-vertx.
{code}
Accept: text/plain
Accept: application/json
{code}
RFC 9110 section 5.3 makes this equivalent to {{Accept: text/plain,
application/json}} for list-based headers, and it is the only form that is also
correct for {{Set-Cookie}}.
h3. Notes
* The same convention is being applied to camel-vertx-http (CAMEL-25526, PR
#27689) and camel-knative-http (CAMEL-25547, PR #27690). Ideally all three
share one helper in camel-support {{HttpUtil}}.
* Only collections and object arrays should be split, not every {{Iterable}}
(for example a Vert.x {{JsonObject}} is an {{Iterable}} of its entries).
* {{Cookie}} from the cookie handler stays one line joined with {{;}}, as today.
* This changes what is sent for multi-value headers, so it needs an entry in
the 4.24 upgrade guide.
_Created by Claude Code on behalf of davsclaus_
--
This message was sent by Atlassian Jira
(v8.20.10#820010)