| Index: sdk/lib/io/http_impl.dart
|
| diff --git a/sdk/lib/io/http_impl.dart b/sdk/lib/io/http_impl.dart
|
| index 49b6c7b46fc8f947dbb8b7ea43588e86c1d33f0b..880d771a6af82c11f95d3160ce67e8236d8d43ed 100644
|
| --- a/sdk/lib/io/http_impl.dart
|
| +++ b/sdk/lib/io/http_impl.dart
|
| @@ -1256,6 +1256,7 @@ class _HttpClientConnection {
|
| final String key;
|
| final Socket _socket;
|
| final bool _proxyTunnel;
|
| + final SecurityContext _context;
|
| final _HttpParser _httpParser;
|
| StreamSubscription _subscription;
|
| final _HttpClient _httpClient;
|
| @@ -1268,7 +1269,7 @@ class _HttpClientConnection {
|
| Future _streamFuture;
|
|
|
| _HttpClientConnection(this.key, this._socket, this._httpClient,
|
| - [this._proxyTunnel = false])
|
| + [this._proxyTunnel = false, this._context])
|
| : _httpParser = new _HttpParser.responseParser() {
|
| _httpParser.listenToStream(_socket);
|
|
|
| @@ -1496,7 +1497,10 @@ class _HttpClientConnection {
|
| }
|
| var socket = response._httpRequest._httpClientConnection._socket;
|
| return SecureSocket.secure(
|
| - socket, host: host, onBadCertificate: callback);
|
| + socket,
|
| + host: host,
|
| + context: _context,
|
| + onBadCertificate: callback);
|
| })
|
| .then((secureSocket) {
|
| String key = _HttpClientConnection.makeKey(true, host, port);
|
| @@ -1543,12 +1547,17 @@ class _ConnectionTarget {
|
| final String host;
|
| final int port;
|
| final bool isSecure;
|
| + final SecurityContext context;
|
| final Set<_HttpClientConnection> _idle = new HashSet();
|
| final Set<_HttpClientConnection> _active = new HashSet();
|
| final Queue _pending = new ListQueue();
|
| int _connecting = 0;
|
|
|
| - _ConnectionTarget(this.key, this.host, this.port, this.isSecure);
|
| + _ConnectionTarget(this.key,
|
| + this.host,
|
| + this.port,
|
| + this.isSecure,
|
| + this.context);
|
|
|
| bool get isEmpty => _idle.isEmpty && _active.isEmpty && _connecting == 0;
|
|
|
| @@ -1620,12 +1629,13 @@ class _ConnectionTarget {
|
| return completer.future;
|
| }
|
| var currentBadCertificateCallback = client._badCertificateCallback;
|
| - bool callback(X509Certificate certificate) =>
|
| + callback(X509Certificate certificate) =>
|
| currentBadCertificateCallback == null ? false :
|
| currentBadCertificateCallback(certificate, uriHost, uriPort);
|
| Future socketFuture = (isSecure && proxy.isDirect
|
| ? SecureSocket.connect(host,
|
| port,
|
| + context: context,
|
| sendClientCertificate: true,
|
| onBadCertificate: callback)
|
| : Socket.connect(host, port));
|
| @@ -1633,7 +1643,8 @@ class _ConnectionTarget {
|
| return socketFuture.then((socket) {
|
| _connecting--;
|
| socket.setOption(SocketOption.TCP_NODELAY, true);
|
| - var connection = new _HttpClientConnection(key, socket, client);
|
| + var connection =
|
| + new _HttpClientConnection(key, socket, client, false, context);
|
| if (isSecure && !proxy.isDirect) {
|
| connection._dispose = true;
|
| return connection.createProxyTunnel(uriHost, uriPort, proxy, callback)
|
| @@ -1662,6 +1673,7 @@ class _HttpClient implements HttpClient {
|
| = new HashMap<String, _ConnectionTarget>();
|
| final List<_Credentials> _credentials = [];
|
| final List<_ProxyCredentials> _proxyCredentials = [];
|
| + final SecurityContext _context;
|
| Function _authenticate;
|
| Function _authenticateProxy;
|
| Function _findProxy = HttpClient.findProxyFromEnvironment;
|
| @@ -1676,6 +1688,8 @@ class _HttpClient implements HttpClient {
|
|
|
| String userAgent = _getHttpVersion();
|
|
|
| + _HttpClient(SecurityContext this._context);
|
| +
|
| void set idleTimeout(Duration timeout) {
|
| _idleTimeout = timeout;
|
| for (var c in _connectionTargets.values) {
|
| @@ -1894,8 +1908,9 @@ class _HttpClient implements HttpClient {
|
|
|
| _ConnectionTarget _getConnectionTarget(String host, int port, bool isSecure) {
|
| String key = _HttpClientConnection.makeKey(isSecure, host, port);
|
| - return _connectionTargets.putIfAbsent(
|
| - key, () => new _ConnectionTarget(key, host, port, isSecure));
|
| + return _connectionTargets.putIfAbsent(key, () {
|
| + return new _ConnectionTarget(key, host, port, isSecure, _context);
|
| + });
|
| }
|
|
|
| // Get a new _HttpClientConnection, from the matching _ConnectionTarget.
|
| @@ -2207,6 +2222,7 @@ class _HttpServer
|
|
|
| static Future<HttpServer> bindSecure(address,
|
| int port,
|
| + SecurityContext context,
|
| int backlog,
|
| bool v6Only,
|
| String certificate_name,
|
| @@ -2215,7 +2231,7 @@ class _HttpServer
|
| return SecureServerSocket.bind(
|
| address,
|
| port,
|
| - certificate_name,
|
| + context,
|
| backlog: backlog,
|
| v6Only: v6Only,
|
| requestClientCertificate: requestClientCertificate,
|
|
|