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

Unified Diff: components/grpc_support/bidirectional_stream.cc

Issue 2273403003: Moving gRPC support interfaces out of cronet and into a new component. (Closed)
Patch Set: Address comments Created 4 years, 2 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 | « components/grpc_support/bidirectional_stream.h ('k') | components/grpc_support/bidirectional_stream_c.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/grpc_support/bidirectional_stream.cc
diff --git a/components/cronet/ios/cronet_bidirectional_stream.cc b/components/grpc_support/bidirectional_stream.cc
similarity index 67%
rename from components/cronet/ios/cronet_bidirectional_stream.cc
rename to components/grpc_support/bidirectional_stream.cc
index 325b611e361a8effa941ec8304b59863d5b19994..c17a4f64dea3965a227534a359c84b805e747f6a 100644
--- a/components/cronet/ios/cronet_bidirectional_stream.cc
+++ b/components/grpc_support/bidirectional_stream.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "components/cronet/ios/cronet_bidirectional_stream.h"
+#include "components/grpc_support/bidirectional_stream.h"
#include <memory>
#include <string>
@@ -13,7 +13,6 @@
#include "base/logging.h"
#include "base/memory/ref_counted.h"
#include "base/strings/string_number_conversions.h"
-#include "components/cronet/ios/cronet_environment.h"
#include "net/base/io_buffer.h"
#include "net/base/net_errors.h"
#include "net/base/request_priority.h"
@@ -28,27 +27,28 @@
#include "net/ssl/ssl_info.h"
#include "net/url_request/http_user_agent_settings.h"
#include "net/url_request/url_request_context.h"
+#include "net/url_request/url_request_context_getter.h"
#include "url/gurl.h"
-namespace cronet {
+namespace grpc_support {
-CronetBidirectionalStream::WriteBuffers::WriteBuffers() {}
+BidirectionalStream::WriteBuffers::WriteBuffers() {}
-CronetBidirectionalStream::WriteBuffers::~WriteBuffers() {}
+BidirectionalStream::WriteBuffers::~WriteBuffers() {}
-void CronetBidirectionalStream::WriteBuffers::Clear() {
+void BidirectionalStream::WriteBuffers::Clear() {
write_buffer_list.clear();
write_buffer_len_list.clear();
}
-void CronetBidirectionalStream::WriteBuffers::AppendBuffer(
+void BidirectionalStream::WriteBuffers::AppendBuffer(
const scoped_refptr<net::IOBuffer>& buffer,
int buffer_size) {
write_buffer_list.push_back(buffer);
write_buffer_len_list.push_back(buffer_size);
}
-void CronetBidirectionalStream::WriteBuffers::MoveTo(WriteBuffers* target) {
+void BidirectionalStream::WriteBuffers::MoveTo(WriteBuffers* target) {
std::move(write_buffer_list.begin(), write_buffer_list.end(),
std::back_inserter(target->write_buffer_list));
std::move(write_buffer_len_list.begin(), write_buffer_len_list.end(),
@@ -56,12 +56,12 @@ void CronetBidirectionalStream::WriteBuffers::MoveTo(WriteBuffers* target) {
Clear();
}
-bool CronetBidirectionalStream::WriteBuffers::Empty() const {
+bool BidirectionalStream::WriteBuffers::Empty() const {
return write_buffer_list.empty();
}
-CronetBidirectionalStream::CronetBidirectionalStream(
- CronetEnvironment* environment,
+BidirectionalStream::BidirectionalStream(
+ net::URLRequestContextGetter* request_context_getter,
Delegate* delegate)
: read_state_(NOT_STARTED),
write_state_(NOT_STARTED),
@@ -69,7 +69,7 @@ CronetBidirectionalStream::CronetBidirectionalStream(
request_headers_sent_(false),
disable_auto_flush_(false),
delay_headers_until_flush_(false),
- environment_(environment),
+ request_context_getter_(request_context_getter),
pending_write_data_(new WriteBuffers()),
flushing_write_data_(new WriteBuffers()),
sending_write_data_(new WriteBuffers()),
@@ -78,15 +78,15 @@ CronetBidirectionalStream::CronetBidirectionalStream(
weak_this_ = weak_factory_.GetWeakPtr();
}
-CronetBidirectionalStream::~CronetBidirectionalStream() {
- DCHECK(environment_->IsOnNetworkThread());
+BidirectionalStream::~BidirectionalStream() {
+ DCHECK(IsOnNetworkThread());
}
-int CronetBidirectionalStream::Start(const char* url,
- int priority,
- const char* method,
- const net::HttpRequestHeaders& headers,
- bool end_of_stream) {
+int BidirectionalStream::Start(const char* url,
+ int priority,
+ const char* method,
+ const net::HttpRequestHeaders& headers,
+ bool end_of_stream) {
// Prepare request info here to be able to return the error.
std::unique_ptr<net::BidirectionalStreamRequestInfo> request_info(
new net::BidirectionalStreamRequestInfo());
@@ -99,64 +99,62 @@ int CronetBidirectionalStream::Start(const char* url,
request_info->extra_headers.CopyFrom(headers);
request_info->end_stream_on_headers = end_of_stream;
write_end_of_stream_ = end_of_stream;
- DCHECK(environment_);
- environment_->PostToNetworkThread(
- FROM_HERE, base::Bind(&CronetBidirectionalStream::StartOnNetworkThread,
- weak_this_, base::Passed(&request_info)));
+ PostToNetworkThread(FROM_HERE,
+ base::Bind(&BidirectionalStream::StartOnNetworkThread,
+ weak_this_, base::Passed(&request_info)));
return 0;
}
-bool CronetBidirectionalStream::ReadData(char* buffer, int capacity) {
+bool BidirectionalStream::ReadData(char* buffer, int capacity) {
if (!buffer)
return false;
scoped_refptr<net::WrappedIOBuffer> read_buffer(
new net::WrappedIOBuffer(buffer));
- environment_->PostToNetworkThread(
- FROM_HERE, base::Bind(&CronetBidirectionalStream::ReadDataOnNetworkThread,
- weak_this_, read_buffer, capacity));
+ PostToNetworkThread(FROM_HERE,
+ base::Bind(&BidirectionalStream::ReadDataOnNetworkThread,
+ weak_this_, read_buffer, capacity));
return true;
}
-bool CronetBidirectionalStream::WriteData(const char* buffer,
- int count,
- bool end_of_stream) {
+bool BidirectionalStream::WriteData(const char* buffer,
+ int count,
+ bool end_of_stream) {
if (!buffer)
return false;
scoped_refptr<net::WrappedIOBuffer> write_buffer(
new net::WrappedIOBuffer(buffer));
- environment_->PostToNetworkThread(
- FROM_HERE,
- base::Bind(&CronetBidirectionalStream::WriteDataOnNetworkThread,
- weak_this_, write_buffer, count, end_of_stream));
+ PostToNetworkThread(
+ FROM_HERE, base::Bind(&BidirectionalStream::WriteDataOnNetworkThread,
+ weak_this_, write_buffer, count, end_of_stream));
return true;
}
-void CronetBidirectionalStream::Flush() {
- environment_->PostToNetworkThread(
+void BidirectionalStream::Flush() {
+ PostToNetworkThread(
FROM_HERE,
- base::Bind(&CronetBidirectionalStream::FlushOnNetworkThread, weak_this_));
+ base::Bind(&BidirectionalStream::FlushOnNetworkThread, weak_this_));
}
-void CronetBidirectionalStream::Cancel() {
- environment_->PostToNetworkThread(
- FROM_HERE, base::Bind(&CronetBidirectionalStream::CancelOnNetworkThread,
- weak_this_));
+void BidirectionalStream::Cancel() {
+ PostToNetworkThread(
+ FROM_HERE,
+ base::Bind(&BidirectionalStream::CancelOnNetworkThread, weak_this_));
}
-void CronetBidirectionalStream::Destroy() {
+void BidirectionalStream::Destroy() {
// Destroy could be called from any thread, including network thread (if
// posting task to executor throws an exception), but is posted, so |this|
// is valid until calling task is complete.
- environment_->PostToNetworkThread(
- FROM_HERE, base::Bind(&CronetBidirectionalStream::DestroyOnNetworkThread,
- base::Unretained(this)));
+ PostToNetworkThread(FROM_HERE,
+ base::Bind(&BidirectionalStream::DestroyOnNetworkThread,
+ base::Unretained(this)));
}
-void CronetBidirectionalStream::OnStreamReady(bool request_headers_sent) {
- DCHECK(environment_->IsOnNetworkThread());
+void BidirectionalStream::OnStreamReady(bool request_headers_sent) {
+ DCHECK(IsOnNetworkThread());
DCHECK_EQ(STARTED, write_state_);
if (!bidi_stream_)
return;
@@ -173,9 +171,9 @@ void CronetBidirectionalStream::OnStreamReady(bool request_headers_sent) {
delegate_->OnStreamReady();
}
-void CronetBidirectionalStream::OnHeadersReceived(
+void BidirectionalStream::OnHeadersReceived(
const net::SpdyHeaderBlock& response_headers) {
- DCHECK(environment_->IsOnNetworkThread());
+ DCHECK(IsOnNetworkThread());
DCHECK_EQ(STARTED, read_state_);
if (!bidi_stream_)
return;
@@ -199,8 +197,8 @@ void CronetBidirectionalStream::OnHeadersReceived(
delegate_->OnHeadersReceived(response_headers, protocol);
}
-void CronetBidirectionalStream::OnDataRead(int bytes_read) {
- DCHECK(environment_->IsOnNetworkThread());
+void BidirectionalStream::OnDataRead(int bytes_read) {
+ DCHECK(IsOnNetworkThread());
DCHECK_EQ(READING, read_state_);
if (!bidi_stream_)
return;
@@ -214,8 +212,8 @@ void CronetBidirectionalStream::OnDataRead(int bytes_read) {
MaybeOnSucceded();
}
-void CronetBidirectionalStream::OnDataSent() {
- DCHECK(environment_->IsOnNetworkThread());
+void BidirectionalStream::OnDataSent() {
+ DCHECK(IsOnNetworkThread());
if (!bidi_stream_)
return;
DCHECK_EQ(WRITING, write_state_);
@@ -236,53 +234,55 @@ void CronetBidirectionalStream::OnDataSent() {
}
}
-void CronetBidirectionalStream::OnTrailersReceived(
+void BidirectionalStream::OnTrailersReceived(
const net::SpdyHeaderBlock& response_trailers) {
- DCHECK(environment_->IsOnNetworkThread());
+ DCHECK(IsOnNetworkThread());
if (!bidi_stream_)
return;
delegate_->OnTrailersReceived(response_trailers);
}
-void CronetBidirectionalStream::OnFailed(int error) {
- DCHECK(environment_->IsOnNetworkThread());
+void BidirectionalStream::OnFailed(int error) {
+ DCHECK(IsOnNetworkThread());
if (!bidi_stream_ && read_state_ != NOT_STARTED)
return;
- read_state_ = write_state_ = ERROR;
+ read_state_ = write_state_ = ERR;
weak_factory_.InvalidateWeakPtrs();
// Delete underlying |bidi_stream_| asynchronously as it may still be used.
- environment_->PostToNetworkThread(
- FROM_HERE, base::Bind(&base::DeletePointer<net::BidirectionalStream>,
- bidi_stream_.release()));
+ PostToNetworkThread(FROM_HERE,
+ base::Bind(&base::DeletePointer<net::BidirectionalStream>,
+ bidi_stream_.release()));
delegate_->OnFailed(error);
}
-void CronetBidirectionalStream::StartOnNetworkThread(
+void BidirectionalStream::StartOnNetworkThread(
std::unique_ptr<net::BidirectionalStreamRequestInfo> request_info) {
- DCHECK(environment_->IsOnNetworkThread());
+ DCHECK(IsOnNetworkThread());
DCHECK(!bidi_stream_);
- DCHECK(environment_->GetURLRequestContext());
+ DCHECK(request_context_getter_->GetURLRequestContext());
+ net::URLRequestContext* request_context =
+ request_context_getter_->GetURLRequestContext();
request_info->extra_headers.SetHeaderIfMissing(
- net::HttpRequestHeaders::kUserAgent, environment_->user_agent());
+ net::HttpRequestHeaders::kUserAgent,
+ request_context->http_user_agent_settings()->GetUserAgent());
bidi_stream_.reset(new net::BidirectionalStream(
- std::move(request_info), environment_->GetURLRequestContext()
- ->http_transaction_factory()
- ->GetSession(),
+ std::move(request_info),
+ request_context->http_transaction_factory()->GetSession(),
!delay_headers_until_flush_, this));
DCHECK(read_state_ == NOT_STARTED && write_state_ == NOT_STARTED);
read_state_ = write_state_ = STARTED;
}
-void CronetBidirectionalStream::ReadDataOnNetworkThread(
+void BidirectionalStream::ReadDataOnNetworkThread(
scoped_refptr<net::WrappedIOBuffer> read_buffer,
int buffer_size) {
- DCHECK(environment_->IsOnNetworkThread());
+ DCHECK(IsOnNetworkThread());
DCHECK(read_buffer);
DCHECK(!read_buffer_);
if (read_state_ != WAITING_FOR_READ) {
DLOG(ERROR) << "Unexpected Read Data in read_state " << read_state_;
// Invoke OnFailed unless it is already invoked.
- if (read_state_ != ERROR)
+ if (read_state_ != ERR)
OnFailed(net::ERR_UNEXPECTED);
return;
}
@@ -301,17 +301,17 @@ void CronetBidirectionalStream::ReadDataOnNetworkThread(
OnDataRead(bytes_read);
}
-void CronetBidirectionalStream::WriteDataOnNetworkThread(
+void BidirectionalStream::WriteDataOnNetworkThread(
scoped_refptr<net::WrappedIOBuffer> write_buffer,
int buffer_size,
bool end_of_stream) {
- DCHECK(environment_->IsOnNetworkThread());
+ DCHECK(IsOnNetworkThread());
DCHECK(write_buffer);
DCHECK(!write_end_of_stream_);
if (!bidi_stream_ || write_end_of_stream_) {
DLOG(ERROR) << "Unexpected Flush Data in write_state " << write_state_;
// Invoke OnFailed unless it is already invoked.
- if (write_state_ != ERROR)
+ if (write_state_ != ERR)
OnFailed(net::ERR_UNEXPECTED);
return;
}
@@ -321,8 +321,8 @@ void CronetBidirectionalStream::WriteDataOnNetworkThread(
FlushOnNetworkThread();
}
-void CronetBidirectionalStream::FlushOnNetworkThread() {
- DCHECK(environment_->IsOnNetworkThread());
+void BidirectionalStream::FlushOnNetworkThread() {
+ DCHECK(IsOnNetworkThread());
if (!bidi_stream_)
return;
// If there is no data to flush, may need to send headers.
@@ -344,7 +344,7 @@ void CronetBidirectionalStream::FlushOnNetworkThread() {
SendFlushingWriteData();
}
-void CronetBidirectionalStream::SendFlushingWriteData() {
+void BidirectionalStream::SendFlushingWriteData() {
DCHECK(bidi_stream_);
// If previous send is not done, or there is nothing to flush, then exit.
if (write_state_ == WRITING || flushing_write_data_->Empty())
@@ -357,8 +357,8 @@ void CronetBidirectionalStream::SendFlushingWriteData() {
write_end_of_stream_ && pending_write_data_->Empty());
}
-void CronetBidirectionalStream::CancelOnNetworkThread() {
- DCHECK(environment_->IsOnNetworkThread());
+void BidirectionalStream::CancelOnNetworkThread() {
+ DCHECK(IsOnNetworkThread());
if (!bidi_stream_)
return;
read_state_ = write_state_ = CANCELED;
@@ -367,24 +367,35 @@ void CronetBidirectionalStream::CancelOnNetworkThread() {
delegate_->OnCanceled();
}
-void CronetBidirectionalStream::DestroyOnNetworkThread() {
- DCHECK(environment_->IsOnNetworkThread());
+void BidirectionalStream::DestroyOnNetworkThread() {
+ DCHECK(IsOnNetworkThread());
delete this;
}
-void CronetBidirectionalStream::MaybeOnSucceded() {
- DCHECK(environment_->IsOnNetworkThread());
+void BidirectionalStream::MaybeOnSucceded() {
+ DCHECK(IsOnNetworkThread());
if (!bidi_stream_)
return;
if (read_state_ == READING_DONE && write_state_ == WRITING_DONE) {
read_state_ = write_state_ = SUCCESS;
weak_factory_.InvalidateWeakPtrs();
// Delete underlying |bidi_stream_| asynchronously as it may still be used.
- environment_->PostToNetworkThread(
+ PostToNetworkThread(
FROM_HERE, base::Bind(&base::DeletePointer<net::BidirectionalStream>,
bidi_stream_.release()));
delegate_->OnSucceeded();
}
}
+bool BidirectionalStream::IsOnNetworkThread() {
+ return request_context_getter_->GetNetworkTaskRunner()
+ ->BelongsToCurrentThread();
+}
+
+void BidirectionalStream::PostToNetworkThread(
+ const tracked_objects::Location& from_here,
+ const base::Closure& task) {
+ request_context_getter_->GetNetworkTaskRunner()->PostTask(from_here, task);
+}
+
} // namespace cronet
« no previous file with comments | « components/grpc_support/bidirectional_stream.h ('k') | components/grpc_support/bidirectional_stream_c.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698