package org.jboss.pitbull.servlet.internal; import org.jboss.pitbull.internal.util.MultivalueMap; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a> * @version $Revision: 1 $ */ public class ParameterParser { public static Map<String, String[]> parseParameters(String queryString, InputStream is) throws IOException { MultivalueMap<String, String> params = new MultivalueMap<String, String>(); parseQueryParameters(params, queryString); parseForm(params, is); Map<String, String[]> rtn = new HashMap<String, String[]>(); for (Map.Entry<String, List<String>> entry : params.entrySet()) { String[] list = entry.getValue().toArray(new String[entry.getValue().size()]); rtn.put(entry.getKey(), list); } return rtn; } public static void parseForm(MultivalueMap<String, String> paramMap, InputStream entityStream) throws IOException { char[] buffer = new char[100]; StringBuffer buf = new StringBuffer(); BufferedReader reader = new BufferedReader(new InputStreamReader(entityStream)); int wasRead = 0; do { wasRead = reader.read(buffer, 0, 100); if (wasRead > 0) buf.append(buffer, 0, wasRead); } while (wasRead > -1); String form = buf.toString(); String[] params = form.split("&"); for (String param : params) { if (param.indexOf('=') >= 0) { String[] nv = param.split("="); String val = nv.length > 1 ? nv[1] : ""; paramMap.add(URLDecoder.decode(nv[0], "UTF-8"), URLDecoder.decode(val, "UTF-8")); } else { paramMap.add(param, ""); } } } public static void parseQueryParameters(MultivalueMap<String, String> paramMap, String queryString) { if (queryString == null || queryString.equals("")) return; String[] params = queryString.split("&"); for (String param : params) { if (param.indexOf('=') >= 0) { String[] nv = param.split("="); try { String name = URLDecoder.decode(nv[0], "UTF-8"); String val = nv.length > 1 ? nv[1] : ""; paramMap.add(name, URLDecoder.decode(val, "UTF-8")); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } } else { try { String name = URLDecoder.decode(param, "UTF-8"); paramMap.add(name, ""); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } } } } }