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/d4432602
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/d4432602
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/d4432602

Branch: refs/heads/camel-2.17.x
Commit: d44326023b184cfc36b3cc554005ef28a130777f
Parents: 98ef048
Author: jmandawg <jmand...@hotmail.com>
Authored: Wed May 18 07:13:57 2016 -0400
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Fri May 20 07:07:03 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/d4432602/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/d4432602/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/d4432602/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);
+    }
 }

Reply via email to