camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Willem Jiang <willem.ji...@gmail.com>
Subject Re: HTTP parameter bug (was passing the HTTPServletRequest from Jetty to a SEDA consumer in Spring DSL)
Date Thu, 21 Jan 2010 09:52:44 GMT
I just did a quick test on camel trunk, you can get the URL parameters 
by using the
exchange.getIn().getHeader(Exchange.HTTP_QUERY)
When you post the binary data with URI Query.

I just took a look at camel-http and found we could parser the URL 
parameter for the post method.

So I created a JIRA[1] and will submit a quick fix for it.

[1] https://issues.apache.org/activemq/browse/CAMEL-2386

Willem

Wayne Keenan wrote:
> Hi,
> 
> Nope, I am POSTing binary data as the body with a content-type of  '
> application/octet-stream', and am sending additional parameters in the URI
> Query that are not appearing as Camel headers.
> 
> Perhaps this is not 'best practice', and the body should be multipart MIME
> encoded so it can be POST'ed as application/x-www-form-urlencoded, but AFAIK
> what I'm currently doing isn't outlawed by HTTP.
> 
> Regards
> Wayne
> 
> On Thu, Jan 21, 2010 at 12:55 AM, Willem Jiang <willem.jiang@gmail.com>wrote:
> 
>> Hi,
>>
>> Is your post request using "application/x-www-form-urlencoded" as the
>> content-type ?
>> If so , you should get the parameters from the message header.
>>
>>
>> Willem
>>
>> Wayne Keenan wrote:
>>
>>> Hi,
>>>
>>> I believe I have found the trouble I am having.  I think this bug still
>>> exists in the 2.1.0 release:
>>> http://issues.apache.org/activemq/browse/CAMEL-1806
>>>
>>> The docs says from: http://camel.apache.org/jetty.html says:
>>>
>>> *Camel also populates all request.parameter and request.headers. For
>>> example, given a client request with the URL,
>>> http://myserver/myserver?orderid=123, the exchange will contain a header
>>> named orderid with the value 123. This feature was introduced in Camel
>>> 1.5.*
>>>
>>> However, the header parameters are only set for GET, not PUT or POST.
>>>
>>> Regards
>>> Wayne
>>>
>>>
>>> On Wed, Jan 20, 2010 at 4:16 PM, Wayne Keenan <wayne.keenan@gmail.com
>>>> wrote:
>>>  Hi,
>>>> Thanks for replying.
>>>>
>>>> On Wed, Jan 20, 2010 at 3:28 PM, Willem Jiang <willem.jiang@gmail.com
>>>>> wrote:
>>>>  Hi,
>>>>> Can you try to set the ID into the message header instead of the message
>>>>> body ? In this way you can the Request object back :)
>>>>>
>>>>>
>>>>>        <route>
>>>>>>>            <from uri="jetty:http://0.0.0.0:8080/endpoint"/>
>>>>>>>            <inOnly uri="seda:sendASync"/>
>>>>>>>            <setHeader headerName="id">
>>>>>>>                 <simple>${id}</simple>
>>>>>>>            </setHeader>
>>>>>>>        </route>
>>>>>>>
>>>>>>>        <route>
>>>>>>>            <from uri="seda:sendASync"/>
>>>>>>>            <to uri="bean:myBean"/>
>>>>>>>        </route>
>>>>>>>
>>>>>> You bean's method could
>>>>> public String controller(@Header("id")String body, Exchange exchange)
;
>>>>>
>>>>>
>>>>>
>>>>>  The request body contains base64 encoded POST I want.
>>>> I can get to the body, url paramters and the ID ok without the
>>>> intermediate
>>>> SEDA route, in the bean I have:
>>>>
>>>>
>>>>
>>>>      HttpServletRequest req =
>>>> exchange.getIn().getBody(HttpServletRequest.class);
>>>>
>>>>      def corrId = exchange.getIn().getMessageId()
>>>>
>>>> I also can get to the URL (not form encoded) parameters   (e.g. the URL
>>>> is:
>>>> http://0.0.0.0:65503/endpoint?myParam=value) by using:
>>>>
>>>>      def p1 = req?.getParameter('myParam')
>>>>
>>>>
>>>>
>>>> It's ony when I introduce the SEDA that the HttpServletRequest no longer
>>>> exists,  (I think), and I am unable to obtain the HTTP parameters from
>>>> the
>>>> URL
>>>>
>>>> Perhaps I should be copying the HTTP parameters to Camel message
>>>> properties?  That way my bean can be less dependent on the HTTP protocol.
>>>>
>>>> Is that something someone would be able to give me an example of please?
>>>> Is there a built-in way to auto populate Camel message properties with
>>>> HTTP
>>>> properties
>>>>
>>>> Alternatively, sticking with HTTP aware bean,I just get null using:
>>>>
>>>> println exchange.getProperty(Exchange.HTTP_QUERY)
>>>> or
>>>> println exchange.getIn().getProperty(Exchange.HTTP_QUERY)
>>>>
>>>>
>>>>
>>>> Regards
>>>> Wayne
>>>>
>>>>
>>>>
>>>>  Willem
>>>>>
>>>>> Wayne Keenan wrote:
>>>>>
>>>>>  Hi,
>>>>>> Apologies, I didn't word my previous email very well; what I should
>>>>>> have
>>>>>> also mentioned for clarity is that if I do this:
>>>>>>
>>>>>>       <route>
>>>>>>           <from uri="jetty:http://0.0.0.0:8080/endpoint"/>
>>>>>>           <to uri="bean:myBean"/>
>>>>>>           <transform>
>>>>>>               <simple>${id}</simple>
>>>>>>           </transform>
>>>>>>       </route>
>>>>>>
>>>>>> The same bean is able to obtain the HTTPServletRequest to get the
POST
>>>>>> data
>>>>>> (base64 encoded binary) andthe URL parameters,  however,  if I
>>>>>> introduce
>>>>>> the
>>>>>> SEDA
>>>>>> call the same bean can't get the HTTPServletRequest. The salient
bean
>>>>>> code
>>>>>> is:
>>>>>>
>>>>>>  public String controller(String body, Exchange exchange) {
>>>>>>
>>>>>>   try {
>>>>>>     HttpServletRequest req =
>>>>>> exchange.getIn().getBody(HttpServletRequest.class);
>>>>>>
>>>>>>
>>>>>> Regards
>>>>>> Wayne
>>>>>>
>>>>>> On Wed, Jan 20, 2010 at 9:02 AM, Wayne Keenan <wayne.keenan@gmail.com
>>>>>>
>>>>>>> wrote:
>>>>>>>
>>>>>>  Hi,
>>>>>>
>>>>>>> I have a Jetty endpoint that when recieving a message will perform
the
>>>>>>> processing asynchronously and syncronously return a correlationId
so
>>>>>>> the
>>>>>>> client can come back later to another endpoint to see how processsing
>>>>>>> is
>>>>>>> going.
>>>>>>>
>>>>>>> I found an example on the mailing list of how to pass the HttpSession
>>>>>>> object using Java, but I can't seem to find out how
>>>>>>> to reference or pass the HttpRequest using SpringDSL.  What I
have at
>>>>>>> the
>>>>>>> moment is:
>>>>>>>
>>>>>>>
>>>>>>>       <route>
>>>>>>>           <from uri="jetty:http://0.0.0.0:8080/endpoint"/>
>>>>>>>           <inOnly uri="seda:sendASync"/>
>>>>>>>           <transform>
>>>>>>>               <simple>${id}</simple>
>>>>>>>           </transform>
>>>>>>>       </route>
>>>>>>>
>>>>>>>       <route>
>>>>>>>           <from uri="seda:sendASync"/>
>>>>>>>           <to uri="bean:myBean"/>
>>>>>>>       </route>
>>>>>>>
>>>>>>> Is there a way to say 'pass the HTTP stuff through please Mr
SEDA'?
>>>>>>> Should I really be setting a header property to that of a HTTP
Object?
>>>>>>>  How
>>>>>>> do I obtain it?
>>>>>>> Should I architect this differently?
>>>>>>>
>>>>>>> All the best,
>>>>>>> Wayne
>>>>>>>
>>>>>>>
>>>>>>>
> 


Mime
View raw message