[ 
https://issues.apache.org/jira/browse/CAMEL-25355?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

shashank reassigned CAMEL-25355:
--------------------------------

    Assignee: shashank

> camel-support - an empty charset parameter of the Content-Type (charset=) 
> sets an empty CamelCharsetName, and converting the body then fails (servlet, 
> Jetty and HTTP producer)
> -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-25355
>                 URL: https://issues.apache.org/jira/browse/CAMEL-25355
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-core, camel-http, camel-http-common, camel-jetty, 
> camel-servlet, camel-support
>            Reporter: shashank
>            Assignee: shashank
>            Priority: Minor
>
> The shared helpers that read the charset parameter of a {{Content-Type}} 
> return an empty name for an empty value, such as {{text/plain; charset=}}, 
> {{charset=""}} or {{charset=; format=flowed}}:
> * {{IOHelper.getCharsetNameFromContentType}} (camel-util) returns {{""}} 
> instead of its default {{UTF-8}};
> * {{HttpUtil.getCharsetFromContentType}} (camel-support, used by 
> {{HttpUtil.setCharsetFromContentType}} and 
> {{org.apache.camel.http.common.HttpHelper.setCharsetFromContentType}}) 
> returns {{""}} instead of {{null}}.
> The callers store this as the {{CamelCharsetName}} exchange property: 
> {{CamelServlet}} (servlet consumer), {{CamelContinuationServlet}} (Jetty 
> consumer), {{HttpProducer}} (response headers and response body), 
> {{DefaultVertxHttpBinding}} (vertx-http producer). 
> {{DefaultHttpBinding.readHeaders}} does the same with 
> {{HttpServletRequest.getCharacterEncoding()}}, which is also {{""}} for these 
> values on Tomcat ({{charset=}}, {{charset=""}}) and Undertow ({{charset=""}}, 
> {{charset=; ...}}). Every later conversion of the body that uses the exchange 
> charset then fails in {{Charset.forName("")}}:
> {noformat}
> org.apache.camel.TypeConversionException: Error during type conversion from 
> type: byte[] to the required type: java.lang.String due to 
> java.nio.charset.IllegalCharsetNameException:
>     at java.nio.charset.Charset.forName(Charset.java:539)
>     at 
> org.apache.camel.support.ExchangeHelper.getCharset(ExchangeHelper.java:1005)
> {noformat}
> So a servlet or Jetty route that reads the body as a String answers 500, and 
> an HTTP producer cannot read the response body as a String. The form parser 
> of {{DefaultHttpBinding}} ({{application/x-www-form-urlencoded; charset=""}}) 
> also fails ({{URLDecoder.decode(.., "")}}).
> {{UndertowHelper.getCharsetFromContentType}} already treats an empty value as 
> no charset, and the same was done for {{NettyHttpHelper}} in CAMEL-25305 
> (raised by Claus Ibsen in the review).
> h3. Reproduction
> * camel-util {{IOHelperTest.testCharsetEmpty}}: {{expected: <UTF-8> but was: 
> <>}}; camel-support new {{HttpUtilTest}}: {{expected: <null> but was: <>}}.
> * camel-servlet new {{ServletEmptyCharsetParameterTest}} (embedded Undertow): 
> a POST with {{text/plain; charset=; format=flowed}}, {{charset=""}} or 
> {{charset= ;format=flowed}} to a route doing {{convertBodyTo(String.class)}}, 
> and a form POST with {{charset=""}}: all 4 answer 500 on main.
> * camel-jetty new {{JettyEmptyCharsetParameterTest}}: a POST with 
> {{text/plain; charset=}}: 500 on main.
> * camel-http new {{HttpProducerEmptyCharsetParameterTest}}: a response with 
> any of the three empty forms: {{TypeConversionException}} on main (3 of 3).
> All fail in two runs on main.
> h3. Proposed fix
> Treat an empty (or blank) charset value as no charset, as {{UndertowHelper}} 
> and {{NettyHttpHelper}} do: {{IOHelper.getCharsetNameFromContentType}} 
> returns its default {{UTF-8}}, {{HttpUtil.getCharsetFromContentType}} returns 
> {{null}} (so no property is set), and {{DefaultHttpBinding}} ignores an empty 
> {{getCharacterEncoding()}} (and parses a form as UTF-8, as without a 
> charset). Content types with a charset, or without one, are handled as 
> before. No upgrade note: the only change is for requests and responses that 
> failed before, apart from the corner case below.
> Other callers of {{IOHelper.getCharsetNameFromContentType}} see {{UTF-8}} 
> instead of {{""}} for an empty charset parameter: the vertx-http producer 
> ({{DefaultVertxHttpBinding}}) stored {{""}} as {{CamelCharsetName}} and 
> failed in the same way, and now uses UTF-8; {{VertxPlatformHttpSupport}} 
> (CAMEL-25217) treated {{""}} as no charset and wrote a String response as 
> UTF-8, which it still does. {{VertxBufferConverter}} and 
> {{VertxHttpHelper.getCharsetFromExchange}} fell back to the 
> {{CamelCharsetName}} exchange property for {{""}}; they now use UTF-8, as 
> they already did for a Content-Type without a charset. So a 
> {{Buffer}}/{{String}} conversion for a message whose Content-Type has an 
> empty charset parameter and that also has a {{CamelCharsetName}} other than 
> UTF-8 now uses UTF-8.
> Not in Camel, so not changed: the embedded Undertow itself fails on a 
> {{charset=}} at the very end of the header 
> ({{StringIndexOutOfBoundsException}} in 
> {{Headers.extractQuotedValueFromHeader}}), and Jetty 12 itself rejects 
> {{charset=""}} and {{charset=; ...}} in {{getContentType()}}.
> Together with the CAMEL-25316 and CAMEL-25133 changes to 
> {{DefaultHttpBinding}} (merged without conflict) the camel-util, 
> camel-support, camel-http-base, camel-http-common, camel-servlet, 
> camel-jetty-common, camel-http, camel-jetty (except the environment-dependent 
> {{JettyXsltHttpTemplateTest}}), camel-vertx-http and 
> camel-platform-http-vertx tests pass.
> Affected: 4.14.x, 4.18.x and main (same code).
> Priority Minor: only requests or responses with a malformed (empty) charset 
> parameter are affected, but they fail instead of being read as UTF-8.
> Duplicate check (2026-10-05): JIRA "IllegalCharsetNameException" (3 issues, 
> none on this), "getCharsetNameFromContentType" (4: CAMEL-25295, CAMEL-12395, 
> CAMEL-25084, CAMEL-25217), "normalizeCharset" (CAMEL-12424, a charset that is 
> not the last parameter), "HttpUtil" with charset (CAMEL-25305, CAMEL-24594), 
> summary "empty charset" (none). GitHub pull requests "empty charset", 
> "getCharsetNameFromContentType", "IllegalCharsetNameException": only the 
> merged CAMEL-25305, CAMEL-25295, CAMEL-25084 and CAMEL-25217.
> _Filed with Claude Code on behalf of allthingssecurity._



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

Reply via email to