Chromium Code Reviews| Index: net/quic/quic_stream_factory.cc |
| diff --git a/net/quic/quic_stream_factory.cc b/net/quic/quic_stream_factory.cc |
| index 61af6c27e2248687a9380c61ebbd3f98671ffcad..dda420d67fad547130f6ee6d349ab836cd1eaaf0 100644 |
| --- a/net/quic/quic_stream_factory.cc |
| +++ b/net/quic/quic_stream_factory.cc |
| @@ -59,6 +59,11 @@ |
| #include "base/cpu.h" |
| #endif |
| +#if BUILDFLAG(ENABLE_BIDIRECTIONAL_STREAM) |
| +#include "net/http/bidirectional_stream_job.h" |
| +#include "net/quic/bidirectional_stream_quic_job.h" |
| +#endif |
| + |
| using std::min; |
| using NetworkHandle = net::NetworkChangeNotifier::NetworkHandle; |
| @@ -496,13 +501,12 @@ int QuicStreamFactory::Job::DoConnectComplete(int rv) { |
| } |
| QuicStreamRequest::QuicStreamRequest(QuicStreamFactory* factory) |
| - : factory_(factory) {} |
| + : factory_(factory), for_bidirectional_(false) {} |
| QuicStreamRequest::~QuicStreamRequest() { |
| if (factory_ && !callback_.is_null()) |
| factory_->CancelRequest(this); |
| } |
| - |
| int QuicStreamRequest::Request(const HostPortPair& host_port_pair, |
| PrivacyMode privacy_mode, |
| int cert_verify_flags, |
| @@ -510,11 +514,28 @@ int QuicStreamRequest::Request(const HostPortPair& host_port_pair, |
| base::StringPiece method, |
| const BoundNetLog& net_log, |
| const CompletionCallback& callback) { |
| + return Request(host_port_pair, privacy_mode, cert_verify_flags, origin_host, |
| + method, net_log, callback, false); |
| +} |
| + |
| +int QuicStreamRequest::Request(const HostPortPair& host_port_pair, |
| + PrivacyMode privacy_mode, |
| + int cert_verify_flags, |
| + base::StringPiece origin_host, |
| + base::StringPiece method, |
| + const BoundNetLog& net_log, |
| + const CompletionCallback& callback, |
| + bool for_bidirectional) { |
| DCHECK(!stream_); |
| +#if BUILDFLAG(ENABLE_BIDIRECTIONAL_STREAM) |
| + DCHECK(!bidirectional_stream_job_); |
| +#endif |
| DCHECK(callback_.is_null()); |
| DCHECK(factory_); |
| origin_host_ = origin_host.as_string(); |
| privacy_mode_ = privacy_mode; |
| + for_bidirectional_ = for_bidirectional; |
| + |
| int rv = factory_->Create(host_port_pair, privacy_mode, cert_verify_flags, |
| origin_host, method, net_log, this); |
| if (rv == ERR_IO_PENDING) { |
| @@ -524,14 +545,29 @@ int QuicStreamRequest::Request(const HostPortPair& host_port_pair, |
| } else { |
| factory_ = nullptr; |
| } |
| - if (rv == OK) |
| + if (rv == OK) { |
| +#if BUILDFLAG(ENABLE_BIDIRECTIONAL_STREAM) |
| + DCHECK(stream_ || (for_bidirectional_ && bidirectional_stream_job_)); |
| +#else |
| DCHECK(stream_); |
| +#endif |
| + } |
| return rv; |
| } |
| -void QuicStreamRequest::set_stream(scoped_ptr<QuicHttpStream> stream) { |
| - DCHECK(stream); |
| - stream_ = std::move(stream); |
| +void QuicStreamRequest::InitializeStreamFromSession( |
| + QuicChromiumClientSession* session) { |
| + DCHECK(session); |
| + if (for_bidirectional_) { |
| +#if BUILDFLAG(ENABLE_BIDIRECTIONAL_STREAM) |
| + bidirectional_stream_job_.reset( |
| + new BidirectionalStreamQuicJob(session->GetWeakPtr())); |
| +#else |
| + DCHECK(false); |
| +#endif |
|
Ryan Hamilton
2016/02/27 00:21:14
I find this maze of ifdefs exceptionally hard to r
xunjieli
2016/02/29 15:21:37
Acknowledged.
|
| + } else { |
| + stream_.reset(new QuicHttpStream(session->GetWeakPtr())); |
| + } |
| } |
| void QuicStreamRequest::OnRequestComplete(int rv) { |
| @@ -548,9 +584,20 @@ base::TimeDelta QuicStreamRequest::GetTimeDelayForWaitingJob() const { |
| scoped_ptr<QuicHttpStream> QuicStreamRequest::ReleaseStream() { |
| DCHECK(stream_); |
| + DCHECK(!for_bidirectional_); |
| return std::move(stream_); |
| } |
| +#if BUILDFLAG(ENABLE_BIDIRECTIONAL_STREAM) |
| +scoped_ptr<BidirectionalStreamJob> |
| +QuicStreamRequest::ReleaseBidirectionalStreamJob() { |
| + DCHECK(bidirectional_stream_job_); |
| + DCHECK(for_bidirectional_); |
| + |
| + return std::move(bidirectional_stream_job_); |
| +} |
| +#endif |
| + |
| QuicStreamFactory::QuicStreamFactory( |
| HostResolver* host_resolver, |
| ClientSocketFactory* client_socket_factory, |
| @@ -772,7 +819,7 @@ int QuicStreamFactory::Create(const HostPortPair& host_port_pair, |
| QuicChromiumClientSession* session = it->second; |
| if (!session->CanPool(origin_host.as_string(), privacy_mode)) |
| return ERR_ALTERNATIVE_CERT_NOT_VALID_FOR_ORIGIN; |
| - request->set_stream(CreateFromSession(session)); |
| + request->InitializeStreamFromSession(session); |
| return OK; |
| } |
| } |
| @@ -828,7 +875,7 @@ int QuicStreamFactory::Create(const HostPortPair& host_port_pair, |
| QuicChromiumClientSession* session = it->second; |
| if (!session->CanPool(origin_host.as_string(), privacy_mode)) |
| return ERR_ALTERNATIVE_CERT_NOT_VALID_FOR_ORIGIN; |
| - request->set_stream(CreateFromSession(session)); |
| + request->InitializeStreamFromSession(session); |
| } |
| return rv; |
| } |
| @@ -906,7 +953,7 @@ void QuicStreamFactory::OnJobComplete(Job* job, int rv) { |
| request->OnRequestComplete(ERR_ALTERNATIVE_CERT_NOT_VALID_FOR_ORIGIN); |
| continue; |
| } |
| - request->set_stream(CreateFromSession(session)); |
| + request->InitializeStreamFromSession(session); |
| ++request_it; |
| } |
| } |