Index: net/http/http_stream_factory_impl_job.cc |
diff --git a/net/http/http_stream_factory_impl_job.cc b/net/http/http_stream_factory_impl_job.cc |
index c3a6073336d53675c50728799df21ba2aa3f9656..de505fca00d9d710796988d4ba2763ec96f1bfed 100644 |
--- a/net/http/http_stream_factory_impl_job.cc |
+++ b/net/http/http_stream_factory_impl_job.cc |
@@ -25,6 +25,7 @@ |
#include "net/base/net_util.h" |
#include "net/base/port_util.h" |
#include "net/cert/cert_verifier.h" |
+#include "net/http/bidirectional_stream.h" |
#include "net/http/http_basic_stream.h" |
#include "net/http/http_network_session.h" |
#include "net/http/http_proxy_client_socket.h" |
@@ -134,6 +135,7 @@ HttpStreamFactoryImpl::Job::Job(HttpStreamFactoryImpl* stream_factory, |
spdy_session_direct_(false), |
job_status_(STATUS_RUNNING), |
other_job_status_(STATUS_RUNNING), |
+ for_bidirectional_(false), |
ptr_factory_(this) { |
DCHECK(stream_factory); |
DCHECK(session); |
@@ -165,6 +167,8 @@ HttpStreamFactoryImpl::Job::~Job() { |
void HttpStreamFactoryImpl::Job::Start(Request* request) { |
DCHECK(request); |
request_ = request; |
+ // Saves |for_bidirectional_|, since request is nulled when job is orphaned. |
+ for_bidirectional_ = request_->for_bidirectional(); |
StartInternal(); |
} |
@@ -355,8 +359,26 @@ void HttpStreamFactoryImpl::Job::OnWebSocketHandshakeStreamReadyCallback() { |
// |this| may be deleted after this call. |
} |
+void HttpStreamFactoryImpl::Job::OnBidirectionalStreamReadyCallback() { |
+ DCHECK(bidirectional_stream_); |
+ DCHECK(!IsPreconnecting()); |
+ DCHECK(!stream_factory_->for_websockets_); |
+ |
+ MaybeCopyConnectionAttemptsFromSocketOrHandle(); |
+ |
+ if (IsOrphaned()) { |
+ stream_factory_->OnOrphanedJobComplete(this); |
+ } else { |
+ request_->Complete(was_npn_negotiated(), protocol_negotiated(), |
+ using_spdy()); |
+ request_->OnBidirectionalStreamReady(this, server_ssl_config_, proxy_info_, |
+ bidirectional_stream_.release()); |
+ } |
+ // |this| may be deleted after this call. |
+} |
+ |
void HttpStreamFactoryImpl::Job::OnNewSpdySessionReadyCallback() { |
- DCHECK(stream_.get()); |
+ DCHECK(stream_.get() || bidirectional_stream_.get()); |
DCHECK(!IsPreconnecting()); |
DCHECK(using_spdy()); |
// Note: an event loop iteration has passed, so |new_spdy_session_| may be |
@@ -376,8 +398,16 @@ void HttpStreamFactoryImpl::Job::OnNewSpdySessionReadyCallback() { |
} |
stream_factory_->OnOrphanedJobComplete(this); |
} else { |
- request_->OnNewSpdySessionReady( |
- this, stream_.Pass(), spdy_session, spdy_session_direct_); |
+ if (for_bidirectional_) { |
+ request_->OnNewSpdySessionReady(this, nullptr /** spdy_http_stream */, |
Bence
2015/10/01 05:29:28
I think the syntax most often used is
/*spdy_http_
xunjieli
2015/10/01 18:41:16
Done.
|
+ bidirectional_stream_.Pass(), |
+ spdy_session, spdy_session_direct_); |
+ |
+ } else { |
+ request_->OnNewSpdySessionReady(this, stream_.Pass(), |
+ nullptr /** bidirectional_stream */, |
Bence
2015/10/01 05:29:28
/*bidirectional_stream=*/ nullptr
xunjieli
2015/10/01 18:41:16
Done.
|
+ spdy_session, spdy_session_direct_); |
+ } |
} |
// |this| may be deleted after this call. |
} |
@@ -564,6 +594,16 @@ int HttpStreamFactoryImpl::Job::RunLoop(int result) { |
base::ThreadTaskRunnerHandle::Get()->PostTask( |
FROM_HERE, base::Bind(&Job::OnWebSocketHandshakeStreamReadyCallback, |
ptr_factory_.GetWeakPtr())); |
+ } else if (for_bidirectional_) { |
+ if (bidirectional_stream_ == nullptr) { |
+ base::ThreadTaskRunnerHandle::Get()->PostTask( |
+ FROM_HERE, base::Bind(&Job::OnStreamFailedCallback, |
+ ptr_factory_.GetWeakPtr(), ERR_FAILED)); |
+ } else { |
+ base::ThreadTaskRunnerHandle::Get()->PostTask( |
+ FROM_HERE, base::Bind(&Job::OnBidirectionalStreamReadyCallback, |
+ ptr_factory_.GetWeakPtr())); |
+ } |
} else { |
DCHECK(stream_.get()); |
base::ThreadTaskRunnerHandle::Get()->PostTask( |
@@ -1148,6 +1188,10 @@ int HttpStreamFactoryImpl::Job::SetSpdyHttpStream( |
// implemented. |
if (stream_factory_->for_websockets_) |
return ERR_NOT_IMPLEMENTED; |
+ if (for_bidirectional_) { |
+ bidirectional_stream_.reset(new BidirectionalStream(session)); |
+ return OK; |
+ } |
// TODO(willchan): Delete this code, because eventually, the |
// HttpStreamFactoryImpl will be creating all the SpdyHttpStreams, since it |