https_prober.cc revision 72a454cd3513ac24fbdd0e0cb9ad70b86a99b801
1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2009 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/singleton.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/url_request/https_prober.h" 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/url_request/url_request.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/url_request/url_request_context.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace net { 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// static 1421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenHTTPSProber* HTTPSProber::GetInstance() { 1521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return Singleton<HTTPSProber>::get(); 1621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 1721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool HTTPSProber::HaveProbed(const std::string& host) const { 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return probed_.find(host) != probed_.end(); 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool HTTPSProber::InFlight(const std::string& host) const { 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return inflight_probes_.find(host) != inflight_probes_.end(); 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool HTTPSProber::ProbeHost(const std::string& host, URLRequestContext* ctx, 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HTTPSProberDelegate* delegate) { 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (HaveProbed(host) || InFlight(host)) { 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch inflight_probes_[host] = delegate; 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL url("https://" + host); 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK_EQ(url.host(), host); 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen net::URLRequest* req = new net::URLRequest(url, this); 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch req->set_context(ctx); 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch req->Start(); 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 4321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid HTTPSProber::OnAuthRequired(net::URLRequest* request, 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::AuthChallengeInfo* auth_info) { 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Success(request); 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 4821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid HTTPSProber::OnSSLCertificateError(net::URLRequest* request, 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int cert_error, 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::X509Certificate* cert) { 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->ContinueDespiteLastError(); 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid HTTPSProber::OnResponseStarted(net::URLRequest* request) { 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (request->status().status() == URLRequestStatus::SUCCESS) { 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Success(request); 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Failure(request); 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 6221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid HTTPSProber::OnReadCompleted(net::URLRequest* request, int bytes_read) { 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenHTTPSProber::HTTPSProber() { 6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenHTTPSProber::~HTTPSProber() { 7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid HTTPSProber::Success(net::URLRequest* request) { 7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DoCallback(request, true); 7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid HTTPSProber::Failure(net::URLRequest* request) { 7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DoCallback(request, false); 7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid HTTPSProber::DoCallback(net::URLRequest* request, bool result) { 8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::map<std::string, HTTPSProberDelegate*>::iterator i = 8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen inflight_probes_.find(request->original_url().host()); 8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK(i != inflight_probes_.end()); 8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HTTPSProberDelegate* delegate = i->second; 8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen inflight_probes_.erase(i); 8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen probed_.insert(request->original_url().host()); 8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen delete request; 8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen delegate->ProbeComplete(result); 9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace net 93