OLD | NEW |
---|---|
(Empty) | |
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 | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 // | |
5 | |
6 #import("dart:io"); | |
7 #import("dart:uri"); | |
8 | |
9 HttpServer setupServer() { | |
10 HttpServer server = new HttpServer(); | |
11 server.listen("127.0.0.1", 0, 5); | |
12 | |
13 void addRedirectHandler(int number, int statusCode) { | |
14 server.addRequestHandler( | |
15 (HttpRequest request) => request.path == "/$number", | |
16 (HttpRequest request, HttpResponse response) { | |
17 response.headers.set(HttpHeaders.LOCATION, | |
18 "http://127.0.0.1:${server.port}/${number + 1}"); | |
19 response.statusCode = statusCode; | |
20 response.outputStream.close(); | |
21 }); | |
22 } | |
23 | |
24 // Setup redirect chain. | |
25 int n = 1; | |
26 addRedirectHandler(n++, HttpStatus.MOVED_PERMANENTLY); | |
27 addRedirectHandler(n++, HttpStatus.MOVED_TEMPORARILY); | |
28 addRedirectHandler(n++, HttpStatus.SEE_OTHER); | |
29 addRedirectHandler(n++, HttpStatus.TEMPORARY_REDIRECT); | |
30 for (int i = n; i < 10; i++) { | |
31 addRedirectHandler(i, HttpStatus.MOVED_PERMANENTLY); | |
32 } | |
33 | |
34 // Setup redirect loop. | |
35 server.addRequestHandler( | |
36 (HttpRequest request) => request.path == "/A", | |
37 (HttpRequest request, HttpResponse response) { | |
38 response.headers.set(HttpHeaders.LOCATION, "http://127.0.0.1:${server.por t}/B"); | |
Mads Ager (google)
2012/05/08 12:48:53
Long lines.
Anders Johnsen
2012/05/08 12:58:16
Long line.
Søren Gjesse
2012/05/08 13:32:16
Done.
Søren Gjesse
2012/05/08 13:32:16
Done.
| |
39 response.statusCode = HttpStatus.MOVED_PERMANENTLY; | |
40 response.outputStream.close(); | |
41 } | |
42 ); | |
43 server.addRequestHandler( | |
44 (HttpRequest request) => request.path == "/B", | |
45 (HttpRequest request, HttpResponse response) { | |
46 response.headers.set(HttpHeaders.LOCATION, "http://127.0.0.1:${server.por t}/A"); | |
Anders Johnsen
2012/05/08 12:58:16
Long line.
Søren Gjesse
2012/05/08 13:32:16
Done.
| |
47 response.statusCode = HttpStatus.MOVED_TEMPORARILY; | |
48 response.outputStream.close(); | |
49 } | |
50 ); | |
51 | |
52 return server; | |
53 } | |
54 | |
55 void checkRedirects(int redirectCount, HttpClientConnection conn) { | |
56 if (redirectCount < 2) { | |
57 Expect.isNull(conn.redirects); | |
58 } else { | |
59 Expect.equals(redirectCount - 1, conn.redirects.length); | |
60 for (int i = 0; i < redirectCount - 2; i++) { | |
61 Expect.equals(conn.redirects[i].location.path, "/${i + 2}"); | |
62 } | |
63 } | |
64 } | |
65 | |
66 void testManualRedirect() { | |
67 HttpServer server = setupServer(); | |
68 HttpClient client = new HttpClient(); | |
69 | |
70 int redirectCount = 0; | |
71 HttpClientConnection conn = client.getUrl(new Uri.fromString("http://127.0.0.1 :${server.port}/1")); | |
Anders Johnsen
2012/05/08 12:58:16
Long line.
Søren Gjesse
2012/05/08 13:32:16
Done.
| |
72 conn.onResponse = (HttpClientResponse response) { | |
73 response.inputStream.onData = () => response.inputStream.read(); | |
74 response.inputStream.onClosed = () { | |
75 redirectCount++; | |
76 if (redirectCount < 10) { | |
77 Expect.isTrue(response.isRedirect); | |
78 checkRedirects(redirectCount, conn); | |
79 conn.redirect(); | |
80 } else { | |
81 Expect.equals(HttpStatus.NOT_FOUND, response.statusCode); | |
82 server.close(); | |
83 client.shutdown(); | |
84 } | |
85 }; | |
86 }; | |
87 } | |
88 | |
89 void testAutoRedirect() { | |
90 HttpServer server = setupServer(); | |
91 HttpClient client = new HttpClient(); | |
92 | |
93 HttpClientConnection conn = client.getUrl(new Uri.fromString("http://127.0.0.1 :${server.port}/1")); | |
Anders Johnsen
2012/05/08 12:58:16
Long line.
Søren Gjesse
2012/05/08 13:32:16
Done.
| |
94 conn.followRedirects = true; | |
95 conn.onResponse = (HttpClientResponse response) { | |
96 response.inputStream.onData = () => Expect.fail("Response not expected"); | |
97 response.inputStream.onClosed = () => Expect.fail("Response not expected"); | |
98 }; | |
99 conn.onError = (e) { | |
100 Expect.isTrue(e is RedirectLimitExceeded); | |
101 Expect.equals(5, e.redirects.length); | |
102 server.close(); | |
103 client.shutdown(); | |
104 }; | |
105 } | |
106 | |
107 void testRedirectLoop() { | |
108 HttpServer server = setupServer(); | |
109 HttpClient client = new HttpClient(); | |
110 | |
111 int redirectCount = 0; | |
112 HttpClientConnection conn = client.getUrl(new Uri.fromString("http://127.0.0.1 :${server.port}/A")); | |
Anders Johnsen
2012/05/08 12:58:16
Long line.
Søren Gjesse
2012/05/08 13:32:16
Done.
| |
113 conn.followRedirects = true; | |
114 conn.onResponse = (HttpClientResponse response) { | |
115 response.inputStream.onData = () => Expect.fail("Response not expected"); | |
116 response.inputStream.onClosed = () => Expect.fail("Response not expected"); | |
117 }; | |
118 conn.onError = (e) { | |
119 Expect.isTrue(e is RedirectLoop); | |
120 Expect.equals(2, e.redirects.length); | |
121 server.close(); | |
122 client.shutdown(); | |
123 }; | |
124 } | |
125 | |
126 main() { | |
127 testManualRedirect(); | |
128 testAutoRedirect(); | |
129 testRedirectLoop(); | |
130 } | |
OLD | NEW |