}
}
- public static MultiMap<String, String> urlparams(String q) {
+ public static MultiMap<String, String> urlparams(Reader in) throws IOException {
try {
MultiMap<String, String> ret = new WrappedMultiMap<String, String>(new TreeMap<String, Collection<String>>());
String st = "key";
String key = null; /* Java is stupid. */
MixedBuffer buf = new MixedBuffer();
- int i = 0;
while(true) {
- int c = (i >= q.length())?-1:(q.charAt(i++));
+ int c = in.read();
if(st == "key") {
if(c == '%') {
- if(q.length() - i < 2)
- throw(new EncodingException("Invalid character escape"));
try {
- buf.append((byte)((Misc.hex2int(q.charAt(i)) << 4) | Misc.hex2int(q.charAt(i + 1))));
+ int d1 = in.read();
+ int d2 = in.read();
+ buf.append((byte)((Misc.hex2int((char)d1) << 4) | Misc.hex2int((char)d2)));
} catch(NumberFormatException e) {
throw(new EncodingException("Invalid character escape"));
}
- i += 2;
} else if(c == '=') {
key = buf.convert();
buf = new MixedBuffer();
}
} else if(st == "val") {
if(c == '%') {
- if(q.length() - i < 2)
- throw(new EncodingException("Invalid character escape"));
try {
- buf.append((byte)((Misc.hex2int(q.charAt(i)) << 4) | Misc.hex2int(q.charAt(i + 1))));
+ int d1 = in.read();
+ int d2 = in.read();
+ buf.append((byte)((Misc.hex2int((char)d1) << 4) | Misc.hex2int((char)d2)));
} catch(NumberFormatException e) {
throw(new EncodingException("Invalid character escape"));
}
- i += 2;
} else if((c == '&') || (c == -1)) {
ret.add(key, buf.convert());
buf = new MixedBuffer();
}
}
+ public static MultiMap<String, String> urlparams(String q) {
+ try {
+ return(urlparams(new StringReader(q)));
+ } catch(IOException e) {
+ /* This will, of course, never ever once happen, but do
+ * you think Javac cares? */
+ throw(new Error(e));
+ }
+ }
+
public static MultiMap<String, String> urlparams(URL url) {
- return(urlparams(url.getQuery()));
+ String q = url.getQuery();
+ if(q == null)
+ q = "";
+ return(urlparams(q));
}
public static MultiMap<String, String> urlparams(Request req) {
}
return(buf.toString());
}
+
+ public static MultiMap<String, String> postparams(Request req) {
+ if(req.method() != "POST")
+ return(null);
+ String ctype = req.inheaders().get("Content-Type");
+ if(ctype == null)
+ return(null);
+ ctype = ctype.toLowerCase();
+ if(ctype.equals("application/x-www-form-urlencoded")) {
+ byte[] data;
+ try {
+ return(urlparams(new InputStreamReader(req.input(), "UTF-8")));
+ } catch(IOException e) {
+ return(null);
+ }
+ }
+ return(null);
+ }
}