Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(45)

Side by Side Diff: tests/standalone/io/http_proxy_test.dart

Issue 14493015: Add HTTP proxy tunnel support (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 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. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 import "package:expect/expect.dart"; 5 import "package:expect/expect.dart";
6 import "dart:async"; 6 import "dart:async";
7 import 'dart:crypto'; 7 import 'dart:crypto';
8 import "dart:io"; 8 import "dart:io";
9 import "dart:uri"; 9 import "dart:uri";
10 import 'dart:utf'; 10 import 'dart:utf';
(...skipping 16 matching lines...) Expand all
27 return f.then((s) { 27 return f.then((s) {
28 server = s; 28 server = s;
29 x.complete(this); 29 x.complete(this);
30 server.listen((request) { 30 server.listen((request) {
31 var response = request.response; 31 var response = request.response;
32 requestCount++; 32 requestCount++;
33 // Check whether a proxy or direct connection is expected. 33 // Check whether a proxy or direct connection is expected.
34 bool direct = directRequestPaths.fold( 34 bool direct = directRequestPaths.fold(
35 false, 35 false,
36 (prev, path) => prev ? prev : path == request.uri.path); 36 (prev, path) => prev ? prev : path == request.uri.path);
37 if (!direct && proxyHops > 0) { 37 if (!secure && !direct && proxyHops > 0) {
38 Expect.isNotNull(request.headers[HttpHeaders.VIA]); 38 Expect.isNotNull(request.headers[HttpHeaders.VIA]);
39 Expect.equals(1, request.headers[HttpHeaders.VIA].length); 39 Expect.equals(1, request.headers[HttpHeaders.VIA].length);
40 Expect.equals( 40 Expect.equals(
41 proxyHops, 41 proxyHops,
42 request.headers[HttpHeaders.VIA][0].split(",").length); 42 request.headers[HttpHeaders.VIA][0].split(",").length);
43 } else { 43 } else {
44 Expect.isNull(request.headers[HttpHeaders.VIA]); 44 Expect.isNull(request.headers[HttpHeaders.VIA]);
45 } 45 }
46 var body = new StringBuffer(); 46 var body = new StringBuffer();
47 request.listen( 47 request.listen(
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 Expect.equals("Basic", tokens[0]); 115 Expect.equals("Basic", tokens[0]);
116 String auth = 116 String auth =
117 CryptoUtils.bytesToBase64(encodeUtf8("$username:$password")); 117 CryptoUtils.bytesToBase64(encodeUtf8("$username:$password"));
118 if (auth != tokens[1]) { 118 if (auth != tokens[1]) {
119 authenticationRequired(request); 119 authenticationRequired(request);
120 return; 120 return;
121 } 121 }
122 } 122 }
123 } 123 }
124 // Open the connection from the proxy. 124 // Open the connection from the proxy.
125 client.openUrl(request.method, request.uri) 125 if (request.method == "CONNECT") {
126 .then((HttpClientRequest clientRequest) { 126 var tmp = request.uri.toString().split(":");
127 // Forward all headers. 127 Socket.connect(tmp[0], int.parse(tmp[1]))
128 request.headers.forEach((String name, List<String> values) { 128 .then((socket) {
129 values.forEach((String value) { 129 request.response.reasonPhrase = "Connection established";
130 if (name != "content-length" && name != "via") { 130 request.response.detachSocket()
131 clientRequest.headers.add(name, value); 131 .then((detached) {
132 } 132 socket.pipe(detached);
133 detached.pipe(socket);
134 });
133 }); 135 });
136 } else {
137 client.openUrl(request.method, request.uri)
138 .then((HttpClientRequest clientRequest) {
139 // Forward all headers.
140 request.headers.forEach((String name, List<String> values) {
141 values.forEach((String value) {
142 if (name != "content-length" && name != "via") {
143 clientRequest.headers.add(name, value);
144 }
145 });
146 });
147 // Special handling of Content-Length and Via.
148 clientRequest.contentLength = request.contentLength;
149 List<String> via = request.headers[HttpHeaders.VIA];
150 String viaPrefix = via == null ? "" : "${via[0]}, ";
151 clientRequest.headers.add(
152 HttpHeaders.VIA, "${viaPrefix}1.1 localhost:$port");
153 // Copy all content.
154 return request.pipe(clientRequest);
155 })
156 .then((HttpClientResponse clientResponse) {
157 clientResponse.pipe(request.response);
134 }); 158 });
135 // Special handling of Content-Length and Via. 159 }
136 clientRequest.contentLength = request.contentLength;
137 List<String> via = request.headers[HttpHeaders.VIA];
138 String viaPrefix = via == null ? "" : "${via[0]}, ";
139 clientRequest.headers.add(
140 HttpHeaders.VIA, "${viaPrefix}1.1 localhost:$port");
141 // Copy all content.
142 return request.pipe(clientRequest);
143 })
144 .then((HttpClientResponse clientResponse) {
145 clientResponse.pipe(request.response);
146 });
147 }); 160 });
148 }); 161 });
149 return x.future; 162 return x.future;
150 } 163 }
151 164
152 void shutdown() { 165 void shutdown() {
153 server.close(); 166 server.close();
154 client.close(); 167 client.close();
155 } 168 }
156 169
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after
422 ? "https://localhost:${secureServer.port}/$i" 435 ? "https://localhost:${secureServer.port}/$i"
423 : "http://localhost:${server.port}/$i"; 436 : "http://localhost:${server.port}/$i";
424 437
425 client.postUrl(Uri.parse(url)) 438 client.postUrl(Uri.parse(url))
426 .then((HttpClientRequest clientRequest) { 439 .then((HttpClientRequest clientRequest) {
427 String content = "$i$i$i"; 440 String content = "$i$i$i";
428 clientRequest.write(content); 441 clientRequest.write(content);
429 return clientRequest.close(); 442 return clientRequest.close();
430 }) 443 })
431 .then((HttpClientResponse response) { 444 .then((HttpClientResponse response) {
432 response.listen((_) {}, onDone: () { 445 Expect.fail("No response expected");
433 testProxyAuthenticateCount++; 446 }).
434 Expect.equals(HttpStatus.PROXY_AUTHENTICATION_REQUIRED, 447 catchError((e) {
435 response.statusCode); 448 testProxyAuthenticateCount++;
436 if (testProxyAuthenticateCount == loopCount * 2) { 449 if (testProxyAuthenticateCount == loopCount * 2) {
437 Expect.equals(0, server.requestCount); 450 Expect.equals(0, server.requestCount);
438 Expect.equals(0, secureServer.requestCount); 451 Expect.equals(0, secureServer.requestCount);
439 step1.complete(null); 452 step1.complete(null);
440 } 453 }
441 }); 454 });
442 });
443 } 455 }
444 456
445 test(false); 457 test(false);
446 test(true); 458 test(true);
447 } 459 }
448
449 step1.future.then((_) { 460 step1.future.then((_) {
450 testProxyAuthenticateCount = 0; 461 testProxyAuthenticateCount = 0;
451 client.findProxy = (Uri uri) { 462 client.findProxy = (Uri uri) {
452 return "PROXY test:test@localhost:${proxyServer.port}"; 463 return "PROXY test:test@localhost:${proxyServer.port}";
453 }; 464 };
454 465
455 for (int i = 0; i < loopCount; i++) { 466 for (int i = 0; i < loopCount; i++) {
456 test(bool secure) { 467 test(bool secure) {
457 String url = secure 468 String url = secure
458 ? "https://localhost:${secureServer.port}/$i" 469 ? "https://localhost:${secureServer.port}/$i"
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
627 testDirectProxy(); 638 testDirectProxy();
628 testProxy(); 639 testProxy();
629 testProxyChain(); 640 testProxyChain();
630 testProxyFromEnviroment(); 641 testProxyFromEnviroment();
631 testProxyAuthenticate(); 642 testProxyAuthenticate();
632 // This test is not normally run. It can be used for locally testing 643 // This test is not normally run. It can be used for locally testing
633 // with a real proxy server (e.g. Apache). 644 // with a real proxy server (e.g. Apache).
634 //testRealProxy(); 645 //testRealProxy();
635 //testRealProxyAuth(); 646 //testRealProxyAuth();
636 } 647 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698