From ec7c76c446fcb7fafae2fa2f7eda78c2387fac23 Mon Sep 17 00:00:00 2001 From: naruse Date: Thu, 28 Sep 2017 10:51:31 +0000 Subject: URI::Generic: Separate no_proxy handling To share with Net::HTTP. see #11195 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60053 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/uri/generic.rb | 36 ++++++++++++++++++++---------------- 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 = {} -- cgit v1.2.3