Index: pkg/http_multi_server/lib/src/utils.dart |
diff --git a/pkg/http_multi_server/lib/src/utils.dart b/pkg/http_multi_server/lib/src/utils.dart |
index 9e95aba5f9d82612e7bf2d3632c762dd156e8ced..57cf8a6ecdccb270416aa66016537ddc3d8c7dfe 100644 |
--- a/pkg/http_multi_server/lib/src/utils.dart |
+++ b/pkg/http_multi_server/lib/src/utils.dart |
@@ -18,9 +18,14 @@ Stream mergeStreams(Iterable<Stream> streams) { |
controller = new StreamController(onListen: () { |
for (var stream in streams) { |
var subscription; |
- subscription = stream.listen(controller.add, |
- onError: controller.addError, |
- onDone: () { |
+ subscription = stream.listen(controller.add, onError: (error, trace) { |
+ // If one of the subscriptions has an error (usually IPv6 failing late), |
nweiz
2014/07/09 02:02:01
This comment should mention the tracking issue. It
|
+ // then just remove it and ignore the error. |
+ subscriptions.remove(subscription); |
nweiz
2014/07/09 02:02:01
If this isn't the last subscription, cancel it as
|
+ |
+ // If the last subscription errored, though, pass it on. |
+ if (subscriptions.isEmpty) controller.addError(error, trace); |
+ }, onDone: () { |
subscriptions.remove(subscription); |
if (subscriptions.isEmpty) controller.close(); |
}); |
@@ -42,21 +47,3 @@ Stream mergeStreams(Iterable<Stream> streams) { |
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; |
- }); |
-} |