| Index: tests/standalone/io/http_proxy_test.dart
|
| diff --git a/tests/standalone/io/http_proxy_test.dart b/tests/standalone/io/http_proxy_test.dart
|
| index 2727f280872688f6a200555dc53ea5b570e9d0d6..24a2f84176fdc50c3cc7c90cb874448faa8f88a0 100644
|
| --- a/tests/standalone/io/http_proxy_test.dart
|
| +++ b/tests/standalone/io/http_proxy_test.dart
|
| @@ -2,6 +2,7 @@
|
| // 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:async";
|
| import "dart:io";
|
| import "dart:uri";
|
|
|
| @@ -12,39 +13,48 @@ class Server {
|
| List<String> directRequestPaths;
|
| int requestCount = 0;
|
|
|
| - Server(this.proxyHops, this.directRequestPaths, this.secure) {
|
| - server = secure ? new HttpsServer() : new HttpServer();
|
| - }
|
| -
|
| - void start() {
|
| - server.listen("127.0.0.1", 0, certificate_name: 'CN=localhost');
|
| - server.defaultRequestHandler =
|
| - (HttpRequest request, HttpResponse response) {
|
| - requestCount++;
|
| - // Check whether a proxy or direct connection is expected.
|
| - bool direct = directRequestPaths.reduce(
|
| - false,
|
| - (prev, path) => prev ? prev : path == request.path);
|
| - if (!direct && proxyHops > 0) {
|
| - Expect.isNotNull(request.headers[HttpHeaders.VIA]);
|
| - Expect.equals(1, request.headers[HttpHeaders.VIA].length);
|
| - Expect.equals(
|
| - proxyHops,
|
| - request.headers[HttpHeaders.VIA][0].split(",").length);
|
| - } else {
|
| - Expect.isNull(request.headers[HttpHeaders.VIA]);
|
| - }
|
| - StringInputStream stream = new StringInputStream(request.inputStream);
|
| - StringBuffer body = new StringBuffer();
|
| - stream.onData = () => body.add(stream.read());
|
| - stream.onClosed = () {
|
| - String path = request.path.substring(1);
|
| - String content = "$path$path$path";
|
| - Expect.equals(content, body.toString());
|
| - response.outputStream.writeString(request.path);
|
| - response.outputStream.close();
|
| - };
|
| - };
|
| + Server(this.proxyHops, this.directRequestPaths, this.secure);
|
| +
|
| + Future<Server> start() {
|
| + var x = new Completer();
|
| + Future f = secure
|
| + ? HttpServer.bindSecure(
|
| + "127.0.0.1", 0, certificateName: 'localhost_cert')
|
| + : HttpServer.bind();
|
| + return f.then((s) {
|
| + server = s;
|
| + x.complete(this);
|
| + server.listen((request) {
|
| + var response = request.response;
|
| + requestCount++;
|
| + // Check whether a proxy or direct connection is expected.
|
| + bool direct = directRequestPaths.reduce(
|
| + false,
|
| + (prev, path) => prev ? prev : path == request.uri.path);
|
| + if (!direct && proxyHops > 0) {
|
| + Expect.isNotNull(request.headers[HttpHeaders.VIA]);
|
| + Expect.equals(1, request.headers[HttpHeaders.VIA].length);
|
| + Expect.equals(
|
| + proxyHops,
|
| + request.headers[HttpHeaders.VIA][0].split(",").length);
|
| + } else {
|
| + Expect.isNull(request.headers[HttpHeaders.VIA]);
|
| + }
|
| + var body = new StringBuffer();
|
| + request.listen(
|
| + (data) {
|
| + body.add(new String.fromCharCodes(data));
|
| + },
|
| + onDone: () {
|
| + String path = request.uri.path.substring(1);
|
| + String content = "$path$path$path";
|
| + Expect.equals(content, body.toString());
|
| + response.addString(request.uri.path);
|
| + response.close();
|
| + });
|
| + });
|
| + return x.future;
|
| + });
|
| }
|
|
|
| void shutdown() {
|
| @@ -54,12 +64,11 @@ class Server {
|
| int get port => server.port;
|
| }
|
|
|
| -Server setupServer(int proxyHops,
|
| +Future<Server> setupServer(int proxyHops,
|
| {List<String> directRequestPaths: const <String>[],
|
| secure: false}) {
|
| Server server = new Server(proxyHops, directRequestPaths, secure);
|
| - server.start();
|
| - return server;
|
| + return server.start();
|
| }
|
|
|
| class ProxyServer {
|
| @@ -67,17 +76,18 @@ class ProxyServer {
|
| HttpClient client;
|
| int requestCount = 0;
|
|
|
| - ProxyServer() : server = new HttpServer(), client = new HttpClient();
|
| -
|
| - void start() {
|
| - server.listen("127.0.0.1", 0);
|
| - server.defaultRequestHandler =
|
| - (HttpRequest request, HttpResponse response) {
|
| - requestCount++;
|
| - // Open the connection from the proxy.
|
| - HttpClientConnection conn =
|
| - client.openUrl(request.method, Uri.parse(request.path));
|
| - conn.onRequest = (HttpClientRequest clientRequest) {
|
| + ProxyServer() : client = new HttpClient();
|
| +
|
| + Future<ProxyServer> start() {
|
| + var x = new Completer();
|
| + HttpServer.bind().then((s) {
|
| + server = s;
|
| + x.complete(this);
|
| + server.listen((HttpRequest request) {
|
| + requestCount++;
|
| + // Open the connection from the proxy.
|
| + client.openUrl(request.method, request.uri)
|
| + .then((HttpClientRequest clientRequest) {
|
| // Forward all headers.
|
| request.headers.forEach((String name, List<String> values) {
|
| values.forEach((String value) {
|
| @@ -93,225 +103,228 @@ class ProxyServer {
|
| clientRequest.headers.add(
|
| HttpHeaders.VIA, "${viaPrefix}1.1 localhost:$port");
|
| // Copy all content.
|
| - request.inputStream.pipe(clientRequest.outputStream);
|
| - };
|
| - conn.onResponse = (HttpClientResponse clientResponse) {
|
| - clientResponse.inputStream.pipe(response.outputStream);
|
| - };
|
| - };
|
| + request.pipe(clientRequest);
|
| + return clientRequest.response;
|
| + })
|
| + .then((HttpClientResponse clientResponse) {
|
| + clientResponse.pipe(request.response);
|
| + });
|
| + });
|
| + });
|
| + return x.future;
|
| }
|
|
|
| void shutdown() {
|
| server.close();
|
| - client.shutdown();
|
| + client.close();
|
| }
|
|
|
| int get port => server.port;
|
| }
|
|
|
| -ProxyServer setupProxyServer() {
|
| +Future<ProxyServer> setupProxyServer() {
|
| ProxyServer proxyServer = new ProxyServer();
|
| - proxyServer.start();
|
| - return proxyServer;
|
| + return proxyServer.start();
|
| }
|
|
|
| testInvalidProxy() {
|
| HttpClient client = new HttpClient();
|
|
|
| - // TODO(sgjesse): This should not throw errors, but call
|
| - // HttpClientConnection onError.
|
| + client.findProxy = (Uri uri) => "";
|
| + client.getUrl(Uri.parse("http://www.google.com/test"))
|
| + .catchError((error) {}, test: (e) => e is HttpException);
|
| +
|
| client.findProxy = (Uri uri) => "XXX";
|
| - Expect.throws(
|
| - () => client.getUrl(Uri.parse("http://www.google.com/test")),
|
| - (e) => e is HttpException);
|
| + client.getUrl(Uri.parse("http://www.google.com/test"))
|
| + .catchError((error) {}, test: (e) => e is HttpException);
|
|
|
| client.findProxy = (Uri uri) => "PROXY www.google.com";
|
| - Expect.throws(
|
| - () => client.getUrl(Uri.parse("http://www.google.com/test")),
|
| - (e) => e is HttpException);
|
| + client.getUrl(Uri.parse("http://www.google.com/test"))
|
| + .catchError((error) {}, test: (e) => e is HttpException);
|
|
|
| client.findProxy = (Uri uri) => "PROXY www.google.com:http";
|
| - Expect.throws(
|
| - () => client.getUrl(Uri.parse("http://www.google.com/test")),
|
| - (e) => e is HttpException);
|
| + client.getUrl(Uri.parse("http://www.google.com/test"))
|
| + .catchError((error) {}, test: (e) => e is HttpException);
|
| }
|
|
|
| int testDirectDoneCount = 0;
|
| void testDirectProxy() {
|
| - Server server = setupServer(0);
|
| - HttpClient client = new HttpClient();
|
| - List<String> proxy =
|
| - ["DIRECT", " DIRECT ", "DIRECT ;", " DIRECT ; ",
|
| - ";DIRECT", " ; DIRECT ", ";;DIRECT;;"];
|
| -
|
| - client.findProxy = (Uri uri) {
|
| - int index = int.parse(uri.path.substring(1));
|
| - return proxy[index];
|
| - };
|
| -
|
| - for (int i = 0; i < proxy.length; i++) {
|
| - HttpClientConnection conn =
|
| - client.getUrl(Uri.parse("http://127.0.0.1:${server.port}/$i"));
|
| - conn.onRequest = (HttpClientRequest clientRequest) {
|
| - String content = "$i$i$i";
|
| - clientRequest.contentLength = content.length;
|
| - clientRequest.outputStream.writeString(content);
|
| - clientRequest.outputStream.close();
|
| - };
|
| - conn.onResponse = (HttpClientResponse response) {
|
| - response.inputStream.onData = () => response.inputStream.read();
|
| - response.inputStream.onClosed = () {
|
| - testDirectDoneCount++;
|
| - if (testDirectDoneCount == proxy.length) {
|
| - Expect.equals(proxy.length, server.requestCount);
|
| - server.shutdown();
|
| - client.shutdown();
|
| - }
|
| - };
|
| + setupServer(0).then((server) {
|
| + HttpClient client = new HttpClient();
|
| + List<String> proxy =
|
| + ["DIRECT", " DIRECT ", "DIRECT ;", " DIRECT ; ",
|
| + ";DIRECT", " ; DIRECT ", ";;DIRECT;;"];
|
| +
|
| + client.findProxy = (Uri uri) {
|
| + int index = int.parse(uri.path.substring(1));
|
| + return proxy[index];
|
| };
|
| - }
|
| +
|
| + for (int i = 0; i < proxy.length; i++) {
|
| + client.getUrl(Uri.parse("http://127.0.0.1:${server.port}/$i"))
|
| + .then((HttpClientRequest clientRequest) {
|
| + String content = "$i$i$i";
|
| + clientRequest.contentLength = content.length;
|
| + clientRequest.addString(content);
|
| + return clientRequest.close();
|
| + })
|
| + .then((HttpClientResponse response) {
|
| + response.listen((_) {}, onDone: () {
|
| + testDirectDoneCount++;
|
| + if (testDirectDoneCount == proxy.length) {
|
| + Expect.equals(proxy.length, server.requestCount);
|
| + server.shutdown();
|
| + client.close();
|
| + }
|
| + });
|
| + });
|
| + }
|
| + });
|
| }
|
|
|
| int testProxyDoneCount = 0;
|
| void testProxy() {
|
| - ProxyServer proxyServer = setupProxyServer();
|
| - Server server = setupServer(1, directRequestPaths: ["/4"]);
|
| - Server secureServer = setupServer(1, directRequestPaths: ["/4"], secure: true);
|
| - HttpClient client = new HttpClient();
|
| + setupProxyServer().then((proxyServer) {
|
| + setupServer(1, directRequestPaths: ["/4"]).then((server) {
|
| + setupServer(1, directRequestPaths: ["/4"], secure: true).then((secureServer) {
|
| + HttpClient client = new HttpClient();
|
| +
|
| + List<String> proxy =
|
| + ["PROXY localhost:${proxyServer.port}",
|
| + "PROXY localhost:${proxyServer.port}; PROXY hede.hule.hest:8080",
|
| + "PROXY hede.hule.hest:8080; PROXY localhost:${proxyServer.port}",
|
| + "PROXY hede.hule.hest:8080; PROXY hede.hule.hest:8181;"
|
| + " PROXY localhost:${proxyServer.port}",
|
| + "PROXY hede.hule.hest:8080; PROXY hede.hule.hest:8181; DIRECT",
|
| + "PROXY localhost:${proxyServer.port}; DIRECT"];
|
| +
|
| + client.findProxy = (Uri uri) {
|
| + // Pick the proxy configuration based on the request path.
|
| + int index = int.parse(uri.path.substring(1));
|
| + return proxy[index];
|
| + };
|
|
|
| - List<String> proxy =
|
| - ["PROXY localhost:${proxyServer.port}",
|
| - "PROXY localhost:${proxyServer.port}; PROXY hede.hule.hest:8080",
|
| - "PROXY hede.hule.hest:8080; PROXY localhost:${proxyServer.port}",
|
| - "PROXY hede.hule.hest:8080; PROXY hede.hule.hest:8181; PROXY localhost:${proxyServer.port}",
|
| - "PROXY hede.hule.hest:8080; PROXY hede.hule.hest:8181; DIRECT",
|
| - "PROXY localhost:${proxyServer.port}; DIRECT"];
|
| -
|
| - client.findProxy = (Uri uri) {
|
| - // Pick the proxy configuration based on the request path.
|
| - int index = int.parse(uri.path.substring(1));
|
| - return proxy[index];
|
| - };
|
| -
|
| - for (int i = 0; i < proxy.length; i++) {
|
| - test(bool secure) {
|
| - String url = secure
|
| - ? "https://localhost:${secureServer.port}/$i"
|
| - : "http://127.0.0.1:${server.port}/$i";
|
| -
|
| - HttpClientConnection conn = client.postUrl(Uri.parse(url));
|
| - conn.onRequest = (HttpClientRequest clientRequest) {
|
| - String content = "$i$i$i";
|
| - clientRequest.outputStream.writeString(content);
|
| - clientRequest.outputStream.close();
|
| - };
|
| - conn.onResponse = (HttpClientResponse response) {
|
| - response.inputStream.onData = () => response.inputStream.read();
|
| - response.inputStream.onClosed = () {
|
| - testProxyDoneCount++;
|
| - if (testProxyDoneCount == proxy.length * 2) {
|
| - Expect.equals(proxy.length, server.requestCount);
|
| - proxyServer.shutdown();
|
| - server.shutdown();
|
| - secureServer.shutdown();
|
| - client.shutdown();
|
| - }
|
| - };
|
| - };
|
| - }
|
| + for (int i = 0; i < proxy.length; i++) {
|
| + test(bool secure) {
|
| + String url = secure
|
| + ? "https://localhost:${secureServer.port}/$i"
|
| + : "http://127.0.0.1:${server.port}/$i";
|
| +
|
| + client.postUrl(Uri.parse(url))
|
| + .then((HttpClientRequest clientRequest) {
|
| + String content = "$i$i$i";
|
| + clientRequest.addString(content);
|
| + return clientRequest.close();
|
| + })
|
| + .then((HttpClientResponse response) {
|
| + response.listen((_) {}, onDone: () {
|
| + testProxyDoneCount++;
|
| + if (testProxyDoneCount == proxy.length * 2) {
|
| + Expect.equals(proxy.length, server.requestCount);
|
| + proxyServer.shutdown();
|
| + server.shutdown();
|
| + secureServer.shutdown();
|
| + client.close();
|
| + }
|
| + });
|
| + });
|
| + }
|
|
|
| - test(false);
|
| - test(true);
|
| - }
|
| + test(false);
|
| + test(true);
|
| + }
|
| + });
|
| + });
|
| + });
|
| }
|
|
|
| int testProxyChainDoneCount = 0;
|
| void testProxyChain() {
|
| // Setup two proxy servers having the first using the second as its proxy.
|
| - ProxyServer proxyServer1 = setupProxyServer();
|
| - ProxyServer proxyServer2 = setupProxyServer();
|
| + setupProxyServer().then((proxyServer1) {
|
| + setupProxyServer().then((proxyServer2) {
|
| proxyServer1.client.findProxy = (_) => "PROXY 127.0.0.1:${proxyServer2.port}";
|
|
|
| - Server server = setupServer(2, directRequestPaths: ["/4"]);
|
| - HttpClient client = new HttpClient();
|
| -
|
| - List<String> proxy =
|
| - ["PROXY localhost:${proxyServer1.port}",
|
| - "PROXY localhost:${proxyServer1.port}; PROXY hede.hule.hest:8080",
|
| - "PROXY hede.hule.hest:8080; PROXY localhost:${proxyServer1.port}",
|
| - "PROXY hede.hule.hest:8080; PROXY hede.hule.hest:8181; PROXY localhost:${proxyServer1.port}",
|
| - "PROXY hede.hule.hest:8080; PROXY hede.hule.hest:8181; DIRECT",
|
| - "PROXY localhost:${proxyServer1.port}; DIRECT"];
|
| -
|
| - client.findProxy = (Uri uri) {
|
| - // Pick the proxy configuration based on the request path.
|
| - int index = int.parse(uri.path.substring(1));
|
| - return proxy[index];
|
| - };
|
| -
|
| - for (int i = 0; i < proxy.length; i++) {
|
| - HttpClientConnection conn =
|
| - client.getUrl(Uri.parse("http://127.0.0.1:${server.port}/$i"));
|
| - conn.onRequest = (HttpClientRequest clientRequest) {
|
| - String content = "$i$i$i";
|
| - clientRequest.contentLength = content.length;
|
| - clientRequest.outputStream.writeString(content);
|
| - clientRequest.outputStream.close();
|
| - };
|
| - conn.onResponse = (HttpClientResponse response) {
|
| - response.inputStream.onData = () => response.inputStream.read();
|
| - response.inputStream.onClosed = () {
|
| - testProxyChainDoneCount++;
|
| - if (testProxyChainDoneCount == proxy.length) {
|
| - Expect.equals(proxy.length, server.requestCount);
|
| - proxyServer1.shutdown();
|
| - proxyServer2.shutdown();
|
| - server.shutdown();
|
| - client.shutdown();
|
| - }
|
| - };
|
| + setupServer(2, directRequestPaths: ["/4"]).then((server) {
|
| + HttpClient client = new HttpClient();
|
| +
|
| + List<String> proxy =
|
| + ["PROXY localhost:${proxyServer1.port}",
|
| + "PROXY localhost:${proxyServer1.port}; PROXY hede.hule.hest:8080",
|
| + "PROXY hede.hule.hest:8080; PROXY localhost:${proxyServer1.port}",
|
| + "PROXY hede.hule.hest:8080; PROXY hede.hule.hest:8181; PROXY localhost:${proxyServer1.port}",
|
| + "PROXY hede.hule.hest:8080; PROXY hede.hule.hest:8181; DIRECT",
|
| + "PROXY localhost:${proxyServer1.port}; DIRECT"];
|
| +
|
| + client.findProxy = (Uri uri) {
|
| + // Pick the proxy configuration based on the request path.
|
| + int index = int.parse(uri.path.substring(1));
|
| + return proxy[index];
|
| };
|
| - }
|
| +
|
| + for (int i = 0; i < proxy.length; i++) {
|
| + client.getUrl(Uri.parse("http://127.0.0.1:${server.port}/$i"))
|
| + .then((HttpClientRequest clientRequest) {
|
| + String content = "$i$i$i";
|
| + clientRequest.contentLength = content.length;
|
| + clientRequest.addString(content);
|
| + return clientRequest.close();
|
| + })
|
| + .then((HttpClientResponse response) {
|
| + response.listen((_) {}, onDone: () {
|
| + testProxyChainDoneCount++;
|
| + if (testProxyChainDoneCount == proxy.length) {
|
| + Expect.equals(proxy.length, server.requestCount);
|
| + proxyServer1.shutdown();
|
| + proxyServer2.shutdown();
|
| + server.shutdown();
|
| + client.close();
|
| + }
|
| + });
|
| + });
|
| + }
|
| + });
|
| + });
|
| + });
|
| }
|
|
|
| int testRealProxyDoneCount = 0;
|
| void testRealProxy() {
|
| - Server server = setupServer(1);
|
| - HttpClient client = new HttpClient();
|
| -
|
| - List<String> proxy =
|
| - ["PROXY localhost:8080",
|
| - "PROXY localhost:8080; PROXY hede.hule.hest:8080",
|
| - "PROXY hede.hule.hest:8080; PROXY localhost:8080",
|
| - "PROXY localhost:8080; DIRECT"];
|
| -
|
| - client.findProxy = (Uri uri) {
|
| - // Pick the proxy configuration based on the request path.
|
| - int index = int.parse(uri.path.substring(1));
|
| - return proxy[index];
|
| - };
|
| -
|
| - for (int i = 0; i < proxy.length; i++) {
|
| - HttpClientConnection conn =
|
| - client.getUrl(Uri.parse("http://127.0.0.1:${server.port}/$i"));
|
| - conn.onRequest = (HttpClientRequest clientRequest) {
|
| - String content = "$i$i$i";
|
| - clientRequest.contentLength = content.length;
|
| - clientRequest.outputStream.writeString(content);
|
| - clientRequest.outputStream.close();
|
| - };
|
| - conn.onResponse = (HttpClientResponse response) {
|
| - response.inputStream.onData = () => response.inputStream.read();
|
| - response.inputStream.onClosed = () {
|
| - testRealProxyDoneCount++;
|
| - if (testRealProxyDoneCount == proxy.length) {
|
| - Expect.equals(proxy.length, server.requestCount);
|
| - server.shutdown();
|
| - client.shutdown();
|
| - }
|
| - };
|
| + setupServer(1).then((server) {
|
| + HttpClient client = new HttpClient();
|
| +
|
| + List<String> proxy =
|
| + ["PROXY localhost:8080",
|
| + "PROXY localhost:8080; PROXY hede.hule.hest:8080",
|
| + "PROXY hede.hule.hest:8080; PROXY localhost:8080",
|
| + "PROXY localhost:8080; DIRECT"];
|
| +
|
| + client.findProxy = (Uri uri) {
|
| + // Pick the proxy configuration based on the request path.
|
| + int index = int.parse(uri.path.substring(1));
|
| + return proxy[index];
|
| };
|
| - }
|
| +
|
| + for (int i = 0; i < proxy.length; i++) {
|
| + client.getUrl(Uri.parse("http://127.0.0.1:${server.port}/$i"))
|
| + .then((HttpClientRequest clientRequest) {
|
| + String content = "$i$i$i";
|
| + clientRequest.contentLength = content.length;
|
| + clientRequest.addString(content);
|
| + return clientRequest.close();
|
| + })
|
| + .then((HttpClientResponse response) {
|
| + response.listen((_) {}, onDone: () {
|
| + testRealProxyDoneCount++;
|
| + if (testRealProxyDoneCount == proxy.length) {
|
| + Expect.equals(proxy.length, server.requestCount);
|
| + server.shutdown();
|
| + client.close();
|
| + }
|
| + });
|
| + });
|
| + }
|
| + });
|
| }
|
|
|
| void InitializeSSL() {
|
| @@ -329,5 +342,5 @@ main() {
|
| testProxyChain();
|
| // This test is not normally run. It can be used for locally testing
|
| // with a real proxy server (e.g. Apache).
|
| - // testRealProxy();
|
| + //testRealProxy();
|
| }
|
|
|