| 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 | 
| index 4df9782b8ec0c3de39b553d2f9cb6935c74976d4..3209496ff0953425a8f4d097637c45bea986c0cb 100644 | 
| --- a/tests/standalone/io/http_redirect_test.dart | 
| +++ b/tests/standalone/io/http_redirect_test.dart | 
| @@ -3,386 +3,370 @@ | 
| // BSD-style license that can be found in the LICENSE file. | 
| // | 
|  | 
| +import "dart:async"; | 
| import "dart:io"; | 
| import "dart:uri"; | 
|  | 
| -HttpServer setupServer() { | 
| -  HttpServer server = new HttpServer(); | 
| -  server.listen("127.0.0.1", 0, backlog: 5); | 
| +Future<HttpServer> setupServer() { | 
| +  Completer completer = new Completer(); | 
| +  HttpServer.bind().then((server) { | 
|  | 
| -  void addRedirectHandler(int number, int statusCode) { | 
| -    server.addRequestHandler( | 
| -       (HttpRequest request) => request.path == "/$number", | 
| +    var handlers = new Map<String, Function>(); | 
| +    addRequestHandler(String path, void handler(HttpRequest request, | 
| +                                                HttpResponse response)) { | 
| +      handlers[path] = handler; | 
| +    } | 
| + | 
| +    server.listen((HttpRequest request) { | 
| +      if (handlers.containsKey(request.uri.path)) { | 
| +        handlers[request.uri.path](request, request.response); | 
| +      } else { | 
| +        request.listen((_) {}, onDone: () { | 
| +          request.response.statusCode = 404; | 
| +          request.response.close(); | 
| +        }); | 
| +      } | 
| +    }); | 
| + | 
| +    void addRedirectHandler(int number, int statusCode) { | 
| +      addRequestHandler( | 
| +         "/$number", | 
| +         (HttpRequest request, HttpResponse response) { | 
| +         response.headers.set(HttpHeaders.LOCATION, | 
| +                              "http://127.0.0.1:${server.port}/${number + 1}"); | 
| +         response.statusCode = statusCode; | 
| +         response.close(); | 
| +       }); | 
| +    } | 
| + | 
| +    // Setup simple redirect. | 
| +    addRequestHandler( | 
| +       "/redirect", | 
| (HttpRequest request, HttpResponse response) { | 
| -       response.headers.set(HttpHeaders.LOCATION, | 
| -                            "http://127.0.0.1:${server.port}/${number + 1}"); | 
| -       response.statusCode = statusCode; | 
| -       response.outputStream.close(); | 
| -     }); | 
| -  } | 
| +         response.headers.set(HttpHeaders.LOCATION, | 
| +                              "http://127.0.0.1:${server.port}/location"); | 
| +         response.statusCode = HttpStatus.MOVED_PERMANENTLY; | 
| +         response.close(); | 
| +       } | 
| +    ); | 
| +    addRequestHandler( | 
| +       "/location", | 
| +       (HttpRequest request, HttpResponse response) { | 
| +         response.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 simple redirect. | 
| -  server.addRequestHandler( | 
| -     (HttpRequest request) => request.path == "/redirect", | 
| -     (HttpRequest request, HttpResponse response) { | 
| -       response.headers.set(HttpHeaders.LOCATION, | 
| -                            "http://127.0.0.1:${server.port}/location"); | 
| -       response.statusCode = HttpStatus.MOVED_PERMANENTLY; | 
| -       response.outputStream.close(); | 
| -     } | 
| -  ); | 
| -  server.addRequestHandler( | 
| -     (HttpRequest request) => request.path == "/location", | 
| -     (HttpRequest request, HttpResponse response) { | 
| -       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. | 
| +    addRequestHandler( | 
| +       "/A", | 
| +       (HttpRequest request, HttpResponse response) { | 
| +         response.headers.set(HttpHeaders.LOCATION, | 
| +                              "http://127.0.0.1:${server.port}/B"); | 
| +         response.statusCode = HttpStatus.MOVED_PERMANENTLY; | 
| +         response.close(); | 
| +       } | 
| +    ); | 
| +    addRequestHandler( | 
| +       "/B", | 
| +       (HttpRequest request, HttpResponse response) { | 
| +         response.headers.set(HttpHeaders.LOCATION, | 
| +                              "http://127.0.0.1:${server.port}/A"); | 
| +         response.statusCode = HttpStatus.MOVED_TEMPORARILY; | 
| +         response.close(); | 
| +       } | 
| +    ); | 
| + | 
| +    // Setup redirect checking headers. | 
| +    addRequestHandler( | 
| +       "/src", | 
| +       (HttpRequest request, HttpResponse response) { | 
| +         Expect.equals("value", request.headers.value("X-Request-Header")); | 
| +         response.headers.set(HttpHeaders.LOCATION, | 
| +                              "http://127.0.0.1:${server.port}/target"); | 
| +         response.statusCode = HttpStatus.MOVED_PERMANENTLY; | 
| +         response.close(); | 
| +       } | 
| +    ); | 
| +    addRequestHandler( | 
| +       "/target", | 
| +       (HttpRequest request, HttpResponse response) { | 
| +         Expect.equals("value", request.headers.value("X-Request-Header")); | 
| +         response.close(); | 
| +       } | 
| +    ); | 
| + | 
| +    // Setup redirect for 301 where POST should not redirect. | 
| +    addRequestHandler( | 
| +        "/301src", | 
| +        (HttpRequest request, HttpResponse response) { | 
| +          Expect.equals("POST", request.method); | 
| +          request.listen( | 
| +              (_) {}, | 
| +              onDone: () { | 
| +                response.headers.set( | 
| +                    HttpHeaders.LOCATION, | 
| +                    "http://127.0.0.1:${server.port}/301target"); | 
| +                response.statusCode = HttpStatus.MOVED_PERMANENTLY; | 
| +                response.close(); | 
| +              }); | 
| +        }); | 
| +    addRequestHandler( | 
| +       "/301target", | 
| +       (HttpRequest request, HttpResponse response) { | 
| +         Expect.fail("Redirect of POST should not happen"); | 
| +       } | 
| +    ); | 
| + | 
| +    // Setup redirect for 303 where POST should turn into GET. | 
| +    addRequestHandler( | 
| +        "/303src", | 
| +        (HttpRequest request, HttpResponse response) { | 
| +          request.listen((_) {}, onDone: () { | 
| +            Expect.equals("POST", request.method); | 
| +            request.listen( | 
| +                (_) {}, | 
| +                onDone: () { | 
| +                  response.headers.set( | 
| +                      HttpHeaders.LOCATION, | 
| +                      "http://127.0.0.1:${server.port}/303target"); | 
| +                  response.statusCode = HttpStatus.SEE_OTHER; | 
| +                  response.close(); | 
| +                }); | 
| +          }); | 
| +        }); | 
| +    addRequestHandler( | 
| +       "/303target", | 
| +       (HttpRequest request, HttpResponse response) { | 
| +         Expect.equals("GET", request.method); | 
| +         response.close(); | 
| +       }); | 
|  | 
| -  // 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(); | 
| -     } | 
| -  ); | 
| - | 
| -  // Setup redirect checking headers. | 
| -  server.addRequestHandler( | 
| -     (HttpRequest request) => request.path == "/src", | 
| -     (HttpRequest request, HttpResponse response) { | 
| -       Expect.equals("value", request.headers.value("X-Request-Header")); | 
| -       response.headers.set(HttpHeaders.LOCATION, | 
| -                            "http://127.0.0.1:${server.port}/target"); | 
| -       response.statusCode = HttpStatus.MOVED_PERMANENTLY; | 
| -       response.outputStream.close(); | 
| -     } | 
| -  ); | 
| -  server.addRequestHandler( | 
| -     (HttpRequest request) => request.path == "/target", | 
| -     (HttpRequest request, HttpResponse response) { | 
| -       Expect.equals("value", request.headers.value("X-Request-Header")); | 
| -       response.outputStream.close(); | 
| -     } | 
| -  ); | 
| - | 
| -  // Setup redirect for 301 where POST should not redirect. | 
| -  server.addRequestHandler( | 
| -     (HttpRequest request) => request.path == "/301src", | 
| -     (HttpRequest request, HttpResponse response) { | 
| -       Expect.equals("POST", request.method); | 
| -       response.headers.set(HttpHeaders.LOCATION, | 
| -                            "http://127.0.0.1:${server.port}/301target"); | 
| -       response.statusCode = HttpStatus.MOVED_PERMANENTLY; | 
| -       response.outputStream.close(); | 
| -     } | 
| -  ); | 
| -  server.addRequestHandler( | 
| -     (HttpRequest request) => request.path == "/301target", | 
| -     (HttpRequest request, HttpResponse response) { | 
| -       Expect.fail("Redirect of POST should not happen"); | 
| -     } | 
| -  ); | 
| - | 
| -  // Setup redirect for 303 where POST should turn into GET. | 
| -  server.addRequestHandler( | 
| -     (HttpRequest request) => request.path == "/303src", | 
| -     (HttpRequest request, HttpResponse response) { | 
| -       Expect.equals("POST", request.method); | 
| -       Expect.equals(10, request.contentLength); | 
| -       request.inputStream.onData = request.inputStream.read; | 
| -       request.inputStream.onClosed = () { | 
| +    // Setup redirect where we close the connection. | 
| +    addRequestHandler( | 
| +       "/closing", | 
| +       (HttpRequest request, HttpResponse response) { | 
| response.headers.set(HttpHeaders.LOCATION, | 
| -                              "http://127.0.0.1:${server.port}/303target"); | 
| -         response.statusCode = HttpStatus.SEE_OTHER; | 
| -         response.outputStream.close(); | 
| -       }; | 
| -     } | 
| -  ); | 
| -  server.addRequestHandler( | 
| -     (HttpRequest request) => request.path == "/303target", | 
| -     (HttpRequest request, HttpResponse response) { | 
| -       Expect.equals("GET", request.method); | 
| -       response.outputStream.close(); | 
| -     } | 
| -  ); | 
| - | 
| -  // Setup redirect where we close the connection. | 
| -  server.addRequestHandler( | 
| -     (HttpRequest request) => request.path == "/closing", | 
| -     (HttpRequest request, HttpResponse response) { | 
| -       response.headers.set(HttpHeaders.LOCATION, | 
| -                            "http://127.0.0.1:${server.port}/"); | 
| -       response.statusCode = HttpStatus.FOUND; | 
| -       response.persistentConnection = false; | 
| -       response.outputStream.close(); | 
| -     } | 
| -  ); | 
| - | 
| -  return server; | 
| +                              "http://127.0.0.1:${server.port}/"); | 
| +         response.statusCode = HttpStatus.FOUND; | 
| +         response.persistentConnection = false; | 
| +         response.close(); | 
| +       }); | 
| + | 
| +    completer.complete(server); | 
| +  }); | 
| +  return completer.future; | 
| } | 
|  | 
| -void checkRedirects(int redirectCount, HttpClientConnection conn) { | 
| +void checkRedirects(int redirectCount, HttpClientResponse response) { | 
| if (redirectCount < 2) { | 
| -    Expect.isNull(conn.redirects); | 
| +    Expect.isTrue(response.redirects.isEmpty); | 
| } else { | 
| -    Expect.equals(redirectCount - 1, conn.redirects.length); | 
| +    Expect.equals(redirectCount - 1, response.redirects.length); | 
| for (int i = 0; i < redirectCount - 2; i++) { | 
| -      Expect.equals(conn.redirects[i].location.path, "/${i + 2}"); | 
| +      Expect.equals(response.redirects[i].location.path, "/${i + 2}"); | 
| } | 
| } | 
| } | 
|  | 
| void testManualRedirect() { | 
| -  HttpServer server = setupServer(); | 
| -  HttpClient client = new HttpClient(); | 
| - | 
| -  int redirectCount = 0; | 
| -  HttpClientConnection conn = | 
| -     client.getUrl(Uri.parse("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(); | 
| -      } | 
| -    }; | 
| -  }; | 
| +  setupServer().then((server) { | 
| +    HttpClient client = new HttpClient(); | 
| + | 
| +    int redirectCount = 0; | 
| +    handleResponse(HttpClientResponse response) { | 
| +      response.listen( | 
| +          (_) => Expect.fail("Response data not expected"), | 
| +          onDone: () { | 
| +            redirectCount++; | 
| +            if (redirectCount < 10) { | 
| +              Expect.isTrue(response.isRedirect); | 
| +              checkRedirects(redirectCount, response); | 
| +              response.redirect().then(handleResponse); | 
| +            } else { | 
| +              Expect.equals(HttpStatus.NOT_FOUND, response.statusCode); | 
| +              server.close(); | 
| +              client.close(); | 
| +            } | 
| +          }); | 
| +    } | 
| +    client.getUrl(Uri.parse("http://127.0.0.1:${server.port}/1")) | 
| +      .then((HttpClientRequest request) { | 
| +        request.followRedirects = false; | 
| +        return request.close(); | 
| +      }) | 
| +      .then(handleResponse); | 
| +  }); | 
| } | 
|  | 
| void testManualRedirectWithHeaders() { | 
| -  HttpServer server = setupServer(); | 
| -  HttpClient client = new HttpClient(); | 
| - | 
| -  int redirectCount = 0; | 
| -  HttpClientConnection conn = | 
| -     client.getUrl(Uri.parse("http://127.0.0.1:${server.port}/src")); | 
| -  conn.followRedirects = false; | 
| -  conn.onRequest = (HttpClientRequest request) { | 
| -    request.headers.add("X-Request-Header", "value"); | 
| -    request.outputStream.close(); | 
| -  }; | 
| -  conn.onResponse = (HttpClientResponse response) { | 
| -    response.inputStream.onData = response.inputStream.read; | 
| -    response.inputStream.onClosed = () { | 
| -      redirectCount++; | 
| -      if (redirectCount < 2) { | 
| -        Expect.isTrue(response.isRedirect); | 
| -        conn.redirect(); | 
| -      } else { | 
| -        Expect.equals(HttpStatus.OK, response.statusCode); | 
| -        server.close(); | 
| -        client.shutdown(); | 
| -      } | 
| -    }; | 
| -  }; | 
| +  setupServer().then((server) { | 
| +    HttpClient client = new HttpClient(); | 
| + | 
| +    int redirectCount = 0; | 
| + | 
| +    handleResponse(HttpClientResponse response) { | 
| +      response.listen( | 
| +          (_) => Expect.fail("Response data not expected"), | 
| +          onDone: () { | 
| +            redirectCount++; | 
| +            if (redirectCount < 2) { | 
| +              Expect.isTrue(response.isRedirect); | 
| +              response.redirect().then(handleResponse); | 
| +            } else { | 
| +              Expect.equals(HttpStatus.OK, response.statusCode); | 
| +              server.close(); | 
| +              client.close(); | 
| +            } | 
| +          }); | 
| +    } | 
| + | 
| +    client.getUrl(Uri.parse("http://127.0.0.1:${server.port}/src")) | 
| +      .then((HttpClientRequest request) { | 
| +        request.followRedirects = false; | 
| +        request.headers.add("X-Request-Header", "value"); | 
| +        return request.close(); | 
| +      }).then(handleResponse); | 
| +  }); | 
| } | 
|  | 
| void testAutoRedirect() { | 
| -  HttpServer server = setupServer(); | 
| -  HttpClient client = new HttpClient(); | 
| - | 
| -  var requestCount = 0; | 
| - | 
| -  void onRequest(HttpClientRequest request) { | 
| -    requestCount++; | 
| -    request.outputStream.close(); | 
| -  } | 
| - | 
| -  void onResponse(HttpClientResponse response) { | 
| -    response.inputStream.onData = | 
| -        () => Expect.fail("Response data not expected"); | 
| -    response.inputStream.onClosed = () { | 
| -      Expect.equals(1, requestCount); | 
| -      server.close(); | 
| -      client.shutdown(); | 
| -    }; | 
| -  }; | 
| - | 
| -  HttpClientConnection conn = | 
| -      client.getUrl( | 
| -          Uri.parse("http://127.0.0.1:${server.port}/redirect")); | 
| -  conn.onRequest = onRequest; | 
| -  conn.onResponse = onResponse; | 
| -  conn.onError = (e) => Expect.fail("Error not expected ($e)"); | 
| +  setupServer().then((server) { | 
| +    HttpClient client = new HttpClient(); | 
| + | 
| +    client.getUrl(Uri.parse("http://127.0.0.1:${server.port}/redirect")) | 
| +      .then((HttpClientRequest request) { | 
| +        return request.close(); | 
| +      }) | 
| +      .then((HttpClientResponse response) { | 
| +        response.listen( | 
| +            (_) => Expect.fail("Response data not expected"), | 
| +            onDone: () { | 
| +              Expect.equals(1, response.redirects.length); | 
| +              server.close(); | 
| +              client.close(); | 
| +            }); | 
| +      }); | 
| +  }); | 
| } | 
|  | 
| void testAutoRedirectWithHeaders() { | 
| -  HttpServer server = setupServer(); | 
| -  HttpClient client = new HttpClient(); | 
| - | 
| -  var requestCount = 0; | 
| - | 
| -  void onRequest(HttpClientRequest request) { | 
| -    requestCount++; | 
| -    request.headers.add("X-Request-Header", "value"); | 
| -    request.outputStream.close(); | 
| -  }; | 
| - | 
| -  void onResponse(HttpClientResponse response) { | 
| -    response.inputStream.onData = | 
| -        () => Expect.fail("Response data not expected"); | 
| -    response.inputStream.onClosed = () { | 
| -      Expect.equals(1, requestCount); | 
| -      server.close(); | 
| -      client.shutdown(); | 
| -    }; | 
| -  }; | 
| - | 
| -  HttpClientConnection conn = | 
| -      client.getUrl(Uri.parse("http://127.0.0.1:${server.port}/src")); | 
| -  conn.onRequest = onRequest; | 
| -  conn.onResponse = onResponse; | 
| -  conn.onError = (e) => Expect.fail("Error not expected ($e)"); | 
| +  setupServer().then((server) { | 
| +    HttpClient client = new HttpClient(); | 
| + | 
| +    client.getUrl(Uri.parse("http://127.0.0.1:${server.port}/src")) | 
| +      .then((HttpClientRequest request) { | 
| +        request.headers.add("X-Request-Header", "value"); | 
| +        return request.close(); | 
| +      }) | 
| +      .then((HttpClientResponse response) { | 
| +        response.listen( | 
| +            (_) => Expect.fail("Response data not expected"), | 
| +            onDone: () { | 
| +              Expect.equals(1, response.redirects.length); | 
| +              server.close(); | 
| +              client.close(); | 
| +            }); | 
| +      }); | 
| +  }); | 
| } | 
|  | 
| void testAutoRedirect301POST() { | 
| -  HttpServer server = setupServer(); | 
| -  HttpClient client = new HttpClient(); | 
| - | 
| -  var requestCount = 0; | 
| - | 
| -  void onRequest(HttpClientRequest request) { | 
| -    requestCount++; | 
| -    request.outputStream.close(); | 
| -  }; | 
| - | 
| -  void onResponse(HttpClientResponse response) { | 
| -    Expect.equals(HttpStatus.MOVED_PERMANENTLY, response.statusCode); | 
| -    response.inputStream.onData = | 
| -        () => Expect.fail("Response data not expected"); | 
| -    response.inputStream.onClosed = () { | 
| -      Expect.equals(1, requestCount); | 
| -      server.close(); | 
| -      client.shutdown(); | 
| -    }; | 
| -  }; | 
| - | 
| -  HttpClientConnection conn = | 
| -      client.postUrl( | 
| -          Uri.parse("http://127.0.0.1:${server.port}/301src")); | 
| -  conn.onRequest = onRequest; | 
| -  conn.onResponse = onResponse; | 
| -  conn.onError = (e) => Expect.fail("Error not expected ($e)"); | 
| +  setupServer().then((server) { | 
| +    HttpClient client = new HttpClient(); | 
| + | 
| +    client.postUrl(Uri.parse("http://127.0.0.1:${server.port}/301src")) | 
| +      .then((HttpClientRequest request) { | 
| +        return request.close(); | 
| +      }) | 
| +      .then((HttpClientResponse response) { | 
| +        Expect.equals(HttpStatus.MOVED_PERMANENTLY, response.statusCode); | 
| +        response.listen( | 
| +            (_) => Expect.fail("Response data not expected"), | 
| +            onDone: () { | 
| +              Expect.equals(0, response.redirects.length); | 
| +              server.close(); | 
| +              client.close(); | 
| +            }); | 
| +      }); | 
| +  }); | 
| } | 
|  | 
| void testAutoRedirect303POST() { | 
| -  HttpServer server = setupServer(); | 
| -  HttpClient client = new HttpClient(); | 
| - | 
| -  var requestCount = 0; | 
| - | 
| -  void onRequest(HttpClientRequest request) { | 
| -    requestCount++; | 
| -    request.contentLength = 10; | 
| -    request.outputStream.write(new List<int>.fixedLength(10, fill: 0)); | 
| -    request.outputStream.close(); | 
| -  }; | 
| - | 
| -  void onResponse(HttpClientResponse response) { | 
| -    Expect.equals(HttpStatus.OK, response.statusCode); | 
| -    response.inputStream.onData = | 
| -        () => Expect.fail("Response data not expected"); | 
| -    response.inputStream.onClosed = () { | 
| -      Expect.equals(1, requestCount); | 
| -      server.close(); | 
| -      client.shutdown(); | 
| -    }; | 
| -  }; | 
| - | 
| -  HttpClientConnection conn = | 
| -      client.postUrl( | 
| -          Uri.parse("http://127.0.0.1:${server.port}/303src")); | 
| -  conn.onRequest = onRequest; | 
| -  conn.onResponse = onResponse; | 
| -  conn.onError = (e) => Expect.fail("Error not expected ($e)"); | 
| +  setupServer().then((server) { | 
| +    HttpClient client = new HttpClient(); | 
| + | 
| +    client.postUrl(Uri.parse("http://127.0.0.1:${server.port}/303src")) | 
| +      .then((HttpClientRequest request) { | 
| +        return request.close(); | 
| +      }) | 
| +      .then((HttpClientResponse response) { | 
| +        Expect.equals(HttpStatus.OK, response.statusCode); | 
| +        response.listen( | 
| +            (_) => Expect.fail("Response data not expected"), | 
| +            onDone: () { | 
| +              Expect.equals(1, response.redirects.length); | 
| +              server.close(); | 
| +              client.close(); | 
| +            }); | 
| +      }); | 
| +  }); | 
| } | 
|  | 
| void testAutoRedirectLimit() { | 
| -  HttpServer server = setupServer(); | 
| -  HttpClient client = new HttpClient(); | 
| - | 
| -  HttpClientConnection conn = | 
| -      client.getUrl(Uri.parse("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 RedirectLimitExceededException); | 
| -    Expect.equals(5, e.redirects.length); | 
| -    server.close(); | 
| -    client.shutdown(); | 
| -  }; | 
| +  setupServer().then((server) { | 
| +    HttpClient client = new HttpClient(); | 
| + | 
| +    client.getUrl(Uri.parse("http://127.0.0.1:${server.port}/1")) | 
| +      .then((HttpClientRequest request) => request.close()) | 
| +      .catchError((e) { | 
| +        Expect.equals(5, e.error.redirects.length); | 
| +        server.close(); | 
| +        client.close(); | 
| +      }, test: (e) => e is RedirectLimitExceededException); | 
| +  }); | 
| } | 
|  | 
| void testRedirectLoop() { | 
| -  HttpServer server = setupServer(); | 
| -  HttpClient client = new HttpClient(); | 
| - | 
| -  int redirectCount = 0; | 
| -  HttpClientConnection conn = | 
| -      client.getUrl(Uri.parse("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 RedirectLoopException); | 
| -    Expect.equals(2, e.redirects.length); | 
| -    server.close(); | 
| -    client.shutdown(); | 
| -  }; | 
| +  setupServer().then((server) { | 
| +    HttpClient client = new HttpClient(); | 
| + | 
| +    int redirectCount = 0; | 
| +    client.getUrl(Uri.parse("http://127.0.0.1:${server.port}/A")) | 
| +      .then((HttpClientRequest request) => request.close()) | 
| +      .catchError((e) { | 
| +        Expect.equals(2, e.error.redirects.length); | 
| +        server.close(); | 
| +        client.close(); | 
| +      }, test: (e) => e is RedirectLoopException); | 
| +  }); | 
| } | 
|  | 
| void testRedirectClosingConnection() { | 
| -  HttpServer server = setupServer(); | 
| -  HttpClient client = new HttpClient(); | 
| - | 
| -  int redirectCount = 0; | 
| -  HttpClientConnection conn = | 
| -      client.getUrl(Uri.parse("http://127.0.0.1:${server.port}/closing")); | 
| - | 
| -  conn.followRedirects = true; | 
| -  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 RedirectException); | 
| -    Expect.isNull(e.redirects); | 
| -    server.close(); | 
| -    client.shutdown(); | 
| -  }; | 
| +  setupServer().then((server) { | 
| +    HttpClient client = new HttpClient(); | 
| + | 
| +    client.getUrl(Uri.parse("http://127.0.0.1:${server.port}/closing")) | 
| +        .then((request) => request.close()) | 
| +        .then((response) { | 
| +          response.listen( | 
| +              (_) {}, | 
| +              onDone: () { | 
| +                Expect.equals(1, response.redirects.length); | 
| +                server.close(); | 
| +                client.close(); | 
| +              }); | 
| +          }); | 
| +  }); | 
| } | 
|  | 
| main() { | 
|  |