| 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 2d2fdcb1e4433ff9f7f6ebff8d9d0e27d943a261..bef1412cc23e964cd7b80675ec641ee3be60977d 100644
|
| --- a/tests/standalone/io/http_proxy_test.dart
|
| +++ b/tests/standalone/io/http_proxy_test.dart
|
| @@ -18,7 +18,7 @@ String localFile(path) => Platform.script.resolve(path).toFilePath();
|
| SecurityContext serverContext = new SecurityContext()
|
| ..useCertificateChain(localFile('certificates/server_chain.pem'))
|
| ..usePrivateKey(localFile('certificates/server_key.pem'),
|
| - password: 'dartdart');
|
| + password: 'dartdart');
|
|
|
| SecurityContext clientContext = new SecurityContext()
|
| ..setTrustedCertificates(localFile('certificates/trusted_certs.pem'));
|
| @@ -33,10 +33,9 @@ class Server {
|
| Server(this.proxyHops, this.directRequestPaths, this.secure);
|
|
|
| Future<Server> start() {
|
| - return (secure ?
|
| - HttpServer.bindSecure("localhost", 0, serverContext) :
|
| - HttpServer.bind("localhost", 0))
|
| - .then((s) {
|
| + return (secure
|
| + ? HttpServer.bindSecure("localhost", 0, serverContext)
|
| + : HttpServer.bind("localhost", 0)).then((s) {
|
| server = s;
|
| server.listen(requestHandler);
|
| return this;
|
| @@ -48,14 +47,12 @@ class Server {
|
| requestCount++;
|
| // Check whether a proxy or direct connection is expected.
|
| bool direct = directRequestPaths.fold(
|
| - false,
|
| - (prev, path) => prev ? prev : path == request.uri.path);
|
| + false, (prev, path) => prev ? prev : path == request.uri.path);
|
| if (!secure && !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);
|
| + proxyHops, request.headers[HttpHeaders.VIA][0].split(",").length);
|
| } else {
|
| Expect.isNull(request.headers[HttpHeaders.VIA]);
|
| }
|
| @@ -69,6 +66,7 @@ class Server {
|
| response.write(request.uri.path);
|
| response.close();
|
| }
|
| +
|
| request.listen((data) {
|
| body.write(new String.fromCharCodes(data));
|
| }, onDone: onRequestComplete);
|
| @@ -82,8 +80,7 @@ class Server {
|
| }
|
|
|
| Future<Server> setupServer(int proxyHops,
|
| - {List<String> directRequestPaths: const <String>[],
|
| - secure: false}) {
|
| + {List<String> directRequestPaths: const <String>[], secure: false}) {
|
| Server server = new Server(proxyHops, directRequestPaths, secure);
|
| return server.start();
|
| }
|
| @@ -103,7 +100,7 @@ class ProxyServer {
|
| String serverQop = "auth";
|
| Set ncs = new Set();
|
|
|
| - var nonce = "12345678"; // No need for random nonce in test.
|
| + var nonce = "12345678"; // No need for random nonce in test.
|
|
|
| ProxyServer({this.ipV6: false}) : client = new HttpClient();
|
|
|
| @@ -116,8 +113,8 @@ class ProxyServer {
|
| basicAuthenticationRequired(request) {
|
| request.fold(null, (x, y) {}).then((_) {
|
| var response = request.response;
|
| - response.headers.set(HttpHeaders.PROXY_AUTHENTICATE,
|
| - "Basic, realm=$realm");
|
| + response.headers
|
| + .set(HttpHeaders.PROXY_AUTHENTICATE, "Basic, realm=$realm");
|
| response.statusCode = HttpStatus.PROXY_AUTHENTICATION_REQUIRED;
|
| response.close();
|
| });
|
| @@ -161,20 +158,18 @@ class ProxyServer {
|
| Expect.equals(
|
| 1, request.headers[HttpHeaders.PROXY_AUTHORIZATION].length);
|
| String authorization =
|
| - request.headers[HttpHeaders.PROXY_AUTHORIZATION][0];
|
| + request.headers[HttpHeaders.PROXY_AUTHORIZATION][0];
|
| if (authScheme == "Basic") {
|
| List<String> tokens = authorization.split(" ");
|
| Expect.equals("Basic", tokens[0]);
|
| - String auth =
|
| - BASE64.encode(UTF8.encode("$username:$password"));
|
| + String auth = BASE64.encode(UTF8.encode("$username:$password"));
|
| if (auth != tokens[1]) {
|
| basicAuthenticationRequired(request);
|
| return;
|
| }
|
| } else {
|
| HeaderValue header =
|
| - HeaderValue.parse(
|
| - authorization, parameterSeparator: ",");
|
| + HeaderValue.parse(authorization, parameterSeparator: ",");
|
| Expect.equals("Digest", header.value);
|
| var uri = header.parameters["uri"];
|
| var qop = header.parameters["qop"];
|
| @@ -208,14 +203,14 @@ class ProxyServer {
|
| digest = md5.convert(
|
| "$ha1:${nonce}:${nc}:${cnonce}:${qop}:$ha2".codeUnits);
|
| }
|
| - Expect.equals(hex.encode(digest.bytes),
|
| - header.parameters["response"]);
|
| + Expect.equals(
|
| + hex.encode(digest.bytes), header.parameters["response"]);
|
|
|
| // Add a bogus Proxy-Authentication-Info for testing.
|
| var info = 'rspauth="77180d1ab3d6c9de084766977790f482", '
|
| - 'cnonce="8f971178", '
|
| - 'nc=000002c74, '
|
| - 'qop=auth';
|
| + 'cnonce="8f971178", '
|
| + 'nc=000002c74, '
|
| + 'qop=auth';
|
| request.response.headers.set("Proxy-Authentication-Info", info);
|
| }
|
| }
|
| @@ -223,38 +218,36 @@ class ProxyServer {
|
| // Open the connection from the proxy.
|
| if (request.method == "CONNECT") {
|
| var tmp = request.uri.toString().split(":");
|
| - Socket.connect(tmp[0], int.parse(tmp[1]))
|
| - .then((socket) {
|
| - request.response.reasonPhrase = "Connection established";
|
| - request.response.detachSocket()
|
| - .then((detached) {
|
| - socket.pipe(detached);
|
| - detached.pipe(socket);
|
| - });
|
| - });
|
| + Socket.connect(tmp[0], int.parse(tmp[1])).then((socket) {
|
| + request.response.reasonPhrase = "Connection established";
|
| + request.response.detachSocket().then((detached) {
|
| + socket.pipe(detached);
|
| + detached.pipe(socket);
|
| + });
|
| + });
|
| } else {
|
| - client.openUrl(request.method, request.uri)
|
| - .then((HttpClientRequest clientRequest) {
|
| - // Forward all headers.
|
| - request.headers.forEach((String name, List<String> values) {
|
| - values.forEach((String value) {
|
| - if (name != "content-length" && name != "via") {
|
| - clientRequest.headers.add(name, value);
|
| - }
|
| - });
|
| + client
|
| + .openUrl(request.method, request.uri)
|
| + .then((HttpClientRequest clientRequest) {
|
| + // Forward all headers.
|
| + request.headers.forEach((String name, List<String> values) {
|
| + values.forEach((String value) {
|
| + if (name != "content-length" && name != "via") {
|
| + clientRequest.headers.add(name, value);
|
| + }
|
| });
|
| - // Special handling of Content-Length and Via.
|
| - clientRequest.contentLength = request.contentLength;
|
| - List<String> via = request.headers[HttpHeaders.VIA];
|
| - String viaPrefix = via == null ? "" : "${via[0]}, ";
|
| - clientRequest.headers.add(
|
| - HttpHeaders.VIA, "${viaPrefix}1.1 localhost:$port");
|
| - // Copy all content.
|
| - return request.pipe(clientRequest);
|
| - })
|
| - .then((HttpClientResponse clientResponse) {
|
| - clientResponse.pipe(request.response);
|
| });
|
| + // Special handling of Content-Length and Via.
|
| + clientRequest.contentLength = request.contentLength;
|
| + List<String> via = request.headers[HttpHeaders.VIA];
|
| + String viaPrefix = via == null ? "" : "${via[0]}, ";
|
| + clientRequest.headers
|
| + .add(HttpHeaders.VIA, "${viaPrefix}1.1 localhost:$port");
|
| + // Copy all content.
|
| + return request.pipe(clientRequest);
|
| + }).then((HttpClientResponse clientResponse) {
|
| + clientResponse.pipe(request.response);
|
| + });
|
| }
|
| });
|
| });
|
| @@ -278,29 +271,39 @@ testInvalidProxy() {
|
| HttpClient client = new HttpClient(context: clientContext);
|
|
|
| client.findProxy = (Uri uri) => "";
|
| - client.getUrl(Uri.parse("http://www.google.com/test"))
|
| - .catchError((error) {}, 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) => "XXX";
|
| - client.getUrl(Uri.parse("http://www.google.com/test"))
|
| - .catchError((error) {}, 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";
|
| - client.getUrl(Uri.parse("http://www.google.com/test"))
|
| - .catchError((error) {}, 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";
|
| - client.getUrl(Uri.parse("http://www.google.com/test"))
|
| - .catchError((error) {}, 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() {
|
| setupServer(0).then((server) {
|
| HttpClient client = new HttpClient(context: clientContext);
|
| - List<String> proxy =
|
| - ["DIRECT", " DIRECT ", "DIRECT ;", " DIRECT ; ",
|
| - ";DIRECT", " ; DIRECT ", ";;DIRECT;;"];
|
| + List<String> proxy = [
|
| + "DIRECT",
|
| + " DIRECT ",
|
| + "DIRECT ;",
|
| + " DIRECT ; ",
|
| + ";DIRECT",
|
| + " ; DIRECT ",
|
| + ";;DIRECT;;"
|
| + ];
|
|
|
| client.findProxy = (Uri uri) {
|
| int index = int.parse(uri.path.substring(1));
|
| @@ -308,23 +311,23 @@ void testDirectProxy() {
|
| };
|
|
|
| for (int i = 0; i < proxy.length; i++) {
|
| - client.getUrl(Uri.parse("http://localhost:${server.port}/$i"))
|
| - .then((HttpClientRequest clientRequest) {
|
| - String content = "$i$i$i";
|
| - clientRequest.contentLength = content.length;
|
| - clientRequest.write(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();
|
| - }
|
| - });
|
| + client
|
| + .getUrl(Uri.parse("http://localhost:${server.port}/$i"))
|
| + .then((HttpClientRequest clientRequest) {
|
| + String content = "$i$i$i";
|
| + clientRequest.contentLength = content.length;
|
| + clientRequest.write(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();
|
| + }
|
| });
|
| + });
|
| }
|
| });
|
| }
|
| @@ -332,131 +335,136 @@ void testDirectProxy() {
|
| int testProxyDoneCount = 0;
|
| void testProxy() {
|
| setupProxyServer().then((proxyServer) {
|
| - setupServer(1, directRequestPaths: ["/4"]).then((server) {
|
| - setupServer(1, directRequestPaths: ["/4"], secure: true).then((secureServer) {
|
| - HttpClient client = new HttpClient(context: clientContext);
|
| + setupServer(1, directRequestPaths: ["/4"]).then((server) {
|
| + setupServer(1, directRequestPaths: ["/4"], secure: true)
|
| + .then((secureServer) {
|
| + HttpClient client = new HttpClient(context: clientContext);
|
| +
|
| + List<String> proxy;
|
| + if (Platform.operatingSystem == "windows") {
|
| + proxy = [
|
| + "PROXY localhost:${proxyServer.port}",
|
| + "PROXY localhost:${proxyServer.port}; PROXY hede.hule.hest:8080",
|
| + "PROXY localhost:${proxyServer.port}",
|
| + ""
|
| + " PROXY localhost:${proxyServer.port}",
|
| + "DIRECT",
|
| + "PROXY localhost:${proxyServer.port}; DIRECT"
|
| + ];
|
| + } else {
|
| + 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://localhost:${server.port}/$i";
|
| +
|
| + client
|
| + .postUrl(Uri.parse(url))
|
| + .then((HttpClientRequest clientRequest) {
|
| + String content = "$i$i$i";
|
| + clientRequest.write(content);
|
| + return clientRequest.close();
|
| + }).then((HttpClientResponse response) {
|
| + response.listen((_) {}, onDone: () {
|
| + testProxyDoneCount++;
|
| + if (testProxyDoneCount == proxy.length * 2) {
|
| + Expect.equals(proxy.length, server.requestCount);
|
| + Expect.equals(proxy.length, secureServer.requestCount);
|
| + proxyServer.shutdown();
|
| + server.shutdown();
|
| + secureServer.shutdown();
|
| + client.close();
|
| + }
|
| + });
|
| + });
|
| + }
|
|
|
| - List<String> proxy;
|
| - if (Platform.operatingSystem == "windows") {
|
| - proxy =
|
| - ["PROXY localhost:${proxyServer.port}",
|
| - "PROXY localhost:${proxyServer.port}; PROXY hede.hule.hest:8080",
|
| - "PROXY localhost:${proxyServer.port}",
|
| - ""
|
| - " PROXY localhost:${proxyServer.port}",
|
| - "DIRECT",
|
| - "PROXY localhost:${proxyServer.port}; DIRECT"];
|
| - } else {
|
| - 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];
|
| - };
|
| + test(false);
|
| + test(true);
|
| + }
|
| + });
|
| + });
|
| + });
|
| +}
|
|
|
| - for (int i = 0; i < proxy.length; i++) {
|
| - test(bool secure) {
|
| - String url = secure
|
| - ? "https://localhost:${secureServer.port}/$i"
|
| - : "http://localhost:${server.port}/$i";
|
| +int testProxyChainDoneCount = 0;
|
| +void testProxyChain() {
|
| + // Setup two proxy servers having the first using the second as its proxy.
|
| + setupProxyServer().then((proxyServer1) {
|
| + setupProxyServer().then((proxyServer2) {
|
| + proxyServer1.client.findProxy =
|
| + (_) => "PROXY localhost:${proxyServer2.port}";
|
| +
|
| + setupServer(2, directRequestPaths: ["/4"]).then((server) {
|
| + HttpClient client = new HttpClient(context: clientContext);
|
| +
|
| + List<String> proxy;
|
| + if (Platform.operatingSystem == "windows") {
|
| + proxy = [
|
| + "PROXY localhost:${proxyServer1.port}",
|
| + "PROXY localhost:${proxyServer1.port}; PROXY hede.hule.hest:8080",
|
| + "PROXY localhost:${proxyServer1.port}",
|
| + "PROXY localhost:${proxyServer1.port}",
|
| + "DIRECT",
|
| + "PROXY localhost:${proxyServer1.port}; DIRECT"
|
| + ];
|
| + } else {
|
| + 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.postUrl(Uri.parse(url))
|
| - .then((HttpClientRequest clientRequest) {
|
| + 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://localhost:${server.port}/$i"))
|
| + .then((HttpClientRequest clientRequest) {
|
| String content = "$i$i$i";
|
| + clientRequest.contentLength = content.length;
|
| clientRequest.write(content);
|
| return clientRequest.close();
|
| - })
|
| - .then((HttpClientResponse response) {
|
| + }).then((HttpClientResponse response) {
|
| response.listen((_) {}, onDone: () {
|
| - testProxyDoneCount++;
|
| - if (testProxyDoneCount == proxy.length * 2) {
|
| + testProxyChainDoneCount++;
|
| + if (testProxyChainDoneCount == proxy.length) {
|
| Expect.equals(proxy.length, server.requestCount);
|
| - Expect.equals(proxy.length, secureServer.requestCount);
|
| - proxyServer.shutdown();
|
| + proxyServer1.shutdown();
|
| + proxyServer2.shutdown();
|
| server.shutdown();
|
| - secureServer.shutdown();
|
| client.close();
|
| }
|
| });
|
| });
|
| - }
|
| -
|
| - test(false);
|
| - test(true);
|
| - }
|
| - });
|
| - });
|
| - });
|
| -}
|
| -
|
| -
|
| -int testProxyChainDoneCount = 0;
|
| -void testProxyChain() {
|
| - // Setup two proxy servers having the first using the second as its proxy.
|
| - setupProxyServer().then((proxyServer1) {
|
| - setupProxyServer().then((proxyServer2) {
|
| - proxyServer1.client.findProxy = (_) => "PROXY localhost:${proxyServer2.port}";
|
| -
|
| - setupServer(2, directRequestPaths: ["/4"]).then((server) {
|
| - HttpClient client = new HttpClient(context: clientContext);
|
| -
|
| - List<String> proxy;
|
| - if (Platform.operatingSystem == "windows") {
|
| - proxy =
|
| - ["PROXY localhost:${proxyServer1.port}",
|
| - "PROXY localhost:${proxyServer1.port}; PROXY hede.hule.hest:8080",
|
| - "PROXY localhost:${proxyServer1.port}",
|
| - "PROXY localhost:${proxyServer1.port}",
|
| - "DIRECT",
|
| - "PROXY localhost:${proxyServer1.port}; DIRECT"];
|
| - } else {
|
| - 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://localhost:${server.port}/$i"))
|
| - .then((HttpClientRequest clientRequest) {
|
| - String content = "$i$i$i";
|
| - clientRequest.contentLength = content.length;
|
| - clientRequest.write(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();
|
| - }
|
| - });
|
| - });
|
| - }
|
| - });
|
| - });
|
| + }
|
| + });
|
| + });
|
| });
|
| }
|
|
|
|
|