class Bundler::URI::Generic


Implements generic Bundler::URI syntax as per RFC 2396.
Base class for all Bundler::URI classes.

def self.build(args)


See ::new for hash keys to use or for order of array items.
opaque, query, and fragment. You can provide arguments either by an Array or a Hash.
with check. Components are: scheme, userinfo, host, port, registry, path,
Creates a new Bundler::URI::Generic instance from components of Bundler::URI::Generic

== Description

See ::new.

== Synopsis
def self.build(args)
  if args.kind_of?(Array) &&
      args.size == ::Bundler::URI::Generic::COMPONENT.size
    tmp = args.dup
  elsif args.kind_of?(Hash)
    tmp = ::Bundler::URI::Generic::COMPONENT.collect do |c|
      if args.include?(c)
        args[c]
      else
        nil
      end
    end
  else
    component = self.class.component rescue ::Bundler::URI::Generic::COMPONENT
    raise ArgumentError,
    "expected Array of or Hash of components of #{self.class} (#{component.join(', ')})"
  end
  tmp << nil
  tmp << true
  return self.new(*tmp)
end

def self.build2(args)


then it does Bundler::URI::Escape.escape all Bundler::URI components and tries again.
Bundler::URI::Generic::build. But, if exception Bundler::URI::InvalidComponentError is raised,
At first, tries to create a new Bundler::URI::Generic instance using

== Description

See ::new.

== Synopsis
def self.build2(args)
  begin
    return self.build(args)
  rescue InvalidComponentError
    if args.kind_of?(Array)
      return self.build(args.collect{|x|
        if x.is_a?(String)
          DEFAULT_PARSER.escape(x)
        else
          x
        end
      })
    elsif args.kind_of?(Hash)
      tmp = {}
      args.each do |key, value|
        tmp[key] = if value
            DEFAULT_PARSER.escape(value)
          else
            value
          end
      end
      return self.build(tmp)
    end
  end
end

def self.component


Components of the Bundler::URI in the order.
def self.component
  self::COMPONENT
end

def self.default_port


Returns default port.
def self.default_port
  self::DEFAULT_PORT
end

def self.use_proxy?(hostname, addr, port, no_proxy) # :nodoc:

:nodoc:
def self.use_proxy?(hostname, addr, port, no_proxy) # :nodoc:
  hostname = hostname.downcase
  dothostname = ".#{hostname}"
  no_proxy.scan(/([^:,\s]+)(?::(\d+))?/) {|p_host, p_port|
    if !p_port || port == p_port.to_i
      if p_host.start_with?('.')
        return false if hostname.end_with?(p_host.downcase)
      else
        return false if dothostname.end_with?(".#{p_host.downcase}")
      end
      if addr
        begin
          return false if IPAddr.new(p_host).include?(addr)
        rescue IPAddr::InvalidAddressError
          next
        end
      end
    end
  }
  true
end

def self.use_registry # :nodoc:

:nodoc:
def self.use_registry # :nodoc:
  self::USE_REGISTRY
end

def ==(oth)


Compares two URIs.
def ==(oth)
  if self.class == oth.class
    self.normalize.component_ary == oth.normalize.component_ary
  else
    false
  end
end

def absolute?


Returns true if Bundler::URI has a scheme (e.g. http:// or https://) specified.
def absolute?
  if @scheme
    true
  else
    false
  end
end

def check_host(v)


with a host component defined.
Can not have a registry or opaque component defined,

and against the Bundler::URI::Parser Regexp for :HOST.
Checks the host +v+ component for RFC2396 compliance
def check_host(v)
  return v unless v
  if @opaque
    raise InvalidURIError,
      "can not set host with registry or opaque"
  elsif parser.regexp[:HOST] !~ v
    raise InvalidComponentError,
      "bad component(expected host component): #{v}"
  end
  return true
end

def check_opaque(v)


with an opaque component defined.
Can not have a host, port, user, or path component defined,

against the Bundler::URI::Parser Regexp for :OPAQUE.
Checks the opaque +v+ component for RFC2396 compliance and
def check_opaque(v)
  return v unless v
  # raise if both hier and opaque are not nil, because:
  # absoluteURI   = scheme ":" ( hier_part | opaque_part )
  # hier_part     = ( net_path | abs_path ) [ "?" query ]
  if @host || @port || @user || @path  # userinfo = @user + ':' + @password
    raise InvalidURIError,
      "can not set opaque with host, port, userinfo or path"
  elsif v && parser.regexp[:OPAQUE] !~ v
    raise InvalidComponentError,
      "bad component(expected opaque component): #{v}"
  end
  return true
end

def check_password(v, user = @user)


with a user component defined.
Can not have a registry or opaque component defined,

and against the Bundler::URI::Parser Regexp for :USERINFO.
Checks the password +v+ component for RFC2396 compliance
def check_password(v, user = @user)
  if @opaque
    raise InvalidURIError,
      "can not set password with opaque"
  end
  return v unless v
  if !user
    raise InvalidURIError,
      "password component depends user component"
  end
  if parser.regexp[:USERINFO] !~ v
    raise InvalidComponentError,
      "bad password component"
  end
  return true
end

def check_path(v)


with a path component defined.
Can not have a opaque component defined,

for :ABS_PATH and :REL_PATH.
and against the Bundler::URI::Parser Regexp
Checks the path +v+ component for RFC2396 compliance
def check_path(v)
  # raise if both hier and opaque are not nil, because:
  # absoluteURI   = scheme ":" ( hier_part | opaque_part )
  # hier_part     = ( net_path | abs_path ) [ "?" query ]
  if v && @opaque
    raise InvalidURIError,
      "path conflicts with opaque"
  end
  # If scheme is ftp, path may be relative.
  # See RFC 1738 section 3.2.2, and RFC 2396.
  if @scheme && @scheme != "ftp"
    if v && v != '' && parser.regexp[:ABS_PATH] !~ v
      raise InvalidComponentError,
        "bad component(expected absolute path component): #{v}"
    end
  else
    if v && v != '' && parser.regexp[:ABS_PATH] !~ v &&
       parser.regexp[:REL_PATH] !~ v
      raise InvalidComponentError,
        "bad component(expected relative path component): #{v}"
    end
  end
  return true
end

def check_port(v)


with a port component defined.
Can not have a registry or opaque component defined,

and against the Bundler::URI::Parser Regexp for :PORT.
Checks the port +v+ component for RFC2396 compliance
def check_port(v)
  return v unless v
  if @opaque
    raise InvalidURIError,
      "can not set port with registry or opaque"
  elsif !v.kind_of?(Integer) && parser.regexp[:PORT] !~ v
    raise InvalidComponentError,
      "bad component(expected port component): #{v.inspect}"
  end
  return true
end

def check_registry(v) # :nodoc:

:nodoc:
def check_registry(v) # :nodoc:
  raise InvalidURIError, "can not set registry"
end

def check_scheme(v)


Checks the scheme +v+ component against the Bundler::URI::Parser Regexp for :SCHEME.
def check_scheme(v)
  if v && parser.regexp[:SCHEME] !~ v
    raise InvalidComponentError,
      "bad component(expected scheme component): #{v}"
  end
  return true
end

def check_user(v)


with a user component defined.
Can not have a registry or opaque component defined,

and against the Bundler::URI::Parser Regexp for :USERINFO.
Checks the user +v+ component for RFC2396 compliance
def check_user(v)
  if @opaque
    raise InvalidURIError,
      "can not set user with opaque"
  end
  return v unless v
  if parser.regexp[:USERINFO] !~ v
    raise InvalidComponentError,
      "bad component(expected userinfo component or user component): #{v}"
  end
  return true
end

def check_userinfo(user, password = nil)


See also Bundler::URI::Generic.check_user, Bundler::URI::Generic.check_password.

pull +user+ and +password.
split, using Bundler::URI::Generic.split_userinfo, to
If +password+ is not provided, then +user+ is

Checks the +user+ and +password+.
def check_userinfo(user, password = nil)
  if !password
    user, password = split_userinfo(user)
  end
  check_user(user)
  check_password(password, user)
  return true
end

def coerce(oth)


#=> [#, #]
uri.coerce("http://foo.com")
uri = Bundler::URI.parse("http://my.example.com")

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

== Usage

returns [parsed_oth, self].
Attempts to parse other Bundler::URI +oth+,

== Description

Bundler::URI or String
+v+::

== Args
def coerce(oth)
  case oth
  when String
    oth = parser.parse(oth)
  else
    super
  end
  return oth, self
end

def component


Components of the Bundler::URI in the order.
def component
  self.class.component
end

def component_ary

Returns an Array of the components defined from the COMPONENT Array.
def component_ary
  component.collect do |x|
    self.send(x)
  end
end

def default_port


Returns default port.
def default_port
  self.class.default_port
end

def eql?(oth)

def eql?(oth)
  self.class == oth.class &&
  parser == oth.parser &&
  self.component_ary.eql?(oth.component_ary)
end

def escape_userpass(v)

Escapes 'user:password' +v+ based on RFC 1738 section 3.1.
def escape_userpass(v)
  parser.escape(v, /[@:\/]/o) # RFC 1738 section 3.1 #/
end

def find_proxy(env=ENV)

CGI_HTTP_PROXY can be used instead.
http_proxy is not used too if the variable is case insensitive.
So HTTP_PROXY is not used.
It's because HTTP_PROXY may be set by Proxy: header.
But http_proxy and HTTP_PROXY is treated specially under CGI environment.

are examined, too.
Note that capitalized variables (HTTP_PROXY, FTP_PROXY, NO_PROXY, etc.)

If the optional parameter +env+ is specified, it is used instead of ENV.

If there is no proper proxy, nil is returned.
ftp_proxy, no_proxy, etc.
The proxy Bundler::URI is obtained from environment variables such as http_proxy,
Returns a proxy Bundler::URI.
def find_proxy(env=ENV)
  raise BadURIError, "relative Bundler::URI: #{self}" if self.relative?
  name = self.scheme.downcase + '_proxy'
  proxy_uri = nil
  if name == 'http_proxy' && env.include?('REQUEST_METHOD') # CGI?
    # HTTP_PROXY conflicts with *_proxy for proxy settings and
    # HTTP_* for header information in CGI.
    # So it should be careful to use it.
    pairs = env.reject {|k, v| /\Ahttp_proxy\z/i !~ k }
    case pairs.length
    when 0 # no proxy setting anyway.
      proxy_uri = nil
    when 1
      k, _ = pairs.shift
      if k == 'http_proxy' && env[k.upcase] == nil
        # http_proxy is safe to use because ENV is case sensitive.
        proxy_uri = env[name]
      else
        proxy_uri = nil
      end
    else # http_proxy is safe to use because ENV is case sensitive.
      proxy_uri = env.to_hash[name]
    end
    if !proxy_uri
      # Use CGI_HTTP_PROXY.  cf. libwww-perl.
      proxy_uri = env["CGI_#{name.upcase}"]
    end
  elsif name == 'http_proxy'
    unless proxy_uri = env[name]
      if proxy_uri = env[name.upcase]
        warn 'The environment variable HTTP_PROXY is discouraged.  Use http_proxy.', uplevel: 1
      end
    end
  else
    proxy_uri = env[name] || env[name.upcase]
  end
  if proxy_uri.nil? || proxy_uri.empty?
    return nil
  end
  if self.hostname
    begin
      addr = IPSocket.getaddress(self.hostname)
      return nil if /\A127\.|\A::1\z/ =~ addr
    rescue SocketError
    end
  end
  name = 'no_proxy'
  if no_proxy = env[name] || env[name.upcase]
    return nil unless Bundler::URI::Generic.use_proxy?(self.hostname, addr, self.port, no_proxy)
  end
  Bundler::URI.parse(proxy_uri)
end

def fragment=(v)


uri.to_s #=> "http://my.example.com/?id=25#time=1305212086"
uri.fragment = "time=1305212086"
uri = Bundler::URI.parse("http://my.example.com/?id=25#time=1305212049")

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

== Usage

(with validation).
Public setter for the fragment component +v+

== Description

String
+v+::

== Args


Checks the fragment +v+ component against the Bundler::URI::Parser Regexp for :FRAGMENT.
def fragment=(v)
  return @fragment = nil unless v
  x = v.to_str
  v = x.dup if x.equal? v
  v.encode!(Encoding::UTF_8) rescue nil
  v.delete!("\t\r\n")
  v.force_encoding(Encoding::ASCII_8BIT)
  v.gsub!(/(?!%\h\h|[!-~])./n){'%%%02X' % $&.ord}
  v.force_encoding(Encoding::US_ASCII)
  @fragment = v
end

def hash

def hash
  self.component_ary.hash
end

def hierarchical?


#=> false
uri.hierarchical?
uri = Bundler::URI.parse("mailto:joe@example.com")
#=> true
uri.hierarchical?
uri = Bundler::URI.parse("http://my.example.com/")

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

== Usage

see RFC3986 https://tools.ietf.org/html/rfc3986 1.2.3.
Bundler::URI has components listed in order of decreasing significance from left to right,

== Description

Returns true if Bundler::URI is hierarchical.
def hierarchical?
  if @path
    true
  else
    false
  end
end

def host=(v)


uri.to_s #=> "http://foo.com"
uri.host = "foo.com"
uri = Bundler::URI.parse("http://my.example.com")

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

== Usage

See also Bundler::URI::Generic.check_host.

(with validation).
Public setter for the host component +v+

== Description

String
+v+::

== Args
def host=(v)
  check_host(v)
  set_host(v)
  v
end

def hostname


uri.host #=> "[::1]"
uri.hostname #=> "::1"
uri = Bundler::URI("http://[::1]/bar")

brackets for IPv6 (and future IP) addresses are removed.
This method is the same as Bundler::URI::Generic#host except

Extract the host part of the Bundler::URI and unwrap brackets for IPv6 addresses.
def hostname
  v = self.host
  /\A\[(.*)\]\z/ =~ v ? $1 : v
end

def hostname=(v)


it is wrapped with brackets.
If the argument seems to be an IPv6 address,

uri.to_s #=> "http://[::1]/bar"
uri.hostname = "::1"
uri = Bundler::URI("http://foo/bar")

the argument can be a bare IPv6 address.
This method is the same as Bundler::URI::Generic#host= except

Sets the host part of the Bundler::URI as the argument with brackets for IPv6 addresses.
def hostname=(v)
  v = "[#{v}]" if /\A\[.*\]\z/ !~ v && /:/ =~ v
  self.host = v
end

def initialize(scheme,


Creates a new Bundler::URI::Generic instance from ``generic'' components without check.

== Description

Check arguments [false by default].
+arg_check+::
Parser for internal use [Bundler::URI::DEFAULT_PARSER by default].
+parser+::
Part of the Bundler::URI after '#' character.
+fragment+::
Query data.
+query+::
Opaque part.
+opaque+::
Path on server.
+path+::
Registry of naming authorities.
+registry+::
Server port.
+port+::
Server host name.
+host+::
User name and password, i.e. 'sdmitry:bla'.
+userinfo+::
Protocol scheme, i.e. 'http','ftp','mailto' and so on.
+scheme+::

== Args
def initialize(scheme,
               userinfo, host, port, registry,
               path, opaque,
               query,
               fragment,
               parser = DEFAULT_PARSER,
               arg_check = false)
  @scheme = nil
  @user = nil
  @password = nil
  @host = nil
  @port = nil
  @path = nil
  @query = nil
  @opaque = nil
  @fragment = nil
  @parser = parser == DEFAULT_PARSER ? nil : parser
  if arg_check
    self.scheme = scheme
    self.userinfo = userinfo
    self.hostname = host
    self.port = port
    self.path = path
    self.query = query
    self.opaque = opaque
    self.fragment = fragment
  else
    self.set_scheme(scheme)
    self.set_userinfo(userinfo)
    self.set_host(host)
    self.set_port(port)
    self.set_path(path)
    self.query = query
    self.set_opaque(opaque)
    self.fragment=(fragment)
  end
  if registry
    raise InvalidURIError,
      "the scheme #{@scheme} does not accept registry part: #{registry} (or bad hostname?)"
  end
  @scheme&.freeze
  self.set_path('') if !@path && !@opaque # (see RFC2396 Section 5.2)
  self.set_port(self.default_port) if self.default_port && !@port
end

def inspect

def inspect
  "#<#{self.class} #{self}>"
end

def merge(oth)


# => "http://my.example.com/main.rbx?page=1"
uri.merge("/main.rbx?page=1")
uri = Bundler::URI.parse("http://my.example.com")

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

== Usage

Merges two URIs.

== Description

Bundler::URI or String
+oth+::

== Args
def merge(oth)
  rel = parser.send(:convert_to_uri, oth)
  if rel.absolute?
    #raise BadURIError, "both Bundler::URI are absolute" if absolute?
    # hmm... should return oth for usability?
    return rel
  end
  unless self.absolute?
    raise BadURIError, "both Bundler::URI are relative"
  end
  base = self.dup
  authority = rel.userinfo || rel.host || rel.port
  # RFC2396, Section 5.2, 2)
  if (rel.path.nil? || rel.path.empty?) && !authority && !rel.query
    base.fragment=(rel.fragment) if rel.fragment
    return base
  end
  base.query = nil
  base.fragment=(nil)
  # RFC2396, Section 5.2, 4)
  if !authority
    base.set_path(merge_path(base.path, rel.path)) if base.path && rel.path
  else
    # RFC2396, Section 5.2, 4)
    base.set_path(rel.path) if rel.path
  end
  # RFC2396, Section 5.2, 7)
  base.set_userinfo(rel.userinfo) if rel.userinfo
  base.set_host(rel.host)         if rel.host
  base.set_port(rel.port)         if rel.port
  base.query = rel.query       if rel.query
  base.fragment=(rel.fragment) if rel.fragment
  return base
end # merge

def merge!(oth)


uri.to_s # => "http://my.example.com/main.rbx?page=1"
uri.merge!("/main.rbx?page=1")
uri = Bundler::URI.parse("http://my.example.com")

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

== Usage

Destructive form of #merge.

== Description

Bundler::URI or String
+oth+::

== Args
def merge!(oth)
  t = merge(oth)
  if self == t
    nil
  else
    replace!(t)
    self
  end
end

def merge_path(base, rel)


returns a modified base path.
Merges a base path +base+, with relative path +rel+,
def merge_path(base, rel)
  # RFC2396, Section 5.2, 5)
  # RFC2396, Section 5.2, 6)
  base_path = split_path(base)
  rel_path  = split_path(rel)
  # RFC2396, Section 5.2, 6), a)
  base_path << '' if base_path.last == '..'
  while i = base_path.index('..')
    base_path.slice!(i - 1, 2)
  end
  if (first = rel_path.first) and first.empty?
    base_path.clear
    rel_path.shift
  end
  # RFC2396, Section 5.2, 6), c)
  # RFC2396, Section 5.2, 6), d)
  rel_path.push('') if rel_path.last == '.' || rel_path.last == '..'
  rel_path.delete('.')
  # RFC2396, Section 5.2, 6), e)
  tmp = []
  rel_path.each do |x|
    if x == '..' &&
        !(tmp.empty? || tmp.last == '..')
      tmp.pop
    else
      tmp << x
    end
  end
  add_trailer_slash = !tmp.empty?
  if base_path.empty?
    base_path = [''] # keep '/' for root directory
  elsif add_trailer_slash
    base_path.pop
  end
  while x = tmp.shift
    if x == '..'
      # RFC2396, Section 4
      # a .. or . in an absolute path has no special meaning
      base_path.pop if base_path.size > 1
    else
      # if x == '..'
      #   valid absolute (but abnormal) path "/../..."
      # else
      #   valid absolute path
      # end
      base_path << x
      tmp.each {|t| base_path << t}
      add_trailer_slash = false
      break
    end
  end
  base_path.push('') if add_trailer_slash
  return base_path.join('/')
end

def normalize


* an empty path component is set to "/".
* scheme and host are converted to lowercase,

Normalization here means:

#=> #
Bundler::URI("HTTP://my.EXAMPLE.com").normalize

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

Returns normalized Bundler::URI.
def normalize
  uri = dup
  uri.normalize!
  uri
end

def normalize!


Destructive version of #normalize.
def normalize!
  if path&.empty?
    set_path('/')
  end
  if scheme && scheme != scheme.downcase
    set_scheme(self.scheme.downcase)
  end
  if host && host != host.downcase
    set_host(self.host.downcase)
  end
end

def opaque=(v)


See also Bundler::URI::Generic.check_opaque.

(with validation).
Public setter for the opaque component +v+

== Description

String
+v+::

== Args
def opaque=(v)
  check_opaque(v)
  set_opaque(v)
  v
end

def parser


Unless a Bundler::URI::Parser is defined, DEFAULT_PARSER is used.

Returns the parser to be used.
def parser
  if !defined?(@parser) || !@parser
    DEFAULT_PARSER
  else
    @parser || DEFAULT_PARSER
  end
end

def password

Returns the password component.
def password
  @password
end

def password=(password)


uri.to_s #=> "http://john:V3ry_S3nsit1ve@my.example.com"
uri.password = "V3ry_S3nsit1ve"
uri = Bundler::URI.parse("http://john:S3nsit1ve@my.example.com")

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

== Usage

See also Bundler::URI::Generic.check_password.

(with validation).
Public setter for the +password+ component

== Description

String
+v+::

== Args
def password=(password)
  check_password(password)
  set_password(password)
  # returns password
end

def path=(v)


uri.to_s #=> "http://my.example.com/faq/"
uri.path = "/faq/"
uri = Bundler::URI.parse("http://my.example.com/pub/files")

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

== Usage

See also Bundler::URI::Generic.check_path.

(with validation).
Public setter for the path component +v+

== Description

String
+v+::

== Args
def path=(v)
  check_path(v)
  set_path(v)
  v
end

def port=(v)


uri.to_s #=> "http://my.example.com:8080"
uri.port = 8080
uri = Bundler::URI.parse("http://my.example.com")

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

== Usage

See also Bundler::URI::Generic.check_port.

(with validation).
Public setter for the port component +v+

== Description

String
+v+::

== Args
def port=(v)
  check_port(v)
  set_port(v)
  port
end

def query=(v)


uri.to_s #=> "http://my.example.com/?id=1"
uri.query = "id=1"
uri = Bundler::URI.parse("http://my.example.com/?id=25")

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

== Usage

Public setter for the query component +v+.

== Description

String
+v+::

== Args
def query=(v)
  return @query = nil unless v
  raise InvalidURIError, "query conflicts with opaque" if @opaque
  x = v.to_str
  v = x.dup if x.equal? v
  v.encode!(Encoding::UTF_8) rescue nil
  v.delete!("\t\r\n")
  v.force_encoding(Encoding::ASCII_8BIT)
  raise InvalidURIError, "invalid percent escape: #{$1}" if /(%\H\H)/n.match(v)
  v.gsub!(/(?!%\h\h|[!$-&(-;=?-_a-~])./n.freeze){'%%%02X' % $&.ord}
  v.force_encoding(Encoding::US_ASCII)
  @query = v
end

def registry # :nodoc:

:nodoc:
def registry # :nodoc:
  nil
end

def registry=(v)

def registry=(v)
  raise InvalidURIError, "can not set registry"
end

def relative?


Returns true if Bundler::URI does not have a scheme (e.g. http:// or https://) specified.
def relative?
  !absolute?
end

def replace!(oth)


Replaces self by other Bundler::URI object.
def replace!(oth)
  if self.class != oth.class
    raise ArgumentError, "expected #{self.class} object"
  end
  component.each do |c|
    self.__send__("#{c}=", oth.__send__(c))
  end
end

def route_from(oth)


#=> #
uri.route_from('http://my.example.com')
uri = Bundler::URI.parse('http://my.example.com/main.rbx?page=1')

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

== Usage

Calculates relative path from oth to self.

== Description

Bundler::URI or String
+oth+::

== Args
def route_from(oth)
  # you can modify `rel', but can not `oth'.
  begin
    oth, rel = route_from0(oth)
  rescue
    raise $!.class, $!.message
  end
  if oth == rel
    return rel
  end
  rel.set_path(route_from_path(oth.path, self.path))
  if rel.path == './' && self.query
    # "./?foo" -> "?foo"
    rel.set_path('')
  end
  return rel
end

def route_from0(oth)

:stopdoc:
def route_from0(oth)
  oth = parser.send(:convert_to_uri, oth)
  if self.relative?
    raise BadURIError,
      "relative Bundler::URI: #{self}"
  end
  if oth.relative?
    raise BadURIError,
      "relative Bundler::URI: #{oth}"
  end
  if self.scheme != oth.scheme
    return self, self.dup
  end
  rel = Bundler::URI::Generic.new(nil, # it is relative Bundler::URI
                         self.userinfo, self.host, self.port,
                         nil, self.path, self.opaque,
                         self.query, self.fragment, parser)
  if rel.userinfo != oth.userinfo ||
      rel.host.to_s.downcase != oth.host.to_s.downcase ||
      rel.port != oth.port
    if self.userinfo.nil? && self.host.nil?
      return self, self.dup
    end
    rel.set_port(nil) if rel.port == oth.default_port
    return rel, rel
  end
  rel.set_userinfo(nil)
  rel.set_host(nil)
  rel.set_port(nil)
  if rel.path && rel.path == oth.path
    rel.set_path('')
    rel.query = nil if rel.query == oth.query
    return rel, rel
  elsif rel.opaque && rel.opaque == oth.opaque
    rel.set_opaque('')
    rel.query = nil if rel.query == oth.query
    return rel, rel
  end
  # you can modify `rel', but can not `oth'.
  return oth, rel
end

def route_from_path(src, dst)

:stopdoc:
def route_from_path(src, dst)
  case dst
  when src
    # RFC2396, Section 4.2
    return ''
  when %r{(?:\A|/)\.\.?(?:/|\z)}
    # dst has abnormal absolute path,
    # like "/./", "/../", "/x/../", ...
    return dst.dup
  end
  src_path = src.scan(%r{[^/]*/})
  dst_path = dst.scan(%r{[^/]*/?})
  # discard same parts
  while !dst_path.empty? && dst_path.first == src_path.first
    src_path.shift
    dst_path.shift
  end
  tmp = dst_path.join
  # calculate
  if src_path.empty?
    if tmp.empty?
      return './'
    elsif dst_path.first.include?(':') # (see RFC2396 Section 5)
      return './' + tmp
    else
      return tmp
    end
  end
  return '../' * src_path.size + tmp
end

def route_to(oth)


#=> #
uri.route_to('http://my.example.com/main.rbx?page=1')
uri = Bundler::URI.parse('http://my.example.com')

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

== Usage

Calculates relative path to oth from self.

== Description

Bundler::URI or String
+oth+::

== Args
def route_to(oth)
  parser.send(:convert_to_uri, oth).route_from(self)
end

def scheme=(v)


uri.to_s #=> "https://my.example.com"
uri.scheme = "https"
uri = Bundler::URI.parse("http://my.example.com")

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

== Usage

See also Bundler::URI::Generic.check_scheme.

(with validation).
Public setter for the scheme component +v+

== Description

String
+v+::

== Args
def scheme=(v)
  check_scheme(v)
  set_scheme(v)
  v
end

def select(*components)


# => ["myuser:mypass", "my.example.com", "/test.rbx"]
uri.select(:userinfo, :host, :path)
uri = Bundler::URI.parse('http://myuser:mypass@my.example.com/test.rbx')

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

== Usage

Selects specified components from Bundler::URI.

== Description

Multiple Symbol arguments defined in Bundler::URI::HTTP.
+components+::

== Args
def select(*components)
  components.collect do |c|
    if component.include?(c)
      self.send(c)
    else
      raise ArgumentError,
        "expected of components of #{self.class} (#{self.class.component.join(', ')})"
    end
  end
end

def set_host(v)


See also Bundler::URI::Generic.host=.

Protected setter for the host component +v+.
def set_host(v)
  @host = v
end

def set_opaque(v)


See also Bundler::URI::Generic.opaque=.

Protected setter for the opaque component +v+.
def set_opaque(v)
  @opaque = v
end

def set_password(v)


See also Bundler::URI::Generic.password=.

Protected setter for the password component +v+.
def set_password(v)
  @password = v
  # returns v
end

def set_path(v)


See also Bundler::URI::Generic.path=.

Protected setter for the path component +v+.
def set_path(v)
  @path = v
end

def set_port(v)


See also Bundler::URI::Generic.port=.

Protected setter for the port component +v+.
def set_port(v)
  v = v.empty? ? nil : v.to_i unless !v || v.kind_of?(Integer)
  @port = v
end

def set_registry(v) #:nodoc:

:nodoc:
def set_registry(v) #:nodoc:
  raise InvalidURIError, "can not set registry"
end

def set_scheme(v)


See also Bundler::URI::Generic.scheme=.

Protected setter for the scheme component +v+.
def set_scheme(v)
  @scheme = v&.downcase
end

def set_user(v)


See also Bundler::URI::Generic.user=.

Protected setter for the user component +v+.
def set_user(v)
  set_userinfo(v, @password)
  v
end

def set_userinfo(user, password = nil)


See also Bundler::URI::Generic.userinfo=.

(with validation).
Protected setter for the +user+ component, and +password+ if available
def set_userinfo(user, password = nil)
  unless password
    user, password = split_userinfo(user)
  end
  @user     = user
  @password = password if password
  [@user, @password]
end

def split_path(path)


Returns an Array of the path split on '/'.
def split_path(path)
  path.split("/", -1)
end

def split_userinfo(ui)

if properly formatted as 'user:password'.
Returns the userinfo +ui+ as [user, password]
def split_userinfo(ui)
  return nil, nil unless ui
  user, password = ui.split(':', 2)
  return user, password
end

def to_s


Constructs String from Bundler::URI.
def to_s
  str = ''.dup
  if @scheme
    str << @scheme
    str << ':'
  end
  if @opaque
    str << @opaque
  else
    if @host || %w[file postgres].include?(@scheme)
      str << '//'
    end
    if self.userinfo
      str << self.userinfo
      str << '@'
    end
    if @host
      str << @host
    end
    if @port && @port != self.default_port
      str << ':'
      str << @port.to_s
    end
    str << @path
    if @query
      str << '?'
      str << @query
    end
  end
  if @fragment
    str << '#'
    str << @fragment
  end
  str
end

def user

Returns the user component.
def user
  @user
end

def user=(user)


uri.to_s #=> "http://sam:V3ry_S3nsit1ve@my.example.com"
uri.user = "sam"
uri = Bundler::URI.parse("http://john:S3nsit1ve@my.example.com")

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

== Usage

See also Bundler::URI::Generic.check_user.

(with validation).
Public setter for the +user+ component

== Description

String
+v+::

== Args
def user=(user)
  check_user(user)
  set_user(user)
  # returns user
end

def userinfo

Returns the userinfo, either as 'user' or 'user:password'.
def userinfo
  if @user.nil?
    nil
  elsif @password.nil?
    @user
  else
    @user + ':' + @password
  end
end

def userinfo=(userinfo)


Sets userinfo, argument is string like 'name:pass'.
def userinfo=(userinfo)
  if userinfo.nil?
    return nil
  end
  check_userinfo(*userinfo)
  set_userinfo(*userinfo)
  # returns userinfo
end