You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by Yasser Zamani <ya...@apache.org> on 2021/05/18 15:16:56 UTC

interceptSendToEndpoint interceptedUri, scope and when issues

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 &amp;&amp;
${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.

Re: Re: interceptSendToEndpoint interceptedUri, scope and when issues

Posted by Yasser Zamani <ya...@apache.org>.

On 2021/05/19 05:32:16, Claus Ibsen <cl...@gmail.com> wrote: 
> Hi
> 
> You cannot do route scoped intercepting, it's always global scoped.
> The XML DSL just has a "flaw" as it is auto generated that it may
> expose the intercept as being available inside a <route> element.

Hi Claus,

Thanks for the clarification! Actually I thought it will intercept only route scope endpoints because I'd seen that you've said that "The interceptor only applies for all routes in the same route builder class" [1]. Looks like instead of route I should use a route builder xml element?

Regards.

[1] https://stackoverflow.com/a/29032760/1362623

> 
> 
> On Tue, May 18, 2021 at 10:04 PM Yasser Zamani <ya...@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 <ya...@apache.org> wrote:
> > > >
> > > > Thanks for the quick reply!
> > > >
> > > > (please see in-line)
> > > >
> > > > On 2021/05/18 15:59:34, Claus Ibsen <cl...@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 <ya...@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
> 

Re: Re: interceptSendToEndpoint interceptedUri, scope and when issues

Posted by Claus Ibsen <cl...@gmail.com>.
Hi

You cannot do route scoped intercepting, it's always global scoped.
The XML DSL just has a "flaw" as it is auto generated that it may
expose the intercept as being available inside a <route> element.


On Tue, May 18, 2021 at 10:04 PM Yasser Zamani <ya...@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 <ya...@apache.org> wrote:
> > >
> > > Thanks for the quick reply!
> > >
> > > (please see in-line)
> > >
> > > On 2021/05/18 15:59:34, Claus Ibsen <cl...@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 <ya...@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

Re: Re: interceptSendToEndpoint interceptedUri, scope and when issues

Posted by Claus Ibsen <cl...@gmail.com>.
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 <ya...@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 <ya...@apache.org> wrote:
> > >
> > > Thanks for the quick reply!
> > >
> > > (please see in-line)
> > >
> > > On 2021/05/18 15:59:34, Claus Ibsen <cl...@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 <ya...@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

Re: Re: interceptSendToEndpoint interceptedUri, scope and when issues

Posted by Yasser Zamani <ya...@apache.org>.

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 <ya...@apache.org> wrote:
> >
> > Thanks for the quick reply!
> >
> > (please see in-line)
> >
> > On 2021/05/18 15:59:34, Claus Ibsen <cl...@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 <ya...@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
> 

Re: interceptSendToEndpoint interceptedUri, scope and when issues

Posted by Claus Ibsen <cl...@gmail.com>.
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.

On Tue, May 18, 2021 at 7:58 PM Yasser Zamani <ya...@apache.org> wrote:
>
> Thanks for the quick reply!
>
> (please see in-line)
>
> On 2021/05/18 15:59:34, Claus Ibsen <cl...@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 <ya...@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

Re: interceptSendToEndpoint interceptedUri, scope and when issues

Posted by Yasser Zamani <ya...@apache.org>.
Thanks for the quick reply!

(please see in-line)

On 2021/05/18 15:59:34, Claus Ibsen <cl...@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 <ya...@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
> 

Re: interceptSendToEndpoint interceptedUri, scope and when issues

Posted by Claus Ibsen <cl...@gmail.com>.
Hi

What Camel version do you use?

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
use a * to match with wildcard

On Tue, May 18, 2021 at 5:17 PM Yasser Zamani <ya...@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 &amp;&amp;
> ${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