| Index: net/base/multi_threaded_cert_verifier.cc
|
| diff --git a/net/base/cert_verifier.cc b/net/base/multi_threaded_cert_verifier.cc
|
| similarity index 71%
|
| rename from net/base/cert_verifier.cc
|
| rename to net/base/multi_threaded_cert_verifier.cc
|
| index f5f0bc209095209cb8ac5dbec5a7627dc45239ee..6a3037bd073e7dbdceb42be1c1c7352f3d1506f8 100644
|
| --- a/net/base/cert_verifier.cc
|
| +++ b/net/base/multi_threaded_cert_verifier.cc
|
| @@ -2,7 +2,7 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include "net/base/cert_verifier.h"
|
| +#include "net/base/multi_threaded_cert_verifier.h"
|
|
|
| #include "base/bind.h"
|
| #include "base/bind_helpers.h"
|
| @@ -29,42 +29,42 @@ namespace net {
|
|
|
| // Life of a request:
|
| //
|
| -// CertVerifier CertVerifierJob CertVerifierWorker Request
|
| -// | (origin loop) (worker loop)
|
| +// MultiThreadedCertVerifier CertVerifierJob CertVerifierWorker Request
|
| +// | (origin loop) (worker loop)
|
| // |
|
| // Verify()
|
| -// |---->-------------------<creates>
|
| +// |---->-------------------------------------<creates>
|
| // |
|
| -// |---->----<creates>
|
| +// |---->-------------------<creates>
|
| // |
|
| -// |---->---------------------------------------------------<creates>
|
| +// |---->-------------------------------------------------------<creates>
|
| // |
|
| -// |---->--------------------Start
|
| -// | |
|
| -// | PostTask
|
| +// |---->---------------------------------------Start
|
| +// | |
|
| +// | PostTask
|
| // |
|
| -// | <starts verifying>
|
| -// |---->-----AddRequest |
|
| -// |
|
| -// |
|
| -// |
|
| -// Finish
|
| -// |
|
| -// PostTask
|
| +// | <starts verifying>
|
| +// |---->-------------------AddRequest |
|
| +// |
|
| +// |
|
| +// |
|
| +// Finish
|
| +// |
|
| +// PostTask
|
| //
|
| -// |
|
| -// DoReply
|
| -// |----<-----------------------|
|
| +// |
|
| +// DoReply
|
| +// |----<-----------------------------------------|
|
| // HandleResult
|
| // |
|
| -// |---->-----HandleResult
|
| -// |
|
| -// |------>-----------------------------------Post
|
| +// |---->------------------HandleResult
|
| +// |
|
| +// |------>---------------------------Post
|
| //
|
| //
|
| //
|
| -// On a cache hit, CertVerifier::Verify() returns synchronously without
|
| -// posting a task to a worker thread.
|
| +// On a cache hit, MultiThreadedCertVerifier::Verify() returns synchronously
|
| +// without posting a task to a worker thread.
|
|
|
| namespace {
|
|
|
| @@ -76,9 +76,9 @@ const unsigned kTTLSecs = 1800; // 30 minutes.
|
|
|
| } // namespace
|
|
|
| -CertVerifier::CachedResult::CachedResult() : error(ERR_FAILED) {}
|
| +MultiThreadedCertVerifier::CachedResult::CachedResult() : error(ERR_FAILED) {}
|
|
|
| -CertVerifier::CachedResult::~CachedResult() {}
|
| +MultiThreadedCertVerifier::CachedResult::~CachedResult() {}
|
|
|
| // Represents the output and result callback of a request.
|
| class CertVerifierRequest {
|
| @@ -105,7 +105,7 @@ class CertVerifierRequest {
|
|
|
| // Copies the contents of |verify_result| to the caller's
|
| // CertVerifyResult and calls the callback.
|
| - void Post(const CertVerifier::CachedResult& verify_result) {
|
| + void Post(const MultiThreadedCertVerifier::CachedResult& verify_result) {
|
| if (!callback_.is_null()) {
|
| net_log_.EndEvent(NetLog::TYPE_CERT_VERIFIER_REQUEST, NULL);
|
| *verify_result_ = verify_result.result;
|
| @@ -134,7 +134,7 @@ class CertVerifierWorker {
|
| const std::string& hostname,
|
| int flags,
|
| CRLSet* crl_set,
|
| - CertVerifier* cert_verifier)
|
| + MultiThreadedCertVerifier* cert_verifier)
|
| : cert_(cert),
|
| hostname_(hostname),
|
| flags_(flags),
|
| @@ -157,8 +157,8 @@ class CertVerifierWorker {
|
| true /* task is slow */);
|
| }
|
|
|
| - // Cancel is called from the origin loop when the CertVerifier is getting
|
| - // deleted.
|
| + // Cancel is called from the origin loop when the MultiThreadedCertVerifier is
|
| + // getting deleted.
|
| void Cancel() {
|
| DCHECK_EQ(MessageLoop::current(), origin_loop_);
|
| base::AutoLock locked(lock_);
|
| @@ -201,11 +201,12 @@ class CertVerifierWorker {
|
|
|
| void Finish() {
|
| // Runs on the worker thread.
|
| - // We assume that the origin loop outlives the CertVerifier. If the
|
| - // CertVerifier is deleted, it will call Cancel on us. If it does so
|
| - // before the Acquire, we'll delete ourselves and return. If it's trying to
|
| - // do so concurrently, then it'll block on the lock and we'll call PostTask
|
| - // while the CertVerifier (and therefore the MessageLoop) is still alive.
|
| + // We assume that the origin loop outlives the MultiThreadedCertVerifier. If
|
| + // the MultiThreadedCertVerifier is deleted, it will call Cancel on us. If
|
| + // it does so before the Acquire, we'll delete ourselves and return. If it's
|
| + // trying to do so concurrently, then it'll block on the lock and we'll call
|
| + // PostTask while the MultiThreadedCertVerifier (and therefore the
|
| + // MessageLoop) is still alive.
|
| // If it does so after this function, we assume that the MessageLoop will
|
| // process pending tasks. In which case we'll notice the |canceled_| flag
|
| // in DoReply.
|
| @@ -230,7 +231,7 @@ class CertVerifierWorker {
|
| const int flags_;
|
| scoped_refptr<CRLSet> crl_set_;
|
| MessageLoop* const origin_loop_;
|
| - CertVerifier* const cert_verifier_;
|
| + MultiThreadedCertVerifier* const cert_verifier_;
|
|
|
| // lock_ protects canceled_.
|
| base::Lock lock_;
|
| @@ -278,7 +279,8 @@ class CertVerifierJob {
|
| requests_.push_back(request);
|
| }
|
|
|
| - void HandleResult(const CertVerifier::CachedResult& verify_result) {
|
| + void HandleResult(
|
| + const MultiThreadedCertVerifier::CachedResult& verify_result) {
|
| worker_ = NULL;
|
| net_log_.EndEvent(NetLog::TYPE_CERT_VERIFIER_JOB, NULL);
|
| UMA_HISTOGRAM_CUSTOM_TIMES("Net.CertVerifier_Job_Latency",
|
| @@ -290,7 +292,7 @@ class CertVerifierJob {
|
| }
|
|
|
| private:
|
| - void PostAll(const CertVerifier::CachedResult& verify_result) {
|
| + void PostAll(const MultiThreadedCertVerifier::CachedResult& verify_result) {
|
| std::vector<CertVerifierRequest*> requests;
|
| requests_.swap(requests);
|
|
|
| @@ -318,7 +320,7 @@ class CertVerifierJob {
|
| const BoundNetLog net_log_;
|
| };
|
|
|
| -CertVerifier::CertVerifier()
|
| +MultiThreadedCertVerifier::MultiThreadedCertVerifier()
|
| : cache_(kMaxCacheEntries),
|
| requests_(0),
|
| cache_hits_(0),
|
| @@ -326,20 +328,20 @@ CertVerifier::CertVerifier()
|
| CertDatabase::AddObserver(this);
|
| }
|
|
|
| -CertVerifier::~CertVerifier() {
|
| +MultiThreadedCertVerifier::~MultiThreadedCertVerifier() {
|
| STLDeleteValues(&inflight_);
|
|
|
| CertDatabase::RemoveObserver(this);
|
| }
|
|
|
| -int CertVerifier::Verify(X509Certificate* cert,
|
| - const std::string& hostname,
|
| - int flags,
|
| - CRLSet* crl_set,
|
| - CertVerifyResult* verify_result,
|
| - const CompletionCallback& callback,
|
| - RequestHandle* out_req,
|
| - const BoundNetLog& net_log) {
|
| +int MultiThreadedCertVerifier::Verify(X509Certificate* cert,
|
| + const std::string& hostname,
|
| + int flags,
|
| + CRLSet* crl_set,
|
| + CertVerifyResult* verify_result,
|
| + const CompletionCallback& callback,
|
| + RequestHandle* out_req,
|
| + const BoundNetLog& net_log) {
|
| DCHECK(CalledOnValidThread());
|
|
|
| if (callback.is_null() || !verify_result || hostname.empty()) {
|
| @@ -394,7 +396,7 @@ int CertVerifier::Verify(X509Certificate* cert,
|
| return ERR_IO_PENDING;
|
| }
|
|
|
| -void CertVerifier::CancelRequest(RequestHandle req) {
|
| +void MultiThreadedCertVerifier::CancelRequest(RequestHandle req) {
|
| DCHECK(CalledOnValidThread());
|
| CertVerifierRequest* request = reinterpret_cast<CertVerifierRequest*>(req);
|
| request->Cancel();
|
| @@ -402,11 +404,12 @@ void CertVerifier::CancelRequest(RequestHandle req) {
|
|
|
| // HandleResult is called by CertVerifierWorker on the origin message loop.
|
| // It deletes CertVerifierJob.
|
| -void CertVerifier::HandleResult(X509Certificate* cert,
|
| - const std::string& hostname,
|
| - int flags,
|
| - int error,
|
| - const CertVerifyResult& verify_result) {
|
| +void MultiThreadedCertVerifier::HandleResult(
|
| + X509Certificate* cert,
|
| + const std::string& hostname,
|
| + int flags,
|
| + int error,
|
| + const CertVerifyResult& verify_result) {
|
| DCHECK(CalledOnValidThread());
|
|
|
| const RequestParams key(cert->fingerprint(), cert->ca_fingerprint(),
|
| @@ -431,72 +434,11 @@ void CertVerifier::HandleResult(X509Certificate* cert,
|
| delete job;
|
| }
|
|
|
| -void CertVerifier::OnCertTrustChanged(const X509Certificate* cert) {
|
| +void MultiThreadedCertVerifier::OnCertTrustChanged(
|
| + const X509Certificate* cert) {
|
| DCHECK(CalledOnValidThread());
|
|
|
| ClearCache();
|
| }
|
|
|
| -/////////////////////////////////////////////////////////////////////
|
| -
|
| -SingleRequestCertVerifier::SingleRequestCertVerifier(
|
| - CertVerifier* cert_verifier)
|
| - : cert_verifier_(cert_verifier),
|
| - cur_request_(NULL) {
|
| - DCHECK(cert_verifier_ != NULL);
|
| -}
|
| -
|
| -SingleRequestCertVerifier::~SingleRequestCertVerifier() {
|
| - if (cur_request_) {
|
| - cert_verifier_->CancelRequest(cur_request_);
|
| - cur_request_ = NULL;
|
| - }
|
| -}
|
| -
|
| -int SingleRequestCertVerifier::Verify(X509Certificate* cert,
|
| - const std::string& hostname,
|
| - int flags,
|
| - CRLSet* crl_set,
|
| - CertVerifyResult* verify_result,
|
| - const CompletionCallback& callback,
|
| - const BoundNetLog& net_log) {
|
| - // Should not be already in use.
|
| - DCHECK(!cur_request_ && cur_request_callback_.is_null());
|
| -
|
| - // Do a synchronous verification.
|
| - if (callback.is_null())
|
| - return cert->Verify(hostname, flags, crl_set, verify_result);
|
| -
|
| - CertVerifier::RequestHandle request = NULL;
|
| -
|
| - // We need to be notified of completion before |callback| is called, so that
|
| - // we can clear out |cur_request_*|.
|
| - int rv = cert_verifier_->Verify(
|
| - cert, hostname, flags, crl_set, verify_result,
|
| - base::Bind(&SingleRequestCertVerifier::OnVerifyCompletion,
|
| - base::Unretained(this)),
|
| - &request, net_log);
|
| -
|
| - if (rv == ERR_IO_PENDING) {
|
| - // Cleared in OnVerifyCompletion().
|
| - cur_request_ = request;
|
| - cur_request_callback_ = callback;
|
| - }
|
| -
|
| - return rv;
|
| -}
|
| -
|
| -void SingleRequestCertVerifier::OnVerifyCompletion(int result) {
|
| - DCHECK(cur_request_ && !cur_request_callback_.is_null());
|
| -
|
| - CompletionCallback callback = cur_request_callback_;
|
| -
|
| - // Clear the outstanding request information.
|
| - cur_request_ = NULL;
|
| - cur_request_callback_.Reset();
|
| -
|
| - // Call the user's original callback.
|
| - callback.Run(result);
|
| -}
|
| -
|
| } // namespace net
|
|
|