You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by "Calvert, Zach (Zach)** CTR **" <zc...@motive.com> on 2012/11/06 15:02:06 UTC

Obtain CXF Request?

I am stuck using Camel CXF 2.6.0 (yes, I know I'm behind) and need to get the IP address of the remote system making an HTTP POST to my cxfbean:
        <!-- Define the camel route -->
        <camel:route id="restApis">
            <camel:from uri="jetty:{{protocol}}://0.0.0.0:{{port}}/rest/?matchOnUriPrefix=true&amp;handlers=securityHandler"/>
            <camel:to uri="cxfbean:restfulService?providers=#restExceptionMapper" />
            <camel:log message="done"/>
        </camel:route>

My restfulService handles the posts.  When I turn on tracing, I see

07:10:29,783 | INFO  | qtp26579196-144  | Tracer                           | 76 - org.apache.camel.camel-core - 2.6.0 | ID-centora-45480-1352207331927-4-1 >>> (restApis) from(https://0.0.0.0:9091/rest/?matchOnUriPrefix=true&handlers=securityHandler) --> restfulService <<< Pattern:InOut, Headers:{Host=test.com:9091, CamelHttpMethod=POST, CamelHttpServletRequest=[POST /rest/domain/feed]@19570394 org.eclipse.jetty.server.Request@12a9eda, Accept-Encoding=gzip,deflate, CamelHttpServletResponse=HTTP/1.1 200

In my bean I have the function
    @POST
    @Path("{domainName}/{domainChild}")
    @Consumes({MediaType.APPLICATION_RESTMS_XML, MediaType.APPLICATION_RESTMS_JSON, MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
    @Produces({MediaType.APPLICATION_RESTMS_XML, MediaType.APPLICATION_RESTMS_JSON, MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
    public Response post(@PathParam("domainName") String domainName,
            @PathParam("domainChild") String domainChildName,
            JAXBElement<RestXml> restXml) {
...
}

I have tried to add the parameter Exchange (camel), Exchange (cxf), Message, etc all to no avail due to no longer having a mapping for my sample test post.  I want to know if there is a way for me to access that header "CamelHttpServletRequest" inside of this bean's function?  My end goal is simply to get the HttpRequest or ServletRequest or whatever request that will have the "getRemoteAddress" function exposed on it.  I've been through the jaxrs core annotations and cannot seem to figure out how to get a handle to the original incoming request, or any context object that may contain the IP address of whoever is making the call to my servlet.  I thought maybe UriInfo or Request (from javax.ws.rs.core) contexts would have the info I'm looking for, but if they do, I can't figure them out.

I have also looked at building a custom provider, but I can't figure out how to build one that not only gets the IP address, but manages to provide it along the route to my cxfbean.  Is there a way I can do something like get the IP and then set it as a QueryParam for my bean to consume?

Any and all help would be greatly appreciated!


Thanks,
Zach Calvert

Re: Obtain CXF Request?

Posted by Sergey Beryozkin <sb...@gmail.com>.
On 07/11/12 01:55, Calvert, Zach (Zach)** CTR ** wrote:
> I found the solution!
>
> You can obtain a reference to the CXF CamelMessage context using
> @Context org.apache.cxf.jaxrs.ext.MessageContext cxfMessage
> As a parameter in your cxfbean.  From there, you can access the CamelHttpServletRequest using:
> ((HttpServletRequest)cxfMessage.get("CamelHttpServletRequest")).getRemoteAddr();
>
> Crazy roundabout way to solve the problem, but I'm happy to have found an answer.
>
Thanks for the update, that looks OK from one hand given that the 
purpose of MessageContext is to access the message properties. If you 
prefer, you can hide some the above code within CXF RequestHandler 
Filter, by doing

cxfMessage.put("HTTP.REQUEST", cxfMessage.get("CamelHttpServletRequest"));

"and have messgaeContext.getHttpServletRequest()" in the actual 
application code... Or inject only "HttpServletRequest" to have the code 
more JAX-RS portable

Cheers, Sergey

>
>
>
> Zach Calvert
>
>
> -----Original Message-----
> From: Sergey Beryozkin [mailto:sberyozkin@gmail.com]
> Sent: Tuesday, November 06, 2012 9:05 AM
> To: users@camel.apache.org
> Subject: Re: Obtain CXF Request?
>
> On 06/11/12 14:53, Calvert, Zach (Zach)** CTR ** wrote:
>> Unfortunately no, I'm stuck in 2.6.0.  Are there any other options exposed for obtaining caller's IP address?
>>
>> Thank you again, your help is very much appreciated!
>>
> It's a question to Camel experts at this stage :-)
>
> Cheers, Sergey
>
>>
>> Thanks,
>> Zach
>>
>>
>> -----Original Message-----
>> From: Sergey Beryozkin [mailto:sberyozkin@gmail.com]
>> Sent: Tuesday, November 06, 2012 8:52 AM
>> To: users@camel.apache.org
>> Subject: Re: Obtain CXF Request?
>>
>> On 06/11/12 14:40, Calvert, Zach (Zach)** CTR ** wrote:
>>> Thank you for your reply Sergey, unfortunately while the context is populated, I get:
>>>
>>> java.lang.NullPointerException
>>>            at
>>> org.apache.cxf.jaxrs.impl.tl.ThreadLocalHttpServletRequest.getRemoteA
>>> d
>>> dr(ThreadLocalHttpServletRequest.java:223)[119:org.apache.cxf.bundle:
>>> 2
>>> .3.2]
>>> ...
>>>
>>> So I have a handle to the ThreadLocalHttpServletRequest, but the "get" function isn't being populated.  I've walked the code and the NPE in ThreadLocalHttpServletRequest at 223 corresponds to the function
>>>        public String getRemoteAddr() {
>>>            return get().getRemoteAddr();
>>>        }
>>>
>>> Get is exposed from AbstractThreadLocalProxy:
>>> public T get() {
>>>            return infos.get();
>>>        }
>>>
>>> Is there something I need to do to force my context to be populated?
>>
>> I think HttpServletRequest has to be visible to CXF endpoints starting from Camel 2.10.2, as well the as the latest 2.9.x. Are you working with the older version ?
>>
>> Cheers, Sergey
>>
>>>
>>> Thank you again!
>>>
>>>
>>>
>>> Zach Calvert
>>>
>>>
>>> -----Original Message-----
>>> From: Sergey Beryozkin [mailto:sberyozkin@gmail.com]
>>> Sent: Tuesday, November 06, 2012 8:13 AM
>>> To: users@camel.apache.org
>>> Subject: Re: Obtain CXF Request?
>>>
>>>
>>> Hi
>>> On 06/11/12 14:02, Calvert, Zach (Zach)** CTR ** wrote:
>>>> I am stuck using Camel CXF 2.6.0 (yes, I know I'm behind) and need to get the IP address of the remote system making an HTTP POST to my cxfbean:
>>>>             <!-- Define the camel route -->
>>>>             <camel:route id="restApis">
>>>>                 <camel:from uri="jetty:{{protocol}}://0.0.0.0:{{port}}/rest/?matchOnUriPrefix=true&amp;handlers=securityHandler"/>
>>>>                 <camel:to uri="cxfbean:restfulService?providers=#restExceptionMapper" />
>>>>                 <camel:log message="done"/>
>>>>             </camel:route>
>>>>
>>>> My restfulService handles the posts.  When I turn on tracing, I see
>>>>
>>>> 07:10:29,783 | INFO  | qtp26579196-144  | Tracer                           | 76 - org.apache.camel.camel-core - 2.6.0 | ID-centora-45480-1352207331927-4-1>>>     (restApis) from(https://0.0.0.0:9091/rest/?matchOnUriPrefix=true&handlers=securityHandler) -->     restfulService<<<     Pattern:InOut, Headers:{Host=test.com:9091, CamelHttpMethod=POST, CamelHttpServletRequest=[POST /rest/domain/feed]@19570394 org.eclipse.jetty.server.Request@12a9eda, Accept-Encoding=gzip,deflate, CamelHttpServletResponse=HTTP/1.1 200
>>>>
>>>> In my bean I have the function
>>>>         @POST
>>>>         @Path("{domainName}/{domainChild}")
>>>>         @Consumes({MediaType.APPLICATION_RESTMS_XML, MediaType.APPLICATION_RESTMS_JSON, MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
>>>>         @Produces({MediaType.APPLICATION_RESTMS_XML, MediaType.APPLICATION_RESTMS_JSON, MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
>>>>         public Response post(@PathParam("domainName") String domainName,
>>>>                 @PathParam("domainChild") String domainChildName,
>>>>                 JAXBElement<RestXml>     restXml) { ...
>>>> }
>>>>
>>>> I have tried to add the parameter Exchange (camel), Exchange (cxf), Message, etc all to no avail due to no longer having a mapping for my sample test post.  I want to know if there is a way for me to access that header "CamelHttpServletRequest" inside of this bean's function?  My end goal is simply to get the HttpRequest or ServletRequest or whatever request that will have the "getRemoteAddress" function exposed on it.  I've been through the jaxrs core annotations and cannot seem to figure out how to get a handle to the original incoming request, or any context object that may contain the IP address of whoever is making the call to my servlet.  I thought maybe UriInfo or Request (from javax.ws.rs.core) contexts would have the info I'm looking for, but if they do, I can't figure them out.
>>>>
>>>> I have also looked at building a custom provider, but I can't figure out how to build one that not only gets the IP address, but manages to provide it along the route to my cxfbean.  Is there a way I can do something like get the IP and then set it as a QueryParam for my bean to consume?
>>>>
>>>> Any and all help would be greatly appreciated!
>>>>
>>>
>>> Injection "@Context HttpServletRequest" into the bean itself is one
>>> option. Another one is to inject it into a RequestFilter provider and
>>> update (CXF) Message.QUERY_STRING accordingly - this will let you add
>>> @QueryParam("remoteip") to the method signature
>>>
>>> HTH, Sergey
>>>
>>>>
>>>> Thanks,
>>>> Zach Calvert
>>>>
>>>
>>>
>>> --
>>> Sergey Beryozkin
>>>
>>> Talend Community Coders
>>> http://coders.talend.com/
>>>
>>> Blog: http://sberyozkin.blogspot.com
>
>

RE: Obtain CXF Request?

Posted by "Calvert, Zach (Zach)** CTR **" <zc...@motive.com>.
I found the solution!

You can obtain a reference to the CXF CamelMessage context using
@Context org.apache.cxf.jaxrs.ext.MessageContext cxfMessage
As a parameter in your cxfbean.  From there, you can access the CamelHttpServletRequest using:
((HttpServletRequest)cxfMessage.get("CamelHttpServletRequest")).getRemoteAddr();

Crazy roundabout way to solve the problem, but I'm happy to have found an answer.




Zach Calvert


-----Original Message-----
From: Sergey Beryozkin [mailto:sberyozkin@gmail.com] 
Sent: Tuesday, November 06, 2012 9:05 AM
To: users@camel.apache.org
Subject: Re: Obtain CXF Request?

On 06/11/12 14:53, Calvert, Zach (Zach)** CTR ** wrote:
> Unfortunately no, I'm stuck in 2.6.0.  Are there any other options exposed for obtaining caller's IP address?
>
> Thank you again, your help is very much appreciated!
>
It's a question to Camel experts at this stage :-)

Cheers, Sergey

>
> Thanks,
> Zach
>
>
> -----Original Message-----
> From: Sergey Beryozkin [mailto:sberyozkin@gmail.com]
> Sent: Tuesday, November 06, 2012 8:52 AM
> To: users@camel.apache.org
> Subject: Re: Obtain CXF Request?
>
> On 06/11/12 14:40, Calvert, Zach (Zach)** CTR ** wrote:
>> Thank you for your reply Sergey, unfortunately while the context is populated, I get:
>>
>> java.lang.NullPointerException
>>           at
>> org.apache.cxf.jaxrs.impl.tl.ThreadLocalHttpServletRequest.getRemoteA
>> d
>> dr(ThreadLocalHttpServletRequest.java:223)[119:org.apache.cxf.bundle:
>> 2
>> .3.2]
>> ...
>>
>> So I have a handle to the ThreadLocalHttpServletRequest, but the "get" function isn't being populated.  I've walked the code and the NPE in ThreadLocalHttpServletRequest at 223 corresponds to the function
>>       public String getRemoteAddr() {
>>           return get().getRemoteAddr();
>>       }
>>
>> Get is exposed from AbstractThreadLocalProxy:
>> public T get() {
>>           return infos.get();
>>       }
>>
>> Is there something I need to do to force my context to be populated?
>
> I think HttpServletRequest has to be visible to CXF endpoints starting from Camel 2.10.2, as well the as the latest 2.9.x. Are you working with the older version ?
>
> Cheers, Sergey
>
>>
>> Thank you again!
>>
>>
>>
>> Zach Calvert
>>
>>
>> -----Original Message-----
>> From: Sergey Beryozkin [mailto:sberyozkin@gmail.com]
>> Sent: Tuesday, November 06, 2012 8:13 AM
>> To: users@camel.apache.org
>> Subject: Re: Obtain CXF Request?
>>
>>
>> Hi
>> On 06/11/12 14:02, Calvert, Zach (Zach)** CTR ** wrote:
>>> I am stuck using Camel CXF 2.6.0 (yes, I know I'm behind) and need to get the IP address of the remote system making an HTTP POST to my cxfbean:
>>>            <!-- Define the camel route -->
>>>            <camel:route id="restApis">
>>>                <camel:from uri="jetty:{{protocol}}://0.0.0.0:{{port}}/rest/?matchOnUriPrefix=true&amp;handlers=securityHandler"/>
>>>                <camel:to uri="cxfbean:restfulService?providers=#restExceptionMapper" />
>>>                <camel:log message="done"/>
>>>            </camel:route>
>>>
>>> My restfulService handles the posts.  When I turn on tracing, I see
>>>
>>> 07:10:29,783 | INFO  | qtp26579196-144  | Tracer                           | 76 - org.apache.camel.camel-core - 2.6.0 | ID-centora-45480-1352207331927-4-1>>>    (restApis) from(https://0.0.0.0:9091/rest/?matchOnUriPrefix=true&handlers=securityHandler) -->    restfulService<<<    Pattern:InOut, Headers:{Host=test.com:9091, CamelHttpMethod=POST, CamelHttpServletRequest=[POST /rest/domain/feed]@19570394 org.eclipse.jetty.server.Request@12a9eda, Accept-Encoding=gzip,deflate, CamelHttpServletResponse=HTTP/1.1 200
>>>
>>> In my bean I have the function
>>>        @POST
>>>        @Path("{domainName}/{domainChild}")
>>>        @Consumes({MediaType.APPLICATION_RESTMS_XML, MediaType.APPLICATION_RESTMS_JSON, MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
>>>        @Produces({MediaType.APPLICATION_RESTMS_XML, MediaType.APPLICATION_RESTMS_JSON, MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
>>>        public Response post(@PathParam("domainName") String domainName,
>>>                @PathParam("domainChild") String domainChildName,
>>>                JAXBElement<RestXml>    restXml) { ...
>>> }
>>>
>>> I have tried to add the parameter Exchange (camel), Exchange (cxf), Message, etc all to no avail due to no longer having a mapping for my sample test post.  I want to know if there is a way for me to access that header "CamelHttpServletRequest" inside of this bean's function?  My end goal is simply to get the HttpRequest or ServletRequest or whatever request that will have the "getRemoteAddress" function exposed on it.  I've been through the jaxrs core annotations and cannot seem to figure out how to get a handle to the original incoming request, or any context object that may contain the IP address of whoever is making the call to my servlet.  I thought maybe UriInfo or Request (from javax.ws.rs.core) contexts would have the info I'm looking for, but if they do, I can't figure them out.
>>>
>>> I have also looked at building a custom provider, but I can't figure out how to build one that not only gets the IP address, but manages to provide it along the route to my cxfbean.  Is there a way I can do something like get the IP and then set it as a QueryParam for my bean to consume?
>>>
>>> Any and all help would be greatly appreciated!
>>>
>>
>> Injection "@Context HttpServletRequest" into the bean itself is one 
>> option. Another one is to inject it into a RequestFilter provider and 
>> update (CXF) Message.QUERY_STRING accordingly - this will let you add
>> @QueryParam("remoteip") to the method signature
>>
>> HTH, Sergey
>>
>>>
>>> Thanks,
>>> Zach Calvert
>>>
>>
>>
>> --
>> Sergey Beryozkin
>>
>> Talend Community Coders
>> http://coders.talend.com/
>>
>> Blog: http://sberyozkin.blogspot.com



Re: Obtain CXF Request?

Posted by Sergey Beryozkin <sb...@gmail.com>.
On 06/11/12 14:53, Calvert, Zach (Zach)** CTR ** wrote:
> Unfortunately no, I'm stuck in 2.6.0.  Are there any other options exposed for obtaining caller's IP address?
>
> Thank you again, your help is very much appreciated!
>
It's a question to Camel experts at this stage :-)

Cheers, Sergey

>
> Thanks,
> Zach
>
>
> -----Original Message-----
> From: Sergey Beryozkin [mailto:sberyozkin@gmail.com]
> Sent: Tuesday, November 06, 2012 8:52 AM
> To: users@camel.apache.org
> Subject: Re: Obtain CXF Request?
>
> On 06/11/12 14:40, Calvert, Zach (Zach)** CTR ** wrote:
>> Thank you for your reply Sergey, unfortunately while the context is populated, I get:
>>
>> java.lang.NullPointerException
>>           at
>> org.apache.cxf.jaxrs.impl.tl.ThreadLocalHttpServletRequest.getRemoteAd
>> dr(ThreadLocalHttpServletRequest.java:223)[119:org.apache.cxf.bundle:2
>> .3.2]
>> ...
>>
>> So I have a handle to the ThreadLocalHttpServletRequest, but the "get" function isn't being populated.  I've walked the code and the NPE in ThreadLocalHttpServletRequest at 223 corresponds to the function
>>       public String getRemoteAddr() {
>>           return get().getRemoteAddr();
>>       }
>>
>> Get is exposed from AbstractThreadLocalProxy:
>> public T get() {
>>           return infos.get();
>>       }
>>
>> Is there something I need to do to force my context to be populated?
>
> I think HttpServletRequest has to be visible to CXF endpoints starting from Camel 2.10.2, as well the as the latest 2.9.x. Are you working with the older version ?
>
> Cheers, Sergey
>
>>
>> Thank you again!
>>
>>
>>
>> Zach Calvert
>>
>>
>> -----Original Message-----
>> From: Sergey Beryozkin [mailto:sberyozkin@gmail.com]
>> Sent: Tuesday, November 06, 2012 8:13 AM
>> To: users@camel.apache.org
>> Subject: Re: Obtain CXF Request?
>>
>>
>> Hi
>> On 06/11/12 14:02, Calvert, Zach (Zach)** CTR ** wrote:
>>> I am stuck using Camel CXF 2.6.0 (yes, I know I'm behind) and need to get the IP address of the remote system making an HTTP POST to my cxfbean:
>>>            <!-- Define the camel route -->
>>>            <camel:route id="restApis">
>>>                <camel:from uri="jetty:{{protocol}}://0.0.0.0:{{port}}/rest/?matchOnUriPrefix=true&amp;handlers=securityHandler"/>
>>>                <camel:to uri="cxfbean:restfulService?providers=#restExceptionMapper" />
>>>                <camel:log message="done"/>
>>>            </camel:route>
>>>
>>> My restfulService handles the posts.  When I turn on tracing, I see
>>>
>>> 07:10:29,783 | INFO  | qtp26579196-144  | Tracer                           | 76 - org.apache.camel.camel-core - 2.6.0 | ID-centora-45480-1352207331927-4-1>>>    (restApis) from(https://0.0.0.0:9091/rest/?matchOnUriPrefix=true&handlers=securityHandler) -->    restfulService<<<    Pattern:InOut, Headers:{Host=test.com:9091, CamelHttpMethod=POST, CamelHttpServletRequest=[POST /rest/domain/feed]@19570394 org.eclipse.jetty.server.Request@12a9eda, Accept-Encoding=gzip,deflate, CamelHttpServletResponse=HTTP/1.1 200
>>>
>>> In my bean I have the function
>>>        @POST
>>>        @Path("{domainName}/{domainChild}")
>>>        @Consumes({MediaType.APPLICATION_RESTMS_XML, MediaType.APPLICATION_RESTMS_JSON, MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
>>>        @Produces({MediaType.APPLICATION_RESTMS_XML, MediaType.APPLICATION_RESTMS_JSON, MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
>>>        public Response post(@PathParam("domainName") String domainName,
>>>                @PathParam("domainChild") String domainChildName,
>>>                JAXBElement<RestXml>    restXml) { ...
>>> }
>>>
>>> I have tried to add the parameter Exchange (camel), Exchange (cxf), Message, etc all to no avail due to no longer having a mapping for my sample test post.  I want to know if there is a way for me to access that header "CamelHttpServletRequest" inside of this bean's function?  My end goal is simply to get the HttpRequest or ServletRequest or whatever request that will have the "getRemoteAddress" function exposed on it.  I've been through the jaxrs core annotations and cannot seem to figure out how to get a handle to the original incoming request, or any context object that may contain the IP address of whoever is making the call to my servlet.  I thought maybe UriInfo or Request (from javax.ws.rs.core) contexts would have the info I'm looking for, but if they do, I can't figure them out.
>>>
>>> I have also looked at building a custom provider, but I can't figure out how to build one that not only gets the IP address, but manages to provide it along the route to my cxfbean.  Is there a way I can do something like get the IP and then set it as a QueryParam for my bean to consume?
>>>
>>> Any and all help would be greatly appreciated!
>>>
>>
>> Injection "@Context HttpServletRequest" into the bean itself is one
>> option. Another one is to inject it into a RequestFilter provider and
>> update (CXF) Message.QUERY_STRING accordingly - this will let you add
>> @QueryParam("remoteip") to the method signature
>>
>> HTH, Sergey
>>
>>>
>>> Thanks,
>>> Zach Calvert
>>>
>>
>>
>> --
>> Sergey Beryozkin
>>
>> Talend Community Coders
>> http://coders.talend.com/
>>
>> Blog: http://sberyozkin.blogspot.com



RE: Obtain CXF Request?

Posted by "Calvert, Zach (Zach)** CTR **" <zc...@motive.com>.
Unfortunately no, I'm stuck in 2.6.0.  Are there any other options exposed for obtaining caller's IP address?  

Thank you again, your help is very much appreciated!


Thanks,
Zach


-----Original Message-----
From: Sergey Beryozkin [mailto:sberyozkin@gmail.com] 
Sent: Tuesday, November 06, 2012 8:52 AM
To: users@camel.apache.org
Subject: Re: Obtain CXF Request?

On 06/11/12 14:40, Calvert, Zach (Zach)** CTR ** wrote:
> Thank you for your reply Sergey, unfortunately while the context is populated, I get:
>
> java.lang.NullPointerException
>          at 
> org.apache.cxf.jaxrs.impl.tl.ThreadLocalHttpServletRequest.getRemoteAd
> dr(ThreadLocalHttpServletRequest.java:223)[119:org.apache.cxf.bundle:2
> .3.2]
> ...
>
> So I have a handle to the ThreadLocalHttpServletRequest, but the "get" function isn't being populated.  I've walked the code and the NPE in ThreadLocalHttpServletRequest at 223 corresponds to the function
>      public String getRemoteAddr() {
>          return get().getRemoteAddr();
>      }
>
> Get is exposed from AbstractThreadLocalProxy:
> public T get() {
>          return infos.get();
>      }
>
> Is there something I need to do to force my context to be populated?

I think HttpServletRequest has to be visible to CXF endpoints starting from Camel 2.10.2, as well the as the latest 2.9.x. Are you working with the older version ?

Cheers, Sergey

>
> Thank you again!
>
>
>
> Zach Calvert
>
>
> -----Original Message-----
> From: Sergey Beryozkin [mailto:sberyozkin@gmail.com]
> Sent: Tuesday, November 06, 2012 8:13 AM
> To: users@camel.apache.org
> Subject: Re: Obtain CXF Request?
>
>
> Hi
> On 06/11/12 14:02, Calvert, Zach (Zach)** CTR ** wrote:
>> I am stuck using Camel CXF 2.6.0 (yes, I know I'm behind) and need to get the IP address of the remote system making an HTTP POST to my cxfbean:
>>           <!-- Define the camel route -->
>>           <camel:route id="restApis">
>>               <camel:from uri="jetty:{{protocol}}://0.0.0.0:{{port}}/rest/?matchOnUriPrefix=true&amp;handlers=securityHandler"/>
>>               <camel:to uri="cxfbean:restfulService?providers=#restExceptionMapper" />
>>               <camel:log message="done"/>
>>           </camel:route>
>>
>> My restfulService handles the posts.  When I turn on tracing, I see
>>
>> 07:10:29,783 | INFO  | qtp26579196-144  | Tracer                           | 76 - org.apache.camel.camel-core - 2.6.0 | ID-centora-45480-1352207331927-4-1>>>   (restApis) from(https://0.0.0.0:9091/rest/?matchOnUriPrefix=true&handlers=securityHandler) -->   restfulService<<<   Pattern:InOut, Headers:{Host=test.com:9091, CamelHttpMethod=POST, CamelHttpServletRequest=[POST /rest/domain/feed]@19570394 org.eclipse.jetty.server.Request@12a9eda, Accept-Encoding=gzip,deflate, CamelHttpServletResponse=HTTP/1.1 200
>>
>> In my bean I have the function
>>       @POST
>>       @Path("{domainName}/{domainChild}")
>>       @Consumes({MediaType.APPLICATION_RESTMS_XML, MediaType.APPLICATION_RESTMS_JSON, MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
>>       @Produces({MediaType.APPLICATION_RESTMS_XML, MediaType.APPLICATION_RESTMS_JSON, MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
>>       public Response post(@PathParam("domainName") String domainName,
>>               @PathParam("domainChild") String domainChildName,
>>               JAXBElement<RestXml>   restXml) { ...
>> }
>>
>> I have tried to add the parameter Exchange (camel), Exchange (cxf), Message, etc all to no avail due to no longer having a mapping for my sample test post.  I want to know if there is a way for me to access that header "CamelHttpServletRequest" inside of this bean's function?  My end goal is simply to get the HttpRequest or ServletRequest or whatever request that will have the "getRemoteAddress" function exposed on it.  I've been through the jaxrs core annotations and cannot seem to figure out how to get a handle to the original incoming request, or any context object that may contain the IP address of whoever is making the call to my servlet.  I thought maybe UriInfo or Request (from javax.ws.rs.core) contexts would have the info I'm looking for, but if they do, I can't figure them out.
>>
>> I have also looked at building a custom provider, but I can't figure out how to build one that not only gets the IP address, but manages to provide it along the route to my cxfbean.  Is there a way I can do something like get the IP and then set it as a QueryParam for my bean to consume?
>>
>> Any and all help would be greatly appreciated!
>>
>
> Injection "@Context HttpServletRequest" into the bean itself is one 
> option. Another one is to inject it into a RequestFilter provider and 
> update (CXF) Message.QUERY_STRING accordingly - this will let you add
> @QueryParam("remoteip") to the method signature
>
> HTH, Sergey
>
>>
>> Thanks,
>> Zach Calvert
>>
>
>
> --
> Sergey Beryozkin
>
> Talend Community Coders
> http://coders.talend.com/
>
> Blog: http://sberyozkin.blogspot.com

Re: Obtain CXF Request?

Posted by Sergey Beryozkin <sb...@gmail.com>.
On 06/11/12 14:40, Calvert, Zach (Zach)** CTR ** wrote:
> Thank you for your reply Sergey, unfortunately while the context is populated, I get:
>
> java.lang.NullPointerException
>          at org.apache.cxf.jaxrs.impl.tl.ThreadLocalHttpServletRequest.getRemoteAddr(ThreadLocalHttpServletRequest.java:223)[119:org.apache.cxf.bundle:2.3.2]
> ...
>
> So I have a handle to the ThreadLocalHttpServletRequest, but the "get" function isn't being populated.  I've walked the code and the NPE in ThreadLocalHttpServletRequest at 223 corresponds to the function
>      public String getRemoteAddr() {
>          return get().getRemoteAddr();
>      }
>
> Get is exposed from AbstractThreadLocalProxy:
> public T get() {
>          return infos.get();
>      }
>
> Is there something I need to do to force my context to be populated?

I think HttpServletRequest has to be visible to CXF endpoints starting 
from Camel 2.10.2, as well the as the latest 2.9.x. Are you working with 
the older version ?

Cheers, Sergey

>
> Thank you again!
>
>
>
> Zach Calvert
>
>
> -----Original Message-----
> From: Sergey Beryozkin [mailto:sberyozkin@gmail.com]
> Sent: Tuesday, November 06, 2012 8:13 AM
> To: users@camel.apache.org
> Subject: Re: Obtain CXF Request?
>
>
> Hi
> On 06/11/12 14:02, Calvert, Zach (Zach)** CTR ** wrote:
>> I am stuck using Camel CXF 2.6.0 (yes, I know I'm behind) and need to get the IP address of the remote system making an HTTP POST to my cxfbean:
>>           <!-- Define the camel route -->
>>           <camel:route id="restApis">
>>               <camel:from uri="jetty:{{protocol}}://0.0.0.0:{{port}}/rest/?matchOnUriPrefix=true&amp;handlers=securityHandler"/>
>>               <camel:to uri="cxfbean:restfulService?providers=#restExceptionMapper" />
>>               <camel:log message="done"/>
>>           </camel:route>
>>
>> My restfulService handles the posts.  When I turn on tracing, I see
>>
>> 07:10:29,783 | INFO  | qtp26579196-144  | Tracer                           | 76 - org.apache.camel.camel-core - 2.6.0 | ID-centora-45480-1352207331927-4-1>>>   (restApis) from(https://0.0.0.0:9091/rest/?matchOnUriPrefix=true&handlers=securityHandler) -->   restfulService<<<   Pattern:InOut, Headers:{Host=test.com:9091, CamelHttpMethod=POST, CamelHttpServletRequest=[POST /rest/domain/feed]@19570394 org.eclipse.jetty.server.Request@12a9eda, Accept-Encoding=gzip,deflate, CamelHttpServletResponse=HTTP/1.1 200
>>
>> In my bean I have the function
>>       @POST
>>       @Path("{domainName}/{domainChild}")
>>       @Consumes({MediaType.APPLICATION_RESTMS_XML, MediaType.APPLICATION_RESTMS_JSON, MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
>>       @Produces({MediaType.APPLICATION_RESTMS_XML, MediaType.APPLICATION_RESTMS_JSON, MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
>>       public Response post(@PathParam("domainName") String domainName,
>>               @PathParam("domainChild") String domainChildName,
>>               JAXBElement<RestXml>   restXml) { ...
>> }
>>
>> I have tried to add the parameter Exchange (camel), Exchange (cxf), Message, etc all to no avail due to no longer having a mapping for my sample test post.  I want to know if there is a way for me to access that header "CamelHttpServletRequest" inside of this bean's function?  My end goal is simply to get the HttpRequest or ServletRequest or whatever request that will have the "getRemoteAddress" function exposed on it.  I've been through the jaxrs core annotations and cannot seem to figure out how to get a handle to the original incoming request, or any context object that may contain the IP address of whoever is making the call to my servlet.  I thought maybe UriInfo or Request (from javax.ws.rs.core) contexts would have the info I'm looking for, but if they do, I can't figure them out.
>>
>> I have also looked at building a custom provider, but I can't figure out how to build one that not only gets the IP address, but manages to provide it along the route to my cxfbean.  Is there a way I can do something like get the IP and then set it as a QueryParam for my bean to consume?
>>
>> Any and all help would be greatly appreciated!
>>
>
> Injection "@Context HttpServletRequest" into the bean itself is one option. Another one is to inject it into a RequestFilter provider and update (CXF) Message.QUERY_STRING accordingly - this will let you add
> @QueryParam("remoteip") to the method signature
>
> HTH, Sergey
>
>>
>> Thanks,
>> Zach Calvert
>>
>
>
> --
> Sergey Beryozkin
>
> Talend Community Coders
> http://coders.talend.com/
>
> Blog: http://sberyozkin.blogspot.com

RE: Obtain CXF Request?

Posted by "Calvert, Zach (Zach)** CTR **" <zc...@motive.com>.
Thank you for your reply Sergey, unfortunately while the context is populated, I get:

java.lang.NullPointerException
        at org.apache.cxf.jaxrs.impl.tl.ThreadLocalHttpServletRequest.getRemoteAddr(ThreadLocalHttpServletRequest.java:223)[119:org.apache.cxf.bundle:2.3.2]
...

So I have a handle to the ThreadLocalHttpServletRequest, but the "get" function isn't being populated.  I've walked the code and the NPE in ThreadLocalHttpServletRequest at 223 corresponds to the function
    public String getRemoteAddr() {
        return get().getRemoteAddr();
    }

Get is exposed from AbstractThreadLocalProxy:
public T get() {
        return infos.get();
    }

Is there something I need to do to force my context to be populated?

Thank you again!



Zach Calvert


-----Original Message-----
From: Sergey Beryozkin [mailto:sberyozkin@gmail.com] 
Sent: Tuesday, November 06, 2012 8:13 AM
To: users@camel.apache.org
Subject: Re: Obtain CXF Request?


Hi
On 06/11/12 14:02, Calvert, Zach (Zach)** CTR ** wrote:
> I am stuck using Camel CXF 2.6.0 (yes, I know I'm behind) and need to get the IP address of the remote system making an HTTP POST to my cxfbean:
>          <!-- Define the camel route -->
>          <camel:route id="restApis">
>              <camel:from uri="jetty:{{protocol}}://0.0.0.0:{{port}}/rest/?matchOnUriPrefix=true&amp;handlers=securityHandler"/>
>              <camel:to uri="cxfbean:restfulService?providers=#restExceptionMapper" />
>              <camel:log message="done"/>
>          </camel:route>
>
> My restfulService handles the posts.  When I turn on tracing, I see
>
> 07:10:29,783 | INFO  | qtp26579196-144  | Tracer                           | 76 - org.apache.camel.camel-core - 2.6.0 | ID-centora-45480-1352207331927-4-1>>>  (restApis) from(https://0.0.0.0:9091/rest/?matchOnUriPrefix=true&handlers=securityHandler) -->  restfulService<<<  Pattern:InOut, Headers:{Host=test.com:9091, CamelHttpMethod=POST, CamelHttpServletRequest=[POST /rest/domain/feed]@19570394 org.eclipse.jetty.server.Request@12a9eda, Accept-Encoding=gzip,deflate, CamelHttpServletResponse=HTTP/1.1 200
>
> In my bean I have the function
>      @POST
>      @Path("{domainName}/{domainChild}")
>      @Consumes({MediaType.APPLICATION_RESTMS_XML, MediaType.APPLICATION_RESTMS_JSON, MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
>      @Produces({MediaType.APPLICATION_RESTMS_XML, MediaType.APPLICATION_RESTMS_JSON, MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
>      public Response post(@PathParam("domainName") String domainName,
>              @PathParam("domainChild") String domainChildName,
>              JAXBElement<RestXml>  restXml) { ...
> }
>
> I have tried to add the parameter Exchange (camel), Exchange (cxf), Message, etc all to no avail due to no longer having a mapping for my sample test post.  I want to know if there is a way for me to access that header "CamelHttpServletRequest" inside of this bean's function?  My end goal is simply to get the HttpRequest or ServletRequest or whatever request that will have the "getRemoteAddress" function exposed on it.  I've been through the jaxrs core annotations and cannot seem to figure out how to get a handle to the original incoming request, or any context object that may contain the IP address of whoever is making the call to my servlet.  I thought maybe UriInfo or Request (from javax.ws.rs.core) contexts would have the info I'm looking for, but if they do, I can't figure them out.
>
> I have also looked at building a custom provider, but I can't figure out how to build one that not only gets the IP address, but manages to provide it along the route to my cxfbean.  Is there a way I can do something like get the IP and then set it as a QueryParam for my bean to consume?
>
> Any and all help would be greatly appreciated!
>

Injection "@Context HttpServletRequest" into the bean itself is one option. Another one is to inject it into a RequestFilter provider and update (CXF) Message.QUERY_STRING accordingly - this will let you add
@QueryParam("remoteip") to the method signature

HTH, Sergey

>
> Thanks,
> Zach Calvert
>


--
Sergey Beryozkin

Talend Community Coders
http://coders.talend.com/

Blog: http://sberyozkin.blogspot.com

Re: Obtain CXF Request?

Posted by Sergey Beryozkin <sb...@gmail.com>.
Hi
On 06/11/12 14:02, Calvert, Zach (Zach)** CTR ** wrote:
> I am stuck using Camel CXF 2.6.0 (yes, I know I'm behind) and need to get the IP address of the remote system making an HTTP POST to my cxfbean:
>          <!-- Define the camel route -->
>          <camel:route id="restApis">
>              <camel:from uri="jetty:{{protocol}}://0.0.0.0:{{port}}/rest/?matchOnUriPrefix=true&amp;handlers=securityHandler"/>
>              <camel:to uri="cxfbean:restfulService?providers=#restExceptionMapper" />
>              <camel:log message="done"/>
>          </camel:route>
>
> My restfulService handles the posts.  When I turn on tracing, I see
>
> 07:10:29,783 | INFO  | qtp26579196-144  | Tracer                           | 76 - org.apache.camel.camel-core - 2.6.0 | ID-centora-45480-1352207331927-4-1>>>  (restApis) from(https://0.0.0.0:9091/rest/?matchOnUriPrefix=true&handlers=securityHandler) -->  restfulService<<<  Pattern:InOut, Headers:{Host=test.com:9091, CamelHttpMethod=POST, CamelHttpServletRequest=[POST /rest/domain/feed]@19570394 org.eclipse.jetty.server.Request@12a9eda, Accept-Encoding=gzip,deflate, CamelHttpServletResponse=HTTP/1.1 200
>
> In my bean I have the function
>      @POST
>      @Path("{domainName}/{domainChild}")
>      @Consumes({MediaType.APPLICATION_RESTMS_XML, MediaType.APPLICATION_RESTMS_JSON, MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
>      @Produces({MediaType.APPLICATION_RESTMS_XML, MediaType.APPLICATION_RESTMS_JSON, MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
>      public Response post(@PathParam("domainName") String domainName,
>              @PathParam("domainChild") String domainChildName,
>              JAXBElement<RestXml>  restXml) {
> ...
> }
>
> I have tried to add the parameter Exchange (camel), Exchange (cxf), Message, etc all to no avail due to no longer having a mapping for my sample test post.  I want to know if there is a way for me to access that header "CamelHttpServletRequest" inside of this bean's function?  My end goal is simply to get the HttpRequest or ServletRequest or whatever request that will have the "getRemoteAddress" function exposed on it.  I've been through the jaxrs core annotations and cannot seem to figure out how to get a handle to the original incoming request, or any context object that may contain the IP address of whoever is making the call to my servlet.  I thought maybe UriInfo or Request (from javax.ws.rs.core) contexts would have the info I'm looking for, but if they do, I can't figure them out.
>
> I have also looked at building a custom provider, but I can't figure out how to build one that not only gets the IP address, but manages to provide it along the route to my cxfbean.  Is there a way I can do something like get the IP and then set it as a QueryParam for my bean to consume?
>
> Any and all help would be greatly appreciated!
>

Injection "@Context HttpServletRequest" into the bean itself is one 
option. Another one is to inject it into a RequestFilter provider and 
update (CXF) Message.QUERY_STRING accordingly - this will let you add 
@QueryParam("remoteip") to the method signature

HTH, Sergey

>
> Thanks,
> Zach Calvert
>


-- 
Sergey Beryozkin

Talend Community Coders
http://coders.talend.com/

Blog: http://sberyozkin.blogspot.com