Index: net/quic/quic_stream_factory.cc |
diff --git a/net/quic/quic_stream_factory.cc b/net/quic/quic_stream_factory.cc |
index 95f15511f3560f40a1efa58c948f964fc2058a00..42b0a4a6ce33c47190c8975901af52fc04f708ad 100644 |
--- a/net/quic/quic_stream_factory.cc |
+++ b/net/quic/quic_stream_factory.cc |
@@ -71,6 +71,7 @@ class QuicStreamFactory::Job { |
bool is_https, |
base::StringPiece method, |
CertVerifier* cert_verifier, |
+ QuicServerInfo* server_info, |
const BoundNetLog& net_log); |
~Job(); |
@@ -78,6 +79,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(); |
@@ -96,6 +99,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, |
@@ -109,6 +114,7 @@ class QuicStreamFactory::Job { |
QuicSessionKey session_key_; |
bool is_post_; |
CertVerifier* cert_verifier_; |
+ scoped_ptr<QuicServerInfo> server_info_; |
const BoundNetLog net_log_; |
QuicClientSession* session_; |
CompletionCallback callback_; |
@@ -122,6 +128,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), |
@@ -129,6 +136,7 @@ QuicStreamFactory::Job::Job(QuicStreamFactory* factory, |
session_key_(host_port_pair, is_https), |
is_post_(method == "POST"), |
cert_verifier_(cert_verifier), |
+ server_info_(server_info), |
net_log_(net_log), |
session_(NULL) {} |
@@ -136,7 +144,7 @@ QuicStreamFactory::Job::~Job() { |
} |
int QuicStreamFactory::Job::Run(const CompletionCallback& callback) { |
- io_state_ = STATE_RESOLVE_HOST; |
+ io_state_ = STATE_LOAD_SERVER_INFO; |
int rv = DoLoop(OK); |
if (rv == ERR_IO_PENDING) |
callback_ = callback; |
@@ -149,6 +157,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(); |
@@ -179,6 +194,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( |
@@ -257,7 +289,8 @@ int QuicStreamFactory::Job::DoConnect() { |
io_state_ = STATE_CONNECT_COMPLETE; |
int rv = factory_->CreateSession(session_key_.host_port_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_); |
@@ -355,13 +388,21 @@ int QuicStreamFactory::Create(const HostPortPair& host_port_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_pair().host()); |
+ DCHECK(cached); |
+ if (cached->IsEmpty()) { |
+ quic_server_info = |
+ quic_server_info_factory_->GetForHost(host_port_pair.host()); |
+ } |
+ } |
scoped_ptr<Job> job(new Job(this, host_resolver_, host_port_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())); |
@@ -573,6 +614,7 @@ int QuicStreamFactory::CreateSession( |
const HostPortPair& host_port_pair, |
bool is_https, |
CertVerifier* cert_verifier, |
+ scoped_ptr<QuicServerInfo> server_info, |
const AddressList& address_list, |
const BoundNetLog& net_log, |
QuicClientSession** session) { |
@@ -652,7 +694,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_pair.host(), |
config, crypto_config, net_log.net_log()); |
all_sessions_.insert(*session); // owning pointer |
@@ -690,12 +732,6 @@ QuicCryptoClientConfig* QuicStreamFactory::GetOrCreateCryptoConfig( |
// TODO(rtenneti): if two quic_sessions for the same host_port_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_pair().host(), |
- quic_server_info_factory_); |
- DCHECK(cached); |
- } |
crypto_config->SetDefaults(); |
all_crypto_configs_[session_key] = crypto_config; |
PopulateFromCanonicalConfig(session_key, crypto_config); |