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 part of dart.io; | 5 part of dart.io; |
6 | 6 |
7 /** | 7 /** |
8 * A high-level class for communicating securely over a TCP socket, using | 8 * A high-level class for communicating securely over a TCP socket, using |
9 * TLS and SSL. The [SecureSocket] exposes both a [Stream] and an | 9 * TLS and SSL. The [SecureSocket] exposes both a [Stream] and an |
10 * [IOSink] interface, making it ideal for using together with | 10 * [IOSink] interface, making it ideal for using together with |
(...skipping 824 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
835 // TODO(ajohnsen): Do something here? | 835 // TODO(ajohnsen): Do something here? |
836 } | 836 } |
837 } | 837 } |
838 | 838 |
839 void _scheduleFilter() { | 839 void _scheduleFilter() { |
840 _filterPending = true; | 840 _filterPending = true; |
841 _tryFilter(); | 841 _tryFilter(); |
842 } | 842 } |
843 | 843 |
844 void _tryFilter() { | 844 void _tryFilter() { |
845 if (_status == CLOSED) return; | 845 if (_status == CLOSED) { |
| 846 return; |
| 847 } |
846 if (_filterPending && !_filterActive) { | 848 if (_filterPending && !_filterActive) { |
847 _filterActive = true; | 849 _filterActive = true; |
848 _filterPending = false; | 850 _filterPending = false; |
849 _pushAllFilterStages().then((status) { | 851 _pushAllFilterStages().then((status) { |
850 _filterStatus = status; | 852 _filterStatus = status; |
851 _filterActive = false; | 853 _filterActive = false; |
852 if (_status == CLOSED) { | 854 if (_status == CLOSED) { |
853 _secureFilter.destroy(); | 855 _secureFilter.destroy(); |
854 _secureFilter = null; | 856 _secureFilter = null; |
855 return; | 857 return; |
856 } | 858 } |
857 _socket.readEventsEnabled = true; | 859 _socket.readEventsEnabled = true; |
858 if (_filterStatus.writeEmpty && _closedWrite && !_socketClosedWrite) { | 860 if (_filterStatus.writeEmpty && _closedWrite && !_socketClosedWrite) { |
859 // Checks for and handles all cases of partially closed sockets. | 861 // Checks for and handles all cases of partially closed sockets. |
860 shutdown(SocketDirection.SEND); | 862 shutdown(SocketDirection.SEND); |
861 if (_status == CLOSED) return; | 863 if (_status == CLOSED) { |
| 864 return; |
| 865 } |
862 } | 866 } |
863 if (_filterStatus.readEmpty && _socketClosedRead && !_closedRead) { | 867 if (_filterStatus.readEmpty && _socketClosedRead && !_closedRead) { |
864 if (_status == HANDSHAKE) { | 868 if (_status == HANDSHAKE) { |
865 _secureFilter.handshake(); | 869 _secureFilter.handshake(); |
866 if (_status == HANDSHAKE) { | 870 if (_status == HANDSHAKE) { |
867 throw new HandshakeException( | 871 throw new HandshakeException( |
868 'Connection terminated during handshake'); | 872 'Connection terminated during handshake'); |
869 } | 873 } |
870 } | 874 } |
871 _closeHandler(); | 875 _closeHandler(); |
872 } | 876 } |
873 if (_status == CLOSED) return; | 877 if (_status == CLOSED) { |
| 878 return; |
| 879 } |
874 if (_filterStatus.progress) { | 880 if (_filterStatus.progress) { |
875 _filterPending = true; | 881 _filterPending = true; |
876 if (_filterStatus.writePlaintextNoLongerFull) _sendWriteEvent(); | 882 if (_filterStatus.writeEncryptedNoLongerEmpty) { |
877 if (_filterStatus.readEncryptedNoLongerFull) _readSocket(); | 883 _writeSocket(); |
878 if (_filterStatus.writeEncryptedNoLongerEmpty) _writeSocket(); | 884 } |
879 if (_filterStatus.readPlaintextNoLongerEmpty) _scheduleReadEvent(); | 885 if (_filterStatus.writePlaintextNoLongerFull) { |
880 if (_status == HANDSHAKE) _secureHandshake(); | 886 _sendWriteEvent(); |
| 887 } |
| 888 if (_filterStatus.readEncryptedNoLongerFull) { |
| 889 _readSocket(); |
| 890 } |
| 891 if (_filterStatus.readPlaintextNoLongerEmpty) { |
| 892 _scheduleReadEvent(); |
| 893 } |
| 894 if (_status == HANDSHAKE) { |
| 895 _secureHandshake(); |
| 896 } |
881 } | 897 } |
882 _tryFilter(); | 898 _tryFilter(); |
883 }).catchError(_reportError); | 899 }).catchError(_reportError); |
884 } | 900 } |
885 } | 901 } |
886 | 902 |
887 List<int> _readSocketOrBufferedData(int bytes) { | 903 List<int> _readSocketOrBufferedData(int bytes) { |
888 if (_bufferedData != null) { | 904 if (_bufferedData != null) { |
889 if (bytes > _bufferedData.length - _bufferedDataIndex) { | 905 if (bytes > _bufferedData.length - _bufferedDataIndex) { |
890 bytes = _bufferedData.length - _bufferedDataIndex; | 906 bytes = _bufferedData.length - _bufferedDataIndex; |
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1234 /** | 1250 /** |
1235 * An exception that happens in the handshake phase of establishing | 1251 * An exception that happens in the handshake phase of establishing |
1236 * a secure network connection, when looking up or verifying a | 1252 * a secure network connection, when looking up or verifying a |
1237 * certificate. | 1253 * certificate. |
1238 */ | 1254 */ |
1239 class CertificateException extends TlsException { | 1255 class CertificateException extends TlsException { |
1240 const CertificateException([String message = "", | 1256 const CertificateException([String message = "", |
1241 OSError osError = null]) | 1257 OSError osError = null]) |
1242 : super._("CertificateException", message, osError); | 1258 : super._("CertificateException", message, osError); |
1243 } | 1259 } |
OLD | NEW |