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

Unified Diff: net/base/ssl_client_socket_win.cc

Issue 87073: Extend the use of IOBuffers to the code underneath... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 8 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/base/ssl_client_socket_win.h ('k') | net/base/tcp_client_socket_libevent.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/base/ssl_client_socket_win.cc
===================================================================
--- net/base/ssl_client_socket_win.cc (revision 14682)
+++ net/base/ssl_client_socket_win.cc (working copy)
@@ -212,7 +212,6 @@
hostname_(hostname),
ssl_config_(ssl_config),
user_callback_(NULL),
- user_buf_(NULL),
user_buf_len_(0),
next_state_(STATE_NONE),
creds_(NULL),
@@ -363,7 +362,7 @@
return completed_handshake_ && transport_->IsConnectedAndIdle();
}
-int SSLClientSocketWin::Read(char* buf, int buf_len,
+int SSLClientSocketWin::Read(IOBuffer* buf, int buf_len,
CompletionCallback* callback) {
DCHECK(completed_handshake_);
DCHECK(next_state_ == STATE_NONE);
@@ -373,7 +372,7 @@
// reading more ciphertext from the transport socket.
if (bytes_decrypted_ != 0) {
int len = std::min(buf_len, bytes_decrypted_);
- memcpy(buf, decrypted_ptr_, len);
+ memcpy(buf->data(), decrypted_ptr_, len);
decrypted_ptr_ += len;
bytes_decrypted_ -= len;
if (bytes_decrypted_ == 0) {
@@ -386,29 +385,37 @@
return len;
}
+ DCHECK(!user_buf_);
user_buf_ = buf;
user_buf_len_ = buf_len;
SetNextStateForRead();
int rv = DoLoop(OK);
- if (rv == ERR_IO_PENDING)
+ if (rv == ERR_IO_PENDING) {
user_callback_ = callback;
+ } else {
+ user_buf_ = NULL;
+ }
return rv;
}
-int SSLClientSocketWin::Write(const char* buf, int buf_len,
+int SSLClientSocketWin::Write(IOBuffer* buf, int buf_len,
CompletionCallback* callback) {
DCHECK(completed_handshake_);
DCHECK(next_state_ == STATE_NONE);
DCHECK(!user_callback_);
- user_buf_ = const_cast<char*>(buf);
+ DCHECK(!user_buf_);
+ user_buf_ = buf;
user_buf_len_ = buf_len;
next_state_ = STATE_PAYLOAD_ENCRYPT;
int rv = DoLoop(OK);
- if (rv == ERR_IO_PENDING)
+ if (rv == ERR_IO_PENDING) {
user_callback_ = callback;
+ } else {
+ user_buf_ = NULL;
+ }
return rv;
}
@@ -419,6 +426,7 @@
// since Run may result in Read being called, clear user_callback_ up front.
CompletionCallback* c = user_callback_;
user_callback_ = NULL;
+ user_buf_ = NULL;
c->Run(rv);
}
@@ -483,7 +491,6 @@
if (!recv_buffer_.get())
recv_buffer_.reset(new char[kRecvBufferSize]);
- char* buf = recv_buffer_.get() + bytes_received_;
int buf_len = kRecvBufferSize - bytes_received_;
if (buf_len <= 0) {
@@ -491,12 +498,23 @@
return ERR_UNEXPECTED;
}
- return transport_->Read(buf, buf_len, &io_callback_);
+ DCHECK(!transport_buf_);
+ transport_buf_ = new IOBuffer(buf_len);
+
+ return transport_->Read(transport_buf_, buf_len, &io_callback_);
}
int SSLClientSocketWin::DoHandshakeReadComplete(int result) {
- if (result < 0)
+ DCHECK(transport_buf_);
+ if (result < 0) {
+ transport_buf_ = NULL;
return result;
+ }
+ DCHECK_LE(result, kRecvBufferSize - bytes_received_);
+ char* buf = recv_buffer_.get() + bytes_received_;
+ memcpy(buf, transport_buf_->data(), result);
+ transport_buf_ = NULL;
+
if (result == 0 && !ignore_ok_result_)
return ERR_SSL_PROTOCOL_ERROR; // Incomplete response :(
@@ -624,14 +642,19 @@
// We should have something to send.
DCHECK(send_buffer_.pvBuffer);
DCHECK(send_buffer_.cbBuffer > 0);
+ DCHECK(!transport_buf_);
const char* buf = static_cast<char*>(send_buffer_.pvBuffer) + bytes_sent_;
int buf_len = send_buffer_.cbBuffer - bytes_sent_;
+ transport_buf_ = new IOBuffer(buf_len);
+ memcpy(transport_buf_->data(), buf, buf_len);
- return transport_->Write(buf, buf_len, &io_callback_);
+ return transport_->Write(transport_buf_, buf_len, &io_callback_);
}
int SSLClientSocketWin::DoHandshakeWriteComplete(int result) {
+ DCHECK(transport_buf_);
+ transport_buf_ = NULL;
if (result < 0)
return result;
@@ -703,7 +726,6 @@
DCHECK(recv_buffer_.get());
- char* buf = recv_buffer_.get() + bytes_received_;
int buf_len = kRecvBufferSize - bytes_received_;
if (buf_len <= 0) {
@@ -711,12 +733,28 @@
return ERR_FAILED;
}
- return transport_->Read(buf, buf_len, &io_callback_);
+ DCHECK(!transport_buf_);
+ transport_buf_ = new IOBuffer(buf_len);
+
+ return transport_->Read(transport_buf_, buf_len, &io_callback_);
}
int SSLClientSocketWin::DoPayloadReadComplete(int result) {
- if (result < 0)
+ if (result < 0) {
+ transport_buf_ = NULL;
return result;
+ }
+ if (transport_buf_) {
+ // This method is called after a state transition following DoPayloadRead(),
+ // or if SetNextStateForRead() was called. We have a transport_buf_ only
+ // in the first case, and we have to transfer the data from transport_buf_
+ // to recv_buffer_.
+ DCHECK_LE(result, kRecvBufferSize - bytes_received_);
+ char* buf = recv_buffer_.get() + bytes_received_;
+ memcpy(buf, transport_buf_->data(), result);
+ transport_buf_ = NULL;
+ }
+
if (result == 0 && !ignore_ok_result_) {
// TODO(wtc): Unless we have received the close_notify alert, we need to
// return an error code indicating that the SSL connection ended
@@ -785,7 +823,7 @@
int len = 0;
if (bytes_decrypted_ != 0) {
len = std::min(user_buf_len_, bytes_decrypted_);
- memcpy(user_buf_, decrypted_ptr_, len);
+ memcpy(user_buf_->data(), decrypted_ptr_, len);
decrypted_ptr_ += len;
bytes_decrypted_ -= len;
}
@@ -845,7 +883,7 @@
payload_send_buffer_.reset(new char[alloc_len]);
memcpy(&payload_send_buffer_[stream_sizes_.cbHeader],
- user_buf_, message_len);
+ user_buf_->data(), message_len);
SecBuffer buffers[4];
buffers[0].pvBuffer = payload_send_buffer_.get();
@@ -888,14 +926,19 @@
// We should have something to send.
DCHECK(payload_send_buffer_.get());
DCHECK(payload_send_buffer_len_ > 0);
+ DCHECK(!transport_buf_);
const char* buf = payload_send_buffer_.get() + bytes_sent_;
int buf_len = payload_send_buffer_len_ - bytes_sent_;
+ transport_buf_ = new IOBuffer(buf_len);
+ memcpy(transport_buf_->data(), buf, buf_len);
- return transport_->Write(buf, buf_len, &io_callback_);
+ return transport_->Write(transport_buf_, buf_len, &io_callback_);
}
int SSLClientSocketWin::DoPayloadWriteComplete(int result) {
+ DCHECK(transport_buf_);
+ transport_buf_ = NULL;
if (result < 0)
return result;
« no previous file with comments | « net/base/ssl_client_socket_win.h ('k') | net/base/tcp_client_socket_libevent.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698