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

Side by Side Diff: sdk/lib/io/secure_socket.dart

Issue 11280162: Add onError to dart:io SecureSocket. Allow onConnect and outputStream to coexist on Socket and Sec… (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Fix typo. Created 8 years 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
« no previous file with comments | « runtime/bin/socket_patch.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « runtime/bin/socket_patch.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698