Chromium Code Reviews| 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 |