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

Unified Diff: net/quic/quic_stream_factory.cc

Issue 196403002: Move QuicServerInfo management from CachedState to the QuicStreamFactory (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix crash Created 6 years, 9 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
« no previous file with comments | « net/quic/quic_stream_factory.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« no previous file with comments | « net/quic/quic_stream_factory.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698