diff options
-rw-r--r-- | lib/uri/generic.rb | 36 | ||||
-rw-r--r-- | test/uri/test_generic.rb | 17 |
2 files changed, 37 insertions, 16 deletions
diff --git a/lib/uri/generic.rb b/lib/uri/generic.rb index ffbd720dda..2a066a4cb6 100644 --- a/lib/uri/generic.rb +++ b/lib/uri/generic.rb @@ -10,6 +10,8 @@ # require 'uri/common' +autoload :IPSocket, 'socket' +autoload :IPAddr, 'ipaddr' module URI @@ -1527,7 +1529,6 @@ module URI end if self.hostname - require 'socket' begin addr = IPSocket.getaddress(self.hostname) return nil if /\A127\.|\A::1\z/ =~ addr @@ -1537,23 +1538,26 @@ module URI name = 'no_proxy' if no_proxy = env[name] || env[name.upcase] - no_proxy.scan(/(?!\.)([^:,\s]+)(?::(\d+))?/) {|host, port| - if (!port || self.port == port.to_i) - if /(\A|\.)#{Regexp.quote host}\z/i =~ self.host - return nil - elsif addr - require 'ipaddr' - return nil if - begin - IPAddr.new(host) - rescue IPAddr::InvalidAddressError - next - end.include?(addr) - end - end - } + return nil unless URI::Generic.use_proxy?(self.hostname, addr, self.port, no_proxy) end URI.parse(proxy_uri) end + + def self.use_proxy?(hostname, addr, port, no_proxy) # :nodoc: + no_proxy.scan(/(?!\.)([^:,\s]+)(?::(\d+))?/) {|p_host, p_port| + if !p_port || port == p_port.to_i + if /(\A|\.)#{Regexp.quote p_host}\z/i =~ hostname + return false + elsif addr + begin + return false if IPAddr.new(p_host).include?(addr) + rescue IPAddr::InvalidAddressError + next + end + end + end + } + true + end end end diff --git a/test/uri/test_generic.rb b/test/uri/test_generic.rb index 1a470a6d18..aa782db27e 100644 --- a/test/uri/test_generic.rb +++ b/test/uri/test_generic.rb @@ -906,6 +906,23 @@ class URI::TestGeneric < Test::Unit::TestCase } end + def test_use_proxy_p + [ + ['example.com', nil, 80, '', true], + ['example.com', nil, 80, 'example.com:80', false], + ['example.com', nil, 80, 'example.org,example.com:80,example.net', false], + ['foo.example.com', nil, 80, 'example.com', false], + ['foo.example.com', nil, 80, 'example.com:80', false], + ['foo.example.com', nil, 80, 'example.com:443', true], + ['127.0.0.1', '127.0.0.1', 80, '10.224.0.0/22', true], + ['10.224.1.1', '10.224.1.1', 80, '10.224.1.1', false], + ['10.224.1.1', '10.224.1.1', 80, '10.224.0.0/22', false], + ].each do |hostname, addr, port, no_proxy, expected| + assert_equal expected, URI::Generic.use_proxy?(hostname, addr, port, no_proxy), + "use_proxy?('#{hostname}', '#{addr}', #{port}, '#{no_proxy}')" + end + end + class CaseInsensitiveEnv def initialize(h={}) @h = {} |