addressable 2.0.0 → 2.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +4 -0
- data/README +17 -3
- data/lib/addressable/uri.rb +62 -21
- data/lib/addressable/version.rb +1 -1
- data/spec/addressable/uri_spec.rb +46 -0
- data/website/index.html +3 -0
- metadata +3 -3
data/CHANGELOG
CHANGED
data/README
CHANGED
@@ -14,11 +14,25 @@ Example usage:
|
|
14
14
|
uri.path
|
15
15
|
#=> "/path/to/resource/"
|
16
16
|
|
17
|
+
uri = Addressable::URI.parse("http://www.詹姆斯.com/")
|
18
|
+
uri.normalize
|
19
|
+
#=> #<Addressable::URI:0xc9a4c8 URI:http://www.xn--8ws00zhy3a.com/>
|
20
|
+
|
17
21
|
Addressable::URI.expand_template("http://example.com/{-list|+|query}/", {
|
18
22
|
"query" => "an example query".split(" ")
|
19
23
|
})
|
20
24
|
#=> #<Addressable::URI:0xc9d95c URI:http://example.com/an+example+query/>
|
21
25
|
|
22
|
-
|
23
|
-
|
24
|
-
|
26
|
+
Addressable::URI.parse(
|
27
|
+
"http://example.com/a/b/c/?one=1&two=2#foo"
|
28
|
+
).extract_mapping(
|
29
|
+
"http://{host}/{-suffix|/|segments}?{-join|&|one,two,bogus}\#{fragment}"
|
30
|
+
)
|
31
|
+
#=>
|
32
|
+
# {
|
33
|
+
# "host" => "example.com",
|
34
|
+
# "segments" => ["a", "b", "c"],
|
35
|
+
# "one" => "1",
|
36
|
+
# "two" => "2",
|
37
|
+
# "fragment" => "foo"
|
38
|
+
# }
|
data/lib/addressable/uri.rb
CHANGED
@@ -990,7 +990,8 @@ module Addressable
|
|
990
990
|
end
|
991
991
|
if ![String, ::Addressable::URI].include?(returning)
|
992
992
|
raise TypeError,
|
993
|
-
"Expected String or Addressable::URI,
|
993
|
+
"Expected Class (String or Addressable::URI), " +
|
994
|
+
"got #{returning.inspect}"
|
994
995
|
end
|
995
996
|
result = uri.to_str.gsub(/%[0-9a-f]{2}/i) do |sequence|
|
996
997
|
sequence[1..3].to_i(16).chr
|
@@ -1030,7 +1031,8 @@ module Addressable
|
|
1030
1031
|
end
|
1031
1032
|
if ![String, ::Addressable::URI].include?(returning)
|
1032
1033
|
raise TypeError,
|
1033
|
-
"Expected String or Addressable::URI,
|
1034
|
+
"Expected Class (String or Addressable::URI), " +
|
1035
|
+
"got #{returning.inspect}"
|
1034
1036
|
end
|
1035
1037
|
uri_object = uri.kind_of?(self) ? uri : self.parse(uri.to_str)
|
1036
1038
|
encoded_uri = Addressable::URI.new(
|
@@ -1077,7 +1079,8 @@ module Addressable
|
|
1077
1079
|
end
|
1078
1080
|
if ![String, ::Addressable::URI].include?(returning)
|
1079
1081
|
raise TypeError,
|
1080
|
-
"Expected String or Addressable::URI,
|
1082
|
+
"Expected Class (String or Addressable::URI), " +
|
1083
|
+
"got #{returning.inspect}"
|
1081
1084
|
end
|
1082
1085
|
uri_object = uri.kind_of?(self) ? uri : self.parse(uri.to_str)
|
1083
1086
|
components = {
|
@@ -1099,9 +1102,9 @@ module Addressable
|
|
1099
1102
|
:scheme => self.encode_component(components[:scheme],
|
1100
1103
|
Addressable::URI::CharacterClasses::SCHEME),
|
1101
1104
|
:user => self.encode_component(components[:user],
|
1102
|
-
Addressable::URI::CharacterClasses::
|
1105
|
+
Addressable::URI::CharacterClasses::UNRESERVED),
|
1103
1106
|
:password => self.encode_component(components[:password],
|
1104
|
-
Addressable::URI::CharacterClasses::
|
1107
|
+
Addressable::URI::CharacterClasses::UNRESERVED),
|
1105
1108
|
:host => components[:host],
|
1106
1109
|
:port => components[:port],
|
1107
1110
|
:path => self.encode_component(components[:path],
|
@@ -1245,7 +1248,12 @@ module Addressable
|
|
1245
1248
|
if self.scheme =~ /^\s*ssh\+svn\s*$/i
|
1246
1249
|
"svn+ssh"
|
1247
1250
|
else
|
1248
|
-
|
1251
|
+
Addressable::URI.encode_component(
|
1252
|
+
Addressable::IDNA.unicode_normalize_kc(
|
1253
|
+
Addressable::URI.unencode_component(
|
1254
|
+
self.scheme.strip.downcase)),
|
1255
|
+
Addressable::URI::CharacterClasses::SCHEME
|
1256
|
+
)
|
1249
1257
|
end
|
1250
1258
|
else
|
1251
1259
|
nil
|
@@ -1284,7 +1292,11 @@ module Addressable
|
|
1284
1292
|
(!self.password || self.password.strip == "")
|
1285
1293
|
nil
|
1286
1294
|
else
|
1287
|
-
|
1295
|
+
Addressable::URI.encode_component(
|
1296
|
+
Addressable::IDNA.unicode_normalize_kc(
|
1297
|
+
Addressable::URI.unencode_component(self.user.strip)),
|
1298
|
+
Addressable::URI::CharacterClasses::UNRESERVED
|
1299
|
+
)
|
1288
1300
|
end
|
1289
1301
|
else
|
1290
1302
|
nil
|
@@ -1333,7 +1345,11 @@ module Addressable
|
|
1333
1345
|
(!self.user || self.user.strip == "")
|
1334
1346
|
nil
|
1335
1347
|
else
|
1336
|
-
|
1348
|
+
Addressable::URI.encode_component(
|
1349
|
+
Addressable::IDNA.unicode_normalize_kc(
|
1350
|
+
Addressable::URI.unencode_component(self.password.strip)),
|
1351
|
+
Addressable::URI::CharacterClasses::UNRESERVED
|
1352
|
+
)
|
1337
1353
|
end
|
1338
1354
|
else
|
1339
1355
|
nil
|
@@ -1608,6 +1624,9 @@ module Addressable
|
|
1608
1624
|
#
|
1609
1625
|
# @param [String, Integer, #to_s] new_port The new port component.
|
1610
1626
|
def port=(new_port)
|
1627
|
+
if new_port != nil && new_port.respond_to?(:to_str)
|
1628
|
+
new_port = Addressable::URI.unencode_component(new_port.to_str)
|
1629
|
+
end
|
1611
1630
|
if new_port != nil && !(new_port.to_s =~ /^\d+$/)
|
1612
1631
|
raise InvalidURIError,
|
1613
1632
|
"Invalid port number: #{new_port.inspect}"
|
@@ -1659,7 +1678,12 @@ module Addressable
|
|
1659
1678
|
# @return [String] The path component, normalized.
|
1660
1679
|
def normalized_path
|
1661
1680
|
@normalized_path ||= (begin
|
1662
|
-
result =
|
1681
|
+
result = Addressable::URI.encode_component(
|
1682
|
+
Addressable::IDNA.unicode_normalize_kc(
|
1683
|
+
Addressable::URI.unencode_component(self.path.strip)),
|
1684
|
+
Addressable::URI::CharacterClasses::PATH
|
1685
|
+
)
|
1686
|
+
result = self.class.normalize_path(result)
|
1663
1687
|
if result == "" &&
|
1664
1688
|
["http", "https", "ftp", "tftp"].include?(self.normalized_scheme)
|
1665
1689
|
result = "/"
|
@@ -1714,7 +1738,17 @@ module Addressable
|
|
1714
1738
|
#
|
1715
1739
|
# @return [String] The query component, normalized.
|
1716
1740
|
def normalized_query
|
1717
|
-
@normalized_query ||= (
|
1741
|
+
@normalized_query ||= (begin
|
1742
|
+
if self.query
|
1743
|
+
Addressable::URI.encode_component(
|
1744
|
+
Addressable::IDNA.unicode_normalize_kc(
|
1745
|
+
Addressable::URI.unencode_component(self.query.strip)),
|
1746
|
+
Addressable::URI::CharacterClasses::QUERY
|
1747
|
+
)
|
1748
|
+
else
|
1749
|
+
nil
|
1750
|
+
end
|
1751
|
+
end)
|
1718
1752
|
end
|
1719
1753
|
|
1720
1754
|
##
|
@@ -1722,7 +1756,7 @@ module Addressable
|
|
1722
1756
|
#
|
1723
1757
|
# @param [String, #to_str] new_query The new query component.
|
1724
1758
|
def query=(new_query)
|
1725
|
-
@query = new_query.to_str
|
1759
|
+
@query = new_query ? new_query.to_str : nil
|
1726
1760
|
|
1727
1761
|
# Reset dependant values
|
1728
1762
|
@normalized_query = nil
|
@@ -1840,7 +1874,17 @@ module Addressable
|
|
1840
1874
|
#
|
1841
1875
|
# @return [String] The fragment component, normalized.
|
1842
1876
|
def normalized_fragment
|
1843
|
-
@normalized_fragment ||= (
|
1877
|
+
@normalized_fragment ||= (begin
|
1878
|
+
if self.fragment
|
1879
|
+
Addressable::URI.encode_component(
|
1880
|
+
Addressable::IDNA.unicode_normalize_kc(
|
1881
|
+
Addressable::URI.unencode_component(self.fragment.strip)),
|
1882
|
+
Addressable::URI::CharacterClasses::FRAGMENT
|
1883
|
+
)
|
1884
|
+
else
|
1885
|
+
nil
|
1886
|
+
end
|
1887
|
+
end)
|
1844
1888
|
end
|
1845
1889
|
|
1846
1890
|
##
|
@@ -2171,15 +2215,12 @@ module Addressable
|
|
2171
2215
|
end
|
2172
2216
|
end
|
2173
2217
|
|
2174
|
-
return Addressable::URI.
|
2175
|
-
|
2176
|
-
|
2177
|
-
|
2178
|
-
|
2179
|
-
|
2180
|
-
:fragment => normalized_fragment
|
2181
|
-
),
|
2182
|
-
::Addressable::URI
|
2218
|
+
return Addressable::URI.new(
|
2219
|
+
:scheme => normalized_scheme,
|
2220
|
+
:authority => normalized_authority,
|
2221
|
+
:path => normalized_path,
|
2222
|
+
:query => normalized_query,
|
2223
|
+
:fragment => normalized_fragment
|
2183
2224
|
)
|
2184
2225
|
end
|
2185
2226
|
|
data/lib/addressable/version.rb
CHANGED
@@ -584,6 +584,14 @@ describe Addressable::URI, " when parsed from " +
|
|
584
584
|
@uri.to_s.should == "http://newuser@example.com"
|
585
585
|
end
|
586
586
|
|
587
|
+
it "should have the correct username after assignment" do
|
588
|
+
@uri.user = "user@123!"
|
589
|
+
@uri.user.should == "user@123!"
|
590
|
+
@uri.normalized_user.should == "user%40123%21"
|
591
|
+
@uri.password.should == nil
|
592
|
+
@uri.normalize.to_s.should == "http://user%40123%21@example.com/"
|
593
|
+
end
|
594
|
+
|
587
595
|
it "should have the correct password after assignment" do
|
588
596
|
@uri.password = "newpass"
|
589
597
|
@uri.password.should == "newpass"
|
@@ -591,6 +599,14 @@ describe Addressable::URI, " when parsed from " +
|
|
591
599
|
@uri.to_s.should == "http://:newpass@example.com"
|
592
600
|
end
|
593
601
|
|
602
|
+
it "should have the correct password after assignment" do
|
603
|
+
@uri.password = "secret@123!"
|
604
|
+
@uri.password.should == "secret@123!"
|
605
|
+
@uri.normalized_password.should == "secret%40123%21"
|
606
|
+
@uri.user.should == ""
|
607
|
+
@uri.normalize.to_s.should == "http://:secret%40123%21@example.com/"
|
608
|
+
end
|
609
|
+
|
594
610
|
it "should have the correct user/pass after repeated assignment" do
|
595
611
|
@uri.user = nil
|
596
612
|
@uri.user.should == nil
|
@@ -831,6 +847,8 @@ describe Addressable::URI, " when parsed from " +
|
|
831
847
|
it "should not change if encoded with the normalizing algorithm" do
|
832
848
|
Addressable::URI.normalized_encode(@uri).to_s.should ==
|
833
849
|
"http://example.com/%C3%87"
|
850
|
+
Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s.should ===
|
851
|
+
"http://example.com/%C3%87"
|
834
852
|
end
|
835
853
|
|
836
854
|
it "should raise an error if encoding with an unexpected return type" do
|
@@ -1128,6 +1146,25 @@ describe Addressable::URI, " when parsed from " +
|
|
1128
1146
|
end
|
1129
1147
|
end
|
1130
1148
|
|
1149
|
+
describe Addressable::URI, " when parsed from " +
|
1150
|
+
"'http://example.com:%38%30/'" do
|
1151
|
+
before do
|
1152
|
+
@uri = Addressable::URI.parse("http://example.com:%38%30/")
|
1153
|
+
end
|
1154
|
+
|
1155
|
+
it "should have the correct port" do
|
1156
|
+
@uri.port.should == 80
|
1157
|
+
end
|
1158
|
+
|
1159
|
+
it "should not be considered to be in normal form" do
|
1160
|
+
@uri.normalize.should_not be_eql(@uri)
|
1161
|
+
end
|
1162
|
+
|
1163
|
+
it "should normalize to 'http://example.com/'" do
|
1164
|
+
@uri.normalize.should === "http://example.com/"
|
1165
|
+
end
|
1166
|
+
end
|
1167
|
+
|
1131
1168
|
describe Addressable::URI, " when parsed from " +
|
1132
1169
|
"'http://example.com/path/to/resource/'" do
|
1133
1170
|
before do
|
@@ -1788,6 +1825,11 @@ describe Addressable::URI, " when parsed from " +
|
|
1788
1825
|
@uri.scheme.should == "ftp"
|
1789
1826
|
@uri.to_s.should ==
|
1790
1827
|
"ftp://user:pass@example.com/path/to/resource?query=x#fragment"
|
1828
|
+
@uri.scheme = "bogus!"
|
1829
|
+
@uri.scheme.should == "bogus!"
|
1830
|
+
@uri.normalized_scheme.should == "bogus%21"
|
1831
|
+
@uri.normalize.to_s.should ==
|
1832
|
+
"bogus%21://user:pass@example.com/path/to/resource?query=x#fragment"
|
1791
1833
|
end
|
1792
1834
|
|
1793
1835
|
it "should have the correct authority segment after assignment" do
|
@@ -1862,6 +1904,10 @@ describe Addressable::URI, " when parsed from " +
|
|
1862
1904
|
@uri.query.should == "newquery=x"
|
1863
1905
|
@uri.to_s.should ==
|
1864
1906
|
"http://user:pass@example.com/path/to/resource?newquery=x#fragment"
|
1907
|
+
@uri.query = nil
|
1908
|
+
@uri.query.should == nil
|
1909
|
+
@uri.to_s.should ==
|
1910
|
+
"http://user:pass@example.com/path/to/resource#fragment"
|
1865
1911
|
end
|
1866
1912
|
|
1867
1913
|
it "should have the correct query string after hash assignment" do
|
data/website/index.html
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: addressable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bob Aman
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-12-02 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -95,7 +95,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
95
95
|
requirements: []
|
96
96
|
|
97
97
|
rubyforge_project: addressable
|
98
|
-
rubygems_version: 1.3.
|
98
|
+
rubygems_version: 1.3.1
|
99
99
|
signing_key:
|
100
100
|
specification_version: 2
|
101
101
|
summary: URI Implementation
|