| 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);
|
|
|