Class: URI::FTP
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. tools.ietf.org/html/draft-hoffman-ftp-uri-04
Constant Summary collapse
- DEFAULT_PORT =
21
- COMPONENT =
[ :scheme, :userinfo, :host, :port, :path, :typecode ].freeze
- 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 =
';type='.freeze
Constants inherited from Generic
Constants included from URI
DEFAULT_PARSER, HTML5ASCIIINCOMPAT, TBLDECWWWCOMP_, TBLENCWWWCOMP_, VERSION, VERSION_CODE, WFKV_
Instance Attribute Summary collapse
-
#typecode ⇒ Object
Returns the value of attribute typecode.
Attributes inherited from Generic
#fragment, #host, #opaque, #port, #query, #registry, #scheme
Class Method Summary collapse
-
.build(args) ⇒ Object
Description.
- .new2(user, password, host, port, path, typecode = nil, arg_check = true) ⇒ Object
Instance Method Summary collapse
-
#initialize(*arg) ⇒ FTP
constructor
Description.
-
#merge(oth) ⇒ Object
:nodoc:.
-
#path ⇒ Object
Returns the path from an FTP URI.
- #to_s ⇒ Object
Methods inherited from Generic
#==, #absolute?, build2, #coerce, component, #component, #default_port, default_port, #eql?, #hash, #hierarchical?, #inspect, #merge!, #normalize, #normalize!, #parser, #password, #password=, #relative?, #route_from, #route_to, #select, use_registry, #user, #user=, #userinfo, #userinfo=
Methods included from URI
decode_www_form, decode_www_form_component, encode_www_form, encode_www_form_component, extract, join, parse, regexp, scheme_list, split
Methods included from Escape
Constructor Details
#initialize(*arg) ⇒ FTP
Description
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.
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
# File 'lib/extensions/uri/uri/ftp.rb', line 120 def initialize(*arg) arg[5] = arg[5].sub(/^\//,'').sub(/^%2F/,'/') super(*arg) @typecode = nil tmp = @path.index(TYPECODE_PREFIX) if tmp typecode = @path[tmp + TYPECODE_PREFIX.size..-1] @path = @path[0..tmp - 1] if arg[-1] self.typecode = typecode else self.set_typecode(typecode) end end end |
Instance Attribute Details
#typecode ⇒ Object
Returns the value of attribute typecode.
136 137 138 |
# File 'lib/extensions/uri/uri/ftp.rb', line 136 def typecode @typecode end |
Class Method Details
.build(args) ⇒ Object
Description
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:[email protected]/%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
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
# File 'lib/extensions/uri/uri/ftp.rb', line 83 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) ⇒ Object
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/extensions/uri/uri/ftp.rb', line 39 def self.new2(user, password, host, port, path, typecode = nil, arg_check = true) 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 Method Details
#merge(oth) ⇒ Object
:nodoc:
159 160 161 162 163 164 165 166 |
# File 'lib/extensions/uri/uri/ftp.rb', line 159 def merge(oth) # :nodoc: tmp = super(oth) if self != tmp tmp.set_typecode(oth.typecode) end return tmp end |
#path ⇒ Object
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”
185 186 187 |
# File 'lib/extensions/uri/uri/ftp.rb', line 185 def path return @path.sub(/^\//,'').sub(/^%2F/,'/') end |
#to_s ⇒ Object
194 195 196 197 198 199 200 201 202 203 204 205 206 |
# File 'lib/extensions/uri/uri/ftp.rb', line 194 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 |