Модуль URI
frozen_string_literal: false URI — это модуль, предоставляющий классы для обработки универсальных идентификаторов ресурсов (RFC2396)
Особенности
-
Единая обработка URI
-
Гибкость для внедрения пользовательских схем URI
-
Гибкость для использования альтернативного парсера URI (или просто разных шаблонов и регулярных выражений)
Базовый пример
require 'uri'
uri = URI("http://foo.com/posts?id=30&limit=5#time=1305298413")
#=> #<URI::HTTP:0x00000000b14880
URL:http://foo.com/posts?id=30&limit=5#time=1305298413>
uri.scheme
#=> "http"
uri.host
#=> "foo.com"
uri.path
#=> "/posts"
uri.query
#=> "id=30&limit=5"
uri.fragment
#=> "time=1305298413"
uri.to_s
#=> "http://foo.com/posts?id=30&limit=5#time=1305298413" Добавление пользовательских URI
module URI
class RSYNC < Generic
DEFAULT_PORT = 873
end
@@schemes['RSYNC'] = RSYNC
end
#=> URI::RSYNC
URI.scheme_list
#=> {"FTP"=>URI::FTP, "HTTP"=>URI::HTTP, "HTTPS"=>URI::HTTPS,
"LDAP"=>URI::LDAP, "LDAPS"=>URI::LDAPS, "MAILTO"=>URI::MailTo,
"RSYNC"=>URI::RSYNC}
uri = URI("rsync://rsync.foo.com")
#=> #<URI::RSYNC:0x00000000f648c8 URL:rsync://rsync.foo.com> Ссылки на RFC
Хорошее место для просмотра спецификации RFC — www.ietf.org/rfc.html
Вот список всех связанных RFC.
Дерево классов
-
URI::Generic (в uri/generic.rb)
-
URI::FTP - (в uri/ftp.rb)
-
URI::HTTP - (в uri/http.rb)
-
URI::HTTPS - (в uri/https.rb)
-
-
URI::LDAP - (в uri/ldap.rb)
-
URI::LDAPS - (в uri/ldaps.rb)
-
-
URI::MailTo - (в uri/mailto.rb)
-
-
URI::Parser - (в uri/common.rb)
-
URI::REGEXP - (в uri/common.rb)
-
URI::REGEXP::PATTERN - (в uri/common.rb)
-
-
URI::Util - (в uri/common.rb)
-
URI::Escape - (в uri/common.rb)
-
URI::Error - (в uri/common.rb)
-
URI::InvalidURIError - (в uri/common.rb)
-
URI::InvalidComponentError - (в uri/common.rb)
-
URI::BadURIError - (в uri/common.rb)
-
Информация о копирайтах
- Автор
-
Akira Yamada <akira@ruby-lang.org>
- Документация
-
Akira Yamada <akira@ruby-lang.org> Dmitry V. Sabanin <sdmitry@lrn.ru> Vincent Batts <vbatts@hashbangbash.com>
- Лицензия
-
Авторские права © 2001 akira yamada <akira@ruby-lang.org> Вы можете перераспределять его и/или изменять его в соответствии с теми же условиями, что и Ruby.
- Ревизия
-
$Id: uri.rb 53141 2015-12-16 05:07:31Z naruse $
frozen_string_literal: false
frozen_string_literal: false
Константы
- DEFAULT_PARSER
-
URI::Parser.new
- Parser
- REGEXP
- RFC3986_PARSER
Публичные методы класса
# File lib/uri/common.rb, line 450
def self.decode_www_form(str, enc=Encoding::UTF_8, separator: '&', use__charset_: false, isindex: false)
raise ArgumentError, "the input of #{self.name}.#{__method__} must be ASCII only string" unless str.ascii_only?
ary = []
return ary if str.empty?
enc = Encoding.find(enc)
str.b.each_line(separator) do |string|
string.chomp!(separator)
key, sep, val = string.partition('=')
if isindex
if sep.empty?
val = key
key = ''
end
isindex = false
end
if use__charset_ and key == '_charset_' and e = get_encoding(val)
enc = e
use__charset_ = false
end
key.gsub!(/\+|%\h\h/, TBLDECWWWCOMP_)
if val
val.gsub!(/\+|%\h\h/, TBLDECWWWCOMP_)
else
val = ''
end
ary << [key, val]
end
ary.each do |k, v|
k.force_encoding(enc)
k.scrub!
v.force_encoding(enc)
v.scrub!
end
ary
end Декодирует данные формы URL-кодированные из заданного str.
Это декодирует данные application/x-www-form-urlencoded и возвращает массив массивов ключ-значение.
Это ссылается на url.spec.whatwg.org/#concept-urlencoded-parser, поэтому поддерживает только разделитель &, не поддерживает разделитель ;-.
ary = URI.decode_www_form("a=1&a=2&b=3")
p ary #=> [['a', '1'], ['a', '2'], ['b', '3']]
p ary.assoc('a').last #=> '1'
p ary.assoc('b').last #=> '3'
p ary.rassoc('a').last #=> '2'
p Hash[ary] # => {"a"=>"2", "b"=>"3"}
# File lib/uri/common.rb, line 382
def self.decode_www_form_component(str, enc=Encoding::UTF_8)
raise ArgumentError, "invalid %-encoding (#{str})" if /%(?!\h\h)/ =~ str
str.b.gsub(/\+|%\h\h/, TBLDECWWWCOMP_).force_encoding(enc)
end Декодирует заданную str URL-кодированных данных формы.
Это декодирует + в пробел.
# File lib/uri/common.rb, line 414
def self.encode_www_form(enum, enc=nil)
enum.map do |k,v|
if v.nil?
encode_www_form_component(k, enc)
elsif v.respond_to?(:to_ary)
v.to_ary.map do |w|
str = encode_www_form_component(k, enc)
unless w.nil?
str << '='
str << encode_www_form_component(w, enc)
end
end.join('&')
else
str = encode_www_form_component(k, enc)
str << '='
str << encode_www_form_component(v, enc)
end
end.join('&')
end Генерирует данные URL-кодированной формы из заданного enum.
Это генерирует данные application/x-www-form-urlencoded, определенные в HTML5, из заданного объекта Enumerable.
Внутренне использует ::encode_www_form_component.
Этот метод не преобразует кодировку заданных элементов, поэтому преобразуйте их перед вызовом этого метода, если вы хотите отправить данные в кодировке, отличной от исходной, или в смешанной кодировке. (Строки, закодированные в кодировке, несовместимой с HTML5 ASCII, преобразуются в UTF-8.)
Этот метод не обрабатывает файлы. При отправке файла используйте multipart/form-data.
Это ссылается на url.spec.whatwg.org/#concept-urlencoded-serializer
URI.encode_www_form([["q", "ruby"], ["lang", "en"]])
#=> "q=ruby&lang=en"
URI.encode_www_form("q" => "ruby", "lang" => "en")
#=> "q=ruby&lang=en"
URI.encode_www_form("q" => ["ruby", "perl"], "lang" => "en")
#=> "q=ruby&q=perl&lang=en"
URI.encode_www_form([["q", "ruby"], ["q", "perl"], ["lang", "en"]])
#=> "q=ruby&q=perl&lang=en"
# File lib/uri/common.rb, line 364
def self.encode_www_form_component(str, enc=nil)
str = str.to_s.dup
if str.encoding != Encoding::ASCII_8BIT
if enc && enc != Encoding::ASCII_8BIT
str.encode!(Encoding::UTF_8, invalid: :replace, undef: :replace)
str.encode!(enc, fallback: ->(x){"&#{x.ord};"})
end
str.force_encoding(Encoding::ASCII_8BIT)
end
str.gsub!(/[^*\-.0-9A-Z_a-z]/, TBLENCWWWCOMP_)
str.force_encoding(Encoding::US_ASCII)
end Кодирует заданную str в URL-кодированные данные формы.
Этот метод не преобразует *, -, ., 0-9, A-Z, _, a-z, но преобразует пробел (ASCII) в + и преобразует другие символы в %XX.
Если enc задан, преобразуйте str в кодировку перед кодированием в проценты.
Это реализация www.w3.org/TR/2013/CR-html5-20130806/forms.html#url-encoded-form-data
# File lib/uri/common.rb, line 292
def self.extract(str, schemes = nil, &block)
warn "#{caller(1)[0]}: warning: URI.extract is obsolete" if $VERBOSE
DEFAULT_PARSER.extract(str, schemes, &block)
end Описание
URI::extract(str[, schemes][,&blk])
Аргументы
-
str -
Строка, из которой извлекаются URI.
-
schemes -
Ограничить соответствие URI определенными схемами.
Описание
Извлекает URI из строки. Если блок задан, итерируется по всем совпавшим URI. Возвращает nil, если блок задан, или массив совпадений.
Использование
require "uri"
URI.extract("text here http://foo.example.org/bla and here mailto:test@example.com and here also.")
# => ["http://foo.example.com/bla", "mailto:test@example.com"]
# File lib/uri/common.rb, line 264 def self.join(*str) RFC3986_PARSER.join(*str) end
Описание
URI::join(str[, str, ...])
Аргументы
-
str -
Строка(и), с которыми нужно работать, будут преобразованы в URI RFC3986 перед объединением.
Описание
Объединяет URI.
Использование
require 'uri'
p URI.join("http://example.com/","main.rbx")
# => #<URI::HTTP:0x2022ac02 URL:http://example.com/main.rbx>
p URI.join('http://example.com', 'foo')
# => #<URI::HTTP:0x01ab80a0 URL:http://example.com/foo>
p URI.join('http://example.com', '/foo', '/bar')
# => #<URI::HTTP:0x01aaf0b0 URL:http://example.com/bar>
p URI.join('http://example.com', '/foo', 'bar')
# => #<URI::HTTP:0x801a92af0 URL:http://example.com/bar>
p URI.join('http://example.com', '/foo/', 'bar')
# => #<URI::HTTP:0x80135a3a0 URL:http://example.com/foo/bar>
# File lib/uri/common.rb, line 226 def self.parse(uri) RFC3986_PARSER.parse(uri) end
Описание
URI::parse(uri_str)
Аргументы
-
uri_str -
Строка с URI.
Описание
Создает экземпляр одного из подклассов URI из строки.
Возбуждает
Raised if URI given is not a correct one.
Использование
require 'uri'
uri = URI.parse("http://www.ruby-lang.org/")
p uri
# => #<URI::HTTP:0x202281be URL:http://www.ruby-lang.org/>
p uri.scheme
# => "http"
p uri.host
# => "www.ruby-lang.org"
Рекомендуется сначала ::escape предоставленного uri_str, если есть какие-либо недопустимые символы URI.
# File lib/uri/common.rb, line 328
def self.regexp(schemes = nil)
warn "#{caller(1)[0]}: warning: URI.regexp is obsolete" if $VERBOSE
DEFAULT_PARSER.make_regexp(schemes)
end Описание
URI::regexp([match_schemes])
Аргументы
-
match_schemes -
Массив схем. Если задан, результирующий regexp соответствует URI, схема которого является одним из match_schemes.
Описание
Возвращает объект Regexp, который соответствует строкам, похожим на URI. Объект Regexp, возвращаемый этим методом, включает произвольное количество групп захвата (скобки). Никогда не полагайтесь на их количество.
Использование
require 'uri' # extract first URI from html_string html_string.slice(URI.regexp) # remove ftp URIs html_string.sub(URI.regexp(['ftp']) # You should not rely on the number of parentheses html_string.scan(URI.regexp) do |*matches| p $& end
# File lib/uri/common.rb, line 136 def self.scheme_list @@schemes end
Возвращает Hash определенных схем
# File lib/uri/common.rb, line 188 def self.split(uri) RFC3986_PARSER.split(uri) end
Описание
URI::split(uri)
Аргументы
-
uri -
Строка с URI.
Описание
Разделяет строку на следующие части и возвращает массив с результатом:
* Scheme * Userinfo * Host * Port * Registry * Path * Opaque * Query * Fragment
Использование
require 'uri'
p URI.split("http://www.ruby-lang.org/")
# => ["http", nil, "www.ruby-lang.org", nil, nil, "/", nil, nil, nil]
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.