Index: net/base/single_request_cert_verifier.cc |
diff --git a/net/base/single_request_cert_verifier.cc b/net/base/single_request_cert_verifier.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..60f9f1c8be0a87131e849cf58a4960c22d28e343 |
--- /dev/null |
+++ b/net/base/single_request_cert_verifier.cc |
@@ -0,0 +1,74 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "net/base/single_request_cert_verifier.h" |
+ |
+#include "base/bind.h" |
+#include "base/bind_helpers.h" |
+#include "net/base/net_errors.h" |
+#include "net/base/x509_certificate.h" |
+ |
+namespace net { |
+ |
+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 |