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

Unified Diff: net/http/http_stream_factory_impl_job.cc

Issue 14813024: Introduce RequestWebSocketStream into HttpStreamFactory (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rename delegate functions. Created 7 years, 7 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
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 d9e7f24501c343475d710f6f46e36c65404c3c77..bc36846f60fa7a5fd912598af71b4ff93aa7237c 100644
--- a/net/http/http_stream_factory_impl_job.cc
+++ b/net/http/http_stream_factory_impl_job.cc
@@ -4,6 +4,8 @@
#include "net/http/http_stream_factory_impl_job.h"
+#include <string>
+
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/logging.h"
@@ -276,6 +278,7 @@ bool HttpStreamFactoryImpl::Job::CanUseExistingSpdySession() const {
}
void HttpStreamFactoryImpl::Job::OnStreamReadyCallback() {
+ DCHECK(!request_->for_websocket());
DCHECK(stream_.get());
DCHECK(!IsPreconnecting());
if (IsOrphaned()) {
@@ -291,20 +294,59 @@ void HttpStreamFactoryImpl::Job::OnStreamReadyCallback() {
// |this| may be deleted after this call.
}
-void HttpStreamFactoryImpl::Job::OnSpdySessionReadyCallback() {
+void HttpStreamFactoryImpl::Job::OnSocketReadyForWebSocketCallback() {
+ DCHECK(request_->for_websocket());
+ DCHECK(connection_.get() && connection_->is_initialized());
+ DCHECK(!IsPreconnecting());
mmenke 2013/05/23 20:26:20 Looks like when we're preconnected, request_ is NU
yhirano 2013/05/24 14:11:16 Done.
+ if (IsOrphaned()) {
+ stream_factory_->OnOrphanedJobComplete(this);
+ } else {
+ request_->Complete(was_npn_negotiated(),
+ protocol_negotiated(),
+ using_spdy(),
+ net_log_);
+ request_->OnSocketReadyForWebSocket(this, server_ssl_config_, proxy_info_,
+ connection_.release());
+ }
+ // |this| may be deleted after this call.
+}
+
+void HttpStreamFactoryImpl::Job::OnSpdySessionReadyForWebSocketCallback() {
+ DCHECK(request_->for_websocket());
+ DCHECK(spdy_session_to_pass_);
+ DCHECK(!IsPreconnecting());
+ scoped_refptr<SpdySession> session = spdy_session_to_pass_;
+ spdy_session_to_pass_ = NULL;
+ if (IsOrphaned()) {
+ stream_factory_->OnOrphanedJobComplete(this);
mmenke 2013/05/23 20:26:20 This is what was confusing me before - we don't ca
yhirano 2013/05/24 14:11:16 In PS 13 (or newer), OnNewSpdySessionReady is call
+ } else {
+ request_->Complete(was_npn_negotiated(),
+ protocol_negotiated(),
+ using_spdy(),
+ net_log_);
+ request_->OnSpdySessionReadyForWebSocket(this,
+ server_ssl_config_,
+ proxy_info_,
+ session);
+ }
+ // |this| may be deleted after this call.
+}
+
+void HttpStreamFactoryImpl::Job::OnNewSpdySessionReadyCallback() {
DCHECK(!stream_.get());
DCHECK(!IsPreconnecting());
+ DCHECK(!request_->for_websocket());
DCHECK(using_spdy());
DCHECK(new_spdy_session_);
scoped_refptr<SpdySession> spdy_session = new_spdy_session_;
new_spdy_session_ = NULL;
if (IsOrphaned()) {
- stream_factory_->OnSpdySessionReady(
+ stream_factory_->OnNewSpdySessionReady(
spdy_session, spdy_session_direct_, server_ssl_config_, proxy_info_,
was_npn_negotiated(), protocol_negotiated(), using_spdy(), net_log_);
stream_factory_->OnOrphanedJobComplete(this);
} else {
- request_->OnSpdySessionReady(this, spdy_session, spdy_session_direct_);
+ request_->OnNewSpdySessionReady(this, spdy_session, spdy_session_direct_);
}
// |this| may be deleted after this call.
}
@@ -365,7 +407,7 @@ void HttpStreamFactoryImpl::Job::OnHttpsProxyTunnelResponseCallback(
void HttpStreamFactoryImpl::Job::OnPreconnectsComplete() {
DCHECK(!request_);
if (new_spdy_session_) {
- stream_factory_->OnSpdySessionReady(
+ stream_factory_->OnNewSpdySessionReady(
new_spdy_session_, spdy_session_direct_, server_ssl_config_,
proxy_info_, was_npn_negotiated(), protocol_negotiated(), using_spdy(),
net_log_);
@@ -441,7 +483,7 @@ int HttpStreamFactoryImpl::Job::RunLoop(int result) {
MessageLoop::current()->PostTask(
FROM_HERE,
base::Bind(
- &HttpStreamFactoryImpl::Job::OnNeedsProxyAuthCallback,
+ &Job::OnNeedsProxyAuthCallback,
ptr_factory_.GetWeakPtr(),
*tunnel_auth_response,
proxy_socket->GetAuthController()));
@@ -452,7 +494,7 @@ int HttpStreamFactoryImpl::Job::RunLoop(int result) {
MessageLoop::current()->PostTask(
FROM_HERE,
base::Bind(
- &HttpStreamFactoryImpl::Job::OnNeedsClientAuthCallback,
+ &Job::OnNeedsClientAuthCallback,
ptr_factory_.GetWeakPtr(),
connection_->ssl_error_response_info().cert_request_info));
return ERR_IO_PENDING;
@@ -468,7 +510,7 @@ int HttpStreamFactoryImpl::Job::RunLoop(int result) {
MessageLoop::current()->PostTask(
FROM_HERE,
base::Bind(
- &HttpStreamFactoryImpl::Job::OnHttpsProxyTunnelResponseCallback,
+ &Job::OnHttpsProxyTunnelResponseCallback,
ptr_factory_.GetWeakPtr(),
*proxy_socket->GetConnectResponseInfo(),
proxy_socket->CreateConnectResponseStream()));
@@ -477,17 +519,33 @@ int HttpStreamFactoryImpl::Job::RunLoop(int result) {
case OK:
next_state_ = STATE_DONE;
- if (new_spdy_session_) {
+ if (request_->for_websocket()) {
+ if (spdy_session_to_pass_) {
+ MessageLoop::current()->PostTask(
+ FROM_HERE,
+ base::Bind(
+ &Job::OnSpdySessionReadyForWebSocketCallback,
+ ptr_factory_.GetWeakPtr()));
+ } else if (connection_ && connection_->is_initialized()) {
+ MessageLoop::current()->PostTask(
+ FROM_HERE,
+ base::Bind(
+ &Job::OnSocketReadyForWebSocketCallback,
+ ptr_factory_.GetWeakPtr()));
+ } else {
+ return ERR_FAILED;
mmenke 2013/05/23 20:26:20 We should fail asynchronously in this case, just l
yhirano 2013/05/24 14:11:16 Done.
+ }
+ } else if (new_spdy_session_) {
MessageLoop::current()->PostTask(
FROM_HERE,
base::Bind(
- &HttpStreamFactoryImpl::Job::OnSpdySessionReadyCallback,
+ &Job::OnNewSpdySessionReadyCallback,
ptr_factory_.GetWeakPtr()));
} else {
MessageLoop::current()->PostTask(
FROM_HERE,
base::Bind(
- &HttpStreamFactoryImpl::Job::OnStreamReadyCallback,
+ &Job::OnStreamReadyCallback,
ptr_factory_.GetWeakPtr()));
}
return ERR_IO_PENDING;
@@ -496,7 +554,7 @@ int HttpStreamFactoryImpl::Job::RunLoop(int result) {
MessageLoop::current()->PostTask(
FROM_HERE,
base::Bind(
- &HttpStreamFactoryImpl::Job::OnStreamFailedCallback,
+ &Job::OnStreamFailedCallback,
ptr_factory_.GetWeakPtr(),
result));
return ERR_IO_PENDING;
@@ -854,9 +912,9 @@ int HttpStreamFactoryImpl::Job::DoInitConnectionComplete(int result) {
SSLClientSocket::NextProtoFromString(proto);
protocol_negotiated_ = protocol_negotiated;
net_log_.AddEvent(
- NetLog::TYPE_HTTP_STREAM_REQUEST_PROTO,
- base::Bind(&NetLogHttpStreamProtoCallback,
- status, &proto, &server_protos));
+ NetLog::TYPE_HTTP_STREAM_REQUEST_PROTO,
+ base::Bind(&NetLogHttpStreamProtoCallback,
+ status, &proto, &server_protos));
if (ssl_socket->was_spdy_negotiated())
SwitchToSpdyMode();
}
@@ -970,10 +1028,14 @@ int HttpStreamFactoryImpl::Job::DoCreateStream() {
request_info_.url.SchemeIs("ftp"));
if (stream_factory_->http_pipelined_host_pool_.
IsExistingPipelineAvailableForKey(*http_pipelining_key_.get())) {
+ DCHECK(!request_->for_websocket());
stream_.reset(stream_factory_->http_pipelined_host_pool_.
CreateStreamOnExistingPipeline(
*http_pipelining_key_.get()));
CHECK(stream_.get());
+ } else if (request_->for_websocket()) {
+ // Do nothing.
+ // connection_ will be passed to the delegate.
mmenke 2013/05/23 20:26:20 Not creating a stream in DoCreateStream in this ca
yhirano 2013/05/24 14:11:16 Done.
} else if (!using_proxy && IsRequestEligibleForPipelining()) {
// TODO(simonjam): Support proxies.
stream_.reset(
@@ -1028,6 +1090,10 @@ int HttpStreamFactoryImpl::Job::DoCreateStream() {
if (http_server_properties)
http_server_properties->SetSupportsSpdy(host_port_pair, true);
spdy_session_direct_ = direct;
+ if (request_->for_websocket()) {
+ DCHECK(!spdy_session_to_pass_);
+ spdy_session_to_pass_.swap(new_spdy_session_);
+ }
return OK;
}
}
@@ -1035,6 +1101,12 @@ int HttpStreamFactoryImpl::Job::DoCreateStream() {
if (spdy_session->IsClosed())
return ERR_CONNECTION_CLOSED;
+ if (request_->for_websocket()) {
+ DCHECK(!spdy_session_to_pass_);
+ spdy_session_to_pass_.swap(spdy_session);
+ return OK;
+ }
+
// TODO(willchan): Delete this code, because eventually, the
// HttpStreamFactoryImpl will be creating all the SpdyHttpStreams, since it
// will know when SpdySessions become available.
@@ -1337,6 +1409,9 @@ bool HttpStreamFactoryImpl::Job::IsRequestEligibleForPipelining() {
if (IsPreconnecting() || !request_) {
return false;
}
+ if (request_->for_websocket()) {
+ return false;
+ }
if (session_->force_http_pipelining()) {
return true;
}

Powered by Google App Engine
This is Rietveld 408576698