# class Bundler::URI::FTP

`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) click to toggle source

## 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:password@ftp.example.com/%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

    # 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

new(scheme, userinfo, host, port, registry, path, opaque, query, fragment, parser = nil, arg_check = false) click to toggle source

## 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

    # 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

### Public Instance Methods

path() click to toggle source

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”.

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

to_s() click to toggle source

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

Calls superclass method

    # 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

typecode=(typecode) click to toggle source

## 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://john@ftp.example.com/my_file.img")
    #=> #<Bundler::URI::FTP ftp://john@ftp.example.com/my_file.img>
    uri.typecode = "i"
    uri
    #=> #<Bundler::URI::FTP ftp://john@ftp.example.com/my_file.img;type=i>

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

### Protected Instance Methods

set_path(v) click to toggle source

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

Calls superclass method

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

set_typecode(v) click to toggle source

Private setter for the typecode `v`.

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

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

### Private Instance Methods

check_typecode(v) click to toggle source

Validates typecode `v`, returns `true` or `false`.

    # 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