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/mojo_host_resolver_impl.h" | |
6 | |
7 #include "base/basictypes.h" | |
8 #include "base/stl_util.h" | |
9 #include "net/base/address_list.h" | |
10 #include "net/base/net_errors.h" | |
11 #include "net/dns/host_resolver.h" | |
12 #include "net/dns/type_converters.h" | |
13 | |
14 namespace net { | |
15 | |
16 // Handles host resolution for a single request and sends a response when done. | |
17 // Also detects connection errors for HostResolverRequestClient and cancels the | |
18 // outstanding resolve request. Owned by MojoHostResolverImpl. | |
19 class MojoHostResolverImpl::Job : public mojo::ErrorHandler { | |
20 public: | |
21 Job(MojoHostResolverImpl* resolver_service, | |
22 net::HostResolver* resolver, | |
23 const net::HostResolver::RequestInfo& request_info, | |
24 interfaces::HostResolverRequestClientPtr client); | |
25 ~Job() override; | |
26 | |
27 void Start(); | |
28 | |
29 private: | |
30 // Completion callback for the HostResolver::Resolve request. | |
31 void OnResolveDone(int result); | |
32 | |
33 // Overridden from mojo::ErrorHandler: | |
34 void OnConnectionError() override; | |
35 | |
36 MojoHostResolverImpl* resolver_service_; | |
37 net::HostResolver* resolver_; | |
38 net::HostResolver::RequestInfo request_info_; | |
39 interfaces::HostResolverRequestClientPtr client_; | |
40 net::HostResolver::RequestHandle handle_; | |
41 AddressList result_; | |
42 base::ThreadChecker thread_checker_; | |
43 }; | |
44 | |
45 MojoHostResolverImpl::MojoHostResolverImpl(net::HostResolver* resolver) | |
46 : resolver_(resolver) { | |
47 } | |
48 | |
49 MojoHostResolverImpl::~MojoHostResolverImpl() { | |
50 DCHECK(thread_checker_.CalledOnValidThread()); | |
51 STLDeleteElements(&pending_jobs_); | |
52 } | |
53 | |
54 void MojoHostResolverImpl::Resolve( | |
55 interfaces::HostResolverRequestInfoPtr request_info, | |
56 interfaces::HostResolverRequestClientPtr client) { | |
57 DCHECK(thread_checker_.CalledOnValidThread()); | |
58 Job* job = new Job(this, resolver_, | |
59 request_info->To<net::HostResolver::RequestInfo>(), | |
60 client.Pass()); | |
61 pending_jobs_.insert(job); | |
62 job->Start(); | |
63 } | |
64 | |
65 void MojoHostResolverImpl::DeleteJob(Job* job) { | |
66 DCHECK(thread_checker_.CalledOnValidThread()); | |
67 size_t num_erased = pending_jobs_.erase(job); | |
68 DCHECK(num_erased); | |
69 delete job; | |
70 } | |
71 | |
72 MojoHostResolverImpl::Job::Job( | |
73 MojoHostResolverImpl* resolver_service, | |
74 net::HostResolver* resolver, | |
75 const net::HostResolver::RequestInfo& request_info, | |
76 interfaces::HostResolverRequestClientPtr client) | |
77 : resolver_service_(resolver_service), | |
78 resolver_(resolver), | |
79 request_info_(request_info), | |
80 client_(client.Pass()), | |
81 handle_(nullptr) { | |
82 client_.set_error_handler(this); | |
83 } | |
84 | |
85 void MojoHostResolverImpl::Job::Start() { | |
86 DVLOG(1) << "Resolve " << request_info_.host_port_pair().ToString(); | |
87 BoundNetLog net_log; | |
88 int result = | |
89 resolver_->Resolve(request_info_, DEFAULT_PRIORITY, &result_, | |
90 base::Bind(&MojoHostResolverImpl::Job::OnResolveDone, | |
91 base::Unretained(this)), | |
92 &handle_, net_log); | |
93 | |
94 if (result != ERR_IO_PENDING) | |
95 OnResolveDone(result); | |
96 } | |
97 | |
98 MojoHostResolverImpl::Job::~Job() { | |
99 DCHECK(thread_checker_.CalledOnValidThread()); | |
100 if (handle_) | |
101 resolver_->CancelRequest(handle_); | |
102 } | |
103 | |
104 void MojoHostResolverImpl::Job::OnResolveDone(int result) { | |
105 DCHECK(thread_checker_.CalledOnValidThread()); | |
106 handle_ = nullptr; | |
107 DVLOG(1) << "Resolved " << request_info_.host_port_pair().ToString() | |
108 << " with error " << result << " and " << result_.size() | |
109 << " results!"; | |
110 for (const auto& address : result_) { | |
111 DVLOG(1) << address.ToString(); | |
112 } | |
113 if (result) | |
eroman
2015/02/12 02:30:18
Compare result == OK instead of relying on success
Anand Mistry (off Chromium)
2015/02/12 04:47:15
Done.
| |
114 client_->ReportResult(result, nullptr); | |
115 else | |
116 client_->ReportResult(0, interfaces::AddressList::From(result_)); | |
eroman
2015/02/12 02:30:18
Pass |result| in place of 0 (don't want to hardcod
Anand Mistry (off Chromium)
2015/02/12 04:47:15
Done.
| |
117 | |
118 resolver_service_->DeleteJob(this); | |
119 } | |
120 | |
121 void MojoHostResolverImpl::Job::OnConnectionError() { | |
122 DCHECK(thread_checker_.CalledOnValidThread()); | |
123 // |resolver_service_| should always outlive us. | |
124 DCHECK(resolver_service_); | |
125 DVLOG(1) << "Connection error on request for " | |
126 << request_info_.host_port_pair().ToString(); | |
127 resolver_service_->DeleteJob(this); | |
128 } | |
129 | |
130 } // namespace net | |
OLD | NEW |