Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(395)

Side by Side Diff: net/proxy/proxy_resolver_js_bindings.cc

Issue 333006: Add three of the six extensions to PAC that Internet Explorer supports. ... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: address more of wtc's comments Created 11 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. Use of this 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. Use of this
2 // source code is governed by a BSD-style license that can be found in the 2 // source code is governed by a BSD-style license that can be found in the
3 // LICENSE file. 3 // LICENSE file.
4 4
5 #include "build/build_config.h"
6
7 #if defined(OS_WIN)
8 #include <ws2tcpip.h>
9 #else
10 #include <netdb.h>
11 #endif
12
5 #include "net/proxy/proxy_resolver_js_bindings.h" 13 #include "net/proxy/proxy_resolver_js_bindings.h"
6 14
7 #include "base/compiler_specific.h" 15 #include "base/compiler_specific.h"
8 #include "base/logging.h" 16 #include "base/logging.h"
9 #include "base/message_loop.h" 17 #include "base/message_loop.h"
10 #include "base/waitable_event.h" 18 #include "base/waitable_event.h"
11 #include "net/base/address_list.h" 19 #include "net/base/address_list.h"
12 #include "net/base/host_resolver.h" 20 #include "net/base/host_resolver.h"
13 #include "net/base/net_errors.h" 21 #include "net/base/net_errors.h"
14 #include "net/base/net_util.h" 22 #include "net/base/net_util.h"
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 MessageLoop* host_resolver_loop) 98 MessageLoop* host_resolver_loop)
91 : host_resolver_(new SyncHostResolverBridge( 99 : host_resolver_(new SyncHostResolverBridge(
92 host_resolver, host_resolver_loop)) {} 100 host_resolver, host_resolver_loop)) {}
93 101
94 // Handler for "alert(message)". 102 // Handler for "alert(message)".
95 virtual void Alert(const std::string& message) { 103 virtual void Alert(const std::string& message) {
96 LOG(INFO) << "PAC-alert: " << message; 104 LOG(INFO) << "PAC-alert: " << message;
97 } 105 }
98 106
99 // Handler for "myIpAddress()". Returns empty string on failure. 107 // Handler for "myIpAddress()". Returns empty string on failure.
108 // TODO(eroman): Perhaps enumerate the interfaces directly, using
109 // getifaddrs().
100 virtual std::string MyIpAddress() { 110 virtual std::string MyIpAddress() {
101 // DnsResolve("") returns "", so no need to check for failure. 111 // DnsResolve("") returns "", so no need to check for failure.
102 return DnsResolve(GetHostName()); 112 return DnsResolve(GetHostName());
103 } 113 }
104 114
115 // Handler for "myIpAddressEx()". Returns empty string on failure.
116 virtual std::string MyIpAddressEx() {
117 return DnsResolveEx(GetHostName());
118 }
119
105 // Handler for "dnsResolve(host)". Returns empty string on failure. 120 // Handler for "dnsResolve(host)". Returns empty string on failure.
106 virtual std::string DnsResolve(const std::string& host) { 121 virtual std::string DnsResolve(const std::string& host) {
107 // TODO(eroman): Should this return our IP address, or fail, or
108 // simply be unspecified (works differently on windows and mac os x).
109 if (host.empty())
110 return std::string();
111
112 // Do a sync resolve of the hostname. 122 // Do a sync resolve of the hostname.
113 // Disable IPv6 results. We do this because Internet Explorer does it -- 123 // 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
114 // consequently a lot of existing PAC scripts assume they will only get 124 // consequently a lot of existing PAC scripts assume they will only get
115 // IPv4 results, and will misbehave if they get an IPv6 result. 125 // IPv4 results, and will misbehave if they get an IPv6 result.
116 // See http://crbug.com/24641 for more details. 126 // See http://crbug.com/24641 for more details.
117 net::AddressList address_list; 127 net::AddressList address_list;
118 int result = host_resolver_->Resolve(host, 128 int result = host_resolver_->Resolve(host,
119 ADDRESS_FAMILY_IPV4, 129 ADDRESS_FAMILY_IPV4,
120 &address_list); 130 &address_list);
121 131
122 if (result != OK) 132 if (result != OK)
123 return std::string(); // Failed. 133 return std::string(); // Failed.
124 134
125 if (!address_list.head()) 135 if (!address_list.head())
126 return std::string(); 136 return std::string();
127 137
128 // There may be multiple results; we will just use the first one. 138 // There may be multiple results; we will just use the first one.
129 // This returns empty string on failure. 139 // This returns empty string on failure.
130 return net::NetAddressToString(address_list.head()); 140 return net::NetAddressToString(address_list.head());
131 } 141 }
132 142
143 // Handler for "dnsResolveEx(host)". Returns empty string on failure.
144 virtual std::string DnsResolveEx(const std::string& host) {
145 // Do a sync resolve of the hostname.
146 net::AddressList address_list;
147 int result = host_resolver_->Resolve(host,
148 ADDRESS_FAMILY_UNSPECIFIED,
149 &address_list);
150
151 if (result != OK)
152 return std::string(); // Failed.
153
154 // Stringify all of the addresses in the address list, separated
155 // by semicolons.
156 std::string address_list_str;
157 const struct addrinfo* current_address = address_list.head();
158 while (current_address) {
159 if (!address_list_str.empty())
160 address_list_str += ";";
161 address_list_str += net::NetAddressToString(current_address);
162 current_address = current_address->ai_next;
163 }
164
165 return address_list_str;
166 }
167
133 // Handler for when an error is encountered. |line_number| may be -1. 168 // Handler for when an error is encountered. |line_number| may be -1.
134 virtual void OnError(int line_number, const std::string& message) { 169 virtual void OnError(int line_number, const std::string& message) {
135 if (line_number == -1) 170 if (line_number == -1)
136 LOG(INFO) << "PAC-error: " << message; 171 LOG(INFO) << "PAC-error: " << message;
137 else 172 else
138 LOG(INFO) << "PAC-error: " << "line: " << line_number << ": " << message; 173 LOG(INFO) << "PAC-error: " << "line: " << line_number << ": " << message;
139 } 174 }
140 175
141 private: 176 private:
142 scoped_refptr<SyncHostResolverBridge> host_resolver_; 177 scoped_refptr<SyncHostResolverBridge> host_resolver_;
143 }; 178 };
144 179
145 } // namespace 180 } // namespace
146 181
147 // static 182 // static
148 ProxyResolverJSBindings* ProxyResolverJSBindings::CreateDefault( 183 ProxyResolverJSBindings* ProxyResolverJSBindings::CreateDefault(
149 HostResolver* host_resolver, MessageLoop* host_resolver_loop) { 184 HostResolver* host_resolver, MessageLoop* host_resolver_loop) {
150 return new DefaultJSBindings(host_resolver, host_resolver_loop); 185 return new DefaultJSBindings(host_resolver, host_resolver_loop);
151 } 186 }
152 187
153 } // namespace net 188 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698