Chromium Code Reviews| Index: runtime/bin/socket_patch.dart |
| diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart |
| index 59faecf0918c3ea10c5095c9c5acee4f079f2490..70f078a3aa0a52098c0af03dfc3cd198d340bdcc 100644 |
| --- a/runtime/bin/socket_patch.dart |
| +++ b/runtime/bin/socket_patch.dart |
| @@ -481,40 +481,60 @@ class _NativeSocket extends NativeFieldWrapperClass1 { |
| static Future<_NativeSocket> connect(host, int port) { |
| return new Future.value(host) |
| .then((host) { |
| - if (host is _InternetAddress) return host; |
| + if (host is _InternetAddress) return [host]; |
| + if (host is List) { |
|
Søren Gjesse
2014/04/30 13:11:56
We don't want to support a List here.
Anders Johnsen
2014/05/01 06:31:23
Done.
|
| + for (var entry in host) { |
| + if (entry is! _InternetAddress) { |
| + throw new ArgumentError( |
| + "When passing a List as `host`, the entries" |
| + " must be InternetAddresses"); |
| + } |
| + } |
| + return host; |
| + } |
| return lookup(host) |
| .then((list) { |
| if (list.length == 0) { |
| throw createError(response, "Failed host lookup: '$host'"); |
| } |
| - return list[0]; |
| + return list; |
| }); |
| }) |
| - .then((address) { |
| - var socket = new _NativeSocket.normal(); |
| - socket.address = address; |
| - var result = socket.nativeCreateConnect( |
| - address._in_addr, port); |
| - if (result is OSError) { |
| - throw createError(result, "Connection failed", address, port); |
| - } else { |
| - socket.port; // Query the local port, for error messages. |
| - var completer = new Completer(); |
| - // Setup handlers for receiving the first write event which |
| - // indicate that the socket is fully connected. |
| - socket.setHandlers( |
| - write: () { |
| - socket.setListening(read: false, write: false); |
| - completer.complete(socket); |
| - }, |
| - error: (e) { |
| - socket.close(); |
| - completer.completeError(e); |
| - } |
| - ); |
| - socket.setListening(read: false, write: true); |
| - return completer.future; |
| + .then((addresses) { |
| + assert(addresses is List); |
| + var completer = new Completer(); |
| + var it = addresses.iterator; |
| + void run(error) { |
| + if (!it.moveNext()) { |
| + assert(error != null); |
| + completer.completeError(error); |
|
Søren Gjesse
2014/04/30 13:11:56
This will just return the error from the last one
Ivan Posva
2014/04/30 16:28:06
You could collect them all in a List and have a mu
Anders Johnsen
2014/05/01 06:31:23
It's just hard to fit in our current model, withou
|
| + return; |
| + } |
| + var address = it.current; |
| + var socket = new _NativeSocket.normal(); |
| + socket.address = address; |
| + var result = socket.nativeCreateConnect(address._in_addr, port); |
| + if (result is OSError) { |
| + run(createError(result, "Connection failed", address, port)); |
| + } else { |
| + socket.port; // Query the local port, for error messages. |
| + // Setup handlers for receiving the first write event which |
| + // indicate that the socket is fully connected. |
| + socket.setHandlers( |
| + write: () { |
| + socket.setListening(read: false, write: false); |
| + completer.complete(socket); |
| + }, |
| + error: (e) { |
| + socket.close(); |
| + run(e); |
| + } |
| + ); |
| + socket.setListening(read: false, write: true); |
| + } |
| } |
| + run(null); |
| + return completer.future; |
| }); |
| } |