Hi The after is always executed, however you can argue that it should not when you have a when filter. https://issues.apache.org/jira/browse/CAMEL-16629
On Tue, May 18, 2021 at 10:04 PM Yasser Zamani <yasserzam...@apache.org> wrote: > > > > On 2021/05/18 18:03:47 Claus Ibsen wrote: > > Hi > > > > That is because you use toD with http that camel optimizes under the > > hood to use a base endpoint and using headers with the dynamic > > context-path part. > > The interceptor can then not match that pattern. > > > > You can turn this off in toD > > Or you can check the header (CamelHttpPath is the name I think) in > > <when> to see if it matches that part of your context-path. > > Thanks for the clarification! This is the place where issue#3 emerges: > afterUri will be triggered always regardless of the when evaluation result. > Is this expected? Camel docs say it won't be triggered at all when condition > is false. > > The root cause of my findings was issue#2. I've defined interception at route > level but it intercepts all http endpoints inside the camel context. Is this > expected? If so then why am I allowed to define it in route scope? > > Regards. > > > > > On Tue, May 18, 2021 at 7:58 PM Yasser Zamani <yasserzam...@apache.org> > > wrote: > > > > > > Thanks for the quick reply! > > > > > > (please see in-line) > > > > > > On 2021/05/18 15:59:34, Claus Ibsen <claus.ib...@gmail.com> wrote: > > > > Hi > > > > > > > > What Camel version do you use? > > > > > > I use Camel 3.7.3. > > > > > > > > > > > Also mind about matching by exact uri, then the order of the query > > > > parameters also matter. So if that is not really what you need, then > > > > > > Matching by exact uri isn't possible in my case. But to test I'd also > > > tested an absolute uri > > > "http://localhost:8080/camel/external_mock/PropertyFoo?bridgeEndpoint=true" > > > which didn't work. The problem isn't order of query parameters. As I > > > said the problem is I don't know why but my break point showed me that > > > Camel is trying to test > > > "http://localhost:8080/camel/external_mock/PropertyFoo?bridgeEndpoint=true".matches("http://localhost:8080?bridgeEndpoint=true"); > > > which doesn't match because the "/camel/external_mock/" is missing in > > > the intercepted uri, provided it is present in the exact uri or wildcard > > > uri expression. > > > > > > My best guess is that's because of my dynamic .toD where I have > > > ${headers.serviceType} included in the http url. For example I guess > > > following simplified XML DSL won't work as well: > > > > > > <interceptSendToEndpoint uri="http://localhost:8080/*"> > > > <to uri="log:worked"/> > > > </interceptSendToEndpoint> > > > <route> > > > <from uri="direct:sample"/> > > > <toD > > > uri="http://localhost:8080/Sample${headers.foo}?bridgeEndpoint=true"/> > > > > > > BTW any idea about issues #2 and #3? > > > > > > Regards. > > > > > > > use a * to match with wildcard > > > > > > > > On Tue, May 18, 2021 at 5:17 PM Yasser Zamani <yasserzam...@apache.org> > > > > wrote: > > > > > > > > > > Hi there, > > > > > > > > > > Assume following XML DSL: > > > > > > > > > > <route id="dispatch"> > > > > > <from uri="direct:dispatch"/> > > > > > <interceptSendToEndpoint uri="http:*" > > > > > afterUri="direct:after_dispatch"> > > > > > <when> > > > > > <simple>${headers.messageType} != null && > > > > > ${headers.serviceType} != null</simple> > > > > > </when> > > > > > <to uri="direct:req_out"/> > > > > > </interceptSendToEndpoint> > > > > > <choice id="dispatch-choice"> > > > > > <when> > > > > > <simple>${headers.messageType} == 'Property'</simple> > > > > > <toD > > > > > uri="{{ext.url}}/Property${headers.serviceType}?bridgeEndpoint=true"/> > > > > > </when> > > > > > . > > > > > . > > > > > . > > > > > > > > > > I found several issues listed below ordered by bug likelihood: > > > > > > > > > > 1. When I change uri="http:*" to uri="{{ext.url}}/*" it doesn't match > > > > > as > > > > > I expect. I debugged and saw that Camel tries to match > > > > > "http://localhost:8080?bridgeEndpoint=true" with "{{ext.url}}/*" i.e. > > > > > "http://localhost:8080/camel/external_mock/*" (because ext.url is set > > > > > to > > > > > http://localhost:8080/camel/external_mock) and it doesn't match, Camel > > > > > is right but why it's removed "/Property${headers.serviceType}" from > > > > > the > > > > > interceptedUri?! because it has dynamics? it doesn't match because > > > > > it's > > > > > removed this portion. I expect Camel to match > > > > > "http://localhost:8080/camel/external_mock/PropertyFoo?bridgeEndpoint=true", > > > > > not "http://localhost:8080?bridgeEndpoint=true". > > > > > > > > > > 2. As you see I've defined it at route level but I see all of my other > > > > > "http:*" endpoints will be intercepted! Is this expected?! > > > > > > > > > > 3. As per Camel docs, when `when` condition evaluates to false then > > > > > the > > > > > interception shouldn't being triggered, but I see yes, it doesn't go > > > > > to > > > > > the "direct:req_out" but always go to the afterUri i.e. > > > > > "direct:after_dispatch" regardless of `when`! Is this expected? > > > > > > > > > > Thanks in advance! > > > > > > > > > > Regards. > > > > > > > > > > > > > > > > -- > > > > Claus Ibsen > > > > ----------------- > > > > http://davsclaus.com @davsclaus > > > > Camel in Action 2: https://www.manning.com/ibsen2 > > > > > > > > > > > > -- > > Claus Ibsen > > ----------------- > > http://davsclaus.com @davsclaus > > Camel in Action 2: https://www.manning.com/ibsen2 > > -- Claus Ibsen ----------------- http://davsclaus.com @davsclaus Camel in Action 2: https://www.manning.com/ibsen2