Mercurial Hosting > luan
annotate src/luan/webserver/RequestParser.java @ 1194:bd0420fb3dd0
handle ParseException in webserver
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 26 Feb 2018 16:29:07 -0700 |
parents | 49fb4e83484f |
children | 886e14903c1e |
rev | line source |
---|---|
1137 | 1 package luan.webserver; |
2 | |
1143
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
3 import java.util.List; |
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
4 import java.util.ArrayList; |
1137 | 5 import luan.lib.parser.Parser; |
6 import luan.lib.parser.ParseException; | |
7 | |
8 | |
1144
ae0a048f3bc7
webserver - handle POST params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1143
diff
changeset
|
9 final class RequestParser { |
ae0a048f3bc7
webserver - handle POST params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1143
diff
changeset
|
10 private final Request request; |
ae0a048f3bc7
webserver - handle POST params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1143
diff
changeset
|
11 private Parser parser; |
1137 | 12 |
1144
ae0a048f3bc7
webserver - handle POST params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1143
diff
changeset
|
13 RequestParser(Request request) { |
ae0a048f3bc7
webserver - handle POST params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1143
diff
changeset
|
14 this.request = request; |
1137 | 15 } |
16 | |
1145 | 17 void parseUrlencoded() throws ParseException { |
1147
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
18 this.parser = new Parser(Util.toString(request.body)); |
1144
ae0a048f3bc7
webserver - handle POST params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1143
diff
changeset
|
19 parseQuery(); |
ae0a048f3bc7
webserver - handle POST params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1143
diff
changeset
|
20 require( parser.endOfInput() ); |
1137 | 21 } |
22 | |
1144
ae0a048f3bc7
webserver - handle POST params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1143
diff
changeset
|
23 void parseHead() throws ParseException { |
ae0a048f3bc7
webserver - handle POST params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1143
diff
changeset
|
24 this.parser = new Parser(request.rawHead); |
1137 | 25 parseRequestLine(); |
26 while( !parser.match("\r\n") ) { | |
27 parserHeaderField(); | |
28 } | |
1146
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
29 parseCookies(); |
1137 | 30 } |
31 | |
32 private void parseRequestLine() throws ParseException { | |
33 parseMethod(); | |
34 require( parser.match(' ') ); | |
1143
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
35 parseRawPath(); |
1137 | 36 require( parser.match(' ') ); |
37 parseProtocol(); | |
38 require( parser.match("\r\n") ); | |
39 } | |
40 | |
41 private void parseMethod() throws ParseException { | |
42 int start = parser.currentIndex(); | |
43 if( !methodChar() ) | |
44 throw new ParseException(parser,"no method"); | |
45 while( methodChar() ); | |
46 request.method = parser.textFrom(start); | |
47 } | |
48 | |
49 private boolean methodChar() { | |
50 return parser.inCharRange('A','Z'); | |
51 } | |
52 | |
1143
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
53 private void parseRawPath() throws ParseException { |
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
54 int start = parser.currentIndex(); |
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
55 parsePath(); |
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
56 if( parser.match('?') ) |
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
57 parseQuery(); |
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
58 request.rawPath = parser.textFrom(start); |
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
59 } |
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
60 |
1137 | 61 private void parsePath() throws ParseException { |
62 int start = parser.currentIndex(); | |
63 if( !parser.match('/') ) | |
64 throw new ParseException(parser,"bad path"); | |
1143
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
65 while( safePathChar() || parser.anyOf("&=") ); |
1146
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
66 request.path = Util.urlDecode( parser.textFrom(start) ); |
1143
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 |
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
69 private void parseQuery() throws ParseException { |
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
70 while(true) { |
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
71 while( parser.match('&') ); |
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
72 int start = parser.currentIndex(); |
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
73 if( !queryChar() ) |
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
74 return; |
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
75 while( queryChar() ); |
1146
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
76 String name = Util.urlDecode( parser.textFrom(start) ); |
1143
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
77 String value; |
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
78 if( parser.match('=') ) { |
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
79 start = parser.currentIndex(); |
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
80 while( queryChar() ); |
1146
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
81 value = Util.urlDecode( parser.textFrom(start) ); |
1143
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
82 } else { |
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
83 value = ""; |
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
84 } |
1146
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
85 Util.add(request.parameters,name,value); |
1143
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
86 } |
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
87 } |
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
88 |
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
89 private boolean queryChar() { |
1194
bd0420fb3dd0
handle ParseException in webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
1148
diff
changeset
|
90 return safePathChar() || parser.anyOf("?\\\""); |
1143
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
91 } |
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
92 |
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
93 // where did I get this? |
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
94 private boolean safePathChar() { |
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
95 return parser.inCharRange('A','Z') |
1137 | 96 || parser.inCharRange('a','z') |
97 || parser.inCharRange('0','9') | |
1143
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
98 || parser.anyOf("-._~:/[]@!$'()*+,;`.%") |
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
99 ; |
1137 | 100 } |
101 | |
102 private void parseProtocol() throws ParseException { | |
103 int start = parser.currentIndex(); | |
104 if( !( | |
105 parser.match("HTTP/") | |
106 && parser.inCharRange('0','9') | |
107 && parser.match('.') | |
108 && parser.inCharRange('0','9') | |
109 ) ) | |
110 throw new ParseException(parser,"bad protocol"); | |
111 request.protocol = parser.textFrom(start); | |
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() ); |
49fb4e83484f
webserver - change headers to lower case
Franklin Schmidt <fschmidt@gmail.com>
parents:
1147
diff
changeset
|
129 return parser.textFrom(start).toLowerCase(); |
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 { |
1148
49fb4e83484f
webserver - change headers to lower case
Franklin Schmidt <fschmidt@gmail.com>
parents:
1147
diff
changeset
|
166 String text = (String)request.headers.get("cookie"); |
1146
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
167 if( text == null ) |
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
168 return; |
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
169 this.parser = new Parser(text); |
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
170 while(true) { |
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
171 int start = parser.currentIndex(); |
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
172 while( parser.noneOf("=;") ); |
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
173 String name = Util.urlDecode( parser.textFrom(start) ); |
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
174 if( parser.match('=') ) { |
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
175 start = parser.currentIndex(); |
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
176 while( parser.noneOf(";") ); |
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
177 String value = Util.urlDecode( parser.textFrom(start) ); |
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
178 request.cookies.put(name,value); |
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
179 } |
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
180 if( parser.endOfInput() ) |
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
181 return; |
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
182 require( parser.match("; ") ); |
1143
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
183 } |
3bf5190b3c77
webserver - handle GET params
Franklin Schmidt <fschmidt@gmail.com>
parents:
1137
diff
changeset
|
184 } |
1146
2dda3c92a473
webserver - implement cookies
Franklin Schmidt <fschmidt@gmail.com>
parents:
1145
diff
changeset
|
185 |
1147
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
186 |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
187 private static final String contentTypeStart = "multipart/form-data; boundary="; |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
188 |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
189 void parseMultipart() throws ParseException { |
1148
49fb4e83484f
webserver - change headers to lower case
Franklin Schmidt <fschmidt@gmail.com>
parents:
1147
diff
changeset
|
190 String contentType = (String)request.headers.get("content-type"); |
1147
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
191 if( !contentType.startsWith(contentTypeStart) ) |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
192 throw new RuntimeException(contentType); |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
193 String boundary = "--"+contentType.substring(contentTypeStart.length()); |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
194 this.parser = new Parser(Util.toString(request.body)); |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
195 require( parser.match(boundary) ); |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
196 boundary = "\r\n" + boundary; |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
197 while( !parser.match("--\r\n") ) { |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
198 require( parser.match("\r\n") ); |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
199 require( parser.match("Content-Disposition: form-data; name=") ); |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
200 String name = quotedString(); |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
201 String filename = null; |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
202 boolean isBinary = false; |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
203 if( parser.match("; filename=") ) { |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
204 filename = quotedString(); |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
205 require( parser.match("\r\n") ); |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
206 require( parser.match("Content-Type: ") ); |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
207 if( parser.match("application/octet-stream") ) { |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
208 isBinary = true; |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
209 } else if( parser.match("text/plain") ) { |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
210 isBinary = false; |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
211 } else |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
212 throw new ParseException(parser,"bad file content-type"); |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
213 } |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
214 require( parser.match("\r\n") ); |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
215 require( parser.match("\r\n") ); |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
216 int start = parser.currentIndex(); |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
217 while( !parser.test(boundary) ) { |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
218 require( parser.anyChar() ); |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
219 } |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
220 String value = parser.textFrom(start); |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
221 if( filename == null ) { |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
222 Util.add(request.parameters,name,value); |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
223 } else { |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
224 Object content = isBinary ? Util.toBytes(value) : value; |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
225 Request.MultipartFile mf = new Request.MultipartFile(filename,content); |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
226 Util.add(request.parameters,name,mf); |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
227 } |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
228 require( parser.match(boundary) ); |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
229 } |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
230 } |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
231 |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
232 private String quotedString() throws ParseException { |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
233 StringBuilder sb = new StringBuilder(); |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
234 require( parser.match('"') ); |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
235 while( !parser.match('"') ) { |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
236 if( parser.match("\\\"") ) { |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
237 sb.append('"'); |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
238 } else { |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
239 require( parser.anyChar() ); |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
240 sb.append( parser.lastChar() ); |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
241 } |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
242 } |
30d87b7d1d62
webserver - support multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
1146
diff
changeset
|
243 return sb.toString(); |
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 |
1137 | 246 } |