Bug #4476 ยป 0001-lib-uri-generic.rb-route_from_path-Fix-a-bug-in-rela.patch
ChangeLog | ||
---|---|---|
Mon Mar 7 17:30:28 2011 Akinori MUSHA <knu@iDaemons.org>
|
||
* lib/uri/generic.rb (#route_from_path): Fix a bug in relative
|
||
route computation.
|
||
URI.parse('http://hoge/b/').route_to('http://hoge/b') should
|
||
return '../b' instead of './'.
|
||
Mon Mar 7 09:05:18 2011 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||
* process.c: NUM2RLIM is defined but no getrlimit and setrlimit on
|
lib/uri/generic.rb | ||
---|---|---|
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?
|
test/uri/test_generic.rb | ||
---|---|---|
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)
|
||