* lib/open-uri.rb (URI::FTP#buffer_open): access mechanism

re-implemented according to RFC 1738.
  reported by Guillaume Marcais.  [ruby-talk:131650]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8003 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
akr 2005-02-19 15:53:43 +00:00
Родитель 5c293c10e1
Коммит b36f9a090d
2 изменённых файлов: 40 добавлений и 5 удалений

Просмотреть файл

@ -1,3 +1,9 @@
Sun Feb 20 00:48:48 2005 Tanaka Akira <akr@m17n.org>
* lib/open-uri.rb (URI::FTP#buffer_open): access mechanism
re-implemented according to RFC 1738.
reported by Guillaume Marcais. [ruby-talk:131650]
Sat Feb 19 18:46:56 2005 Masatoshi SEKI <m_seki@mva.biglobe.ne.jp>
* lib/drb/drb.rb (DRbObject#respond_to?): take two arguments.

Просмотреть файл

@ -634,17 +634,46 @@ module URI
return
end
require 'net/ftp'
directories = self.path.split(%r{/}, -1)
directories.shift if directories[0] == '' # strip a field before leading slash
directories.each {|d|
d.gsub!(/%([0-9A-Fa-f][0-9A-Fa-f])/) { [$1].pack("H2") }
}
unless filename = directories.pop
raise ArgumentError, "no filename: #{self.inspect}"
end
directories.each {|d|
if /[\r\n]/ =~ d
raise ArgumentError, "invalid directory: #{d.inspect}"
end
}
if /[\r\n]/ =~ filename
raise ArgumentError, "invalid filename: #{filename.inspect}"
end
typecode = self.typecode
if typecode && /\A[aid]\z/ !~ typecode
raise ArgumentError, "invalid typecode: #{typecode.inspect}"
end
# The access sequence is defined by RFC 1738
ftp = Net::FTP.open(self.host)
# todo: extract user/passwd from .netrc.
user = 'anonymous'
passwd = nil
user, passwd = self.userinfo.split(/:/) if self.userinfo
ftp = Net::FTP.open(self.host)
ftp.login(user, passwd)
if options[:content_length_proc]
options[:content_length_proc].call(ftp.size(self.path))
directories.each {|cwd|
ftp.voidcmd("CWD #{cwd}")
}
if typecode
# xxx: typecode D is not handled.
ftp.voidcmd("TYPE #{typecode.upcase}")
end
ftp.getbinaryfile(self.path, '/dev/null', Net::FTP::DEFAULT_BLOCKSIZE) {|str|
if options[:content_length_proc]
options[:content_length_proc].call(ftp.size(filename))
end
ftp.retrbinary("RETR #{filename}", 4096) { |str|
buf << str
options[:progress_proc].call(buf.size) if options[:progress_proc]
}