класс URI::Generic
Базовый класс для всех классов URI. Реализует общий синтаксис URI в соответствии с RFC 2396.
Константы
- COMPONENT
-
Массив доступных компонентов для URI::Generic
- DEFAULT_PORT
-
Значение порта по умолчанию — nil для URI::Generic
Атрибуты
возвращает компонент фрагмента URI.
URI("http://foo/bar/baz?search=FooBar#ponies").fragment #=> "ponies"
возвращает компонент хоста URI.
URI("http://foo/bar/baz").host #=> "foo"
Возвращает nil, если компонент хоста отсутствует.
URI("mailto:foo@example.org").host #=> nil
Компонент не содержит номер порта.
URI("http://foo:8080/bar/baz").host #=> "foo"
Так как IPv6-адреса заключены в квадратные скобки в URI, этот метод возвращает IPv6-адреса в квадратных скобках. Этот формат не подходит для передачи в методы сокетов, такие как IO.open. Если требуются имена хостов без скобок, используйте метод «hostname».
URI("http://[::1]/bar/baz").host #=> "[::1]"
URI("http://[::1]/bar/baz").hostname #=> "::1"
возвращает неявную часть URI.
URI("mailto:foo@example.org").opaque #=> "foo@example.org"
Часть пути, которая не использует слеш '/'. Путь обычно относится к абсолютному пути и неявной части.
(see RFC2396 Section 3 and 5.2)
возвращает компонент пути URI.
URI("http://foo/bar/baz").path #=> "/bar/baz"
возвращает компонент порта URI.
URI("http://foo/bar/baz").port #=> "80"
URI("http://foo:8080/bar/baz").port #=> "8080"
возвращает компонент запроса URI.
URI("http://foo/bar/baz?search=FooBar").query #=> "search=FooBar"
возвращает компонент схемы URI.
URI("http://foo/bar/baz").scheme #=> "http"
Открытые методы класса
# File lib/uri/generic.rb, line 114
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 Синопсис
См. новый
Описание
Создаёт новый экземпляр URI::Generic из компонентов URI::Generic с проверкой. Компоненты: схема, имя пользователя, хост, порт, регистр, путь, неявная часть, запрос и фрагмент. Вы можете передавать аргументы либо в виде массива, либо в виде хэша. Обратитесь к методу new, чтобы узнать используемые ключи хэша или порядок элементов массива.
# File lib/uri/generic.rb, line 76
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 Синопсис
См. новый
Описание
Сначала пытается создать новый экземпляр URI::Generic с помощью ::build. Но если возникает исключение URI::InvalidComponentError, тогда он URI::Escape#escape все компоненты URI и пытается снова.
# File lib/uri/generic.rb, line 54 def self.component self::COMPONENT end
Компоненты URI в порядке.
# File lib/uri/generic.rb, line 29 def self.default_port self::DEFAULT_PORT end
Возвращает порт по умолчанию
# File lib/uri/generic.rb, line 166
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 if @scheme
self.set_path('') if !@path && !@opaque # (see RFC2396 Section 5.2)
self.set_port(self.default_port) if self.default_port && !@port
end Аргументы
-
scheme -
Схема протокола, например, 'http', 'ftp', 'mailto' и так далее.
-
userinfo -
Имя пользователя и пароль, например, 'sdmitry:bla'
-
host -
Имя хоста сервера
-
port -
Порт сервера
-
registry -
Регистр именных авторитетов.
-
path -
Путь на сервере
-
opaque -
Неявная часть
-
query -
Данные запроса
-
fragment -
Часть URI после символа '#'
-
parser -
Парсер для внутреннего использования [URI::DEFAULT_PARSER по умолчанию]
-
arg_check -
Проверка аргументов [по умолчанию false]
Описание
Создаёт новый экземпляр URI::Generic из компонентов “generic” без проверки.
Публичные методы экземпляра
# File lib/uri/generic.rb, line 1381
def ==(oth)
if self.class == oth.class
self.normalize.component_ary == oth.normalize.component_ary
else
false
end
end Сравнение с URI
# File lib/uri/generic.rb, line 958
def absolute?
if @scheme
true
else
false
end
end Проверка, является ли URI абсолютным
# File lib/uri/generic.rb, line 1471
def coerce(oth)
case oth
when String
oth = parser.parse(oth)
else
super
end
return oth, self
end Аргументы
-
v -
URI или строка
Описание
attempt to parse other URI +oth+ return [parsed_oth, self]
Использование
require 'uri'
uri = URI.parse("http://my.example.com")
uri.coerce("http://foo.com")
#=> [#<URI::HTTP:0x00000000bcb028 URL:http://foo.com/>, #<URI::HTTP:0x00000000d92178 URL:http://my.example.com>]
# File lib/uri/generic.rb, line 309 def component self.class.component end
Компоненты URI в порядке.
# File lib/uri/generic.rb, line 36 def default_port self.class.default_port end
Возвращает порт по умолчанию
# File lib/uri/generic.rb, line 1393 def eql?(oth) self.class == oth.class && parser == oth.parser && self.component_ary.eql?(oth.component_ary) end
# File lib/uri/generic.rb, line 1495
def find_proxy
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'
unless proxy_uri = ENV[name]
if proxy_uri = ENV[name.upcase]
warn 'The environment variable HTTP_PROXY is discouraged. Use http_proxy.'
end
end
else
proxy_uri = ENV[name] || ENV[name.upcase]
end
if proxy_uri.nil? || proxy_uri.empty?
return nil
end
if self.hostname
require 'socket'
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]
no_proxy.scan(/([^:,]*)(?::(\d+))?/) {|host, port|
if /(\A|\.)#{Regexp.quote host}\z/i =~ self.host &&
(!port || self.port == port.to_i)
return nil
end
}
end
URI.parse(proxy_uri)
end Возвращает прокси URI. Прокси URI извлекается из переменных окружения, таких как http_proxy, ftp_proxy, no_proxy и т. д. Если подходящего прокси нет, возвращается nil.
Обратите внимание, что проверяются также переменные с заглавными буквами (HTTP_PROXY, FTP_PROXY, NO_PROXY и т. д.).
Но http_proxy и HTTP_PROXY обрабатываются специально в среде CGI. Это связано с тем, что HTTP_PROXY может быть задан заголовком Proxy:. Поэтому HTTP_PROXY не используется. http_proxy тоже не используется, если переменная регистронезависимая. Вместо этого можно использовать CGI_HTTP_PROXY.
# File lib/uri/generic.rb, line 931
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".freeze)
v.force_encoding(Encoding::ASCII_8BIT)
v.gsub!(/(?!%\h\h|[!-~])./n){'%%%02X'.freeze % $&.ord}
v.force_encoding(Encoding::US_ASCII)
@fragment = v
end Проверка компонента фрагмента v по отношению к Regexp URI::Parser для :FRAGMENT
Аргументы
-
v -
Строка
Описание
Общедоступный установщик для компонента фрагмента v. (с валидацией)
Использование
require 'uri'
uri = URI.parse("http://my.example.com/?id=25#time=1305212049")
uri.fragment = "time=1305212086"
# => "time=1305212086"
uri
#=> #<URI::HTTP:0x000000007a81f8 URL:http://my.example.com/?id=25#time=1305212086>
# File lib/uri/generic.rb, line 1389 def hash self.component_ary.hash end
# File lib/uri/generic.rb, line 947
def hierarchical?
if @path
true
else
false
end
end Проверка наличия пути в URI
# File lib/uri/generic.rb, line 633 def host=(v) check_host(v) set_host(v) v end
Аргументы
-
v -
Строка
Описание
Общедоступный установщик для компонента host v. (с валидацией)
См. также #check_host
Использование
require 'uri'
uri = URI.parse("http://my.example.com")
uri.host = "foo.com"
# => "foo.com"
uri
#=> #<URI::HTTP:0x000000008e89e8 URL:http://foo.com>
# File lib/uri/generic.rb, line 648 def hostname v = self.host /\A\[(.*)\]\z/ =~ v ? $1 : v end
Извлечение части host из URI и снятие скобок для адресов IPv6.
Этот метод эквивалентен #host, за исключением того, что скобки для адресов IPv6 (и будущих IP-адресов) удаляются.
u = URI(“http://[::1]/bar”) p u.hostname #=> “::1” p u.host #=> “[::1]”
# File lib/uri/generic.rb, line 666
def hostname=(v)
v = "[#{v}]" if /\A\[.*\]\z/ !~ v && /:/ =~ v
self.host = v
end Устанавливает часть host URI в качестве аргумента со скобками для адресов IPv6.
Этот метод эквивалентен #host=, за исключением того, что аргументом может быть чистый адрес IPv6.
u = URI(“foo/bar”) p u.to_s #=> “foo/bar” u.hostname = “::1” p u.to_s #=> “[::1]/bar”
Если аргумент похож на адрес IPv6, он обрамляется скобками.
# File lib/uri/generic.rb, line 1448
def inspect
"#<#{self.class} #{self}>"
end # File lib/uri/generic.rb, line 1096
def merge(oth)
begin
base, rel = merge0(oth)
rescue
raise $!.class, $!.message
end
if base == rel
return base
end
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 Аргументы
-
oth -
URI или строка
Описание
Объединение двух URI.
Использование
require 'uri'
uri = URI.parse("http://my.example.com")
p uri.merge("/main.rbx?page=1")
# => #<URI::HTTP:0x2021f3b0 URL:http://my.example.com/main.rbx?page=1>
# File lib/uri/generic.rb, line 1068
def merge!(oth)
t = merge(oth)
if self == t
nil
else
replace!(t)
self
end
end Аргументы
-
oth -
URI или строка
Описание
Деструктивная форма merge
Использование
require 'uri'
uri = URI.parse("http://my.example.com")
uri.merge!("/main.rbx?page=1")
p uri
# => #<URI::HTTP:0x2021f3b0 URL:http://my.example.com/main.rbx?page=1>
# File lib/uri/generic.rb, line 1317 def normalize uri = dup uri.normalize! uri end
Возвращает нормализованный URI
# File lib/uri/generic.rb, line 1326
def normalize!
if path && 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 Деструктивная версия normalize
# File lib/uri/generic.rb, line 901 def opaque=(v) check_opaque(v) set_opaque(v) v end
Аргументы
-
v -
Строка
Описание
Публичный метод установки компонента opaque v. (с валидацией)
См. также #check_opaque
# File lib/uri/generic.rb, line 286
def parser
if !defined?(@parser) || !@parser
DEFAULT_PARSER
else
@parser || DEFAULT_PARSER
end
end возвращает используемый парсер.
Если URI::Parser не определён, используется DEFAULT_PARSER.
# File lib/uri/generic.rb, line 575 def password @password end
возвращает компонент пароля
# File lib/uri/generic.rb, line 500 def password=(password) check_password(password) set_password(password) # returns password end
Аргументы
-
v -
Строка
Описание
Публичный метод установки компонента password. (с валидацией)
См. также #check_password
Использование
require 'uri'
uri = URI.parse("http://john:S3nsit1ve@my.example.com")
uri.password = "V3ry_S3nsit1ve"
# => "V3ry_S3nsit1ve"
uri
#=> #<URI::HTTP:0x00000000881d90 URL:http://john:V3ry_S3nsit1ve@my.example.com>
# File lib/uri/generic.rb, line 814 def path=(v) check_path(v) set_path(v) v end
Аргументы
-
v -
Строка
Описание
Публичный метод установки компонента path v. (с валидацией)
См. также #check_path
Использование
require 'uri'
uri = URI.parse("http://my.example.com/pub/files")
uri.path = "/faq/"
# => "/faq/"
uri
#=> #<URI::HTTP:0x000000008e89e8 URL:http://my.example.com/faq/>
# File lib/uri/generic.rb, line 726 def port=(v) check_port(v) set_port(v) port end
Аргументы
-
v -
Строка
Описание
Публичный метод установки компонента порт v. (с валидацией)
См. также #check_port
Использование
require 'uri'
uri = URI.parse("http://my.example.com")
uri.port = 8080
# => 8080
uri
#=> #<URI::HTTP:0x000000008e89e8 URL:http://my.example.com:8080>
# File lib/uri/generic.rb, line 840
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".freeze)
v.force_encoding(Encoding::ASCII_8BIT)
v.gsub!(/(?!%\h\h|[!$-&(-;=?-_a-~])./n.freeze){'%%%02X'.freeze % $&.ord}
v.force_encoding(Encoding::US_ASCII)
@query = v
end Аргументы
-
v -
Строка
Описание
Публичный метод установки компонента query v.
Использование
require 'uri'
uri = URI.parse("http://my.example.com/?id=25")
uri.query = "id=1"
# => "id=1"
uri
#=> #<URI::HTTP:0x000000008e89e8 URL:http://my.example.com/?id=1>
# File lib/uri/generic.rb, line 742 def registry=(v) raise InvalidURIError, "can not set registry" end
# File lib/uri/generic.rb, line 970 def relative? !absolute? end
Проверяет, является ли URI относительным
# File lib/uri/generic.rb, line 1270
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 Аргументы
-
oth -
URI или Строка
Описание
Вычисляет относительный путь от oth к self
Использование
require 'uri'
uri = URI.parse('http://my.example.com/main.rbx?page=1')
p uri.route_from('http://my.example.com')
#=> #<URI::Generic:0x20218858 URL:/main.rbx?page=1>
# File lib/uri/generic.rb, line 1310 def route_to(oth) parser.send(:convert_to_uri, oth).route_from(self) end
Аргументы
-
oth -
URI или Строка
Описание
Вычисляет относительный путь к oth от self
Использование
require 'uri'
uri = URI.parse('http://my.example.com')
p uri.route_to('http://my.example.com/main.rbx?page=1')
#=> #<URI::Generic:0x2020c2f6 URL:/main.rbx?page=1>
# File lib/uri/generic.rb, line 358 def scheme=(v) check_scheme(v) set_scheme(v) v end
Аргументы
-
v -
Строка
Описание
Публичный метод установки компонента scheme v. (с валидацией)
См. также #check_scheme
Использование
require 'uri'
uri = URI.parse("http://my.example.com")
uri.scheme = "https"
# => "https"
uri
#=> #<URI::HTTP:0x000000008e89e8 URL:https://my.example.com>
# File lib/uri/generic.rb, line 1437
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 Аргументы
Описание
Выбирает указанные компоненты из URI
Использование
require 'uri'
uri = URI.parse('http://myuser:mypass@my.example.com/test.rbx')
p uri.select(:userinfo, :host, :path)
# => ["myuser:mypass", "my.example.com", "/test.rbx"]
# File lib/uri/generic.rb, line 1341
def to_s
str = ''
if @scheme
str << @scheme
str << ':'.freeze
end
if @opaque
str << @opaque
else
if @host
str << '//'.freeze
end
if self.userinfo
str << self.userinfo
str << '@'.freeze
end
if @host
str << @host
end
if @port && @port != self.default_port
str << ':'.freeze
str << @port.to_s
end
str << @path
if @query
str << '?'.freeze
str << @query
end
end
if @fragment
str << '#'.freeze
str << @fragment
end
str
end Строит строку из URI
# File lib/uri/generic.rb, line 570 def user @user end
возвращает компонент пользователя
# File lib/uri/generic.rb, line 471 def user=(user) check_user(user) set_user(user) # returns user end
Аргументы
-
v -
Строка
Описание
Публичный метод установки компонента user. (с валидацией)
См. также #check_user
Использование
require 'uri'
uri = URI.parse("http://john:S3nsit1ve@my.example.com")
uri.user = "sam"
# => "sam"
uri
#=> #<URI::HTTP:0x00000000881d90 URL:http://sam:V3ry_S3nsit1ve@my.example.com>
# File lib/uri/generic.rb, line 559
def userinfo
if @user.nil?
nil
elsif @password.nil?
@user
else
@user + ':' + @password
end
end возвращает userinfo, либо как 'user', либо как 'user:password'
# File lib/uri/generic.rb, line 439
def userinfo=(userinfo)
if userinfo.nil?
return nil
end
check_userinfo(*userinfo)
set_userinfo(*userinfo)
# returns userinfo
end Устанавливает userinfo, аргумент — строка вида 'имя:пароль'
Защищенные методы экземпляра
# File lib/uri/generic.rb, line 1413
def component_ary
component.collect do |x|
self.send(x)
end
end возвращает массив компонентов, определённых из массива COMPONENT
# File lib/uri/generic.rb, line 605 def set_host(v) @host = v end
защищённый метод установки компонента хоста v
см. также #host=
# File lib/uri/generic.rb, line 883 def set_opaque(v) @opaque = v end
защищённый метод установки компонента непрозрачности v
см. также #opaque=
# File lib/uri/generic.rb, line 536 def set_password(v) @password = v # returns v end
защищённый метод установки компонента пароля v
см. также #password=
# File lib/uri/generic.rb, line 786 def set_path(v) @path = v end
защищённый метод установки компонента пути v
см. также #path=
# File lib/uri/generic.rb, line 697 def set_port(v) v = v.empty? ? nil : v.to_i unless !v || v.kind_of?(Fixnum) @port = v end
защищённый метод установки компонента порта v
см. также #port=
# File lib/uri/generic.rb, line 330 def set_scheme(v) @scheme = v ? v.downcase : v end
защищённый метод установки компонента схемы v
см. также #scheme=
# File lib/uri/generic.rb, line 526 def set_user(v) set_userinfo(v, @password) v end
защищённый метод установки компонента пользователя v
см. также #user=
# File lib/uri/generic.rb, line 511
def set_userinfo(user, password = nil)
unless password
user, password = split_userinfo(user)
end
@user = user
@password = password if password
[@user, @password]
end защищённый метод установки компонента user, и password, если доступен. (с валидацией)
см. также #userinfo=
Закрытые методы экземпляра
# File lib/uri/generic.rb, line 586
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 проверить компонент хоста v на соответствие RFC2396 и по отношению к Regexp для :HOST в URI::Parser
Нельзя определять регистр или компонент 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 проверить компонент opaque v на соответствие RFC2396 и по отношению к Regexp для :OPAQUE в URI::Parser
Нельзя определять хост, порт, пользователя или путь, если определён компонент opaque.
# File lib/uri/generic.rb, line 415
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 проверить компонент пароля v на соответствие RFC2396 и по отношению к Regexp для :USERINFO в URI::Parser
Нельзя определять регистр или компонент opaque, если определён компонент пользователя.
# File lib/uri/generic.rb, line 754
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".freeze
if v && v != ''.freeze && parser.regexp[:ABS_PATH] !~ v
raise InvalidComponentError,
"bad component(expected absolute path component): #{v}"
end
else
if v && v != ''.freeze && parser.regexp[:ABS_PATH] !~ v &&
parser.regexp[:REL_PATH] !~ v
raise InvalidComponentError,
"bad component(expected relative path component): #{v}"
end
end
return true
end проверить компонент пути v на соответствие RFC2396 и по отношению к Regexp для :ABS_PATH и :REL_PATH в URI::Parser
Нельзя определять компонент opaque, если определён компонент пути.
# File lib/uri/generic.rb, line 678
def check_port(v)
return v unless v
if @opaque
raise InvalidURIError,
"can not set port with registry or opaque"
elsif !v.kind_of?(Fixnum) && parser.regexp[:PORT] !~ v
raise InvalidComponentError,
"bad component(expected port component): #{v.inspect}"
end
return true
end проверить компонент порта v на соответствие RFC2396 и по отношению к Regexp для :PORT в URI::Parser
Нельзя определять регистр или компонент opaque, если определён компонент порта.
# File lib/uri/generic.rb, line 316
def check_scheme(v)
if v && parser.regexp[:SCHEME] !~ v
raise InvalidComponentError,
"bad component(expected scheme component): #{v}"
end
return true
end проверить компонент схемы v по отношению к Regexp для :SCHEME в URI::Parser
# File lib/uri/generic.rb, line 391
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 проверить компонент пользователя v на соответствие RFC2396 и по отношению к Regexp для :USERINFO в URI::Parser
Нельзя определять регистр или компонент opaque, если определён компонент пользователя.
# File lib/uri/generic.rb, line 373
def check_userinfo(user, password = nil)
if !password
user, password = split_userinfo(user)
end
check_user(user)
check_password(password, user)
return true
end проверить user и password.
Если password не предоставлен, то user разбивается, используя #split_userinfo, чтобы извлечь user и +password.
см. также #check_user, #check_password
# File lib/uri/generic.rb, line 553 def escape_userpass(v) parser.escape(v, /[@:\/]/o) # RFC 1738 section 3.1 #/ end
экранирует 'user:password' v согласно RFC 1738, раздел 3.1
# File lib/uri/generic.rb, line 1139
def merge0(oth)
oth = parser.send(:convert_to_uri, oth)
if self.relative? && oth.relative?
raise BadURIError,
"both URI are relative"
end
if self.absolute? && oth.absolute?
#raise BadURIError,
# "both URI are absolute"
# hmm... should return oth for usability?
return oth, oth
end
if self.absolute?
return self.dup, oth
else
return oth, oth
end
end возвращает базовый и относительный. Вы можете изменить `base`, но не `rel`.
# File lib/uri/generic.rb, line 986
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 Объединяет базовый путь base, с относительным путем rel, возвращает измененный базовый путь.
# File lib/uri/generic.rb, line 295
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 заменяет себя объектом другого URI
# File lib/uri/generic.rb, line 977
def split_path(path)
path.split(%r{/+}, -1)
end возвращает массив, разбитый по '/'
# File lib/uri/generic.rb, line 544
def split_userinfo(ui)
return nil, nil unless ui
user, password = ui.split(':'.freeze, 2)
return user, password
end возвращает данные ui как пользователь, пароль, если правильно отформатировано как 'user:password'
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.