From 556e3da4216c926e71dea9ce4ea4a08dcfdc1275 Mon Sep 17 00:00:00 2001 From: nobu Date: Tue, 17 Jan 2017 12:54:35 +0000 Subject: [PATCH] uri/generic.rb: fix exception on non-IP format * lib/uri/generic.rb (URI::Generic#find_proxy): match IP address no_proxy against resolved self IP address. [Fix GH-1513] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57359 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/uri/generic.rb | 4 ++-- test/uri/test_generic.rb | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/lib/uri/generic.rb b/lib/uri/generic.rb index dcad27bc35..80d9616c1e 100644 --- a/lib/uri/generic.rb +++ b/lib/uri/generic.rb @@ -1531,14 +1531,14 @@ module URI if (!port || self.port == port.to_i) if /(\A|\.)#{Regexp.quote host}\z/i =~ self.host return nil - else + elsif addr require 'ipaddr' return nil if begin IPAddr.new(host) rescue IPAddr::InvalidAddressError next - end.include?(self.host) + end.include?(addr) end end } diff --git a/test/uri/test_generic.rb b/test/uri/test_generic.rb index b226b2278b..1a470a6d18 100644 --- a/test/uri/test_generic.rb +++ b/test/uri/test_generic.rb @@ -839,6 +839,31 @@ class URI::TestGeneric < Test::Unit::TestCase with_proxy_env('http_proxy'=>'http://127.0.0.1:8080', 'no_proxy'=>'192.0.2.2') {|env| assert_equal(URI('http://127.0.0.1:8080'), URI("http://192.0.2.1/").find_proxy(env)) assert_nil(URI("http://192.0.2.2/").find_proxy(env)) + + getaddress = IPSocket.method(:getaddress) + begin + class << IPSocket + undef getaddress + def getaddress(host) + host == "example.org" or raise + "192.0.2.1" + end + end + assert_equal(URI('http://127.0.0.1:8080'), URI.parse("http://example.org").find_proxy(env)) + class << IPSocket + undef getaddress + def getaddress(host) + host == "example.org" or raise + "192.0.2.2" + end + end + assert_nil(URI.parse("http://example.org").find_proxy(env)) + ensure + IPSocket.singleton_class.class_eval do + undef getaddress + define_method(:getaddress, getaddress) + end + end } with_proxy_env('http_proxy'=>'http://127.0.0.1:8080', 'no_proxy'=>'example.org') {|env| assert_nil(URI("http://example.org/").find_proxy(env))