Mercurial Hosting > luan
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("; ") ); } } + }