Hi, thanks for reporting.

Please, would you mind writing a reproducer using the steps described here?
https://camel.apache.org/camel-core/contributing/#_providing_a_reproducer

It would make it much easier to verify and fix the issue.

Kind regards


On Fri, Feb 16, 2024 at 11: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
>


-- 
Otavio R. Piske
http://orpiske.net

Reply via email to