Class: URI::FTP
Relationships & Source Files | |
Super Chains via Extension / Inclusion / Inheritance | |
Class Chain:
self,
Generic
|
|
Instance Chain:
|
|
Inherits: |
URI::Generic
|
Defined in: | lib/uri/ftp.rb |
Overview
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. datatracker.ietf.org/doc/html/draft-hoffman-ftp-uri-04
Constant Summary
-
COMPONENT =
An Array of the available components for
FTP
.[ :scheme, :userinfo, :host, :port, :path, :typecode ].freeze
-
DEFAULT_PORT =
A Default port of 21 for
FTP
.21
-
TYPECODE =
Typecode is “a”, “i”, or “d”.
-
“a” indicates a text file (the
FTP
command was ASCII) -
“i” indicates a binary file (FTP command IMAGE)
-
“d” indicates the contents of a directory should be displayed
['a', 'i', 'd'].freeze
-
-
TYPECODE_PREFIX =
Typecode prefix “;type=”.
';type='.freeze
::URI
- Included
DEFAULT_PARSER, INITIAL_SCHEMES, RFC2396_PARSER, RFC3986_PARSER, TBLDECWWWCOMP_, TBLENCURICOMP_, TBLENCWWWCOMP_, VERSION, VERSION_CODE, WEB_ENCODINGS_
Generic
- Inherited
Class Method Summary
-
.build(args)
Description.
-
.new(scheme, userinfo, host, port, registry, path, opaque, query, fragment, parser = nil, arg_check = false) ⇒ FTP
constructor
Description.
- .new2(user, password, host, port, path, typecode = nil, arg_check = true)
Generic
- Inherited
.build | Synopsis. |
.build2 | Synopsis. |
.component | Components of the |
.default_port | Returns default port. |
.new | Args. |
.use_proxy?, .use_registry |
Instance Attribute Summary
-
#typecode
rw
typecode accessor.
-
#typecode=(typecode)
rw
Args.
Generic
- Inherited
#absolute | Alias for Generic#absolute?. |
#fragment | Returns the fragment component of the |
#fragment= | Checks the fragment |
#hierarchical? | Returns true if |
#host | Returns the host component of the |
#host= | Args. |
#hostname | Extract the host part of the |
#hostname= | Sets the host part of the |
#opaque | Returns the opaque part of the |
#opaque= | Args. |
#password | Returns the password component (without |
#password= | Args. |
#path | Returns the path component of the |
#path= | Args. |
#port | Returns the port component of the |
#port= | Args. |
#query | Returns the query component of the |
#query= | Args. |
#registry=, | |
#relative? | Returns true if |
#scheme | Returns the scheme component of the |
#scheme= | Args. |
#user | Returns the user component (without |
#user= | Args. |
#userinfo | Returns the userinfo, either as ‘user’ or ‘user:password’. |
#userinfo= | Sets userinfo, argument is string like ‘name:pass’. |
#registry |
Instance Method Summary
-
#path
Returns the path from an
FTP
URI. -
#to_s
Returns a String representation of the
FTP
. -
#set_path(v)
protected
Private setter for the path of the
FTP
. -
#set_typecode(v)
protected
Private setter for the typecode
v
. -
#check_typecode(v)
private
Validates typecode
v
, returnstrue
orfalse
. - #merge(oth) Internal use only
Generic
- Inherited
#+ | Alias for Generic#merge. |
#- | Alias for Generic#route_from. |
#== | Compares two URIs. |
#absolute? | Returns true if |
#coerce | Args. |
#component | Components of the |
#decoded_password | Returns the password component after |
#decoded_user | Returns the user component after |
#default_port | Returns default port. |
#eql?, | |
#find_proxy | Returns a proxy |
#hash, #inspect, | |
#merge | Args. |
#merge! | Args. |
#normalize | Returns normalized |
#normalize! | Destructive version of |
#parser | Returns the parser to be used. |
#route_from | Args. |
#route_to | Args. |
#select | Args. |
#to_s | Constructs String from |
#to_str | Alias for Generic#to_s. |
#component_ary | Returns an Array of the components defined from the COMPONENT Array. |
#set_host | Protected setter for the host component |
#set_opaque | Protected setter for the opaque component |
#set_password | Protected setter for the password component |
#set_path | Protected setter for the path component |
#set_port | Protected setter for the port component |
#set_scheme | Protected setter for the scheme component |
#set_user | Protected setter for the user component |
#set_userinfo | Protected setter for the |
#check_host | Checks the host |
#check_opaque | Checks the opaque |
#check_password | Checks the password |
#check_path | Checks the path |
#check_port | Checks the port |
#check_scheme | Checks the scheme |
#check_user | Checks the user |
#check_userinfo | Checks the |
#escape_userpass | Escapes ‘user:password’ |
#merge_path | Merges a base path |
#replace! | Replaces self by other |
#route_from0, | |
#split_path | Returns an Array of the path split on ‘/’. |
#split_userinfo | Returns the userinfo |
#set_registry, #check_registry, #route_from_path |
Constructor Details
.new(scheme, userinfo, host, port, registry, path, opaque, query, fragment, parser = nil, arg_check = false) ⇒ FTP
Description
Creates a new 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 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
Class Method Details
.build(args)
Description
Creates a new 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'
uri1 = URI::FTP.build(['user:password', 'ftp.example.com', nil,
'/path/file.zip', 'i'])
uri1.to_s # => "ftp://user:password@ftp.example.com/%2Fpath/file.zip;type=i"
uri2 = URI::FTP.build({:host => 'ftp.example.com',
:path => 'ruby/src'})
uri2.to_s # => "ftp://ftp.example.com/ruby/src"
# File 'lib/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
.new2(user, password, host, port, path, typecode = nil, arg_check = true)
[ GitHub ]# File 'lib/uri/ftp.rb', line 47
def self.new2(user, password, host, port, path, typecode = nil, arg_check = true) # :nodoc: # Do not use this method! Not tested. [Bug #7301] # This methods remains just for compatibility, # Keep it undocumented until the active maintainer is assigned. typecode = nil if typecode.size == 0 if typecode && !TYPECODE.include?(typecode) raise ArgumentError, "bad typecode is specified: #{typecode}" end # do escape self.new('ftp', [user, password], host, port, nil, typecode ? path + TYPECODE_PREFIX + typecode : path, nil, nil, nil, arg_check) end
Instance Attribute Details
#typecode (rw)
typecode accessor.
See COMPONENT.
# File 'lib/uri/ftp.rb', line 161
attr_reader :typecode
#typecode=(typecode) (rw)
Args
v
-
String
Description
Public setter for the typecode v
(with validation).
See also #check_typecode.
Usage
require 'uri'
uri = URI.parse("ftp://john@ftp.example.com/my_file.img")
#=> #<URI::FTP ftp://john@ftp.example.com/my_file.img>
uri.typecode = "i"
uri
#=> #<URI::FTP ftp://john@ftp.example.com/my_file.img;type=i>
# File 'lib/uri/ftp.rb', line 208
def typecode=(typecode) check_typecode(typecode) set_typecode(typecode) typecode end
Instance Method Details
#check_typecode(v) (private)
Validates typecode v
, returns true
or false
.
# File 'lib/uri/ftp.rb', line 166
def check_typecode(v) if TYPECODE.include?(v) return true else raise InvalidComponentError, "bad typecode(expected #{TYPECODE.join(', ')}): #{v}" end end
#merge(oth)
# File 'lib/uri/ftp.rb', line 214
def merge(oth) # :nodoc: tmp = super(oth) if self != tmp tmp.set_typecode(oth.typecode) end return tmp end
#path
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 to 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 240
def path return @path.sub(/^\//,'').sub(/^%2F/,'/') end
#set_path(v) (protected)
Private setter for the path of the FTP
.
# File 'lib/uri/ftp.rb', line 245
def set_path(v) super("/" + v.sub(/^\//, "%2F")) end
#set_typecode(v) (protected)
Private setter for the typecode v
.
See also #typecode=.
# File 'lib/uri/ftp.rb', line 180
def set_typecode(v) @typecode = v end
#to_s
Returns a String representation of the FTP
.
# File 'lib/uri/ftp.rb', line 251
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