OLD | NEW |
---|---|
(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 | |
OLD | NEW |