mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	* 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:
		
							parent
							
								
									5c293c10e1
								
							
						
					
					
						commit
						b36f9a090d
					
				
					 2 changed files with 40 additions and 5 deletions
				
			
		| 
						 | 
				
			
			@ -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]
 | 
			
		||||
      }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue