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; |
}); |
} |