類別 URI::Generic

所有 URI 類別的基礎類別。實作通用的 URI 語法,根據 RFC 2396。

常數

COMPONENT

一個 Array,包含 URI::Generic 可用的組成部分。

DEFAULT_PORT

一個預設埠,對 URI::Generic 為 nil。

屬性

fragment[R]

傳回 URI 的 fragment 組成部分。

URI("http://foo/bar/baz?search=FooBar#ponies").fragment #=> "ponies"
host[R]

傳回 URI 的 host 組成部分。

URI("http://foo/bar/baz").host #=> "foo"

如果沒有 host 組成部分,則傳回 nil。

URI("mailto:[email protected]").host #=> nil

此組成部分不包含埠號。

URI("http://foo:8080/bar/baz").host #=> "foo"

由於 IPv6 位址在 URI 中會以括號包覆,因此此方法會傳回以括號包覆的 IPv6 位址。此格式不適合傳遞給像是 TCPSocket.open 等的 socket 方法。如果需要未包覆的主機名稱,請使用 hostname 方法。

URI("http://[::1]/bar/baz").host     #=> "[::1]"
URI("http://[::1]/bar/baz").hostname #=> "::1"
opaque[R]

傳回 URI 的不透明部分。

URI("mailto:[email protected]").opaque #=> "[email protected]"
URI("http://foo/bar/baz").opaque     #=> nil

路徑中未使用斜線「/」的部分。路徑通常是指絕對路徑或不透明部分。(請參閱 RFC2396 第 3 和 5.2 節。)

path[R]

傳回 URI 的路徑元件。

URI("http://foo/bar/baz").path #=> "/bar/baz"
port[R]

傳回 URI 的埠元件。

URI("http://foo/bar/baz").port      #=> 80
URI("http://foo:8080/bar/baz").port #=> 8080
query[R]

傳回 URI 的查詢元件。

URI("http://foo/bar/baz?search=FooBar").query #=> "search=FooBar"
scheme[R]

傳回 URI 的架構元件。

URI("http://foo/bar/baz").scheme #=> "http"

公開類別方法

build(args) 按一下以切換來源

概要

請參閱 ::new

說明

根據 URI::Generic 的元件建立新的 URI::Generic 實例,並進行檢查。元件包括:架構、使用者資訊、主機、埠、登錄、路徑、不透明、查詢和片段。您可以透過 ArrayHash 提供引數。請參閱 ::new 以取得要使用的雜湊金鑰或陣列項目順序。

# File lib/uri/generic.rb, line 116
def self.build(args)
  if args.kind_of?(Array) &&
      args.size == ::URI::Generic::COMPONENT.size
    tmp = args.dup
  elsif args.kind_of?(Hash)
    tmp = ::URI::Generic::COMPONENT.collect do |c|
      if args.include?(c)
        args[c]
      else
        nil
      end
    end
  else
    component = self.class.component rescue ::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
build2(args) 按一下以切換來源

概要

請參閱 ::new

說明

首先,嘗試使用 URI::Generic::build 建立新的 URI::Generic 實例。但是,如果引發例外狀況 URI::InvalidComponentError,則會執行 URI::Escape.escape 所有 URI 元件,然後再試一次。

# File lib/uri/generic.rb, line 78
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
component() 按一下以切換來源

依序排列的 URI 元件。

# File lib/uri/generic.rb, line 57
def self.component
  self::COMPONENT
end
default_port() 按一下以切換來源

傳回預設埠。

# File lib/uri/generic.rb, line 32
def self.default_port
  self::DEFAULT_PORT
end
new(scheme, userinfo, host, port, registry, path, opaque, query, fragment, parser = DEFAULT_PARSER, arg_check = false) 按一下以切換來源

參數

scheme

通訊協定,例如「http」、「ftp」、「mailto」等。

userinfo

使用者名稱和密碼,例如「sdmitry:bla」。

host

伺服器主機名稱。

port

伺服器埠。

registry

命名權限註冊中心。

path

伺服器上的路徑。

opaque

不透明部分。

query

查詢資料。

fragment

URI 中「#」字元之後的部分。

parser

Parser 供內部使用 [預設為 URI::DEFAULT_PARSER]。

arg_check

檢查參數 [預設為 false]。

說明

從「一般」元件建立新的 URI::Generic 執行個體,不檢查。

# File lib/uri/generic.rb, line 169
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

公開執行個體方法

+(oth)
別名:merge
-(oth)
別名:route_from
==(oth) 按一下以切換來源

比較兩個 URI。

# File lib/uri/generic.rb, line 1384
def ==(oth)
  if self.class == oth.class
    self.normalize.component_ary == oth.normalize.component_ary
  else
    false
  end
end
absolute()
別名:absolute?
absolute?() 按一下以切換來源

如果 URI 已指定通訊協定(例如 http:// 或 https://),則傳回 true。

# File lib/uri/generic.rb, line 972
def absolute?
  if @scheme
    true
  else
    false
  end
end
別名:absolute
coerce(oth) 按一下以切換來源

參數

v

URIString

說明

嘗試解析其他 URI oth,傳回 [parsed_oth, self]。

用法

require 'uri'

uri = URI.parse("http://my.example.com")
uri.coerce("http://foo.com")
#=> [#<URI::HTTP http://foo.com>, #<URI::HTTP http://my.example.com>]
呼叫超類別方法
# File lib/uri/generic.rb, line 1474
def coerce(oth)
  case oth
  when String
    oth = parser.parse(oth)
  else
    super
  end

  return oth, self
end
component() 按一下以切換來源

依序排列的 URI 元件。

# File lib/uri/generic.rb, line 313
def component
  self.class.component
end
decoded_password() 按一下以切換來源

URI 解碼後傳回密碼元件。

# File lib/uri/generic.rb, line 583
def decoded_password
  URI.decode_uri_component(@password) if @password
end
decoded_user() 按一下以切換來源

URI 解碼後傳回使用者元件。

# File lib/uri/generic.rb, line 578
def decoded_user
  URI.decode_uri_component(@user) if @user
end
default_port() 按一下以切換來源

傳回預設埠。

# File lib/uri/generic.rb, line 39
def default_port
  self.class.default_port
end
eql?(oth) 按一下以切換來源
# File lib/uri/generic.rb, line 1396
def eql?(oth)
  self.class == oth.class &&
  parser == oth.parser &&
  self.component_ary.eql?(oth.component_ary)
end
find_proxy(env=ENV) 按一下以切換來源

傳回代理伺服器 URI。代理伺服器 URI 是從環境變數(例如 http_proxy、ftp_proxy、no_proxy 等)取得。如果沒有適當的代理伺服器,則傳回 nil。

如果指定了選用參數 env,則使用它取代 ENV

請注意,也會檢查大寫變數(HTTP_PROXY、FTP_PROXY、NO_PROXY 等)。

但是,在 CGI 環境下,http_proxy 和 HTTP_PROXY 的處理方式特別。這是因為 HTTP_PROXY 可能由 Proxy: 標頭設定。因此,不會使用 HTTP_PROXY。如果變數不區分大小寫,則也不會使用 http_proxy。可以改用 CGI_HTTP_PROXY。

# File lib/uri/generic.rb, line 1500
def find_proxy(env=ENV)
  raise BadURIError, "relative 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'
    if RUBY_ENGINE == 'jruby' && p_addr = ENV_JAVA['http.proxyHost']
      p_port = ENV_JAVA['http.proxyPort']
      if p_user = ENV_JAVA['http.proxyUser']
        p_pass = ENV_JAVA['http.proxyPass']
        proxy_uri = "http://#{p_user}:#{p_pass}@#{p_addr}:#{p_port}"
      else
        proxy_uri = "http://#{p_addr}:#{p_port}"
      end
    else
      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
    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 URI::Generic.use_proxy?(self.hostname, addr, self.port, no_proxy)
  end
  URI.parse(proxy_uri)
end
fragment=(v) 按一下以切換來源

根據 URI::Parser Regexp 檢查片段 v 元件的 :FRAGMENT。

引數

v

字串

說明

片段元件 v 的公開設定器(含驗證)。

用法

require 'uri'

uri = URI.parse("http://my.example.com/?id=25#time=1305212049")
uri.fragment = "time=1305212086"
uri.to_s  #=> "http://my.example.com/?id=25#time=1305212086"
# File lib/uri/generic.rb, line 929
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
hash() 按一下以切換來源
# File lib/uri/generic.rb, line 1392
def hash
  self.component_ary.hash
end
hierarchical?() 按一下以切換原始碼

如果 URI 是階層式的,則傳回 true。

描述

URI 的組成元件依序從左至右列出,重要性遞減,請參閱 RFC3986 tools.ietf.org/html/rfc3986 1.2.3。

用法

require 'uri'

uri = URI.parse("http://my.example.com/")
uri.hierarchical?
#=> true
uri = URI.parse("mailto:[email protected]")
uri.hierarchical?
#=> false
# File lib/uri/generic.rb, line 961
def hierarchical?
  if @path
    true
  else
    false
  end
end
host=(v) 按一下以切換原始碼

引數

v

字串

描述

主機元件 v 的公開設定程式 (包含驗證)。

另請參閱 URI::Generic.check_host

用法

require 'uri'

uri = URI.parse("http://my.example.com")
uri.host = "foo.com"
uri.to_s  #=> "http://foo.com"
# File lib/uri/generic.rb, line 639
def host=(v)
  check_host(v)
  set_host(v)
  v
end
hostname() 按一下以切換原始碼

擷取 URI 的主機部分,並取消 IPv6 位址的括號。

此方法與 URI::Generic#host 相同,但已移除 IPv6 (和未來 IP) 位址的括號。

uri = URI("http://[::1]/bar")
uri.hostname      #=> "::1"
uri.host          #=> "[::1]"
# File lib/uri/generic.rb, line 654
def hostname
  v = self.host
  v&.start_with?('[') && v.end_with?(']') ? v[1..-2] : v
end
hostname=(v) 按一下以切換原始碼

URI 的主機部分設定為 IPv6 位址的括號引數。

此方法與 URI::Generic#host= 相同,但引數可以是純粹的 IPv6 位址。

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

如果引數看起來像是 IPv6 位址,則會用括號將其包起來。

# File lib/uri/generic.rb, line 671
def hostname=(v)
  v = "[#{v}]" if !(v&.start_with?('[') && v&.end_with?(']')) && v&.index(':')
  self.host = v
end
inspect() 按一下以切換原始碼
# File lib/uri/generic.rb, line 1451
def inspect
  "#<#{self.class} #{self}>"
end
merge(oth) 按一下以切換原始碼

引數

oth

URIString

描述

合併兩個 URI。

用法

require 'uri'

uri = URI.parse("http://my.example.com")
uri.merge("/main.rbx?page=1")
# => "http://my.example.com/main.rbx?page=1"
# File lib/uri/generic.rb, line 1109
def merge(oth)
  rel = parser.__send__(:convert_to_uri, oth)

  if rel.absolute?
    #raise BadURIError, "both URI are absolute" if absolute?
    # hmm... should return oth for usability?
    return rel
  end

  unless self.absolute?
    raise BadURIError, "both 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!(oth) 按一下以切換原始碼

引數

oth

URIString

描述

merge 的破壞性形式。

用法

require 'uri'

uri = URI.parse("http://my.example.com")
uri.merge!("/main.rbx?page=1")
uri.to_s  # => "http://my.example.com/main.rbx?page=1"
# File lib/uri/generic.rb, line 1081
def merge!(oth)
  t = merge(oth)
  if self == t
    nil
  else
    replace!(t)
    self
  end
end
normalize() 按一下以切換原始碼

傳回正規化的 URI

require 'uri'

URI("HTTP://my.EXAMPLE.com").normalize
#=> #<URI::HTTP http://my.example.com/>

此處的正規化表示

  • 將 scheme 和 host 轉換為小寫,

  • 將空的 path 組件設定為 “/”。

# File lib/uri/generic.rb, line 1319
def normalize
  uri = dup
  uri.normalize!
  uri
end
normalize!() 按一下以切換來源

normalize 的破壞性版本。

# File lib/uri/generic.rb, line 1328
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
opaque=(v) 按一下以切換來源

引數

v

字串

說明

不透明組件 v 的公用設定器(含驗證)。

另請參閱 URI::Generic.check_opaque

# File lib/uri/generic.rb, line 901
def opaque=(v)
  check_opaque(v)
  set_opaque(v)
  v
end
parser() 按一下以切換來源

傳回要使用的剖析器。

除非定義了 URI::Parser,否則會使用 DEFAULT_PARSER。

# File lib/uri/generic.rb, line 289
def parser
  if !defined?(@parser) || !@parser
    DEFAULT_PARSER
  else
    @parser || DEFAULT_PARSER
  end
end
password() 按一下以切換來源

傳回密碼組件(未經 URI 解碼)。

# File lib/uri/generic.rb, line 573
def password
  @password
end
password=(password) 按一下以切換來源

引數

v

字串

說明

password 組件的公用設定器(含驗證)。

另請參閱 URI::Generic.check_password

用法

require 'uri'

uri = URI.parse("http://john:[email protected]")
uri.password = "V3ry_S3nsit1ve"
uri.to_s  #=> "http://john:[email protected]"
# File lib/uri/generic.rb, line 498
def password=(password)
  check_password(password)
  set_password(password)
  # returns password
end
path=(v) 按一下以切換來源

引數

v

字串

說明

路徑組件 v 的公用設定器(含驗證)。

另請參閱 URI::Generic.check_path

用法

require 'uri'

uri = URI.parse("http://my.example.com/pub/files")
uri.path = "/faq/"
uri.to_s  #=> "http://my.example.com/faq/"
# File lib/uri/generic.rb, line 815
def path=(v)
  check_path(v)
  set_path(v)
  v
end
port=(v) 按一下以切換來源

引數

v

字串

說明

埠組件 v 的公用設定器(含驗證)。

另請參閱 URI::Generic.check_port

用法

require 'uri'

uri = URI.parse("http://my.example.com")
uri.port = 8080
uri.to_s  #=> "http://my.example.com:8080"
# File lib/uri/generic.rb, line 729
def port=(v)
  check_port(v)
  set_port(v)
  port
end
query=(v) 按一下以切換來源

參數

v

字串

說明

查詢元件 v 的公用設定程式。

用法

require 'uri'

uri = URI.parse("http://my.example.com/?id=25")
uri.query = "id=1"
uri.to_s  #=> "http://my.example.com/?id=1"
# File lib/uri/generic.rb, line 839
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
registry=(v) 按一下以切換來源
# File lib/uri/generic.rb, line 745
def registry=(v)
  raise InvalidURIError, "can not set registry"
end
relative?() 按一下以切換來源

如果 URI 沒有指定架構(例如 http:// 或 https://),則傳回 true。

# File lib/uri/generic.rb, line 984
def relative?
  !absolute?
end
route_from(oth) 按一下以切換來源

參數

oth

URIString

說明

計算從 oth 到自己的相對路徑。

用法

require 'uri'

uri = URI.parse('http://my.example.com/main.rbx?page=1')
uri.route_from('http://my.example.com')
#=> #<URI::Generic /main.rbx?page=1>
# File lib/uri/generic.rb, line 1262
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
別名為: -
route_to(oth) 按一下以切換來源

參數

oth

URIString

說明

計算從自己到 oth 的相對路徑。

用法

require 'uri'

uri = URI.parse('http://my.example.com')
uri.route_to('http://my.example.com/main.rbx?page=1')
#=> #<URI::Generic /main.rbx?page=1>
# File lib/uri/generic.rb, line 1302
def route_to(oth)
  parser.__send__(:convert_to_uri, oth).route_from(self)
end
scheme=(v) 按一下以切換來源

參數

v

字串

說明

架構元件 v 的公用設定程式(含驗證)。

另請參閱 URI::Generic.check_scheme

用法

require 'uri'

uri = URI.parse("http://my.example.com")
uri.scheme = "https"
uri.to_s  #=> "https://my.example.com"
# File lib/uri/generic.rb, line 360
def scheme=(v)
  check_scheme(v)
  set_scheme(v)
  v
end
select(*components) 按一下以切換來源

參數

components

URI::HTTP 中定義的多個 Symbol 參數。

說明

URI 選擇指定的元件。

用法

require 'uri'

uri = URI.parse('http://myuser:[email protected]/test.rbx')
uri.select(:userinfo, :host, :path)
# => ["myuser:mypass", "my.example.com", "/test.rbx"]
# File lib/uri/generic.rb, line 1440
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
to_s() 按一下以切換來源

URI 建構 String

# File lib/uri/generic.rb, line 1343
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
別名:to_str
to_str()
別名:to_s
user() 按一下以切換來源

傳回使用者元件(未進行 URI 解碼)。

# File lib/uri/generic.rb, line 568
def user
  @user
end
user=(user) 按一下以切換來源

引數

v

字串

說明

user 元件的公開設定器(含驗證)。

另請參閱 URI::Generic.check_user

用法

require 'uri'

uri = URI.parse("http://john:[email protected]")
uri.user = "sam"
uri.to_s  #=> "http://sam:[email protected]"
# File lib/uri/generic.rb, line 471
def user=(user)
  check_user(user)
  set_user(user)
  # returns user
end
userinfo() 按一下以切換來源

傳回使用者資訊,格式為「使用者」或「使用者:密碼」。

# File lib/uri/generic.rb, line 557
def userinfo
  if @user.nil?
    nil
  elsif @password.nil?
    @user
  else
    @user + ':' + @password
  end
end
userinfo=(userinfo) 按一下以切換來源

設定使用者資訊,引數為字串,格式為「名稱:密碼」。

# File lib/uri/generic.rb, line 441
def userinfo=(userinfo)
  if userinfo.nil?
    return nil
  end
  check_userinfo(*userinfo)
  set_userinfo(*userinfo)
  # returns userinfo
end

受保護的執行個體方法

component_ary() 按一下以切換來源

傳回 Array,其中包含 COMPONENT Array 中定義的元件。

# File lib/uri/generic.rb, line 1416
def component_ary
  component.collect do |x|
    self.__send__(x)
  end
end
set_host(v) 按一下以切換來源

主機元件 v 的受保護設定器。

另請參閱 URI::Generic.host=

# File lib/uri/generic.rb, line 613
def set_host(v)
  @host = v
end
set_opaque(v) 按一下以切換來源

不透明元件 v 的受保護設定器。

另請參閱 URI::Generic.opaque=

# File lib/uri/generic.rb, line 883
def set_opaque(v)
  @opaque = v
end
set_password(v) 按一下以切換來源

密碼元件 v 的受保護設定器。

另請參閱 URI::Generic.password=

# File lib/uri/generic.rb, line 534
def set_password(v)
  @password = v
  # returns v
end
set_path(v) 按一下以切換來源

路徑元件 v 的受保護設定器。

另請參閱 URI::Generic.path=

# File lib/uri/generic.rb, line 789
def set_path(v)
  @path = v
end
set_port(v) 按一下以切換來源

受保護的 port 元件 v 設定器。

另請參閱 URI::Generic.port=

# File lib/uri/generic.rb, line 702
def set_port(v)
  v = v.empty? ? nil : v.to_i unless !v || v.kind_of?(Integer)
  @port = v
end
set_scheme(v) 按一下以切換來源

受保護的 scheme 元件 v 設定器。

另請參閱 URI::Generic.scheme=

# File lib/uri/generic.rb, line 334
def set_scheme(v)
  @scheme = v&.downcase
end
set_user(v) 按一下以切換來源

受保護的 user 元件 v 設定器。

另請參閱 URI::Generic.user=

# File lib/uri/generic.rb, line 524
def set_user(v)
  set_userinfo(v, @password)
  v
end
set_userinfo(user, password = nil) 按一下以切換來源

受保護的 user 元件設定器,以及(如果可用)password(經過驗證)。

另請參閱 URI::Generic.userinfo=

# File lib/uri/generic.rb, line 509
def set_userinfo(user, password = nil)
  unless password
    user, password = split_userinfo(user)
  end
  @user     = user
  @password = password if password

  [@user, @password]
end

私人實例方法

check_host(v) 按一下以切換來源

檢查 host v 元件是否符合 RFC2396,並針對 URI::Parser Regexp for :HOST 進行檢查。

如果已定義主機元件,則無法定義登錄或不透明元件。

# File lib/uri/generic.rb, line 594
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
check_opaque(v) 按一下以切換來源

檢查 opaque v 元件是否符合 RFC2396,並針對 URI::Parser Regexp for :OPAQUE 進行檢查。

如果已定義不透明元件,則無法定義主機、埠、使用者或路徑元件。

# File lib/uri/generic.rb, line 861
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
check_password(v, user = @user) 按一下以切換來源

檢查 password v 元件是否符合 RFC2396,並針對 URI::Parser Regexp for :USERINFO 進行檢查。

如果已定義使用者元件,則無法定義登錄或不透明元件。

# File lib/uri/generic.rb, line 417
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
check_path(v) 按一下以切換來源

檢查 path v 元件是否符合 RFC2396,並針對 URI::Parser Regexp for :ABS_PATH 和 :REL_PATH 進行檢查。

如果已定義不透明元件,則無法定義路徑元件。

# File lib/uri/generic.rb, line 757
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
check_port(v) 按一下以切換來源

檢查 port v 元件是否符合 RFC2396,並針對 URI::Parser Regexp for :PORT 進行檢查。

如果已定義登錄或不透明元件,則無法定義埠元件。

# File lib/uri/generic.rb, line 683
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
check_scheme(v) 按一下以切換來源

針對 URI::Parser Regexp for :SCHEME 檢查 scheme v 元件。

# File lib/uri/generic.rb, line 320
def check_scheme(v)
  if v && parser.regexp[:SCHEME] !~ v
    raise InvalidComponentError,
      "bad component(expected scheme component): #{v}"
  end

  return true
end
check_user(v) 按一下以切換來源

檢查使用者 v 元件是否符合 RFC2396 規範,以及 URI::Parser Regexp 是否符合 :USERINFO。

如果已定義使用者元件,則無法定義登錄或不透明元件。

# File lib/uri/generic.rb, line 393
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
check_userinfo(user, password = nil) 按一下以切換來源

檢查 userpassword

如果未提供 password,則會使用 URI::Generic.split_userinfo 拆分 user,以擷取 user 和 +password。

另請參閱 URI::Generic.check_userURI::Generic.check_password

# File lib/uri/generic.rb, line 375
def check_userinfo(user, password = nil)
  if !password
    user, password = split_userinfo(user)
  end
  check_user(user)
  check_password(password, user)

  return true
end
escape_userpass(v) 按一下以切換來源

根據 RFC 1738 第 3.1 節,對「使用者:密碼」v 進行跳脫。

# File lib/uri/generic.rb, line 551
def escape_userpass(v)
  parser.escape(v, /[@:\/]/o) # RFC 1738 section 3.1 #/
end
merge_path(base, rel) 按一下以切換來源

合併基本路徑 base 和相對路徑 rel,傳回已修改的基本路徑。

# File lib/uri/generic.rb, line 1000
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
replace!(oth) 按一下以切換來源

使用其他 URI 物件取代自己。

# File lib/uri/generic.rb, line 299
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
split_path(path) 按一下以切換來源

傳回在「/」上拆分的路徑 Array

# File lib/uri/generic.rb, line 991
def split_path(path)
  path.split("/", -1)
end
split_userinfo(ui) 按一下以切換來源

如果使用者資訊 ui 格式正確,則以「使用者:密碼」傳回 [user, password]

# File lib/uri/generic.rb, line 542
def split_userinfo(ui)
  return nil, nil unless ui
  user, password = ui.split(':', 2)

  return user, password
end