Index: tests/standalone/io/http_redirect_test.dart |
diff --git a/tests/standalone/io/http_redirect_test.dart b/tests/standalone/io/http_redirect_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..99b0a36dedc6f8aa1762e85d6de47868cbbf687e |
--- /dev/null |
+++ b/tests/standalone/io/http_redirect_test.dart |
@@ -0,0 +1,134 @@ |
+// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+// |
+ |
+#import("dart:io"); |
+#import("dart:uri"); |
+ |
+HttpServer setupServer() { |
+ HttpServer server = new HttpServer(); |
+ server.listen("127.0.0.1", 0, 5); |
+ |
+ void addRedirectHandler(int number, int statusCode) { |
+ server.addRequestHandler( |
+ (HttpRequest request) => request.path == "/$number", |
+ (HttpRequest request, HttpResponse response) { |
+ response.headers.set(HttpHeaders.LOCATION, |
+ "http://127.0.0.1:${server.port}/${number + 1}"); |
+ response.statusCode = statusCode; |
+ response.outputStream.close(); |
+ }); |
+ } |
+ |
+ // Setup redirect chain. |
+ int n = 1; |
+ addRedirectHandler(n++, HttpStatus.MOVED_PERMANENTLY); |
+ addRedirectHandler(n++, HttpStatus.MOVED_TEMPORARILY); |
+ addRedirectHandler(n++, HttpStatus.SEE_OTHER); |
+ addRedirectHandler(n++, HttpStatus.TEMPORARY_REDIRECT); |
+ for (int i = n; i < 10; i++) { |
+ addRedirectHandler(i, HttpStatus.MOVED_PERMANENTLY); |
+ } |
+ |
+ // Setup redirect loop. |
+ server.addRequestHandler( |
+ (HttpRequest request) => request.path == "/A", |
+ (HttpRequest request, HttpResponse response) { |
+ response.headers.set(HttpHeaders.LOCATION, |
+ "http://127.0.0.1:${server.port}/B"); |
+ response.statusCode = HttpStatus.MOVED_PERMANENTLY; |
+ response.outputStream.close(); |
+ } |
+ ); |
+ server.addRequestHandler( |
+ (HttpRequest request) => request.path == "/B", |
+ (HttpRequest request, HttpResponse response) { |
+ response.headers.set(HttpHeaders.LOCATION, |
+ "http://127.0.0.1:${server.port}/A"); |
+ response.statusCode = HttpStatus.MOVED_TEMPORARILY; |
+ response.outputStream.close(); |
+ } |
+ ); |
+ |
+ return server; |
+} |
+ |
+void checkRedirects(int redirectCount, HttpClientConnection conn) { |
+ if (redirectCount < 2) { |
+ Expect.isNull(conn.redirects); |
+ } else { |
+ Expect.equals(redirectCount - 1, conn.redirects.length); |
+ for (int i = 0; i < redirectCount - 2; i++) { |
+ Expect.equals(conn.redirects[i].location.path, "/${i + 2}"); |
+ } |
+ } |
+} |
+ |
+void testManualRedirect() { |
+ HttpServer server = setupServer(); |
+ HttpClient client = new HttpClient(); |
+ |
+ int redirectCount = 0; |
+ HttpClientConnection conn = |
+ client.getUrl(new Uri.fromString("http://127.0.0.1:${server.port}/1")); |
+ conn.followRedirects = false; |
+ conn.onResponse = (HttpClientResponse response) { |
+ response.inputStream.onData = () => response.inputStream.read(); |
+ response.inputStream.onClosed = () { |
+ redirectCount++; |
+ if (redirectCount < 10) { |
+ Expect.isTrue(response.isRedirect); |
+ checkRedirects(redirectCount, conn); |
+ conn.redirect(); |
+ } else { |
+ Expect.equals(HttpStatus.NOT_FOUND, response.statusCode); |
+ server.close(); |
+ client.shutdown(); |
+ } |
+ }; |
+ }; |
+} |
+ |
+void testAutoRedirect() { |
+ HttpServer server = setupServer(); |
+ HttpClient client = new HttpClient(); |
+ |
+ HttpClientConnection conn = |
+ client.getUrl(new Uri.fromString("http://127.0.0.1:${server.port}/1")); |
+ conn.onResponse = (HttpClientResponse response) { |
+ response.inputStream.onData = () => Expect.fail("Response not expected"); |
+ response.inputStream.onClosed = () => Expect.fail("Response not expected"); |
+ }; |
+ conn.onError = (e) { |
+ Expect.isTrue(e is RedirectLimitExceeded); |
+ Expect.equals(5, e.redirects.length); |
+ server.close(); |
+ client.shutdown(); |
+ }; |
+} |
+ |
+void testRedirectLoop() { |
+ HttpServer server = setupServer(); |
+ HttpClient client = new HttpClient(); |
+ |
+ int redirectCount = 0; |
+ HttpClientConnection conn = |
+ client.getUrl(new Uri.fromString("http://127.0.0.1:${server.port}/A")); |
+ conn.onResponse = (HttpClientResponse response) { |
+ response.inputStream.onData = () => Expect.fail("Response not expected"); |
+ response.inputStream.onClosed = () => Expect.fail("Response not expected"); |
+ }; |
+ conn.onError = (e) { |
+ Expect.isTrue(e is RedirectLoop); |
+ Expect.equals(2, e.redirects.length); |
+ server.close(); |
+ client.shutdown(); |
+ }; |
+} |
+ |
+main() { |
+ testManualRedirect(); |
+ testAutoRedirect(); |
+ testRedirectLoop(); |
+} |