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..3d096dfd8feba6981ef24026093aedfbd5f76a6d 100644 |
| --- a/runtime/bin/socket_patch.dart |
| +++ b/runtime/bin/socket_patch.dart |
| @@ -481,40 +481,51 @@ 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]; |
| 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); |
| + 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(error != null ? error : |
| + 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(); |
|
Søren Gjesse
2014/05/01 07:23:34
Add a comment that this keeps the first error.
Anders Johnsen
2014/05/01 08:42:38
Done.
|
| + run(error != null ? error : e); |
|
codefu
2014/05/01 18:52:02
If addresses.length > 1 and the first address conn
Anders Johnsen
2014/05/01 19:27:58
No, this error handler is only called when connect
|
| + } |
| + ); |
| + socket.setListening(read: false, write: true); |
| + } |
| } |
| + run(null); |
| + return completer.future; |
| }); |
| } |