Modul URI
URI ist ein Modul, das Klassen zur Verarbeitung von Uniform Resource Identifiers (RFC2396) bereitstellt.
Funktionen
-
Einheitliche Handhabung von URIs.
-
Flexibilität zur Einführung benutzerdefinierter
URI-Schemata. -
Flexibilität für einen alternativen URI::Parser (oder einfach unterschiedliche Muster und reguläre Ausdrücke).
Grundlegendes Beispiel
require 'uri' uri = URI("http://foo.com/posts?id=30&limit=5#time=1305298413") #=> #<URI::HTTP 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"
Hinzufügen benutzerdefinierter URIs
module URI class RSYNC < Generic DEFAULT_PORT = 873 end register_scheme 'RSYNC', RSYNC end #=> URI::RSYNC URI.scheme_list #=> {"FILE"=>URI::File, "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 rsync://rsync.foo.com>
RFC-Referenzen
Ein guter Ort, um eine RFC-Spezifikation anzuzeigen, ist www.ietf.org/rfc.html.
Hier ist eine Liste aller verwandten RFCs
Klassenbaum
-
URI::Generic(in uri/generic.rb)-
URI::File- (in uri/file.rb) -
URI::FTP- (in uri/ftp.rb) -
URI::HTTP- (in uri/http.rb)-
URI::HTTPS- (in uri/https.rb)
-
-
URI::LDAP- (in uri/ldap.rb)-
URI::LDAPS- (in uri/ldaps.rb)
-
-
URI::MailTo- (in uri/mailto.rb)
-
-
URI::Parser - (in uri/common.rb)
-
URI::REGEXP - (in uri/common.rb)
-
URI::REGEXP::PATTERN - (in uri/common.rb)
-
-
URI::Util - (in uri/common.rb)
-
URI::Error- (in uri/common.rb)-
URI::InvalidURIError- (in uri/common.rb) -
URI::InvalidComponentError- (in uri/common.rb) -
URI::BadURIError- (in uri/common.rb)
-
Copyright-Informationen
- Autor
-
Akira Yamada <akira@ruby-lang.org>
- Dokumentation
-
Akira Yamada <akira@ruby-lang.org> Dmitry V. Sabanin <sdmitry@lrn.ru> Vincent Batts <vbatts@hashbangbash.com>
- Lizenz
-
Copyright © 2001 akira yamada <akira@ruby-lang.org> Sie dürfen diese weiterverbreiten und/oder modifizieren unter denselben Bedingungen wie Ruby.
Constants
- DEFAULT_PARSER
-
Die Standard-Parser-Instanz.
- RFC2396_PARSER
-
Die Standard-Parser-Instanz für RFC 2396.
- RFC3986_PARSER
-
Die Standard-Parser-Instanz für RFC 3986.
Öffentliche Klassenmethoden
Source
# File lib/uri/common.rb, line 441 def self.decode_uri_component(str, enc=Encoding::UTF_8) _decode_uri_component(/%\h\h/, str, enc) end
Ähnlich wie URI.decode_www_form_component, außer dass '+' beibehalten wird.
Source
# File lib/uri/common.rb, line 620 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
Gibt Namens-/Wertpaare zurück, die aus der gegebenen Zeichenkette str abgeleitet wurden, welche eine ASCII-Zeichenkette sein muss.
Die Methode kann verwendet werden, um den Body eines Net::HTTPResponse-Objekts res zu dekodieren, für das res['Content-Type'] gleich 'application/x-www-form-urlencoded' ist.
Die zurückgegebenen Daten sind ein Array von 2-elementigen Unterarrays; jedes Unterarray ist ein Namens-/Wertpaar (beide sind Zeichenketten). Jede zurückgegebene Zeichenkette hat die Kodierung enc und ungültige Zeichen wurden durch String#scrub entfernt.
Ein einfaches Beispiel
URI.decode_www_form('foo=0&bar=1&baz') # => [["foo", "0"], ["bar", "1"], ["baz", ""]]
Die zurückgegebenen Zeichenketten haben bestimmte Konvertierungen, ähnlich denen, die in URI.decode_www_form_component durchgeführt werden.
URI.decode_www_form('f%23o=%2F&b-r=%24&b+z=%40') # => [["f#o", "/"], ["b-r", "$"], ["b z", "@"]]
Die gegebene Zeichenkette kann aufeinanderfolgende Trennzeichen enthalten.
URI.decode_www_form('foo=0&&bar=1&&baz=2') # => [["foo", "0"], ["", ""], ["bar", "1"], ["", ""], ["baz", "2"]]
Ein anderes Trennzeichen kann angegeben werden.
URI.decode_www_form('foo=0--bar=1--baz', separator: '--') # => [["foo", "0"], ["bar", "1"], ["baz", ""]]
Source
# File lib/uri/common.rb, line 430 def self.decode_www_form_component(str, enc=Encoding::UTF_8) _decode_uri_component(/\+|%\h\h/, str, enc) end
Gibt eine Zeichenkette zurück, die aus der gegebenen URL-kodierten Zeichenkette str dekodiert wurde.
Die gegebene Zeichenkette wird zuerst als Encoding::ASCII_8BIT (unter Verwendung von String#b) kodiert, dann dekodiert (wie unten) und schließlich mit der gegebenen Kodierung enc erzwungen kodiert.
Die zurückgegebene Zeichenkette
-
Behält bei
-
Die Zeichen
'*','.','-'und'_'. -
Zeichen im Bereich
'a'..'z','A'..'Z'und'0'..'9'.
Beispiel
URI.decode_www_form_component('*.-_azAZ09') # => "*.-_azAZ09"
-
-
Konvertiert
-
Das Zeichen
'+'in das Zeichen' '. -
Jede „Prozentnotation“ in ein ASCII-Zeichen.
Beispiel
URI.decode_www_form_component('Here+are+some+punctuation+characters%3A+%2C%3B%3F%3A') # => "Here are some punctuation characters: ,;?:"
-
Verwandt: URI.decode_uri_component (behält '+' bei).
Source
# File lib/uri/common.rb, line 436 def self.encode_uri_component(str, enc=nil) _encode_uri_component(/[^*\-.0-9A-Z_a-z]/, TBLENCURICOMP_, str, enc) end
Ähnlich wie URI.encode_www_form_component, außer dass ' ' (Leerzeichen) als '%20' kodiert wird (anstatt als '+').
Source
# File lib/uri/common.rb, line 567 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
Gibt eine URL-kodierte Zeichenkette zurück, die aus dem gegebenen Enumerable enum abgeleitet wurde.
Das Ergebnis eignet sich für die Verwendung als Formulardaten für eine HTTP-Anfrage, deren Content-Type 'application/x-www-form-urlencoded' lautet.
Die zurückgegebene Zeichenkette besteht aus den Elementen von enum, die jeweils in eine oder mehrere URL-kodierte Zeichenketten konvertiert und alle mit dem Zeichen '&' verbunden sind.
Einfache Beispiele
URI.encode_www_form([['foo', 0], ['bar', 1], ['baz', 2]]) # => "foo=0&bar=1&baz=2" URI.encode_www_form({foo: 0, bar: 1, baz: 2}) # => "foo=0&bar=1&baz=2"
Die zurückgegebene Zeichenkette wird mit der Methode URI.encode_www_form_component gebildet, die bestimmte Zeichen konvertiert.
URI.encode_www_form('f#o': '/', 'b-r': '$', 'b z': '@') # => "f%23o=%2F&b-r=%24&b+z=%40"
Wenn enum Array-ähnlich ist, wird jedes Element ele in ein Feld konvertiert.
-
Wenn
eleein Array mit zwei oder mehr Elementen ist, wird das Feld aus seinen ersten beiden Elementen gebildet (und alle zusätzlichen Elemente werden ignoriert).name = URI.encode_www_form_component(ele[0], enc) value = URI.encode_www_form_component(ele[1], enc) "#{name}=#{value}"
Beispiele
URI.encode_www_form([%w[foo bar], %w[baz bat bah]]) # => "foo=bar&baz=bat" URI.encode_www_form([['foo', 0], ['bar', :baz, 'bat']]) # => "foo=0&bar=baz"
-
Wenn
eleein Array mit einem Element ist, wird das Feld ausele[0]gebildet.URI.encode_www_form_component(ele[0])
Beispiel
URI.encode_www_form([['foo'], [:bar], [0]]) # => "foo&bar&0"
-
Andernfalls wird das Feld aus
elegebildet.URI.encode_www_form_component(ele)
Beispiel
URI.encode_www_form(['foo', :bar, 0]) # => "foo&bar&0"
Die Elemente eines Array-ähnlichen enum können gemischt sein.
URI.encode_www_form([['foo', 0], ['bar', 1, 2], ['baz'], :bat]) # => "foo=0&bar=1&baz&bat"
Wenn enum Hash-ähnlich ist, wird jedes key/value-Paar in ein oder mehrere Felder konvertiert.
-
Wenn
valueArray-konvertierbar ist, wird jedes Elementeleinvaluemitkeygepaart, um ein Feld zu bilden.name = URI.encode_www_form_component(key, enc) value = URI.encode_www_form_component(ele, enc) "#{name}=#{value}"
Beispiel
URI.encode_www_form({foo: [:bar, 1], baz: [:bat, :bam, 2]}) # => "foo=bar&foo=1&baz=bat&baz=bam&baz=2"
-
Andernfalls werden
keyundvaluegepaart, um ein Feld zu bilden.name = URI.encode_www_form_component(key, enc) value = URI.encode_www_form_component(value, enc) "#{name}=#{value}"
Beispiel
URI.encode_www_form({foo: 0, bar: 1, baz: 2}) # => "foo=0&bar=1&baz=2"
Die Elemente eines Hash-ähnlichen enum können gemischt sein.
URI.encode_www_form({foo: [0, 1], bar: 2}) # => "foo=0&foo=1&bar=2"
Source
# File lib/uri/common.rb, line 397 def self.encode_www_form_component(str, enc=nil) _encode_uri_component(/[^*\-.0-9A-Z_a-z]/, TBLENCWWWCOMP_, str, enc) end
Gibt eine URL-kodierte Zeichenkette zurück, die aus der gegebenen Zeichenkette str abgeleitet wurde.
Die zurückgegebene Zeichenkette
-
Behält bei
-
Die Zeichen
'*','.','-'und'_'. -
Zeichen im Bereich
'a'..'z','A'..'Z'und'0'..'9'.
Beispiel
URI.encode_www_form_component('*.-_azAZ09') # => "*.-_azAZ09"
-
-
Konvertiert
-
Das Zeichen
' 'in das Zeichen'+'. -
Jedes andere Zeichen in eine „Prozentnotation“; die Prozentnotation für das Zeichen *c* ist
'%%%X' % c.ord.
Beispiel
URI.encode_www_form_component('Here are some punctuation characters: ,;?:') # => "Here+are+some+punctuation+characters%3A+%2C%3B%3F%3A"
-
Encoding
-
Wenn
strdie Kodierung Encoding::ASCII_8BIT hat, wird das Argumentencignoriert. -
Andernfalls wird
strzuerst in Encoding::UTF_8 (mit geeigneten Zeichenersetzungen) und dann in die Kodierungenckonvertiert.
In beiden Fällen hat die zurückgegebene Zeichenkette die erzwungene Kodierung Encoding::US_ASCII.
Verwandt: URI.encode_uri_component (kodiert ' ' als '%20').
Source
# File lib/uri/common.rb, line 187 def self.for(scheme, *arguments, default: Generic) const_name = Schemes.escape(scheme) uri_class = INITIAL_SCHEMES[const_name] uri_class ||= Schemes.find(const_name) uri_class ||= default return uri_class.new(scheme, *arguments) end
Gibt ein neues Objekt zurück, das aus dem gegebenen scheme, arguments und default konstruiert wurde.
-
Das neue Objekt ist eine Instanz von
URI.scheme_list[scheme.upcase]. -
Das Objekt wird initialisiert, indem der Klasseninitialisierer unter Verwendung von
schemeundargumentsaufgerufen wird. SieheURI::Generic.new.
Beispiele
values = ['john.doe', 'www.example.com', '123', nil, '/forum/questions/', nil, 'tag=networking&order=newest', 'top'] URI.for('https', *values) # => #<URI::HTTPS https://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top> URI.for('foo', *values, default: URI::HTTP) # => #<URI::HTTP foo://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top>
Source
# File lib/uri/common.rb, line 273 def self.join(*str) DEFAULT_PARSER.join(*str) end
Führt die gegebenen URI-Zeichenketten str gemäß RFC 2396 zusammen.
Jede Zeichenkette in str wird vor dem Zusammenführen in eine RFC3986 URI konvertiert.
Beispiele
URI.join("http://example.com/","main.rbx") # => #<URI::HTTP http://example.com/main.rbx> URI.join('http://example.com', 'foo') # => #<URI::HTTP http://example.com/foo> URI.join('http://example.com', '/foo', '/bar') # => #<URI::HTTP http://example.com/bar> URI.join('http://example.com', '/foo', 'bar') # => #<URI::HTTP http://example.com/bar> URI.join('http://example.com', '/foo/', 'bar') # => #<URI::HTTP http://example.com/foo/bar>
Source
# File lib/open-uri.rb, line 23 def self.open(name, *rest, &block) if name.respond_to?(:open) name.open(*rest, &block) elsif name.respond_to?(:to_str) && %r{\A[A-Za-z][A-Za-z0-9+\-\.]*://} =~ name && (uri = URI.parse(name)).respond_to?(:open) uri.open(*rest, &block) else super end end
Ermöglicht das Öffnen verschiedener Ressourcen, einschließlich URIs.
Wenn das erste Argument auf die Methode 'open' reagiert, wird 'open' darauf mit den restlichen Argumenten aufgerufen.
Wenn das erste Argument eine Zeichenkette ist, die mit (protocol):// beginnt, wird sie von URI.parse analysiert. Wenn das analysierte Objekt auf die Methode 'open' reagiert, wird 'open' darauf mit den restlichen Argumenten aufgerufen.
Andernfalls wird Kernel#open aufgerufen.
OpenURI::OpenRead#open stellt URI::HTTP#open, URI::HTTPS#open und URI::FTP#open, Kernel#open bereit.
Wir können URIs und Zeichenketten akzeptieren, die mit http://, https:// und ftp:// beginnen. In diesen Fällen wird das geöffnete Dateiobjekt von OpenURI::Meta erweitert.
Source
# File lib/uri/common.rb, line 246 def self.parse(uri) PARSER.parse(uri) end
Gibt ein neues URI-Objekt zurück, das aus der gegebenen Zeichenkette uri konstruiert wurde.
URI.parse('https://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top') # => #<URI::HTTPS https://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top> URI.parse('http://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top') # => #<URI::HTTP http://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top>
Es wird empfohlen, zuerst die Zeichenkette uri mit URI::RFC2396_PARSER.escape zu escapen, wenn sie ungültige URI-Zeichen enthalten könnte.
Source
# File lib/uri/common.rb, line 29 def self.parser=(parser = RFC3986_PARSER) remove_const(:Parser) if defined?(::URI::Parser) const_set("Parser", parser.class) remove_const(:PARSER) if defined?(::URI::PARSER) const_set("PARSER", parser) remove_const(:REGEXP) if defined?(::URI::REGEXP) remove_const(:PATTERN) if defined?(::URI::PATTERN) if Parser == RFC2396_Parser const_set("REGEXP", URI::RFC2396_REGEXP) const_set("PATTERN", URI::RFC2396_REGEXP::PATTERN) end Parser.new.regexp.each_pair do |sym, str| remove_const(sym) if const_defined?(sym, false) const_set(sym, str) end end
Setzt die Standard-Parser-Instanz.
Source
# File lib/uri/common.rb, line 143 def self.register_scheme(scheme, klass) Schemes.register(scheme, klass) end
Registriert die gegebene klass als die Klasse, die instanziiert werden soll, wenn eine URI mit dem gegebenen scheme analysiert wird.
URI.register_scheme('MS_SEARCH', URI::Generic) # => URI::Generic URI.scheme_list['MS_SEARCH'] # => URI::Generic
Beachten Sie, dass nach dem Aufruf von String#upcase auf scheme, dieses ein gültiger Konstantenname sein muss.
Source
# File lib/uri/common.rb, line 161 def self.scheme_list Schemes.list end
Gibt einen Hash der definierten Schemata zurück.
URI.scheme_list # => {"MAILTO"=>URI::MailTo, "LDAPS"=>URI::LDAPS, "WS"=>URI::WS, "HTTP"=>URI::HTTP, "HTTPS"=>URI::HTTPS, "LDAP"=>URI::LDAP, "FILE"=>URI::File, "FTP"=>URI::FTP}
Verwandt: URI.register_scheme.
Source
# File lib/uri/common.rb, line 232 def self.split(uri) PARSER.split(uri) end
Gibt ein 9-elementiges Array zurück, das die Teile der aus der Zeichenkette uri gebildeten URI darstellt; jedes Array-Element ist eine Zeichenkette oder nil.
names = %w[scheme userinfo host port registry path opaque query fragment] values = URI.split('https://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top') names.zip(values) # => [["scheme", "https"], ["userinfo", "john.doe"], ["host", "www.example.com"], ["port", "123"], ["registry", nil], ["path", "/forum/questions/"], ["opaque", nil], ["query", "tag=networking&order=newest"], ["fragment", "top"]]
Private Klassenmethoden
Source
# File lib/uri/common.rb, line 463 def self._decode_uri_component(regexp, str, enc) raise ArgumentError, "invalid %-encoding (#{str})" if /%(?!\h\h)/.match?(str) str.b.gsub(regexp, TBLDECWWWCOMP_).force_encoding(enc) end
Gibt eine Zeichenkette zurück, die Zeichen dekodiert, die dem regexp aus der gegebenen URL-kodierten Zeichenkette str entsprechen.
Source
# File lib/uri/common.rb, line 447 def self._encode_uri_component(regexp, table, str, enc) 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!(regexp, table) str.force_encoding(Encoding::US_ASCII) end
Gibt eine Zeichenkette zurück, die aus der gegebenen Zeichenkette str abgeleitet wurde, mit URI-kodierten Zeichen, die regexp gemäß table entsprechen.