addressable 2.0.1 → 2.0.2
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/CHANGELOG +4 -0
- data/lib/addressable/uri.rb +31 -15
- data/lib/addressable/version.rb +1 -1
- data/spec/addressable/uri_spec.rb +27 -0
- metadata +2 -2
data/CHANGELOG
CHANGED
data/lib/addressable/uri.rb
CHANGED
@@ -281,7 +281,10 @@ module Addressable
|
|
281
281
|
# <tt>false</tt> otherwise. An <tt>InvalidTemplateValueError</tt>
|
282
282
|
# exception will be raised if the value is invalid. The
|
283
283
|
# <tt>transform</tt> method should return the transformed variable
|
284
|
-
# value as a <tt>String</tt>.
|
284
|
+
# value as a <tt>String</tt>. If a <tt>transform</tt> method is used,
|
285
|
+
# the value will not be percent encoded automatically. Unicode
|
286
|
+
# normalization will be performed both before and after sending the
|
287
|
+
# value to the transform method.
|
285
288
|
#
|
286
289
|
# @return [Addressable::URI] The expanded URI template.
|
287
290
|
#
|
@@ -336,22 +339,27 @@ module Addressable
|
|
336
339
|
raise TypeError,
|
337
340
|
"Can't convert #{value.class} into String or Array."
|
338
341
|
end
|
339
|
-
|
342
|
+
|
343
|
+
value =
|
340
344
|
value.respond_to?(:to_ary) ? value.to_ary : value.to_str
|
345
|
+
# Handle unicode normalization
|
346
|
+
if value.kind_of?(Array)
|
347
|
+
value.map! { |val| Addressable::IDNA.unicode_normalize_kc(val) }
|
348
|
+
else
|
349
|
+
value = Addressable::IDNA.unicode_normalize_kc(value)
|
350
|
+
end
|
341
351
|
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
352
|
+
if processor == nil || !processor.respond_to?(:transform)
|
353
|
+
# Handle percent escaping
|
354
|
+
if value.kind_of?(Array)
|
355
|
+
transformed_value = value.map do |val|
|
356
|
+
self.encode_component(
|
357
|
+
val, Addressable::URI::CharacterClasses::UNRESERVED)
|
358
|
+
end
|
359
|
+
else
|
360
|
+
transformed_value = self.encode_component(
|
361
|
+
value, Addressable::URI::CharacterClasses::UNRESERVED)
|
349
362
|
end
|
350
|
-
else
|
351
|
-
transformed_value = self.encode_component(
|
352
|
-
Addressable::IDNA.unicode_normalize_kc(transformed_value),
|
353
|
-
Addressable::URI::CharacterClasses::UNRESERVED
|
354
|
-
)
|
355
363
|
end
|
356
364
|
|
357
365
|
# Process, if we've got a processor
|
@@ -365,6 +373,14 @@ module Addressable
|
|
365
373
|
end
|
366
374
|
if processor.respond_to?(:transform)
|
367
375
|
transformed_value = processor.transform(name, value)
|
376
|
+
if transformed_value.kind_of?(Array)
|
377
|
+
transformed_value.map! do |val|
|
378
|
+
Addressable::IDNA.unicode_normalize_kc(val)
|
379
|
+
end
|
380
|
+
else
|
381
|
+
transformed_value =
|
382
|
+
Addressable::IDNA.unicode_normalize_kc(transformed_value)
|
383
|
+
end
|
368
384
|
end
|
369
385
|
end
|
370
386
|
|
@@ -958,7 +974,7 @@ module Addressable
|
|
958
974
|
character_class = /[^#{character_class}]/
|
959
975
|
end
|
960
976
|
return component.gsub(character_class) do |sequence|
|
961
|
-
(sequence.unpack('C*').map { |c| "
|
977
|
+
(sequence.unpack('C*').map { |c| "%" + ("%02x" % c).upcase }).join("")
|
962
978
|
end
|
963
979
|
end
|
964
980
|
|
data/lib/addressable/version.rb
CHANGED
@@ -69,6 +69,12 @@ class SlashlessProcessor
|
|
69
69
|
end
|
70
70
|
end
|
71
71
|
|
72
|
+
class NoOpProcessor
|
73
|
+
def self.transform(name, value)
|
74
|
+
value
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
72
78
|
describe Addressable::URI, "when created with a non-numeric port number" do
|
73
79
|
it "should raise an error" do
|
74
80
|
(lambda do
|
@@ -3571,6 +3577,15 @@ describe Addressable::URI, "when given a mapping that contains an Array" do
|
|
3571
3577
|
@mapping).to_s.should ==
|
3572
3578
|
"http://example.com/search/an+example+search+query/"
|
3573
3579
|
end
|
3580
|
+
|
3581
|
+
it "should result in 'http://example.com/search/an+example+search+query/'" +
|
3582
|
+
" when used to expand 'http://example.com/search/{-list|+|query}/'" +
|
3583
|
+
" with a NoOpProcessor" do
|
3584
|
+
Addressable::URI.expand_template(
|
3585
|
+
"http://example.com/search/{-list|+|query}/",
|
3586
|
+
@mapping, NoOpProcessor).to_s.should ==
|
3587
|
+
"http://example.com/search/an+example+search+query/"
|
3588
|
+
end
|
3574
3589
|
end
|
3575
3590
|
|
3576
3591
|
class SuperString
|
@@ -3617,6 +3632,18 @@ describe Addressable::URI, "when encoding a multibyte string" do
|
|
3617
3632
|
end
|
3618
3633
|
end
|
3619
3634
|
|
3635
|
+
describe Addressable::URI, "when encoding a string with ASCII chars 0-15" do
|
3636
|
+
it "should result in correct percent encoded sequence" do
|
3637
|
+
Addressable::URI.encode_component("one\ntwo").should == "one%0Atwo"
|
3638
|
+
end
|
3639
|
+
|
3640
|
+
it "should result in correct percent encoded sequence" do
|
3641
|
+
Addressable::URI.encode_component(
|
3642
|
+
"one\ntwo", /[^a-zA-Z0-9\:\/\?\#\[\]\@\!\$\&\'\(\)\*\+\,\;\=\-\.\_\~]/
|
3643
|
+
).should == "one%0Atwo"
|
3644
|
+
end
|
3645
|
+
end
|
3646
|
+
|
3620
3647
|
describe Addressable::URI, "when unencoding a multibyte string" do
|
3621
3648
|
it "should result in correct percent encoded sequence" do
|
3622
3649
|
Addressable::URI.unencode_component("g%C3%BCnther").should == "günther"
|
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.2
|
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:
|
12
|
+
date: 2009-01-30 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|