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, |
| 39 "http://127.0.0.1:${server.port}/B"); |
| 40 response.statusCode = HttpStatus.MOVED_PERMANENTLY; |
| 41 response.outputStream.close(); |
| 42 } |
| 43 ); |
| 44 server.addRequestHandler( |
| 45 (HttpRequest request) => request.path == "/B", |
| 46 (HttpRequest request, HttpResponse response) { |
| 47 response.headers.set(HttpHeaders.LOCATION, |
| 48 "http://127.0.0.1:${server.port}/A"); |
| 49 response.statusCode = HttpStatus.MOVED_TEMPORARILY; |
| 50 response.outputStream.close(); |
| 51 } |
| 52 ); |
| 53 |
| 54 return server; |
| 55 } |
| 56 |
| 57 void checkRedirects(int redirectCount, HttpClientConnection conn) { |
| 58 if (redirectCount < 2) { |
| 59 Expect.isNull(conn.redirects); |
| 60 } else { |
| 61 Expect.equals(redirectCount - 1, conn.redirects.length); |
| 62 for (int i = 0; i < redirectCount - 2; i++) { |
| 63 Expect.equals(conn.redirects[i].location.path, "/${i + 2}"); |
| 64 } |
| 65 } |
| 66 } |
| 67 |
| 68 void testManualRedirect() { |
| 69 HttpServer server = setupServer(); |
| 70 HttpClient client = new HttpClient(); |
| 71 |
| 72 int redirectCount = 0; |
| 73 HttpClientConnection conn = |
| 74 client.getUrl(new Uri.fromString("http://127.0.0.1:${server.port}/1")); |
| 75 conn.followRedirects = false; |
| 76 conn.onResponse = (HttpClientResponse response) { |
| 77 response.inputStream.onData = () => response.inputStream.read(); |
| 78 response.inputStream.onClosed = () { |
| 79 redirectCount++; |
| 80 if (redirectCount < 10) { |
| 81 Expect.isTrue(response.isRedirect); |
| 82 checkRedirects(redirectCount, conn); |
| 83 conn.redirect(); |
| 84 } else { |
| 85 Expect.equals(HttpStatus.NOT_FOUND, response.statusCode); |
| 86 server.close(); |
| 87 client.shutdown(); |
| 88 } |
| 89 }; |
| 90 }; |
| 91 } |
| 92 |
| 93 void testAutoRedirect() { |
| 94 HttpServer server = setupServer(); |
| 95 HttpClient client = new HttpClient(); |
| 96 |
| 97 HttpClientConnection conn = |
| 98 client.getUrl(new Uri.fromString("http://127.0.0.1:${server.port}/1")); |
| 99 conn.onResponse = (HttpClientResponse response) { |
| 100 response.inputStream.onData = () => Expect.fail("Response not expected"); |
| 101 response.inputStream.onClosed = () => Expect.fail("Response not expected"); |
| 102 }; |
| 103 conn.onError = (e) { |
| 104 Expect.isTrue(e is RedirectLimitExceeded); |
| 105 Expect.equals(5, e.redirects.length); |
| 106 server.close(); |
| 107 client.shutdown(); |
| 108 }; |
| 109 } |
| 110 |
| 111 void testRedirectLoop() { |
| 112 HttpServer server = setupServer(); |
| 113 HttpClient client = new HttpClient(); |
| 114 |
| 115 int redirectCount = 0; |
| 116 HttpClientConnection conn = |
| 117 client.getUrl(new Uri.fromString("http://127.0.0.1:${server.port}/A")); |
| 118 conn.onResponse = (HttpClientResponse response) { |
| 119 response.inputStream.onData = () => Expect.fail("Response not expected"); |
| 120 response.inputStream.onClosed = () => Expect.fail("Response not expected"); |
| 121 }; |
| 122 conn.onError = (e) { |
| 123 Expect.isTrue(e is RedirectLoop); |
| 124 Expect.equals(2, e.redirects.length); |
| 125 server.close(); |
| 126 client.shutdown(); |
| 127 }; |
| 128 } |
| 129 |
| 130 main() { |
| 131 testManualRedirect(); |
| 132 testAutoRedirect(); |
| 133 testRedirectLoop(); |
| 134 } |
OLD | NEW |