1
2
3
4
5
6
7 package org.mule.transport.http.transformers;
8
9 import org.mule.api.MuleMessage;
10 import org.mule.api.transformer.TransformerException;
11 import org.mule.transformer.AbstractMessageTransformer;
12 import org.mule.transformer.types.DataTypeFactory;
13 import org.mule.transport.http.HttpConstants;
14 import org.mule.util.StringUtils;
15
16 import java.net.URI;
17 import java.util.Arrays;
18 import java.util.HashMap;
19 import java.util.List;
20 import java.util.Map;
21
22 import org.apache.commons.codec.net.URLCodec;
23
24 public class HttpRequestBodyToParamMap extends AbstractMessageTransformer
25 {
26 public HttpRequestBodyToParamMap()
27 {
28 registerSourceType(DataTypeFactory.OBJECT);
29 setReturnDataType(DataTypeFactory.OBJECT);
30 }
31
32 @Override
33 public Object transformMessage(MuleMessage message, String outputEncoding) throws TransformerException
34 {
35 Map<String, Object> paramMap = new HashMap<String, Object>();
36
37 try
38 {
39 String httpMethod = message.getInboundProperty("http.method");
40 String contentType = message.getInboundProperty("Content-Type");
41
42 boolean isGet = HttpConstants.METHOD_GET.equalsIgnoreCase(httpMethod);
43 boolean isPost = HttpConstants.METHOD_POST.equalsIgnoreCase(httpMethod);
44 boolean isUrlEncoded = false;
45 if (contentType != null)
46 {
47 isUrlEncoded = contentType.startsWith("application/x-www-form-urlencoded");
48 }
49
50 if (!(isGet || (isPost && isUrlEncoded)))
51 {
52 throw new Exception("The HTTP method or content type is unsupported!");
53 }
54
55 String queryString = null;
56 if (isGet)
57 {
58 URI uri = new URI(message.getPayloadAsString(outputEncoding));
59 queryString = uri.getRawQuery();
60 }
61 else if (isPost)
62 {
63 queryString = new String(message.getPayloadAsBytes());
64 }
65
66 if (StringUtils.isNotBlank(queryString))
67 {
68 addQueryStringToParameterMap(queryString, paramMap, outputEncoding);
69 }
70 }
71 catch (Exception e)
72 {
73 throw new TransformerException(this, e);
74 }
75
76 return paramMap;
77 }
78
79 protected void addQueryStringToParameterMap(String queryString, Map<String, Object> paramMap,
80 String outputEncoding) throws Exception
81 {
82 String[] pairs = queryString.split("&");
83 for (String pair : pairs)
84 {
85 String[] nameValue = pair.split("=");
86 if (nameValue.length == 2)
87 {
88 URLCodec codec = new URLCodec(outputEncoding);
89 String key = codec.decode(nameValue[0]);
90 String value = codec.decode(nameValue[1]);
91 addToParameterMap(paramMap, key, value);
92 }
93 }
94 }
95
96 @SuppressWarnings("unchecked")
97 protected void addToParameterMap(Map<String, Object> paramMap, String key, String value)
98 {
99 Object existingValue = paramMap.get(key);
100 if (existingValue != null)
101 {
102 List<Object> values;
103 if (existingValue instanceof List<?>)
104 {
105 values = (List<Object>) existingValue;
106 }
107 else
108 {
109 values = Arrays.asList(existingValue);
110 }
111
112 values.add(value);
113 paramMap.put(key, values);
114 }
115 else
116 {
117 paramMap.put(key, value);
118 }
119 }
120
121 @Override
122 public boolean isAcceptNull()
123 {
124 return false;
125 }
126 }