OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/proxy/proxy_resolver_v8.h" | 5 #include "net/proxy/proxy_resolver_v8.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <cstdio> | 8 #include <cstdio> |
9 | 9 |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
327 // Both |address| and |prefix| must be of the same type (IPv4 or IPv6). | 327 // Both |address| and |prefix| must be of the same type (IPv4 or IPv6). |
328 if (address.size() != prefix.size()) | 328 if (address.size() != prefix.size()) |
329 return false; | 329 return false; |
330 | 330 |
331 DCHECK((address.size() == 4 && prefix.size() == 4) || | 331 DCHECK((address.size() == 4 && prefix.size() == 4) || |
332 (address.size() == 16 && prefix.size() == 16)); | 332 (address.size() == 16 && prefix.size() == 16)); |
333 | 333 |
334 return IPNumberMatchesPrefix(address, prefix, prefix_length_in_bits); | 334 return IPNumberMatchesPrefix(address, prefix, prefix_length_in_bits); |
335 } | 335 } |
336 | 336 |
| 337 // Consider only single component domains like 'foo' as plain host names. |
| 338 bool IsPlainHostName(const std::string& hostname_utf8) { |
| 339 if (hostname_utf8.find('.') != std::string::npos) |
| 340 return false; |
| 341 |
| 342 // IPv6 addresses may not contain periods, however are not be considered a |
| 343 // plain host name. |
| 344 IPAddressNumber unused; |
| 345 return !ParseIPLiteralToNumber(hostname_utf8, &unused); |
| 346 } |
| 347 |
337 } // namespace | 348 } // namespace |
338 | 349 |
339 // ProxyResolverV8::Context --------------------------------------------------- | 350 // ProxyResolverV8::Context --------------------------------------------------- |
340 | 351 |
341 class ProxyResolverV8::Context { | 352 class ProxyResolverV8::Context { |
342 public: | 353 public: |
343 Context(ProxyResolverV8* parent, v8::Isolate* isolate) | 354 Context(ProxyResolverV8* parent, v8::Isolate* isolate) |
344 : parent_(parent), | 355 : parent_(parent), |
345 isolate_(isolate) { | 356 isolate_(isolate) { |
346 DCHECK(isolate); | 357 DCHECK(isolate); |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
432 v8::Local<v8::FunctionTemplate> my_ip_address_template = | 443 v8::Local<v8::FunctionTemplate> my_ip_address_template = |
433 v8::FunctionTemplate::New(isolate_, &MyIpAddressCallback, v8_this); | 444 v8::FunctionTemplate::New(isolate_, &MyIpAddressCallback, v8_this); |
434 global_template->Set(ASCIILiteralToV8String(isolate_, "myIpAddress"), | 445 global_template->Set(ASCIILiteralToV8String(isolate_, "myIpAddress"), |
435 my_ip_address_template); | 446 my_ip_address_template); |
436 | 447 |
437 v8::Local<v8::FunctionTemplate> dns_resolve_template = | 448 v8::Local<v8::FunctionTemplate> dns_resolve_template = |
438 v8::FunctionTemplate::New(isolate_, &DnsResolveCallback, v8_this); | 449 v8::FunctionTemplate::New(isolate_, &DnsResolveCallback, v8_this); |
439 global_template->Set(ASCIILiteralToV8String(isolate_, "dnsResolve"), | 450 global_template->Set(ASCIILiteralToV8String(isolate_, "dnsResolve"), |
440 dns_resolve_template); | 451 dns_resolve_template); |
441 | 452 |
| 453 v8::Local<v8::FunctionTemplate> is_plain_host_name_template = |
| 454 v8::FunctionTemplate::New(isolate_, &IsPlainHostNameCallback, v8_this); |
| 455 global_template->Set(ASCIILiteralToV8String(isolate_, "isPlainHostName"), |
| 456 is_plain_host_name_template); |
| 457 |
442 // Microsoft's PAC extensions: | 458 // Microsoft's PAC extensions: |
443 | 459 |
444 v8::Local<v8::FunctionTemplate> dns_resolve_ex_template = | 460 v8::Local<v8::FunctionTemplate> dns_resolve_ex_template = |
445 v8::FunctionTemplate::New(isolate_, &DnsResolveExCallback, v8_this); | 461 v8::FunctionTemplate::New(isolate_, &DnsResolveExCallback, v8_this); |
446 global_template->Set(ASCIILiteralToV8String(isolate_, "dnsResolveEx"), | 462 global_template->Set(ASCIILiteralToV8String(isolate_, "dnsResolveEx"), |
447 dns_resolve_ex_template); | 463 dns_resolve_ex_template); |
448 | 464 |
449 v8::Local<v8::FunctionTemplate> my_ip_address_ex_template = | 465 v8::Local<v8::FunctionTemplate> my_ip_address_ex_template = |
450 v8::FunctionTemplate::New(isolate_, &MyIpAddressExCallback, v8_this); | 466 v8::FunctionTemplate::New(isolate_, &MyIpAddressExCallback, v8_this); |
451 global_template->Set(ASCIILiteralToV8String(isolate_, "myIpAddressEx"), | 467 global_template->Set(ASCIILiteralToV8String(isolate_, "myIpAddressEx"), |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
691 } | 707 } |
692 std::string ip_prefix = | 708 std::string ip_prefix = |
693 V8StringToUTF8(v8::Local<v8::String>::Cast(args[1])); | 709 V8StringToUTF8(v8::Local<v8::String>::Cast(args[1])); |
694 if (!base::IsStringASCII(ip_prefix)) { | 710 if (!base::IsStringASCII(ip_prefix)) { |
695 args.GetReturnValue().Set(false); | 711 args.GetReturnValue().Set(false); |
696 return; | 712 return; |
697 } | 713 } |
698 args.GetReturnValue().Set(IsInNetEx(ip_address, ip_prefix)); | 714 args.GetReturnValue().Set(IsInNetEx(ip_address, ip_prefix)); |
699 } | 715 } |
700 | 716 |
| 717 // V8 callback for when "isPlainHostName()" is invoked by the PAC script. |
| 718 static void IsPlainHostNameCallback( |
| 719 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 720 // Need at least 1 string arguments. |
| 721 if (args.Length() < 1 || args[0].IsEmpty() || !args[0]->IsString()) { |
| 722 args.GetIsolate()->ThrowException( |
| 723 v8::Exception::TypeError(ASCIIStringToV8String( |
| 724 args.GetIsolate(), "Requires 1 string parameter"))); |
| 725 return; |
| 726 } |
| 727 |
| 728 std::string hostname_utf8 = |
| 729 V8StringToUTF8(v8::Local<v8::String>::Cast(args[0])); |
| 730 args.GetReturnValue().Set(IsPlainHostName(hostname_utf8)); |
| 731 } |
| 732 |
701 mutable base::Lock lock_; | 733 mutable base::Lock lock_; |
702 ProxyResolverV8* parent_; | 734 ProxyResolverV8* parent_; |
703 v8::Isolate* isolate_; | 735 v8::Isolate* isolate_; |
704 v8::Persistent<v8::External> v8_this_; | 736 v8::Persistent<v8::External> v8_this_; |
705 v8::Persistent<v8::Context> v8_context_; | 737 v8::Persistent<v8::Context> v8_context_; |
706 }; | 738 }; |
707 | 739 |
708 // ProxyResolverV8 ------------------------------------------------------------ | 740 // ProxyResolverV8 ------------------------------------------------------------ |
709 | 741 |
710 ProxyResolverV8::ProxyResolverV8() | 742 ProxyResolverV8::ProxyResolverV8() |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
801 return 0; | 833 return 0; |
802 | 834 |
803 v8::Locker locked(g_proxy_resolver_isolate_->isolate()); | 835 v8::Locker locked(g_proxy_resolver_isolate_->isolate()); |
804 v8::Isolate::Scope isolate_scope(g_proxy_resolver_isolate_->isolate()); | 836 v8::Isolate::Scope isolate_scope(g_proxy_resolver_isolate_->isolate()); |
805 v8::HeapStatistics heap_statistics; | 837 v8::HeapStatistics heap_statistics; |
806 g_proxy_resolver_isolate_->isolate()->GetHeapStatistics(&heap_statistics); | 838 g_proxy_resolver_isolate_->isolate()->GetHeapStatistics(&heap_statistics); |
807 return heap_statistics.used_heap_size(); | 839 return heap_statistics.used_heap_size(); |
808 } | 840 } |
809 | 841 |
810 } // namespace net | 842 } // namespace net |
OLD | NEW |