From 176061e317b0285908fa360d8b28b6e0c6bb202a Mon Sep 17 00:00:00 2001 From: shyouhei Date: Fri, 20 May 2011 22:29:17 +0000 Subject: merge revision(s) 31578: * lib/uri/generic.rb (#route_from_path): Fix a bug where URI('http://h/b/').route_to('http://h/b') wrongly returned './' (should be '../b'). [Bug #4476] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@31578 b2dd03c8-39d4-4d8f-98ff-823fe69b080e Signed-off-by: URABE, Shyouhei git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@31666 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ lib/uri/generic.rb | 26 +++++++++++--------------- test/uri/test_generic.rb | 11 +++++++++++ version.h | 2 +- 4 files changed, 29 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index e326e783bc..fc06c9b16f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Sat May 21 04:55:15 2011 Akinori MUSHA + + * lib/uri/generic.rb (#route_from_path): Fix a bug where + URI('http://h/b/').route_to('http://h/b') wrongly returned './' + (should be '../b'). [Bug #4476] + Sat May 21 04:54:20 2011 Akinori MUSHA * lib/fileutils.rb (FileUtils#touch): Fix corrupted output. diff --git a/lib/uri/generic.rb b/lib/uri/generic.rb index c855d60610..a4b35854cb 100644 --- a/lib/uri/generic.rb +++ b/lib/uri/generic.rb @@ -799,30 +799,26 @@ module URI private :merge0 def route_from_path(src, dst) - # RFC2396, Section 4.2 - return '' if src == dst - - src_path = split_path(src) - dst_path = split_path(dst) - - # hmm... dst has abnormal absolute path, - # like "/./", "/../", "/x/../", ... - if dst_path.include?('..') || - dst_path.include?('.') + case dst + when src + # RFC2396, Section 4.2 + return '' + when %r{(?:\A|/)\.\.?(?:/|\z)} + # dst has abnormal absolute path, + # like "/./", "/../", "/x/../", ... return dst.dup end - src_path.pop + src_path = src.scan(%r{(?:\A|[^/]+)/}) + dst_path = dst.scan(%r{(?:\A|[^/]+)/?}) # discard same parts - while dst_path.first == src_path.first - break if dst_path.empty? - + while !dst_path.empty? && dst_path.first == src_path.first src_path.shift dst_path.shift end - tmp = dst_path.join('/') + tmp = dst_path.join # calculate if src_path.empty? diff --git a/test/uri/test_generic.rb b/test/uri/test_generic.rb index 5cd4c7f7ae..67d6aa1333 100644 --- a/test/uri/test_generic.rb +++ b/test/uri/test_generic.rb @@ -231,8 +231,19 @@ class TestGeneric < Test::Unit::TestCase url = URI.parse('http://hoge/a/b/').route_to('http://MOGE/b/') assert_equal('//MOGE/b/', url.to_s) + url = URI.parse('http://hoge/b').route_to('http://hoge/b/') + assert_equal('b/', url.to_s) + url = URI.parse('http://hoge/b/a').route_to('http://hoge/b/') + assert_equal('./', url.to_s) + url = URI.parse('http://hoge/b/').route_to('http://hoge/b') + assert_equal('../b', url.to_s) + url = URI.parse('http://hoge/b').route_to('http://hoge/b:c') + assert_equal('./b:c', url.to_s) + url = URI.parse('file:///a/b/').route_to('file:///a/b/') assert_equal('', url.to_s) + url = URI.parse('file:///a/b/').route_to('file:///a/b') + assert_equal('../b', url.to_s) url = URI.parse('mailto:foo@example.com').route_to('mailto:foo@example.com#bar') assert_equal('#bar', url.to_s) diff --git a/version.h b/version.h index b48e4bce1c..4d3f1e25c9 100644 --- a/version.h +++ b/version.h @@ -2,7 +2,7 @@ #define RUBY_RELEASE_DATE "2011-05-21" #define RUBY_VERSION_CODE 187 #define RUBY_RELEASE_CODE 20110521 -#define RUBY_PATCHLEVEL 343 +#define RUBY_PATCHLEVEL 344 #define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MINOR 8 -- cgit v1.2.3