Chromium Code Reviews| Index: net/proxy/proxy_resolver_js_bindings.cc |
| =================================================================== |
| --- net/proxy/proxy_resolver_js_bindings.cc (revision 29974) |
| +++ net/proxy/proxy_resolver_js_bindings.cc (working copy) |
| @@ -2,6 +2,14 @@ |
| // source code is governed by a BSD-style license that can be found in the |
| // LICENSE file. |
| +#include "build/build_config.h" |
| + |
| +#if defined(OS_WIN) |
| +#include <ws2tcpip.h> |
| +#else |
| +#include <netdb.h> |
| +#endif |
| + |
| #include "net/proxy/proxy_resolver_js_bindings.h" |
| #include "base/compiler_specific.h" |
| @@ -97,18 +105,20 @@ |
| } |
| // Handler for "myIpAddress()". Returns empty string on failure. |
| + // TODO(eroman): Perhaps enumerate the interfaces directly, using |
| + // getifaddrs(). |
| virtual std::string MyIpAddress() { |
| // DnsResolve("") returns "", so no need to check for failure. |
| return DnsResolve(GetHostName()); |
| } |
| + // Handler for "myIpAddressEx()". Returns empty string on failure. |
| + virtual std::string MyIpAddressEx() { |
| + return DnsResolveEx(GetHostName()); |
| + } |
| + |
| // Handler for "dnsResolve(host)". Returns empty string on failure. |
| virtual std::string DnsResolve(const std::string& host) { |
| - // TODO(eroman): Should this return our IP address, or fail, or |
| - // simply be unspecified (works differently on windows and mac os x). |
| - if (host.empty()) |
| - return std::string(); |
| - |
| // Do a sync resolve of the hostname. |
| // Disable IPv6 results. We do this because Internet Explorer does it -- |
|
wtc
2009/10/24 04:40:59
I studied the original specification of the PAC sc
|
| // consequently a lot of existing PAC scripts assume they will only get |
| @@ -130,6 +140,31 @@ |
| return net::NetAddressToString(address_list.head()); |
| } |
| + // Handler for "dnsResolveEx(host)". Returns empty string on failure. |
| + virtual std::string DnsResolveEx(const std::string& host) { |
| + // Do a sync resolve of the hostname. |
| + net::AddressList address_list; |
| + int result = host_resolver_->Resolve(host, |
| + ADDRESS_FAMILY_UNSPECIFIED, |
| + &address_list); |
| + |
| + if (result != OK) |
| + return std::string(); // Failed. |
| + |
| + // Stringify all of the addresses in the address list, separated |
| + // by semicolons. |
| + std::string address_list_str; |
| + const struct addrinfo* current_address = address_list.head(); |
| + while (current_address) { |
| + if (!address_list_str.empty()) |
| + address_list_str += ";"; |
| + address_list_str += net::NetAddressToString(current_address); |
| + current_address = current_address->ai_next; |
| + } |
| + |
| + return address_list_str; |
| + } |
| + |
| // Handler for when an error is encountered. |line_number| may be -1. |
| virtual void OnError(int line_number, const std::string& message) { |
| if (line_number == -1) |