| Index: net/quic/quic_crypto_client_stream.cc
|
| diff --git a/net/quic/quic_crypto_client_stream.cc b/net/quic/quic_crypto_client_stream.cc
|
| index ab32cf0fc0ce21569046f379865e90b5e5f6e759..5afa48268c3cb3d68fa7fd0291cb0acab1d57cc9 100644
|
| --- a/net/quic/quic_crypto_client_stream.cc
|
| +++ b/net/quic/quic_crypto_client_stream.cc
|
| @@ -65,7 +65,6 @@ void QuicCryptoClientStream::ProofVerifierCallbackImpl::Cancel() {
|
| stream_ = NULL;
|
| }
|
|
|
| -
|
| QuicCryptoClientStream::QuicCryptoClientStream(
|
| const string& server_hostname,
|
| QuicSession* session,
|
| @@ -278,6 +277,7 @@ void QuicCryptoClientStream::DoHandshakeLoop(
|
| if (!verifier) {
|
| // If no verifier is set then we don't check the certificates.
|
| cached->SetProofValid();
|
| + SaveQuicServerInfo(*cached);
|
| } else if (!cached->signature().empty()) {
|
| next_state_ = STATE_VERIFY_PROOF;
|
| break;
|
| @@ -332,6 +332,7 @@ void QuicCryptoClientStream::DoHandshakeLoop(
|
| } else {
|
| cached->SetProofValid();
|
| cached->SetProofVerifyDetails(verify_details_.release());
|
| + SaveQuicServerInfo(*cached);
|
| next_state_ = STATE_SEND_CHLO;
|
| }
|
| break;
|
| @@ -415,11 +416,15 @@ void QuicCryptoClientStream::OnIOComplete(int result) {
|
| DoHandshakeLoop(NULL);
|
| }
|
|
|
| +void QuicCryptoClientStream::SetQuicServerInfo(
|
| + scoped_ptr<QuicServerInfo> server_info) {
|
| + quic_server_info_.reset(server_info.release());
|
| +}
|
| +
|
| int QuicCryptoClientStream::DoLoadQuicServerInfo(
|
| QuicCryptoClientConfig::CachedState* cached) {
|
| next_state_ = STATE_SEND_CHLO;
|
| - QuicServerInfo* quic_server_info = cached->quic_server_info();
|
| - if (!quic_server_info) {
|
| + if (!quic_server_info_) {
|
| return OK;
|
| }
|
|
|
| @@ -437,7 +442,7 @@ int QuicCryptoClientStream::DoLoadQuicServerInfo(
|
| // quic_server_info->Persist requires quic_server_info to be ready, so we
|
| // always call WaitForDataReady, even though we might have initialized
|
| // |cached| config from the cached state for a canonical hostname.
|
| - int rv = quic_server_info->WaitForDataReady(
|
| + int rv = quic_server_info_->WaitForDataReady(
|
| base::Bind(&QuicCryptoClientStream::OnIOComplete,
|
| weak_factory_.GetWeakPtr()));
|
|
|
| @@ -450,7 +455,7 @@ int QuicCryptoClientStream::DoLoadQuicServerInfo(
|
| void QuicCryptoClientStream::DoLoadQuicServerInfoComplete(
|
| QuicCryptoClientConfig::CachedState* cached) {
|
| LoadQuicServerInfo(cached);
|
| - QuicServerInfo::State* state = cached->quic_server_info()->mutable_state();
|
| + QuicServerInfo::State* state = quic_server_info_->mutable_state();
|
| state->Clear();
|
| }
|
|
|
| @@ -468,8 +473,12 @@ void QuicCryptoClientStream::LoadQuicServerInfo(
|
| UMA_HISTOGRAM_TIMES("Net.QuicServerInfo.DiskCacheReadTime",
|
| base::TimeTicks::Now() - disk_cache_load_start_time_);
|
|
|
| - if (disk_cache_load_result_ != OK || !cached->LoadQuicServerInfo(
|
| - session()->connection()->clock()->WallNow())) {
|
| + if (disk_cache_load_result_ != OK ||
|
| + !cached->Initialize(quic_server_info_->state().server_config,
|
| + quic_server_info_->state().source_address_token,
|
| + quic_server_info_->state().certs,
|
| + quic_server_info_->state().server_config_sig,
|
| + session()->connection()->clock()->WallNow())) {
|
| // It is ok to proceed to STATE_SEND_CHLO when we cannot load QuicServerInfo
|
| // from the disk cache.
|
| DCHECK(cached->IsEmpty());
|
| @@ -481,9 +490,30 @@ void QuicCryptoClientStream::LoadQuicServerInfo(
|
| if (!verifier) {
|
| // If no verifier is set then we don't check the certificates.
|
| cached->SetProofValid();
|
| + SaveQuicServerInfo(*cached);
|
| } else if (!cached->signature().empty()) {
|
| next_state_ = STATE_VERIFY_PROOF;
|
| }
|
| }
|
|
|
| +void QuicCryptoClientStream::SaveQuicServerInfo(
|
| + const QuicCryptoClientConfig::CachedState& cached) {
|
| + DCHECK(cached.proof_valid());
|
| +
|
| + // If the QuicServerInfo hasn't managed to load from disk yet then we can't
|
| + // save anything. TODO(rtenneti): we should fix this.
|
| + if (!quic_server_info_ || !quic_server_info_->IsDataReady()) {
|
| + return;
|
| + }
|
| +
|
| + QuicServerInfo::State* state = quic_server_info_->mutable_state();
|
| +
|
| + state->server_config = cached.server_config();
|
| + state->source_address_token = cached.source_address_token();
|
| + state->server_config_sig = cached.signature();
|
| + state->certs = cached.certs();
|
| +
|
| + quic_server_info_->Persist();
|
| +}
|
| +
|
| } // namespace net
|
|
|