1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 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
5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/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
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  URLRequest* req = new URLRequest(url, this);
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  req->set_context(ctx);
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  req->Start();
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid HTTPSProber::OnAuthRequired(URLRequest* request,
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                 AuthChallengeInfo* auth_info) {
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Success(request);
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid HTTPSProber::OnSSLCertificateError(URLRequest* request,
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        int cert_error,
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                        X509Certificate* cert) {
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  request->ContinueDespiteLastError();
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid HTTPSProber::OnResponseStarted(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
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid HTTPSProber::OnReadCompleted(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
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid HTTPSProber::Success(URLRequest* request) {
7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DoCallback(request, true);
7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid HTTPSProber::Failure(URLRequest* request) {
7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DoCallback(request, false);
7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid HTTPSProber::DoCallback(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