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 "mojo/common/common_type_converters.h" |
| 6 #include "net/base/net_errors.h" |
| 7 #include "net/dns/host_resolver_mojo_host.h" |
| 8 #include "url/gurl.h" |
| 9 |
| 10 namespace net { |
| 11 |
| 12 class HostResolverMojoHost::Job : public mojo::ErrorHandler { |
| 13 public: |
| 14 Job(HostResolver* resolver, |
| 15 const HostResolver::RequestInfo& request_info, |
| 16 dns::ResolveRequestClientPtr client); |
| 17 |
| 18 private: |
| 19 void OnResolveDone(int32_t result); |
| 20 |
| 21 // mojo::ErrorHandler override. |
| 22 void OnConnectionError() override; |
| 23 |
| 24 HostResolver* resolver_; |
| 25 dns::ResolveRequestClientPtr client_; |
| 26 HostResolver::RequestHandle handle_; |
| 27 AddressList result_; |
| 28 BoundNetLog net_log_; |
| 29 std::string target_; |
| 30 }; |
| 31 |
| 32 HostResolverMojoHost::HostResolverMojoHost(HostResolver* resolver) |
| 33 : resolver_(resolver) { |
| 34 } |
| 35 |
| 36 void HostResolverMojoHost::Resolve(dns::RequestInfoPtr request_info, |
| 37 dns::ResolveRequestClientPtr client) { |
| 38 new Job(resolver_, request_info->To<HostResolver::RequestInfo>(), |
| 39 client.Pass()); |
| 40 } |
| 41 |
| 42 HostResolverMojoHost::Job::Job(HostResolver* resolver, |
| 43 const HostResolver::RequestInfo& request_info, |
| 44 dns::ResolveRequestClientPtr client) |
| 45 : resolver_(resolver), |
| 46 client_(client.Pass()), |
| 47 handle_(nullptr), |
| 48 target_(request_info.host_port_pair().ToString()) { |
| 49 VLOG(1) << "Resolve " << request_info.host_port_pair().ToString(); |
| 50 int32_t result = |
| 51 resolver_->Resolve(request_info, DEFAULT_PRIORITY, &result_, |
| 52 base::Bind(&HostResolverMojoHost::Job::OnResolveDone, |
| 53 base::Unretained(this)), |
| 54 &handle_, net_log_); |
| 55 if (result != ERR_IO_PENDING) |
| 56 OnResolveDone(result); |
| 57 } |
| 58 |
| 59 void HostResolverMojoHost::Job::OnResolveDone(int32_t result) { |
| 60 VLOG(1) << "Resolved " << target_ << " with error " << result << " and " |
| 61 << result_.size() << " results!"; |
| 62 for (const auto& address : result_) { |
| 63 VLOG(1) << address.ToString(); |
| 64 } |
| 65 if (result) |
| 66 client_->ReportError(result); |
| 67 else |
| 68 client_->ReportResult(dns::AddressList::From(result_)); |
| 69 delete this; |
| 70 } |
| 71 |
| 72 void HostResolverMojoHost::Job::OnConnectionError() { |
| 73 resolver_->CancelRequest(handle_); |
| 74 delete this; |
| 75 } |
| 76 |
| 77 } // namespace net |
| 78 |
| 79 namespace mojo { |
| 80 |
| 81 // static |
| 82 net::HostResolver::RequestInfo |
| 83 TypeConverter<net::HostResolver::RequestInfo, net::dns::RequestInfo>::Convert( |
| 84 const net::dns::RequestInfo& obj) { |
| 85 net::HostResolver::RequestInfo result( |
| 86 net::HostPortPair::FromString(obj.host_port_pair)); |
| 87 result.set_address_family( |
| 88 static_cast<net::AddressFamily>(obj.address_family)); |
| 89 return result; |
| 90 } |
| 91 |
| 92 // static |
| 93 net::dns::AddressListPtr |
| 94 TypeConverter<net::dns::AddressListPtr, net::AddressList>::Convert( |
| 95 const net::AddressList& obj) { |
| 96 net::dns::AddressListPtr result(net::dns::AddressList::New()); |
| 97 result->canonical_name = obj.canonical_name(); |
| 98 for (const auto& endpoint : obj) { |
| 99 const auto& address = endpoint.address(); |
| 100 mojo::Array<uint8_t> serialized_address(address.size()); |
| 101 std::copy(address.begin(), address.end(), &serialized_address[0]); |
| 102 result->addresses.push_back(serialized_address.Pass()); |
| 103 } |
| 104 return result.Pass(); |
| 105 } |
| 106 |
| 107 } // namespace mojo |
OLD | NEW |