OLD | NEW |
1 // Copyright (c) 2013, 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 | 5 |
6 import "package:expect/expect.dart"; | 6 import "package:expect/expect.dart"; |
7 import "dart:async"; | 7 import "dart:async"; |
8 import "dart:io"; | 8 import "dart:io"; |
9 | 9 |
10 Future<HttpServer> setupServer() { | 10 Future<HttpServer> setupServer() { |
11 Completer completer = new Completer(); | 11 Completer completer = new Completer(); |
12 HttpServer.bind("127.0.0.1", 0).then((server) { | 12 HttpServer.bind("127.0.0.1", 0).then((server) { |
13 | |
14 var handlers = new Map<String, Function>(); | 13 var handlers = new Map<String, Function>(); |
15 addRequestHandler(String path, void handler(HttpRequest request, | 14 addRequestHandler( |
16 HttpResponse response)) { | 15 String path, void handler(HttpRequest request, HttpResponse response)) { |
17 handlers[path] = handler; | 16 handlers[path] = handler; |
18 } | 17 } |
19 | 18 |
20 server.listen((HttpRequest request) { | 19 server.listen((HttpRequest request) { |
21 if (handlers.containsKey(request.uri.path)) { | 20 if (handlers.containsKey(request.uri.path)) { |
22 handlers[request.uri.path](request, request.response); | 21 handlers[request.uri.path](request, request.response); |
23 } else { | 22 } else { |
24 request.listen((_) {}, onDone: () { | 23 request.listen((_) {}, onDone: () { |
25 request.response.statusCode = 404; | 24 request.response.statusCode = 404; |
26 request.response.close(); | 25 request.response.close(); |
27 }); | 26 }); |
28 } | 27 } |
29 }); | 28 }); |
30 | 29 |
31 void addRedirectHandler(int number, int statusCode) { | 30 void addRedirectHandler(int number, int statusCode) { |
32 addRequestHandler( | 31 addRequestHandler("/$number", |
33 "/$number", | 32 (HttpRequest request, HttpResponse response) { |
34 (HttpRequest request, HttpResponse response) { | 33 response.redirect( |
35 response.redirect( | 34 Uri.parse("http://127.0.0.1:${server.port}/${number + 1}")); |
36 Uri.parse("http://127.0.0.1:${server.port}/${number + 1}")); | 35 }); |
37 }); | |
38 } | 36 } |
39 | 37 |
40 // Setup simple redirect. | 38 // Setup simple redirect. |
41 addRequestHandler( | 39 addRequestHandler("/redirect", |
42 "/redirect", | 40 (HttpRequest request, HttpResponse response) { |
43 (HttpRequest request, HttpResponse response) { | 41 response.redirect(Uri.parse("http://127.0.0.1:${server.port}/location"), |
44 response.redirect( | 42 status: HttpStatus.MOVED_PERMANENTLY); |
45 Uri.parse("http://127.0.0.1:${server.port}/location"), | 43 }); |
46 status: HttpStatus.MOVED_PERMANENTLY); | 44 addRequestHandler("/location", |
47 } | 45 (HttpRequest request, HttpResponse response) { |
48 ); | 46 response.close(); |
49 addRequestHandler( | 47 }); |
50 "/location", | |
51 (HttpRequest request, HttpResponse response) { | |
52 response.close(); | |
53 } | |
54 ); | |
55 | 48 |
56 // Setup redirects with relative url. | 49 // Setup redirects with relative url. |
57 addRequestHandler( | 50 addRequestHandler("/redirectUrl", |
58 "/redirectUrl", | 51 (HttpRequest request, HttpResponse response) { |
59 (HttpRequest request, HttpResponse response) { | 52 response.headers.set(HttpHeaders.LOCATION, "/some/relativeUrl"); |
60 response.headers.set(HttpHeaders.LOCATION, "/some/relativeUrl"); | 53 response.statusCode = HttpStatus.MOVED_PERMANENTLY; |
61 response.statusCode = HttpStatus.MOVED_PERMANENTLY; | 54 response.close(); |
62 response.close(); | 55 }); |
63 } | |
64 ); | |
65 | 56 |
66 addRequestHandler( | 57 addRequestHandler("/some/redirectUrl", |
67 "/some/redirectUrl", | 58 (HttpRequest request, HttpResponse response) { |
68 (HttpRequest request, HttpResponse response) { | 59 response.headers.set(HttpHeaders.LOCATION, "relativeUrl"); |
69 response.headers.set(HttpHeaders.LOCATION, "relativeUrl"); | 60 response.statusCode = HttpStatus.MOVED_PERMANENTLY; |
70 response.statusCode = HttpStatus.MOVED_PERMANENTLY; | 61 response.close(); |
71 response.close(); | 62 }); |
72 } | |
73 ); | |
74 | 63 |
75 addRequestHandler( | 64 addRequestHandler("/some/relativeUrl", |
76 "/some/relativeUrl", | 65 (HttpRequest request, HttpResponse response) { |
77 (HttpRequest request, HttpResponse response) { | 66 response.close(); |
78 response.close(); | 67 }); |
79 } | |
80 ); | |
81 | 68 |
82 addRequestHandler( | 69 addRequestHandler("/some/relativeToAbsolute", |
83 "/some/relativeToAbsolute", | 70 (HttpRequest request, HttpResponse response) { |
84 (HttpRequest request, HttpResponse response) { | 71 response.redirect(Uri.parse("xxx"), status: HttpStatus.SEE_OTHER); |
85 response.redirect(Uri.parse("xxx"), status: HttpStatus.SEE_OTHER); | 72 }); |
86 } | |
87 ); | |
88 | 73 |
89 addRequestHandler( | 74 addRequestHandler("/redirectUrl2", |
90 "/redirectUrl2", | 75 (HttpRequest request, HttpResponse response) { |
91 (HttpRequest request, HttpResponse response) { | 76 response.headers.set(HttpHeaders.LOCATION, "location"); |
92 response.headers.set(HttpHeaders.LOCATION, "location"); | 77 response.statusCode = HttpStatus.MOVED_PERMANENTLY; |
93 response.statusCode = HttpStatus.MOVED_PERMANENTLY; | 78 response.close(); |
94 response.close(); | 79 }); |
95 } | |
96 ); | |
97 | 80 |
98 addRequestHandler( | 81 addRequestHandler("/redirectUrl3", |
99 "/redirectUrl3", | 82 (HttpRequest request, HttpResponse response) { |
100 (HttpRequest request, HttpResponse response) { | 83 response.headers.set(HttpHeaders.LOCATION, "./location"); |
101 response.headers.set(HttpHeaders.LOCATION, "./location"); | 84 response.statusCode = HttpStatus.MOVED_PERMANENTLY; |
102 response.statusCode = HttpStatus.MOVED_PERMANENTLY; | 85 response.close(); |
103 response.close(); | 86 }); |
104 } | |
105 ); | |
106 | 87 |
107 addRequestHandler( | 88 addRequestHandler("/redirectUrl4", |
108 "/redirectUrl4", | 89 (HttpRequest request, HttpResponse response) { |
109 (HttpRequest request, HttpResponse response) { | 90 response.headers.set(HttpHeaders.LOCATION, "./a/b/../../location"); |
110 response.headers.set(HttpHeaders.LOCATION, "./a/b/../../location"); | 91 response.statusCode = HttpStatus.MOVED_PERMANENTLY; |
111 response.statusCode = HttpStatus.MOVED_PERMANENTLY; | 92 response.close(); |
112 response.close(); | 93 }); |
113 } | |
114 ); | |
115 | 94 |
116 addRequestHandler( | 95 addRequestHandler("/redirectUrl5", |
117 "/redirectUrl5", | 96 (HttpRequest request, HttpResponse response) { |
118 (HttpRequest request, HttpResponse response) { | 97 response.headers |
119 response.headers.set(HttpHeaders.LOCATION, | 98 .set(HttpHeaders.LOCATION, "//127.0.0.1:${server.port}/location"); |
120 "//127.0.0.1:${server.port}/location"); | 99 response.statusCode = HttpStatus.MOVED_PERMANENTLY; |
121 response.statusCode = HttpStatus.MOVED_PERMANENTLY; | 100 response.close(); |
122 response.close(); | 101 }); |
123 } | |
124 ); | |
125 | 102 |
126 // Setup redirect chain. | 103 // Setup redirect chain. |
127 int n = 1; | 104 int n = 1; |
128 addRedirectHandler(n++, HttpStatus.MOVED_PERMANENTLY); | 105 addRedirectHandler(n++, HttpStatus.MOVED_PERMANENTLY); |
129 addRedirectHandler(n++, HttpStatus.MOVED_TEMPORARILY); | 106 addRedirectHandler(n++, HttpStatus.MOVED_TEMPORARILY); |
130 addRedirectHandler(n++, HttpStatus.SEE_OTHER); | 107 addRedirectHandler(n++, HttpStatus.SEE_OTHER); |
131 addRedirectHandler(n++, HttpStatus.TEMPORARY_REDIRECT); | 108 addRedirectHandler(n++, HttpStatus.TEMPORARY_REDIRECT); |
132 for (int i = n; i < 10; i++) { | 109 for (int i = n; i < 10; i++) { |
133 addRedirectHandler(i, HttpStatus.MOVED_PERMANENTLY); | 110 addRedirectHandler(i, HttpStatus.MOVED_PERMANENTLY); |
134 } | 111 } |
135 | 112 |
136 // Setup redirect loop. | 113 // Setup redirect loop. |
137 addRequestHandler( | 114 addRequestHandler("/A", (HttpRequest request, HttpResponse response) { |
138 "/A", | 115 response.headers |
139 (HttpRequest request, HttpResponse response) { | 116 .set(HttpHeaders.LOCATION, "http://127.0.0.1:${server.port}/B"); |
140 response.headers.set(HttpHeaders.LOCATION, | 117 response.statusCode = HttpStatus.MOVED_PERMANENTLY; |
141 "http://127.0.0.1:${server.port}/B"); | 118 response.close(); |
142 response.statusCode = HttpStatus.MOVED_PERMANENTLY; | 119 }); |
143 response.close(); | 120 addRequestHandler("/B", (HttpRequest request, HttpResponse response) { |
144 } | 121 response.headers |
145 ); | 122 .set(HttpHeaders.LOCATION, "http://127.0.0.1:${server.port}/A"); |
146 addRequestHandler( | 123 response.statusCode = HttpStatus.MOVED_TEMPORARILY; |
147 "/B", | 124 response.close(); |
148 (HttpRequest request, HttpResponse response) { | 125 }); |
149 response.headers.set(HttpHeaders.LOCATION, | |
150 "http://127.0.0.1:${server.port}/A"); | |
151 response.statusCode = HttpStatus.MOVED_TEMPORARILY; | |
152 response.close(); | |
153 } | |
154 ); | |
155 | 126 |
156 // Setup redirect checking headers. | 127 // Setup redirect checking headers. |
157 addRequestHandler( | 128 addRequestHandler("/src", (HttpRequest request, HttpResponse response) { |
158 "/src", | 129 Expect.equals("value", request.headers.value("X-Request-Header")); |
159 (HttpRequest request, HttpResponse response) { | 130 response.headers |
160 Expect.equals("value", request.headers.value("X-Request-Header")); | 131 .set(HttpHeaders.LOCATION, "http://127.0.0.1:${server.port}/target"); |
161 response.headers.set(HttpHeaders.LOCATION, | 132 response.statusCode = HttpStatus.MOVED_PERMANENTLY; |
162 "http://127.0.0.1:${server.port}/target"); | 133 response.close(); |
163 response.statusCode = HttpStatus.MOVED_PERMANENTLY; | 134 }); |
164 response.close(); | 135 addRequestHandler("/target", (HttpRequest request, HttpResponse response) { |
165 } | 136 Expect.equals("value", request.headers.value("X-Request-Header")); |
166 ); | 137 response.close(); |
167 addRequestHandler( | 138 }); |
168 "/target", | |
169 (HttpRequest request, HttpResponse response) { | |
170 Expect.equals("value", request.headers.value("X-Request-Header")); | |
171 response.close(); | |
172 } | |
173 ); | |
174 | 139 |
175 // Setup redirect for 301 where POST should not redirect. | 140 // Setup redirect for 301 where POST should not redirect. |
176 addRequestHandler( | 141 addRequestHandler("/301src", (HttpRequest request, HttpResponse response) { |
177 "/301src", | 142 Expect.equals("POST", request.method); |
| 143 request.listen((_) {}, onDone: () { |
| 144 response.headers.set( |
| 145 HttpHeaders.LOCATION, "http://127.0.0.1:${server.port}/301target"); |
| 146 response.statusCode = HttpStatus.MOVED_PERMANENTLY; |
| 147 response.close(); |
| 148 }); |
| 149 }); |
| 150 addRequestHandler("/301target", |
178 (HttpRequest request, HttpResponse response) { | 151 (HttpRequest request, HttpResponse response) { |
179 Expect.equals("POST", request.method); | 152 Expect.fail("Redirect of POST should not happen"); |
180 request.listen( | 153 }); |
181 (_) {}, | |
182 onDone: () { | |
183 response.headers.set( | |
184 HttpHeaders.LOCATION, | |
185 "http://127.0.0.1:${server.port}/301target"); | |
186 response.statusCode = HttpStatus.MOVED_PERMANENTLY; | |
187 response.close(); | |
188 }); | |
189 }); | |
190 addRequestHandler( | |
191 "/301target", | |
192 (HttpRequest request, HttpResponse response) { | |
193 Expect.fail("Redirect of POST should not happen"); | |
194 } | |
195 ); | |
196 | 154 |
197 // Setup redirect for 303 where POST should turn into GET. | 155 // Setup redirect for 303 where POST should turn into GET. |
198 addRequestHandler( | 156 addRequestHandler("/303src", (HttpRequest request, HttpResponse response) { |
199 "/303src", | 157 request.listen((_) {}, onDone: () { |
| 158 Expect.equals("POST", request.method); |
| 159 response.headers.set( |
| 160 HttpHeaders.LOCATION, "http://127.0.0.1:${server.port}/303target"); |
| 161 response.statusCode = HttpStatus.SEE_OTHER; |
| 162 response.close(); |
| 163 }); |
| 164 }); |
| 165 addRequestHandler("/303target", |
200 (HttpRequest request, HttpResponse response) { | 166 (HttpRequest request, HttpResponse response) { |
201 request.listen((_) {}, onDone: () { | 167 Expect.equals("GET", request.method); |
202 Expect.equals("POST", request.method); | 168 response.close(); |
203 response.headers.set( | 169 }); |
204 HttpHeaders.LOCATION, | |
205 "http://127.0.0.1:${server.port}/303target"); | |
206 response.statusCode = HttpStatus.SEE_OTHER; | |
207 response.close(); | |
208 }); | |
209 }); | |
210 addRequestHandler( | |
211 "/303target", | |
212 (HttpRequest request, HttpResponse response) { | |
213 Expect.equals("GET", request.method); | |
214 response.close(); | |
215 }); | |
216 | 170 |
217 // Setup redirect where we close the connection. | 171 // Setup redirect where we close the connection. |
218 addRequestHandler( | 172 addRequestHandler("/closing", (HttpRequest request, HttpResponse response) { |
219 "/closing", | 173 response.headers |
220 (HttpRequest request, HttpResponse response) { | 174 .set(HttpHeaders.LOCATION, "http://127.0.0.1:${server.port}/"); |
221 response.headers.set(HttpHeaders.LOCATION, | 175 response.statusCode = HttpStatus.FOUND; |
222 "http://127.0.0.1:${server.port}/"); | 176 response.persistentConnection = false; |
223 response.statusCode = HttpStatus.FOUND; | 177 response.close(); |
224 response.persistentConnection = false; | 178 }); |
225 response.close(); | |
226 }); | |
227 | 179 |
228 completer.complete(server); | 180 completer.complete(server); |
229 }); | 181 }); |
230 return completer.future; | 182 return completer.future; |
231 } | 183 } |
232 | 184 |
233 void checkRedirects(int redirectCount, HttpClientResponse response) { | 185 void checkRedirects(int redirectCount, HttpClientResponse response) { |
234 if (redirectCount < 2) { | 186 if (redirectCount < 2) { |
235 Expect.isTrue(response.redirects.isEmpty); | 187 Expect.isTrue(response.redirects.isEmpty); |
236 } else { | 188 } else { |
237 Expect.equals(redirectCount - 1, response.redirects.length); | 189 Expect.equals(redirectCount - 1, response.redirects.length); |
238 for (int i = 0; i < redirectCount - 2; i++) { | 190 for (int i = 0; i < redirectCount - 2; i++) { |
239 Expect.equals(response.redirects[i].location.path, "/${i + 2}"); | 191 Expect.equals(response.redirects[i].location.path, "/${i + 2}"); |
240 } | 192 } |
241 } | 193 } |
242 } | 194 } |
243 | 195 |
244 void testManualRedirect() { | 196 void testManualRedirect() { |
245 setupServer().then((server) { | 197 setupServer().then((server) { |
246 HttpClient client = new HttpClient(); | 198 HttpClient client = new HttpClient(); |
247 | 199 |
248 int redirectCount = 0; | 200 int redirectCount = 0; |
249 handleResponse(HttpClientResponse response) { | 201 handleResponse(HttpClientResponse response) { |
250 response.listen( | 202 response.listen((_) => Expect.fail("Response data not expected"), |
251 (_) => Expect.fail("Response data not expected"), | |
252 onDone: () { | 203 onDone: () { |
253 redirectCount++; | 204 redirectCount++; |
254 if (redirectCount < 10) { | 205 if (redirectCount < 10) { |
255 Expect.isTrue(response.isRedirect); | 206 Expect.isTrue(response.isRedirect); |
256 checkRedirects(redirectCount, response); | 207 checkRedirects(redirectCount, response); |
257 response.redirect().then(handleResponse); | 208 response.redirect().then(handleResponse); |
258 } else { | 209 } else { |
259 Expect.equals(HttpStatus.NOT_FOUND, response.statusCode); | 210 Expect.equals(HttpStatus.NOT_FOUND, response.statusCode); |
260 server.close(); | 211 server.close(); |
261 client.close(); | 212 client.close(); |
262 } | 213 } |
263 }); | 214 }); |
264 } | 215 } |
265 client.getUrl(Uri.parse("http://127.0.0.1:${server.port}/1")) | 216 |
266 .then((HttpClientRequest request) { | 217 client |
267 request.followRedirects = false; | 218 .getUrl(Uri.parse("http://127.0.0.1:${server.port}/1")) |
268 return request.close(); | 219 .then((HttpClientRequest request) { |
269 }) | 220 request.followRedirects = false; |
270 .then(handleResponse); | 221 return request.close(); |
| 222 }).then(handleResponse); |
271 }); | 223 }); |
272 } | 224 } |
273 | 225 |
274 void testManualRedirectWithHeaders() { | 226 void testManualRedirectWithHeaders() { |
275 setupServer().then((server) { | 227 setupServer().then((server) { |
276 HttpClient client = new HttpClient(); | 228 HttpClient client = new HttpClient(); |
277 | 229 |
278 int redirectCount = 0; | 230 int redirectCount = 0; |
279 | 231 |
280 handleResponse(HttpClientResponse response) { | 232 handleResponse(HttpClientResponse response) { |
281 response.listen( | 233 response.listen((_) => Expect.fail("Response data not expected"), |
282 (_) => Expect.fail("Response data not expected"), | |
283 onDone: () { | 234 onDone: () { |
284 redirectCount++; | 235 redirectCount++; |
285 if (redirectCount < 2) { | 236 if (redirectCount < 2) { |
286 Expect.isTrue(response.isRedirect); | 237 Expect.isTrue(response.isRedirect); |
287 response.redirect().then(handleResponse); | 238 response.redirect().then(handleResponse); |
288 } else { | 239 } else { |
289 Expect.equals(HttpStatus.OK, response.statusCode); | 240 Expect.equals(HttpStatus.OK, response.statusCode); |
290 server.close(); | 241 server.close(); |
291 client.close(); | 242 client.close(); |
292 } | 243 } |
293 }); | 244 }); |
294 } | 245 } |
295 | 246 |
296 client.getUrl(Uri.parse("http://127.0.0.1:${server.port}/src")) | 247 client |
297 .then((HttpClientRequest request) { | 248 .getUrl(Uri.parse("http://127.0.0.1:${server.port}/src")) |
298 request.followRedirects = false; | 249 .then((HttpClientRequest request) { |
299 request.headers.add("X-Request-Header", "value"); | 250 request.followRedirects = false; |
300 return request.close(); | 251 request.headers.add("X-Request-Header", "value"); |
301 }).then(handleResponse); | 252 return request.close(); |
| 253 }).then(handleResponse); |
302 }); | 254 }); |
303 } | 255 } |
304 | 256 |
305 void testAutoRedirect() { | 257 void testAutoRedirect() { |
306 setupServer().then((server) { | 258 setupServer().then((server) { |
307 HttpClient client = new HttpClient(); | 259 HttpClient client = new HttpClient(); |
308 | 260 |
309 client.getUrl(Uri.parse("http://127.0.0.1:${server.port}/redirect")) | 261 client |
310 .then((HttpClientRequest request) { | 262 .getUrl(Uri.parse("http://127.0.0.1:${server.port}/redirect")) |
311 return request.close(); | 263 .then((HttpClientRequest request) { |
312 }) | 264 return request.close(); |
313 .then((HttpClientResponse response) { | 265 }).then((HttpClientResponse response) { |
314 response.listen( | 266 response.listen((_) => Expect.fail("Response data not expected"), |
315 (_) => Expect.fail("Response data not expected"), | 267 onDone: () { |
316 onDone: () { | 268 Expect.equals(1, response.redirects.length); |
317 Expect.equals(1, response.redirects.length); | 269 server.close(); |
318 server.close(); | 270 client.close(); |
319 client.close(); | |
320 }); | |
321 }); | 271 }); |
| 272 }); |
322 }); | 273 }); |
323 } | 274 } |
324 | 275 |
325 void testAutoRedirectWithHeaders() { | 276 void testAutoRedirectWithHeaders() { |
326 setupServer().then((server) { | 277 setupServer().then((server) { |
327 HttpClient client = new HttpClient(); | 278 HttpClient client = new HttpClient(); |
328 | 279 |
329 client.getUrl(Uri.parse("http://127.0.0.1:${server.port}/src")) | 280 client |
330 .then((HttpClientRequest request) { | 281 .getUrl(Uri.parse("http://127.0.0.1:${server.port}/src")) |
331 request.headers.add("X-Request-Header", "value"); | 282 .then((HttpClientRequest request) { |
332 return request.close(); | 283 request.headers.add("X-Request-Header", "value"); |
333 }) | 284 return request.close(); |
334 .then((HttpClientResponse response) { | 285 }).then((HttpClientResponse response) { |
335 response.listen( | 286 response.listen((_) => Expect.fail("Response data not expected"), |
336 (_) => Expect.fail("Response data not expected"), | 287 onDone: () { |
337 onDone: () { | 288 Expect.equals(1, response.redirects.length); |
338 Expect.equals(1, response.redirects.length); | 289 server.close(); |
339 server.close(); | 290 client.close(); |
340 client.close(); | |
341 }); | |
342 }); | 291 }); |
| 292 }); |
343 }); | 293 }); |
344 } | 294 } |
345 | 295 |
346 void testAutoRedirect301POST() { | 296 void testAutoRedirect301POST() { |
347 setupServer().then((server) { | 297 setupServer().then((server) { |
348 HttpClient client = new HttpClient(); | 298 HttpClient client = new HttpClient(); |
349 | 299 |
350 client.postUrl(Uri.parse("http://127.0.0.1:${server.port}/301src")) | 300 client |
351 .then((HttpClientRequest request) { | 301 .postUrl(Uri.parse("http://127.0.0.1:${server.port}/301src")) |
352 return request.close(); | 302 .then((HttpClientRequest request) { |
353 }) | 303 return request.close(); |
354 .then((HttpClientResponse response) { | 304 }).then((HttpClientResponse response) { |
355 Expect.equals(HttpStatus.MOVED_PERMANENTLY, response.statusCode); | 305 Expect.equals(HttpStatus.MOVED_PERMANENTLY, response.statusCode); |
356 response.listen( | 306 response.listen((_) => Expect.fail("Response data not expected"), |
357 (_) => Expect.fail("Response data not expected"), | 307 onDone: () { |
358 onDone: () { | 308 Expect.equals(0, response.redirects.length); |
359 Expect.equals(0, response.redirects.length); | 309 server.close(); |
360 server.close(); | 310 client.close(); |
361 client.close(); | |
362 }); | |
363 }); | 311 }); |
| 312 }); |
364 }); | 313 }); |
365 } | 314 } |
366 | 315 |
367 void testAutoRedirect303POST() { | 316 void testAutoRedirect303POST() { |
368 setupServer().then((server) { | 317 setupServer().then((server) { |
369 HttpClient client = new HttpClient(); | 318 HttpClient client = new HttpClient(); |
370 | 319 |
371 client.postUrl(Uri.parse("http://127.0.0.1:${server.port}/303src")) | 320 client |
372 .then((HttpClientRequest request) { | 321 .postUrl(Uri.parse("http://127.0.0.1:${server.port}/303src")) |
373 return request.close(); | 322 .then((HttpClientRequest request) { |
374 }) | 323 return request.close(); |
375 .then((HttpClientResponse response) { | 324 }).then((HttpClientResponse response) { |
376 Expect.equals(HttpStatus.OK, response.statusCode); | 325 Expect.equals(HttpStatus.OK, response.statusCode); |
377 response.listen( | 326 response.listen((_) => Expect.fail("Response data not expected"), |
378 (_) => Expect.fail("Response data not expected"), | 327 onDone: () { |
379 onDone: () { | 328 Expect.equals(1, response.redirects.length); |
380 Expect.equals(1, response.redirects.length); | 329 server.close(); |
381 server.close(); | 330 client.close(); |
382 client.close(); | |
383 }); | |
384 }); | 331 }); |
| 332 }); |
385 }); | 333 }); |
386 } | 334 } |
387 | 335 |
388 void testAutoRedirectLimit() { | 336 void testAutoRedirectLimit() { |
389 setupServer().then((server) { | 337 setupServer().then((server) { |
390 HttpClient client = new HttpClient(); | 338 HttpClient client = new HttpClient(); |
391 | 339 |
392 client.getUrl(Uri.parse("http://127.0.0.1:${server.port}/1")) | 340 client |
393 .then((HttpClientRequest request) => request.close()) | 341 .getUrl(Uri.parse("http://127.0.0.1:${server.port}/1")) |
394 .catchError((error) { | 342 .then((HttpClientRequest request) => request.close()) |
395 Expect.equals(5, error.redirects.length); | 343 .catchError((error) { |
396 server.close(); | 344 Expect.equals(5, error.redirects.length); |
397 client.close(); | 345 server.close(); |
398 }, test: (e) => e is RedirectException); | 346 client.close(); |
| 347 }, test: (e) => e is RedirectException); |
399 }); | 348 }); |
400 } | 349 } |
401 | 350 |
402 void testRedirectLoop() { | 351 void testRedirectLoop() { |
403 setupServer().then((server) { | 352 setupServer().then((server) { |
404 HttpClient client = new HttpClient(); | 353 HttpClient client = new HttpClient(); |
405 | 354 |
406 int redirectCount = 0; | 355 int redirectCount = 0; |
407 client.getUrl(Uri.parse("http://127.0.0.1:${server.port}/A")) | 356 client |
408 .then((HttpClientRequest request) => request.close()) | 357 .getUrl(Uri.parse("http://127.0.0.1:${server.port}/A")) |
409 .catchError((error) { | 358 .then((HttpClientRequest request) => request.close()) |
410 Expect.equals(2, error.redirects.length); | 359 .catchError((error) { |
411 server.close(); | 360 Expect.equals(2, error.redirects.length); |
412 client.close(); | 361 server.close(); |
413 }, test: (e) => e is RedirectException); | 362 client.close(); |
| 363 }, test: (e) => e is RedirectException); |
414 }); | 364 }); |
415 } | 365 } |
416 | 366 |
417 void testRedirectClosingConnection() { | 367 void testRedirectClosingConnection() { |
418 setupServer().then((server) { | 368 setupServer().then((server) { |
419 HttpClient client = new HttpClient(); | 369 HttpClient client = new HttpClient(); |
420 | 370 |
421 client.getUrl(Uri.parse("http://127.0.0.1:${server.port}/closing")) | 371 client |
| 372 .getUrl(Uri.parse("http://127.0.0.1:${server.port}/closing")) |
422 .then((request) => request.close()) | 373 .then((request) => request.close()) |
423 .then((response) { | 374 .then((response) { |
424 response.listen( | 375 response.listen((_) {}, onDone: () { |
425 (_) {}, | 376 Expect.equals(1, response.redirects.length); |
426 onDone: () { | 377 server.close(); |
427 Expect.equals(1, response.redirects.length); | 378 client.close(); |
428 server.close(); | 379 }); |
429 client.close(); | 380 }); |
430 }); | |
431 }); | |
432 }); | 381 }); |
433 } | 382 } |
434 | 383 |
435 void testRedirectRelativeUrl() { | 384 void testRedirectRelativeUrl() { |
436 testPath(String path) { | 385 testPath(String path) { |
437 setupServer().then((server) { | 386 setupServer().then((server) { |
438 HttpClient client = new HttpClient(); | 387 HttpClient client = new HttpClient(); |
439 | 388 |
440 print(path); | 389 print(path); |
441 client.getUrl(Uri.parse("http://127.0.0.1:${server.port}$path")) | 390 client |
| 391 .getUrl(Uri.parse("http://127.0.0.1:${server.port}$path")) |
442 .then((request) => request.close()) | 392 .then((request) => request.close()) |
443 .then((response) { | 393 .then((response) { |
444 response.listen( | 394 response.listen((_) {}, onDone: () { |
445 (_) {}, | 395 Expect.equals(HttpStatus.OK, response.statusCode); |
446 onDone: () { | 396 Expect.equals(1, response.redirects.length); |
447 Expect.equals(HttpStatus.OK, response.statusCode); | 397 server.close(); |
448 Expect.equals(1, response.redirects.length); | 398 client.close(); |
449 server.close(); | 399 }); |
450 client.close(); | 400 }); |
451 }); | |
452 }); | |
453 }); | 401 }); |
454 } | 402 } |
| 403 |
455 testPath("/redirectUrl"); | 404 testPath("/redirectUrl"); |
456 testPath("/some/redirectUrl"); | 405 testPath("/some/redirectUrl"); |
457 testPath("/redirectUrl2"); | 406 testPath("/redirectUrl2"); |
458 testPath("/redirectUrl3"); | 407 testPath("/redirectUrl3"); |
459 testPath("/redirectUrl4"); | 408 testPath("/redirectUrl4"); |
460 testPath("/redirectUrl5"); | 409 testPath("/redirectUrl5"); |
461 } | 410 } |
462 | 411 |
463 void testRedirectRelativeToAbsolute() { | 412 void testRedirectRelativeToAbsolute() { |
464 setupServer().then((server) { | 413 setupServer().then((server) { |
465 HttpClient client = new HttpClient(); | 414 HttpClient client = new HttpClient(); |
466 | 415 |
467 int redirectCount = 0; | 416 int redirectCount = 0; |
468 handleResponse(HttpClientResponse response) { | 417 handleResponse(HttpClientResponse response) { |
469 response.listen( | 418 response.listen((_) => Expect.fail("Response data not expected"), |
470 (_) => Expect.fail("Response data not expected"), | |
471 onDone: () { | 419 onDone: () { |
472 Expect.equals(HttpStatus.SEE_OTHER, response.statusCode); | 420 Expect.equals(HttpStatus.SEE_OTHER, response.statusCode); |
473 Expect.equals("xxx", | 421 Expect.equals("xxx", response.headers["Location"][0]); |
474 response.headers["Location"][0]); | 422 Expect.isTrue(response.isRedirect); |
475 Expect.isTrue(response.isRedirect); | 423 server.close(); |
476 server.close(); | 424 client.close(); |
477 client.close(); | 425 }); |
478 }); | |
479 } | 426 } |
480 client.getUrl( | 427 |
481 Uri.parse("http://127.0.0.1:${server.port}/some/relativeToAbsolute")) | 428 client |
482 .then((HttpClientRequest request) { | 429 .getUrl(Uri |
483 request.followRedirects = false; | 430 .parse("http://127.0.0.1:${server.port}/some/relativeToAbsolute")) |
484 return request.close(); | 431 .then((HttpClientRequest request) { |
485 }) | 432 request.followRedirects = false; |
486 .then(handleResponse); | 433 return request.close(); |
| 434 }).then(handleResponse); |
487 }); | 435 }); |
488 } | 436 } |
489 | 437 |
490 | |
491 main() { | 438 main() { |
492 testManualRedirect(); | 439 testManualRedirect(); |
493 testManualRedirectWithHeaders(); | 440 testManualRedirectWithHeaders(); |
494 testAutoRedirect(); | 441 testAutoRedirect(); |
495 testAutoRedirectWithHeaders(); | 442 testAutoRedirectWithHeaders(); |
496 testAutoRedirect301POST(); | 443 testAutoRedirect301POST(); |
497 testAutoRedirect303POST(); | 444 testAutoRedirect303POST(); |
498 testAutoRedirectLimit(); | 445 testAutoRedirectLimit(); |
499 testRedirectLoop(); | 446 testRedirectLoop(); |
500 testRedirectClosingConnection(); | 447 testRedirectClosingConnection(); |
501 testRedirectRelativeUrl(); | 448 testRedirectRelativeUrl(); |
502 testRedirectRelativeToAbsolute(); | 449 testRedirectRelativeToAbsolute(); |
503 } | 450 } |
OLD | NEW |