You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2015/07/24 09:39:31 UTC
[3/3] camel git commit: CAMEL-8996: undertow support query params in
producer
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 <da...@apache.org>
Authored: Fri Jul 24 09:44:26 2015 +0200
Committer: Claus Ibsen <da...@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");