Support for the Ruby 2.4 series has ended. See here for reference.
Generic
FTP
URI
syntax is defined by RFC1738 section 3.2.
This class will be redesigned because of difference of implementations; the structure of its path. draft-hoffman-ftp-uri-04 is a draft but it is a good summary about the de facto spec. tools.ietf.org/html/draft-hoffman-ftp-uri-04
An Array of the available components for URI::FTP
A Default port of 21 for URI::FTP
Typecode is “a”, “i” or “d”.
Typecode prefix
';type='
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
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=i uri2 = URI::FTP.build({:host => 'ftp.example.com', :path => 'ruby/src'}) puts uri2.to_s -> ftp://ftp.example.com/ruby/src
# File uri/ftp.rb, line 96 def self.build(args) # Fix the incoming path to be generic URL syntax # FTP path -> URL path # foo/bar /foo/bar # /foo/bar /%2Ffoo/bar # if args.kind_of?(Array) args[3] = '/' + args[3].sub(/^\//, '%2F') else args[:path] = '/' + args[:path].sub(/^\//, '%2F') end tmp = Util::make_components_hash(self, args) if tmp[:typecode] if tmp[:typecode].size == 1 tmp[:typecode] = TYPECODE_PREFIX + tmp[:typecode] end tmp[:path] << tmp[:typecode] end return super(tmp) 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 uri/ftp.rb, line 133 def initialize(scheme, userinfo, host, port, registry, path, opaque, query, fragment, parser = nil, arg_check = false) raise InvalidURIError unless path path = path.sub(/^\//,'') path.sub!(/^%2F/,'/') super(scheme, userinfo, host, port, registry, path, opaque, query, fragment, parser, arg_check) @typecode = nil if tmp = @path.index(TYPECODE_PREFIX) typecode = @path[tmp + TYPECODE_PREFIX.size..-1] @path = @path[0..tmp - 1] if arg_check self.typecode = typecode else self.set_typecode(typecode) end end 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 uri/ftp.rb, line 241 def path return @path.sub(/^\//,'').sub(/^%2F/,'/') end
Returns a String representation of the URI::FTP
# File uri/ftp.rb, line 252 def to_s save_path = nil if @typecode save_path = @path @path = @path + TYPECODE_PREFIX + @typecode end str = super if @typecode @path = save_path end return str end
v
String
public setter for the typecode v
. (with validation)
see also URI::FTP.check_typecode
require 'uri' uri = URI.parse("ftp://john@ftp.example.com/my_file.img") #=> #<URI::FTP:0x00000000923650 URL:ftp://john@ftp.example.com/my_file.img> uri.typecode = "i" # => "i" uri #=> #<URI::FTP:0x00000000923650 URL:ftp://john@ftp.example.com/my_file.img;type=i>
# File uri/ftp.rb, line 209 def typecode=(typecode) check_typecode(typecode) set_typecode(typecode) typecode end
Private setter for the path of the URI::FTP
# File uri/ftp.rb, line 246 def set_path(v) super("/" + v.sub(/^\//, "%2F")) end
Private setter for the typecode v
see also URI::FTP.typecode=
# File uri/ftp.rb, line 180 def set_typecode(v) @typecode = v end