escape_utils 0.2.4 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -1
- data/.travis.yml +13 -0
- data/CHANGELOG.md +7 -0
- data/MIT-LICENSE +1 -1
- data/Rakefile +5 -18
- data/benchmark/html_escape.rb +9 -2
- data/benchmark/xml_escape.rb +29 -0
- data/escape_utils.gemspec +2 -3
- data/ext/escape_utils/buffer.c +181 -160
- data/ext/escape_utils/buffer.h +90 -68
- data/ext/escape_utils/escape_utils.c +77 -39
- data/ext/escape_utils/extconf.rb +1 -1
- data/ext/escape_utils/houdini.h +37 -8
- data/ext/escape_utils/houdini_href_e.c +115 -0
- data/ext/escape_utils/houdini_html_e.c +90 -0
- data/ext/escape_utils/houdini_html_u.c +122 -0
- data/ext/escape_utils/{houdini_js.c → houdini_js_e.c} +17 -75
- data/ext/escape_utils/houdini_js_u.c +60 -0
- data/ext/escape_utils/{uri_escape.h → houdini_uri_e.c} +68 -2
- data/ext/escape_utils/houdini_uri_u.c +65 -0
- data/ext/escape_utils/houdini_xml_e.c +136 -0
- data/lib/escape_utils/version.rb +1 -1
- data/lib/escape_utils/xml/builder.rb +8 -0
- data/test/helper.rb +14 -0
- data/test/html/escape_test.rb +61 -0
- data/test/html/unescape_test.rb +48 -0
- data/test/html_safety_test.rb +46 -0
- data/test/javascript/escape_test.rb +42 -0
- data/test/javascript/unescape_test.rb +46 -0
- data/test/query/escape_test.rb +50 -0
- data/test/query/unescape_test.rb +52 -0
- data/test/uri/escape_test.rb +50 -0
- data/test/uri/unescape_test.rb +55 -0
- data/test/url/escape_test.rb +58 -0
- data/test/url/unescape_test.rb +60 -0
- data/test/xml/escape_test.rb +67 -0
- metadata +136 -152
- data/.rspec +0 -2
- data/ext/escape_utils/houdini_html.c +0 -214
- data/ext/escape_utils/houdini_uri.c +0 -130
- data/spec/html/escape_spec.rb +0 -42
- data/spec/html/unescape_spec.rb +0 -37
- data/spec/html_safety_spec.rb +0 -48
- data/spec/javascript/escape_spec.rb +0 -34
- data/spec/javascript/unescape_spec.rb +0 -37
- data/spec/query/escape_spec.rb +0 -44
- data/spec/query/unescape_spec.rb +0 -46
- data/spec/rcov.opts +0 -3
- data/spec/spec_helper.rb +0 -5
- data/spec/uri/escape_spec.rb +0 -43
- data/spec/uri/unescape_spec.rb +0 -57
- data/spec/url/escape_spec.rb +0 -52
- data/spec/url/unescape_spec.rb +0 -57
@@ -0,0 +1,46 @@
|
|
1
|
+
require File.expand_path("../helper", __FILE__)
|
2
|
+
|
3
|
+
class Object
|
4
|
+
def html_safe?
|
5
|
+
false
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class TestSafeBuffer < String
|
10
|
+
def html_safe?
|
11
|
+
true
|
12
|
+
end
|
13
|
+
|
14
|
+
def html_safe
|
15
|
+
self
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_s
|
19
|
+
self
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class String
|
24
|
+
def html_safe
|
25
|
+
TestSafeBuffer.new(self)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class HtmlEscapeTest < MiniTest::Unit::TestCase
|
30
|
+
include EscapeUtils::HtmlSafety
|
31
|
+
|
32
|
+
def test_marks_escaped_strings_safe
|
33
|
+
escaped = _escape_html("<strong>unsafe</strong>")
|
34
|
+
assert_equal "<strong>unsafe</strong>", escaped
|
35
|
+
assert escaped.html_safe?
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_doesnt_escape_safe_strings
|
39
|
+
assert_equal "<p>safe string</p>", _escape_html("<p>safe string</p>".html_safe)
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_
|
43
|
+
assert_equal "5", _escape_html(5)
|
44
|
+
assert_equal "hello", _escape_html(:hello)
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require File.expand_path("../../helper", __FILE__)
|
2
|
+
|
3
|
+
class JavascriptEscapeTest < MiniTest::Unit::TestCase
|
4
|
+
def test_returns_empty_string_if_nil_passed
|
5
|
+
assert_equal "", EscapeUtils.escape_javascript(nil)
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_quotes_and_newlines
|
9
|
+
assert_equal %(This \\"thing\\" is really\\n netos\\n\\n\\'), EscapeUtils.escape_javascript(%(This "thing" is really\n netos\r\n\n'))
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_backslashes
|
13
|
+
assert_equal %(backslash\\\\test), EscapeUtils.escape_javascript(%(backslash\\test))
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_closed_html_tags
|
17
|
+
assert_equal %(keep <open>, but dont <\\/close> tags), EscapeUtils.escape_javascript(%(keep <open>, but dont </close> tags))
|
18
|
+
end
|
19
|
+
|
20
|
+
if RUBY_VERSION =~ /^1.9/
|
21
|
+
def test_input_must_be_utf8_or_ascii
|
22
|
+
str = "dont </close> tags"
|
23
|
+
|
24
|
+
str.force_encoding 'ISO-8859-1'
|
25
|
+
assert_raises Encoding::CompatibilityError do
|
26
|
+
EscapeUtils.escape_javascript(str)
|
27
|
+
end
|
28
|
+
|
29
|
+
str.force_encoding 'UTF-8'
|
30
|
+
begin
|
31
|
+
EscapeUtils.escape_javascript(str)
|
32
|
+
rescue Encoding::CompatibilityError => e
|
33
|
+
assert_nil e, "#{e.class.name} raised, expected not to"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_return_value_is_tagged_as_utf8
|
38
|
+
str = "dont </close> tags"
|
39
|
+
assert_equal Encoding.find('UTF-8'), EscapeUtils.escape_javascript(str).encoding
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require File.expand_path("../../helper", __FILE__)
|
2
|
+
|
3
|
+
class JavascriptUnescapeTest < MiniTest::Unit::TestCase
|
4
|
+
def test_returns_empty_string_if_nil_passed
|
5
|
+
assert_equal "", EscapeUtils.unescape_javascript(nil)
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_quotes_and_newlines
|
9
|
+
assert_equal %(This "thing" is really\n netos\n\n'), EscapeUtils.unescape_javascript(%(This \\"thing\\" is really\\n netos\\n\\n\\'))
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_backslashes
|
13
|
+
assert_equal %(backslash\\test), EscapeUtils.unescape_javascript(%(backslash\\\\test))
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_closed_html_tags
|
17
|
+
assert_equal %(dont </close> tags), EscapeUtils.unescape_javascript(%(dont <\\/close> tags))
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_passes_through_standalone_backslash
|
21
|
+
assert_equal "\\", EscapeUtils.unescape_javascript("\\")
|
22
|
+
end
|
23
|
+
|
24
|
+
if RUBY_VERSION =~ /^1.9/
|
25
|
+
def test_input_must_be_utf8_or_ascii
|
26
|
+
escaped = EscapeUtils.escape_javascript("dont </close> tags")
|
27
|
+
|
28
|
+
escaped.force_encoding 'ISO-8859-1'
|
29
|
+
assert_raises Encoding::CompatibilityError do
|
30
|
+
EscapeUtils.unescape_javascript(escaped)
|
31
|
+
end
|
32
|
+
|
33
|
+
escaped.force_encoding 'UTF-8'
|
34
|
+
begin
|
35
|
+
EscapeUtils.unescape_javascript(escaped)
|
36
|
+
rescue Encoding::CompatibilityError => e
|
37
|
+
assert_nil e, "#{e.class.name} raised, expected not to"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_return_value_is_tagged_as_utf8
|
42
|
+
escaped = EscapeUtils.escape_javascript("dont </close> tags")
|
43
|
+
assert_equal Encoding.find('UTF-8'), EscapeUtils.unescape_javascript(escaped).encoding
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require File.expand_path("../../helper", __FILE__)
|
2
|
+
|
3
|
+
class QueryEscapeTest < MiniTest::Unit::TestCase
|
4
|
+
def test_basic_url
|
5
|
+
assert_equal "http%3A%2F%2Fwww.homerun.com%2F", EscapeUtils.escape_url("http://www.homerun.com/")
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_url_containing_tags
|
9
|
+
assert_equal "fo%3Co%3Ebar", EscapeUtils.escape_url("fo<o>bar")
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_url_containing_spaces
|
13
|
+
assert_equal "a+space", EscapeUtils.escape_url("a space")
|
14
|
+
assert_equal "a+++sp+ace+", EscapeUtils.escape_url("a sp ace ")
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_url_of_mixed_characters
|
18
|
+
assert_equal "q1%212%22%27w%245%267%2Fz8%29%3F%5C", EscapeUtils.escape_url("q1!2\"'w$5&7/z8)?\\")
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_url_with_multibyte_characters
|
22
|
+
matz_name = "\xE3\x81\xBE\xE3\x81\xA4\xE3\x82\x82\xE3\x81\xA8" # Matsumoto
|
23
|
+
assert_equal '%E3%81%BE%E3%81%A4%E3%82%82%E3%81%A8', EscapeUtils.escape_url(matz_name)
|
24
|
+
matz_name_sep = "\xE3\x81\xBE\xE3\x81\xA4 \xE3\x82\x82\xE3\x81\xA8" # Matsu moto
|
25
|
+
assert_equal '%E3%81%BE%E3%81%A4+%E3%82%82%E3%81%A8', EscapeUtils.escape_url(matz_name_sep)
|
26
|
+
end
|
27
|
+
|
28
|
+
if RUBY_VERSION =~ /^1.9/
|
29
|
+
def test_input_must_be_utf8_or_ascii
|
30
|
+
str = "a space"
|
31
|
+
|
32
|
+
str.force_encoding 'ISO-8859-1'
|
33
|
+
assert_raises Encoding::CompatibilityError do
|
34
|
+
EscapeUtils.escape_url(str)
|
35
|
+
end
|
36
|
+
|
37
|
+
str.force_encoding 'UTF-8'
|
38
|
+
begin
|
39
|
+
EscapeUtils.escape_url(str)
|
40
|
+
rescue Encoding::CompatibilityError => e
|
41
|
+
assert_nil e, "#{e.class.name} raised, expected not to"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_return_value_is_tagged_as_utf8
|
46
|
+
str = "a+space"
|
47
|
+
assert_equal Encoding.find('UTF-8'), EscapeUtils.escape_url(str).encoding
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require File.expand_path("../../helper", __FILE__)
|
2
|
+
|
3
|
+
class QueryUnescapeTest < MiniTest::Unit::TestCase
|
4
|
+
def test_basic_url
|
5
|
+
assert_equal "http://www.homerun.com/", EscapeUtils.unescape_url("http%3A%2F%2Fwww.homerun.com%2F")
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_url_containing_tags
|
9
|
+
assert_equal "fo<o>bar", EscapeUtils.unescape_url("fo%3Co%3Ebar")
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_url_containing_spaces
|
13
|
+
assert_equal "a space", EscapeUtils.unescape_url("a+space")
|
14
|
+
assert_equal "a sp ace ", EscapeUtils.unescape_url("a+++sp+ace+")
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_url_containing_mixed_characters
|
18
|
+
assert_equal "q1!2\"'w$5&7/z8)?\\", EscapeUtils.unescape_url("q1%212%22%27w%245%267%2Fz8%29%3F%5C")
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_url_containing_multibyte_characters
|
22
|
+
matz_name = "\xE3\x81\xBE\xE3\x81\xA4\xE3\x82\x82\xE3\x81\xA8" # Matsumoto
|
23
|
+
matz_name.force_encoding('UTF-8') if matz_name.respond_to?(:force_encoding)
|
24
|
+
assert_equal matz_name, EscapeUtils.unescape_url('%E3%81%BE%E3%81%A4%E3%82%82%E3%81%A8')
|
25
|
+
matz_name_sep = "\xE3\x81\xBE\xE3\x81\xA4 \xE3\x82\x82\xE3\x81\xA8" # Matsu moto
|
26
|
+
matz_name_sep.force_encoding('UTF-8') if matz_name_sep.respond_to?(:force_encoding)
|
27
|
+
assert_equal matz_name_sep, EscapeUtils.unescape_url('%E3%81%BE%E3%81%A4+%E3%82%82%E3%81%A8')
|
28
|
+
end
|
29
|
+
|
30
|
+
if RUBY_VERSION =~ /^1.9/
|
31
|
+
def test_input_must_be_valid_utf8_or_ascii
|
32
|
+
escaped = EscapeUtils.unescape_url("a+space")
|
33
|
+
|
34
|
+
escaped.force_encoding 'ISO-8859-1'
|
35
|
+
assert_raises Encoding::CompatibilityError do
|
36
|
+
EscapeUtils.unescape_url(escaped)
|
37
|
+
end
|
38
|
+
|
39
|
+
escaped.force_encoding 'UTF-8'
|
40
|
+
begin
|
41
|
+
EscapeUtils.unescape_url(escaped)
|
42
|
+
rescue Encoding::CompatibilityError => e
|
43
|
+
assert_nil e, "#{e.class.name} raised, expected not to"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_return_value_is_tagged_as_utf8
|
48
|
+
escaped = EscapeUtils.escape_url("a space")
|
49
|
+
assert_equal Encoding.find('UTF-8'), EscapeUtils.unescape_url(escaped).encoding
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require File.expand_path("../../helper", __FILE__)
|
2
|
+
require 'uri'
|
3
|
+
|
4
|
+
class UriEscapeTest < MiniTest::Unit::TestCase
|
5
|
+
def test_uri_stdlib_compatibility
|
6
|
+
(0..127).each do |i|
|
7
|
+
c = i.chr
|
8
|
+
assert_equal URI.escape(c), EscapeUtils.escape_uri(c)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_uri_containing_tags
|
13
|
+
assert_equal "fo%3Co%3Ebar", EscapeUtils.escape_uri("fo<o>bar")
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_uri_containing_spaces
|
17
|
+
assert_equal "a%20space", EscapeUtils.escape_uri("a space")
|
18
|
+
assert_equal "a%20%20%20sp%20ace%20", EscapeUtils.escape_uri("a sp ace ")
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_multibyte_characters
|
22
|
+
matz_name = "\xE3\x81\xBE\xE3\x81\xA4\xE3\x82\x82\xE3\x81\xA8" # Matsumoto
|
23
|
+
assert_equal '%E3%81%BE%E3%81%A4%E3%82%82%E3%81%A8', EscapeUtils.escape_uri(matz_name)
|
24
|
+
matz_name_sep = "\xE3\x81\xBE\xE3\x81\xA4 \xE3\x82\x82\xE3\x81\xA8" # Matsu moto
|
25
|
+
assert_equal '%E3%81%BE%E3%81%A4%20%E3%82%82%E3%81%A8', EscapeUtils.escape_uri(matz_name_sep)
|
26
|
+
end
|
27
|
+
|
28
|
+
if RUBY_VERSION =~ /^1.9/
|
29
|
+
def test_input_must_be_utf8_or_ascii
|
30
|
+
str = "fo<o>bar"
|
31
|
+
|
32
|
+
str.force_encoding 'ISO-8859-1'
|
33
|
+
assert_raises Encoding::CompatibilityError do
|
34
|
+
EscapeUtils.escape_uri(str)
|
35
|
+
end
|
36
|
+
|
37
|
+
str.force_encoding 'UTF-8'
|
38
|
+
begin
|
39
|
+
EscapeUtils.escape_uri(str)
|
40
|
+
rescue Encoding::CompatibilityError => e
|
41
|
+
assert_nil e, "#{e.class.name} raised, expected not to"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_return_value_is_tagged_as_utf8
|
46
|
+
str = "fo<o>bar"
|
47
|
+
assert_equal Encoding.find('UTF-8'), EscapeUtils.escape_uri(str).encoding
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require File.expand_path("../../helper", __FILE__)
|
2
|
+
|
3
|
+
class UriUnescapeTest < MiniTest::Unit::TestCase
|
4
|
+
def test_doesnt_unescape_an_incomplete_escape
|
5
|
+
assert_equal "%", EscapeUtils.unescape_uri("%")
|
6
|
+
assert_equal "http%", EscapeUtils.unescape_uri("http%")
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_uri_containing_tags
|
10
|
+
assert_equal "fo<o>bar", EscapeUtils.unescape_uri("fo%3Co%3Ebar")
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_uri_containing_spaces
|
14
|
+
assert_equal "a space", EscapeUtils.unescape_uri("a%20space")
|
15
|
+
assert_equal "a sp ace ", EscapeUtils.unescape_uri("a%20%20%20sp%20ace%20")
|
16
|
+
assert_equal "a+space", EscapeUtils.unescape_uri("a+space")
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_uri_containing_mixed_characters
|
20
|
+
assert_equal "q1!2\"'w$5&7/z8)?\\", EscapeUtils.unescape_uri("q1%212%22%27w%245%267%2Fz8%29%3F%5C")
|
21
|
+
assert_equal "q1!2\"'w$5&7/z8)?\\", EscapeUtils.unescape_uri("q1!2%22'w$5&7/z8)?%5C")
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_uri_containing_multibyte_charactes
|
25
|
+
matz_name = "\xE3\x81\xBE\xE3\x81\xA4\xE3\x82\x82\xE3\x81\xA8" # Matsumoto
|
26
|
+
matz_name.force_encoding('UTF-8') if matz_name.respond_to?(:force_encoding)
|
27
|
+
assert_equal matz_name, EscapeUtils.unescape_uri('%E3%81%BE%E3%81%A4%E3%82%82%E3%81%A8')
|
28
|
+
matz_name_sep = "\xE3\x81\xBE\xE3\x81\xA4 \xE3\x82\x82\xE3\x81\xA8" # Matsu moto
|
29
|
+
matz_name_sep.force_encoding('UTF-8') if matz_name_sep.respond_to?(:force_encoding)
|
30
|
+
assert_equal matz_name_sep, EscapeUtils.unescape_uri('%E3%81%BE%E3%81%A4%20%E3%82%82%E3%81%A8')
|
31
|
+
end
|
32
|
+
|
33
|
+
if RUBY_VERSION =~ /^1.9/
|
34
|
+
def test_input_must_be_valid_utf8_or_ascii
|
35
|
+
escaped = EscapeUtils.escape_uri("fo<o>bar")
|
36
|
+
|
37
|
+
escaped.force_encoding 'ISO-8859-1'
|
38
|
+
assert_raises Encoding::CompatibilityError do
|
39
|
+
EscapeUtils.unescape_url(escaped)
|
40
|
+
end
|
41
|
+
|
42
|
+
escaped.force_encoding 'UTF-8'
|
43
|
+
begin
|
44
|
+
EscapeUtils.unescape_url(escaped)
|
45
|
+
rescue Encoding::CompatibilityError => e
|
46
|
+
assert_nil e, "#{e.class.name} raised, expected not to"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_return_value_is_tagged_as_utf8
|
51
|
+
escaped = EscapeUtils.escape_uri("a space")
|
52
|
+
assert_equal Encoding.find('UTF-8'), EscapeUtils.unescape_url(escaped).encoding
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require File.expand_path("../../helper", __FILE__)
|
2
|
+
require 'cgi'
|
3
|
+
|
4
|
+
class UriEscapeTest < MiniTest::Unit::TestCase
|
5
|
+
def test_basic_url
|
6
|
+
assert_equal "http%3A%2F%2Fwww.homerun.com%2F", EscapeUtils.escape_url("http://www.homerun.com/")
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_cgi_stdlib_compatibility
|
10
|
+
(0..127).each do |i|
|
11
|
+
c = i.chr
|
12
|
+
assert_equal CGI.escape(c), EscapeUtils.escape_url(c)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_url_containing_tags
|
17
|
+
assert_equal "fo%3Co%3Ebar", EscapeUtils.escape_url("fo<o>bar")
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_url_containing_spaces
|
21
|
+
assert_equal "a+space", EscapeUtils.escape_url("a space")
|
22
|
+
assert_equal "a+++sp+ace+", EscapeUtils.escape_url("a sp ace ")
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_url_containing_mixed_characters
|
26
|
+
assert_equal "q1%212%22%27w%245%267%2Fz8%29%3F%5C", EscapeUtils.escape_url("q1!2\"'w$5&7/z8)?\\")
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_multibyte_characters
|
30
|
+
matz_name = "\xE3\x81\xBE\xE3\x81\xA4\xE3\x82\x82\xE3\x81\xA8" # Matsumoto
|
31
|
+
assert_equal '%E3%81%BE%E3%81%A4%E3%82%82%E3%81%A8', EscapeUtils.escape_url(matz_name)
|
32
|
+
matz_name_sep = "\xE3\x81\xBE\xE3\x81\xA4 \xE3\x82\x82\xE3\x81\xA8" # Matsu moto
|
33
|
+
assert_equal '%E3%81%BE%E3%81%A4+%E3%82%82%E3%81%A8', EscapeUtils.escape_url(matz_name_sep)
|
34
|
+
end
|
35
|
+
|
36
|
+
if RUBY_VERSION =~ /^1.9/
|
37
|
+
def test_input_must_be_utf8_or_ascii
|
38
|
+
str = "fo<o>bar"
|
39
|
+
|
40
|
+
str.force_encoding 'ISO-8859-1'
|
41
|
+
assert_raises Encoding::CompatibilityError do
|
42
|
+
EscapeUtils.escape_url(str)
|
43
|
+
end
|
44
|
+
|
45
|
+
str.force_encoding 'UTF-8'
|
46
|
+
begin
|
47
|
+
EscapeUtils.escape_url(str)
|
48
|
+
rescue Encoding::CompatibilityError => e
|
49
|
+
assert_nil e, "#{e.class.name} raised, expected not to"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_return_value_is_tagged_as_utf8
|
54
|
+
str = "fo<o>bar"
|
55
|
+
assert_equal Encoding.find('UTF-8'), EscapeUtils.escape_url(str).encoding
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require File.expand_path("../../helper", __FILE__)
|
2
|
+
|
3
|
+
class UriUnescapeTest < MiniTest::Unit::TestCase
|
4
|
+
def test_basic_url
|
5
|
+
assert_equal "http://www.homerun.com/", EscapeUtils.unescape_url("http%3A%2F%2Fwww.homerun.com%2F")
|
6
|
+
assert_equal "http://www.homerun.com/", EscapeUtils.unescape_url("http://www.homerun.com/")
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_doesnt_unescape_an_incomplete_escape
|
10
|
+
assert_equal "%", EscapeUtils.unescape_url("%")
|
11
|
+
assert_equal "http%", EscapeUtils.unescape_url("http%")
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_url_containing_tags
|
15
|
+
assert_equal "fo<o>bar", EscapeUtils.unescape_url("fo%3Co%3Ebar")
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_url_containing_spaces
|
19
|
+
assert_equal "a space", EscapeUtils.unescape_url("a%20space")
|
20
|
+
assert_equal "a sp ace ", EscapeUtils.unescape_url("a%20%20%20sp%20ace%20")
|
21
|
+
assert_equal "a space", EscapeUtils.unescape_url("a+space")
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_url_containing_mixed_characters
|
25
|
+
assert_equal "q1!2\"'w$5&7/z8)?\\", EscapeUtils.unescape_url("q1%212%22%27w%245%267%2Fz8%29%3F%5C")
|
26
|
+
assert_equal "q1!2\"'w$5&7/z8)?\\", EscapeUtils.unescape_url("q1!2%22'w$5&7/z8)?%5C")
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_multibyte_characters
|
30
|
+
matz_name = "\xE3\x81\xBE\xE3\x81\xA4\xE3\x82\x82\xE3\x81\xA8" # Matsumoto
|
31
|
+
matz_name.force_encoding('UTF-8') if matz_name.respond_to?(:force_encoding)
|
32
|
+
assert_equal matz_name, EscapeUtils.unescape_url('%E3%81%BE%E3%81%A4%E3%82%82%E3%81%A8')
|
33
|
+
matz_name_sep = "\xE3\x81\xBE\xE3\x81\xA4 \xE3\x82\x82\xE3\x81\xA8" # Matsu moto
|
34
|
+
matz_name_sep.force_encoding('UTF-8') if matz_name_sep.respond_to?(:force_encoding)
|
35
|
+
assert_equal matz_name_sep, EscapeUtils.unescape_url('%E3%81%BE%E3%81%A4%20%E3%82%82%E3%81%A8')
|
36
|
+
end
|
37
|
+
|
38
|
+
if RUBY_VERSION =~ /^1.9/
|
39
|
+
def test_input_must_be_valid_utf8_or_ascii
|
40
|
+
escaped = EscapeUtils.escape_uri("fo<o>bar")
|
41
|
+
|
42
|
+
escaped.force_encoding 'ISO-8859-1'
|
43
|
+
assert_raises Encoding::CompatibilityError do
|
44
|
+
EscapeUtils.unescape_url(escaped)
|
45
|
+
end
|
46
|
+
|
47
|
+
escaped.force_encoding 'UTF-8'
|
48
|
+
begin
|
49
|
+
EscapeUtils.unescape_url(escaped)
|
50
|
+
rescue Encoding::CompatibilityError => e
|
51
|
+
assert_nil e, "#{e.class.name} raised, expected not to"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_return_value_is_tagged_as_utf8
|
56
|
+
escaped = EscapeUtils.escape_uri("fo<o>bar")
|
57
|
+
assert_equal Encoding.find('UTF-8'), EscapeUtils.unescape_url(escaped).encoding
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|