uri 0.13.2 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.document +5 -0
- data/.rdoc_options +5 -0
- data/{LICENSE.txt → BSDL} +3 -3
- data/COPYING +56 -0
- data/README.md +1 -1
- data/docs/kernel.rb +2 -0
- data/lib/uri/common.rb +96 -29
- data/lib/uri/file.rb +4 -4
- data/lib/uri/ftp.rb +1 -1
- data/lib/uri/generic.rb +55 -50
- data/lib/uri/http.rb +14 -2
- data/lib/uri/rfc2396_parser.rb +25 -17
- data/lib/uri/rfc3986_parser.rb +26 -3
- data/lib/uri/version.rb +2 -2
- data/lib/uri.rb +9 -9
- metadata +8 -17
- data/.github/dependabot.yml +0 -6
- data/.github/workflows/gh-pages.yml +0 -46
- data/.github/workflows/test.yml +0 -30
- data/.gitignore +0 -10
- data/Gemfile +0 -10
- data/Rakefile +0 -18
- data/bin/console +0 -14
- data/bin/setup +0 -8
- data/rakelib/sync_tool.rake +0 -17
- data/uri.gemspec +0 -39
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4d3b082505394be3f41eaa0d3a91a22ddf30e9064dc72c228fb46fb5131f2900
|
|
4
|
+
data.tar.gz: df272886d408cd1999654d23b1e3e7f6c9466e4e04b784bc462ed7d8ac609ba9
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5e6e478e4ea13c8436c8b51a3a67755de842ab718835ff8b3fcaa5520d77bbfdac83f7092b8d22dfe7e54ac33d1f21b8a1ab7c2dce0f8e73dde4f3fa7667dee2
|
|
7
|
+
data.tar.gz: 1cea8abe746b7ad37355e785ca627d6ddb86adbb565d3c6cd59ab44102d7dfa5c9efb75f9ca46fe8e3d9d400194f9571c259064f8828601f942054cdebd34f91
|
data/.rdoc_options
ADDED
data/{LICENSE.txt → BSDL}
RENAMED
|
@@ -4,10 +4,10 @@ Redistribution and use in source and binary forms, with or without
|
|
|
4
4
|
modification, are permitted provided that the following conditions
|
|
5
5
|
are met:
|
|
6
6
|
1. Redistributions of source code must retain the above copyright
|
|
7
|
-
notice, this list of conditions and the following disclaimer.
|
|
7
|
+
notice, this list of conditions and the following disclaimer.
|
|
8
8
|
2. Redistributions in binary form must reproduce the above copyright
|
|
9
|
-
notice, this list of conditions and the following disclaimer in the
|
|
10
|
-
documentation and/or other materials provided with the distribution.
|
|
9
|
+
notice, this list of conditions and the following disclaimer in the
|
|
10
|
+
documentation and/or other materials provided with the distribution.
|
|
11
11
|
|
|
12
12
|
THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
13
13
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
data/COPYING
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
Ruby is copyrighted free software by Yukihiro Matsumoto <matz@netlab.jp>.
|
|
2
|
+
You can redistribute it and/or modify it under either the terms of the
|
|
3
|
+
2-clause BSDL (see the file BSDL), or the conditions below:
|
|
4
|
+
|
|
5
|
+
1. You may make and give away verbatim copies of the source form of the
|
|
6
|
+
software without restriction, provided that you duplicate all of the
|
|
7
|
+
original copyright notices and associated disclaimers.
|
|
8
|
+
|
|
9
|
+
2. You may modify your copy of the software in any way, provided that
|
|
10
|
+
you do at least ONE of the following:
|
|
11
|
+
|
|
12
|
+
a. place your modifications in the Public Domain or otherwise
|
|
13
|
+
make them Freely Available, such as by posting said
|
|
14
|
+
modifications to Usenet or an equivalent medium, or by allowing
|
|
15
|
+
the author to include your modifications in the software.
|
|
16
|
+
|
|
17
|
+
b. use the modified software only within your corporation or
|
|
18
|
+
organization.
|
|
19
|
+
|
|
20
|
+
c. give non-standard binaries non-standard names, with
|
|
21
|
+
instructions on where to get the original software distribution.
|
|
22
|
+
|
|
23
|
+
d. make other distribution arrangements with the author.
|
|
24
|
+
|
|
25
|
+
3. You may distribute the software in object code or binary form,
|
|
26
|
+
provided that you do at least ONE of the following:
|
|
27
|
+
|
|
28
|
+
a. distribute the binaries and library files of the software,
|
|
29
|
+
together with instructions (in the manual page or equivalent)
|
|
30
|
+
on where to get the original distribution.
|
|
31
|
+
|
|
32
|
+
b. accompany the distribution with the machine-readable source of
|
|
33
|
+
the software.
|
|
34
|
+
|
|
35
|
+
c. give non-standard binaries non-standard names, with
|
|
36
|
+
instructions on where to get the original software distribution.
|
|
37
|
+
|
|
38
|
+
d. make other distribution arrangements with the author.
|
|
39
|
+
|
|
40
|
+
4. You may modify and include the part of the software into any other
|
|
41
|
+
software (possibly commercial). But some files in the distribution
|
|
42
|
+
are not written by the author, so that they are not under these terms.
|
|
43
|
+
|
|
44
|
+
For the list of those files and their copying conditions, see the
|
|
45
|
+
file LEGAL.
|
|
46
|
+
|
|
47
|
+
5. The scripts and library files supplied as input to or produced as
|
|
48
|
+
output from the software do not automatically fall under the
|
|
49
|
+
copyright of the software, but belong to whomever generated them,
|
|
50
|
+
and may be sold commercially, and may be aggregated with this
|
|
51
|
+
software.
|
|
52
|
+
|
|
53
|
+
6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
|
|
54
|
+
IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
|
55
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
56
|
+
PURPOSE.
|
data/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
[](https://github.com/ruby/uri/actions/workflows/test.yml)
|
|
4
4
|
[](https://ruby.github.io/uri/)
|
|
5
5
|
|
|
6
|
-
URI is a module providing classes to handle Uniform Resource Identifiers [
|
|
6
|
+
URI is a module providing classes to handle Uniform Resource Identifiers [RFC3986](http://tools.ietf.org/html/rfc3986).
|
|
7
7
|
|
|
8
8
|
## Features
|
|
9
9
|
|
data/docs/kernel.rb
ADDED
data/lib/uri/common.rb
CHANGED
|
@@ -13,26 +13,54 @@ require_relative "rfc2396_parser"
|
|
|
13
13
|
require_relative "rfc3986_parser"
|
|
14
14
|
|
|
15
15
|
module URI
|
|
16
|
-
|
|
16
|
+
# The default parser instance for RFC 2396.
|
|
17
|
+
RFC2396_PARSER = RFC2396_Parser.new
|
|
18
|
+
Ractor.make_shareable(RFC2396_PARSER) if defined?(Ractor)
|
|
17
19
|
|
|
18
|
-
|
|
19
|
-
Parser = RFC2396_Parser
|
|
20
|
+
# The default parser instance for RFC 3986.
|
|
20
21
|
RFC3986_PARSER = RFC3986_Parser.new
|
|
21
22
|
Ractor.make_shareable(RFC3986_PARSER) if defined?(Ractor)
|
|
22
|
-
RFC2396_PARSER = RFC2396_Parser.new
|
|
23
|
-
Ractor.make_shareable(RFC2396_PARSER) if defined?(Ractor)
|
|
24
23
|
|
|
25
|
-
#
|
|
26
|
-
DEFAULT_PARSER =
|
|
27
|
-
DEFAULT_PARSER
|
|
28
|
-
|
|
29
|
-
|
|
24
|
+
# The default parser instance.
|
|
25
|
+
DEFAULT_PARSER = RFC3986_PARSER
|
|
26
|
+
Ractor.make_shareable(DEFAULT_PARSER) if defined?(Ractor)
|
|
27
|
+
|
|
28
|
+
# Set the default parser instance.
|
|
29
|
+
def self.parser=(parser = RFC3986_PARSER)
|
|
30
|
+
remove_const(:Parser) if defined?(::URI::Parser)
|
|
31
|
+
const_set("Parser", parser.class)
|
|
32
|
+
|
|
33
|
+
remove_const(:PARSER) if defined?(::URI::PARSER)
|
|
34
|
+
const_set("PARSER", parser)
|
|
35
|
+
|
|
36
|
+
remove_const(:REGEXP) if defined?(::URI::REGEXP)
|
|
37
|
+
remove_const(:PATTERN) if defined?(::URI::PATTERN)
|
|
38
|
+
if Parser == RFC2396_Parser
|
|
39
|
+
const_set("REGEXP", URI::RFC2396_REGEXP)
|
|
40
|
+
const_set("PATTERN", URI::RFC2396_REGEXP::PATTERN)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
Parser.new.regexp.each_pair do |sym, str|
|
|
44
|
+
remove_const(sym) if const_defined?(sym, false)
|
|
45
|
+
const_set(sym, str)
|
|
30
46
|
end
|
|
31
47
|
end
|
|
32
|
-
|
|
33
|
-
|
|
48
|
+
self.parser = RFC3986_PARSER
|
|
49
|
+
|
|
50
|
+
def self.const_missing(const) # :nodoc:
|
|
51
|
+
if const == :REGEXP
|
|
52
|
+
warn "URI::REGEXP is obsolete. Use URI::RFC2396_REGEXP explicitly.", uplevel: 1 if $VERBOSE
|
|
53
|
+
URI::RFC2396_REGEXP
|
|
54
|
+
elsif value = RFC2396_PARSER.regexp[const]
|
|
55
|
+
warn "URI::#{const} is obsolete. Use URI::RFC2396_PARSER.regexp[#{const.inspect}] explicitly.", uplevel: 1 if $VERBOSE
|
|
56
|
+
value
|
|
57
|
+
elsif value = RFC2396_Parser.const_get(const)
|
|
58
|
+
warn "URI::#{const} is obsolete. Use URI::RFC2396_Parser::#{const} explicitly.", uplevel: 1 if $VERBOSE
|
|
59
|
+
value
|
|
60
|
+
else
|
|
61
|
+
super
|
|
62
|
+
end
|
|
34
63
|
end
|
|
35
|
-
Ractor.make_shareable(DEFAULT_PARSER) if defined?(Ractor)
|
|
36
64
|
|
|
37
65
|
module Util # :nodoc:
|
|
38
66
|
def make_components_hash(klass, array_hash)
|
|
@@ -66,7 +94,41 @@ module URI
|
|
|
66
94
|
module_function :make_components_hash
|
|
67
95
|
end
|
|
68
96
|
|
|
69
|
-
module Schemes
|
|
97
|
+
module Schemes # :nodoc:
|
|
98
|
+
class << self
|
|
99
|
+
ReservedChars = ".+-"
|
|
100
|
+
EscapedChars = "\u01C0\u01C1\u01C2"
|
|
101
|
+
# Use Lo category chars as escaped chars for TruffleRuby, which
|
|
102
|
+
# does not allow Symbol categories as identifiers.
|
|
103
|
+
|
|
104
|
+
def escape(name)
|
|
105
|
+
unless name and name.ascii_only?
|
|
106
|
+
return nil
|
|
107
|
+
end
|
|
108
|
+
name.upcase.tr(ReservedChars, EscapedChars)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def unescape(name)
|
|
112
|
+
name.tr(EscapedChars, ReservedChars).encode(Encoding::US_ASCII).upcase
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def find(name)
|
|
116
|
+
const_get(name, false) if name and const_defined?(name, false)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def register(name, klass)
|
|
120
|
+
unless scheme = escape(name)
|
|
121
|
+
raise ArgumentError, "invalid character as scheme - #{name}"
|
|
122
|
+
end
|
|
123
|
+
const_set(scheme, klass)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def list
|
|
127
|
+
constants.map { |name|
|
|
128
|
+
[unescape(name.to_s), const_get(name)]
|
|
129
|
+
}.to_h
|
|
130
|
+
end
|
|
131
|
+
end
|
|
70
132
|
end
|
|
71
133
|
private_constant :Schemes
|
|
72
134
|
|
|
@@ -79,7 +141,7 @@ module URI
|
|
|
79
141
|
# Note that after calling String#upcase on +scheme+, it must be a valid
|
|
80
142
|
# constant name.
|
|
81
143
|
def self.register_scheme(scheme, klass)
|
|
82
|
-
Schemes.
|
|
144
|
+
Schemes.register(scheme, klass)
|
|
83
145
|
end
|
|
84
146
|
|
|
85
147
|
# Returns a hash of the defined schemes:
|
|
@@ -97,14 +159,14 @@ module URI
|
|
|
97
159
|
#
|
|
98
160
|
# Related: URI.register_scheme.
|
|
99
161
|
def self.scheme_list
|
|
100
|
-
Schemes.
|
|
101
|
-
[name.to_s.upcase, Schemes.const_get(name)]
|
|
102
|
-
}.to_h
|
|
162
|
+
Schemes.list
|
|
103
163
|
end
|
|
104
164
|
|
|
165
|
+
# :stopdoc:
|
|
105
166
|
INITIAL_SCHEMES = scheme_list
|
|
106
167
|
private_constant :INITIAL_SCHEMES
|
|
107
168
|
Ractor.make_shareable(INITIAL_SCHEMES) if defined?(Ractor)
|
|
169
|
+
# :startdoc:
|
|
108
170
|
|
|
109
171
|
# Returns a new object constructed from the given +scheme+, +arguments+,
|
|
110
172
|
# and +default+:
|
|
@@ -123,12 +185,10 @@ module URI
|
|
|
123
185
|
# # => #<URI::HTTP foo://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top>
|
|
124
186
|
#
|
|
125
187
|
def self.for(scheme, *arguments, default: Generic)
|
|
126
|
-
const_name = scheme
|
|
188
|
+
const_name = Schemes.escape(scheme)
|
|
127
189
|
|
|
128
190
|
uri_class = INITIAL_SCHEMES[const_name]
|
|
129
|
-
uri_class ||=
|
|
130
|
-
Schemes.const_get(const_name, false)
|
|
131
|
-
end
|
|
191
|
+
uri_class ||= Schemes.find(const_name)
|
|
132
192
|
uri_class ||= default
|
|
133
193
|
|
|
134
194
|
return uri_class.new(scheme, *arguments)
|
|
@@ -170,7 +230,7 @@ module URI
|
|
|
170
230
|
# ["fragment", "top"]]
|
|
171
231
|
#
|
|
172
232
|
def self.split(uri)
|
|
173
|
-
|
|
233
|
+
PARSER.split(uri)
|
|
174
234
|
end
|
|
175
235
|
|
|
176
236
|
# Returns a new \URI object constructed from the given string +uri+:
|
|
@@ -180,11 +240,11 @@ module URI
|
|
|
180
240
|
# URI.parse('http://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top')
|
|
181
241
|
# # => #<URI::HTTP http://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top>
|
|
182
242
|
#
|
|
183
|
-
# It's recommended to first ::escape string +uri+
|
|
243
|
+
# It's recommended to first URI::RFC2396_PARSER.escape string +uri+
|
|
184
244
|
# if it may contain invalid URI characters.
|
|
185
245
|
#
|
|
186
246
|
def self.parse(uri)
|
|
187
|
-
|
|
247
|
+
PARSER.parse(uri)
|
|
188
248
|
end
|
|
189
249
|
|
|
190
250
|
# Merges the given URI strings +str+
|
|
@@ -211,7 +271,7 @@ module URI
|
|
|
211
271
|
# # => #<URI::HTTP http://example.com/foo/bar>
|
|
212
272
|
#
|
|
213
273
|
def self.join(*str)
|
|
214
|
-
|
|
274
|
+
DEFAULT_PARSER.join(*str)
|
|
215
275
|
end
|
|
216
276
|
|
|
217
277
|
#
|
|
@@ -240,7 +300,7 @@ module URI
|
|
|
240
300
|
#
|
|
241
301
|
def self.extract(str, schemes = nil, &block) # :nodoc:
|
|
242
302
|
warn "URI.extract is obsolete", uplevel: 1 if $VERBOSE
|
|
243
|
-
|
|
303
|
+
PARSER.extract(str, schemes, &block)
|
|
244
304
|
end
|
|
245
305
|
|
|
246
306
|
#
|
|
@@ -277,14 +337,14 @@ module URI
|
|
|
277
337
|
#
|
|
278
338
|
def self.regexp(schemes = nil)# :nodoc:
|
|
279
339
|
warn "URI.regexp is obsolete", uplevel: 1 if $VERBOSE
|
|
280
|
-
|
|
340
|
+
PARSER.make_regexp(schemes)
|
|
281
341
|
end
|
|
282
342
|
|
|
283
343
|
TBLENCWWWCOMP_ = {} # :nodoc:
|
|
284
344
|
256.times do |i|
|
|
285
345
|
TBLENCWWWCOMP_[-i.chr] = -('%%%02X' % i)
|
|
286
346
|
end
|
|
287
|
-
TBLENCURICOMP_ = TBLENCWWWCOMP_.dup.freeze
|
|
347
|
+
TBLENCURICOMP_ = TBLENCWWWCOMP_.dup.freeze # :nodoc:
|
|
288
348
|
TBLENCWWWCOMP_[' '] = '+'
|
|
289
349
|
TBLENCWWWCOMP_.freeze
|
|
290
350
|
TBLDECWWWCOMP_ = {} # :nodoc:
|
|
@@ -382,6 +442,8 @@ module URI
|
|
|
382
442
|
_decode_uri_component(/%\h\h/, str, enc)
|
|
383
443
|
end
|
|
384
444
|
|
|
445
|
+
# Returns a string derived from the given string +str+ with
|
|
446
|
+
# URI-encoded characters matching +regexp+ according to +table+.
|
|
385
447
|
def self._encode_uri_component(regexp, table, str, enc)
|
|
386
448
|
str = str.to_s.dup
|
|
387
449
|
if str.encoding != Encoding::ASCII_8BIT
|
|
@@ -396,6 +458,8 @@ module URI
|
|
|
396
458
|
end
|
|
397
459
|
private_class_method :_encode_uri_component
|
|
398
460
|
|
|
461
|
+
# Returns a string decoding characters matching +regexp+ from the
|
|
462
|
+
# given \URL-encoded string +str+.
|
|
399
463
|
def self._decode_uri_component(regexp, str, enc)
|
|
400
464
|
raise ArgumentError, "invalid %-encoding (#{str})" if /%(?!\h\h)/.match?(str)
|
|
401
465
|
str.b.gsub(regexp, TBLDECWWWCOMP_).force_encoding(enc)
|
|
@@ -834,6 +898,7 @@ module Kernel
|
|
|
834
898
|
# Returns a \URI object derived from the given +uri+,
|
|
835
899
|
# which may be a \URI string or an existing \URI object:
|
|
836
900
|
#
|
|
901
|
+
# require 'uri'
|
|
837
902
|
# # Returns a new URI.
|
|
838
903
|
# uri = URI('http://github.com/ruby/ruby')
|
|
839
904
|
# # => #<URI::HTTP http://github.com/ruby/ruby>
|
|
@@ -841,6 +906,8 @@ module Kernel
|
|
|
841
906
|
# URI(uri)
|
|
842
907
|
# # => #<URI::HTTP http://github.com/ruby/ruby>
|
|
843
908
|
#
|
|
909
|
+
# You must require 'uri' to use this method.
|
|
910
|
+
#
|
|
844
911
|
def URI(uri)
|
|
845
912
|
if uri.is_a?(URI::Generic)
|
|
846
913
|
uri
|
data/lib/uri/file.rb
CHANGED
|
@@ -47,7 +47,7 @@ module URI
|
|
|
47
47
|
# :path => '/ruby/src'})
|
|
48
48
|
# uri2.to_s # => "file://host.example.com/ruby/src"
|
|
49
49
|
#
|
|
50
|
-
# uri3 = URI::File.build({:path => URI::escape('/path/my file.txt')})
|
|
50
|
+
# uri3 = URI::File.build({:path => URI::RFC2396_PARSER.escape('/path/my file.txt')})
|
|
51
51
|
# uri3.to_s # => "file:///path/my%20file.txt"
|
|
52
52
|
#
|
|
53
53
|
def self.build(args)
|
|
@@ -70,17 +70,17 @@ module URI
|
|
|
70
70
|
|
|
71
71
|
# raise InvalidURIError
|
|
72
72
|
def check_userinfo(user)
|
|
73
|
-
raise URI::InvalidURIError, "
|
|
73
|
+
raise URI::InvalidURIError, "cannot set userinfo for file URI"
|
|
74
74
|
end
|
|
75
75
|
|
|
76
76
|
# raise InvalidURIError
|
|
77
77
|
def check_user(user)
|
|
78
|
-
raise URI::InvalidURIError, "
|
|
78
|
+
raise URI::InvalidURIError, "cannot set user for file URI"
|
|
79
79
|
end
|
|
80
80
|
|
|
81
81
|
# raise InvalidURIError
|
|
82
82
|
def check_password(user)
|
|
83
|
-
raise URI::InvalidURIError, "
|
|
83
|
+
raise URI::InvalidURIError, "cannot set password for file URI"
|
|
84
84
|
end
|
|
85
85
|
|
|
86
86
|
# do nothing
|
data/lib/uri/ftp.rb
CHANGED
|
@@ -17,7 +17,7 @@ module URI
|
|
|
17
17
|
# This class will be redesigned because of difference of implementations;
|
|
18
18
|
# the structure of its path. draft-hoffman-ftp-uri-04 is a draft but it
|
|
19
19
|
# is a good summary about the de facto spec.
|
|
20
|
-
#
|
|
20
|
+
# https://datatracker.ietf.org/doc/html/draft-hoffman-ftp-uri-04
|
|
21
21
|
#
|
|
22
22
|
class FTP < Generic
|
|
23
23
|
# A Default port of 21 for URI::FTP.
|
data/lib/uri/generic.rb
CHANGED
|
@@ -73,7 +73,7 @@ module URI
|
|
|
73
73
|
#
|
|
74
74
|
# At first, tries to create a new URI::Generic instance using
|
|
75
75
|
# URI::Generic::build. But, if exception URI::InvalidComponentError is raised,
|
|
76
|
-
# then it does URI::
|
|
76
|
+
# then it does URI::RFC2396_PARSER.escape all URI components and tries again.
|
|
77
77
|
#
|
|
78
78
|
def self.build2(args)
|
|
79
79
|
begin
|
|
@@ -82,7 +82,7 @@ module URI
|
|
|
82
82
|
if args.kind_of?(Array)
|
|
83
83
|
return self.build(args.collect{|x|
|
|
84
84
|
if x.is_a?(String)
|
|
85
|
-
|
|
85
|
+
URI::RFC2396_PARSER.escape(x)
|
|
86
86
|
else
|
|
87
87
|
x
|
|
88
88
|
end
|
|
@@ -91,7 +91,7 @@ module URI
|
|
|
91
91
|
tmp = {}
|
|
92
92
|
args.each do |key, value|
|
|
93
93
|
tmp[key] = if value
|
|
94
|
-
|
|
94
|
+
URI::RFC2396_PARSER.escape(value)
|
|
95
95
|
else
|
|
96
96
|
value
|
|
97
97
|
end
|
|
@@ -126,9 +126,9 @@ module URI
|
|
|
126
126
|
end
|
|
127
127
|
end
|
|
128
128
|
else
|
|
129
|
-
component = self.
|
|
129
|
+
component = self.component rescue ::URI::Generic::COMPONENT
|
|
130
130
|
raise ArgumentError,
|
|
131
|
-
|
|
131
|
+
"expected Array of or Hash of components of #{self} (#{component.join(', ')})"
|
|
132
132
|
end
|
|
133
133
|
|
|
134
134
|
tmp << nil
|
|
@@ -186,18 +186,18 @@ module URI
|
|
|
186
186
|
|
|
187
187
|
if arg_check
|
|
188
188
|
self.scheme = scheme
|
|
189
|
-
self.userinfo = userinfo
|
|
190
189
|
self.hostname = host
|
|
191
190
|
self.port = port
|
|
191
|
+
self.userinfo = userinfo
|
|
192
192
|
self.path = path
|
|
193
193
|
self.query = query
|
|
194
194
|
self.opaque = opaque
|
|
195
195
|
self.fragment = fragment
|
|
196
196
|
else
|
|
197
197
|
self.set_scheme(scheme)
|
|
198
|
-
self.set_userinfo(userinfo)
|
|
199
198
|
self.set_host(host)
|
|
200
199
|
self.set_port(port)
|
|
200
|
+
self.set_userinfo(userinfo)
|
|
201
201
|
self.set_path(path)
|
|
202
202
|
self.query = query
|
|
203
203
|
self.set_opaque(opaque)
|
|
@@ -284,7 +284,7 @@ module URI
|
|
|
284
284
|
|
|
285
285
|
# Returns the parser to be used.
|
|
286
286
|
#
|
|
287
|
-
# Unless
|
|
287
|
+
# Unless the +parser+ is defined, DEFAULT_PARSER is used.
|
|
288
288
|
#
|
|
289
289
|
def parser
|
|
290
290
|
if !defined?(@parser) || !@parser
|
|
@@ -315,7 +315,7 @@ module URI
|
|
|
315
315
|
end
|
|
316
316
|
|
|
317
317
|
#
|
|
318
|
-
# Checks the scheme +v+ component against the
|
|
318
|
+
# Checks the scheme +v+ component against the +parser+ Regexp for :SCHEME.
|
|
319
319
|
#
|
|
320
320
|
def check_scheme(v)
|
|
321
321
|
if v && parser.regexp[:SCHEME] !~ v
|
|
@@ -385,7 +385,7 @@ module URI
|
|
|
385
385
|
|
|
386
386
|
#
|
|
387
387
|
# Checks the user +v+ component for RFC2396 compliance
|
|
388
|
-
# and against the
|
|
388
|
+
# and against the +parser+ Regexp for :USERINFO.
|
|
389
389
|
#
|
|
390
390
|
# Can not have a registry or opaque component defined,
|
|
391
391
|
# with a user component defined.
|
|
@@ -393,7 +393,7 @@ module URI
|
|
|
393
393
|
def check_user(v)
|
|
394
394
|
if @opaque
|
|
395
395
|
raise InvalidURIError,
|
|
396
|
-
"
|
|
396
|
+
"cannot set user with opaque"
|
|
397
397
|
end
|
|
398
398
|
|
|
399
399
|
return v unless v
|
|
@@ -409,7 +409,7 @@ module URI
|
|
|
409
409
|
|
|
410
410
|
#
|
|
411
411
|
# Checks the password +v+ component for RFC2396 compliance
|
|
412
|
-
# and against the
|
|
412
|
+
# and against the +parser+ Regexp for :USERINFO.
|
|
413
413
|
#
|
|
414
414
|
# Can not have a registry or opaque component defined,
|
|
415
415
|
# with a user component defined.
|
|
@@ -417,7 +417,7 @@ module URI
|
|
|
417
417
|
def check_password(v, user = @user)
|
|
418
418
|
if @opaque
|
|
419
419
|
raise InvalidURIError,
|
|
420
|
-
"
|
|
420
|
+
"cannot set password with opaque"
|
|
421
421
|
end
|
|
422
422
|
return v unless v
|
|
423
423
|
|
|
@@ -511,7 +511,7 @@ module URI
|
|
|
511
511
|
user, password = split_userinfo(user)
|
|
512
512
|
end
|
|
513
513
|
@user = user
|
|
514
|
-
@password = password
|
|
514
|
+
@password = password
|
|
515
515
|
|
|
516
516
|
[@user, @password]
|
|
517
517
|
end
|
|
@@ -522,7 +522,7 @@ module URI
|
|
|
522
522
|
# See also URI::Generic.user=.
|
|
523
523
|
#
|
|
524
524
|
def set_user(v)
|
|
525
|
-
set_userinfo(v,
|
|
525
|
+
set_userinfo(v, nil)
|
|
526
526
|
v
|
|
527
527
|
end
|
|
528
528
|
protected :set_user
|
|
@@ -574,6 +574,12 @@ module URI
|
|
|
574
574
|
@password
|
|
575
575
|
end
|
|
576
576
|
|
|
577
|
+
# Returns the authority info (array of user, password, host and
|
|
578
|
+
# port), if any is set. Or returns +nil+.
|
|
579
|
+
def authority
|
|
580
|
+
return @user, @password, @host, @port if @user || @password || @host || @port
|
|
581
|
+
end
|
|
582
|
+
|
|
577
583
|
# Returns the user component after URI decoding.
|
|
578
584
|
def decoded_user
|
|
579
585
|
URI.decode_uri_component(@user) if @user
|
|
@@ -586,7 +592,7 @@ module URI
|
|
|
586
592
|
|
|
587
593
|
#
|
|
588
594
|
# Checks the host +v+ component for RFC2396 compliance
|
|
589
|
-
# and against the
|
|
595
|
+
# and against the +parser+ Regexp for :HOST.
|
|
590
596
|
#
|
|
591
597
|
# Can not have a registry or opaque component defined,
|
|
592
598
|
# with a host component defined.
|
|
@@ -596,7 +602,7 @@ module URI
|
|
|
596
602
|
|
|
597
603
|
if @opaque
|
|
598
604
|
raise InvalidURIError,
|
|
599
|
-
"
|
|
605
|
+
"cannot set host with registry or opaque"
|
|
600
606
|
elsif parser.regexp[:HOST] !~ v
|
|
601
607
|
raise InvalidComponentError,
|
|
602
608
|
"bad component(expected host component): #{v}"
|
|
@@ -615,6 +621,13 @@ module URI
|
|
|
615
621
|
end
|
|
616
622
|
protected :set_host
|
|
617
623
|
|
|
624
|
+
# Protected setter for the authority info (+user+, +password+, +host+
|
|
625
|
+
# and +port+). If +port+ is +nil+, +default_port+ will be set.
|
|
626
|
+
#
|
|
627
|
+
protected def set_authority(user, password, host, port = nil)
|
|
628
|
+
@user, @password, @host, @port = user, password, host, port || self.default_port
|
|
629
|
+
end
|
|
630
|
+
|
|
618
631
|
#
|
|
619
632
|
# == Args
|
|
620
633
|
#
|
|
@@ -639,6 +652,7 @@ module URI
|
|
|
639
652
|
def host=(v)
|
|
640
653
|
check_host(v)
|
|
641
654
|
set_host(v)
|
|
655
|
+
set_userinfo(nil)
|
|
642
656
|
v
|
|
643
657
|
end
|
|
644
658
|
|
|
@@ -675,7 +689,7 @@ module URI
|
|
|
675
689
|
|
|
676
690
|
#
|
|
677
691
|
# Checks the port +v+ component for RFC2396 compliance
|
|
678
|
-
# and against the
|
|
692
|
+
# and against the +parser+ Regexp for :PORT.
|
|
679
693
|
#
|
|
680
694
|
# Can not have a registry or opaque component defined,
|
|
681
695
|
# with a port component defined.
|
|
@@ -685,7 +699,7 @@ module URI
|
|
|
685
699
|
|
|
686
700
|
if @opaque
|
|
687
701
|
raise InvalidURIError,
|
|
688
|
-
"
|
|
702
|
+
"cannot set port with registry or opaque"
|
|
689
703
|
elsif !v.kind_of?(Integer) && parser.regexp[:PORT] !~ v
|
|
690
704
|
raise InvalidComponentError,
|
|
691
705
|
"bad component(expected port component): #{v.inspect}"
|
|
@@ -729,26 +743,27 @@ module URI
|
|
|
729
743
|
def port=(v)
|
|
730
744
|
check_port(v)
|
|
731
745
|
set_port(v)
|
|
746
|
+
set_userinfo(nil)
|
|
732
747
|
port
|
|
733
748
|
end
|
|
734
749
|
|
|
735
750
|
def check_registry(v) # :nodoc:
|
|
736
|
-
raise InvalidURIError, "
|
|
751
|
+
raise InvalidURIError, "cannot set registry"
|
|
737
752
|
end
|
|
738
753
|
private :check_registry
|
|
739
754
|
|
|
740
|
-
def set_registry(v)
|
|
741
|
-
raise InvalidURIError, "
|
|
755
|
+
def set_registry(v) # :nodoc:
|
|
756
|
+
raise InvalidURIError, "cannot set registry"
|
|
742
757
|
end
|
|
743
758
|
protected :set_registry
|
|
744
759
|
|
|
745
|
-
def registry=(v)
|
|
746
|
-
raise InvalidURIError, "
|
|
760
|
+
def registry=(v) # :nodoc:
|
|
761
|
+
raise InvalidURIError, "cannot set registry"
|
|
747
762
|
end
|
|
748
763
|
|
|
749
764
|
#
|
|
750
765
|
# Checks the path +v+ component for RFC2396 compliance
|
|
751
|
-
# and against the
|
|
766
|
+
# and against the +parser+ Regexp
|
|
752
767
|
# for :ABS_PATH and :REL_PATH.
|
|
753
768
|
#
|
|
754
769
|
# Can not have a opaque component defined,
|
|
@@ -853,7 +868,7 @@ module URI
|
|
|
853
868
|
|
|
854
869
|
#
|
|
855
870
|
# Checks the opaque +v+ component for RFC2396 compliance and
|
|
856
|
-
# against the
|
|
871
|
+
# against the +parser+ Regexp for :OPAQUE.
|
|
857
872
|
#
|
|
858
873
|
# Can not have a host, port, user, or path component defined,
|
|
859
874
|
# with an opaque component defined.
|
|
@@ -866,7 +881,7 @@ module URI
|
|
|
866
881
|
# hier_part = ( net_path | abs_path ) [ "?" query ]
|
|
867
882
|
if @host || @port || @user || @path # userinfo = @user + ':' + @password
|
|
868
883
|
raise InvalidURIError,
|
|
869
|
-
"
|
|
884
|
+
"cannot set opaque with host, port, userinfo or path"
|
|
870
885
|
elsif v && parser.regexp[:OPAQUE] !~ v
|
|
871
886
|
raise InvalidComponentError,
|
|
872
887
|
"bad component(expected opaque component): #{v}"
|
|
@@ -905,7 +920,7 @@ module URI
|
|
|
905
920
|
end
|
|
906
921
|
|
|
907
922
|
#
|
|
908
|
-
# Checks the fragment +v+ component against the
|
|
923
|
+
# Checks the fragment +v+ component against the +parser+ Regexp for :FRAGMENT.
|
|
909
924
|
#
|
|
910
925
|
#
|
|
911
926
|
# == Args
|
|
@@ -945,7 +960,7 @@ module URI
|
|
|
945
960
|
# == Description
|
|
946
961
|
#
|
|
947
962
|
# URI has components listed in order of decreasing significance from left to right,
|
|
948
|
-
# see RFC3986 https://
|
|
963
|
+
# see RFC3986 https://www.rfc-editor.org/rfc/rfc3986 1.2.3.
|
|
949
964
|
#
|
|
950
965
|
# == Usage
|
|
951
966
|
#
|
|
@@ -1121,7 +1136,7 @@ module URI
|
|
|
1121
1136
|
|
|
1122
1137
|
base = self.dup
|
|
1123
1138
|
|
|
1124
|
-
authority = rel.
|
|
1139
|
+
authority = rel.authority
|
|
1125
1140
|
|
|
1126
1141
|
# RFC2396, Section 5.2, 2)
|
|
1127
1142
|
if (rel.path.nil? || rel.path.empty?) && !authority && !rel.query
|
|
@@ -1134,9 +1149,7 @@ module URI
|
|
|
1134
1149
|
|
|
1135
1150
|
# RFC2396, Section 5.2, 4)
|
|
1136
1151
|
if authority
|
|
1137
|
-
base.
|
|
1138
|
-
base.set_host(rel.host)
|
|
1139
|
-
base.set_port(rel.port || base.default_port)
|
|
1152
|
+
base.set_authority(*authority)
|
|
1140
1153
|
base.set_path(rel.path)
|
|
1141
1154
|
elsif base.path && rel.path
|
|
1142
1155
|
base.set_path(merge_path(base.path, rel.path))
|
|
@@ -1234,7 +1247,7 @@ module URI
|
|
|
1234
1247
|
return rel, rel
|
|
1235
1248
|
end
|
|
1236
1249
|
|
|
1237
|
-
# you can modify `rel', but
|
|
1250
|
+
# you can modify `rel', but cannot `oth'.
|
|
1238
1251
|
return oth, rel
|
|
1239
1252
|
end
|
|
1240
1253
|
private :route_from0
|
|
@@ -1259,7 +1272,7 @@ module URI
|
|
|
1259
1272
|
# #=> #<URI::Generic /main.rbx?page=1>
|
|
1260
1273
|
#
|
|
1261
1274
|
def route_from(oth)
|
|
1262
|
-
# you can modify `rel', but
|
|
1275
|
+
# you can modify `rel', but cannot `oth'.
|
|
1263
1276
|
begin
|
|
1264
1277
|
oth, rel = route_from0(oth)
|
|
1265
1278
|
rescue
|
|
@@ -1363,6 +1376,9 @@ module URI
|
|
|
1363
1376
|
str << ':'
|
|
1364
1377
|
str << @port.to_s
|
|
1365
1378
|
end
|
|
1379
|
+
if (@host || @port) && !@path.empty? && !@path.start_with?('/')
|
|
1380
|
+
str << '/'
|
|
1381
|
+
end
|
|
1366
1382
|
str << @path
|
|
1367
1383
|
if @query
|
|
1368
1384
|
str << '?'
|
|
@@ -1388,29 +1404,18 @@ module URI
|
|
|
1388
1404
|
end
|
|
1389
1405
|
end
|
|
1390
1406
|
|
|
1407
|
+
# Returns the hash value.
|
|
1391
1408
|
def hash
|
|
1392
1409
|
self.component_ary.hash
|
|
1393
1410
|
end
|
|
1394
1411
|
|
|
1412
|
+
# Compares with _oth_ for Hash.
|
|
1395
1413
|
def eql?(oth)
|
|
1396
1414
|
self.class == oth.class &&
|
|
1397
1415
|
parser == oth.parser &&
|
|
1398
1416
|
self.component_ary.eql?(oth.component_ary)
|
|
1399
1417
|
end
|
|
1400
1418
|
|
|
1401
|
-
=begin
|
|
1402
|
-
|
|
1403
|
-
--- URI::Generic#===(oth)
|
|
1404
|
-
|
|
1405
|
-
=end
|
|
1406
|
-
# def ===(oth)
|
|
1407
|
-
# raise NotImplementedError
|
|
1408
|
-
# end
|
|
1409
|
-
|
|
1410
|
-
=begin
|
|
1411
|
-
=end
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
1419
|
# Returns an Array of the components defined from the COMPONENT Array.
|
|
1415
1420
|
def component_ary
|
|
1416
1421
|
component.collect do |x|
|
|
@@ -1447,7 +1452,7 @@ module URI
|
|
|
1447
1452
|
end
|
|
1448
1453
|
end
|
|
1449
1454
|
|
|
1450
|
-
def inspect
|
|
1455
|
+
def inspect # :nodoc:
|
|
1451
1456
|
"#<#{self.class} #{self}>"
|
|
1452
1457
|
end
|
|
1453
1458
|
|
|
@@ -1535,7 +1540,7 @@ module URI
|
|
|
1535
1540
|
else
|
|
1536
1541
|
unless proxy_uri = env[name]
|
|
1537
1542
|
if proxy_uri = env[name.upcase]
|
|
1538
|
-
warn 'The environment variable HTTP_PROXY is discouraged.
|
|
1543
|
+
warn 'The environment variable HTTP_PROXY is discouraged. Please use http_proxy instead.', uplevel: 1
|
|
1539
1544
|
end
|
|
1540
1545
|
end
|
|
1541
1546
|
end
|
data/lib/uri/http.rb
CHANGED
|
@@ -61,6 +61,18 @@ module URI
|
|
|
61
61
|
super(tmp)
|
|
62
62
|
end
|
|
63
63
|
|
|
64
|
+
# Do not allow empty host names, as they are not allowed by RFC 3986.
|
|
65
|
+
def check_host(v)
|
|
66
|
+
ret = super
|
|
67
|
+
|
|
68
|
+
if ret && v.empty?
|
|
69
|
+
raise InvalidComponentError,
|
|
70
|
+
"bad component(expected host component): #{v}"
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
ret
|
|
74
|
+
end
|
|
75
|
+
|
|
64
76
|
#
|
|
65
77
|
# == Description
|
|
66
78
|
#
|
|
@@ -85,7 +97,7 @@ module URI
|
|
|
85
97
|
# == Description
|
|
86
98
|
#
|
|
87
99
|
# Returns the authority for an HTTP uri, as defined in
|
|
88
|
-
# https://
|
|
100
|
+
# https://www.rfc-editor.org/rfc/rfc3986#section-3.2.
|
|
89
101
|
#
|
|
90
102
|
#
|
|
91
103
|
# Example:
|
|
@@ -106,7 +118,7 @@ module URI
|
|
|
106
118
|
# == Description
|
|
107
119
|
#
|
|
108
120
|
# Returns the origin for an HTTP uri, as defined in
|
|
109
|
-
# https://
|
|
121
|
+
# https://www.rfc-editor.org/rfc/rfc6454.
|
|
110
122
|
#
|
|
111
123
|
#
|
|
112
124
|
# Example:
|
data/lib/uri/rfc2396_parser.rb
CHANGED
|
@@ -67,7 +67,7 @@ module URI
|
|
|
67
67
|
#
|
|
68
68
|
# == Synopsis
|
|
69
69
|
#
|
|
70
|
-
# URI::
|
|
70
|
+
# URI::RFC2396_Parser.new([opts])
|
|
71
71
|
#
|
|
72
72
|
# == Args
|
|
73
73
|
#
|
|
@@ -86,7 +86,7 @@ module URI
|
|
|
86
86
|
#
|
|
87
87
|
# == Examples
|
|
88
88
|
#
|
|
89
|
-
# p = URI::
|
|
89
|
+
# p = URI::RFC2396_Parser.new(:ESCAPED => "(?:%[a-fA-F0-9]{2}|%u[a-fA-F0-9]{4})")
|
|
90
90
|
# u = p.parse("http://example.jp/%uABCD") #=> #<URI::HTTP http://example.jp/%uABCD>
|
|
91
91
|
# URI.parse(u.to_s) #=> raises URI::InvalidURIError
|
|
92
92
|
#
|
|
@@ -108,12 +108,12 @@ module URI
|
|
|
108
108
|
|
|
109
109
|
# The Hash of patterns.
|
|
110
110
|
#
|
|
111
|
-
# See also
|
|
111
|
+
# See also #initialize_pattern.
|
|
112
112
|
attr_reader :pattern
|
|
113
113
|
|
|
114
114
|
# The Hash of Regexp.
|
|
115
115
|
#
|
|
116
|
-
# See also
|
|
116
|
+
# See also #initialize_regexp.
|
|
117
117
|
attr_reader :regexp
|
|
118
118
|
|
|
119
119
|
# Returns a split URI against +regexp[:ABS_URI]+.
|
|
@@ -140,11 +140,11 @@ module URI
|
|
|
140
140
|
|
|
141
141
|
if !scheme
|
|
142
142
|
raise InvalidURIError,
|
|
143
|
-
"bad URI(absolute but no scheme): #{uri}"
|
|
143
|
+
"bad URI (absolute but no scheme): #{uri}"
|
|
144
144
|
end
|
|
145
145
|
if !opaque && (!path && (!host && !registry))
|
|
146
146
|
raise InvalidURIError,
|
|
147
|
-
"bad URI(absolute but no path): #{uri}"
|
|
147
|
+
"bad URI (absolute but no path): #{uri}"
|
|
148
148
|
end
|
|
149
149
|
|
|
150
150
|
when @regexp[:REL_URI]
|
|
@@ -173,7 +173,7 @@ module URI
|
|
|
173
173
|
# server = [ [ userinfo "@" ] hostport ]
|
|
174
174
|
|
|
175
175
|
else
|
|
176
|
-
raise InvalidURIError, "bad URI(is not URI?): #{uri}"
|
|
176
|
+
raise InvalidURIError, "bad URI (is not URI?): #{uri}"
|
|
177
177
|
end
|
|
178
178
|
|
|
179
179
|
path = '' if !path && !opaque # (see RFC2396 Section 5.2)
|
|
@@ -202,8 +202,7 @@ module URI
|
|
|
202
202
|
#
|
|
203
203
|
# == Usage
|
|
204
204
|
#
|
|
205
|
-
#
|
|
206
|
-
# p.parse("ldap://ldap.example.com/dc=example?user=john")
|
|
205
|
+
# URI::RFC2396_PARSER.parse("ldap://ldap.example.com/dc=example?user=john")
|
|
207
206
|
# #=> #<URI::LDAP ldap://ldap.example.com/dc=example?user=john>
|
|
208
207
|
#
|
|
209
208
|
def parse(uri)
|
|
@@ -244,7 +243,7 @@ module URI
|
|
|
244
243
|
# If no +block+ given, then returns the result,
|
|
245
244
|
# else it calls +block+ for each element in result.
|
|
246
245
|
#
|
|
247
|
-
# See also
|
|
246
|
+
# See also #make_regexp.
|
|
248
247
|
#
|
|
249
248
|
def extract(str, schemes = nil)
|
|
250
249
|
if block_given?
|
|
@@ -263,7 +262,7 @@ module URI
|
|
|
263
262
|
unless schemes
|
|
264
263
|
@regexp[:ABS_URI_REF]
|
|
265
264
|
else
|
|
266
|
-
/(
|
|
265
|
+
/(?=(?i:#{Regexp.union(*schemes).source}):)#{@pattern[:X_ABS_URI]}/x
|
|
267
266
|
end
|
|
268
267
|
end
|
|
269
268
|
|
|
@@ -321,14 +320,14 @@ module URI
|
|
|
321
320
|
str.gsub(escaped) { [$&[1, 2]].pack('H2').force_encoding(enc) }
|
|
322
321
|
end
|
|
323
322
|
|
|
324
|
-
|
|
325
|
-
if
|
|
326
|
-
def inspect
|
|
327
|
-
|
|
323
|
+
TO_S = Kernel.instance_method(:to_s) # :nodoc:
|
|
324
|
+
if TO_S.respond_to?(:bind_call)
|
|
325
|
+
def inspect # :nodoc:
|
|
326
|
+
TO_S.bind_call(self)
|
|
328
327
|
end
|
|
329
328
|
else
|
|
330
|
-
def inspect
|
|
331
|
-
|
|
329
|
+
def inspect # :nodoc:
|
|
330
|
+
TO_S.bind(self).call
|
|
332
331
|
end
|
|
333
332
|
end
|
|
334
333
|
|
|
@@ -524,6 +523,8 @@ module URI
|
|
|
524
523
|
ret
|
|
525
524
|
end
|
|
526
525
|
|
|
526
|
+
# Returns +uri+ as-is if it is URI, or convert it to URI if it is
|
|
527
|
+
# a String.
|
|
527
528
|
def convert_to_uri(uri)
|
|
528
529
|
if uri.is_a?(URI::Generic)
|
|
529
530
|
uri
|
|
@@ -536,4 +537,11 @@ module URI
|
|
|
536
537
|
end
|
|
537
538
|
|
|
538
539
|
end # class Parser
|
|
540
|
+
|
|
541
|
+
# Backward compatibility for URI::REGEXP::PATTERN::*
|
|
542
|
+
RFC2396_Parser.new.pattern.each_pair do |sym, str|
|
|
543
|
+
unless RFC2396_REGEXP::PATTERN.const_defined?(sym, false)
|
|
544
|
+
RFC2396_REGEXP::PATTERN.const_set(sym, str)
|
|
545
|
+
end
|
|
546
|
+
end
|
|
539
547
|
end # module URI
|
data/lib/uri/rfc3986_parser.rb
CHANGED
|
@@ -78,7 +78,7 @@ module URI
|
|
|
78
78
|
begin
|
|
79
79
|
uri = uri.to_str
|
|
80
80
|
rescue NoMethodError
|
|
81
|
-
raise InvalidURIError, "bad URI(is not URI?): #{uri.inspect}"
|
|
81
|
+
raise InvalidURIError, "bad URI (is not URI?): #{uri.inspect}"
|
|
82
82
|
end
|
|
83
83
|
uri.ascii_only? or
|
|
84
84
|
raise InvalidURIError, "URI must be ascii only #{uri.dump}"
|
|
@@ -127,7 +127,7 @@ module URI
|
|
|
127
127
|
m["fragment"]
|
|
128
128
|
]
|
|
129
129
|
else
|
|
130
|
-
raise InvalidURIError, "bad URI(is not URI?): #{uri.inspect}"
|
|
130
|
+
raise InvalidURIError, "bad URI (is not URI?): #{uri.inspect}"
|
|
131
131
|
end
|
|
132
132
|
end
|
|
133
133
|
|
|
@@ -135,12 +135,35 @@ module URI
|
|
|
135
135
|
URI.for(*self.split(uri), self)
|
|
136
136
|
end
|
|
137
137
|
|
|
138
|
-
|
|
139
138
|
def join(*uris) # :nodoc:
|
|
140
139
|
uris[0] = convert_to_uri(uris[0])
|
|
141
140
|
uris.inject :merge
|
|
142
141
|
end
|
|
143
142
|
|
|
143
|
+
# Compatibility for RFC2396 parser
|
|
144
|
+
def extract(str, schemes = nil, &block) # :nodoc:
|
|
145
|
+
warn "URI::RFC3986_PARSER.extract is obsolete. Use URI::RFC2396_PARSER.extract explicitly.", uplevel: 1 if $VERBOSE
|
|
146
|
+
RFC2396_PARSER.extract(str, schemes, &block)
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
# Compatibility for RFC2396 parser
|
|
150
|
+
def make_regexp(schemes = nil) # :nodoc:
|
|
151
|
+
warn "URI::RFC3986_PARSER.make_regexp is obsolete. Use URI::RFC2396_PARSER.make_regexp explicitly.", uplevel: 1 if $VERBOSE
|
|
152
|
+
RFC2396_PARSER.make_regexp(schemes)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# Compatibility for RFC2396 parser
|
|
156
|
+
def escape(str, unsafe = nil) # :nodoc:
|
|
157
|
+
warn "URI::RFC3986_PARSER.escape is obsolete. Use URI::RFC2396_PARSER.escape explicitly.", uplevel: 1 if $VERBOSE
|
|
158
|
+
unsafe ? RFC2396_PARSER.escape(str, unsafe) : RFC2396_PARSER.escape(str)
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# Compatibility for RFC2396 parser
|
|
162
|
+
def unescape(str, escaped = nil) # :nodoc:
|
|
163
|
+
warn "URI::RFC3986_PARSER.unescape is obsolete. Use URI::RFC2396_PARSER.unescape explicitly.", uplevel: 1 if $VERBOSE
|
|
164
|
+
escaped ? RFC2396_PARSER.unescape(str, escaped) : RFC2396_PARSER.unescape(str)
|
|
165
|
+
end
|
|
166
|
+
|
|
144
167
|
@@to_s = Kernel.instance_method(:to_s)
|
|
145
168
|
if @@to_s.respond_to?(:bind_call)
|
|
146
169
|
def inspect
|
data/lib/uri/version.rb
CHANGED
data/lib/uri.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: false
|
|
2
2
|
# URI is a module providing classes to handle Uniform Resource Identifiers
|
|
3
|
-
# (RFC2396[
|
|
3
|
+
# (RFC2396[https://www.rfc-editor.org/rfc/rfc2396]).
|
|
4
4
|
#
|
|
5
5
|
# == Features
|
|
6
6
|
#
|
|
@@ -47,14 +47,14 @@
|
|
|
47
47
|
# A good place to view an RFC spec is http://www.ietf.org/rfc.html.
|
|
48
48
|
#
|
|
49
49
|
# Here is a list of all related RFC's:
|
|
50
|
-
# - RFC822[
|
|
51
|
-
# - RFC1738[
|
|
52
|
-
# - RFC2255[
|
|
53
|
-
# - RFC2368[
|
|
54
|
-
# - RFC2373[
|
|
55
|
-
# - RFC2396[
|
|
56
|
-
# - RFC2732[
|
|
57
|
-
# - RFC3986[
|
|
50
|
+
# - RFC822[https://www.rfc-editor.org/rfc/rfc822]
|
|
51
|
+
# - RFC1738[https://www.rfc-editor.org/rfc/rfc1738]
|
|
52
|
+
# - RFC2255[https://www.rfc-editor.org/rfc/rfc2255]
|
|
53
|
+
# - RFC2368[https://www.rfc-editor.org/rfc/rfc2368]
|
|
54
|
+
# - RFC2373[https://www.rfc-editor.org/rfc/rfc2373]
|
|
55
|
+
# - RFC2396[https://www.rfc-editor.org/rfc/rfc2396]
|
|
56
|
+
# - RFC2732[https://www.rfc-editor.org/rfc/rfc2732]
|
|
57
|
+
# - RFC3986[https://www.rfc-editor.org/rfc/rfc3986]
|
|
58
58
|
#
|
|
59
59
|
# == Class tree
|
|
60
60
|
#
|
metadata
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: uri
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 1.1.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Akira Yamada
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: exe
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies: []
|
|
13
12
|
description: URI is a module providing classes to handle Uniform Resource Identifiers
|
|
14
13
|
email:
|
|
@@ -17,16 +16,12 @@ executables: []
|
|
|
17
16
|
extensions: []
|
|
18
17
|
extra_rdoc_files: []
|
|
19
18
|
files:
|
|
20
|
-
- ".
|
|
21
|
-
- ".
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
- Gemfile
|
|
25
|
-
- LICENSE.txt
|
|
19
|
+
- ".document"
|
|
20
|
+
- ".rdoc_options"
|
|
21
|
+
- BSDL
|
|
22
|
+
- COPYING
|
|
26
23
|
- README.md
|
|
27
|
-
-
|
|
28
|
-
- bin/console
|
|
29
|
-
- bin/setup
|
|
24
|
+
- docs/kernel.rb
|
|
30
25
|
- lib/uri.rb
|
|
31
26
|
- lib/uri/common.rb
|
|
32
27
|
- lib/uri/file.rb
|
|
@@ -42,8 +37,6 @@ files:
|
|
|
42
37
|
- lib/uri/version.rb
|
|
43
38
|
- lib/uri/ws.rb
|
|
44
39
|
- lib/uri/wss.rb
|
|
45
|
-
- rakelib/sync_tool.rake
|
|
46
|
-
- uri.gemspec
|
|
47
40
|
homepage: https://github.com/ruby/uri
|
|
48
41
|
licenses:
|
|
49
42
|
- Ruby
|
|
@@ -54,7 +47,6 @@ metadata:
|
|
|
54
47
|
documentation_uri: https://ruby.github.io/uri/
|
|
55
48
|
homepage_uri: https://github.com/ruby/uri
|
|
56
49
|
source_code_uri: https://github.com/ruby/uri
|
|
57
|
-
post_install_message:
|
|
58
50
|
rdoc_options: []
|
|
59
51
|
require_paths:
|
|
60
52
|
- lib
|
|
@@ -69,8 +61,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
69
61
|
- !ruby/object:Gem::Version
|
|
70
62
|
version: '0'
|
|
71
63
|
requirements: []
|
|
72
|
-
rubygems_version: 3.
|
|
73
|
-
signing_key:
|
|
64
|
+
rubygems_version: 3.6.9
|
|
74
65
|
specification_version: 4
|
|
75
66
|
summary: URI is a module providing classes to handle Uniform Resource Identifiers
|
|
76
67
|
test_files: []
|
data/.github/dependabot.yml
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
name: Deploy RDoc site to Pages
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches: [ 'master' ]
|
|
6
|
-
workflow_dispatch:
|
|
7
|
-
|
|
8
|
-
permissions:
|
|
9
|
-
contents: read
|
|
10
|
-
pages: write
|
|
11
|
-
id-token: write
|
|
12
|
-
|
|
13
|
-
concurrency:
|
|
14
|
-
group: "pages"
|
|
15
|
-
cancel-in-progress: true
|
|
16
|
-
|
|
17
|
-
jobs:
|
|
18
|
-
build:
|
|
19
|
-
runs-on: ubuntu-latest
|
|
20
|
-
steps:
|
|
21
|
-
- name: Checkout
|
|
22
|
-
uses: actions/checkout@v4
|
|
23
|
-
- name: Setup Ruby
|
|
24
|
-
uses: ruby/setup-ruby@250fcd6a742febb1123a77a841497ccaa8b9e939 # v1.152.0
|
|
25
|
-
with:
|
|
26
|
-
ruby-version: '3.2'
|
|
27
|
-
bundler-cache: true
|
|
28
|
-
- name: Setup Pages
|
|
29
|
-
id: pages
|
|
30
|
-
uses: actions/configure-pages@v3
|
|
31
|
-
- name: Build with RDoc
|
|
32
|
-
# Outputs to the './_site' directory by default
|
|
33
|
-
run: bundle exec rake rdoc
|
|
34
|
-
- name: Upload artifact
|
|
35
|
-
uses: actions/upload-pages-artifact@v2
|
|
36
|
-
|
|
37
|
-
deploy:
|
|
38
|
-
environment:
|
|
39
|
-
name: github-pages
|
|
40
|
-
url: ${{ steps.deployment.outputs.page_url }}
|
|
41
|
-
runs-on: ubuntu-latest
|
|
42
|
-
needs: build
|
|
43
|
-
steps:
|
|
44
|
-
- name: Deploy to GitHub Pages
|
|
45
|
-
id: deployment
|
|
46
|
-
uses: actions/deploy-pages@v2
|
data/.github/workflows/test.yml
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
name: CI
|
|
2
|
-
|
|
3
|
-
on: [push, pull_request]
|
|
4
|
-
|
|
5
|
-
jobs:
|
|
6
|
-
ruby-versions:
|
|
7
|
-
uses: ruby/actions/.github/workflows/ruby_versions.yml@master
|
|
8
|
-
with:
|
|
9
|
-
min_version: 2.5
|
|
10
|
-
|
|
11
|
-
build:
|
|
12
|
-
needs: ruby-versions
|
|
13
|
-
name: build (${{ matrix.ruby }} / ${{ matrix.os }})
|
|
14
|
-
strategy:
|
|
15
|
-
matrix:
|
|
16
|
-
ruby: ${{ fromJson(needs.ruby-versions.outputs.versions) }}
|
|
17
|
-
os: [ ubuntu-latest, macos-latest ]
|
|
18
|
-
exclude:
|
|
19
|
-
- ruby: 2.5
|
|
20
|
-
os: macos-latest
|
|
21
|
-
runs-on: ${{ matrix.os }}
|
|
22
|
-
steps:
|
|
23
|
-
- uses: actions/checkout@v4
|
|
24
|
-
- name: Set up Ruby
|
|
25
|
-
uses: ruby/setup-ruby@v1
|
|
26
|
-
with:
|
|
27
|
-
ruby-version: ${{ matrix.ruby }}
|
|
28
|
-
- run: bundle install --jobs 4 --retry 3
|
|
29
|
-
- name: Run test
|
|
30
|
-
run: rake test
|
data/.gitignore
DELETED
data/Gemfile
DELETED
data/Rakefile
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
require "bundler/gem_tasks"
|
|
2
|
-
require "rake/testtask"
|
|
3
|
-
|
|
4
|
-
Rake::TestTask.new(:test) do |t|
|
|
5
|
-
t.libs << "test/lib"
|
|
6
|
-
t.ruby_opts << "-rhelper"
|
|
7
|
-
t.test_files = FileList["test/**/test_*.rb"]
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
require "rdoc/task"
|
|
11
|
-
RDoc::Task.new do |doc|
|
|
12
|
-
doc.main = "README.md"
|
|
13
|
-
doc.title = "URI - handle Uniform Resource Identifiers"
|
|
14
|
-
doc.rdoc_files = FileList.new %w[lib README.md LICENSE.txt]
|
|
15
|
-
doc.rdoc_dir = "_site" # for github pages
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
task :default => :test
|
data/bin/console
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
|
|
3
|
-
require "bundler/setup"
|
|
4
|
-
require "uri"
|
|
5
|
-
|
|
6
|
-
# You can add fixtures and/or initialization code here to make experimenting
|
|
7
|
-
# with your gem easier. You can also use a different console, if you like.
|
|
8
|
-
|
|
9
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
|
10
|
-
# require "pry"
|
|
11
|
-
# Pry.start
|
|
12
|
-
|
|
13
|
-
require "irb"
|
|
14
|
-
IRB.start(__FILE__)
|
data/bin/setup
DELETED
data/rakelib/sync_tool.rake
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
task :sync_tool, [:from] do |t, from: nil|
|
|
2
|
-
from ||= (File.identical?(__dir__, "rakelib") ? "../ruby/tool" : File.dirname(__dir__))
|
|
3
|
-
|
|
4
|
-
require 'fileutils'
|
|
5
|
-
|
|
6
|
-
{
|
|
7
|
-
"rakelib/sync_tool.rake" => "rakelib",
|
|
8
|
-
"lib/core_assertions.rb" => "test/lib",
|
|
9
|
-
"lib/envutil.rb" => "test/lib",
|
|
10
|
-
"lib/find_executable.rb" => "test/lib",
|
|
11
|
-
"lib/helper.rb" => "test/lib",
|
|
12
|
-
}.each do |src, dest|
|
|
13
|
-
FileUtils.mkpath(dest)
|
|
14
|
-
FileUtils.cp "#{from}/#{src}", dest
|
|
15
|
-
rescue Errno::ENOENT
|
|
16
|
-
end
|
|
17
|
-
end
|
data/uri.gemspec
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
begin
|
|
2
|
-
require_relative "lib/uri/version"
|
|
3
|
-
rescue LoadError # Fallback to load version file in ruby core repository
|
|
4
|
-
require_relative "version"
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
Gem::Specification.new do |spec|
|
|
8
|
-
spec.name = "uri"
|
|
9
|
-
spec.version = URI::VERSION
|
|
10
|
-
spec.authors = ["Akira Yamada"]
|
|
11
|
-
spec.email = ["akira@ruby-lang.org"]
|
|
12
|
-
|
|
13
|
-
spec.summary = %q{URI is a module providing classes to handle Uniform Resource Identifiers}
|
|
14
|
-
spec.description = spec.summary
|
|
15
|
-
|
|
16
|
-
github_link = "https://github.com/ruby/uri"
|
|
17
|
-
|
|
18
|
-
spec.homepage = github_link
|
|
19
|
-
spec.licenses = ["Ruby", "BSD-2-Clause"]
|
|
20
|
-
|
|
21
|
-
spec.required_ruby_version = '>= 2.5'
|
|
22
|
-
|
|
23
|
-
spec.metadata = {
|
|
24
|
-
"bug_tracker_uri" => "#{github_link}/issues",
|
|
25
|
-
"changelog_uri" => "#{github_link}/releases",
|
|
26
|
-
"documentation_uri" => "https://ruby.github.io/uri/",
|
|
27
|
-
"homepage_uri" => spec.homepage,
|
|
28
|
-
"source_code_uri" => github_link
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
# Specify which files should be added to the gem when it is released.
|
|
32
|
-
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
|
33
|
-
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
|
34
|
-
`git ls-files -z 2>#{IO::NULL}`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
|
35
|
-
end
|
|
36
|
-
spec.bindir = "exe"
|
|
37
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
38
|
-
spec.require_paths = ["lib"]
|
|
39
|
-
end
|