OLD | NEW |
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 bool shared: false}) { | 10 bool shared: false}) { |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 bool includeLinkLocal: false, | 63 bool includeLinkLocal: false, |
64 InternetAddressType type: InternetAddressType.ANY}) { | 64 InternetAddressType type: InternetAddressType.ANY}) { |
65 return _NativeSocket.listInterfaces(includeLoopback: includeLoopback, | 65 return _NativeSocket.listInterfaces(includeLoopback: includeLoopback, |
66 includeLinkLocal: includeLinkLocal, | 66 includeLinkLocal: includeLinkLocal, |
67 type: type); | 67 type: type); |
68 } | 68 } |
69 | 69 |
70 static bool _listSupported() native "NetworkInterface_ListSupported"; | 70 static bool _listSupported() native "NetworkInterface_ListSupported"; |
71 } | 71 } |
72 | 72 |
| 73 void _throwOnBadPort(int port) { |
| 74 if ((port == null) || (port < 0) || (port > 0xFFFF)) { |
| 75 throw new ArgumentError("Invalid port $port"); |
| 76 } |
| 77 } |
| 78 |
73 class _InternetAddress implements InternetAddress { | 79 class _InternetAddress implements InternetAddress { |
74 static const int _ADDRESS_LOOPBACK_IP_V4 = 0; | 80 static const int _ADDRESS_LOOPBACK_IP_V4 = 0; |
75 static const int _ADDRESS_LOOPBACK_IP_V6 = 1; | 81 static const int _ADDRESS_LOOPBACK_IP_V6 = 1; |
76 static const int _ADDRESS_ANY_IP_V4 = 2; | 82 static const int _ADDRESS_ANY_IP_V4 = 2; |
77 static const int _ADDRESS_ANY_IP_V6 = 3; | 83 static const int _ADDRESS_ANY_IP_V6 = 3; |
78 static const int _IPV4_ADDR_LENGTH = 4; | 84 static const int _IPV4_ADDR_LENGTH = 4; |
79 static const int _IPV6_ADDR_LENGTH = 16; | 85 static const int _IPV6_ADDR_LENGTH = 16; |
80 | 86 |
81 static _InternetAddress LOOPBACK_IP_V4 = | 87 static _InternetAddress LOOPBACK_IP_V4 = |
82 new _InternetAddress.fixed(_ADDRESS_LOOPBACK_IP_V4); | 88 new _InternetAddress.fixed(_ADDRESS_LOOPBACK_IP_V4); |
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
380 name, () => new _NetworkInterface(name, index)); | 386 name, () => new _NetworkInterface(name, index)); |
381 map[name].addresses.add(address); | 387 map[name].addresses.add(address); |
382 return map; | 388 return map; |
383 }); | 389 }); |
384 return map.values.toList(); | 390 return map.values.toList(); |
385 } | 391 } |
386 }); | 392 }); |
387 } | 393 } |
388 | 394 |
389 static Future<_NativeSocket> connect(host, int port, sourceAddress) { | 395 static Future<_NativeSocket> connect(host, int port, sourceAddress) { |
| 396 _throwOnBadPort(port); |
390 if (sourceAddress != null && sourceAddress is! _InternetAddress) { | 397 if (sourceAddress != null && sourceAddress is! _InternetAddress) { |
391 if (sourceAddress is String) { | 398 if (sourceAddress is String) { |
392 sourceAddress = new InternetAddress(sourceAddress); | 399 sourceAddress = new InternetAddress(sourceAddress); |
393 } | 400 } |
394 } | 401 } |
395 return new Future.value(host) | 402 return new Future.value(host) |
396 .then((host) { | 403 .then((host) { |
397 if (host is _InternetAddress) return [host]; | 404 if (host is _InternetAddress) return [host]; |
398 return lookup(host) | 405 return lookup(host) |
399 .then((addresses) { | 406 .then((addresses) { |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
481 connectNext(); | 488 connectNext(); |
482 return completer.future; | 489 return completer.future; |
483 }); | 490 }); |
484 } | 491 } |
485 | 492 |
486 static Future<_NativeSocket> bind(host, | 493 static Future<_NativeSocket> bind(host, |
487 int port, | 494 int port, |
488 int backlog, | 495 int backlog, |
489 bool v6Only, | 496 bool v6Only, |
490 bool shared) { | 497 bool shared) { |
| 498 _throwOnBadPort(port); |
491 return new Future.value(host) | 499 return new Future.value(host) |
492 .then((host) { | 500 .then((host) { |
493 if (host is _InternetAddress) return host; | 501 if (host is _InternetAddress) return host; |
494 return lookup(host) | 502 return lookup(host) |
495 .then((list) { | 503 .then((list) { |
496 if (list.length == 0) { | 504 if (list.length == 0) { |
497 throw createError(response, "Failed host lookup: '$host'"); | 505 throw createError(response, "Failed host lookup: '$host'"); |
498 } | 506 } |
499 return list[0]; | 507 return list[0]; |
500 }); | 508 }); |
(...skipping 18 matching lines...) Expand all Loading... |
519 return socket; | 527 return socket; |
520 }); | 528 }); |
521 } | 529 } |
522 | 530 |
523 static void setupResourceInfo(_NativeSocket socket) { | 531 static void setupResourceInfo(_NativeSocket socket) { |
524 socket.resourceInfo = new _SocketResourceInfo(socket); | 532 socket.resourceInfo = new _SocketResourceInfo(socket); |
525 } | 533 } |
526 | 534 |
527 static Future<_NativeSocket> bindDatagram( | 535 static Future<_NativeSocket> bindDatagram( |
528 host, int port, bool reuseAddress) { | 536 host, int port, bool reuseAddress) { |
| 537 _throwOnBadPort(port); |
529 return new Future.value(host) | 538 return new Future.value(host) |
530 .then((host) { | 539 .then((host) { |
531 if (host is _InternetAddress) return host; | 540 if (host is _InternetAddress) return host; |
532 return lookup(host) | 541 return lookup(host) |
533 .then((list) { | 542 .then((list) { |
534 if (list.length == 0) { | 543 if (list.length == 0) { |
535 throw createError(response, "Failed host lookup: '$host'"); | 544 throw createError(response, "Failed host lookup: '$host'"); |
536 } | 545 } |
537 return list[0]; | 546 return list[0]; |
538 }); | 547 }); |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
669 // TODO(ricow): Remove when we track internal and pipe uses. | 678 // TODO(ricow): Remove when we track internal and pipe uses. |
670 assert(resourceInfo != null || isPipe || isInternal); | 679 assert(resourceInfo != null || isPipe || isInternal); |
671 if (resourceInfo != null) { | 680 if (resourceInfo != null) { |
672 resourceInfo.addWrite(result); | 681 resourceInfo.addWrite(result); |
673 } | 682 } |
674 return result; | 683 return result; |
675 } | 684 } |
676 | 685 |
677 int send(List<int> buffer, int offset, int bytes, | 686 int send(List<int> buffer, int offset, int bytes, |
678 InternetAddress address, int port) { | 687 InternetAddress address, int port) { |
| 688 _throwOnBadPort(port); |
679 if (isClosing || isClosed) return 0; | 689 if (isClosing || isClosed) return 0; |
680 _BufferAndStart bufferAndStart = | 690 _BufferAndStart bufferAndStart = |
681 _ensureFastAndSerializableByteData( | 691 _ensureFastAndSerializableByteData( |
682 buffer, offset, bytes); | 692 buffer, offset, bytes); |
683 var result = nativeSendTo( | 693 var result = nativeSendTo( |
684 bufferAndStart.buffer, bufferAndStart.start, bytes, | 694 bufferAndStart.buffer, bufferAndStart.start, bytes, |
685 address._in_addr, port); | 695 address._in_addr, port); |
686 if (result is OSError) { | 696 if (result is OSError) { |
687 scheduleMicrotask(() => reportError(result, "Send failed")); | 697 scheduleMicrotask(() => reportError(result, "Send failed")); |
688 result = 0; | 698 result = 0; |
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1109 final _NativeSocket _socket; | 1119 final _NativeSocket _socket; |
1110 StreamController<RawSocket> _controller; | 1120 StreamController<RawSocket> _controller; |
1111 ReceivePort _referencePort; | 1121 ReceivePort _referencePort; |
1112 bool _v6Only; | 1122 bool _v6Only; |
1113 | 1123 |
1114 static Future<_RawServerSocket> bind(address, | 1124 static Future<_RawServerSocket> bind(address, |
1115 int port, | 1125 int port, |
1116 int backlog, | 1126 int backlog, |
1117 bool v6Only, | 1127 bool v6Only, |
1118 bool shared) { | 1128 bool shared) { |
1119 if (port < 0 || port > 0xFFFF) | 1129 _throwOnBadPort(port); |
1120 throw new ArgumentError("Invalid port $port"); | |
1121 if (backlog < 0) throw new ArgumentError("Invalid backlog $backlog"); | 1130 if (backlog < 0) throw new ArgumentError("Invalid backlog $backlog"); |
1122 return _NativeSocket.bind(address, port, backlog, v6Only, shared) | 1131 return _NativeSocket.bind(address, port, backlog, v6Only, shared) |
1123 .then((socket) => new _RawServerSocket(socket, v6Only)); | 1132 .then((socket) => new _RawServerSocket(socket, v6Only)); |
1124 } | 1133 } |
1125 | 1134 |
1126 _RawServerSocket(this._socket, this._v6Only); | 1135 _RawServerSocket(this._socket, this._v6Only); |
1127 | 1136 |
1128 StreamSubscription<RawSocket> listen(void onData(RawSocket event), | 1137 StreamSubscription<RawSocket> listen(void onData(RawSocket event), |
1129 {Function onError, | 1138 {Function onError, |
1130 void onDone(), | 1139 void onDone(), |
(...skipping 624 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1755 }, | 1764 }, |
1756 error: zone.bindUnaryCallback((e) { | 1765 error: zone.bindUnaryCallback((e) { |
1757 _controller.addError(e); | 1766 _controller.addError(e); |
1758 _socket.close(); | 1767 _socket.close(); |
1759 }) | 1768 }) |
1760 ); | 1769 ); |
1761 } | 1770 } |
1762 | 1771 |
1763 static Future<RawDatagramSocket> bind( | 1772 static Future<RawDatagramSocket> bind( |
1764 host, int port, bool reuseAddress) { | 1773 host, int port, bool reuseAddress) { |
1765 if (port < 0 || port > 0xffff) | 1774 _throwOnBadPort(port); |
1766 throw new ArgumentError("Invalid port $port"); | |
1767 return _NativeSocket.bindDatagram(host, port, reuseAddress) | 1775 return _NativeSocket.bindDatagram(host, port, reuseAddress) |
1768 .then((socket) => new _RawDatagramSocket(socket)); | 1776 .then((socket) => new _RawDatagramSocket(socket)); |
1769 } | 1777 } |
1770 | 1778 |
1771 StreamSubscription<RawSocketEvent> listen(void onData(RawSocketEvent event), | 1779 StreamSubscription<RawSocketEvent> listen(void onData(RawSocketEvent event), |
1772 {Function onError, | 1780 {Function onError, |
1773 void onDone(), | 1781 void onDone(), |
1774 bool cancelOnError}) { | 1782 bool cancelOnError}) { |
1775 return _controller.stream.listen( | 1783 return _controller.stream.listen( |
1776 onData, | 1784 onData, |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1864 Datagram _makeDatagram(List<int> data, | 1872 Datagram _makeDatagram(List<int> data, |
1865 String address, | 1873 String address, |
1866 List<int> in_addr, | 1874 List<int> in_addr, |
1867 int port) { | 1875 int port) { |
1868 return new Datagram( | 1876 return new Datagram( |
1869 data, | 1877 data, |
1870 new _InternetAddress(address, null, in_addr), | 1878 new _InternetAddress(address, null, in_addr), |
1871 port); | 1879 port); |
1872 } | 1880 } |
1873 | 1881 |
OLD | NEW |