OLD | NEW |
| (Empty) |
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 "chrome/browser/net/chrome_dns_cert_provenance_checker.h" | |
6 | |
7 #include "base/memory/scoped_ptr.h" | |
8 #include "base/stl_util.h" | |
9 #include "chrome/browser/net/chrome_url_request_context.h" | |
10 #include "net/url_request/url_request.h" | |
11 | |
12 namespace { | |
13 | |
14 class ChromeDnsCertProvenanceChecker | |
15 : public net::DnsCertProvenanceChecker, | |
16 public net::DnsCertProvenanceChecker::Delegate { | |
17 public: | |
18 ChromeDnsCertProvenanceChecker( | |
19 net::DnsRRResolver* dnsrr_resolver, | |
20 ChromeURLRequestContext* url_req_context) | |
21 : dnsrr_resolver_(dnsrr_resolver), | |
22 url_req_context_(url_req_context), | |
23 upload_url_("http://chromecertcheck.appspot.com/upload"), | |
24 delegate_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { | |
25 } | |
26 | |
27 ~ChromeDnsCertProvenanceChecker() { | |
28 DCHECK(inflight_requests_.empty()); | |
29 } | |
30 | |
31 // DnsCertProvenanceChecker interface | |
32 virtual void DoAsyncVerification( | |
33 const std::string& hostname, | |
34 const std::vector<base::StringPiece>& der_certs) { | |
35 net::DnsCertProvenanceChecker::DoAsyncLookup(hostname, der_certs, | |
36 dnsrr_resolver_, this); | |
37 } | |
38 | |
39 virtual void Shutdown() { | |
40 STLDeleteContainerPointers(inflight_requests_.begin(), | |
41 inflight_requests_.end()); | |
42 inflight_requests_.clear(); | |
43 } | |
44 | |
45 // DnsCertProvenanceChecker::Delegate interface | |
46 virtual void OnDnsCertLookupFailed( | |
47 const std::string& hostname, | |
48 const std::vector<std::string>& der_certs) { | |
49 const std::string report = BuildEncryptedReport(hostname, der_certs); | |
50 | |
51 net::URLRequest* url_request(new net::URLRequest(upload_url_, &delegate_)); | |
52 url_request->set_context(url_req_context_); | |
53 url_request->set_method("POST"); | |
54 url_request->AppendBytesToUpload(report.data(), report.size()); | |
55 net::HttpRequestHeaders headers; | |
56 headers.SetHeader(net::HttpRequestHeaders::kContentType, | |
57 "x-application/chrome-cert-provenance-report"); | |
58 url_request->SetExtraRequestHeaders(headers); | |
59 inflight_requests_.insert(url_request); | |
60 url_request->Start(); | |
61 } | |
62 | |
63 private: | |
64 void RequestComplete(net::URLRequest* request) { | |
65 std::set<net::URLRequest*>::iterator i = inflight_requests_.find(request); | |
66 DCHECK(i != inflight_requests_.end()); | |
67 delete *i; | |
68 inflight_requests_.erase(i); | |
69 } | |
70 | |
71 // URLRequestDelegate is the delegate for the upload. Since this is a | |
72 // fire-and-forget operation, we don't care if there are any errors in the | |
73 // upload. | |
74 class URLRequestDelegate : public net::URLRequest::Delegate { | |
75 public: | |
76 explicit URLRequestDelegate(ChromeDnsCertProvenanceChecker* checker) | |
77 : checker_(checker) { | |
78 } | |
79 | |
80 // Delegate implementation | |
81 void OnResponseStarted(net::URLRequest* request) { | |
82 const net::URLRequestStatus& status(request->status()); | |
83 if (!status.is_success()) { | |
84 LOG(WARNING) << "Certificate upload failed" | |
85 << " status:" << status.status() | |
86 << " error:" << status.error(); | |
87 } else if (request->GetResponseCode() != 200) { | |
88 LOG(WARNING) << "Certificate upload HTTP status: " | |
89 << request->GetResponseCode(); | |
90 } | |
91 checker_->RequestComplete(request); | |
92 } | |
93 | |
94 void OnReadCompleted(net::URLRequest* request, int bytes_read) { | |
95 NOTREACHED(); | |
96 } | |
97 | |
98 private: | |
99 ChromeDnsCertProvenanceChecker* const checker_; | |
100 }; | |
101 | |
102 net::DnsRRResolver* const dnsrr_resolver_; | |
103 ChromeURLRequestContext* const url_req_context_; | |
104 const GURL upload_url_; | |
105 URLRequestDelegate delegate_; | |
106 std::set<net::URLRequest*> inflight_requests_; | |
107 }; | |
108 | |
109 } // namespace | |
110 | |
111 net::DnsCertProvenanceChecker* CreateChromeDnsCertProvenanceChecker( | |
112 net::DnsRRResolver* dnsrr_resolver, | |
113 ChromeURLRequestContext* url_req_context) { | |
114 return new ChromeDnsCertProvenanceChecker(dnsrr_resolver, url_req_context); | |
115 } | |
OLD | NEW |