diff options
Diffstat (limited to 'v1/src/main/java/com/xtremelabs/robolectric/tester/org/apache/http/ParamsParser.java')
-rw-r--r-- | v1/src/main/java/com/xtremelabs/robolectric/tester/org/apache/http/ParamsParser.java | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/v1/src/main/java/com/xtremelabs/robolectric/tester/org/apache/http/ParamsParser.java b/v1/src/main/java/com/xtremelabs/robolectric/tester/org/apache/http/ParamsParser.java new file mode 100644 index 000000000..720317e1c --- /dev/null +++ b/v1/src/main/java/com/xtremelabs/robolectric/tester/org/apache/http/ParamsParser.java @@ -0,0 +1,80 @@ +package com.xtremelabs.robolectric.tester.org.apache.http; + +import org.apache.http.HttpRequest; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.params.BasicHttpParams; +import org.apache.http.params.HttpParams; +import org.apache.http.util.EntityUtils; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.lang.reflect.Field; +import java.net.URI; +import java.net.URLDecoder; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.StringTokenizer; + +public class ParamsParser { + public static Map<String, String> parseParams(HttpRequest request) { + URI uri = URI.create(request.getRequestLine().getUri()); + String rawQuery = uri.getRawQuery(); + Map<String, String> params; + if (rawQuery != null) { + params = parseParamsFromQuery(rawQuery); + } else if (request instanceof HttpPost && ((HttpPost) request).getEntity() != null) { + try { + params = parseParamsFromQuery(EntityUtils.toString(((HttpPost) request).getEntity())); + } catch (IOException e) { + throw new RuntimeException(e); + } + } else { + HttpParams httpParams = request.getParams(); + if (httpParams instanceof BasicHttpParams) { + Map<String, String> parameters = getPrivateMember(httpParams, "parameters"); + params = new LinkedHashMap<String, String>(parameters); + } + else { + throw new RuntimeException("Was expecting a "+BasicHttpParams.class.getName()); + } + return params; + } + return params; + } + + private static Map<String, String> parseParamsFromQuery(String rawQuery) { + Map<String, String> params = new LinkedHashMap<String, String>(); + StringTokenizer tok = new StringTokenizer(rawQuery, "&", false); + while (tok.hasMoreTokens()) { + String name, value; + String nextParam = tok.nextToken(); + if (nextParam.contains("=")) { + String[] nameAndValue = nextParam.split("="); + name = nameAndValue[0]; + try { + value = URLDecoder.decode(nameAndValue[1], "UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + } else { + name = nextParam; + value = ""; + } + params.put(name, value); + } + return params; + } + + private static <T> T getPrivateMember(Object obj, String name) { + try { + Field f = obj.getClass().getDeclaredField(name); + f.setAccessible(true); + //noinspection unchecked + return (T) f.get(obj); + } catch (NoSuchFieldException e) { + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } +} |