uri 0.12.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.
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, "can not set userinfo for file URI"
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, "can not set user for file URI"
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, "can not set password for file URI"
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
- # http://tools.ietf.org/html/draft-hoffman-ftp-uri-04
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::Escape.escape all URI components and tries again.
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
- DEFAULT_PARSER.escape(x)
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
- DEFAULT_PARSER.escape(value)
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.class.component rescue ::URI::Generic::COMPONENT
129
+ component = self.component rescue ::URI::Generic::COMPONENT
130
130
  raise ArgumentError,
131
- "expected Array of or Hash of components of #{self.class} (#{component.join(', ')})"
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 a URI::Parser is defined, DEFAULT_PARSER is used.
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 URI::Parser Regexp for :SCHEME.
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 URI::Parser Regexp for :USERINFO.
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
- "can not set user with opaque"
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 URI::Parser Regexp for :USERINFO.
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
- "can not set password with opaque"
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 if 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, @password)
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 URI::Parser Regexp for :HOST.
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
- "can not set host with registry or opaque"
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 URI::Parser Regexp for :PORT.
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
- "can not set port with registry or opaque"
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, "can not set registry"
751
+ raise InvalidURIError, "cannot set registry"
737
752
  end
738
753
  private :check_registry
739
754
 
740
- def set_registry(v) #:nodoc:
741
- raise InvalidURIError, "can not set registry"
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, "can not set registry"
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 URI::Parser Regexp
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 URI::Parser Regexp for :OPAQUE.
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
- "can not set opaque with host, port, userinfo or path"
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 URI::Parser Regexp for :FRAGMENT.
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://tools.ietf.org/html/rfc3986 1.2.3.
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.userinfo || rel.host || rel.port
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
@@ -1133,17 +1148,14 @@ module URI
1133
1148
  base.fragment=(nil)
1134
1149
 
1135
1150
  # RFC2396, Section 5.2, 4)
1136
- if !authority
1137
- base.set_path(merge_path(base.path, rel.path)) if base.path && rel.path
1138
- else
1139
- # RFC2396, Section 5.2, 4)
1140
- base.set_path(rel.path) if rel.path
1151
+ if authority
1152
+ base.set_authority(*authority)
1153
+ base.set_path(rel.path)
1154
+ elsif base.path && rel.path
1155
+ base.set_path(merge_path(base.path, rel.path))
1141
1156
  end
1142
1157
 
1143
1158
  # RFC2396, Section 5.2, 7)
1144
- base.set_userinfo(rel.userinfo) if rel.userinfo
1145
- base.set_host(rel.host) if rel.host
1146
- base.set_port(rel.port) if rel.port
1147
1159
  base.query = rel.query if rel.query
1148
1160
  base.fragment=(rel.fragment) if rel.fragment
1149
1161
 
@@ -1235,7 +1247,7 @@ module URI
1235
1247
  return rel, rel
1236
1248
  end
1237
1249
 
1238
- # you can modify `rel', but can not `oth'.
1250
+ # you can modify `rel', but cannot `oth'.
1239
1251
  return oth, rel
1240
1252
  end
1241
1253
  private :route_from0
@@ -1260,7 +1272,7 @@ module URI
1260
1272
  # #=> #<URI::Generic /main.rbx?page=1>
1261
1273
  #
1262
1274
  def route_from(oth)
1263
- # you can modify `rel', but can not `oth'.
1275
+ # you can modify `rel', but cannot `oth'.
1264
1276
  begin
1265
1277
  oth, rel = route_from0(oth)
1266
1278
  rescue
@@ -1364,6 +1376,9 @@ module URI
1364
1376
  str << ':'
1365
1377
  str << @port.to_s
1366
1378
  end
1379
+ if (@host || @port) && !@path.empty? && !@path.start_with?('/')
1380
+ str << '/'
1381
+ end
1367
1382
  str << @path
1368
1383
  if @query
1369
1384
  str << '?'
@@ -1376,6 +1391,7 @@ module URI
1376
1391
  end
1377
1392
  str
1378
1393
  end
1394
+ alias to_str to_s
1379
1395
 
1380
1396
  #
1381
1397
  # Compares two URIs.
@@ -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. Use http_proxy.', uplevel: 1
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://datatracker.ietf.org/doc/html/rfc3986/#section-3.2.
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://datatracker.ietf.org/doc/html/rfc6454.
121
+ # https://www.rfc-editor.org/rfc/rfc6454.
110
122
  #
111
123
  #
112
124
  # Example:
@@ -67,7 +67,7 @@ module URI
67
67
  #
68
68
  # == Synopsis
69
69
  #
70
- # URI::Parser.new([opts])
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::Parser.new(:ESCAPED => "(?:%[a-fA-F0-9]{2}|%u[a-fA-F0-9]{4})")
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 URI::Parser.initialize_pattern.
111
+ # See also #initialize_pattern.
112
112
  attr_reader :pattern
113
113
 
114
114
  # The Hash of Regexp.
115
115
  #
116
- # See also URI::Parser.initialize_regexp.
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
- # p = URI::Parser.new
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 URI::Parser.make_regexp.
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
- /(?=#{Regexp.union(*schemes)}:)#{@pattern[:X_ABS_URI]}/x
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
- @@to_s = Kernel.instance_method(:to_s)
325
- if @@to_s.respond_to?(:bind_call)
326
- def inspect
327
- @@to_s.bind_call(self)
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
- @@to_s.bind(self).call
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