View Javadoc

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