Commit d714188a authored by Helen Li's avatar Helen Li Committed by Commit Bot

Add ReadIfReady to SpdyProxyClientSocket

This is to support mojo sockets. With mojo sockets, we always try to read from
mojo data pipes (without caller explictly telling us to read), and we need a way
to cancel pending reads without having buffered data in socket subclasses.

Bug: 875855
Change-Id: I6570c5320c1ae84b6ef1eddd9ed8ba71e1c8a46c
Reviewed-on: https://chromium-review.googlesource.com/1185209Reviewed-by: default avatarBence Béky <bnc@chromium.org>
Reviewed-by: default avatarMatt Menke <mmenke@chromium.org>
Commit-Queue: Helen Li <xunjieli@chromium.org>
Cr-Commit-Position: refs/heads/master@{#585256}
parent 7a660378
...@@ -190,8 +190,19 @@ void SpdyProxyClientSocket::ApplySocketTag(const SocketTag& tag) { ...@@ -190,8 +190,19 @@ void SpdyProxyClientSocket::ApplySocketTag(const SocketTag& tag) {
int SpdyProxyClientSocket::Read(IOBuffer* buf, int SpdyProxyClientSocket::Read(IOBuffer* buf,
int buf_len, int buf_len,
CompletionOnceCallback callback) { CompletionOnceCallback callback) {
DCHECK(read_callback_.is_null()); int rv = ReadIfReady(buf, buf_len, std::move(callback));
DCHECK(!user_buffer_.get()); if (rv == ERR_IO_PENDING) {
user_buffer_ = buf;
user_buffer_len_ = static_cast<size_t>(buf_len);
}
return rv;
}
int SpdyProxyClientSocket::ReadIfReady(IOBuffer* buf,
int buf_len,
CompletionOnceCallback callback) {
DCHECK(!read_callback_);
DCHECK(!user_buffer_);
if (next_state_ == STATE_DISCONNECTED) if (next_state_ == STATE_DISCONNECTED)
return ERR_SOCKET_NOT_CONNECTED; return ERR_SOCKET_NOT_CONNECTED;
...@@ -204,16 +215,19 @@ int SpdyProxyClientSocket::Read(IOBuffer* buf, ...@@ -204,16 +215,19 @@ int SpdyProxyClientSocket::Read(IOBuffer* buf,
DCHECK(buf); DCHECK(buf);
size_t result = PopulateUserReadBuffer(buf->data(), buf_len); size_t result = PopulateUserReadBuffer(buf->data(), buf_len);
if (result == 0) { if (result == 0) {
user_buffer_ = buf;
user_buffer_len_ = static_cast<size_t>(buf_len);
DCHECK(!callback.is_null());
read_callback_ = std::move(callback); read_callback_ = std::move(callback);
return ERR_IO_PENDING; return ERR_IO_PENDING;
} }
user_buffer_ = NULL;
return result; return result;
} }
int SpdyProxyClientSocket::CancelReadIfReady() {
// Only a pending ReadIfReady() can be canceled.
DCHECK(!user_buffer_) << "Pending Read() cannot be canceled";
read_callback_.Reset();
return OK;
}
size_t SpdyProxyClientSocket::PopulateUserReadBuffer(char* data, size_t len) { size_t SpdyProxyClientSocket::PopulateUserReadBuffer(char* data, size_t len) {
return read_buffer_queue_.Dequeue(data, len); return read_buffer_queue_.Dequeue(data, len);
} }
...@@ -453,11 +467,17 @@ void SpdyProxyClientSocket::OnDataReceived(std::unique_ptr<SpdyBuffer> buffer) { ...@@ -453,11 +467,17 @@ void SpdyProxyClientSocket::OnDataReceived(std::unique_ptr<SpdyBuffer> buffer) {
NULL); NULL);
} }
if (!read_callback_.is_null()) { if (read_callback_) {
int rv = PopulateUserReadBuffer(user_buffer_->data(), user_buffer_len_); if (user_buffer_) {
user_buffer_ = NULL; int rv = PopulateUserReadBuffer(user_buffer_->data(), user_buffer_len_);
user_buffer_len_ = 0; user_buffer_ = nullptr;
std::move(read_callback_).Run(rv); user_buffer_len_ = 0;
std::move(read_callback_).Run(rv);
} else {
// If ReadIfReady() is used instead of Read(), tell the caller that data
// is available for reading.
std::move(read_callback_).Run(OK);
}
} }
} }
......
...@@ -84,6 +84,10 @@ class NET_EXPORT_PRIVATE SpdyProxyClientSocket : public ProxyClientSocket, ...@@ -84,6 +84,10 @@ class NET_EXPORT_PRIVATE SpdyProxyClientSocket : public ProxyClientSocket,
int Read(IOBuffer* buf, int Read(IOBuffer* buf,
int buf_len, int buf_len,
CompletionOnceCallback callback) override; CompletionOnceCallback callback) override;
int ReadIfReady(IOBuffer* buf,
int buf_len,
CompletionOnceCallback callback) override;
int CancelReadIfReady() override;
int Write(IOBuffer* buf, int Write(IOBuffer* buf,
int buf_len, int buf_len,
CompletionOnceCallback callback, CompletionOnceCallback callback,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment