diff --git a/src/main/java/org/scribe/model/Request.java b/src/main/java/org/scribe/model/Request.java index 1d6b677..b1a59bc 100644 --- a/src/main/java/org/scribe/model/Request.java +++ b/src/main/java/org/scribe/model/Request.java @@ -144,22 +144,16 @@ class Request * Get a {@link Map} of the query string parameters. * * @return a map containing the query string parameters + * @throws OAuthException if the URL is not valid */ public Map getQueryStringParams() { try { Map params = new HashMap(); - String query = new URL(url).getQuery(); - if (query != null) - { - for (String param : query.split("&")) - { - String pair[] = param.split("="); - params.put(pair[0], pair[1]); - } - } - params.putAll(querystringParams); + String queryString = new URL(url).getQuery(); + params.putAll(URLUtils.queryStringToMap(queryString)); + params.putAll(this.querystringParams); return params; } catch (MalformedURLException mue) diff --git a/src/main/java/org/scribe/utils/URLUtils.java b/src/main/java/org/scribe/utils/URLUtils.java index ffd6600..8c6f492 100644 --- a/src/main/java/org/scribe/utils/URLUtils.java +++ b/src/main/java/org/scribe/utils/URLUtils.java @@ -13,8 +13,8 @@ public class URLUtils { private static final String EMPTY_STRING = ""; private static final String UTF_8 = "UTF-8"; - private static final char PAIR_SEPARATOR = '='; - private static final char PARAM_SEPARATOR = '&'; + private static final String PAIR_SEPARATOR = "="; + private static final String PARAM_SEPARATOR = "&"; private static final char QUERY_STRING_SEPARATOR = '?'; private static final String ERROR_MSG = String.format("Cannot find specified encoding: %s", UTF_8); @@ -133,6 +133,12 @@ public class URLUtils } } + /** + * Concats a key-value map into a querystring-like String + * + * @param params key-value map + * @return querystring-like String + */ public static String concatSortedPercentEncodedParams(Map params) { StringBuilder result = new StringBuilder(); @@ -144,6 +150,28 @@ public class URLUtils return result.toString().substring(0, result.length() - 1); } + /** + * Parses and form-urldecodes a querystring-like string into a map + * + * @param queryString querystring-like String + * @return a map with the form-urldecoded parameters + */ + public static Map queryStringToMap(String queryString) + { + Map result = new HashMap(); + if (queryString != null && queryString.length() > 0) + { + for (String param : queryString.split(PARAM_SEPARATOR)) + { + String pair[] = param.split(PAIR_SEPARATOR); + String key = formURLDecode(pair[0]); + String value = pair.length > 1 ? formURLDecode(pair[1]) : EMPTY_STRING; + result.put(key, value); + } + } + return result; + } + private static final class EncodingRule { private final String ch;