}
}
- 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) {
String q = url.getQuery();
if(q == null)
public static MultiMap<String, String> postparams(Request req) {
if(req.method() != "POST")
return(null);
- String clens = req.inheaders().get("Content-Length");
- if(clens == null)
- return(null);
- int clen;
- try {
- clen = Integer.parseInt(clens);
- } catch(NumberFormatException e) {
- 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")) {
- if(clen > (1 << 20)) /* Just to be safe */
- return(null);
byte[] data;
try {
- data = Misc.readall(req.input());
+ return(urlparams(new InputStreamReader(req.input(), "UTF-8")));
} catch(IOException e) {
return(null);
}
- String dec = new String(data, Misc.utf8);
- return(urlparams(dec));
}
return(null);
}