diff src/luan/webserver/RequestParser.java @ 1212:220228bf1af9

better urlDecode error handling
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 12 Mar 2018 20:33:02 -0600
parents 1e23b913c327
children b99947af8b79
line wrap: on
line diff
--- a/src/luan/webserver/RequestParser.java	Mon Mar 12 16:32:55 2018 -0600
+++ b/src/luan/webserver/RequestParser.java	Mon Mar 12 20:33:02 2018 -0600
@@ -1,5 +1,7 @@
 package luan.webserver;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
 import java.util.List;
 import java.util.ArrayList;
 import org.slf4j.Logger;
@@ -70,19 +72,19 @@
 		if( !parser.match('/') )
 			throw new ParseException(parser,"bad path");
 		while( safePathChar() || parser.anyOf("&=") );
-		request.path = Util.urlDecode( parser.textFrom(start) );
+		request.path = urlDecode( parser.textFrom(start) );
 	}
 
 	private void parseQuery() throws ParseException {
 		do {
 			int start = parser.currentIndex();
 			while( queryChar() );
-			String name = Util.urlDecode( parser.textFrom(start) );
+			String name = urlDecode( parser.textFrom(start) );
 			String value = null;
 			if( parser.match('=') ) {
 				start = parser.currentIndex();
 				while( queryChar() || parser.match('=') );
-				value = Util.urlDecode( parser.textFrom(start) );
+				value = urlDecode( parser.textFrom(start) );
 			}
 			if( name.length() > 0 || value != null ) {
 				if( value==null )
@@ -176,11 +178,11 @@
 		while(true) {
 			int start = parser.currentIndex();
 			while( parser.noneOf("=;") );
-			String name = Util.urlDecode( parser.textFrom(start) );
+			String name = urlDecode( parser.textFrom(start) );
 			if( parser.match('=') ) {
 				start = parser.currentIndex();
 				while( parser.noneOf(";") );
-				String value = Util.urlDecode( parser.textFrom(start) );
+				String value = urlDecode( parser.textFrom(start) );
 				request.cookies.put(name,value);
 			}
 			if( parser.endOfInput() )
@@ -254,4 +256,16 @@
 		return sb.toString();
 	}
 
+	private String urlDecode(String s) throws ParseException {
+		try {
+			return URLDecoder.decode(s,"UTF-8");
+		} catch(UnsupportedEncodingException e) {
+			parser.rollback();
+			throw new ParseException(parser,e);
+		} catch(IllegalArgumentException e) {
+			parser.rollback();
+			throw new ParseException(parser,e);
+		}
+	}
+
 }