Index: net/socket/ssl_client_socket_impl.cc |
diff --git a/net/socket/ssl_client_socket_impl.cc b/net/socket/ssl_client_socket_impl.cc |
index c993fa8fb23da2d1d58c35731b3801a19283ff11..4e6924446494db2503173078443a1ac0a859f3ea 100644 |
--- a/net/socket/ssl_client_socket_impl.cc |
+++ b/net/socket/ssl_client_socket_impl.cc |
@@ -877,6 +877,16 @@ int SSLClientSocketImpl::Read(IOBuffer* buf, |
return rv; |
} |
+int SSLClientSocketImpl::ReadIfReady(IOBuffer* buf, |
+ int buf_len, |
+ const CompletionCallback& callback) { |
+ // Reuse Read() but do not hold on to |buf| and |buf_len|. |
+ int rv = Read(buf, buf_len, callback); |
+ user_read_buf_ = nullptr; |
+ user_read_buf_len_ = 0; |
davidben
2017/02/01 22:25:57
Hrm. Rather than let Read() set up some state and
xunjieli
2017/02/03 16:35:33
Done.
|
+ return rv; |
+} |
+ |
int SSLClientSocketImpl::Write(IOBuffer* buf, |
int buf_len, |
const CompletionCallback& callback) { |
@@ -905,15 +915,24 @@ int SSLClientSocketImpl::SetSendBufferSize(int32_t size) { |
return transport_->socket()->SetSendBufferSize(size); |
} |
-void SSLClientSocketImpl::OnReadReady() { |
+void SSLClientSocketImpl::OnReadReady(int rv) { |
+ // If ReadIfReady() is called instead of Read(). |
davidben
2017/02/01 22:25:57
This logic might be better in RetryAllOperations()
xunjieli
2017/02/03 16:35:33
Done. Ah, there's a third case! Should have done a
|
+ if (!user_read_callback_.is_null() && user_read_buf_ == nullptr) { |
+ base::ResetAndReturn(&user_read_callback_).Run(rv); |
+ return; |
davidben
2017/02/01 22:25:57
This return means we won't wake up other operation
xunjieli
2017/02/03 16:35:33
Acknowledged.
|
+ } |
// During a renegotiation, either Read or Write calls may be blocked on a |
// transport read. |
RetryAllOperations(); |
} |
-void SSLClientSocketImpl::OnWriteReady() { |
+void SSLClientSocketImpl::OnWriteReady(int rv) { |
// During a renegotiation, either Read or Write calls may be blocked on a |
// transport read. |
+ if (!user_read_callback_.is_null() && user_read_buf_ == nullptr) { |
+ base::ResetAndReturn(&user_read_callback_).Run(rv); |
+ return; |
+ } |
RetryAllOperations(); |
} |