class Bundler::URI::FTP

Parent:
Generic

FTP Bundler::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

Constants

COMPONENT

An Array of the available components for Bundler::URI::FTP.

DEFAULT_PORT

A Default port of 21 for Bundler::URI::FTP.

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

TYPECODE_PREFIX

Typecode prefix “;type=”.

Attributes

typecode[R]

typecode accessor.

See Bundler::URI::FTP::COMPONENT.

Public Class Methods

build(args) Show source
# File lib/bundler/vendor/uri/lib/uri/ftp.rb, line 97
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

Description

Creates a new Bundler::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 Bundler::URI.

Examples:

require 'bundler/vendor/uri/lib/uri'

uri1 = Bundler::URI::FTP.build(['user:password', 'ftp.example.com', nil,
  '/path/file.zip', 'i'])
uri1.to_s  # => "ftp://user:[email protected]/%2Fpath/file.zip;type=i"

uri2 = Bundler::URI::FTP.build({:host => 'ftp.example.com',
  :path => 'ruby/src'})
uri2.to_s  # => "ftp://ftp.example.com/ruby/src"
Calls superclass method
new(scheme, userinfo, host, port, registry, path, opaque, query, fragment, parser = nil, arg_check = false) Show source
# File lib/bundler/vendor/uri/lib/uri/ftp.rb, line 134
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

Description

Creates a new Bundler::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.

Calls superclass method

Public Instance Methods

path() Show source
# File lib/bundler/vendor/uri/lib/uri/ftp.rb, line 241
def path
  return @path.sub(/^\//,'').sub(/^%2F/,'/')
end

Returns the path from an FTP Bundler::URI.

RFC 1738 specifically states that the path for an FTP Bundler::URI does not include the / which separates the Bundler::URI path from the Bundler::URI host. Example:

ftp://ftp.example.com/pub/ruby

The above Bundler::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”.

to_s() Show source
# File lib/bundler/vendor/uri/lib/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

Returns a String representation of the Bundler::URI::FTP.

Calls superclass method
typecode=(typecode) Show source
# File lib/bundler/vendor/uri/lib/uri/ftp.rb, line 209
def typecode=(typecode)
  check_typecode(typecode)
  set_typecode(typecode)
  typecode
end

Args

v

String

Description

Public setter for the typecode v (with validation).

See also Bundler::URI::FTP.check_typecode.

Usage

require 'bundler/vendor/uri/lib/uri'

uri = Bundler::URI.parse("ftp://[email protected]/my_file.img")
#=> #<Bundler::URI::FTP ftp://[email protected]/my_file.img>
uri.typecode = "i"
uri
#=> #<Bundler::URI::FTP ftp://[email protected]/my_file.img;type=i>

Protected Instance Methods

set_path(v) Show source
# File lib/bundler/vendor/uri/lib/uri/ftp.rb, line 246
def set_path(v)
  super("/" + v.sub(/^\//, "%2F"))
end

Private setter for the path of the Bundler::URI::FTP.

Calls superclass method
set_typecode(v) Show source
# File lib/bundler/vendor/uri/lib/uri/ftp.rb, line 181
def set_typecode(v)
  @typecode = v
end

Private setter for the typecode v.

See also Bundler::URI::FTP.typecode=.

Private Instance Methods

check_typecode(v) Show source
# File lib/bundler/vendor/uri/lib/uri/ftp.rb, line 167
def check_typecode(v)
  if TYPECODE.include?(v)
    return true
  else
    raise InvalidComponentError,
      "bad typecode(expected #{TYPECODE.join(', ')}): #{v}"
  end
end

Validates typecode v, returns true or false.

Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.