diff --git a/ChangeLog b/ChangeLog index d89933fc4c..3bb2821a18 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +Thu Apr 15 22:33:35 2010 Yusuke Endoh + + * lib/uri/ftp.rb (URI::FTP#set_path): added to correct handling of + special case where path of ftp is relative. This converts relative + path to absolute one, because external representation of ftp path is + relative and internal representation is absolute. [ruby-core:24077] + + * lib/uri/ftp.rb (URI::FTP#initialize): converts absolute to relative. + + * lib/uri/generic.rb (URI::Generic#check_path): allow relative path + when scheme is ftp. + Thu Apr 15 21:54:39 2010 Tanaka Akira * tool/file2lastrev.rb: use backtick for ruby 1.8. diff --git a/lib/uri/ftp.rb b/lib/uri/ftp.rb index 1ffd9090a6..4e33dadd33 100644 --- a/lib/uri/ftp.rb +++ b/lib/uri/ftp.rb @@ -118,12 +118,13 @@ module URI # +opaque+, +query+ and +fragment+, in that order. # def initialize(*arg) + arg[5] = arg[5].sub(/^\//,'').sub(/^%2F/,'/') super(*arg) @typecode = nil tmp = @path.index(TYPECODE_PREFIX) if tmp typecode = @path[tmp + TYPECODE_PREFIX.size..-1] - self.set_path(@path[0..tmp - 1]) + @path = @path[0..tmp - 1] if arg[-1] self.typecode = typecode @@ -185,6 +186,11 @@ module URI return @path.sub(/^\//,'').sub(/^%2F/,'/') end + def set_path(v) + super("/" + v.sub(/^\//, "%2F")) + end + protected :set_path + def to_s save_path = nil if @typecode diff --git a/lib/uri/generic.rb b/lib/uri/generic.rb index 14ca97301b..4fdfd140fe 100644 --- a/lib/uri/generic.rb +++ b/lib/uri/generic.rb @@ -482,7 +482,9 @@ module URI "path conflicts with opaque" end - if @scheme + # If scheme is ftp, path may be relative. + # See RFC 1738 section 3.2.2, and RFC 2396. + if @scheme && @scheme != "ftp" if v && v != '' && parser.regexp[:ABS_PATH] !~ v raise InvalidComponentError, "bad component(expected absolute path component): #{v}"