Added headerFilterStrategy to places where headers are added. Add option for body to be of type Map for POST form data
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/3254a9b4 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/3254a9b4 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/3254a9b4 Branch: refs/heads/master Commit: 3254a9b479e6ac275c68abcdb420be0b5e47d23f Parents: 38677d2 Author: jmandawg <jmand...@hotmail.com> Authored: Wed May 18 07:13:57 2016 -0400 Committer: Claus Ibsen <davscl...@apache.org> Committed: Fri May 20 06:56:26 2016 +0200 ---------------------------------------------------------------------- .../restlet/DefaultRestletBinding.java | 43 +++++++++++++++----- .../restlet/RestletHeaderFilterStrategy.java | 3 ++ .../restlet/RestletRouteBuilderTest.java | 12 ++++++ 3 files changed, 48 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/3254a9b4/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java ---------------------------------------------------------------------- diff --git a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java index 5b72b86..8083de8 100644 --- a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java +++ b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java @@ -97,7 +97,7 @@ public class DefaultRestletBinding implements RestletBinding, HeaderFilterStrate if(HeaderConstants.ATTRIBUTE_HEADERS.equalsIgnoreCase(key)){ Series<Header> series = (Series<Header>) value; for(Header header: series){ - if(!header.getName().equalsIgnoreCase("Content-length")) //Don't set the content length + if (!headerFilterStrategy.applyFilterToExternalHeaders(header.getName(), header.getValue(), exchange)) inMessage.setHeader(header.getName(), header.getValue()); } } @@ -170,13 +170,30 @@ public class DefaultRestletBinding implements RestletBinding, HeaderFilterStrate // Use forms only for PUT, POST and x-www-form-urlencoded if ((Method.PUT == method || Method.POST == method) && MediaType.APPLICATION_WWW_FORM.equals(mediaType, true)) { form = new Form(); - // must use string based for forms - String body = exchange.getIn().getBody(String.class); - if (body != null) { - List<NameValuePair> pairs = URLEncodedUtils.parse(body, Charset.forName(IOHelper.getCharsetName(exchange, true))); - for(NameValuePair p : pairs){ - form.add(p.getName(), p.getValue()); + + if(exchange.getIn().getBody() instanceof Map) { + //Body is key value pairs + try{ + Map pairs = exchange.getIn().getBody(Map.class); + for(Object key: pairs.keySet()) { + Object value = pairs.get(key); + form.add(key.toString(), value != null ? value.toString() : null); + } } + catch(Exception ex) { + LOG.error("body for " + MediaType.APPLICATION_WWW_FORM + " must be Map<String,String> or string format like name=bob&password=secRet", ex); + + } + } + else { + // use string based for forms + String body = exchange.getIn().getBody(String.class); + if (body != null) { + List<NameValuePair> pairs = URLEncodedUtils.parse(body, Charset.forName(IOHelper.getCharsetName(exchange, true))); + for(NameValuePair p : pairs) { + form.add(p.getName(), p.getValue()); + } + } } } @@ -211,17 +228,23 @@ public class DefaultRestletBinding implements RestletBinding, HeaderFilterStrate if (value instanceof Collection) { for (Object v : (Collection<?>) value) { form.add(key, v.toString()); - restletHeaders.set(key, value.toString()); + if(!headerFilterStrategy.applyFilterToCamelHeaders(key, value, exchange)){ + restletHeaders.set(key, value.toString()); + } } } else { //Add headers to headers and to body form.add(key, value.toString()); - restletHeaders.set(key, value.toString()); + if(!headerFilterStrategy.applyFilterToCamelHeaders(key, value, exchange)){ + restletHeaders.set(key, value.toString()); + } } } } else { // For non-form post put all the headers in custom headers - restletHeaders.set(key, value.toString()); + if(!headerFilterStrategy.applyFilterToCamelHeaders(key, value, exchange)){ + restletHeaders.set(key, value.toString()); + } } LOG.debug("Populate Restlet request from exchange header: {} value: {}", key, value); } http://git-wip-us.apache.org/repos/asf/camel/blob/3254a9b4/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletHeaderFilterStrategy.java ---------------------------------------------------------------------- diff --git a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletHeaderFilterStrategy.java b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletHeaderFilterStrategy.java index 662328c..4ff9c42 100644 --- a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletHeaderFilterStrategy.java +++ b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletHeaderFilterStrategy.java @@ -41,6 +41,9 @@ public class RestletHeaderFilterStrategy extends DefaultHeaderFilterStrategy { // As we don't set the transfer_encoding protocol header for the restlet service // we need to remove the transfer_encoding which could let the client wait forever getOutFilter().add(Exchange.TRANSFER_ENCODING); + + //Don't add the content-length it's added automatically + getOutFilter().add(Exchange.CONTENT_LENGTH); setCaseInsensitive(true); } http://git-wip-us.apache.org/repos/asf/camel/blob/3254a9b4/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletRouteBuilderTest.java ---------------------------------------------------------------------- diff --git a/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletRouteBuilderTest.java b/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletRouteBuilderTest.java index 5d614c5..1c10dde 100644 --- a/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletRouteBuilderTest.java +++ b/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletRouteBuilderTest.java @@ -23,6 +23,7 @@ import java.util.Map; import org.apache.camel.Exchange; import org.apache.camel.Processor; import org.apache.camel.builder.RouteBuilder; +import org.joda.time.DateTime; import org.junit.Test; import org.restlet.Client; import org.restlet.Request; @@ -168,4 +169,15 @@ public class RestletRouteBuilderTest extends RestletTestSupport { String response = template.requestBodyAndHeaders("restlet:http://localhost:" + portNum + "/login?restletMethod=post", "user=jaymandawg&passwd=secret$%", headers, String.class); assertEquals("received user: jaymandawgpassword: secret$%", response); } + + @Test + public void testFormsProducerMapBody() throws IOException { + Map<String, Object> headers = new HashMap<String, Object>(); + headers.put(Exchange.CONTENT_TYPE, MediaType.APPLICATION_WWW_FORM); + Map<String, String> body = new HashMap<>(); + body.put("user", "jaymandawg"); + body.put("passwd", "secret$%"); + String response = template.requestBodyAndHeaders("restlet:http://localhost:" + portNum + "/login?restletMethod=post", body, headers, String.class); + assertEquals("received user: jaymandawgpassword: secret$%", response); + } }