Hi

Yeah we can make it possible to plugin a custom client. However then you
need setup all of this yourself for authentication, proxy and so on
https://issues.apache.org/jira/browse/CAMEL-22370


On Sat, Aug 23, 2025 at 5:57 PM Chirag <w35ank...@mozmail.com.invalid>
wrote:

> Hello Claus,
>
> While camel-graphql component doesn't document this
> https://camel.apache.org/components/4.10.x/graphql-component.html,
> underlying class has following:
>
>
> https://github.com/apache/camel/blob/main/components/camel-graphql/src/main/java/org/apache/camel/component/graphql/GraphqlEndpoint.java
>
>  public void setHttpClient(CloseableHttpClient httpClient) {
>         this.httpClient = httpClient;
>     }
>
> can this be used to set up an http client that disables redirect as interim
> and let it "error"?
>
>
> Also it has a private method:
>   private CloseableHttpClient createHttpClient() {
>         HttpClientBuilder httpClientBuilder = HttpClients.custom();
>         if (proxyHost != null) {
>             String[] parts = proxyHost.split(":");
>             String hostname = parts[0];
>             int port = Integer.parseInt(parts[1]);
>             httpClientBuilder.setProxy(new HttpHost(hostname, port));
>         }
>
> if we can add a parameter to disalble redirect handling
>
> https://hc.apache.org/httpcomponents-client-4.5.x/current/httpclient/apidocs/org/apache/http/impl/client/HttpClientBuilder.html#disableRedirectHandling()
> and invoke it in createHttpClient - it can possibly prevent a direct from
> occurring.
>
> Trying regular http route:
> import org.apache.camel.builder.RouteBuilder;
>
> public class Workaround extends RouteBuilder {
>
>     @Override
>     public void configure() throws Exception {
>         from("timer:java?period=1000")
>             .setBody()
>                 .simple("Hello Camel from ${routeId}")
>
>                     .to("http://
> https://swapi-graphql.netlify.app/.netlify/functions/index";)
>                     .convertBodyTo(String.class)
>
>             .log("${body}")
>             .log("${headers}");
>     }
> }
>
>
> Returns following:
>
> 2025-08-23 11:43:06.161  INFO 35408 --- [           main]
> e.camel.impl.engine.AbstractCamelContext : Apache Camel 4.13.0 (Workaround)
> started in 430ms (build:0ms init:0ms start:430ms boot:3s505ms)
> 2025-08-23 11:43:07.689 ERROR 35408 --- [ - timer://java]
> ocessor.errorhandler.DefaultErrorHandler : Failed delivery for (MessageId:
> F246E09A67CDCDC-0000000000000000 on ExchangeId:
> F246E09A67CDCDC-0000000000000000). Exhausted after delivery attempt: 1
> caught: org.apache.camel.http.base.HttpOperationFailedException: HTTP
> operation failed invoking
> https://swapi-graphql.netlify.app/.netlify/functions/index with
> statusCode:
> 301, redirectLocation: /graphql
>
> Message History
>
> ---------------------------------------------------------------------------------------------------------------------------------------
> Source                                   ID
> Processor                                          Elapsed (ms)
> Workaround.java:7                        route1/route1
>  from[timer://java?period=1000]                              666
> Workaround.java:8                        route1/setBody1
>  setBody[simple{Hello Camel from ${routeId}}]                  2
> Workaround.java:10                       route1/to1
> http://https://swapi-graphql.netlify.app/.netlify/            0
>
> Stacktrace
>
> ---------------------------------------------------------------------------------------------------------------------------------------
> org.apache.camel.http.base.HttpOperationFailedException: HTTP operation
> failed invoking https://swapi-graphql.netlify.app/.netlify/functions/index
> with statusCode: 301, redirectLocation: /graphql
>         at
>
> org.apache.camel.component.http.HttpProducer.populateHttpOperationFailedException(HttpProducer.java:460)
> ~[camel-http-4.13.0.jar:4.13.0]
>         at
>
> org.apache.camel.component.http.HttpProducer.lambda$process$1(HttpProducer.java:283)
> ~[camel-http-4.13.0.jar:4.13.0]
>         at
>
> org.apache.camel.component.http.HttpProducer.executeMethod(HttpProducer.java:496)
> ~[camel-http-4.13.0.jar:4.13.0]
>         at
> org.apache.camel.component.http.HttpProducer.process(HttpProducer.java:253)
> ~[camel-http-4.13.0.jar:4.13.0]
>         at
>
> org.apache.camel.support.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:65)
> [camel-support-4.13.0.jar:4.13.0]
>         at
>
> org.apache.camel.processor.SendProcessor.sendUsingProducer(SendProcessor.java:252)
> [camel-core-processor-4.13.0.jar:4.13.0]
>         at
> org.apache.camel.processor.SendProcessor.process(SendProcessor.java:157)
> [camel-core-processor-4.13.0.jar:4.13.0]
>         at
>
> org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.handleFirst(RedeliveryErrorHandler.java:440)
> [camel-core-processor-4.13.0.jar:4.13.0]
>         at
>
> org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:416)
> [camel-core-processor-4.13.0.jar:4.13.0]
>         at
>
> org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.doRun(DefaultReactiveExecutor.java:199)
> [camel-base-engine-4.13.0.jar:4.13.0]
>         at
>
> org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.executeReactiveWork(DefaultReactiveExecutor.java:189)
> [camel-base-engine-4.13.0.jar:4.13.0]
>         at
>
> org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.tryExecuteReactiveWork(DefaultReactiveExecutor.java:166)
> [camel-base-engine-4.13.0.jar:4.13.0]
>         at
>
> org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:148)
> [camel-base-engine-4.13.0.jar:4.13.0]
>         at
>
> org.apache.camel.impl.engine.DefaultReactiveExecutor.scheduleMain(DefaultReactiveExecutor.java:59)
> [camel-base-engine-4.13.0.jar:4.13.0]
>         at org.apache.camel.processor.Pipeline.process(Pipeline.java:163)
> [camel-core-processor-4.13.0.jar:4.13.0]
>         at
>
> org.apache.camel.impl.engine.CamelInternalProcessor.processNonTransacted(CamelInternalProcessor.java:347)
> [camel-base-engine-4.13.0.jar:4.13.0]
>         at
>
> org.apache.camel.impl.engine.CamelInternalProcessor.process(CamelInternalProcessor.java:323)
> [camel-base-engine-4.13.0.jar:4.13.0]
>         at
>
> org.apache.camel.component.timer.TimerConsumer.sendTimerExchange(TimerConsumer.java:293)
> [camel-timer-4.13.0.jar:4.13.0]
>         at
>
> org.apache.camel.component.timer.TimerConsumer$1.doRun(TimerConsumer.java:164)
> [camel-timer-4.13.0.jar:4.13.0]
>         at
>
> org.apache.camel.component.timer.TimerConsumer$1.run(TimerConsumer.java:136)
> [camel-timer-4.13.0.jar:4.13.0]
>         at java.base/java.util.TimerThread.mainLoop(Timer.java:566) [?:?]
>         at java.base/java.util.TimerThread.run(Timer.java:516) [?:?]
>
> with doTry - it is able to capture following headers in Catch block (but
> not location / redirect URL).
>
> 2025-08-23 11:52:17.384  INFO 15820 --- [ - timer://java]
> Workaround.java:21                       : {CamelHttpResponseCode=301,
> CamelHttpResponseText=Moved Permanently}
>
>
> On Sat, Aug 23, 2025 at 3:14 AM Claus Ibsen <claus.ib...@gmail.com> wrote:
>
> > Hi
> >
> > I created a ticket
> > https://issues.apache.org/jira/browse/HTTPCLIENT-2390
> >
> > On Sat, Aug 23, 2025 at 8:22 AM Claus Ibsen <claus.ib...@gmail.com>
> wrote:
> >
> > > Hi
> > >
> > > Looking inside the HTTP client source code, then it looks like its not
> > > possible.
> > >
> > >
> > >
> >
> org/apache/httpcomponents/client5/httpclient5/5.4.4/httpclient5-5.4.4-sources.jar!/org/apache/hc/client5/http/impl/async/AsyncRedirectExec.java:149
> > >
> > > There it detects that its a 301/302 and if its a POST then change that
> to
> > > a GET
> > > And there is no way to influence this, with a custom
> > > RedirectStrategy implementation.
> > >
> > > So I think your best way is to ask the HTTP client project to see if
> they
> > > can improve this, and maybe have a some API or new option you can set
> to
> > > control this.
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > > On Sat, Aug 23, 2025 at 8:15 AM Claus Ibsen <claus.ib...@gmail.com>
> > wrote:
> > >
> > >> Hi
> > >>
> > >> Ah okay yeah that is a special case. But it's not really a bug in
> Camel
> > >> as you mention it should be using 308 instead.
> > >> Yeah I think not many humans know about this and systems may be
> > hardcoded
> > >> to use 301.
> > >>
> > >> So if anything then its something in HTTP client that should have some
> > >> option to "overrule" this 301 and treat it as a 308.
> > >>
> > >>
> > >>
> > >> On Wed, Aug 20, 2025 at 9:33 PM Chirag <chirag.sangh...@gmail.com>
> > wrote:
> > >>
> > >>> it is v2:
> > >>> rest("/v2/swapi-graphql/all-films").get()
> > >>> .produces("application/json")
> > >>> .to("direct:swapi-graphql-all-films2");
> > >>> from("direct:swapi-graphql-all-films2")
> > >>> .setBody(constant("{ allFilms { films { title director releaseDate }
> }
> > >>> }"))
> > >>> .to("graphql://
> > >>> https://swapi-graphql.netlify.app/.netlify/functions/index";)
> > >>> .convertBodyTo(String.class);
> > >>> The reason for the failure is interesting:
> > >>> 1. GraphQL component constructs POST and invokes HTTP
> > >>> 2. netlify's index URL returns 301 with /graphql  - and that forces
> > POST
> > >>> to
> > >>> be changed to GET by underlying http client.
> > >>>
> > >>> looking at HTTP spec - it should have been 308
> > >>>
> https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/308
> > -
> > >>> but haven't seen 308 adopted widely.
> > >>>
> > >>> ચિરાગ/चिराग/Chirag
> > >>> ------------------------------------------
> > >>> Sent from My Gmail Account
> > >>>
> > >>>
> > >>> On Wed, Aug 20, 2025 at 3:18 PM Claus Ibsen <claus.ib...@gmail.com>
> > >>> wrote:
> > >>>
> > >>> > Hi
> > >>> >
> > >>> > Can you tell if its v1 or v2 in that sample code that fails (due
> to a
> > >>> > redirect)
> > >>> >
> > >>> > On Tue, Aug 19, 2025 at 12:09 AM Chirag
> > <w35ank...@mozmail.com.invalid
> > >>> >
> > >>> > wrote:
> > >>> >
> > >>> > > Picking up a thread from Linkedin Discussion
> > >>> > >
> > >>> > >
> > >>> > >
> > >>> >
> > >>>
> >
> https://www.linkedin.com/posts/diego-giudici-2a4a82183_apache-camel-exec-component-to-be-used-to-activity-7361417086029520896-rX9S?utm_source=share&utm_medium=member_desktop&rcm=ACoAAAADB-oBkocmID4JNAjX2CC91jH5a8sV5l4
> > >>> > >
> > >>> > > here is route:
> > >>> > >
> > >>>
> > https://gist.github.com/chiragsanghavi/b83ef5babc6d02b2757ae6a9cd100281
> > >>> > >
> > >>> > > Technically this is not a bug, as site
> > >>> > > https://swapi-graphql.netlify.app/.netlify/functions/index leads
> > to
> > >>> a
> > >>> > > direct, which shouldn't happen in real life.
> > >>> > >
> > >>> > > GraphGL component initiates request using a POST, but redirect is
> > >>> handled
> > >>> > > by Apache Common HTTP Client - and as GET - which is where the
> > >>> "query" is
> > >>> > > not passed to the redirected URL.
> > >>> > >
> > >>> > > what will be better way to handle it ? Should such scenario be
> > >>> handled by
> > >>> > > passing a custom http client that disables redirect  and capture
> > >>> error?
> > >>> > >
> > >>> > > If GraphQL component was built using camel-http underneath - it
> > could
> > >>> > > return many more values to make some decisions  after exchange is
> > >>> called
> > >>> > .
> > >>> > >
> > >>> >
> > >>> >
> > >>> > --
> > >>> > Claus Ibsen
> > >>> >
> > >>>
> > >>
> > >>
> > >> --
> > >> Claus Ibsen
> > >>
> > >
> > >
> > > --
> > > Claus Ibsen
> > >
> >
> >
> > --
> > Claus Ibsen
> >
>


-- 
Claus Ibsen

Reply via email to