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

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: Review fixes 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
« no previous file with comments | « tests/standalone/io/http_basic_test.dart ('k') | tests/standalone/standalone.status » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 (_) => Expect.fail("Response data not expected"),
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(
174 conn.onRequest = (HttpClientRequest request) { 194 (_) => Expect.fail("Response data not expected"),
175 request.headers.add("X-Request-Header", "value"); 195 onDone: () {
176 request.outputStream.close(); 196 redirectCount++;
177 }; 197 if (redirectCount < 2) {
178 conn.onResponse = (HttpClientResponse response) { 198 Expect.isTrue(response.isRedirect);
179 response.inputStream.onData = response.inputStream.read; 199 response.redirect().then(handleResponse);
180 response.inputStream.onClosed = () { 200 } else {
181 redirectCount++; 201 Expect.equals(HttpStatus.OK, response.statusCode);
182 if (redirectCount < 2) { 202 server.close();
183 Expect.isTrue(response.isRedirect); 203 client.close();
184 conn.redirect(); 204 }
185 } else { 205 });
186 Expect.equals(HttpStatus.OK, response.statusCode); 206 }
187 server.close(); 207
188 client.shutdown(); 208 client.getUrl(new Uri.fromString("http://127.0.0.1:${server.port}/src"))
189 } 209 .then((HttpClientRequest request) {
190 }; 210 request.followRedirects = false;
191 }; 211 request.headers.add("X-Request-Header", "value");
212 return request.close();
213 }).then(handleResponse);
192 } 214 }
193 215
194 void testAutoRedirect() { 216 void testAutoRedirect() {
195 HttpServer server = setupServer(); 217 HttpServer server = setupServer();
196 HttpClient client = new HttpClient(); 218 HttpClient client = new HttpClient();
197 219
198 var requestCount = 0; 220 client.getUrl(new Uri.fromString("http://127.0.0.1:${server.port}/redirect"))
199 221 .then((HttpClientRequest request) {
200 void onRequest(HttpClientRequest request) { 222 return request.close();
201 requestCount++; 223 })
202 request.outputStream.close(); 224 .then((HttpClientResponse response) {
203 } 225 response.listen(
204 226 (_) => Expect.fail("Response data not expected"),
205 void onResponse(HttpClientResponse response) { 227 onDone: () {
206 response.inputStream.onData = 228 Expect.equals(1, response.redirects.length);
207 () => Expect.fail("Response data not expected"); 229 server.close();
208 response.inputStream.onClosed = () { 230 client.close();
209 Expect.equals(1, requestCount); 231 });
210 server.close(); 232 });
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 } 233 }
222 234
223 void testAutoRedirectWithHeaders() { 235 void testAutoRedirectWithHeaders() {
224 HttpServer server = setupServer(); 236 HttpServer server = setupServer();
225 HttpClient client = new HttpClient(); 237 HttpClient client = new HttpClient();
226 238
227 var requestCount = 0; 239 client.getUrl(new Uri.fromString("http://127.0.0.1:${server.port}/src"))
228 240 .then((HttpClientRequest request) {
229 void onRequest(HttpClientRequest request) { 241 request.headers.add("X-Request-Header", "value");
230 requestCount++; 242 return request.close();
231 request.headers.add("X-Request-Header", "value"); 243 })
232 request.outputStream.close(); 244 .then((HttpClientResponse response) {
233 }; 245 response.listen(
234 246 (_) => Expect.fail("Response data not expected"),
235 void onResponse(HttpClientResponse response) { 247 onDone: () {
236 response.inputStream.onData = 248 Expect.equals(1, response.redirects.length);
237 () => Expect.fail("Response data not expected"); 249 server.close();
238 response.inputStream.onClosed = () { 250 client.close();
239 Expect.equals(1, requestCount); 251 });
240 server.close(); 252 });
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 } 253 }
251 254
252 void testAutoRedirect301POST() { 255 void testAutoRedirect301POST() {
253 HttpServer server = setupServer(); 256 HttpServer server = setupServer();
254 HttpClient client = new HttpClient(); 257 HttpClient client = new HttpClient();
255 258
256 var requestCount = 0; 259 client.postUrl(new Uri.fromString("http://127.0.0.1:${server.port}/301src"))
257 260 .then((HttpClientRequest request) {
258 void onRequest(HttpClientRequest request) { 261 return request.close();
259 requestCount++; 262 })
260 request.outputStream.close(); 263 .then((HttpClientResponse response) {
261 }; 264 Expect.equals(HttpStatus.MOVED_PERMANENTLY, response.statusCode);
262 265 response.listen(
263 void onResponse(HttpClientResponse response) { 266 (_) => Expect.fail("Response data not expected"),
264 Expect.equals(HttpStatus.MOVED_PERMANENTLY, response.statusCode); 267 onDone: () {
265 response.inputStream.onData = 268 Expect.equals(0, response.redirects.length);
266 () => Expect.fail("Response data not expected"); 269 server.close();
267 response.inputStream.onClosed = () { 270 client.close();
268 Expect.equals(1, requestCount); 271 });
269 server.close(); 272 });
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 } 273 }
281 274
282 void testAutoRedirect303POST() { 275 void testAutoRedirect303POST() {
283 HttpServer server = setupServer(); 276 HttpServer server = setupServer();
284 HttpClient client = new HttpClient(); 277 HttpClient client = new HttpClient();
285 278
286 var requestCount = 0; 279 client.postUrl(new Uri.fromString("http://127.0.0.1:${server.port}/303src"))
287 280 .then((HttpClientRequest request) {
288 void onRequest(HttpClientRequest request) { 281 return request.close();
289 requestCount++; 282 })
290 request.outputStream.close(); 283 .then((HttpClientResponse response) {
291 }; 284 Expect.equals(HttpStatus.OK, response.statusCode);
292 285 response.listen(
293 void onResponse(HttpClientResponse response) { 286 (_) => Expect.fail("Response data not expected"),
294 Expect.equals(HttpStatus.OK, response.statusCode); 287 onDone: () {
295 response.inputStream.onData = 288 Expect.equals(1, response.redirects.length);
296 () => Expect.fail("Response data not expected"); 289 server.close();
297 response.inputStream.onClosed = () { 290 client.close();
298 Expect.equals(1, requestCount); 291 });
299 server.close(); 292 });
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 } 293 }
311 294
312 void testAutoRedirectLimit() { 295 void testAutoRedirectLimit() {
313 HttpServer server = setupServer(); 296 HttpServer server = setupServer();
314 HttpClient client = new HttpClient(); 297 HttpClient client = new HttpClient();
315 298
316 HttpClientConnection conn = 299 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")); 300 .then((HttpClientRequest request) => request.close())
318 conn.onResponse = (HttpClientResponse response) { 301 .catchError((e) {
319 response.inputStream.onData = () => Expect.fail("Response not expected"); 302 Expect.equals(5, e.error.redirects.length);
320 response.inputStream.onClosed = () => Expect.fail("Response not expected"); 303 server.close();
321 }; 304 client.close();
322 conn.onError = (e) { 305 }, 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 } 306 }
329 307
330 void testRedirectLoop() { 308 void testRedirectLoop() {
331 HttpServer server = setupServer(); 309 HttpServer server = setupServer();
332 HttpClient client = new HttpClient(); 310 HttpClient client = new HttpClient();
333 311
334 int redirectCount = 0; 312 int redirectCount = 0;
335 HttpClientConnection conn = 313 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")); 314 .then((HttpClientRequest request) => request.close())
337 conn.onResponse = (HttpClientResponse response) { 315 .catchError((e) {
338 response.inputStream.onData = () => Expect.fail("Response not expected"); 316 Expect.equals(2, e.error.redirects.length);
339 response.inputStream.onClosed = () => Expect.fail("Response not expected"); 317 server.close();
340 }; 318 client.close();
341 conn.onError = (e) { 319 }, 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 } 320 }
348 321
349 main() { 322 main() {
350 testManualRedirect(); 323 testManualRedirect();
351 testManualRedirectWithHeaders(); 324 testManualRedirectWithHeaders();
352 testAutoRedirect(); 325 testAutoRedirect();
353 testAutoRedirectWithHeaders(); 326 testAutoRedirectWithHeaders();
354 testAutoRedirect301POST(); 327 testAutoRedirect301POST();
355 testAutoRedirect303POST(); 328 testAutoRedirect303POST();
356 testAutoRedirectLimit(); 329 testAutoRedirectLimit();
357 testRedirectLoop(); 330 testRedirectLoop();
358 } 331 }
OLDNEW
« no previous file with comments | « tests/standalone/io/http_basic_test.dart ('k') | tests/standalone/standalone.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698