CAMEL-8996: undertow support query params in producer
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/044c3ad1 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/044c3ad1 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/044c3ad1 Branch: refs/heads/master Commit: 044c3ad1972ea760786c21c6547624c3903eb4c6 Parents: 47f79a6 Author: Claus Ibsen <davscl...@apache.org> Authored: Fri Jul 24 09:44:26 2015 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Fri Jul 24 09:45:58 2015 +0200 ---------------------------------------------------------------------- .../undertow/DefaultUndertowHttpBinding.java | 14 ----- .../component/undertow/UndertowHelper.java | 55 +++++++++++++++++--- .../component/undertow/UndertowProducer.java | 19 ++++--- .../undertow/UndertowProducerTest.java | 11 ++++ 4 files changed, 72 insertions(+), 27 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/044c3ad1/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/DefaultUndertowHttpBinding.java ---------------------------------------------------------------------- diff --git a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/DefaultUndertowHttpBinding.java b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/DefaultUndertowHttpBinding.java index e19d46d..d5825f4 100644 --- a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/DefaultUndertowHttpBinding.java +++ b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/DefaultUndertowHttpBinding.java @@ -270,20 +270,6 @@ public class DefaultUndertowHttpBinding implements UndertowHttpBinding { Object body = message.getBody(); - String method = message.getHeader(Exchange.HTTP_METHOD, String.class); - - if (method == null) { - //fallback if method is not defined, check the body - if (body == null) { - clientRequest.setMethod(Methods.GET); - } else { - clientRequest.setMethod(Methods.POST); - } - } else { - //method set, use it - clientRequest.setMethod(new HttpString(method)); - } - // set the content type in the response. String contentType = MessageHelper.getContentType(message); if (contentType != null) { http://git-wip-us.apache.org/repos/asf/camel/blob/044c3ad1/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowHelper.java ---------------------------------------------------------------------- diff --git a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowHelper.java b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowHelper.java index 8b55ccc..afbe2a2 100644 --- a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowHelper.java +++ b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowHelper.java @@ -22,6 +22,8 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import io.undertow.util.HttpString; +import io.undertow.util.Methods; import org.apache.camel.Exchange; import org.apache.camel.RuntimeExchangeException; import org.apache.camel.util.URISupport; @@ -43,13 +45,7 @@ public final class UndertowHelper { * @return the URL to invoke */ public static String createURL(Exchange exchange, UndertowEndpoint endpoint) { - String uri = null; -// if (!(endpoint.isBridgeEndpoint())) { -// uri = exchange.getIn().getHeader(Exchange.HTTP_URI, String.class); -// } - if (uri == null) { - uri = endpoint.getHttpURI().toASCIIString(); - } + String uri = uri = endpoint.getHttpURI().toASCIIString(); // resolve placeholders in uri try { @@ -124,4 +120,49 @@ public final class UndertowHelper { headers.put(key, value); } + + /** + * Creates the HttpMethod to use to call the remote server, often either its GET or POST. + * + * @param exchange the exchange + * @return the created method + * @throws URISyntaxException + */ + public static HttpString createMethod(Exchange exchange, UndertowEndpoint endpoint, boolean hasPayload) throws URISyntaxException { + // is a query string provided in the endpoint URI or in a header (header + // overrules endpoint) + String queryString = exchange.getIn().getHeader(Exchange.HTTP_QUERY, String.class); + // We need also check the HTTP_URI header query part + String uriString = exchange.getIn().getHeader(Exchange.HTTP_URI, String.class); + // resolve placeholders in uriString + try { + uriString = exchange.getContext().resolvePropertyPlaceholders(uriString); + } catch (Exception e) { + throw new RuntimeExchangeException("Cannot resolve property placeholders with uri: " + uriString, exchange, e); + } + if (uriString != null) { + URI uri = new URI(uriString); + queryString = uri.getQuery(); + } + if (queryString == null) { + queryString = endpoint.getHttpURI().getRawQuery(); + } + + // compute what method to use either GET or POST + HttpString answer; + String m = exchange.getIn().getHeader(Exchange.HTTP_METHOD, String.class); + if (m != null) { + // always use what end-user provides in a header + answer = new HttpString(m); + } else if (queryString != null) { + // if a query string is provided then use GET + answer = Methods.GET; + } else { + // fallback to POST if we have payload, otherwise GET + answer = hasPayload ? Methods.POST : Methods.GET; + } + + return answer; + } + } http://git-wip-us.apache.org/repos/asf/camel/blob/044c3ad1/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowProducer.java ---------------------------------------------------------------------- diff --git a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowProducer.java b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowProducer.java index 3f39e87..84a8b26 100644 --- a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowProducer.java +++ b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowProducer.java @@ -26,6 +26,7 @@ import io.undertow.client.ClientExchange; import io.undertow.client.ClientRequest; import io.undertow.client.UndertowClient; import io.undertow.util.Headers; +import io.undertow.util.HttpString; import io.undertow.util.Protocols; import org.apache.camel.AsyncCallback; import org.apache.camel.Exchange; @@ -78,19 +79,26 @@ public class UndertowProducer extends DefaultAsyncProducer { // get the url from the uri url = uri.toASCIIString(); + // what http method to use + HttpString method = UndertowHelper.createMethod(exchange, endpoint, exchange.getIn().getBody() != null); + ClientRequest request = new ClientRequest(); request.setProtocol(Protocols.HTTP_1_1); request.setPath(url); + request.setMethod(method); Object body = getRequestBody(request, exchange); TypeConverter tc = endpoint.getCamelContext().getTypeConverter(); - ByteBuffer bodyAsByte = tc.convertTo(ByteBuffer.class, body); + ByteBuffer bodyAsByte = tc.tryConvertTo(ByteBuffer.class, body); if (body != null) { request.getRequestHeaders().put(Headers.CONTENT_LENGTH, bodyAsByte.array().length); } + if (LOG.isDebugEnabled()) { + LOG.debug("Executing http {} method: {}", method, url); + } connect.get().sendRequest(request, new UndertowProducerCallback(bodyAsByte, exchange, callback)); } catch (Exception e) { @@ -104,9 +112,7 @@ public class UndertowProducer extends DefaultAsyncProducer { } private Object getRequestBody(ClientRequest request, Exchange camelExchange) { - Object result; - result = endpoint.getUndertowHttpBinding().toHttpRequest(request, camelExchange.getIn()); - return result; + return endpoint.getUndertowHttpBinding().toHttpRequest(request, camelExchange.getIn()); } /** @@ -124,13 +130,12 @@ public class UndertowProducer extends DefaultAsyncProducer { this.callback = callback; } - // TODO: Add some logging of those events at trace or debug level - @Override public void completed(ClientExchange clientExchange) { clientExchange.setResponseListener(new ClientCallback<ClientExchange>() { @Override public void completed(ClientExchange clientExchange) { + LOG.trace("completed: {}", clientExchange); try { Message message = endpoint.getUndertowHttpBinding().toCamelMessage(clientExchange, camelExchange); if (ExchangeHelper.isOutCapable(camelExchange)) { @@ -148,6 +153,7 @@ public class UndertowProducer extends DefaultAsyncProducer { @Override public void failed(IOException e) { + LOG.trace("failed: {}", e); camelExchange.setException(e); // make sure to call callback callback.done(false); @@ -168,6 +174,7 @@ public class UndertowProducer extends DefaultAsyncProducer { @Override public void failed(IOException e) { + LOG.trace("failed: {}", e); camelExchange.setException(e); // make sure to call callback callback.done(false); http://git-wip-us.apache.org/repos/asf/camel/blob/044c3ad1/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/UndertowProducerTest.java ---------------------------------------------------------------------- diff --git a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/UndertowProducerTest.java b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/UndertowProducerTest.java index ce24653..03059ef 100644 --- a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/UndertowProducerTest.java +++ b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/UndertowProducerTest.java @@ -44,6 +44,17 @@ public class UndertowProducerTest extends BaseUndertowTest { } @Test + public void testHttpSimpleWithExchangeHttpQuery() throws Exception { + getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_METHOD, "GET"); + getMockEndpoint("mock:input").expectedHeaderReceived("name", "me"); + + String out = template.requestBodyAndHeader("undertow:http://localhost:{{port}}/foo", null, Exchange.HTTP_QUERY, "name=me", String.class); + assertEquals("Bye World", out); + + assertMockEndpointsSatisfied(); + } + + @Test public void testHttpSimpleHeader() throws Exception { getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_METHOD, "POST");