| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 /** | 5 /** |
| 6 * SecureSocket provides a secure (SSL or TLS) client connection to a server. | 6 * SecureSocket provides a secure (SSL or TLS) client connection to a server. |
| 7 * The certificate provided by the server is checked | 7 * The certificate provided by the server is checked |
| 8 * using the certificate database provided in setCertificateDatabase. | 8 * using the certificate database provided in setCertificateDatabase. |
| 9 */ | 9 */ |
| 10 abstract class SecureSocket implements Socket { | 10 abstract class SecureSocket implements Socket { |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 71 _socket = socket, | 71 _socket = socket, |
| 72 _certificateName = certificateName, | 72 _certificateName = certificateName, |
| 73 _is_server = is_server, | 73 _is_server = is_server, |
| 74 _secureFilter = new _SecureFilter() { | 74 _secureFilter = new _SecureFilter() { |
| 75 if (_socket == null) { | 75 if (_socket == null) { |
| 76 _socket = new Socket(host, port); | 76 _socket = new Socket(host, port); |
| 77 } | 77 } |
| 78 _socket.onConnect = _secureConnectHandler; | 78 _socket.onConnect = _secureConnectHandler; |
| 79 _socket.onData = _secureDataHandler; | 79 _socket.onData = _secureDataHandler; |
| 80 _socket.onClosed = _secureCloseHandler; | 80 _socket.onClosed = _secureCloseHandler; |
| 81 _socket.onError = _secureErrorHandler; |
| 81 _secureFilter.init(); | 82 _secureFilter.init(); |
| 82 _secureFilter.registerHandshakeCompleteCallback(_secureHandshakeCompleteHand
ler); | 83 _secureFilter.registerHandshakeCompleteCallback(_secureHandshakeCompleteHand
ler); |
| 83 } | 84 } |
| 84 | 85 |
| 85 int get port => _socket.port; | 86 int get port => _socket.port; |
| 86 | 87 |
| 87 String get remoteHost => _socket.remoteHost; | 88 String get remoteHost => _socket.remoteHost; |
| 88 | 89 |
| 89 int get remotePort => _socket.remotePort; | 90 int get remotePort => _socket.remotePort; |
| 90 | 91 |
| 91 void set onClosed(void callback()) { | 92 void set onClosed(void callback()) { |
| 92 if (_inputStream != null) { | 93 if (_inputStream != null && callback != null) { |
| 93 throw new StreamException( | 94 throw new StreamException( |
| 94 "Cannot set close handler when input stream is used"); | 95 "Cannot set close handler when input stream is used"); |
| 95 } | 96 } |
| 96 _onClosed = callback; | 97 _onClosed = callback; |
| 97 } | 98 } |
| 98 | 99 |
| 99 void set _onClosed(void callback()) { | 100 void set _onClosed(void callback()) { |
| 100 _socketCloseHandler = callback; | 101 _socketCloseHandler = callback; |
| 101 } | 102 } |
| 102 | 103 |
| 103 void set onConnect(void callback()) { | 104 void set onConnect(void callback()) { |
| 104 if (_outputStream != null) { | |
| 105 throw new StreamException( | |
| 106 "Cannot set connect handler when output stream is used"); | |
| 107 } | |
| 108 if (_status == CONNECTED || _status == CLOSED) { | 105 if (_status == CONNECTED || _status == CLOSED) { |
| 109 throw new StreamException( | 106 throw new StreamException( |
| 110 "Cannot set connect handler when already connected"); | 107 "Cannot set connect handler when already connected"); |
| 111 } | 108 } |
| 112 _onConnect = callback; | 109 _onConnect = callback; |
| 113 } | 110 } |
| 114 | 111 |
| 115 void set _onConnect(void callback()) { | 112 void set _onConnect(void callback()) { |
| 116 _socketConnectHandler = callback; | 113 _socketConnectHandler = callback; |
| 117 } | 114 } |
| 118 | 115 |
| 119 void set onData(void callback()) { | 116 void set onData(void callback()) { |
| 120 if (_outputStream != null) { | 117 if (_outputStream != null && callback != null) { |
| 121 throw new StreamException( | 118 throw new StreamException( |
| 122 "Cannot set data handler when input stream is used"); | 119 "Cannot set data handler when input stream is used"); |
| 123 } | 120 } |
| 124 _onData = callback; | 121 _onData = callback; |
| 125 } | 122 } |
| 126 | 123 |
| 127 void set _onData(void callback()) { | 124 void set _onData(void callback()) { |
| 128 _socketDataHandler = callback; | 125 _socketDataHandler = callback; |
| 129 } | 126 } |
| 130 | 127 |
| 128 void set onError(void callback(e)) { |
| 129 _socketErrorHandler = callback; |
| 130 } |
| 131 |
| 131 void set onWrite(void callback()) { | 132 void set onWrite(void callback()) { |
| 132 if (_outputStream != null) { | 133 if (_outputStream != null && callback != null) { |
| 133 throw new StreamException( | 134 throw new StreamException( |
| 134 "Cannot set write handler when output stream is used"); | 135 "Cannot set write handler when output stream is used"); |
| 135 } | 136 } |
| 136 _onWrite = callback; | 137 _onWrite = callback; |
| 137 } | 138 } |
| 138 | 139 |
| 139 void set _onWrite(void callback()) { | 140 void set _onWrite(void callback()) { |
| 140 _socketWriteHandler = callback; | 141 _socketWriteHandler = callback; |
| 141 // Reset the one-shot onWrite handler. | 142 // Reset the one-shot onWrite handler. |
| 142 _socket.onWrite = _secureWriteHandler; | 143 _socket.onWrite = _secureWriteHandler; |
| 143 } | 144 } |
| 144 | 145 |
| 145 InputStream get inputStream { | 146 InputStream get inputStream { |
| 146 if (_inputStream == null) { | 147 if (_inputStream == null) { |
| 147 if (_socketDataHandler != null || _socketCloseHandler != null) { | 148 if (_socketDataHandler != null || _socketCloseHandler != null) { |
| 148 throw new StreamException( | 149 throw new StreamException( |
| 149 "Cannot get input stream when socket handlers are used"); | 150 "Cannot get input stream when socket handlers are used"); |
| 150 } | 151 } |
| 151 _inputStream = new _SocketInputStream(this); | 152 _inputStream = new _SocketInputStream(this); |
| 152 } | 153 } |
| 153 return _inputStream; | 154 return _inputStream; |
| 154 } | 155 } |
| 155 | 156 |
| 156 OutputStream get outputStream { | 157 OutputStream get outputStream { |
| 157 if (_outputStream == null) { | 158 if (_outputStream == null) { |
| 158 if (_socketConnectHandler != null || _socketWriteHandler != null) { | 159 if (_socketWriteHandler != null) { |
| 159 throw new StreamException( | 160 throw new StreamException( |
| 160 "Cannot get output stream when socket handlers are used"); | 161 "Cannot get output stream when socket write handler is used"); |
| 161 } | 162 } |
| 162 _outputStream = new _SocketOutputStream(this); | 163 _outputStream = new _SocketOutputStream(this); |
| 163 } | 164 } |
| 164 return _outputStream; | 165 return _outputStream; |
| 165 } | 166 } |
| 166 | 167 |
| 167 int available() { | 168 int available() { |
| 168 throw new UnimplementedError("SecureSocket.available not implemented yet"); | 169 throw new UnimplementedError("SecureSocket.available not implemented yet"); |
| 169 } | 170 } |
| 170 | 171 |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 307 scheduledDataEvent.cancel(); | 308 scheduledDataEvent.cancel(); |
| 308 scheduledDataEvent = null; | 309 scheduledDataEvent = null; |
| 309 } | 310 } |
| 310 if (_socketDataHandler != null) { | 311 if (_socketDataHandler != null) { |
| 311 _socketDataHandler(); | 312 _socketDataHandler(); |
| 312 } | 313 } |
| 313 } | 314 } |
| 314 } | 315 } |
| 315 } | 316 } |
| 316 | 317 |
| 318 void _secureErrorHandler(e) { |
| 319 _reportError(e, 'Error on underlying Socket'); |
| 320 } |
| 321 |
| 322 void _reportError(error, String message) { |
| 323 // TODO(whesse): Call _reportError from all internal functions that throw. |
| 324 var e; |
| 325 if (error is SocketIOException) { |
| 326 e = new SocketIOException('$message (${error.message})', error.osError); |
| 327 } else if (error is OSError) { |
| 328 e = new SocketIOException(message, error); |
| 329 } else { |
| 330 e = new SocketIOException('$message (${error.toString()})', null); |
| 331 } |
| 332 bool reported = false; |
| 333 if (_socketErrorHandler != null) { |
| 334 reported = true; |
| 335 _socketErrorHandler(e); |
| 336 } |
| 337 if (_inputStream != null) { |
| 338 reported = reported || _inputStream._onSocketError(e); |
| 339 } |
| 340 if (_outputStream != null) { |
| 341 reported = reported || _outputStream._onSocketError(e); |
| 342 } |
| 343 |
| 344 if (!reported) throw e; |
| 345 } |
| 346 |
| 317 void _secureCloseHandler() { | 347 void _secureCloseHandler() { |
| 318 _socketClosedRead = true; | 348 _socketClosedRead = true; |
| 319 if (_filterReadEmpty) { | 349 if (_filterReadEmpty) { |
| 320 _closedRead = true; | 350 _closedRead = true; |
| 321 _fireCloseEvent(); | 351 _fireCloseEvent(); |
| 322 if (_socketClosedWrite) { | 352 if (_socketClosedWrite) { |
| 323 _secureFilter.destroy(); | 353 _secureFilter.destroy(); |
| 324 _secureFilter = null; | 354 _secureFilter = null; |
| 325 _status = CLOSED; | 355 _status = CLOSED; |
| 326 } | 356 } |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 487 bool _closedRead = false; // The secure socket has fired an onClosed event. | 517 bool _closedRead = false; // The secure socket has fired an onClosed event. |
| 488 bool _closedWrite = false; // The secure socket has been closed for writing. | 518 bool _closedWrite = false; // The secure socket has been closed for writing. |
| 489 bool _filterReadEmpty = true; // There is no buffered data to read. | 519 bool _filterReadEmpty = true; // There is no buffered data to read. |
| 490 bool _filterWriteEmpty = true; // There is no buffered data to be written. | 520 bool _filterWriteEmpty = true; // There is no buffered data to be written. |
| 491 _SocketInputStream _inputStream; | 521 _SocketInputStream _inputStream; |
| 492 _SocketOutputStream _outputStream; | 522 _SocketOutputStream _outputStream; |
| 493 bool _connectPending = false; | 523 bool _connectPending = false; |
| 494 Function _socketConnectHandler; | 524 Function _socketConnectHandler; |
| 495 Function _socketWriteHandler; | 525 Function _socketWriteHandler; |
| 496 Function _socketDataHandler; | 526 Function _socketDataHandler; |
| 527 Function _socketErrorHandler; |
| 497 Function _socketCloseHandler; | 528 Function _socketCloseHandler; |
| 498 Timer scheduledDataEvent; | 529 Timer scheduledDataEvent; |
| 499 | 530 |
| 500 _SecureFilter _secureFilter; | 531 _SecureFilter _secureFilter; |
| 501 } | 532 } |
| 502 | 533 |
| 503 | 534 |
| 504 class _ExternalBuffer { | 535 class _ExternalBuffer { |
| 505 static final int SIZE = 8 * 1024; | 536 static final int SIZE = 8 * 1024; |
| 506 _ExternalBuffer() : start = 0, length = 0; | 537 _ExternalBuffer() : start = 0, length = 0; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 530 bool is_server, | 561 bool is_server, |
| 531 String certificateName); | 562 String certificateName); |
| 532 void destroy(); | 563 void destroy(); |
| 533 void handshake(); | 564 void handshake(); |
| 534 void init(); | 565 void init(); |
| 535 int processBuffer(int bufferIndex); | 566 int processBuffer(int bufferIndex); |
| 536 void registerHandshakeCompleteCallback(Function handshakeCompleteHandler); | 567 void registerHandshakeCompleteCallback(Function handshakeCompleteHandler); |
| 537 | 568 |
| 538 List<_ExternalBuffer> get buffers; | 569 List<_ExternalBuffer> get buffers; |
| 539 } | 570 } |
| OLD | NEW |