Mercurial Hosting > luan
annotate src/goodjava/webserver/RequestParser.java @ 2170:a59d0bf68830 default tip
handle multiple cookie headers
| author | Franklin Schmidt <fschmidt@gmail.com> |
|---|---|
| date | Tue, 17 Feb 2026 22:24:02 -0700 |
| parents | ffa02039a11a |
| children |
| rev | line source |
|---|---|
|
1402
27efb1fcbcb5
move luan.lib to goodjava
Franklin Schmidt <fschmidt@gmail.com>
parents:
1371
diff
changeset
|
1 package goodjava.webserver; |
| 1137 | 2 |
|
1212
220228bf1af9
better urlDecode error handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1208
diff
changeset
|
3 import java.io.UnsupportedEncodingException; |
|
220228bf1af9
better urlDecode error handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1208
diff
changeset
|
4 import java.net.URLDecoder; |
|
1143
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
5 import java.util.List; |
|
1402
27efb1fcbcb5
move luan.lib to goodjava
Franklin Schmidt <fschmidt@gmail.com>
parents:
1371
diff
changeset
|
6 import goodjava.logging.Logger; |
|
27efb1fcbcb5
move luan.lib to goodjava
Franklin Schmidt <fschmidt@gmail.com>
parents:
1371
diff
changeset
|
7 import goodjava.logging.LoggerFactory; |
|
27efb1fcbcb5
move luan.lib to goodjava
Franklin Schmidt <fschmidt@gmail.com>
parents:
1371
diff
changeset
|
8 import goodjava.parser.Parser; |
|
27efb1fcbcb5
move luan.lib to goodjava
Franklin Schmidt <fschmidt@gmail.com>
parents:
1371
diff
changeset
|
9 import goodjava.parser.ParseException; |
| 1137 | 10 |
| 11 | |
|
1144
ae0a048f3bc7
webserver - handle POST params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1143
diff
changeset
|
12 final class RequestParser { |
|
1198
9d3835e88204
better query handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1197
diff
changeset
|
13 private static final Logger logger = LoggerFactory.getLogger(RequestParser.class); |
|
1144
ae0a048f3bc7
webserver - handle POST params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1143
diff
changeset
|
14 private final Request request; |
|
ae0a048f3bc7
webserver - handle POST params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1143
diff
changeset
|
15 private Parser parser; |
| 1137 | 16 |
|
1144
ae0a048f3bc7
webserver - handle POST params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1143
diff
changeset
|
17 RequestParser(Request request) { |
|
ae0a048f3bc7
webserver - handle POST params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1143
diff
changeset
|
18 this.request = request; |
| 1137 | 19 } |
| 20 | |
|
1266
05934fbf635a
content-type "application/x-www-form-urlencoded; charset=utf-8"
Franklin Schmidt <fschmidt@gmail.com>
parents:
1259
diff
changeset
|
21 void parseUrlencoded(String charset) throws ParseException, UnsupportedEncodingException { |
|
1197
886e14903c1e
better Content-Type handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1194
diff
changeset
|
22 if( request.body == null ) { |
| 1766 | 23 logger.info("body is null\n"+request.rawHead); |
|
1197
886e14903c1e
better Content-Type handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1194
diff
changeset
|
24 return; |
|
886e14903c1e
better Content-Type handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1194
diff
changeset
|
25 } |
|
1266
05934fbf635a
content-type "application/x-www-form-urlencoded; charset=utf-8"
Franklin Schmidt <fschmidt@gmail.com>
parents:
1259
diff
changeset
|
26 this.parser = new Parser(Util.toString(request.body,charset)); |
|
1144
ae0a048f3bc7
webserver - handle POST params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1143
diff
changeset
|
27 parseQuery(); |
|
ae0a048f3bc7
webserver - handle POST params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1143
diff
changeset
|
28 require( parser.endOfInput() ); |
| 1137 | 29 } |
| 30 | |
|
1144
ae0a048f3bc7
webserver - handle POST params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1143
diff
changeset
|
31 void parseHead() throws ParseException { |
|
ae0a048f3bc7
webserver - handle POST params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1143
diff
changeset
|
32 this.parser = new Parser(request.rawHead); |
| 1137 | 33 parseRequestLine(); |
| 34 while( !parser.match("\r\n") ) { | |
| 35 parserHeaderField(); | |
| 36 } | |
|
1146
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
37 parseCookies(); |
| 1137 | 38 } |
| 39 | |
| 40 private void parseRequestLine() throws ParseException { | |
| 41 parseMethod(); | |
| 42 require( parser.match(' ') ); | |
|
1143
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
43 parseRawPath(); |
| 1137 | 44 require( parser.match(' ') ); |
| 45 parseProtocol(); | |
| 46 require( parser.match("\r\n") ); | |
| 47 } | |
| 48 | |
| 49 private void parseMethod() throws ParseException { | |
| 50 int start = parser.currentIndex(); | |
| 51 if( !methodChar() ) | |
| 52 throw new ParseException(parser,"no method"); | |
| 53 while( methodChar() ); | |
| 54 request.method = parser.textFrom(start); | |
| 55 } | |
| 56 | |
| 57 private boolean methodChar() { | |
| 58 return parser.inCharRange('A','Z'); | |
| 59 } | |
| 60 | |
|
1143
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
61 private void parseRawPath() throws ParseException { |
|
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
62 int start = parser.currentIndex(); |
|
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
63 parsePath(); |
|
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
64 if( parser.match('?') ) |
|
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
65 parseQuery(); |
|
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
66 request.rawPath = parser.textFrom(start); |
|
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
67 } |
|
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
68 |
| 1137 | 69 private void parsePath() throws ParseException { |
| 70 int start = parser.currentIndex(); | |
| 71 if( !parser.match('/') ) | |
| 72 throw new ParseException(parser,"bad path"); | |
| 1221 | 73 while( parser.noneOf(" ?#") ); |
|
1212
220228bf1af9
better urlDecode error handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1208
diff
changeset
|
74 request.path = urlDecode( parser.textFrom(start) ); |
|
1371
4c5548a61d4f
add Request.originalPath
Franklin Schmidt <fschmidt@gmail.com>
parents:
1347
diff
changeset
|
75 request.originalPath = request.path; |
|
1143
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
76 } |
|
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
77 |
|
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
78 private void parseQuery() throws ParseException { |
|
1198
9d3835e88204
better query handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1197
diff
changeset
|
79 do { |
|
1143
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
80 int start = parser.currentIndex(); |
|
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
81 while( queryChar() ); |
|
1212
220228bf1af9
better urlDecode error handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1208
diff
changeset
|
82 String name = urlDecode( parser.textFrom(start) ); |
|
1198
9d3835e88204
better query handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1197
diff
changeset
|
83 String value = null; |
|
1143
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
84 if( parser.match('=') ) { |
|
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
85 start = parser.currentIndex(); |
|
1198
9d3835e88204
better query handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1197
diff
changeset
|
86 while( queryChar() || parser.match('=') ); |
|
1212
220228bf1af9
better urlDecode error handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1208
diff
changeset
|
87 value = urlDecode( parser.textFrom(start) ); |
|
1143
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
88 } |
|
1198
9d3835e88204
better query handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1197
diff
changeset
|
89 if( name.length() > 0 || value != null ) { |
|
9d3835e88204
better query handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1197
diff
changeset
|
90 if( value==null ) |
|
9d3835e88204
better query handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1197
diff
changeset
|
91 value = ""; |
|
9d3835e88204
better query handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1197
diff
changeset
|
92 Util.add(request.parameters,name,value); |
|
9d3835e88204
better query handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1197
diff
changeset
|
93 } |
|
9d3835e88204
better query handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1197
diff
changeset
|
94 } while( parser.match('&') ); |
|
1143
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
95 } |
|
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
96 |
|
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
97 private boolean queryChar() { |
|
1198
9d3835e88204
better query handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1197
diff
changeset
|
98 return parser.noneOf("=&# \t\n\f\r\u000b"); |
|
1143
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
99 } |
|
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
100 |
| 1137 | 101 private void parseProtocol() throws ParseException { |
| 102 int start = parser.currentIndex(); | |
| 103 if( !( | |
| 104 parser.match("HTTP/") | |
| 105 && parser.inCharRange('0','9') | |
| 106 && parser.match('.') | |
| 107 && parser.inCharRange('0','9') | |
| 108 ) ) | |
| 109 throw new ParseException(parser,"bad protocol"); | |
| 110 request.protocol = parser.textFrom(start); | |
| 1237 | 111 request.scheme = "http"; |
| 1137 | 112 } |
| 113 | |
| 114 | |
| 115 private void parserHeaderField() throws ParseException { | |
| 116 String name = parseName(); | |
| 117 require( parser.match(':') ); | |
| 118 while( parser.anyOf(" \t") ); | |
| 119 String value = parseValue(); | |
| 120 while( parser.anyOf(" \t") ); | |
| 121 require( parser.match("\r\n") ); | |
|
1146
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
122 Util.add(request.headers,name,value); |
| 1137 | 123 } |
| 124 | |
| 125 private String parseName() throws ParseException { | |
|
1148
49fb4e83484f
webserver - change headers to lower case
Franklin Schmidt <fschmidt@gmail.com>
parents:
1147
diff
changeset
|
126 int start = parser.currentIndex(); |
| 1137 | 127 require( tokenChar() ); |
|
1148
49fb4e83484f
webserver - change headers to lower case
Franklin Schmidt <fschmidt@gmail.com>
parents:
1147
diff
changeset
|
128 while( tokenChar() ); |
| 1607 | 129 return parser.textFrom(start); |
| 1137 | 130 } |
| 131 | |
|
1148
49fb4e83484f
webserver - change headers to lower case
Franklin Schmidt <fschmidt@gmail.com>
parents:
1147
diff
changeset
|
132 private String parseValue() throws ParseException { |
| 1137 | 133 int start = parser.currentIndex(); |
| 134 while( !testEndOfValue() ) | |
|
1148
49fb4e83484f
webserver - change headers to lower case
Franklin Schmidt <fschmidt@gmail.com>
parents:
1147
diff
changeset
|
135 require( parser.anyChar() ); |
| 1137 | 136 return parser.textFrom(start); |
| 137 } | |
| 138 | |
| 139 private boolean testEndOfValue() { | |
| 140 parser.begin(); | |
| 141 while( parser.anyOf(" \t") ); | |
| 142 boolean b = parser.endOfInput() || parser.anyOf("\r\n"); | |
| 143 parser.failure(); // rollback | |
| 144 return b; | |
| 145 } | |
| 146 | |
| 147 private void require(boolean b) throws ParseException { | |
| 148 if( !b ) | |
| 149 throw new ParseException(parser,"failed"); | |
| 150 } | |
| 151 | |
| 152 boolean tokenChar() { | |
| 153 if( parser.endOfInput() ) | |
| 154 return false; | |
| 155 char c = parser.currentChar(); | |
| 156 if( 32 <= c && c <= 126 && "()<>@,;:\\\"/[]?={} \t\r\n".indexOf(c) == -1 ) { | |
| 157 parser.anyChar(); | |
| 158 return true; | |
| 159 } else { | |
| 160 return false; | |
| 161 } | |
| 162 } | |
|
1143
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
163 |
|
1146
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
164 |
|
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
165 private void parseCookies() throws ParseException { |
|
2170
a59d0bf68830
handle multiple cookie headers
Franklin Schmidt <fschmidt@gmail.com>
parents:
2065
diff
changeset
|
166 Object obj = request.headers.get("cookie"); |
|
a59d0bf68830
handle multiple cookie headers
Franklin Schmidt <fschmidt@gmail.com>
parents:
2065
diff
changeset
|
167 if( obj == null ) |
|
1146
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
168 return; |
|
2170
a59d0bf68830
handle multiple cookie headers
Franklin Schmidt <fschmidt@gmail.com>
parents:
2065
diff
changeset
|
169 if( obj instanceof List ) |
|
a59d0bf68830
handle multiple cookie headers
Franklin Schmidt <fschmidt@gmail.com>
parents:
2065
diff
changeset
|
170 throw new ParseException(parser,"multiple cookie headers"); |
|
a59d0bf68830
handle multiple cookie headers
Franklin Schmidt <fschmidt@gmail.com>
parents:
2065
diff
changeset
|
171 String text = (String)obj; |
|
1146
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
172 this.parser = new Parser(text); |
|
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
173 while(true) { |
|
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
174 int start = parser.currentIndex(); |
|
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
175 while( parser.noneOf("=;") ); |
|
1212
220228bf1af9
better urlDecode error handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1208
diff
changeset
|
176 String name = urlDecode( parser.textFrom(start) ); |
|
1146
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
177 if( parser.match('=') ) { |
|
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
178 start = parser.currentIndex(); |
|
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
179 while( parser.noneOf(";") ); |
|
1256
c147e2e877e3
allow subclassing of HttpServicer
Franklin Schmidt <fschmidt@gmail.com>
parents:
1237
diff
changeset
|
180 String value = parser.textFrom(start); |
|
c147e2e877e3
allow subclassing of HttpServicer
Franklin Schmidt <fschmidt@gmail.com>
parents:
1237
diff
changeset
|
181 int len = value.length(); |
|
1736
a02a75e3daa8
webserver error handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1607
diff
changeset
|
182 if( len > 0 && value.charAt(0)=='"' && value.charAt(len-1)=='"' ) |
|
1256
c147e2e877e3
allow subclassing of HttpServicer
Franklin Schmidt <fschmidt@gmail.com>
parents:
1237
diff
changeset
|
183 value = value.substring(1,len-1); |
|
c147e2e877e3
allow subclassing of HttpServicer
Franklin Schmidt <fschmidt@gmail.com>
parents:
1237
diff
changeset
|
184 value = urlDecode(value); |
|
1146
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
185 request.cookies.put(name,value); |
|
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
186 } |
|
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
187 if( parser.endOfInput() ) |
|
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
188 return; |
|
1208
1e23b913c327
minor cookie parsing fix
Franklin Schmidt <fschmidt@gmail.com>
parents:
1198
diff
changeset
|
189 require( parser.match(';') ); |
|
1e23b913c327
minor cookie parsing fix
Franklin Schmidt <fschmidt@gmail.com>
parents:
1198
diff
changeset
|
190 parser.match(' '); // optional for bad browsers |
|
1143
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
191 } |
|
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
192 } |
|
1146
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
193 |
|
1147
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
194 |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
195 private static final String contentTypeStart = "multipart/form-data; boundary="; |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
196 |
|
1266
05934fbf635a
content-type "application/x-www-form-urlencoded; charset=utf-8"
Franklin Schmidt <fschmidt@gmail.com>
parents:
1259
diff
changeset
|
197 void parseMultipart() throws ParseException, UnsupportedEncodingException { |
|
1197
886e14903c1e
better Content-Type handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1194
diff
changeset
|
198 if( request.body == null ) { |
| 1766 | 199 logger.info("body is null\n"+request.rawHead); |
|
1197
886e14903c1e
better Content-Type handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1194
diff
changeset
|
200 return; |
|
886e14903c1e
better Content-Type handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1194
diff
changeset
|
201 } |
|
1148
49fb4e83484f
webserver - change headers to lower case
Franklin Schmidt <fschmidt@gmail.com>
parents:
1147
diff
changeset
|
202 String contentType = (String)request.headers.get("content-type"); |
|
1147
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
203 if( !contentType.startsWith(contentTypeStart) ) |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
204 throw new RuntimeException(contentType); |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
205 String boundary = "--"+contentType.substring(contentTypeStart.length()); |
|
1266
05934fbf635a
content-type "application/x-www-form-urlencoded; charset=utf-8"
Franklin Schmidt <fschmidt@gmail.com>
parents:
1259
diff
changeset
|
206 this.parser = new Parser(Util.toString(request.body,null)); |
|
1259
e8020216dee7
add Luan.to_luan and fix multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1258
diff
changeset
|
207 //System.out.println(this.parser.text); |
|
1147
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
208 require( parser.match(boundary) ); |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
209 boundary = "\r\n" + boundary; |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
210 while( !parser.match("--\r\n") ) { |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
211 require( parser.match("\r\n") ); |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
212 require( parser.match("Content-Disposition: form-data; name=") ); |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
213 String name = quotedString(); |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
214 String filename = null; |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
215 boolean isBinary = false; |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
216 if( parser.match("; filename=") ) { |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
217 filename = quotedString(); |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
218 require( parser.match("\r\n") ); |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
219 require( parser.match("Content-Type: ") ); |
|
1259
e8020216dee7
add Luan.to_luan and fix multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1258
diff
changeset
|
220 int start = parser.currentIndex(); |
|
e8020216dee7
add Luan.to_luan and fix multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1258
diff
changeset
|
221 if( parser.match("application/") ) { |
|
1147
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
222 isBinary = true; |
| 1299 | 223 } else if( parser.match("image/") ) { |
| 224 isBinary = true; | |
| 1773 | 225 } else if( parser.match("video/") ) { |
| 226 isBinary = true; | |
|
2006
b10031b477a4
handle audio multipart
Franklin Schmidt <fschmidt@gmail.com>
parents:
1773
diff
changeset
|
227 } else if( parser.match("audio/") ) { |
|
b10031b477a4
handle audio multipart
Franklin Schmidt <fschmidt@gmail.com>
parents:
1773
diff
changeset
|
228 isBinary = true; |
|
1259
e8020216dee7
add Luan.to_luan and fix multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1258
diff
changeset
|
229 } else if( parser.match("text/") ) { |
|
1147
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
230 isBinary = false; |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
231 } else |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
232 throw new ParseException(parser,"bad file content-type"); |
|
2065
ffa02039a11a
fix multipart content-type
Franklin Schmidt <fschmidt@gmail.com>
parents:
2006
diff
changeset
|
233 while( parser.inCharRange('a','z') |
|
ffa02039a11a
fix multipart content-type
Franklin Schmidt <fschmidt@gmail.com>
parents:
2006
diff
changeset
|
234 || parser.inCharRange('0','9') |
|
ffa02039a11a
fix multipart content-type
Franklin Schmidt <fschmidt@gmail.com>
parents:
2006
diff
changeset
|
235 || parser.anyOf("-.;= ") |
|
ffa02039a11a
fix multipart content-type
Franklin Schmidt <fschmidt@gmail.com>
parents:
2006
diff
changeset
|
236 ); |
|
1259
e8020216dee7
add Luan.to_luan and fix multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1258
diff
changeset
|
237 contentType = parser.textFrom(start); |
|
1147
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
238 } |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
239 require( parser.match("\r\n") ); |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
240 require( parser.match("\r\n") ); |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
241 int start = parser.currentIndex(); |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
242 while( !parser.test(boundary) ) { |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
243 require( parser.anyChar() ); |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
244 } |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
245 String value = parser.textFrom(start); |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
246 if( filename == null ) { |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
247 Util.add(request.parameters,name,value); |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
248 } else { |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
249 Object content = isBinary ? Util.toBytes(value) : value; |
|
1259
e8020216dee7
add Luan.to_luan and fix multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1258
diff
changeset
|
250 Request.MultipartFile mf = new Request.MultipartFile(filename,contentType,content); |
|
1147
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
251 Util.add(request.parameters,name,mf); |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
252 } |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
253 require( parser.match(boundary) ); |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
254 } |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
255 } |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
256 |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
257 private String quotedString() throws ParseException { |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
258 StringBuilder sb = new StringBuilder(); |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
259 require( parser.match('"') ); |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
260 while( !parser.match('"') ) { |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
261 if( parser.match("\\\"") ) { |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
262 sb.append('"'); |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
263 } else { |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
264 require( parser.anyChar() ); |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
265 sb.append( parser.lastChar() ); |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
266 } |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
267 } |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
268 return sb.toString(); |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
269 } |
|
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
270 |
|
1212
220228bf1af9
better urlDecode error handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1208
diff
changeset
|
271 private String urlDecode(String s) throws ParseException { |
|
220228bf1af9
better urlDecode error handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1208
diff
changeset
|
272 try { |
|
220228bf1af9
better urlDecode error handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1208
diff
changeset
|
273 return URLDecoder.decode(s,"UTF-8"); |
|
220228bf1af9
better urlDecode error handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1208
diff
changeset
|
274 } catch(UnsupportedEncodingException e) { |
|
220228bf1af9
better urlDecode error handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1208
diff
changeset
|
275 parser.rollback(); |
|
220228bf1af9
better urlDecode error handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1208
diff
changeset
|
276 throw new ParseException(parser,e); |
|
220228bf1af9
better urlDecode error handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1208
diff
changeset
|
277 } catch(IllegalArgumentException e) { |
|
220228bf1af9
better urlDecode error handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1208
diff
changeset
|
278 parser.rollback(); |
|
220228bf1af9
better urlDecode error handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1208
diff
changeset
|
279 throw new ParseException(parser,e); |
|
220228bf1af9
better urlDecode error handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1208
diff
changeset
|
280 } |
|
220228bf1af9
better urlDecode error handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1208
diff
changeset
|
281 } |
|
220228bf1af9
better urlDecode error handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1208
diff
changeset
|
282 |
|
1258
e4d7a3114fa8
support "Content-Type: application/json; charset=utf-8"
Franklin Schmidt <fschmidt@gmail.com>
parents:
1256
diff
changeset
|
283 // improve later |
|
1463
fb003c4003dd
better application/json handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
284 void parseJson(String charset) throws UnsupportedEncodingException { |
|
1258
e4d7a3114fa8
support "Content-Type: application/json; charset=utf-8"
Franklin Schmidt <fschmidt@gmail.com>
parents:
1256
diff
changeset
|
285 if( request.body == null ) { |
| 1766 | 286 logger.info("body is null\n"+request.rawHead); |
|
1258
e4d7a3114fa8
support "Content-Type: application/json; charset=utf-8"
Franklin Schmidt <fschmidt@gmail.com>
parents:
1256
diff
changeset
|
287 return; |
|
e4d7a3114fa8
support "Content-Type: application/json; charset=utf-8"
Franklin Schmidt <fschmidt@gmail.com>
parents:
1256
diff
changeset
|
288 } |
|
1463
fb003c4003dd
better application/json handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
289 String value = Util.toString(request.body,charset); |
|
1258
e4d7a3114fa8
support "Content-Type: application/json; charset=utf-8"
Franklin Schmidt <fschmidt@gmail.com>
parents:
1256
diff
changeset
|
290 Util.add(request.parameters,"json",value); |
|
e4d7a3114fa8
support "Content-Type: application/json; charset=utf-8"
Franklin Schmidt <fschmidt@gmail.com>
parents:
1256
diff
changeset
|
291 } |
|
e4d7a3114fa8
support "Content-Type: application/json; charset=utf-8"
Franklin Schmidt <fschmidt@gmail.com>
parents:
1256
diff
changeset
|
292 |
| 1137 | 293 } |
