Thanks Arthur, I'll take a look next week.

Kind regards

On Tue, Feb 20, 2024 at 10:23 PM Arthur Naseef <artnas...@apache.org> wrote:

> 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
> >
>


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

Reply via email to