diff options
Diffstat (limited to 'chromium/net/cert/multi_threaded_cert_verifier.cc')
-rw-r--r-- | chromium/net/cert/multi_threaded_cert_verifier.cc | 61 |
1 files changed, 57 insertions, 4 deletions
diff --git a/chromium/net/cert/multi_threaded_cert_verifier.cc b/chromium/net/cert/multi_threaded_cert_verifier.cc index 4b2f37fbc55..3d1b048616e 100644 --- a/chromium/net/cert/multi_threaded_cert_verifier.cc +++ b/chromium/net/cert/multi_threaded_cert_verifier.cc @@ -15,6 +15,8 @@ #include "base/synchronization/lock.h" #include "base/threading/worker_pool.h" #include "base/time/time.h" +#include "base/values.h" +#include "net/base/hash_value.h" #include "net/base/net_errors.h" #include "net/base/net_log.h" #include "net/cert/cert_trust_anchor_provider.h" @@ -78,6 +80,35 @@ const unsigned kMaxCacheEntries = 256; // The number of seconds for which we'll cache a cache entry. const unsigned kTTLSecs = 1800; // 30 minutes. +base::Value* CertVerifyResultCallback(const CertVerifyResult& verify_result, + NetLog::LogLevel log_level) { + base::DictionaryValue* results = new base::DictionaryValue(); + results->SetBoolean("has_md5", verify_result.has_md5); + results->SetBoolean("has_md2", verify_result.has_md2); + results->SetBoolean("has_md4", verify_result.has_md4); + results->SetBoolean("is_issued_by_known_root", + verify_result.is_issued_by_known_root); + results->SetBoolean("is_issued_by_additional_trust_anchor", + verify_result.is_issued_by_additional_trust_anchor); + results->SetBoolean("common_name_fallback_used", + verify_result.common_name_fallback_used); + results->SetInteger("cert_status", verify_result.cert_status); + results->Set( + "verified_cert", + NetLogX509CertificateCallback(verify_result.verified_cert, log_level)); + + base::ListValue* hashes = new base::ListValue(); + for (std::vector<HashValue>::const_iterator it = + verify_result.public_key_hashes.begin(); + it != verify_result.public_key_hashes.end(); + ++it) { + hashes->AppendString(it->ToString()); + } + results->Set("public_key_hashes", hashes); + + return results; +} + } // namespace MultiThreadedCertVerifier::CachedResult::CachedResult() : error(ERR_FAILED) {} @@ -348,14 +379,25 @@ class CertVerifierJob { } void HandleResult( - const MultiThreadedCertVerifier::CachedResult& verify_result) { + const MultiThreadedCertVerifier::CachedResult& verify_result, + bool is_first_job) { worker_ = NULL; - net_log_.EndEvent(NetLog::TYPE_CERT_VERIFIER_JOB); + net_log_.EndEvent( + NetLog::TYPE_CERT_VERIFIER_JOB, + base::Bind(&CertVerifyResultCallback, verify_result.result)); + base::TimeDelta latency = base::TimeTicks::Now() - start_time_; UMA_HISTOGRAM_CUSTOM_TIMES("Net.CertVerifier_Job_Latency", - base::TimeTicks::Now() - start_time_, + latency, base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromMinutes(10), 100); + if (is_first_job) { + UMA_HISTOGRAM_CUSTOM_TIMES("Net.CertVerifier_First_Job_Latency", + latency, + base::TimeDelta::FromMilliseconds(1), + base::TimeDelta::FromMinutes(10), + 100); + } PostAll(verify_result); } @@ -391,6 +433,7 @@ class CertVerifierJob { MultiThreadedCertVerifier::MultiThreadedCertVerifier( CertVerifyProc* verify_proc) : cache_(kMaxCacheEntries), + first_job_(NULL), requests_(0), cache_hits_(0), inflight_joins_(0), @@ -474,6 +517,10 @@ int MultiThreadedCertVerifier::Verify(X509Certificate* cert, return ERR_INSUFFICIENT_RESOURCES; // Just a guess. } inflight_.insert(std::make_pair(key, job)); + if (requests_ == 1) { + // Cleared in HandleResult. + first_job_ = job; + } } CertVerifierRequest* request = @@ -551,8 +598,13 @@ void MultiThreadedCertVerifier::HandleResult( } CertVerifierJob* job = j->second; inflight_.erase(j); + bool is_first_job = false; + if (first_job_ == job) { + is_first_job = true; + first_job_ = NULL; + } - job->HandleResult(cached_result); + job->HandleResult(cached_result, is_first_job); delete job; } @@ -564,3 +616,4 @@ void MultiThreadedCertVerifier::OnCACertChanged( } } // namespace net + |