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