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 <to...@netbrains.com>
> 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.

Reply via email to