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

Methods
B
N
P
S
T
Included Modules
Constants
DEFAULT_PORT = 21
 

A Default port of 21 for URI::FTP

COMPONENT = [ :scheme, :userinfo, :host, :port, :path, :typecode ].freeze
 

An Array of the available components for URI::FTP

TYPECODE = ['a', 'i', 'd'].freeze
 

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

TYPECODE_PREFIX = ';type='.freeze
 

Typecode prefix

';type='
Attributes
[R] typecode

typecode accessor

see URI::FTP::COMPONENT

Class Public methods
build(args)

Description

Creates a new URI::FTP object from components, with syntax checking.

The components accepted are userinfo, host, port, pathand 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 100
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
new(*arg)

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, queryand fragment, in that order.

# File lib/uri/ftp.rb, line 137
def initialize(*arg)
  raise InvalidURIError unless arg[5]
  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
new2(user, password, host, port, path, typecode = nil, arg_check = true)

alternate initialization Creates a new URI::FTP object.

Unlike build(), this method does not escape the path component as required by RFC1738; instead it is treated as per RFC2396.

Arguments are user, password, host, port, path, typecode, and arg_check, in that order.

# File lib/uri/ftp.rb, line 56
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 Public methods
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 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 238
def path
  return @path.sub(/^\//,'').sub(/^%2F/,'/')
end
to_s()
# File lib/uri/ftp.rb, line 247
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
typecode=(typecode)

Args

v

String

Description

public setter for the typecode v. (with validation)

see also URI::FTP.check_typecode

Usage

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 lib/uri/ftp.rb, line 206
def typecode=(typecode)
  check_typecode(typecode)
  set_typecode(typecode)
  typecode
end
Instance Protected methods
set_path(v)
# File lib/uri/ftp.rb, line 242
def set_path(v)
  super("/" + v.sub(/^\//, "%2F"))
end
set_typecode(v)

private setter for the typecode v

see also #typecode=

# File lib/uri/ftp.rb, line 177
def set_typecode(v)
  @typecode = v
end