Home | History | Annotate | Download | only in http
      1 package com.xtremelabs.robolectric.tester.org.apache.http;
      2 
      3 import org.apache.http.HttpRequest;
      4 import org.apache.http.client.methods.HttpPost;
      5 import org.apache.http.params.BasicHttpParams;
      6 import org.apache.http.params.HttpParams;
      7 import org.apache.http.util.EntityUtils;
      8 
      9 import java.io.IOException;
     10 import java.io.UnsupportedEncodingException;
     11 import java.lang.reflect.Field;
     12 import java.net.URI;
     13 import java.net.URLDecoder;
     14 import java.util.LinkedHashMap;
     15 import java.util.Map;
     16 import java.util.StringTokenizer;
     17 
     18 public class ParamsParser {
     19     public static Map<String, String> parseParams(HttpRequest request) {
     20         URI uri = URI.create(request.getRequestLine().getUri());
     21         String rawQuery = uri.getRawQuery();
     22         Map<String, String> params;
     23         if (rawQuery != null) {
     24             params = parseParamsFromQuery(rawQuery);
     25         } else if (request instanceof HttpPost && ((HttpPost) request).getEntity() != null) {
     26             try {
     27                 params = parseParamsFromQuery(EntityUtils.toString(((HttpPost) request).getEntity()));
     28             } catch (IOException e) {
     29                 throw new RuntimeException(e);
     30             }
     31         } else {
     32             HttpParams httpParams = request.getParams();
     33             if (httpParams instanceof BasicHttpParams) {
     34                 Map<String, String> parameters = getPrivateMember(httpParams, "parameters");
     35                 params = new LinkedHashMap<String, String>(parameters);
     36             }
     37             else {
     38                 throw new RuntimeException("Was expecting a "+BasicHttpParams.class.getName());
     39             }
     40             return params;
     41         }
     42         return params;
     43     }
     44 
     45     private static Map<String, String> parseParamsFromQuery(String rawQuery) {
     46         Map<String, String> params = new LinkedHashMap<String, String>();
     47         StringTokenizer tok = new StringTokenizer(rawQuery, "&", false);
     48         while (tok.hasMoreTokens()) {
     49             String name, value;
     50             String nextParam = tok.nextToken();
     51             if (nextParam.contains("=")) {
     52                 String[] nameAndValue = nextParam.split("=");
     53                 name = nameAndValue[0];
     54                 try {
     55                     value = URLDecoder.decode(nameAndValue[1], "UTF-8");
     56                 } catch (UnsupportedEncodingException e) {
     57                     throw new RuntimeException(e);
     58                 }
     59             } else {
     60                 name = nextParam;
     61                 value = "";
     62             }
     63             params.put(name, value);
     64         }
     65         return params;
     66     }
     67 
     68     private static <T> T getPrivateMember(Object obj, String name) {
     69         try {
     70             Field f = obj.getClass().getDeclaredField(name);
     71             f.setAccessible(true);
     72             //noinspection unchecked
     73             return (T) f.get(obj);
     74         } catch (NoSuchFieldException e) {
     75             throw new RuntimeException(e);
     76         } catch (IllegalAccessException e) {
     77             throw new RuntimeException(e);
     78         }
     79     }
     80 }
     81