shashank created CAMEL-25635:
--------------------------------

             Summary: camel-platform-http-vertx - the request charset parameter 
is only recognized in lower case (Charset=ISO-8859-1 is decoded as UTF-8), and 
an empty charset= fails the request with 500
                 Key: CAMEL-25635
                 URL: https://issues.apache.org/jira/browse/CAMEL-25635
             Project: Camel
          Issue Type: Bug
          Components: camel-platform-http-vertx
            Reporter: shashank
            Assignee: shashank


{{VertxPlatformHttpConsumer.processHttpRequest}} reads the request charset with 
(line 494 at main 1de5ec5135f8)
{code:java}
final String charset = ctx.parsedHeaders().contentType().parameter("charset");
{code}
Vert.x {{ParsedHeaderValue.parameter}} looks the name up as it is written, so 
{{Content-Type: text/plain; Charset=ISO-8859-1}} gives no charset: 
{{CamelCharsetName}} and {{CamelHttpCharacterEncoding}} are not set and the 
body is converted to a String as UTF-8 ({{café}} becomes {{caf�}}). Parameter 
names are case-insensitive (RFC 9110, 5.6.6). camel-undertow (CAMEL-25295, 
{{UndertowHelper.getCharsetFromContentType}}), camel-netty-http (CAMEL-25305) 
and camel-servlet / camel-jetty (the servlet container) read {{Charset=}}, as 
the differential test of the five consumers with the same request shows.

The same line does not handle an empty value: Vert.x returns {{""}} for 
{{charset=}}, {{charset=""}} and {{charset=; format=flowed}}, the consumer sets 
{{CamelCharsetName}} to {{""}}, and converting the body to a String fails in 
{{Charset.forName("")}} ({{IllegalCharsetNameException}}, the client gets HTTP 
500). CAMEL-25355 fixed exactly this case in camel-util, camel-support and 
camel-http-common, but not in this consumer; 
{{UndertowHelper.getCharsetFromContentType}} and 
{{NettyHttpHelper.getCharsetFromContentType}} already return null for an empty 
value.

h3. Reproduction

New {{VertxPlatformHttpRequestCharsetTest}}: a route converts the body to a 
String and answers in UTF-8. With main, {{Charset=ISO-8859-1}}: {{array lengths 
differ, expected: <17> but was: <20>}} (each of ü, ß, ö came back as the 3-byte 
UTF-8 replacement character); {{charset=}} and {{charset=""; format=flowed}}: 
{{expected: <200> but was: <500>}}. An enumeration of the 128 spellings of the 
parameter name: main recognizes 1, the fix all.

camel-platform-http-vertx with the fix: 159 tests, 0 failures, 1 skipped.

h3. Proposed fix

Look the parameter up in {{contentType().parameters()}} ignoring the case of 
its name, normalize the value with {{IOHelper.normalizeCharset}} and treat an 
empty result as no charset.

Behaviour change (4.24 upgrade-guide entry): such a body is decoded in its 
declared charset and {{CamelCharsetName}} is set; a request with an empty 
charset parameter is decoded with the default charset instead of failing with 
500.

Affected: main 1de5ec5135f8 (tested). camel-4.23.x, camel-4.22.1, camel-4.18.4 
and camel-4.14.9 have the same line: read, not run.

Not in scope: {{HttpUtil.getCharsetFromContentType}} in camel-support still 
looks for {{charset=}} in lower case (callers: the camel-http producer for the 
response charset, {{CamelServlet}}).

Duplicate check (2026-10-14): JIRA text "platform-http charset case", 
"platform-http Charset": only the three linked tickets (other components / the 
response side).

_Filed with Claude Code on behalf of allthingssecurity._




--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to