From d7bc1a7a5f8c82911f7504903cfbfd956b216022 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 14 Oct 2009 02:47:20 +0200 Subject: [PATCH] Cleaned up parameter decoding. --- src/dolda/jsvc/util/Params.java | 44 ++++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/src/dolda/jsvc/util/Params.java b/src/dolda/jsvc/util/Params.java index 99320a5..a0fd46d 100644 --- a/src/dolda/jsvc/util/Params.java +++ b/src/dolda/jsvc/util/Params.java @@ -17,25 +17,23 @@ public class Params { } } - public static MultiMap urlparams(String q) { + public static MultiMap urlparams(Reader in) throws IOException { try { MultiMap ret = new WrappedMultiMap(new TreeMap>()); 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(); @@ -55,14 +53,13 @@ public class Params { } } 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(); @@ -80,6 +77,16 @@ public class Params { } } + public static MultiMap 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 urlparams(URL url) { String q = url.getQuery(); if(q == null) @@ -108,30 +115,17 @@ public class Params { public static MultiMap 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); } -- 2.11.0