1// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "base/memory/singleton.h" 6#include "net/url_request/https_prober.h" 7 8#include "net/url_request/url_request.h" 9#include "net/url_request/url_request_context.h" 10 11namespace net { 12 13// static 14HTTPSProber* HTTPSProber::GetInstance() { 15 return Singleton<HTTPSProber>::get(); 16} 17 18bool HTTPSProber::HaveProbed(const std::string& host) const { 19 return probed_.find(host) != probed_.end(); 20} 21 22bool HTTPSProber::InFlight(const std::string& host) const { 23 return inflight_probes_.find(host) != inflight_probes_.end(); 24} 25 26bool HTTPSProber::ProbeHost(const std::string& host, URLRequestContext* ctx, 27 HTTPSProberDelegate* delegate) { 28 if (HaveProbed(host) || InFlight(host)) { 29 return false; 30 } 31 32 inflight_probes_[host] = delegate; 33 34 GURL url("https://" + host); 35 DCHECK_EQ(url.host(), host); 36 37 URLRequest* req = new URLRequest(url, this); 38 req->set_context(ctx); 39 req->Start(); 40 return true; 41} 42 43void HTTPSProber::OnAuthRequired(URLRequest* request, 44 AuthChallengeInfo* auth_info) { 45 Success(request); 46} 47 48void HTTPSProber::OnSSLCertificateError(URLRequest* request, 49 int cert_error, 50 X509Certificate* cert) { 51 request->ContinueDespiteLastError(); 52} 53 54void HTTPSProber::OnResponseStarted(URLRequest* request) { 55 if (request->status().status() == URLRequestStatus::SUCCESS) { 56 Success(request); 57 } else { 58 Failure(request); 59 } 60} 61 62void HTTPSProber::OnReadCompleted(URLRequest* request, int bytes_read) { 63 NOTREACHED(); 64} 65 66HTTPSProber::HTTPSProber() { 67} 68 69HTTPSProber::~HTTPSProber() { 70} 71 72void HTTPSProber::Success(URLRequest* request) { 73 DoCallback(request, true); 74} 75 76void HTTPSProber::Failure(URLRequest* request) { 77 DoCallback(request, false); 78} 79 80void HTTPSProber::DoCallback(URLRequest* request, bool result) { 81 std::map<std::string, HTTPSProberDelegate*>::iterator i = 82 inflight_probes_.find(request->original_url().host()); 83 DCHECK(i != inflight_probes_.end()); 84 85 HTTPSProberDelegate* delegate = i->second; 86 inflight_probes_.erase(i); 87 probed_.insert(request->original_url().host()); 88 delete request; 89 delegate->ProbeComplete(result); 90} 91 92} // namespace net 93