aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog12
-rw-r--r--lib/uri/ftp.rb8
-rw-r--r--lib/uri/generic.rb4
3 files changed, 22 insertions, 2 deletions
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 <mame@tsg.ne.jp>
+
+ * 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 <akr@fsij.org>
* 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}"