proxy_resolver_js_bindings.cc revision f5cf6e34aa6c6b061eb6f33f2f82c95177e16648
1fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk// Use of this source code is governed by a BSD-style license that can be 3fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk// found in the LICENSE file. 4fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk 5fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk#include "proxy_resolver_js_bindings.h" 6f5cf6e34aa6c6b061eb6f33f2f82c95177e16648Jason Monk#include "proxy_resolver_v8.h" 7fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk 8fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk#include <netdb.h> 9fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk#include <unistd.h> 10fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk#include <cstddef> 11fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk#include <memory> 12fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk#include <string> 13fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk 14fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk#include "net_util.h" 15fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk 16fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monknamespace net { 17fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk 18fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk// ProxyResolverJSBindings implementation. 19fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monkclass DefaultJSBindings : public ProxyResolverJSBindings { 20fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk public: 21fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk DefaultJSBindings() { 22fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk } 23fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk 24fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk // Handler for "myIpAddress()". 25fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk // TODO: Perhaps enumerate the interfaces directly, using 26fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk // getifaddrs(). 27fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk virtual bool MyIpAddress(std::string* first_ip_address) { 28fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk return MyIpAddressImpl(first_ip_address); 29fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk } 30fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk 31fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk // Handler for "myIpAddressEx()". 32fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk virtual bool MyIpAddressEx(std::string* ip_address_list) { 33fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk return MyIpAddressExImpl(ip_address_list); 34fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk } 35fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk 36fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk // Handler for "dnsResolve(host)". 37fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk virtual bool DnsResolve(const std::string& host, 38fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk std::string* first_ip_address) { 39fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk return DnsResolveImpl(host, first_ip_address); 40fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk } 41fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk 42fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk // Handler for "dnsResolveEx(host)". 43fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk virtual bool DnsResolveEx(const std::string& host, 44fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk std::string* ip_address_list) { 45fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk return DnsResolveExImpl(host, ip_address_list); 46fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk } 47fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk 48fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk private: 49fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk bool MyIpAddressImpl(std::string* first_ip_address) { 50fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk std::string my_hostname = GetHostName(); 51fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk if (my_hostname.empty()) 52fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk return false; 53fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk return DnsResolveImpl(my_hostname, first_ip_address); 54fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk } 55fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk 56fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk bool MyIpAddressExImpl(std::string* ip_address_list) { 57fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk std::string my_hostname = GetHostName(); 58fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk if (my_hostname.empty()) 59fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk return false; 60fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk return DnsResolveExImpl(my_hostname, ip_address_list); 61fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk } 62fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk 63fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk bool DnsResolveImpl(const std::string& host, 64fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk std::string* first_ip_address) { 65fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk struct hostent* he = gethostbyname(host.c_str()); 66fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk 67fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk if (he == NULL) { 68fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk return false; 69fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk } 70fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk *first_ip_address = std::string(he->h_addr); 71fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk return true; 72fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk } 73fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk 74fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk bool DnsResolveExImpl(const std::string& host, 75fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk std::string* ip_address_list) { 76fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk struct hostent* he = gethostbyname(host.c_str()); 77fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk 78fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk if (he == NULL) { 79fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk return false; 80fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk } 81fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk std::string address_list_str; 82fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk for (char** addr = &he->h_addr; *addr != NULL; ++addr) { 83fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk if (!address_list_str.empty()) 84fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk address_list_str += ";"; 85fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk const std::string address_string = std::string(*addr); 86fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk if (address_string.empty()) 87fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk return false; 88fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk address_list_str += address_string; 89fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk } 90fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk *ip_address_list = std::string(he->h_addr); 91fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk return true; 92fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk } 93fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk 94fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk std::string GetHostName() { 95fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk char buffer[256]; 96fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk if (gethostname(buffer, 256) != 0) { 97fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk buffer[0] = '\0'; 98fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk } 99fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk return std::string(buffer); 100fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk } 101fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk}; 102fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk 103fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk// static 104fc93418c483ce474a1f4888b50f92574a1b81be3Jason MonkProxyResolverJSBindings* ProxyResolverJSBindings::CreateDefault() { 105fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk return new DefaultJSBindings(); 106fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk} 107fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk 108fc93418c483ce474a1f4888b50f92574a1b81be3Jason Monk} // namespace net 109