Remove the workaround for issue 19815 in http_multi_server. This releases http_multi_server 1.0.2. R=rnystrom@google.com BUG=20257 Review URL: https://codereview.chromium.org//433593002 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@38755 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/pkgs/http_multi_server/CHANGELOG.md b/pkgs/http_multi_server/CHANGELOG.md index ac00908..8cab523 100644 --- a/pkgs/http_multi_server/CHANGELOG.md +++ b/pkgs/http_multi_server/CHANGELOG.md
@@ -1,3 +1,7 @@ +## 1.0.2 + +* Remove the workaround for [issue 19815][]. + ## 1.0.1 * Ignore errors from one of the servers if others are still bound. In
diff --git a/pkgs/http_multi_server/lib/http_multi_server.dart b/pkgs/http_multi_server/lib/http_multi_server.dart index da12888..c055367 100644 --- a/pkgs/http_multi_server/lib/http_multi_server.dart +++ b/pkgs/http_multi_server/lib/http_multi_server.dart
@@ -99,15 +99,20 @@ /// [HttpServer.bindSecure]. static Future<HttpServer> _loopback(int port, Future<HttpServer> bind(InternetAddress address, int port)) { - return bind(InternetAddress.LOOPBACK_IP_V4, port).then((v4Server) { + return Future.wait([ + supportsIpV6, + bind(InternetAddress.LOOPBACK_IP_V4, port) + ]).then((results) { + var supportsIpV6 = results[0]; + var v4Server = results[1]; + + if (!supportsIpV6) return v4Server; + // Reuse the IPv4 server's port so that if [port] is 0, both servers use // the same ephemeral port. return bind(InternetAddress.LOOPBACK_IP_V6, v4Server.port) - .then((v6Server) => new HttpMultiServer([v4Server, v6Server])) - .catchError((error) { - // If we fail to bind to IPv6, just use IPv4. - if (error is SocketException) return v4Server; - throw error; + .then((v6Server) { + return new HttpMultiServer([v4Server, v6Server]); }); }); }
diff --git a/pkgs/http_multi_server/lib/src/utils.dart b/pkgs/http_multi_server/lib/src/utils.dart index d615975..9e95aba 100644 --- a/pkgs/http_multi_server/lib/src/utils.dart +++ b/pkgs/http_multi_server/lib/src/utils.dart
@@ -7,8 +7,6 @@ import 'dart:async'; import 'dart:io'; -// TODO(nweiz): Revert this to the version of [mergeStreams] found elsewhere in -// the repo once issue 19815 is fixed in dart:io. /// Merges all streams in [streams] into a single stream that emits all of their /// values. /// @@ -20,17 +18,9 @@ controller = new StreamController(onListen: () { for (var stream in streams) { var subscription; - subscription = stream.listen(controller.add, onError: (error, trace) { - if (subscriptions.length == 1) { - // If the last subscription errored, pass it on. - controller.addError(error, trace); - } else { - // If only one of the subscriptions has an error (usually IPv6 failing - // late), then just remove that subscription and ignore the error. - subscriptions.remove(subscription); - subscription.cancel(); - } - }, onDone: () { + subscription = stream.listen(controller.add, + onError: controller.addError, + onDone: () { subscriptions.remove(subscription); if (subscriptions.isEmpty) controller.close(); }); @@ -52,3 +42,21 @@ return controller.stream; } + +/// A cache for [supportsIpV6]. +bool _supportsIpV6; + +/// Returns whether this computer supports binding to IPv6 addresses. +Future<bool> get supportsIpV6 { + if (_supportsIpV6 != null) return new Future.value(_supportsIpV6); + + return ServerSocket.bind(InternetAddress.LOOPBACK_IP_V6, 0).then((socket) { + _supportsIpV6 = true; + socket.close(); + return true; + }).catchError((error) { + if (error is! SocketException) throw error; + _supportsIpV6 = false; + return false; + }); +}
diff --git a/pkgs/http_multi_server/pubspec.yaml b/pkgs/http_multi_server/pubspec.yaml index 2bdb4a2..c7361d4 100644 --- a/pkgs/http_multi_server/pubspec.yaml +++ b/pkgs/http_multi_server/pubspec.yaml
@@ -1,5 +1,5 @@ name: http_multi_server -version: 1.0.1 +version: 1.0.2 author: "Dart Team <misc@dartlang.org>" homepage: http://www.dartlang.org description: @@ -8,4 +8,4 @@ unittest: ">=0.11.0 <0.12.0" http: ">=0.11.0 <0.12.0" environment: - sdk: ">=1.4.0 <2.0.0" + sdk: ">=1.6.0-dev.6.0 <2.0.0"
diff --git a/pkgs/http_multi_server/test/http_multi_server_test.dart b/pkgs/http_multi_server/test/http_multi_server_test.dart index 0140ee7..a3d9062 100644 --- a/pkgs/http_multi_server/test/http_multi_server_test.dart +++ b/pkgs/http_multi_server/test/http_multi_server_test.dart
@@ -108,7 +108,7 @@ expect(http.read("http://127.0.0.1:${server.port}/"), completion(equals("got request"))); - return _supportsIpV6.then((supportsIpV6) { + return supportsIpV6.then((supportsIpV6) { if (!supportsIpV6) return; expect(http.read("http://[::1]:${server.port}/"), completion(equals("got request"))); @@ -117,26 +117,6 @@ }); } -/// A cache for [supportsIpV6]. -bool _supportsIpV6Cache; - -// TODO(nweiz): This is known to be inaccurate on Windows machines with IPv6 -// disabled (issue 19815). Tests will fail on such machines. -/// Returns whether this computer supports binding to IPv6 addresses. -Future<bool> get _supportsIpV6 { - if (_supportsIpV6Cache != null) return new Future.value(_supportsIpV6Cache); - - return ServerSocket.bind(InternetAddress.LOOPBACK_IP_V6, 0).then((socket) { - _supportsIpV6Cache = true; - socket.close(); - return true; - }).catchError((error) { - if (error is! SocketException) throw error; - _supportsIpV6Cache = false; - return false; - }); -} - /// Makes a GET request to the root of [server] and returns the response. Future<http.Response> _get(HttpServer server) => http.get(_urlFor(server));