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(); |
- } |
- }); |
- }); |
- } |
- }); |
- }); |
+ } |
+ }); |
+ }); |
}); |
} |