| // Copyright (c) 2011 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 "base/memory/singleton.h" |
| #include "net/url_request/https_prober.h" |
| |
| #include "net/url_request/url_request.h" |
| #include "net/url_request/url_request_context.h" |
| |
| namespace net { |
| |
| // static |
| HTTPSProber* HTTPSProber::GetInstance() { |
| return Singleton<HTTPSProber>::get(); |
| } |
| |
| bool HTTPSProber::HaveProbed(const std::string& host) const { |
| return probed_.find(host) != probed_.end(); |
| } |
| |
| bool HTTPSProber::InFlight(const std::string& host) const { |
| return inflight_probes_.find(host) != inflight_probes_.end(); |
| } |
| |
| bool HTTPSProber::ProbeHost(const std::string& host, URLRequestContext* ctx, |
| HTTPSProberDelegate* delegate) { |
| if (HaveProbed(host) || InFlight(host)) { |
| return false; |
| } |
| |
| inflight_probes_[host] = delegate; |
| |
| GURL url("https://" + host); |
| DCHECK_EQ(url.host(), host); |
| |
| URLRequest* req = new URLRequest(url, this); |
| req->set_context(ctx); |
| req->Start(); |
| return true; |
| } |
| |
| void HTTPSProber::OnAuthRequired(URLRequest* request, |
| AuthChallengeInfo* auth_info) { |
| Success(request); |
| } |
| |
| void HTTPSProber::OnSSLCertificateError(URLRequest* request, |
| int cert_error, |
| X509Certificate* cert) { |
| request->ContinueDespiteLastError(); |
| } |
| |
| void HTTPSProber::OnResponseStarted(URLRequest* request) { |
| if (request->status().status() == URLRequestStatus::SUCCESS) { |
| Success(request); |
| } else { |
| Failure(request); |
| } |
| } |
| |
| void HTTPSProber::OnReadCompleted(URLRequest* request, int bytes_read) { |
| NOTREACHED(); |
| } |
| |
| HTTPSProber::HTTPSProber() { |
| } |
| |
| HTTPSProber::~HTTPSProber() { |
| } |
| |
| void HTTPSProber::Success(URLRequest* request) { |
| DoCallback(request, true); |
| } |
| |
| void HTTPSProber::Failure(URLRequest* request) { |
| DoCallback(request, false); |
| } |
| |
| void HTTPSProber::DoCallback(URLRequest* request, bool result) { |
| std::map<std::string, HTTPSProberDelegate*>::iterator i = |
| inflight_probes_.find(request->original_url().host()); |
| DCHECK(i != inflight_probes_.end()); |
| |
| HTTPSProberDelegate* delegate = i->second; |
| inflight_probes_.erase(i); |
| probed_.insert(request->original_url().host()); |
| delete request; |
| delegate->ProbeComplete(result); |
| } |
| |
| } // namespace net |