fix for form data
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/38677d2b Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/38677d2b Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/38677d2b Branch: refs/heads/master Commit: 38677d2b58855d5949c5996108410bc3f6b108b6 Parents: 96ba1fe Author: jmandawg <jmand...@hotmail.com> Authored: Tue May 17 20:09:00 2016 -0400 Committer: Claus Ibsen <davscl...@apache.org> Committed: Fri May 20 06:56:26 2016 +0200 ---------------------------------------------------------------------- .../restlet/DefaultRestletBinding.java | 42 ++++++++++++++------ .../restlet/RestletRouteBuilderAuthTest.java | 3 ++ .../restlet/RestletRouteBuilderTest.java | 33 +++++++++++++-- .../restlet/route/TestRouteBuilder.java | 2 +- 4 files changed, 64 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/38677d2b/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 3ab9d1b..5b72b86 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 @@ -20,6 +20,7 @@ import java.io.File; import java.io.InputStream; import java.io.PrintWriter; import java.io.StringWriter; +import java.nio.charset.Charset; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -42,8 +43,11 @@ import org.apache.camel.WrappedFile; import org.apache.camel.component.file.GenericFile; import org.apache.camel.spi.HeaderFilterStrategy; import org.apache.camel.spi.HeaderFilterStrategyAware; +import org.apache.camel.util.IOHelper; import org.apache.camel.util.MessageHelper; import org.apache.camel.util.ObjectHelper; +import org.apache.http.NameValuePair; +import org.apache.http.client.utils.URLEncodedUtils; import org.restlet.Request; import org.restlet.Response; import org.restlet.data.CacheDirective; @@ -90,19 +94,20 @@ public class DefaultRestletBinding implements RestletBinding, HeaderFilterStrate if (!headerFilterStrategy.applyFilterToExternalHeaders(entry.getKey(), entry.getValue(), exchange)) { String key = entry.getKey(); Object value = entry.getValue(); - inMessage.setHeader(key, value); + 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 + inMessage.setHeader(header.getName(), header.getValue()); + } + } + else { + inMessage.setHeader(key, value); + } LOG.debug("Populate exchange from Restlet request header: {} value: {}", key, value); } } - // we need to dig a bit to grab the content-type - Series<Header> series = (Series<Header>) request.getAttributes().get(HeaderConstants.ATTRIBUTE_HEADERS); - if (series != null) { - String type = series.getFirstValue(Exchange.CONTENT_TYPE, true); - if (type != null) { - inMessage.setHeader(Exchange.CONTENT_TYPE, type); - } - } // copy query string to header String query = request.getResourceRef().getQuery(); @@ -168,10 +173,20 @@ public class DefaultRestletBinding implements RestletBinding, HeaderFilterStrate // must use string based for forms String body = exchange.getIn().getBody(String.class); if (body != null) { - form.add(body, null); + List<NameValuePair> pairs = URLEncodedUtils.parse(body, Charset.forName(IOHelper.getCharsetName(exchange, true))); + for(NameValuePair p : pairs){ + form.add(p.getName(), p.getValue()); + } } } + //Get outgoing custom http headers + Series<Header> restletHeaders = (Series)request.getAttributes().get(HeaderConstants.ATTRIBUTE_HEADERS); + if(restletHeaders == null){ + restletHeaders = new Series<>(Header.class); + request.getAttributes().put(HeaderConstants.ATTRIBUTE_HEADERS, restletHeaders); + } + // login and password are filtered by header filter strategy String login = exchange.getIn().getHeader(RestletConstants.RESTLET_LOGIN, String.class); String password = exchange.getIn().getHeader(RestletConstants.RESTLET_PASSWORD, String.class); @@ -196,14 +211,17 @@ 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()); } } else { + //Add headers to headers and to body form.add(key, value.toString()); + restletHeaders.set(key, value.toString()); } } } else { - // For non-form post put all the headers in attributes - request.getAttributes().put(key, value); + // For non-form post put all the headers in custom headers + 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/38677d2b/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletRouteBuilderAuthTest.java ---------------------------------------------------------------------- diff --git a/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletRouteBuilderAuthTest.java b/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletRouteBuilderAuthTest.java index ad85fe3..5241a71 100644 --- a/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletRouteBuilderAuthTest.java +++ b/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletRouteBuilderAuthTest.java @@ -21,8 +21,10 @@ import java.util.HashMap; import java.util.Map; import org.apache.camel.CamelExecutionException; +import org.apache.camel.Exchange; import org.apache.camel.test.spring.CamelSpringTestSupport; import org.junit.Test; +import org.restlet.data.MediaType; import org.springframework.context.support.ClassPathXmlApplicationContext; public class RestletRouteBuilderAuthTest extends CamelSpringTestSupport { @@ -36,6 +38,7 @@ public class RestletRouteBuilderAuthTest extends CamelSpringTestSupport { Map<String, Object> headers = new HashMap<String, Object>(); headers.put(RestletConstants.RESTLET_LOGIN, "admin"); headers.put(RestletConstants.RESTLET_PASSWORD, "foo"); + headers.put(Exchange.CONTENT_TYPE, MediaType.APPLICATION_XML); headers.put("id", id); String response = template.requestBodyAndHeaders( http://git-wip-us.apache.org/repos/asf/camel/blob/38677d2b/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 aedba9f..5d614c5 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 @@ -17,6 +17,8 @@ package org.apache.camel.component.restlet; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; import org.apache.camel.Exchange; import org.apache.camel.Processor; @@ -75,18 +77,34 @@ public class RestletRouteBuilderTest extends RestletTestSupport { + exchange.getIn().getHeader("x")); } }); + + // Restlet consumer to handler FORM POST method + from("restlet:http://localhost:" + portNum + "/login?restletMethod=post").process(new Processor() { + public void process(Exchange exchange) throws Exception { + exchange.getOut().setBody( + "received user: " + + exchange.getIn().getHeader("user") + + "password: " + + exchange.getIn().getHeader("passwd")); + } + }); } }; } @Test public void testProducer() throws IOException { - String response = template.requestBody("direct:start", "<order foo='1'/>", String.class); + Map<String, Object> headers = new HashMap<String, Object>(); + headers.put(Exchange.CONTENT_TYPE, MediaType.APPLICATION_XML); + + String response = template.requestBodyAndHeaders("direct:start", "<order foo='1'/>", headers, String.class); assertEquals("received [<order foo='1'/>] as an order id = " + ID, response); - response = template.requestBodyAndHeader( + headers.put("id", "89531"); + + response = template.requestBodyAndHeaders( "restlet:http://localhost:" + portNum + "/orders?restletMethod=post&foo=bar", - "<order foo='1'/>", "id", "89531", String.class); + "<order foo='1'/>", headers, String.class); assertEquals("received [<order foo='1'/>] as an order id = " + ID, response); } @@ -141,4 +159,13 @@ public class RestletRouteBuilderTest extends RestletTestSupport { assertEquals(Status.CLIENT_ERROR_NOT_FOUND, response.getStatus()); assertNotNull(response.getEntity().getText()); } + + @Test + public void testFormsProducer() throws IOException { + Map<String, Object> headers = new HashMap<String, Object>(); + headers.put(Exchange.CONTENT_TYPE, MediaType.APPLICATION_WWW_FORM); + + String response = template.requestBodyAndHeaders("restlet:http://localhost:" + portNum + "/login?restletMethod=post", "user=jaymandawg&passwd=secret$%", headers, String.class); + assertEquals("received user: jaymandawgpassword: secret$%", response); + } } http://git-wip-us.apache.org/repos/asf/camel/blob/38677d2b/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/route/TestRouteBuilder.java ---------------------------------------------------------------------- diff --git a/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/route/TestRouteBuilder.java b/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/route/TestRouteBuilder.java index b62ddc6..fb30b82 100644 --- a/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/route/TestRouteBuilder.java +++ b/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/route/TestRouteBuilder.java @@ -38,7 +38,7 @@ public class TestRouteBuilder extends RouteBuilder { from("restlet:http://localhost:" + port + "/securedOrders?restletMethod=post&restletRealm=#realm").process(new Processor() { public void process(Exchange exchange) throws Exception { exchange.getOut().setBody( - "received [" + exchange.getIn().getBody() + "received [" + exchange.getIn().getBody(String.class) + "] as an order id = " + exchange.getIn().getHeader("id")); }