Here is a reproducer using the maven archetype: https://github.com/artnaseef/camel-invalid-content-encoding
Art On Fri, Feb 16, 2024 at 3:12 PM Arthur Naseef <artnas...@apache.org> wrote: > > Looking into an integration that was updated from camel v2 to v4, and having > problems with outbound "http" component requests being rejected downstream > due to an invalid Content-Encoding field. > > The request is including the following header: > > Content-Encoding: us-ascii > > > Based on research, this is invalid. Content-Encoding does not accept charset > names. The Camel v2 version of the project does not set Content-Encoding. > No functional changes were made to the route - only necessary changes to > update to v4. > > After digging through the Camel code with the debugger and comparing the > original version of the integration and the updated one, I tracked down the > code in HttpProducer that used to set chartset but now sets encoding in the > StringEntity class. Below is a minimal program that reproduces the issue. > > // Sample route that incorrectly generates Content-Encoding: UTF-8 > > public static void main(String[] args) { > org.apache.camel.CamelContext camelContext = new > org.apache.camel.impl.DefaultCamelContext(); > > try { > camelContext.addRoutes(new RouteBuilder() { > @Override > public void configure() throws Exception { > from("direct:AAA") > .setProperty(Exchange.CHARSET_NAME, constant("UTF-8")) > .to("http://localhost:9999/redacted/endpoint/path") > ; > } > } > ); > > camelContext.start(); > camelContext.createProducerTemplate().sendBody("direct:AAA", ""); > Thread.sleep(2000); > } catch (Exception e) { > e.printStackTrace(); > } > } > > To test: > > 1. run nc -l 0.0.0.0 9999 > > 2. compile and run that code (I personally used Intellij to run it out of > another class that already had all the necessary dependencies to run it) > > 3. profit (notice the Content-Encoding header) > > > More Details... > > Camel v2 > Here is a little more detail on the history behind this change: > > In httpcore-4.4.15 the following constructor was being used by camel: > > public StringEntity(final String string, final String charset) > > > Note the "charset" argument. Here is the Camel HttpProducer line that calls > it: > > StringEntity entity = new StringEntity((String) data, charset); > > > Camel v4 > In httpcore5-5.2.1, the following constructor is not being used by camel: > > public StringEntity( > final String string, final ContentType contentType, final String > contentEncoding, final boolean chunked) { > > > Note the lack of a "charset" argument. Here is the Camel HttpProducer line > that calls it: > > answer = new StringEntity(content, contentType, charset, false); > > > It appears the following commit changed the call to the StringEntity > constructor in HttpProducer: > > c33a140ce51aa9bc9a8205429b78e00a39041967 > > > Finding which versions contain that commit: > > $ git tag --contains c33a140ce51aa9bc9a8205429b78e00a39041967 > > camel-4.0.0 > > camel-4.0.0-M3 > > camel-4.0.0-RC1 > > camel-4.0.0-RC2 > > camel-4.0.1 > > camel-4.0.2 > > camel-4.0.3 > > camel-4.1.0 > > camel-4.2.0 > > camel-4.3.0 > > > I would submit a PR to fix it if I knew how to correctly obtain the desired > result - that is, that both the charset and content-encoding are set on the > StringEntity. > > Art >