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: URI Escaping in HTTP (and other Producers)
Date Mon, 04 Jul 2011 08:23:42 GMT
It's hard to tell the query string by calling the URLEncoder in side of 
camel http producer, as there are some character means something to the 
URI like "=","?","&".
Ben just showed us a way to build up the Query string by encoding the 
parameter, but the header should be set like this

    exchange.getIn().setHeader(Exchange.HTTPQuery, 
"order="+encoded+"&detail=short");


On 7/2/11 12:06 PM, boday wrote:
> I can't find a DSL API to do this either.  And yes, the value in the
> HTTP_QUERY header is assumed to be encoded by design (so it doesn't double
> encode, etc).
>
> Log a JIRA (and submit a patch if you'd like)...and I'll take a look.
>
> For now, just throw in a simple processor and be done with it...
>
> .process( new Processor() {
> 	public void process(Exchange exchange) throws Exception {
>                  String encoded =
> URLEncoder.encode((String)exchange.getIn().getHeader("orderId"), "UTF-8"));
> 		exchange.getIn().setHeader(Exchange.HTTP_QUERY,encoded);
> 	}
>   })
>
>
> TTar wrote:
>>
>> All,
>>
>> I hate to reply to my own post, but I'm shocked that nobody else sees
>> this as an issue. Sending an HTTP request is obviously a common use
>> case. As soon as you leave the world of unit-tests and enter
>> production-code, URL encoding is inevitably a requirement. Am I really
>> misunderstanding something here? I'm willing to help implement the
>> changes required to support my use-case, but I need some validation
>> that it really doesn't exist today before I go duplicating work.
>>
>> Thanks,
>> Tolga
>>
>> On Wed, May 25, 2011 at 8:29 PM, Tolga Tarhan&lt;tolga@netbrains.com&gt;
>> wrote:
>>>
>>> All,
>>>
>>> I've scoured the internet looking for an answer to something that I
>>> believe should be very simple with Camel: I want to take several
>>> headers and compose them into an HTTP query string in a safe way. The
>>> only examples I've found either use constant(), which isn't useful for
>>> building dynamic query strings, or they use simple() which doesn't
>>> offer URL escaping.
>>>
>>> For example, take the following snippet right from HTTP component's
>>> documentation:
>>>
>>> from("direct:start")
>>>   .setHeader(Exchange.HTTP_QUERY, constant("order=123&detail=short"))
>>>   .to("http://oldhost");
>>>
>>> This is 90% of the way there, but what if you don't always want order
>>> id 123? We'd like to be able to substitute a header value here. So,
>>> the next logical version of this is to switch to simple:
>>>
>>> from("direct:start")
>>>   .setHeader(Exchange.HTTP_QUERY,
>>> simple("order=${header.orderId}&detail=short"))
>>>   .to("http://oldhost");
>>>
>>> But this has the major issue of not being URL encoded. This means that
>>> a space (or any reserved character) in header.orderId results in an
>>> exception thrown by the HTTP component for an invalid query string.
>>>
>>> So the only way that's left is to use JavaScript, which is very
>>> verbose for something like this, or to write a custom processor. It
>>> seems like this should be something that's built-in, so I'm asking
>>> here to see if I'm missing an obvious/normal way to do what I'm
>>> looking for here?
>>>
>>> Thanks for the help,
>>> Tolga
>>
>
>
> -----
> Ben O'Day
> IT Consultant -http://consulting-notes.com
>
> --
> View this message in context: http://camel.465427.n5.nabble.com/URI-Escaping-in-HTTP-and-other-Producers-tp4427457p4543958.html
> Sent from the Camel - Users mailing list archive at Nabble.com.
>


-- 
Willem
----------------------------------
FuseSource
Web: http://www.fusesource.com
Blog:    http://willemjiang.blogspot.com (English)
          http://jnn.javaeye.com (Chinese)
Twitter: willemjiang
Weibo: willemjiang

Mime
View raw message