Class | URI::FTP |
In: |
lib/open-uri.rb
lib/uri/ftp.rb |
Parent: | Object |
DEFAULT_PORT | = | 21 | ||
COMPONENT | = | [ :scheme, :userinfo, :host, :port, :path, :typecode | ||
TYPECODE | = | ['a', 'i', 'd'].freeze | Typecode is "a", "i" or "d". | |
TYPECODE_PREFIX | = | ';type='.freeze |
typecode | [R] |
Creates a new URI::FTP object from components, with syntax checking.
The components accepted are userinfo, host, port, path and typecode.
The components should be provided either as an Array, or as a Hash with keys formed by preceding the component names with a colon.
If an Array is used, the components must be passed in the order [userinfo, host, port, path, typecode]
If the path supplied is absolute, it will be escaped in order to make it absolute in the URI. Examples:
require 'uri' uri = URI::FTP.build(['user:password', 'ftp.example.com', nil, '/path/file.> zip', 'i']) puts uri.to_s -> ftp://user:password@ftp.example.com/%2Fpath/file.zip;type=a uri2 = URI::FTP.build({:host => 'ftp.example.com', :path => 'ruby/src'}) puts uri2.to_s -> ftp://ftp.example.com/ruby/src
# File lib/uri/ftp.rb, line 78 78: def self.build(args) 79: 80: # Fix the incoming path to be generic URL syntax 81: # FTP path -> URL path 82: # foo/bar /foo/bar 83: # /foo/bar /%2Ffoo/bar 84: # 85: if args.kind_of?(Array) 86: args[3] = '/' + args[3].sub(/^\//, '%2F') 87: else 88: args[:path] = '/' + args[:path].sub(/^\//, '%2F') 89: end 90: 91: tmp = Util::make_components_hash(self, args) 92: 93: if tmp[:typecode] 94: if tmp[:typecode].size == 1 95: tmp[:typecode] = TYPECODE_PREFIX + tmp[:typecode] 96: end 97: tmp[:path] << tmp[:typecode] 98: end 99: 100: return super(tmp) 101: end
Creates a new URI::FTP object from generic URL components with no syntax checking.
Unlike build(), this method does not escape the path component as required by RFC1738; instead it is treated as per RFC2396.
Arguments are scheme, userinfo, host, port, registry, path, opaque, query and fragment, in that order.
# File lib/uri/ftp.rb, line 115 115: def initialize(*arg) 116: super(*arg) 117: @typecode = nil 118: tmp = @path.index(TYPECODE_PREFIX) 119: if tmp 120: typecode = @path[tmp + TYPECODE_PREFIX.size..-1] 121: self.set_path(@path[0..tmp - 1]) 122: 123: if arg[-1] 124: self.typecode = typecode 125: else 126: self.set_typecode(typecode) 127: end 128: end 129: end
# File lib/uri/ftp.rb, line 34 34: def self.new2(user, password, host, port, path, 35: typecode = nil, arg_check = true) 36: typecode = nil if typecode.size == 0 37: if typecode && !TYPECODE.include?(typecode) 38: raise ArgumentError, 39: "bad typecode is specified: #{typecode}" 40: end 41: 42: # do escape 43: 44: self.new('ftp', 45: [user, password], 46: host, port, nil, 47: typecode ? path + TYPECODE_PREFIX + typecode : path, 48: nil, nil, nil, arg_check) 49: end
Returns the path from an FTP URI.
RFC 1738 specifically states that the path for an FTP URI does not include the / which separates the URI path from the URI host. Example:
ftp://ftp.example.com/pub/ruby
The above URI indicates that the client should connect to ftp.example.com then cd pub/ruby from the initial login directory.
If you want to cd to an absolute directory, you must include an escaped / (%2F) in the path. Example:
ftp://ftp.example.com/%2Fpub/ruby
This method will then return "/pub/ruby"
# File lib/uri/ftp.rb, line 179 179: def path 180: return @path.sub(/^\//,'').sub(/^%2F/i,'/') 181: end
# File lib/uri/ftp.rb, line 183 183: def to_s 184: save_path = nil 185: if @typecode 186: save_path = @path 187: @path = @path + TYPECODE_PREFIX + @typecode 188: end 189: str = super 190: if @typecode 191: @path = save_path 192: end 193: 194: return str 195: end
# File lib/uri/ftp.rb, line 147 147: def typecode=(typecode) 148: check_typecode(typecode) 149: set_typecode(typecode) 150: typecode 151: end