OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 // | 4 // |
5 // VMOptions= | 5 // VMOptions= |
6 // VMOptions=--short_socket_read | 6 // VMOptions=--short_socket_read |
7 // VMOptions=--short_socket_write | 7 // VMOptions=--short_socket_write |
8 // VMOptions=--short_socket_read --short_socket_write | 8 // VMOptions=--short_socket_read --short_socket_write |
9 | 9 |
10 import "dart:isolate"; | 10 import "dart:isolate"; |
11 import "dart:io"; | 11 import "dart:io"; |
(...skipping 15 matching lines...) Expand all Loading... |
27 if (status.isStarted) { | 27 if (status.isStarted) { |
28 _startedCallback(status.port); | 28 _startedCallback(status.port); |
29 } | 29 } |
30 }); | 30 }); |
31 | 31 |
32 // Send server start message to the server. | 32 // Send server start message to the server. |
33 var command = new TestServerCommand.start(); | 33 var command = new TestServerCommand.start(); |
34 _serverPort.send(command, _statusPort.toSendPort()); | 34 _serverPort.send(command, _statusPort.toSendPort()); |
35 } | 35 } |
36 | 36 |
37 void shutdown() { | 37 void close() { |
38 // Send server stop message to the server. | 38 // Send server stop message to the server. |
39 _serverPort.send(new TestServerCommand.stop(), _statusPort.toSendPort()); | 39 _serverPort.send(new TestServerCommand.stop(), _statusPort.toSendPort()); |
40 _statusPort.close(); | 40 _statusPort.close(); |
41 } | 41 } |
42 | 42 |
43 void chunkedEncoding() { | 43 void chunkedEncoding() { |
44 // Send chunked encoding message to the server. | 44 // Send chunked encoding message to the server. |
45 _serverPort.send( | 45 _serverPort.send( |
46 new TestServerCommand.chunkedEncoding(), _statusPort.toSendPort()); | 46 new TestServerCommand.chunkedEncoding(), _statusPort.toSendPort()); |
47 } | 47 } |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 | 91 |
92 void startTestServer() { | 92 void startTestServer() { |
93 var server = new TestServer(); | 93 var server = new TestServer(); |
94 server.init(); | 94 server.init(); |
95 port.receive(server.dispatch); | 95 port.receive(server.dispatch); |
96 } | 96 } |
97 | 97 |
98 | 98 |
99 class TestServer { | 99 class TestServer { |
100 // Echo the request content back to the response. | 100 // Echo the request content back to the response. |
101 void _echoHandler(HttpRequest request, HttpResponse response) { | 101 void _echoHandler(HttpRequest request) { |
| 102 var response = request.response; |
102 Expect.equals("POST", request.method); | 103 Expect.equals("POST", request.method); |
103 response.contentLength = request.contentLength; | 104 response.contentLength = request.contentLength; |
104 request.inputStream.pipe(response.outputStream); | 105 request.pipe(response); |
105 } | 106 } |
106 | 107 |
107 // Echo the request content back to the response. | 108 // Echo the request content back to the response. |
108 void _zeroToTenHandler(HttpRequest request, HttpResponse response) { | 109 void _zeroToTenHandler(HttpRequest request) { |
| 110 var response = request.response; |
109 Expect.equals("GET", request.method); | 111 Expect.equals("GET", request.method); |
110 request.inputStream.onData = () {}; | 112 request.listen((_) {}, onDone: () { |
111 request.inputStream.onClosed = () { | 113 response.addString("01234567890"); |
112 response.outputStream.writeString("01234567890"); | 114 response.close(); |
113 response.outputStream.close(); | 115 }); |
114 }; | |
115 } | 116 } |
116 | 117 |
117 // Return a 404. | 118 // Return a 404. |
118 void _notFoundHandler(HttpRequest request, HttpResponse response) { | 119 void _notFoundHandler(HttpRequest request) { |
| 120 var response = request.response; |
119 response.statusCode = HttpStatus.NOT_FOUND; | 121 response.statusCode = HttpStatus.NOT_FOUND; |
120 response.headers.set("Content-Type", "text/html; charset=UTF-8"); | 122 response.headers.set("Content-Type", "text/html; charset=UTF-8"); |
121 response.outputStream.writeString("Page not found"); | 123 response.addString("Page not found"); |
122 response.outputStream.close(); | 124 response.close(); |
123 } | 125 } |
124 | 126 |
125 // Return a 301 with a custom reason phrase. | 127 // Return a 301 with a custom reason phrase. |
126 void _reasonForMovingHandler(HttpRequest request, HttpResponse response) { | 128 void _reasonForMovingHandler(HttpRequest request) { |
| 129 var response = request.response; |
127 response.statusCode = HttpStatus.MOVED_PERMANENTLY; | 130 response.statusCode = HttpStatus.MOVED_PERMANENTLY; |
128 response.reasonPhrase = "Don't come looking here any more"; | 131 response.reasonPhrase = "Don't come looking here any more"; |
129 response.outputStream.close(); | 132 response.close(); |
130 } | 133 } |
131 | 134 |
132 // Check the "Host" header. | 135 // Check the "Host" header. |
133 void _hostHandler(HttpRequest request, HttpResponse response) { | 136 void _hostHandler(HttpRequest request) { |
| 137 var response = request.response; |
134 Expect.equals(1, request.headers["Host"].length); | 138 Expect.equals(1, request.headers["Host"].length); |
135 Expect.equals("www.dartlang.org:1234", request.headers["Host"][0]); | 139 Expect.equals("www.dartlang.org:1234", request.headers["Host"][0]); |
136 Expect.equals("www.dartlang.org", request.headers.host); | 140 Expect.equals("www.dartlang.org", request.headers.host); |
137 Expect.equals(1234, request.headers.port); | 141 Expect.equals(1234, request.headers.port); |
138 response.statusCode = HttpStatus.OK; | 142 response.statusCode = HttpStatus.OK; |
139 response.outputStream.close(); | 143 response.close(); |
140 } | 144 } |
141 | 145 |
142 void init() { | 146 void init() { |
143 // Setup request handlers. | 147 // Setup request handlers. |
144 _requestHandlers = new Map(); | 148 _requestHandlers = new Map(); |
145 _requestHandlers["/echo"] = _echoHandler; | 149 _requestHandlers["/echo"] = _echoHandler; |
146 _requestHandlers["/0123456789"] = _zeroToTenHandler; | 150 _requestHandlers["/0123456789"] = _zeroToTenHandler; |
147 _requestHandlers["/reasonformoving"] = _reasonForMovingHandler; | 151 _requestHandlers["/reasonformoving"] = _reasonForMovingHandler; |
148 _requestHandlers["/host"] = _hostHandler; | 152 _requestHandlers["/host"] = _hostHandler; |
149 } | 153 } |
150 | 154 |
151 void dispatch(var message, SendPort replyTo) { | 155 void dispatch(var message, SendPort replyTo) { |
152 if (message.isStart) { | 156 if (message.isStart) { |
153 _server = new HttpServer(); | |
154 try { | 157 try { |
155 _server.listen("127.0.0.1", 0); | 158 HttpServer.bind().then((server) { |
156 _server.defaultRequestHandler = _requestReceivedHandler; | 159 _server = server; |
157 replyTo.send(new TestServerStatus.started(_server.port), null); | 160 _server.listen(_requestReceivedHandler); |
| 161 replyTo.send(new TestServerStatus.started(_server.port), null); |
| 162 }); |
158 } catch (e) { | 163 } catch (e) { |
159 replyTo.send(new TestServerStatus.error(), null); | 164 replyTo.send(new TestServerStatus.error(), null); |
160 } | 165 } |
161 } else if (message.isStop) { | 166 } else if (message.isStop) { |
162 _server.close(); | 167 _server.close(); |
163 port.close(); | 168 port.close(); |
164 replyTo.send(new TestServerStatus.stopped(), null); | 169 replyTo.send(new TestServerStatus.stopped(), null); |
165 } else if (message.isChunkedEncoding) { | 170 } else if (message.isChunkedEncoding) { |
166 _chunkedEncoding = true; | 171 _chunkedEncoding = true; |
167 } | 172 } |
168 } | 173 } |
169 | 174 |
170 void _requestReceivedHandler(HttpRequest request, HttpResponse response) { | 175 void _requestReceivedHandler(HttpRequest request) { |
171 var requestHandler =_requestHandlers[request.path]; | 176 var requestHandler =_requestHandlers[request.uri.path]; |
172 if (requestHandler != null) { | 177 if (requestHandler != null) { |
173 requestHandler(request, response); | 178 requestHandler(request); |
174 } else { | 179 } else { |
175 _notFoundHandler(request, response); | 180 _notFoundHandler(request); |
176 } | 181 } |
177 } | 182 } |
178 | 183 |
179 HttpServer _server; // HTTP server instance. | 184 HttpServer _server; // HTTP server instance. |
180 Map _requestHandlers; | 185 Map _requestHandlers; |
181 bool _chunkedEncoding = false; | 186 bool _chunkedEncoding = false; |
182 } | 187 } |
183 | 188 |
184 void testStartStop() { | 189 void testStartStop() { |
185 TestServerMain testServerMain = new TestServerMain(); | 190 TestServerMain testServerMain = new TestServerMain(); |
186 testServerMain.setServerStartedHandler((int port) { | 191 testServerMain.setServerStartedHandler((int port) { |
187 testServerMain.shutdown(); | 192 testServerMain.close(); |
188 }); | 193 }); |
189 testServerMain.start(); | 194 testServerMain.start(); |
190 } | 195 } |
191 | 196 |
192 void testGET() { | 197 void testGET() { |
193 TestServerMain testServerMain = new TestServerMain(); | 198 TestServerMain testServerMain = new TestServerMain(); |
194 testServerMain.setServerStartedHandler((int port) { | 199 testServerMain.setServerStartedHandler((int port) { |
195 HttpClient httpClient = new HttpClient(); | 200 HttpClient httpClient = new HttpClient(); |
196 HttpClientConnection conn = | 201 httpClient.get("127.0.0.1", port, "/0123456789") |
197 httpClient.get("127.0.0.1", port, "/0123456789"); | 202 .then((request) => request.close()) |
198 conn.onResponse = (HttpClientResponse response) { | 203 .then((response) { |
199 Expect.equals(HttpStatus.OK, response.statusCode); | 204 Expect.equals(HttpStatus.OK, response.statusCode); |
200 StringInputStream stream = new StringInputStream(response.inputStream); | 205 StringBuffer body = new StringBuffer(); |
201 StringBuffer body = new StringBuffer(); | 206 response.listen( |
202 stream.onData = () => body.add(stream.read()); | 207 (data) => body.add(new String.fromCharCodes(data)), |
203 stream.onClosed = () { | 208 onDone: () { |
204 Expect.equals("01234567890", body.toString()); | 209 Expect.equals("01234567890", body.toString()); |
205 httpClient.shutdown(); | 210 httpClient.close(); |
206 testServerMain.shutdown(); | 211 testServerMain.close(); |
207 }; | 212 }); |
208 }; | 213 }); |
209 }); | 214 }); |
210 testServerMain.start(); | 215 testServerMain.start(); |
211 } | 216 } |
212 | 217 |
213 void testPOST(bool chunkedEncoding) { | 218 void testPOST(bool chunkedEncoding) { |
214 String data = "ABCDEFGHIJKLMONPQRSTUVWXYZ"; | 219 String data = "ABCDEFGHIJKLMONPQRSTUVWXYZ"; |
215 final int kMessageCount = 10; | 220 final int kMessageCount = 10; |
216 | 221 |
217 TestServerMain testServerMain = new TestServerMain(); | 222 TestServerMain testServerMain = new TestServerMain(); |
218 | 223 |
219 void runTest(int port) { | 224 void runTest(int port) { |
220 int count = 0; | 225 int count = 0; |
221 HttpClient httpClient = new HttpClient(); | 226 HttpClient httpClient = new HttpClient(); |
222 void sendRequest() { | 227 void sendRequest() { |
223 HttpClientConnection conn = | 228 httpClient.post("127.0.0.1", port, "/echo") |
224 httpClient.post("127.0.0.1", port, "/echo"); | 229 .then((request) { |
225 conn.onRequest = (HttpClientRequest request) { | 230 if (chunkedEncoding) { |
226 if (chunkedEncoding) { | 231 request.addString(data.substring(0, 10)); |
227 request.outputStream.writeString(data.substring(0, 10)); | 232 request.addString(data.substring(10, data.length)); |
228 request.outputStream.writeString(data.substring(10, data.length)); | 233 } else { |
229 } else { | 234 request.contentLength = data.length; |
230 request.contentLength = data.length; | 235 request.addString(data); |
231 request.outputStream.write(data.charCodes); | 236 } |
232 } | 237 return request.close(); |
233 request.outputStream.close(); | 238 }) |
234 }; | 239 .then((response) { |
235 conn.onResponse = (HttpClientResponse response) { | 240 Expect.equals(HttpStatus.OK, response.statusCode); |
236 Expect.equals(HttpStatus.OK, response.statusCode); | 241 StringBuffer body = new StringBuffer(); |
237 StringInputStream stream = new StringInputStream(response.inputStream); | 242 response.listen( |
238 StringBuffer body = new StringBuffer(); | 243 (data) => body.add(new String.fromCharCodes(data)), |
239 stream.onData = () => body.add(stream.read()); | 244 onDone: () { |
240 stream.onClosed = () { | 245 Expect.equals(data, body.toString()); |
241 Expect.equals(data, body.toString()); | 246 count++; |
242 count++; | 247 if (count < kMessageCount) { |
243 if (count < kMessageCount) { | 248 sendRequest(); |
244 sendRequest(); | 249 } else { |
245 } else { | 250 httpClient.close(); |
246 httpClient.shutdown(); | 251 testServerMain.close(); |
247 testServerMain.shutdown(); | 252 } |
248 } | 253 }); |
249 }; | 254 }); |
250 }; | |
251 } | 255 } |
252 | 256 |
253 sendRequest(); | 257 sendRequest(); |
254 } | 258 } |
255 | 259 |
256 testServerMain.setServerStartedHandler(runTest); | 260 testServerMain.setServerStartedHandler(runTest); |
257 if (chunkedEncoding) { | 261 if (chunkedEncoding) { |
258 testServerMain.chunkedEncoding(); | 262 testServerMain.chunkedEncoding(); |
259 } | 263 } |
260 testServerMain.start(); | 264 testServerMain.start(); |
261 } | 265 } |
262 | 266 |
263 void test404() { | 267 void test404() { |
264 TestServerMain testServerMain = new TestServerMain(); | 268 TestServerMain testServerMain = new TestServerMain(); |
265 testServerMain.setServerStartedHandler((int port) { | 269 testServerMain.setServerStartedHandler((int port) { |
266 HttpClient httpClient = new HttpClient(); | 270 HttpClient httpClient = new HttpClient(); |
267 HttpClientConnection conn = | 271 httpClient.get("127.0.0.1", port, "/thisisnotfound") |
268 httpClient.get("127.0.0.1", port, "/thisisnotfound"); | 272 .then((request) => request.close()) |
269 conn.onResponse = (HttpClientResponse response) { | 273 .then((response) { |
270 Expect.equals(HttpStatus.NOT_FOUND, response.statusCode); | 274 Expect.equals(HttpStatus.NOT_FOUND, response.statusCode); |
271 var body = new StringBuffer(); | 275 var body = new StringBuffer(); |
272 var stream = response.inputStream; | 276 response.listen( |
273 stream.onData = () => body.add(new String.fromCharCodes(stream.read())); | 277 (data) => body.add(new String.fromCharCodes(data)), |
274 stream.onClosed = () { | 278 onDone: () { |
275 Expect.equals("Page not found", body.toString()); | 279 Expect.equals("Page not found", body.toString()); |
276 httpClient.shutdown(); | 280 httpClient.close(); |
277 testServerMain.shutdown(); | 281 testServerMain.close(); |
278 }; | 282 }); |
279 }; | 283 }); |
280 }); | 284 }); |
281 testServerMain.start(); | 285 testServerMain.start(); |
282 } | 286 } |
283 | 287 |
284 void testReasonPhrase() { | 288 void testReasonPhrase() { |
285 TestServerMain testServerMain = new TestServerMain(); | 289 TestServerMain testServerMain = new TestServerMain(); |
286 testServerMain.setServerStartedHandler((int port) { | 290 testServerMain.setServerStartedHandler((int port) { |
287 HttpClient httpClient = new HttpClient(); | 291 HttpClient httpClient = new HttpClient(); |
288 HttpClientConnection conn = | 292 httpClient.get("127.0.0.1", port, "/reasonformoving") |
289 httpClient.get("127.0.0.1", port, "/reasonformoving"); | 293 .then((request) { |
290 conn.followRedirects = false; | 294 request.followRedirects = false; |
291 conn.onResponse = (HttpClientResponse response) { | 295 return request.close(); |
292 Expect.equals(HttpStatus.MOVED_PERMANENTLY, response.statusCode); | 296 }) |
293 Expect.equals("Don't come looking here any more", response.reasonPhrase); | 297 .then((response) { |
294 var stream = response.inputStream; | 298 Expect.equals(HttpStatus.MOVED_PERMANENTLY, response.statusCode); |
295 stream.onData = () => Expect.fail("No data expected"); | 299 Expect.equals("Don't come looking here any more", |
296 stream.onClosed = () { | 300 response.reasonPhrase); |
297 httpClient.shutdown(); | 301 response.listen( |
298 testServerMain.shutdown(); | 302 (data) => Expect.fail("No data expected"), |
299 }; | 303 onDone: () { |
300 }; | 304 httpClient.close(); |
| 305 testServerMain.close(); |
| 306 }); |
| 307 }); |
301 }); | 308 }); |
302 testServerMain.start(); | 309 testServerMain.start(); |
303 } | 310 } |
304 | 311 |
305 void main() { | 312 void main() { |
306 testStartStop(); | 313 testStartStop(); |
307 testGET(); | 314 testGET(); |
308 testPOST(true); | 315 testPOST(true); |
309 testPOST(false); | 316 testPOST(false); |
310 test404(); | 317 test404(); |
311 testReasonPhrase(); | 318 testReasonPhrase(); |
312 } | 319 } |
OLD | NEW |