Index: net/quic/quic_stream_factory.cc |
diff --git a/net/quic/quic_stream_factory.cc b/net/quic/quic_stream_factory.cc |
index 8bdae87f97614fa0a3e4f9ced5572cb02991afc4..b8b84034cdc2a75ce5c0e35d3794a0f17f7e9d9f 100644 |
--- a/net/quic/quic_stream_factory.cc |
+++ b/net/quic/quic_stream_factory.cc |
@@ -99,6 +99,7 @@ class QuicStreamFactory::Job { |
bool is_https, |
base::StringPiece method, |
CertVerifier* cert_verifier, |
+ QuicServerInfo* server_info, |
const BoundNetLog& net_log); |
~Job(); |
@@ -106,6 +107,8 @@ class QuicStreamFactory::Job { |
int Run(const CompletionCallback& callback); |
int DoLoop(int rv); |
+ int DoLoadServerInfo(); |
+ int DoLoadServerInfoComplete(int rv); |
int DoResolveHost(); |
int DoResolveHostComplete(int rv); |
int DoConnect(); |
@@ -124,6 +127,8 @@ class QuicStreamFactory::Job { |
private: |
enum IoState { |
STATE_NONE, |
+ STATE_LOAD_SERVER_INFO, |
+ STATE_LOAD_SERVER_INFO_COMPLETE, |
STATE_RESOLVE_HOST, |
STATE_RESOLVE_HOST_COMPLETE, |
STATE_CONNECT, |
@@ -137,6 +142,7 @@ class QuicStreamFactory::Job { |
SessionKey session_key_; |
bool is_post_; |
CertVerifier* cert_verifier_; |
+ scoped_ptr<QuicServerInfo> server_info_; |
const BoundNetLog net_log_; |
QuicClientSession* session_; |
CompletionCallback callback_; |
@@ -150,6 +156,7 @@ QuicStreamFactory::Job::Job(QuicStreamFactory* factory, |
bool is_https, |
base::StringPiece method, |
CertVerifier* cert_verifier, |
+ QuicServerInfo* server_info, |
const BoundNetLog& net_log) |
: factory_(factory), |
host_resolver_(host_resolver), |
@@ -157,6 +164,7 @@ QuicStreamFactory::Job::Job(QuicStreamFactory* factory, |
session_key_(host_port_proxy_pair, is_https), |
is_post_(method == "POST"), |
cert_verifier_(cert_verifier), |
+ server_info_(server_info), |
net_log_(net_log), |
session_(NULL) {} |
@@ -177,6 +185,13 @@ int QuicStreamFactory::Job::DoLoop(int rv) { |
IoState state = io_state_; |
io_state_ = STATE_NONE; |
switch (state) { |
+ case STATE_LOAD_SERVER_INFO: |
+ CHECK_EQ(OK, rv); |
+ rv = DoLoadServerInfo(); |
+ break; |
+ case STATE_LOAD_SERVER_INFO_COMPLETE: |
+ rv = DoLoadServerInfoComplete(rv); |
+ break; |
case STATE_RESOLVE_HOST: |
CHECK_EQ(OK, rv); |
rv = DoResolveHost(); |
@@ -207,6 +222,23 @@ void QuicStreamFactory::Job::OnIOComplete(int rv) { |
} |
} |
+int QuicStreamFactory::Job::DoLoadServerInfo() { |
+ io_state_ = STATE_LOAD_SERVER_INFO_COMPLETE; |
+ |
+ if (server_info_) |
+ server_info_->Start(); |
+ |
+ return OK; |
+} |
+ |
+int QuicStreamFactory::Job::DoLoadServerInfoComplete(int rv) { |
+ if (rv != OK) |
+ return rv; |
+ |
+ io_state_ = STATE_RESOLVE_HOST; |
+ return OK; |
+} |
+ |
int QuicStreamFactory::Job::DoResolveHost() { |
io_state_ = STATE_RESOLVE_HOST_COMPLETE; |
return host_resolver_.Resolve( |
@@ -285,7 +317,8 @@ int QuicStreamFactory::Job::DoConnect() { |
io_state_ = STATE_CONNECT_COMPLETE; |
int rv = factory_->CreateSession(session_key_.host_port_proxy_pair, is_https_, |
- cert_verifier_, address_list_, net_log_, &session_); |
+ cert_verifier_, server_info_.Pass(), |
+ address_list_, net_log_, &session_); |
if (rv != OK) { |
DCHECK(rv != ERR_IO_PENDING); |
DCHECK(!session_); |
@@ -383,13 +416,23 @@ int QuicStreamFactory::Create(const HostPortProxyPair& host_port_proxy_pair, |
return ERR_IO_PENDING; |
} |
- // Create crypto config and start the process of loading QUIC server |
- // information from disk cache. |
- QuicCryptoClientConfig* crypto_config = GetOrCreateCryptoConfig(session_key); |
- DCHECK(crypto_config); |
- |
+ QuicServerInfo* quic_server_info = NULL; |
+ if (quic_server_info_factory_) { |
+ QuicCryptoClientConfig* crypto_config = |
+ GetOrCreateCryptoConfig(session_key); |
+ QuicCryptoClientConfig::CachedState* cached = |
+ crypto_config->LookupOrCreate( |
+ session_key.host_port_proxy_pair.first.host()); |
+ DCHECK(cached); |
+ if (cached->IsEmpty()) { |
+ quic_server_info = |
+ quic_server_info_factory_->GetForHost( |
+ host_port_proxy_pair.first.host()); |
+ } |
+ } |
scoped_ptr<Job> job(new Job(this, host_resolver_, host_port_proxy_pair, |
- is_https, method, cert_verifier, net_log)); |
+ is_https, method, cert_verifier, |
+ quic_server_info, net_log)); |
int rv = job->Run(base::Bind(&QuicStreamFactory::OnJobComplete, |
base::Unretained(this), job.get())); |
@@ -601,6 +644,7 @@ int QuicStreamFactory::CreateSession( |
const HostPortProxyPair& host_port_proxy_pair, |
bool is_https, |
CertVerifier* cert_verifier, |
+ scoped_ptr<QuicServerInfo> server_info, |
const AddressList& address_list, |
const BoundNetLog& net_log, |
QuicClientSession** session) { |
@@ -681,7 +725,7 @@ int QuicStreamFactory::CreateSession( |
} |
*session = new QuicClientSession( |
- connection, socket.Pass(), writer.Pass(), this, |
+ connection, socket.Pass(), writer.Pass(), this, server_info.Pass(), |
quic_crypto_client_stream_factory_, host_port_proxy_pair.first.host(), |
config, crypto_config, net_log.net_log()); |
all_sessions_.insert(*session); // owning pointer |
@@ -719,12 +763,6 @@ QuicCryptoClientConfig* QuicStreamFactory::GetOrCreateCryptoConfig( |
// TODO(rtenneti): if two quic_sessions for the same host_port_proxy_pair |
// share the same crypto_config, will it cause issues? |
crypto_config = new QuicCryptoClientConfig(); |
- if (quic_server_info_factory_) { |
- QuicCryptoClientConfig::CachedState* cached = |
- crypto_config->Create(session_key.host_port_proxy_pair.first.host(), |
- quic_server_info_factory_); |
- DCHECK(cached); |
- } |
crypto_config->SetDefaults(); |
all_crypto_configs_[session_key] = crypto_config; |
PopulateFromCanonicalConfig(session_key, crypto_config); |