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 2016/05/20 05:07:43 UTC

[04/10] camel git commit: Added headerFilterStrategy to places where headers are added. Add option for body to be of type Map for POST form data

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 <jm...@hotmail.com>
Authored: Wed May 18 07:13:57 2016 -0400
Committer: Claus Ibsen <da...@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);
+    }
 }