Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(15)

Side by Side Diff: net/dns/host_resolver_service_impl.cc

Issue 892393005: Implement browser-side host resolver Mojo service. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@v8-pac-interfaces
Patch Set: Windows? Again! Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2015 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 "net/dns/host_resolver_service_impl.h"
6
7 #include "base/basictypes.h"
8 #include "net/base/address_list.h"
9 #include "net/base/net_errors.h"
10 #include "net/dns/host_resolver.h"
11 #include "net/dns/type_converters.h"
12
13 namespace net {
14
15 // Handles host resolution for a single request and sends a response when done.
16 // Also detects connection errors for HostResolverRequestClient and cancels the
17 // outstanding resolve request. Owned by HostResolverServiceImpl.
18 class HostResolverServiceImpl::Job : public mojo::ErrorHandler {
19 public:
20 Job(HostResolverServiceImpl* resolver_service,
21 HostResolver* resolver,
22 const HostResolver::RequestInfo& request_info,
23 interfaces::HostResolverRequestClientPtr client);
24
25 void Start();
Sam McNally 2015/02/05 23:58:36 I'd prefer to not have a way to create a Job witho
Anand Mistry (off Chromium) 2015/02/06 06:32:40 Done.
26 void Cancel();
27
28 private:
29 // Completion callback for the HostResolver::Resolve request.
30 void OnResolveDone(int32_t result);
31
32 // Overridden from mojo::ErrorHandler:
33 void OnConnectionError() override;
34
35 HostResolverServiceImpl* resolver_service_;
36 HostResolver* resolver_;
37 HostResolver::RequestInfo request_info_;
38 interfaces::HostResolverRequestClientPtr client_;
39 HostResolver::RequestHandle handle_;
40 AddressList result_;
41 BoundNetLog net_log_;
eroman 2015/02/05 19:51:11 This is not actually initialized. Rather may want
Anand Mistry (off Chromium) 2015/02/06 06:32:40 Done.
42 base::ThreadChecker thread_checker_;
43 };
44
45 HostResolverServiceImpl::HostResolverServiceImpl(HostResolver* resolver)
46 : resolver_(resolver) {
47 }
48
49 HostResolverServiceImpl::~HostResolverServiceImpl() {
50 DCHECK(thread_checker_.CalledOnValidThread());
51 for (Job* job : pending_jobs_) {
eroman 2015/02/05 19:51:11 How about having cancellation be done as part of d
Anand Mistry (off Chromium) 2015/02/06 06:32:40 Done.
52 job->Cancel();
53 delete job;
54 }
55 }
56
57 size_t HostResolverServiceImpl::OutstandingRequestsForTesting() {
58 DCHECK(thread_checker_.CalledOnValidThread());
59 return pending_jobs_.size();
60 }
61
62 void HostResolverServiceImpl::Resolve(
63 interfaces::HostResolverRequestInfoPtr request_info,
64 interfaces::HostResolverRequestClientPtr client) {
65 DCHECK(thread_checker_.CalledOnValidThread());
66 Job* job =
67 new Job(this, resolver_, request_info->To<HostResolver::RequestInfo>(),
68 client.Pass());
69 pending_jobs_.insert(job);
70 job->Start();
71 }
72
73 void HostResolverServiceImpl::DeleteJob(Job* job) {
74 DCHECK(thread_checker_.CalledOnValidThread());
75 size_t num_erased = pending_jobs_.erase(job);
76 DCHECK(num_erased);
77 delete job;
78 }
79
80 HostResolverServiceImpl::Job::Job(
81 HostResolverServiceImpl* resolver_service,
82 HostResolver* resolver,
83 const HostResolver::RequestInfo& request_info,
84 interfaces::HostResolverRequestClientPtr client)
85 : resolver_service_(resolver_service),
86 resolver_(resolver),
87 request_info_(request_info),
88 client_(client.Pass()),
89 handle_(nullptr) {
90 client_.set_error_handler(this);
91 }
92
93 void HostResolverServiceImpl::Job::Start() {
94 DCHECK(thread_checker_.CalledOnValidThread());
95 DVLOG(1) << "Resolve " << request_info_.host_port_pair().ToString();
96 int32_t result = resolver_->Resolve(
eroman 2015/02/05 19:51:11 "int" is what the net stack uses, I suggest you st
Anand Mistry (off Chromium) 2015/02/06 06:32:40 Oops. Was stuck in the Mojo mentality of fixed-siz
97 request_info_, DEFAULT_PRIORITY, &result_,
98 base::Bind(&HostResolverServiceImpl::Job::OnResolveDone,
99 base::Unretained(this)),
100 &handle_, net_log_);
101
102 if (result != ERR_IO_PENDING)
103 OnResolveDone(result);
104 }
105
106 void HostResolverServiceImpl::Job::Cancel() {
107 DCHECK(thread_checker_.CalledOnValidThread());
108 resolver_->CancelRequest(handle_);
109 }
110
111 void HostResolverServiceImpl::Job::OnResolveDone(int32_t result) {
eroman 2015/02/05 19:51:11 why int32_t? The //net code defines error as "int"
Anand Mistry (off Chromium) 2015/02/06 06:32:40 Fixed.
112 DCHECK(thread_checker_.CalledOnValidThread());
113 DVLOG(1) << "Resolved " << request_info_.host_port_pair().ToString()
114 << " with error " << result << " and " << result_.size()
115 << " results!";
116 for (const auto& address : result_) {
117 VLOG(1) << address.ToString();
118 }
119 if (result)
120 client_->ReportResult(result, nullptr);
121 else
122 client_->ReportResult(0, interfaces::AddressList::From(result_));
123
124 resolver_service_->DeleteJob(this);
125 }
126
127 void HostResolverServiceImpl::Job::OnConnectionError() {
128 DCHECK(thread_checker_.CalledOnValidThread());
129 DVLOG(1) << "Connection error on request for "
130 << request_info_.host_port_pair().ToString();
131 Cancel();
132 resolver_service_->DeleteJob(this);
133 }
134
135 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698