addressable 2.2.0 → 2.2.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/CHANGELOG +3 -0
- data/lib/addressable/uri.rb +75 -0
- data/lib/addressable/version.rb +1 -1
- data/spec/addressable/uri_spec.rb +96 -0
- metadata +4 -4
data/CHANGELOG
CHANGED
data/lib/addressable/uri.rb
CHANGED
@@ -560,6 +560,81 @@ module Addressable
|
|
560
560
|
end
|
561
561
|
end
|
562
562
|
|
563
|
+
##
|
564
|
+
# Encodes a set of key/value pairs according to the rules for the
|
565
|
+
# <code>application/x-www-form-urlencoded</code> MIME type.
|
566
|
+
#
|
567
|
+
# @param [#to_hash, #to_ary] form_values
|
568
|
+
# The form values to encode.
|
569
|
+
#
|
570
|
+
# @param [TrueClass, FalseClass] sort
|
571
|
+
# Sort the key/value pairs prior to encoding.
|
572
|
+
# Defaults to <code>false</code>.
|
573
|
+
#
|
574
|
+
# @return [String]
|
575
|
+
# The encoded value.
|
576
|
+
def self.form_encode(form_values, sort=false)
|
577
|
+
if form_values.respond_to?(:to_hash)
|
578
|
+
form_values = form_values.to_hash.to_a
|
579
|
+
elsif form_values.respond_to?(:to_ary)
|
580
|
+
form_values = form_values.to_ary
|
581
|
+
else
|
582
|
+
raise TypeError, "Can't convert #{form_values.class} into Array."
|
583
|
+
end
|
584
|
+
form_values = form_values.map do |(key, value)|
|
585
|
+
[key.to_s, value.to_s]
|
586
|
+
end
|
587
|
+
if sort
|
588
|
+
# Useful for OAuth and optimizing caching systems
|
589
|
+
form_values = form_values.sort
|
590
|
+
end
|
591
|
+
escaped_form_values = form_values.map do |(key, value)|
|
592
|
+
# Line breaks are CRLF pairs
|
593
|
+
[
|
594
|
+
self.encode_component(
|
595
|
+
key.gsub(/(\r\n|\n|\r)/, "\r\n"),
|
596
|
+
CharacterClasses::UNRESERVED
|
597
|
+
).gsub("%20", "+"),
|
598
|
+
self.encode_component(
|
599
|
+
value.gsub(/(\r\n|\n|\r)/, "\r\n"),
|
600
|
+
CharacterClasses::UNRESERVED
|
601
|
+
).gsub("%20", "+")
|
602
|
+
]
|
603
|
+
end
|
604
|
+
return (escaped_form_values.map do |(key, value)|
|
605
|
+
"#{key}=#{value}"
|
606
|
+
end).join("&")
|
607
|
+
end
|
608
|
+
|
609
|
+
##
|
610
|
+
# Decodes a <code>String</code> according to the rules for the
|
611
|
+
# <code>application/x-www-form-urlencoded</code> MIME type.
|
612
|
+
#
|
613
|
+
# @param [String, #to_str] encoded_value
|
614
|
+
# The form values to decode.
|
615
|
+
#
|
616
|
+
# @return [Array]
|
617
|
+
# The decoded values.
|
618
|
+
# This is not a <code>Hash</code> because of the possibility for
|
619
|
+
# duplicate keys.
|
620
|
+
def self.form_unencode(encoded_value)
|
621
|
+
if !encoded_value.respond_to?(:to_str)
|
622
|
+
raise TypeError, "Can't convert #{encoded_value.class} into String."
|
623
|
+
end
|
624
|
+
encoded_value = encoded_value.to_str
|
625
|
+
split_values = encoded_value.split("&").map do |pair|
|
626
|
+
pair.split("=", 2)
|
627
|
+
end
|
628
|
+
return split_values.map do |(key, value)|
|
629
|
+
[
|
630
|
+
key ? self.unencode_component(
|
631
|
+
key.gsub("+", "%20")).gsub(/(\r\n|\n|\r)/, "\n") : nil,
|
632
|
+
value ? (self.unencode_component(
|
633
|
+
value.gsub("+", "%20")).gsub(/(\r\n|\n|\r)/, "\n")) : nil
|
634
|
+
]
|
635
|
+
end
|
636
|
+
end
|
637
|
+
|
563
638
|
##
|
564
639
|
# Creates a new uri object from component parts.
|
565
640
|
#
|
data/lib/addressable/version.rb
CHANGED
@@ -3693,6 +3693,95 @@ describe Addressable::URI, "when parsing a non-String object" do
|
|
3693
3693
|
end
|
3694
3694
|
end
|
3695
3695
|
|
3696
|
+
describe Addressable::URI, "when form encoding a hash" do
|
3697
|
+
it "should result in correct percent encoded sequence" do
|
3698
|
+
Addressable::URI.form_encode(
|
3699
|
+
{"&one" => "/1", "=two" => "?2", ":three" => "#3"}
|
3700
|
+
).should == "%26one=%2F1&%3Dtwo=%3F2&%3Athree=%233"
|
3701
|
+
end
|
3702
|
+
|
3703
|
+
it "should result in correct percent encoded sequence" do
|
3704
|
+
Addressable::URI.form_encode(
|
3705
|
+
{"q" => "one two three"}
|
3706
|
+
).should == "q=one+two+three"
|
3707
|
+
end
|
3708
|
+
|
3709
|
+
it "should result in correct percent encoded sequence" do
|
3710
|
+
Addressable::URI.form_encode(
|
3711
|
+
{"key" => nil}
|
3712
|
+
).should == "key="
|
3713
|
+
end
|
3714
|
+
|
3715
|
+
it "should result in correctly encoded newlines" do
|
3716
|
+
Addressable::URI.form_encode(
|
3717
|
+
{"text" => "one\ntwo\rthree\r\nfour\n\r"}
|
3718
|
+
).should == "text=one%0D%0Atwo%0D%0Athree%0D%0Afour%0D%0A%0D%0A"
|
3719
|
+
end
|
3720
|
+
|
3721
|
+
it "should result in a sorted percent encoded sequence" do
|
3722
|
+
Addressable::URI.form_encode(
|
3723
|
+
[["a", "1"], ["dup", "3"], ["dup", "2"]], true
|
3724
|
+
).should == "a=1&dup=2&dup=3"
|
3725
|
+
end
|
3726
|
+
end
|
3727
|
+
|
3728
|
+
describe Addressable::URI, "when form encoding a non-Array object" do
|
3729
|
+
it "should raise a TypeError for objects than cannot be converted" do
|
3730
|
+
(lambda do
|
3731
|
+
Addressable::URI.form_encode(42)
|
3732
|
+
end).should raise_error(TypeError, "Can't convert Fixnum into Array.")
|
3733
|
+
end
|
3734
|
+
end
|
3735
|
+
|
3736
|
+
describe Addressable::URI, "when form unencoding a string" do
|
3737
|
+
it "should result in correct values" do
|
3738
|
+
Addressable::URI.form_unencode(
|
3739
|
+
"%26one=%2F1&%3Dtwo=%3F2&%3Athree=%233"
|
3740
|
+
).should == [["&one", "/1"], ["=two", "?2"], [":three", "#3"]]
|
3741
|
+
end
|
3742
|
+
|
3743
|
+
it "should result in correct values" do
|
3744
|
+
Addressable::URI.form_unencode(
|
3745
|
+
"q=one+two+three"
|
3746
|
+
).should == [["q", "one two three"]]
|
3747
|
+
end
|
3748
|
+
|
3749
|
+
it "should result in correct values" do
|
3750
|
+
Addressable::URI.form_unencode(
|
3751
|
+
"text=one%0D%0Atwo%0D%0Athree%0D%0Afour%0D%0A%0D%0A"
|
3752
|
+
).should == [["text", "one\ntwo\nthree\nfour\n\n"]]
|
3753
|
+
end
|
3754
|
+
|
3755
|
+
it "should result in correct values" do
|
3756
|
+
Addressable::URI.form_unencode(
|
3757
|
+
"a=1&dup=2&dup=3"
|
3758
|
+
).should == [["a", "1"], ["dup", "2"], ["dup", "3"]]
|
3759
|
+
end
|
3760
|
+
|
3761
|
+
it "should result in correct values" do
|
3762
|
+
Addressable::URI.form_unencode(
|
3763
|
+
"key"
|
3764
|
+
).should == [["key", nil]]
|
3765
|
+
end
|
3766
|
+
|
3767
|
+
it "should result in correct values" do
|
3768
|
+
Addressable::URI.form_unencode("GivenName=Ren%C3%A9").should ==
|
3769
|
+
[["GivenName", "René"]]
|
3770
|
+
end
|
3771
|
+
end
|
3772
|
+
|
3773
|
+
describe Addressable::URI, "when form unencoding a non-String object" do
|
3774
|
+
it "should correctly parse anything with a 'to_str' method" do
|
3775
|
+
Addressable::URI.form_unencode(SuperString.new(42))
|
3776
|
+
end
|
3777
|
+
|
3778
|
+
it "should raise a TypeError for objects than cannot be converted" do
|
3779
|
+
(lambda do
|
3780
|
+
Addressable::URI.form_unencode(42)
|
3781
|
+
end).should raise_error(TypeError, "Can't convert Fixnum into String.")
|
3782
|
+
end
|
3783
|
+
end
|
3784
|
+
|
3696
3785
|
describe Addressable::URI, "when normalizing a non-String object" do
|
3697
3786
|
it "should correctly parse anything with a 'to_str' method" do
|
3698
3787
|
Addressable::URI.normalize_component(SuperString.new(42))
|
@@ -3770,6 +3859,13 @@ describe Addressable::URI, "when encoding a multibyte string" do
|
|
3770
3859
|
end
|
3771
3860
|
end
|
3772
3861
|
|
3862
|
+
describe Addressable::URI, "when form encoding a multibyte string" do
|
3863
|
+
it "should result in correct percent encoded sequence" do
|
3864
|
+
Addressable::URI.form_encode({"GivenName" => "René"}).should ==
|
3865
|
+
"GivenName=Ren%C3%A9"
|
3866
|
+
end
|
3867
|
+
end
|
3868
|
+
|
3773
3869
|
describe Addressable::URI, "when encoding a string with ASCII chars 0-15" do
|
3774
3870
|
it "should result in correct percent encoded sequence" do
|
3775
3871
|
Addressable::URI.encode_component("one\ntwo").should == "one%0Atwo"
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: addressable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 5
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 2
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 2.2.
|
9
|
+
- 1
|
10
|
+
version: 2.2.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Bob Aman
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-08-
|
18
|
+
date: 2010-08-19 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|