Home | History | Annotate | Download | only in url_request
      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 
     11 namespace net {
     12 
     13 // static
     14 HTTPSProber* HTTPSProber::GetInstance() {
     15   return Singleton<HTTPSProber>::get();
     16 }
     17 
     18 bool HTTPSProber::HaveProbed(const std::string& host) const {
     19   return probed_.find(host) != probed_.end();
     20 }
     21 
     22 bool HTTPSProber::InFlight(const std::string& host) const {
     23   return inflight_probes_.find(host) != inflight_probes_.end();
     24 }
     25 
     26 bool 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 
     43 void HTTPSProber::OnAuthRequired(URLRequest* request,
     44                                  AuthChallengeInfo* auth_info) {
     45   Success(request);
     46 }
     47 
     48 void HTTPSProber::OnSSLCertificateError(URLRequest* request,
     49                                         int cert_error,
     50                                         X509Certificate* cert) {
     51   request->ContinueDespiteLastError();
     52 }
     53 
     54 void HTTPSProber::OnResponseStarted(URLRequest* request) {
     55   if (request->status().status() == URLRequestStatus::SUCCESS) {
     56     Success(request);
     57   } else {
     58     Failure(request);
     59   }
     60 }
     61 
     62 void HTTPSProber::OnReadCompleted(URLRequest* request, int bytes_read) {
     63   NOTREACHED();
     64 }
     65 
     66 HTTPSProber::HTTPSProber() {
     67 }
     68 
     69 HTTPSProber::~HTTPSProber() {
     70 }
     71 
     72 void HTTPSProber::Success(URLRequest* request) {
     73   DoCallback(request, true);
     74 }
     75 
     76 void HTTPSProber::Failure(URLRequest* request) {
     77   DoCallback(request, false);
     78 }
     79 
     80 void 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