Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(487)

Side by Side Diff: runtime/bin/socket_patch.dart

Issue 908873002: Add support to specify the source address for socket connect (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Added dart2js patch file Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 patch class RawServerSocket { 5 patch class RawServerSocket {
6 /* patch */ static Future<RawServerSocket> bind(address, 6 /* patch */ static Future<RawServerSocket> bind(address,
7 int port, 7 int port,
8 {int backlog: 0, 8 {int backlog: 0,
9 bool v6Only: false}) { 9 bool v6Only: false}) {
10 return _RawServerSocket.bind(address, port, backlog, v6Only); 10 return _RawServerSocket.bind(address, port, backlog, v6Only);
11 } 11 }
12 } 12 }
13 13
14 14
15 patch class RawSocket { 15 patch class RawSocket {
16 /* patch */ static Future<RawSocket> connect(host, int port) { 16 /* patch */ static Future<RawSocket> connect(
17 return _RawSocket.connect(host, port); 17 host, int port, {sourceAddress}) {
18 return _RawSocket.connect(host, port, sourceAddress);
18 } 19 }
19 } 20 }
20 21
21 22
22 patch class InternetAddress { 23 patch class InternetAddress {
23 /* patch */ static InternetAddress get LOOPBACK_IP_V4 { 24 /* patch */ static InternetAddress get LOOPBACK_IP_V4 {
24 return _InternetAddress.LOOPBACK_IP_V4; 25 return _InternetAddress.LOOPBACK_IP_V4;
25 } 26 }
26 27
27 /* patch */ static InternetAddress get LOOPBACK_IP_V6 { 28 /* patch */ static InternetAddress get LOOPBACK_IP_V6 {
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after
374 map.putIfAbsent( 375 map.putIfAbsent(
375 name, () => new _NetworkInterface(name, index)); 376 name, () => new _NetworkInterface(name, index));
376 map[name].addresses.add(address); 377 map[name].addresses.add(address);
377 return map; 378 return map;
378 }); 379 });
379 return map.values.toList(); 380 return map.values.toList();
380 } 381 }
381 }); 382 });
382 } 383 }
383 384
384 static Future<_NativeSocket> connect(host, int port) { 385 static Future<_NativeSocket> connect(host, int port, sourceAddress) {
386 if (sourceAddress != null && sourceAddress is! _InternetAddress) {
387 if (sourceAddress is String) {
388 sourceAddress = new InternetAddress(sourceAddress);
389 }
390 }
385 return new Future.value(host) 391 return new Future.value(host)
386 .then((host) { 392 .then((host) {
387 if (host is _InternetAddress) return [host]; 393 if (host is _InternetAddress) return [host];
388 return lookup(host) 394 return lookup(host)
389 .then((addresses) { 395 .then((addresses) {
390 if (addresses.isEmpty) { 396 if (addresses.isEmpty) {
391 throw createError(response, "Failed host lookup: '$host'"); 397 throw createError(response, "Failed host lookup: '$host'");
392 } 398 }
393 return addresses; 399 return addresses;
394 }); 400 });
395 }) 401 })
396 .then((addresses) { 402 .then((addresses) {
397 assert(addresses is List); 403 assert(addresses is List);
398 var completer = new Completer(); 404 var completer = new Completer();
399 var it = addresses.iterator; 405 var it = addresses.iterator;
400 var error = null; 406 var error = null;
401 var connecting = new HashMap(); 407 var connecting = new HashMap();
402 void connectNext() { 408 void connectNext() {
403 if (!it.moveNext()) { 409 if (!it.moveNext()) {
404 if (connecting.isEmpty) { 410 if (connecting.isEmpty) {
405 assert(error != null); 411 assert(error != null);
406 completer.completeError(error); 412 completer.completeError(error);
407 } 413 }
408 return; 414 return;
409 } 415 }
410 var address = it.current; 416 var address = it.current;
411 var socket = new _NativeSocket.normal(); 417 var socket = new _NativeSocket.normal();
412 socket.address = address; 418 socket.address = address;
413 var result = socket.nativeCreateConnect(address._in_addr, port); 419 var result;
420 if (sourceAddress == null) {
421 result = socket.nativeCreateConnect(address._in_addr, port);
422 } else {
423 assert(sourceAddress is _InternetAddress);
424 result = socket.nativeCreateBindConnect(
425 address._in_addr, port, sourceAddress._in_addr);
426 }
414 if (result is OSError) { 427 if (result is OSError) {
415 // Keep first error, if present. 428 // Keep first error, if present.
416 if (error == null) { 429 if (error == null) {
417 error = createError(result, "Connection failed", address, port); 430 error = createError(result, "Connection failed", address, port);
418 } 431 }
419 connectNext(); 432 connectNext();
420 } else { 433 } else {
421 socket.port; // Query the local port, for error messages. 434 socket.port; // Query the local port, for error messages.
422 // Set up timer for when we should retry the next address 435 // Set up timer for when we should retry the next address
423 // (if any). 436 // (if any).
(...skipping 685 matching lines...) Expand 10 before | Expand all | Expand 10 after
1109 nativeAvailable() native "Socket_Available"; 1122 nativeAvailable() native "Socket_Available";
1110 nativeRead(int len) native "Socket_Read"; 1123 nativeRead(int len) native "Socket_Read";
1111 nativeRecvFrom() native "Socket_RecvFrom"; 1124 nativeRecvFrom() native "Socket_RecvFrom";
1112 nativeWrite(List<int> buffer, int offset, int bytes) 1125 nativeWrite(List<int> buffer, int offset, int bytes)
1113 native "Socket_WriteList"; 1126 native "Socket_WriteList";
1114 nativeSendTo(List<int> buffer, int offset, int bytes, 1127 nativeSendTo(List<int> buffer, int offset, int bytes,
1115 List<int> address, int port) 1128 List<int> address, int port)
1116 native "Socket_SendTo"; 1129 native "Socket_SendTo";
1117 nativeCreateConnect(List<int> addr, 1130 nativeCreateConnect(List<int> addr,
1118 int port) native "Socket_CreateConnect"; 1131 int port) native "Socket_CreateConnect";
1132 nativeCreateBindConnect(
1133 List<int> addr, int port, List<int> sourceAddr)
1134 native "Socket_CreateBindConnect";
1119 nativeCreateBindListen(List<int> addr, int port, int backlog, bool v6Only) 1135 nativeCreateBindListen(List<int> addr, int port, int backlog, bool v6Only)
1120 native "ServerSocket_CreateBindListen"; 1136 native "ServerSocket_CreateBindListen";
1121 nativeCreateBindDatagram(List<int> addr, int port, bool reuseAddress) 1137 nativeCreateBindDatagram(List<int> addr, int port, bool reuseAddress)
1122 native "Socket_CreateBindDatagram"; 1138 native "Socket_CreateBindDatagram";
1123 nativeAccept(_NativeSocket socket) native "ServerSocket_Accept"; 1139 nativeAccept(_NativeSocket socket) native "ServerSocket_Accept";
1124 int nativeGetPort() native "Socket_GetPort"; 1140 int nativeGetPort() native "Socket_GetPort";
1125 List nativeGetRemotePeer() native "Socket_GetRemotePeer"; 1141 List nativeGetRemotePeer() native "Socket_GetRemotePeer";
1126 int nativeGetSocketId() native "Socket_GetSocketId"; 1142 int nativeGetSocketId() native "Socket_GetSocketId";
1127 OSError nativeGetError() native "Socket_GetError"; 1143 OSError nativeGetError() native "Socket_GetError";
1128 nativeGetOption(int option, int protocol) native "Socket_GetOption"; 1144 nativeGetOption(int option, int protocol) native "Socket_GetOption";
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
1280 class _RawSocket extends Stream<RawSocketEvent> 1296 class _RawSocket extends Stream<RawSocketEvent>
1281 implements RawSocket { 1297 implements RawSocket {
1282 final _NativeSocket _socket; 1298 final _NativeSocket _socket;
1283 StreamController<RawSocketEvent> _controller; 1299 StreamController<RawSocketEvent> _controller;
1284 bool _readEventsEnabled = true; 1300 bool _readEventsEnabled = true;
1285 bool _writeEventsEnabled = true; 1301 bool _writeEventsEnabled = true;
1286 1302
1287 // Flag to handle Ctrl-D closing of stdio on Mac OS. 1303 // Flag to handle Ctrl-D closing of stdio on Mac OS.
1288 bool _isMacOSTerminalInput = false; 1304 bool _isMacOSTerminalInput = false;
1289 1305
1290 static Future<RawSocket> connect(host, int port) { 1306 static Future<RawSocket> connect(host, int port, sourceAddress) {
1291 return _NativeSocket.connect(host, port) 1307 return _NativeSocket.connect(host, port, sourceAddress)
1292 .then((socket) => new _RawSocket(socket)); 1308 .then((socket) => new _RawSocket(socket));
1293 } 1309 }
1294 1310
1295 _RawSocket(this._socket) { 1311 _RawSocket(this._socket) {
1296 var zone = Zone.current; 1312 var zone = Zone.current;
1297 _controller = new StreamController(sync: true, 1313 _controller = new StreamController(sync: true,
1298 onListen: _onSubscriptionStateChange, 1314 onListen: _onSubscriptionStateChange,
1299 onCancel: _onSubscriptionStateChange, 1315 onCancel: _onSubscriptionStateChange,
1300 onPause: _onPauseStateChange, 1316 onPause: _onPauseStateChange,
1301 onResume: _onPauseStateChange); 1317 onResume: _onPauseStateChange);
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
1483 ServerSocketReference get reference { 1499 ServerSocketReference get reference {
1484 return new _ServerSocketReference(_socket.reference); 1500 return new _ServerSocketReference(_socket.reference);
1485 } 1501 }
1486 1502
1487 Map _toJSON(bool ref) => _socket._toJSON(ref); 1503 Map _toJSON(bool ref) => _socket._toJSON(ref);
1488 void set _owner(owner) { _socket._owner = owner; } 1504 void set _owner(owner) { _socket._owner = owner; }
1489 } 1505 }
1490 1506
1491 1507
1492 patch class Socket { 1508 patch class Socket {
1493 /* patch */ static Future<Socket> connect(host, int port) { 1509 /* patch */ static Future<Socket> connect(host, int port, {sourceAddress}) {
1494 return RawSocket.connect(host, port).then( 1510 return RawSocket.connect(host, port, sourceAddress: sourceAddress).then(
1495 (socket) => new _Socket(socket)); 1511 (socket) => new _Socket(socket));
1496 } 1512 }
1497 } 1513 }
1498 1514
1499 1515
1500 class _SocketStreamConsumer extends StreamConsumer<List<int>> { 1516 class _SocketStreamConsumer extends StreamConsumer<List<int>> {
1501 StreamSubscription subscription; 1517 StreamSubscription subscription;
1502 final _Socket socket; 1518 final _Socket socket;
1503 int offset; 1519 int offset;
1504 List<int> buffer; 1520 List<int> buffer;
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after
1933 String address, 1949 String address,
1934 List<int> in_addr, 1950 List<int> in_addr,
1935 int port) { 1951 int port) {
1936 return new Datagram( 1952 return new Datagram(
1937 data, 1953 data,
1938 new _InternetAddress(address, null, in_addr), 1954 new _InternetAddress(address, null, in_addr),
1939 port); 1955 port);
1940 } 1956 }
1941 1957
1942 String _socketsStats() => _SocketsObservatory.toJSON(); 1958 String _socketsStats() => _SocketsObservatory.toJSON();
OLDNEW
« no previous file with comments | « runtime/bin/socket_macos.cc ('k') | runtime/bin/socket_win.cc » ('j') | sdk/lib/io/socket.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698