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"));
             }

Reply via email to