Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(731)

Side by Side Diff: tests/standalone/io/http_redirect_test.dart

Issue 11783034: Re-implement support for client redirects. (Closed) Base URL: https://dart.googlecode.com/svn/experimental/lib_v2_io/dart
Patch Set: Remove half a TODO. Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 "dart:io"; 6 import "dart:io";
7 import "dart:uri"; 7 import "dart:uri";
8 8
9 HttpServer setupServer() { 9 HttpServer setupServer() {
10 HttpServer server = new HttpServer(); 10 HttpServer server = new HttpServer("127.0.0.1", 0);
11 server.listen("127.0.0.1", 0, backlog: 5); 11
12 var handlers = new Map<String, Function>();
13 addRequestHandler(String path, void handler(HttpRequest request,
14 HttpResponse response)) {
15 handlers[path] = handler;
16 }
17
18 server.listen((HttpRequest request) {
19 if (handlers.containsKey(request.uri.path)) {
20 handlers[request.uri.path](request, request.response);
21 } else {
22 request.listen((_) {}, onDone: () {
23 request.response.statusCode = 404;
24 request.response.close();
25 });
26 }
27 });
12 28
13 void addRedirectHandler(int number, int statusCode) { 29 void addRedirectHandler(int number, int statusCode) {
14 server.addRequestHandler( 30 addRequestHandler(
15 (HttpRequest request) => request.path == "/$number", 31 "/$number",
16 (HttpRequest request, HttpResponse response) { 32 (HttpRequest request, HttpResponse response) {
17 response.headers.set(HttpHeaders.LOCATION, 33 response.headers.set(HttpHeaders.LOCATION,
18 "http://127.0.0.1:${server.port}/${number + 1}"); 34 "http://127.0.0.1:${server.port}/${number + 1}");
19 response.statusCode = statusCode; 35 response.statusCode = statusCode;
20 response.outputStream.close(); 36 response.close();
21 }); 37 });
22 } 38 }
23 39
24 // Setup simple redirect. 40 // Setup simple redirect.
25 server.addRequestHandler( 41 addRequestHandler(
26 (HttpRequest request) => request.path == "/redirect", 42 "/redirect",
27 (HttpRequest request, HttpResponse response) { 43 (HttpRequest request, HttpResponse response) {
28 response.headers.set(HttpHeaders.LOCATION, 44 response.headers.set(HttpHeaders.LOCATION,
29 "http://127.0.0.1:${server.port}/location"); 45 "http://127.0.0.1:${server.port}/location");
30 response.statusCode = HttpStatus.MOVED_PERMANENTLY; 46 response.statusCode = HttpStatus.MOVED_PERMANENTLY;
31 response.outputStream.close(); 47 response.close();
32 } 48 }
33 ); 49 );
34 server.addRequestHandler( 50 addRequestHandler(
35 (HttpRequest request) => request.path == "/location", 51 "/location",
36 (HttpRequest request, HttpResponse response) { 52 (HttpRequest request, HttpResponse response) {
37 response.outputStream.close(); 53 response.close();
38 } 54 }
39 ); 55 );
40 56
41 // Setup redirect chain. 57 // Setup redirect chain.
42 int n = 1; 58 int n = 1;
43 addRedirectHandler(n++, HttpStatus.MOVED_PERMANENTLY); 59 addRedirectHandler(n++, HttpStatus.MOVED_PERMANENTLY);
44 addRedirectHandler(n++, HttpStatus.MOVED_TEMPORARILY); 60 addRedirectHandler(n++, HttpStatus.MOVED_TEMPORARILY);
45 addRedirectHandler(n++, HttpStatus.SEE_OTHER); 61 addRedirectHandler(n++, HttpStatus.SEE_OTHER);
46 addRedirectHandler(n++, HttpStatus.TEMPORARY_REDIRECT); 62 addRedirectHandler(n++, HttpStatus.TEMPORARY_REDIRECT);
47 for (int i = n; i < 10; i++) { 63 for (int i = n; i < 10; i++) {
48 addRedirectHandler(i, HttpStatus.MOVED_PERMANENTLY); 64 addRedirectHandler(i, HttpStatus.MOVED_PERMANENTLY);
49 } 65 }
50 66
51 // Setup redirect loop. 67 // Setup redirect loop.
52 server.addRequestHandler( 68 addRequestHandler(
53 (HttpRequest request) => request.path == "/A", 69 "/A",
54 (HttpRequest request, HttpResponse response) { 70 (HttpRequest request, HttpResponse response) {
55 response.headers.set(HttpHeaders.LOCATION, 71 response.headers.set(HttpHeaders.LOCATION,
56 "http://127.0.0.1:${server.port}/B"); 72 "http://127.0.0.1:${server.port}/B");
57 response.statusCode = HttpStatus.MOVED_PERMANENTLY; 73 response.statusCode = HttpStatus.MOVED_PERMANENTLY;
58 response.outputStream.close(); 74 response.close();
59 } 75 }
60 ); 76 );
61 server.addRequestHandler( 77 addRequestHandler(
62 (HttpRequest request) => request.path == "/B", 78 "/B",
63 (HttpRequest request, HttpResponse response) { 79 (HttpRequest request, HttpResponse response) {
64 response.headers.set(HttpHeaders.LOCATION, 80 response.headers.set(HttpHeaders.LOCATION,
65 "http://127.0.0.1:${server.port}/A"); 81 "http://127.0.0.1:${server.port}/A");
66 response.statusCode = HttpStatus.MOVED_TEMPORARILY; 82 response.statusCode = HttpStatus.MOVED_TEMPORARILY;
67 response.outputStream.close(); 83 response.close();
68 } 84 }
69 ); 85 );
70 86
71 // Setup redirect checking headers. 87 // Setup redirect checking headers.
72 server.addRequestHandler( 88 addRequestHandler(
73 (HttpRequest request) => request.path == "/src", 89 "/src",
74 (HttpRequest request, HttpResponse response) { 90 (HttpRequest request, HttpResponse response) {
75 Expect.equals("value", request.headers.value("X-Request-Header")); 91 Expect.equals("value", request.headers.value("X-Request-Header"));
76 response.headers.set(HttpHeaders.LOCATION, 92 response.headers.set(HttpHeaders.LOCATION,
77 "http://127.0.0.1:${server.port}/target"); 93 "http://127.0.0.1:${server.port}/target");
78 response.statusCode = HttpStatus.MOVED_PERMANENTLY; 94 response.statusCode = HttpStatus.MOVED_PERMANENTLY;
79 response.outputStream.close(); 95 response.close();
80 } 96 }
81 ); 97 );
82 server.addRequestHandler( 98 addRequestHandler(
83 (HttpRequest request) => request.path == "/target", 99 "/target",
84 (HttpRequest request, HttpResponse response) { 100 (HttpRequest request, HttpResponse response) {
85 Expect.equals("value", request.headers.value("X-Request-Header")); 101 Expect.equals("value", request.headers.value("X-Request-Header"));
86 response.outputStream.close(); 102 response.close();
87 } 103 }
88 ); 104 );
89 105
90 // Setup redirect for 301 where POST should not redirect. 106 // Setup redirect for 301 where POST should not redirect.
91 server.addRequestHandler( 107 addRequestHandler(
92 (HttpRequest request) => request.path == "/301src", 108 "/301src",
93 (HttpRequest request, HttpResponse response) { 109 (HttpRequest request, HttpResponse response) {
94 Expect.equals("POST", request.method); 110 Expect.equals("POST", request.method);
95 response.headers.set(HttpHeaders.LOCATION, 111 response.headers.set(HttpHeaders.LOCATION,
96 "http://127.0.0.1:${server.port}/301target"); 112 "http://127.0.0.1:${server.port}/301target");
97 response.statusCode = HttpStatus.MOVED_PERMANENTLY; 113 response.statusCode = HttpStatus.MOVED_PERMANENTLY;
98 response.outputStream.close(); 114 response.close();
99 } 115 }
100 ); 116 );
101 server.addRequestHandler( 117 addRequestHandler(
102 (HttpRequest request) => request.path == "/301target", 118 "/301target",
103 (HttpRequest request, HttpResponse response) { 119 (HttpRequest request, HttpResponse response) {
104 Expect.fail("Redirect of POST should not happen"); 120 Expect.fail("Redirect of POST should not happen");
105 } 121 }
106 ); 122 );
107 123
108 // Setup redirect for 303 where POST should turn into GET. 124 // Setup redirect for 303 where POST should turn into GET.
109 server.addRequestHandler( 125 addRequestHandler(
110 (HttpRequest request) => request.path == "/303src", 126 "/303src",
111 (HttpRequest request, HttpResponse response) { 127 (HttpRequest request, HttpResponse response) {
112 Expect.equals("POST", request.method); 128 Expect.equals("POST", request.method);
113 response.headers.set(HttpHeaders.LOCATION, 129 response.headers.set(HttpHeaders.LOCATION,
114 "http://127.0.0.1:${server.port}/303target"); 130 "http://127.0.0.1:${server.port}/303target");
115 response.statusCode = HttpStatus.SEE_OTHER; 131 response.statusCode = HttpStatus.SEE_OTHER;
116 response.outputStream.close(); 132 response.close();
117 } 133 }
118 ); 134 );
119 server.addRequestHandler( 135 addRequestHandler(
120 (HttpRequest request) => request.path == "/303target", 136 "/303target",
121 (HttpRequest request, HttpResponse response) { 137 (HttpRequest request, HttpResponse response) {
122 Expect.equals("GET", request.method); 138 Expect.equals("GET", request.method);
123 response.outputStream.close(); 139 response.close();
124 } 140 }
125 ); 141 );
126 142
127 return server; 143 return server;
128 } 144 }
129 145
130 void checkRedirects(int redirectCount, HttpClientConnection conn) { 146 void checkRedirects(int redirectCount, HttpClientResponse response) {
131 if (redirectCount < 2) { 147 if (redirectCount < 2) {
132 Expect.isNull(conn.redirects); 148 Expect.isTrue(response.redirects.isEmpty);
133 } else { 149 } else {
134 Expect.equals(redirectCount - 1, conn.redirects.length); 150 Expect.equals(redirectCount - 1, response.redirects.length);
135 for (int i = 0; i < redirectCount - 2; i++) { 151 for (int i = 0; i < redirectCount - 2; i++) {
136 Expect.equals(conn.redirects[i].location.path, "/${i + 2}"); 152 Expect.equals(response.redirects[i].location.path, "/${i + 2}");
137 } 153 }
138 } 154 }
139 } 155 }
140 156
141 void testManualRedirect() { 157 void testManualRedirect() {
142 HttpServer server = setupServer(); 158 HttpServer server = setupServer();
143 HttpClient client = new HttpClient(); 159 HttpClient client = new HttpClient();
144 160
145 int redirectCount = 0; 161 int redirectCount = 0;
146 HttpClientConnection conn = 162 handleResponse(HttpClientResponse response) {
147 client.getUrl(new Uri.fromString("http://127.0.0.1:${server.port}/1")); 163 response.listen(
148 conn.followRedirects = false; 164 (_) {},
Søren Gjesse 2013/01/09 08:43:49 Maybe add Expect.fail here as no data is expected.
Anders Johnsen 2013/01/09 10:03:00 Done.
149 conn.onResponse = (HttpClientResponse response) { 165 onDone: () {
150 response.inputStream.onData = response.inputStream.read; 166 redirectCount++;
151 response.inputStream.onClosed = () { 167 if (redirectCount < 10) {
152 redirectCount++; 168 Expect.isTrue(response.isRedirect);
153 if (redirectCount < 10) { 169 checkRedirects(redirectCount, response);
154 Expect.isTrue(response.isRedirect); 170 response.redirect().then(handleResponse);
155 checkRedirects(redirectCount, conn); 171 } else {
156 conn.redirect(); 172 Expect.equals(HttpStatus.NOT_FOUND, response.statusCode);
157 } else { 173 server.close();
158 Expect.equals(HttpStatus.NOT_FOUND, response.statusCode); 174 client.close();
159 server.close(); 175 }
160 client.shutdown(); 176 });
161 } 177 }
162 }; 178 client.getUrl(new Uri.fromString("http://127.0.0.1:${server.port}/1"))
163 }; 179 .then((HttpClientRequest request) {
180 request.followRedirects = false;
181 return request.close();
182 })
183 .then(handleResponse);
164 } 184 }
165 185
166 void testManualRedirectWithHeaders() { 186 void testManualRedirectWithHeaders() {
167 HttpServer server = setupServer(); 187 HttpServer server = setupServer();
168 HttpClient client = new HttpClient(); 188 HttpClient client = new HttpClient();
169 189
170 int redirectCount = 0; 190 int redirectCount = 0;
171 HttpClientConnection conn = 191
172 client.getUrl(new Uri.fromString("http://127.0.0.1:${server.port}/src")); 192 handleResponse(HttpClientResponse response) {
173 conn.followRedirects = false; 193 response.listen((_) {}, onDone: () {
Søren Gjesse 2013/01/09 08:43:49 Ditto.
Anders Johnsen 2013/01/09 10:03:00 Done.
174 conn.onRequest = (HttpClientRequest request) {
175 request.headers.add("X-Request-Header", "value");
176 request.outputStream.close();
177 };
178 conn.onResponse = (HttpClientResponse response) {
179 response.inputStream.onData = response.inputStream.read;
180 response.inputStream.onClosed = () {
181 redirectCount++; 194 redirectCount++;
182 if (redirectCount < 2) { 195 if (redirectCount < 2) {
183 Expect.isTrue(response.isRedirect); 196 Expect.isTrue(response.isRedirect);
184 conn.redirect(); 197 response.redirect().then(handleResponse);
185 } else { 198 } else {
186 Expect.equals(HttpStatus.OK, response.statusCode); 199 Expect.equals(HttpStatus.OK, response.statusCode);
187 server.close(); 200 server.close();
188 client.shutdown(); 201 client.close();
189 } 202 }
190 }; 203 });
191 }; 204 }
205
206 client.getUrl(new Uri.fromString("http://127.0.0.1:${server.port}/src"))
207 .then((HttpClientRequest request) {
208 request.followRedirects = false;
209 request.headers.add("X-Request-Header", "value");
210 return request.close();
211 }).then(handleResponse);
192 } 212 }
193 213
194 void testAutoRedirect() { 214 void testAutoRedirect() {
195 HttpServer server = setupServer(); 215 HttpServer server = setupServer();
196 HttpClient client = new HttpClient(); 216 HttpClient client = new HttpClient();
197 217
198 var requestCount = 0; 218 client.getUrl(new Uri.fromString("http://127.0.0.1:${server.port}/redirect"))
199 219 .then((HttpClientRequest request) {
200 void onRequest(HttpClientRequest request) { 220 return request.close();
201 requestCount++; 221 })
202 request.outputStream.close(); 222 .then((HttpClientResponse response) {
203 } 223 response.listen(
204 224 (_) => Expect.fail("Response data not expected"),
205 void onResponse(HttpClientResponse response) { 225 onDone: () {
206 response.inputStream.onData = 226 Expect.equals(1, response.redirects.length);
207 () => Expect.fail("Response data not expected"); 227 server.close();
208 response.inputStream.onClosed = () { 228 client.close();
209 Expect.equals(1, requestCount); 229 });
210 server.close(); 230 });
211 client.shutdown();
212 };
213 };
214
215 HttpClientConnection conn =
216 client.getUrl(
217 new Uri.fromString("http://127.0.0.1:${server.port}/redirect"));
218 conn.onRequest = onRequest;
219 conn.onResponse = onResponse;
220 conn.onError = (e) => Expect.fail("Error not expected ($e)");
221 } 231 }
222 232
223 void testAutoRedirectWithHeaders() { 233 void testAutoRedirectWithHeaders() {
224 HttpServer server = setupServer(); 234 HttpServer server = setupServer();
225 HttpClient client = new HttpClient(); 235 HttpClient client = new HttpClient();
226 236
227 var requestCount = 0; 237 client.getUrl(new Uri.fromString("http://127.0.0.1:${server.port}/src"))
228 238 .then((HttpClientRequest request) {
229 void onRequest(HttpClientRequest request) { 239 request.headers.add("X-Request-Header", "value");
230 requestCount++; 240 return request.close();
231 request.headers.add("X-Request-Header", "value"); 241 })
232 request.outputStream.close(); 242 .then((HttpClientResponse response) {
233 }; 243 response.listen(
234 244 (_) => Expect.fail("Response data not expected"),
235 void onResponse(HttpClientResponse response) { 245 onDone: () {
236 response.inputStream.onData = 246 Expect.equals(1, response.redirects.length);
237 () => Expect.fail("Response data not expected"); 247 server.close();
238 response.inputStream.onClosed = () { 248 client.close();
239 Expect.equals(1, requestCount); 249 });
240 server.close(); 250 });
241 client.shutdown();
242 };
243 };
244
245 HttpClientConnection conn =
246 client.getUrl(new Uri.fromString("http://127.0.0.1:${server.port}/src"));
247 conn.onRequest = onRequest;
248 conn.onResponse = onResponse;
249 conn.onError = (e) => Expect.fail("Error not expected ($e)");
250 } 251 }
251 252
252 void testAutoRedirect301POST() { 253 void testAutoRedirect301POST() {
253 HttpServer server = setupServer(); 254 HttpServer server = setupServer();
254 HttpClient client = new HttpClient(); 255 HttpClient client = new HttpClient();
255 256
256 var requestCount = 0; 257 client.postUrl(new Uri.fromString("http://127.0.0.1:${server.port}/301src"))
257 258 .then((HttpClientRequest request) {
258 void onRequest(HttpClientRequest request) { 259 return request.close();
259 requestCount++; 260 })
260 request.outputStream.close(); 261 .then((HttpClientResponse response) {
261 }; 262 Expect.equals(HttpStatus.MOVED_PERMANENTLY, response.statusCode);
262 263 response.listen(
263 void onResponse(HttpClientResponse response) { 264 (_) => Expect.fail("Response data not expected"),
264 Expect.equals(HttpStatus.MOVED_PERMANENTLY, response.statusCode); 265 onDone: () {
265 response.inputStream.onData = 266 Expect.equals(0, response.redirects.length);
266 () => Expect.fail("Response data not expected"); 267 server.close();
267 response.inputStream.onClosed = () { 268 client.close();
268 Expect.equals(1, requestCount); 269 });
269 server.close(); 270 });
270 client.shutdown();
271 };
272 };
273
274 HttpClientConnection conn =
275 client.postUrl(
276 new Uri.fromString("http://127.0.0.1:${server.port}/301src"));
277 conn.onRequest = onRequest;
278 conn.onResponse = onResponse;
279 conn.onError = (e) => Expect.fail("Error not expected ($e)");
280 } 271 }
281 272
282 void testAutoRedirect303POST() { 273 void testAutoRedirect303POST() {
283 HttpServer server = setupServer(); 274 HttpServer server = setupServer();
284 HttpClient client = new HttpClient(); 275 HttpClient client = new HttpClient();
285 276
286 var requestCount = 0; 277 client.postUrl(new Uri.fromString("http://127.0.0.1:${server.port}/303src"))
287 278 .then((HttpClientRequest request) {
288 void onRequest(HttpClientRequest request) { 279 return request.close();
289 requestCount++; 280 })
290 request.outputStream.close(); 281 .then((HttpClientResponse response) {
291 }; 282 Expect.equals(HttpStatus.OK, response.statusCode);
292 283 response.listen(
293 void onResponse(HttpClientResponse response) { 284 (_) => Expect.fail("Response data not expected"),
294 Expect.equals(HttpStatus.OK, response.statusCode); 285 onDone: () {
295 response.inputStream.onData = 286 Expect.equals(1, response.redirects.length);
296 () => Expect.fail("Response data not expected"); 287 server.close();
297 response.inputStream.onClosed = () { 288 client.close();
298 Expect.equals(1, requestCount); 289 });
299 server.close(); 290 });
300 client.shutdown();
301 };
302 };
303
304 HttpClientConnection conn =
305 client.postUrl(
306 new Uri.fromString("http://127.0.0.1:${server.port}/303src"));
307 conn.onRequest = onRequest;
308 conn.onResponse = onResponse;
309 conn.onError = (e) => Expect.fail("Error not expected ($e)");
310 } 291 }
311 292
312 void testAutoRedirectLimit() { 293 void testAutoRedirectLimit() {
313 HttpServer server = setupServer(); 294 HttpServer server = setupServer();
314 HttpClient client = new HttpClient(); 295 HttpClient client = new HttpClient();
315 296
316 HttpClientConnection conn = 297 client.getUrl(new Uri.fromString("http://127.0.0.1:${server.port}/1"))
317 client.getUrl(new Uri.fromString("http://127.0.0.1:${server.port}/1")); 298 .then((HttpClientRequest request) => request.close())
318 conn.onResponse = (HttpClientResponse response) { 299 .catchError((e) {
319 response.inputStream.onData = () => Expect.fail("Response not expected"); 300 Expect.equals(5, e.error.redirects.length);
320 response.inputStream.onClosed = () => Expect.fail("Response not expected"); 301 server.close();
321 }; 302 client.close();
322 conn.onError = (e) { 303 }, test: (e) => e is RedirectLimitExceededException);
323 Expect.isTrue(e is RedirectLimitExceededException);
324 Expect.equals(5, e.redirects.length);
325 server.close();
326 client.shutdown();
327 };
328 } 304 }
329 305
330 void testRedirectLoop() { 306 void testRedirectLoop() {
331 HttpServer server = setupServer(); 307 HttpServer server = setupServer();
332 HttpClient client = new HttpClient(); 308 HttpClient client = new HttpClient();
333 309
334 int redirectCount = 0; 310 int redirectCount = 0;
335 HttpClientConnection conn = 311 client.getUrl(new Uri.fromString("http://127.0.0.1:${server.port}/A"))
336 client.getUrl(new Uri.fromString("http://127.0.0.1:${server.port}/A")); 312 .then((HttpClientRequest request) => request.close())
337 conn.onResponse = (HttpClientResponse response) { 313 .catchError((e) {
338 response.inputStream.onData = () => Expect.fail("Response not expected"); 314 Expect.equals(2, e.error.redirects.length);
339 response.inputStream.onClosed = () => Expect.fail("Response not expected"); 315 server.close();
340 }; 316 client.close();
341 conn.onError = (e) { 317 }, test: (e) => e is RedirectLoopException);
342 Expect.isTrue(e is RedirectLoopException);
343 Expect.equals(2, e.redirects.length);
344 server.close();
345 client.shutdown();
346 };
347 } 318 }
348 319
349 main() { 320 main() {
350 testManualRedirect(); 321 testManualRedirect();
351 testManualRedirectWithHeaders(); 322 // testManualRedirectWithHeaders();
Søren Gjesse 2013/01/09 08:43:49 Why are these tests still commented out?
Anders Johnsen 2013/01/09 10:03:00 Argh, fixed!!
352 testAutoRedirect(); 323 // testAutoRedirect();
353 testAutoRedirectWithHeaders(); 324 // testAutoRedirectWithHeaders();
354 testAutoRedirect301POST(); 325 // testAutoRedirect301POST();
355 testAutoRedirect303POST(); 326 // testAutoRedirect303POST();
356 testAutoRedirectLimit(); 327 // testAutoRedirectLimit();
357 testRedirectLoop(); 328 // testRedirectLoop();
358 } 329 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698