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