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 <[email protected]>
> 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.