diff src/luan/webserver/RequestParser.java @ 1146:2dda3c92a473

webserver - implement cookies
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 01 Feb 2018 03:08:21 -0700
parents 12ececf30597
children 30d87b7d1d62
line wrap: on
line diff
--- a/src/luan/webserver/RequestParser.java	Wed Jan 31 01:43:50 2018 -0700
+++ b/src/luan/webserver/RequestParser.java	Thu Feb 01 03:08:21 2018 -0700
@@ -1,7 +1,5 @@
 package luan.webserver;
 
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
 import java.util.List;
 import java.util.ArrayList;
 import luan.lib.parser.Parser;
@@ -28,6 +26,7 @@
 		while( !parser.match("\r\n") ) {
 			parserHeaderField();
 		}
+		parseCookies();
 	}
 
 	private void parseRequestLine() throws ParseException {
@@ -64,7 +63,7 @@
 		if( !parser.match('/') )
 			throw new ParseException(parser,"bad path");
 		while( safePathChar() || parser.anyOf("&=") );
-		request.path = decode( parser.textFrom(start) );
+		request.path = Util.urlDecode( parser.textFrom(start) );
 	}
 
 	private void parseQuery() throws ParseException {
@@ -74,27 +73,16 @@
 			if( !queryChar() )
 				return;
 			while( queryChar() );
-			String name = decode( parser.textFrom(start) );
+			String name = Util.urlDecode( parser.textFrom(start) );
 			String value;
 			if( parser.match('=') ) {
 				start = parser.currentIndex();
 				while( queryChar() );
-				value = decode( parser.textFrom(start) );
+				value = Util.urlDecode( parser.textFrom(start) );
 			} else {
 				value = "";
 			}
-			Object current = request.parameters.get(name);
-			if( current == null ) {
-				request.parameters.put(name,value);
-			} else if( current instanceof List ) {
-				List list = (List)current;
-				list.add(value);
-			} else {
-				List list = new ArrayList();
-				list.add(current);
-				list.add(value);
-				request.parameters.put(name,list);
-			}
+			Util.add(request.parameters,name,value);
 		}
 	}
 
@@ -131,7 +119,7 @@
 		String value = parseValue();
 		while( parser.anyOf(" \t") );
 		require( parser.match("\r\n") );
-		request.headers.put(name,value);
+		Util.add(request.headers,name,value);
 	}
 
 	private String parseName() throws ParseException {
@@ -185,11 +173,26 @@
 		}
 	}
 
-	private static String decode(String s) {
-		try {
-			return URLDecoder.decode(s,"UTF-8");
-		} catch(UnsupportedEncodingException e) {
-			throw new RuntimeException(e);
+
+	private void parseCookies() throws ParseException {
+		String text = (String)request.headers.get("Cookie");
+		if( text == null )
+			return;
+		this.parser = new Parser(text);
+		while(true) {
+			int start = parser.currentIndex();
+			while( parser.noneOf("=;") );
+			String name = Util.urlDecode( parser.textFrom(start) );
+			if( parser.match('=') ) {
+				start = parser.currentIndex();
+				while( parser.noneOf(";") );
+				String value = Util.urlDecode( parser.textFrom(start) );
+				request.cookies.put(name,value);
+			}
+			if( parser.endOfInput() )
+				return;
+			require( parser.match("; ") );
 		}
 	}
+
 }