mechanize 2.0.1 → 2.1.pre.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of mechanize might be problematic. Click here for more details.
- data.tar.gz.sig +0 -0
- data/CHANGELOG.rdoc +82 -0
- data/EXAMPLES.rdoc +1 -1
- data/FAQ.rdoc +9 -9
- data/Manifest.txt +35 -48
- data/README.rdoc +2 -1
- data/Rakefile +16 -3
- data/lib/mechanize.rb +809 -392
- data/lib/mechanize/content_type_error.rb +10 -11
- data/lib/mechanize/cookie.rb +193 -60
- data/lib/mechanize/cookie_jar.rb +39 -86
- data/lib/mechanize/download.rb +59 -0
- data/lib/mechanize/element_matcher.rb +1 -0
- data/lib/mechanize/file.rb +61 -76
- data/lib/mechanize/file_saver.rb +37 -35
- data/lib/mechanize/form.rb +475 -410
- data/lib/mechanize/form/button.rb +4 -7
- data/lib/mechanize/form/check_box.rb +10 -9
- data/lib/mechanize/form/field.rb +52 -42
- data/lib/mechanize/form/file_upload.rb +17 -19
- data/lib/mechanize/form/hidden.rb +3 -0
- data/lib/mechanize/form/image_button.rb +15 -16
- data/lib/mechanize/form/keygen.rb +34 -0
- data/lib/mechanize/form/multi_select_list.rb +20 -9
- data/lib/mechanize/form/option.rb +48 -47
- data/lib/mechanize/form/radio_button.rb +52 -45
- data/lib/mechanize/form/reset.rb +3 -0
- data/lib/mechanize/form/select_list.rb +10 -6
- data/lib/mechanize/form/submit.rb +3 -0
- data/lib/mechanize/form/text.rb +3 -0
- data/lib/mechanize/form/textarea.rb +3 -0
- data/lib/mechanize/headers.rb +17 -19
- data/lib/mechanize/history.rb +60 -61
- data/lib/mechanize/http.rb +5 -0
- data/lib/mechanize/http/agent.rb +485 -218
- data/lib/mechanize/http/auth_challenge.rb +59 -0
- data/lib/mechanize/http/auth_realm.rb +31 -0
- data/lib/mechanize/http/content_disposition_parser.rb +188 -0
- data/lib/mechanize/http/www_authenticate_parser.rb +155 -0
- data/lib/mechanize/monkey_patch.rb +14 -35
- data/lib/mechanize/page.rb +34 -2
- data/lib/mechanize/page/base.rb +6 -7
- data/lib/mechanize/page/frame.rb +5 -5
- data/lib/mechanize/page/image.rb +23 -23
- data/lib/mechanize/page/label.rb +16 -16
- data/lib/mechanize/page/link.rb +16 -0
- data/lib/mechanize/page/meta_refresh.rb +19 -7
- data/lib/mechanize/parser.rb +173 -0
- data/lib/mechanize/pluggable_parsers.rb +126 -83
- data/lib/mechanize/redirect_limit_reached_error.rb +16 -13
- data/lib/mechanize/redirect_not_get_or_head_error.rb +18 -16
- data/lib/mechanize/response_code_error.rb +16 -17
- data/lib/mechanize/robots_disallowed_error.rb +22 -23
- data/lib/mechanize/test_case.rb +659 -0
- data/lib/mechanize/unauthorized_error.rb +3 -0
- data/lib/mechanize/unsupported_scheme_error.rb +4 -6
- data/lib/mechanize/util.rb +0 -12
- data/test/htdocs/form_order_test.html +11 -0
- data/test/htdocs/form_test.html +2 -2
- data/test/htdocs/tc_links.html +1 -0
- data/test/test_mechanize.rb +367 -59
- data/test/test_mechanize_cookie.rb +69 -4
- data/test/test_mechanize_cookie_jar.rb +200 -124
- data/test/test_mechanize_download.rb +43 -0
- data/test/test_mechanize_file.rb +53 -45
- data/test/{test_mechanize_file_response.rb → test_mechanize_file_connection.rb} +2 -2
- data/test/test_mechanize_file_request.rb +2 -2
- data/test/test_mechanize_file_saver.rb +21 -0
- data/test/test_mechanize_form.rb +345 -46
- data/test/test_mechanize_form_check_box.rb +5 -4
- data/test/test_mechanize_form_encoding.rb +10 -16
- data/test/test_mechanize_form_field.rb +45 -3
- data/test/test_mechanize_form_file_upload.rb +20 -0
- data/test/test_mechanize_form_image_button.rb +2 -2
- data/test/test_mechanize_form_keygen.rb +32 -0
- data/test/test_mechanize_form_multi_select_list.rb +84 -0
- data/test/test_mechanize_form_option.rb +55 -0
- data/test/test_mechanize_form_radio_button.rb +78 -0
- data/test/test_mechanize_form_select_list.rb +76 -0
- data/test/test_mechanize_form_textarea.rb +8 -7
- data/test/{test_headers.rb → test_mechanize_headers.rb} +4 -2
- data/test/test_mechanize_history.rb +103 -0
- data/test/test_mechanize_http_agent.rb +525 -17
- data/test/test_mechanize_http_auth_challenge.rb +39 -0
- data/test/test_mechanize_http_auth_realm.rb +49 -0
- data/test/test_mechanize_http_content_disposition_parser.rb +118 -0
- data/test/test_mechanize_http_www_authenticate_parser.rb +146 -0
- data/test/test_mechanize_link.rb +10 -14
- data/test/test_mechanize_page.rb +118 -0
- data/test/test_mechanize_page_encoding.rb +48 -13
- data/test/test_mechanize_page_frame.rb +16 -0
- data/test/test_mechanize_page_link.rb +27 -19
- data/test/test_mechanize_page_meta_refresh.rb +26 -14
- data/test/test_mechanize_parser.rb +289 -0
- data/test/test_mechanize_pluggable_parser.rb +52 -0
- data/test/test_mechanize_redirect_limit_reached_error.rb +24 -0
- data/test/test_mechanize_redirect_not_get_or_head_error.rb +3 -7
- data/test/test_mechanize_subclass.rb +2 -2
- data/test/test_mechanize_util.rb +24 -13
- data/test/test_multi_select.rb +23 -22
- metadata +145 -114
- metadata.gz.sig +0 -0
- data/lib/mechanize/inspect.rb +0 -88
- data/test/helper.rb +0 -175
- data/test/htdocs/form_select_all.html +0 -16
- data/test/htdocs/form_select_none.html +0 -17
- data/test/htdocs/form_select_noopts.html +0 -10
- data/test/htdocs/iframe_test.html +0 -16
- data/test/htdocs/nofollow.html +0 -9
- data/test/htdocs/norobots.html +0 -8
- data/test/htdocs/rel_nofollow.html +0 -8
- data/test/htdocs/tc_base_images.html +0 -10
- data/test/htdocs/tc_images.html +0 -8
- data/test/htdocs/tc_no_attributes.html +0 -16
- data/test/htdocs/tc_radiobuttons.html +0 -17
- data/test/htdocs/test_bad_encoding.html +0 -52
- data/test/servlets.rb +0 -402
- data/test/ssl_server.rb +0 -48
- data/test/test_cookies.rb +0 -129
- data/test/test_form_action.rb +0 -52
- data/test/test_form_as_hash.rb +0 -59
- data/test/test_form_button.rb +0 -46
- data/test/test_frames.rb +0 -34
- data/test/test_history.rb +0 -118
- data/test/test_history_added.rb +0 -16
- data/test/test_html_unscape_forms.rb +0 -46
- data/test/test_if_modified_since.rb +0 -20
- data/test/test_images.rb +0 -19
- data/test/test_no_attributes.rb +0 -13
- data/test/test_option.rb +0 -18
- data/test/test_pluggable_parser.rb +0 -136
- data/test/test_post_form.rb +0 -37
- data/test/test_pretty_print.rb +0 -22
- data/test/test_radiobutton.rb +0 -75
- data/test/test_redirect_limit_reached.rb +0 -39
- data/test/test_referer.rb +0 -81
- data/test/test_relative_links.rb +0 -40
- data/test/test_request.rb +0 -13
- data/test/test_response_code.rb +0 -53
- data/test/test_robots.rb +0 -72
- data/test/test_save_file.rb +0 -48
- data/test/test_scheme.rb +0 -48
- data/test/test_select.rb +0 -119
- data/test/test_select_all.rb +0 -15
- data/test/test_select_none.rb +0 -15
- data/test/test_select_noopts.rb +0 -18
- data/test/test_set_fields.rb +0 -44
- data/test/test_ssl_server.rb +0 -20
@@ -1,15 +1,15 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
-
require '
|
3
|
-
require 'cgi'
|
2
|
+
require 'mechanize/test_case'
|
4
3
|
|
5
4
|
# tests for Page encoding and charset and parsing
|
6
5
|
|
7
|
-
class TestMechanizePageEncoding <
|
6
|
+
class TestMechanizePageEncoding < Mechanize::TestCase
|
8
7
|
|
9
8
|
MECH_ASCII_ENCODING = Mechanize::Util::NEW_RUBY_ENCODING ? 'US-ASCII' : 'ISO-8859-1'
|
10
9
|
|
11
10
|
def setup
|
12
|
-
|
11
|
+
super
|
12
|
+
|
13
13
|
@uri = URI('http://localhost/')
|
14
14
|
@response_headers = { 'content-type' => 'text/html' }
|
15
15
|
@body = '<title>hi</title>'
|
@@ -17,7 +17,7 @@ class TestMechanizePageEncoding < MiniTest::Unit::TestCase
|
|
17
17
|
|
18
18
|
def util_page body = @body, headers = @response_headers
|
19
19
|
body.force_encoding Encoding::BINARY if body.respond_to? :force_encoding
|
20
|
-
Mechanize::Page.new @uri, headers, body, 200, @
|
20
|
+
Mechanize::Page.new @uri, headers, body, 200, @mech
|
21
21
|
end
|
22
22
|
|
23
23
|
def test_page_charset
|
@@ -30,7 +30,7 @@ class TestMechanizePageEncoding < MiniTest::Unit::TestCase
|
|
30
30
|
assert_equal 'UTF-8', charset
|
31
31
|
end
|
32
32
|
|
33
|
-
def
|
33
|
+
def test_page_charset_semicolon
|
34
34
|
charset = Mechanize::Page.charset 'text/html;charset=UTF-8;'
|
35
35
|
assert_equal 'UTF-8', charset
|
36
36
|
end
|
@@ -53,7 +53,7 @@ class TestMechanizePageEncoding < MiniTest::Unit::TestCase
|
|
53
53
|
end
|
54
54
|
|
55
55
|
def test_page_response_header_charset
|
56
|
-
headers = {'content-type' => 'text/html;charset=HEADER'}
|
56
|
+
headers = { 'content-type' => 'text/html;charset=HEADER' }
|
57
57
|
charsets = Mechanize::Page.response_header_charset(headers)
|
58
58
|
|
59
59
|
assert_equal ['HEADER'], charsets
|
@@ -71,6 +71,13 @@ class TestMechanizePageEncoding < MiniTest::Unit::TestCase
|
|
71
71
|
assert_equal [], charsets
|
72
72
|
end
|
73
73
|
|
74
|
+
def test_page_response_header_charset_wrong_header
|
75
|
+
headers = { 'x-content-type' => 'text/html;charset=bogus' }
|
76
|
+
charsets = Mechanize::Page.response_header_charset(headers)
|
77
|
+
|
78
|
+
assert_equal [], charsets
|
79
|
+
end
|
80
|
+
|
74
81
|
def test_response_header_charset
|
75
82
|
page = util_page nil, {'content-type' => 'text/html;charset=HEADER'}
|
76
83
|
|
@@ -90,6 +97,21 @@ class TestMechanizePageEncoding < MiniTest::Unit::TestCase
|
|
90
97
|
assert_equal [], charsets
|
91
98
|
end
|
92
99
|
|
100
|
+
def test_page_meta_charset_no_content
|
101
|
+
body = '<meta http-equiv="content-type">'
|
102
|
+
|
103
|
+
charsets = Mechanize::Page.meta_charset(body)
|
104
|
+
|
105
|
+
assert_empty charsets
|
106
|
+
end
|
107
|
+
|
108
|
+
# Test to fix issue: https://github.com/tenderlove/mechanize/issues/143
|
109
|
+
def test_page_meta_charset_handles_whitespace
|
110
|
+
body = '<meta http-equiv = "Content-Type" content = "text/html; charset=iso-8859-1">'
|
111
|
+
charsets = Mechanize::Page.meta_charset(body)
|
112
|
+
assert_equal ["iso-8859-1"], charsets
|
113
|
+
end
|
114
|
+
|
93
115
|
def test_meta_charset
|
94
116
|
body = '<meta http-equiv="content-type" content="text/html;charset=META">'
|
95
117
|
page = util_page body
|
@@ -106,7 +128,7 @@ class TestMechanizePageEncoding < MiniTest::Unit::TestCase
|
|
106
128
|
def test_encodings
|
107
129
|
response = {'content-type' => 'text/html;charset=HEADER'}
|
108
130
|
body = '<meta http-equiv="content-type" content="text/html;charset=META">'
|
109
|
-
@
|
131
|
+
@mech.default_encoding = 'DEFAULT'
|
110
132
|
page = util_page body, response
|
111
133
|
|
112
134
|
assert_equal true, page.encodings.include?('HEADER')
|
@@ -119,23 +141,23 @@ class TestMechanizePageEncoding < MiniTest::Unit::TestCase
|
|
119
141
|
# pre test
|
120
142
|
assert_equal false, util_page.encodings.include?('Windows-1252')
|
121
143
|
|
122
|
-
@
|
144
|
+
@mech.default_encoding = 'Windows-1252'
|
123
145
|
page = util_page
|
124
146
|
|
125
147
|
assert_equal true, page.encodings.include?('Windows-1252')
|
126
148
|
end
|
127
149
|
|
128
150
|
def test_parser_force_default_encoding
|
129
|
-
@
|
130
|
-
@
|
151
|
+
@mech.default_encoding = 'Windows-1252'
|
152
|
+
@mech.force_default_encoding = true
|
131
153
|
page = util_page
|
132
154
|
|
133
155
|
assert page.encodings.include? 'Windows-1252'
|
134
156
|
end
|
135
157
|
|
136
158
|
def test_parser_encoding_equals_overwrites_force_default_encoding
|
137
|
-
@
|
138
|
-
@
|
159
|
+
@mech.default_encoding = 'Windows-1252'
|
160
|
+
@mech.force_default_encoding = true
|
139
161
|
page = util_page
|
140
162
|
|
141
163
|
assert_equal 'Windows-1252', page.encoding
|
@@ -144,4 +166,17 @@ class TestMechanizePageEncoding < MiniTest::Unit::TestCase
|
|
144
166
|
|
145
167
|
assert_equal 'ISO-8859-2', page.encoding
|
146
168
|
end
|
169
|
+
|
170
|
+
def test_parser_encoding_when_searching_elements
|
171
|
+
skip "Encoding not implemented" unless Object.const_defined? :Encoding
|
172
|
+
|
173
|
+
body = '<span id="latin1">hi</span>'
|
174
|
+
page = util_page body, 'content-type' => 'text/html,charset=ISO-8859-1'
|
175
|
+
|
176
|
+
result = page.search('#latin1')
|
177
|
+
|
178
|
+
assert_equal Encoding::UTF_8, result.text.encoding
|
179
|
+
end
|
180
|
+
|
147
181
|
end
|
182
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'mechanize/test_case'
|
2
|
+
|
3
|
+
class TestMechanizePageFrame < Mechanize::TestCase
|
4
|
+
|
5
|
+
def test_content
|
6
|
+
page = page 'http://example/referer'
|
7
|
+
frame = node 'frame', 'name' => 'frame1', 'src' => 'http://example/'
|
8
|
+
frame = Mechanize::Page::Frame.new frame, @mech, page
|
9
|
+
|
10
|
+
frame.content
|
11
|
+
|
12
|
+
assert_equal 'http://example/referer', requests.first['Referer']
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
@@ -1,9 +1,8 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
|
-
require '
|
4
|
-
require 'cgi'
|
3
|
+
require 'mechanize/test_case'
|
5
4
|
|
6
|
-
class
|
5
|
+
class TestMechanizePageLink < Mechanize::TestCase
|
7
6
|
|
8
7
|
WINDOWS_1255 = <<-HTML
|
9
8
|
<meta http-equiv="content-type" content="text/html; charset=windows-1255">
|
@@ -41,7 +40,8 @@ class TestMechanizePage < MiniTest::Unit::TestCase
|
|
41
40
|
ENCODING_ERROR_CLASS = Nokogiri::XML::SyntaxError
|
42
41
|
|
43
42
|
def setup
|
44
|
-
|
43
|
+
super
|
44
|
+
|
45
45
|
@uri = URI('http://example')
|
46
46
|
@res = { 'content-type' => 'text/html' }
|
47
47
|
@body = '<title>hi</title>'
|
@@ -49,7 +49,7 @@ class TestMechanizePage < MiniTest::Unit::TestCase
|
|
49
49
|
|
50
50
|
def util_page body = @body, res = @res
|
51
51
|
body.force_encoding Encoding::BINARY if body.respond_to? :force_encoding
|
52
|
-
Mechanize::Page.new @uri, res, body, 200, @
|
52
|
+
Mechanize::Page.new @uri, res, body, 200, @mech
|
53
53
|
end
|
54
54
|
|
55
55
|
def test_initialize_supported_content_type
|
@@ -91,10 +91,10 @@ class TestMechanizePage < MiniTest::Unit::TestCase
|
|
91
91
|
end
|
92
92
|
|
93
93
|
def test_canonical_uri
|
94
|
-
page = @
|
94
|
+
page = @mech.get("http://localhost/canonical_uri.html")
|
95
95
|
assert_equal(URI("http://localhost/canonical_uri"), page.canonical_uri)
|
96
96
|
|
97
|
-
page = @
|
97
|
+
page = @mech.get("http://localhost/file_upload.html")
|
98
98
|
assert_equal(nil, page.canonical_uri)
|
99
99
|
end
|
100
100
|
|
@@ -254,7 +254,7 @@ class TestMechanizePage < MiniTest::Unit::TestCase
|
|
254
254
|
end
|
255
255
|
|
256
256
|
def test_frames_with
|
257
|
-
page = @
|
257
|
+
page = @mech.get("http://localhost/frame_test.html")
|
258
258
|
assert_equal(3, page.frames.size)
|
259
259
|
|
260
260
|
find_orig = page.frames.find_all { |f| f.name == 'frame1' }
|
@@ -267,7 +267,7 @@ class TestMechanizePage < MiniTest::Unit::TestCase
|
|
267
267
|
end
|
268
268
|
|
269
269
|
def test_links_with_dom_id
|
270
|
-
page = @
|
270
|
+
page = @mech.get("http://localhost/tc_links.html")
|
271
271
|
link = page.links_with(:dom_id => 'bold_aaron_link')
|
272
272
|
link_by_id = page.links_with(:id => 'bold_aaron_link')
|
273
273
|
assert_equal(1, link.length)
|
@@ -275,34 +275,42 @@ class TestMechanizePage < MiniTest::Unit::TestCase
|
|
275
275
|
assert_equal(link, link_by_id)
|
276
276
|
end
|
277
277
|
|
278
|
+
def test_links_with_dom_class
|
279
|
+
page = @mech.get("http://localhost/tc_links.html")
|
280
|
+
link = page.links_with(:dom_class => 'thing_link')
|
281
|
+
link_by_class = page.links_with(:class => 'thing_link')
|
282
|
+
assert_equal(1, link.length)
|
283
|
+
assert_equal(link, link_by_class)
|
284
|
+
end
|
285
|
+
|
278
286
|
def test_link_with_encoded_space
|
279
|
-
page = @
|
287
|
+
page = @mech.get("http://localhost/tc_links.html")
|
280
288
|
link = page.link_with(:text => 'encoded space')
|
281
|
-
page = @
|
289
|
+
page = @mech.click link
|
282
290
|
end
|
283
291
|
|
284
292
|
def test_link_with_space
|
285
|
-
page = @
|
293
|
+
page = @mech.get("http://localhost/tc_links.html")
|
286
294
|
link = page.link_with(:text => 'not encoded space')
|
287
|
-
page = @
|
295
|
+
page = @mech.click link
|
288
296
|
end
|
289
297
|
|
290
298
|
def test_link_with_unusual_characters
|
291
|
-
page = @
|
299
|
+
page = @mech.get("http://localhost/tc_links.html")
|
292
300
|
link = page.link_with(:text => 'unusual characters')
|
293
301
|
|
294
|
-
@
|
302
|
+
@mech.click link
|
295
303
|
|
296
304
|
# HACK no assertion
|
297
305
|
end
|
298
306
|
|
299
307
|
def test_links
|
300
|
-
page = @
|
308
|
+
page = @mech.get("http://localhost/find_link.html")
|
301
309
|
assert_equal(18, page.links.length)
|
302
310
|
end
|
303
311
|
|
304
312
|
def test_links_with_bold
|
305
|
-
page = @
|
313
|
+
page = @mech.get("http://localhost/tc_links.html")
|
306
314
|
link = page.links_with(:text => /Bold Dude/)
|
307
315
|
assert_equal(1, link.length)
|
308
316
|
assert_equal('Bold Dude', link.first.text)
|
@@ -330,7 +338,7 @@ class TestMechanizePage < MiniTest::Unit::TestCase
|
|
330
338
|
end
|
331
339
|
|
332
340
|
def test_meta_refresh
|
333
|
-
page = @
|
341
|
+
page = @mech.get("http://localhost/find_link.html")
|
334
342
|
assert_equal(3, page.meta_refresh.length)
|
335
343
|
assert_equal(%w{
|
336
344
|
http://www.drphil.com/
|
@@ -359,7 +367,7 @@ class TestMechanizePage < MiniTest::Unit::TestCase
|
|
359
367
|
end
|
360
368
|
|
361
369
|
def test_form
|
362
|
-
page = @
|
370
|
+
page = @mech.get("http://localhost/tc_form_action.html")
|
363
371
|
|
364
372
|
form = page.form(:name => 'post_form1')
|
365
373
|
assert form
|
@@ -1,11 +1,12 @@
|
|
1
|
-
require '
|
1
|
+
require 'mechanize/test_case'
|
2
2
|
|
3
|
-
class TestMechanizePageMetaRefresh <
|
3
|
+
class TestMechanizePageMetaRefresh < Mechanize::TestCase
|
4
4
|
|
5
5
|
def setup
|
6
|
+
super
|
7
|
+
|
6
8
|
@MR = Mechanize::Page::MetaRefresh
|
7
9
|
|
8
|
-
@agent = Mechanize.new
|
9
10
|
@uri = URI 'http://example/here/'
|
10
11
|
end
|
11
12
|
|
@@ -15,7 +16,7 @@ class TestMechanizePageMetaRefresh < MiniTest::Unit::TestCase
|
|
15
16
|
BODY
|
16
17
|
|
17
18
|
Mechanize::Page.new(@uri, { 'content-type' => 'text/html' }, body, 200,
|
18
|
-
@
|
19
|
+
@mech)
|
19
20
|
end
|
20
21
|
|
21
22
|
def util_meta_refresh page
|
@@ -24,37 +25,48 @@ class TestMechanizePageMetaRefresh < MiniTest::Unit::TestCase
|
|
24
25
|
end
|
25
26
|
|
26
27
|
def test_class_parse
|
27
|
-
delay, uri = @MR.parse "0; url=http://localhost:8080/path", @uri
|
28
|
+
delay, uri, link_self = @MR.parse "0; url=http://localhost:8080/path", @uri
|
28
29
|
assert_equal "0", delay
|
29
30
|
assert_equal "http://localhost:8080/path", uri.to_s
|
31
|
+
refute link_self
|
30
32
|
|
31
|
-
delay, uri
|
33
|
+
delay, uri, link_self =
|
34
|
+
@MR.parse "100.001; url=http://localhost:8080/path", @uri
|
32
35
|
assert_equal "100.001", delay
|
33
36
|
assert_equal "http://localhost:8080/path", uri.to_s
|
37
|
+
refute link_self
|
34
38
|
|
35
|
-
delay, uri
|
39
|
+
delay, uri, link_self =
|
40
|
+
@MR.parse "0; url='http://localhost:8080/path'", @uri
|
36
41
|
assert_equal "0", delay
|
37
42
|
assert_equal "http://localhost:8080/path", uri.to_s
|
43
|
+
refute link_self
|
38
44
|
|
39
|
-
delay, uri =
|
45
|
+
delay, uri, link_self =
|
46
|
+
@MR.parse "0; url=\"http://localhost:8080/path\"", @uri
|
40
47
|
assert_equal "0", delay
|
41
48
|
assert_equal "http://localhost:8080/path", uri.to_s
|
49
|
+
refute link_self
|
42
50
|
|
43
|
-
delay, uri = @MR.parse "0; url=", @uri
|
51
|
+
delay, uri, link_self = @MR.parse "0; url=", @uri
|
44
52
|
assert_equal "0", delay
|
45
53
|
assert_equal "http://example/here/", uri.to_s
|
54
|
+
assert link_self
|
46
55
|
|
47
|
-
delay, uri = @MR.parse "0", @uri
|
56
|
+
delay, uri, link_self = @MR.parse "0", @uri
|
48
57
|
assert_equal "0", delay
|
49
58
|
assert_equal "http://example/here/", uri.to_s
|
59
|
+
assert link_self
|
50
60
|
|
51
|
-
delay, uri = @MR.parse " 0; ", @uri
|
61
|
+
delay, uri, link_self = @MR.parse " 0; ", @uri
|
52
62
|
assert_equal "0", delay
|
53
63
|
assert_equal "http://example/here/", uri.to_s
|
64
|
+
assert link_self
|
54
65
|
|
55
|
-
delay, uri = @MR.parse "0; UrL=http://localhost:8080/path", @uri
|
66
|
+
delay, uri, link_self = @MR.parse "0; UrL=http://localhost:8080/path", @uri
|
56
67
|
assert_equal "0", delay
|
57
68
|
assert_equal "http://localhost:8080/path", uri.to_s
|
69
|
+
refute link_self
|
58
70
|
end
|
59
71
|
|
60
72
|
def test_class_from_node
|
@@ -95,7 +107,7 @@ class TestMechanizePageMetaRefresh < MiniTest::Unit::TestCase
|
|
95
107
|
BODY
|
96
108
|
|
97
109
|
page = Mechanize::Page.new(@uri, { 'content-type' => 'text/html' }, body,
|
98
|
-
200, @
|
110
|
+
200, @mech)
|
99
111
|
|
100
112
|
assert_nil util_meta_refresh page
|
101
113
|
end
|
@@ -106,7 +118,7 @@ class TestMechanizePageMetaRefresh < MiniTest::Unit::TestCase
|
|
106
118
|
BODY
|
107
119
|
|
108
120
|
page = Mechanize::Page.new(@uri, { 'content-type' => 'text/html' }, body,
|
109
|
-
200, @
|
121
|
+
200, @mech)
|
110
122
|
|
111
123
|
assert_nil util_meta_refresh page
|
112
124
|
end
|
@@ -0,0 +1,289 @@
|
|
1
|
+
require 'mechanize/test_case'
|
2
|
+
|
3
|
+
class TestMechanizeParser < Mechanize::TestCase
|
4
|
+
|
5
|
+
class P
|
6
|
+
include Mechanize::Parser
|
7
|
+
|
8
|
+
attr_accessor :filename
|
9
|
+
attr_accessor :response
|
10
|
+
attr_accessor :uri
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@uri = URI 'http://example'
|
14
|
+
@full_path = false
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def setup
|
19
|
+
super
|
20
|
+
|
21
|
+
@parser = P.new
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_extract_filename
|
25
|
+
@parser.response = {}
|
26
|
+
|
27
|
+
assert_equal 'index.html', @parser.extract_filename
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_extract_filename_content_disposition
|
31
|
+
@parser.uri = URI 'http://example/foo'
|
32
|
+
|
33
|
+
@parser.response = {
|
34
|
+
'content-disposition' => 'attachment; filename=genome.jpeg'
|
35
|
+
}
|
36
|
+
|
37
|
+
assert_equal 'genome.jpeg', @parser.extract_filename
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_extract_filename_content_disposition_path
|
41
|
+
@parser.uri = URI 'http://example'
|
42
|
+
|
43
|
+
@parser.response = {
|
44
|
+
'content-disposition' => 'attachment; filename="../genome.jpeg"'
|
45
|
+
}
|
46
|
+
|
47
|
+
assert_equal 'example/genome.jpeg', @parser.extract_filename(true)
|
48
|
+
|
49
|
+
@parser.response = {
|
50
|
+
'content-disposition' => 'attachment; filename="foo/genome.jpeg"'
|
51
|
+
}
|
52
|
+
|
53
|
+
assert_equal 'example/genome.jpeg', @parser.extract_filename(true)
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_extract_filename_content_disposition_path_windows
|
57
|
+
@parser.uri = URI 'http://example'
|
58
|
+
|
59
|
+
@parser.response = {
|
60
|
+
'content-disposition' => 'attachment; filename="..\\\\genome.jpeg"'
|
61
|
+
}
|
62
|
+
|
63
|
+
assert_equal 'example/genome.jpeg', @parser.extract_filename(true)
|
64
|
+
|
65
|
+
@parser.response = {
|
66
|
+
'content-disposition' => 'attachment; filename="foo\\\\genome.jpeg"'
|
67
|
+
}
|
68
|
+
|
69
|
+
assert_equal 'example/genome.jpeg', @parser.extract_filename(true)
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_extract_filename_content_disposition_full_path
|
73
|
+
@parser.uri = URI 'http://example/foo'
|
74
|
+
|
75
|
+
@parser.response = {
|
76
|
+
'content-disposition' => 'attachment; filename=genome.jpeg'
|
77
|
+
}
|
78
|
+
|
79
|
+
assert_equal 'example/genome.jpeg', @parser.extract_filename(true)
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_extract_filename_content_disposition_quoted
|
83
|
+
@parser.uri = URI 'http://example'
|
84
|
+
|
85
|
+
@parser.response = {
|
86
|
+
'content-disposition' => 'attachment; filename="some \"file\""'
|
87
|
+
}
|
88
|
+
|
89
|
+
assert_equal 'some__file_', @parser.extract_filename
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_extract_filename_content_disposition_special
|
93
|
+
@parser.uri = URI 'http://example/foo'
|
94
|
+
|
95
|
+
@parser.response = {
|
96
|
+
'content-disposition' => 'attachment; filename="/\\\\<>:\\"|?*"'
|
97
|
+
}
|
98
|
+
|
99
|
+
assert_equal '_______', @parser.extract_filename
|
100
|
+
|
101
|
+
chars = (0..12).map { |c| c.chr }.join
|
102
|
+
chars += "\\\r"
|
103
|
+
chars += (14..31).map { |c| c.chr }.join
|
104
|
+
|
105
|
+
@parser.response = {
|
106
|
+
'content-disposition' => "attachment; filename=\"#{chars}\""
|
107
|
+
}
|
108
|
+
|
109
|
+
assert_equal '_' * 32, @parser.extract_filename
|
110
|
+
end
|
111
|
+
|
112
|
+
def test_extract_filename_content_disposition_windows_special
|
113
|
+
@parser.uri = URI 'http://example'
|
114
|
+
|
115
|
+
windows_special = %w[
|
116
|
+
AUX
|
117
|
+
COM1
|
118
|
+
COM2
|
119
|
+
COM3
|
120
|
+
COM4
|
121
|
+
COM5
|
122
|
+
COM6
|
123
|
+
COM7
|
124
|
+
COM8
|
125
|
+
COM9
|
126
|
+
CON
|
127
|
+
LPT1
|
128
|
+
LPT2
|
129
|
+
LPT3
|
130
|
+
LPT4
|
131
|
+
LPT5
|
132
|
+
LPT6
|
133
|
+
LPT7
|
134
|
+
LPT8
|
135
|
+
LPT9
|
136
|
+
NUL
|
137
|
+
PRN
|
138
|
+
]
|
139
|
+
|
140
|
+
windows_special.each do |special|
|
141
|
+
@parser.response = {
|
142
|
+
'content-disposition' => "attachment; filename=#{special}"
|
143
|
+
}
|
144
|
+
|
145
|
+
assert_equal "_#{special}", @parser.extract_filename
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
def test_extract_filename_host
|
150
|
+
@parser.response = {}
|
151
|
+
@parser.uri = URI 'http://example'
|
152
|
+
|
153
|
+
assert_equal 'example/index.html', @parser.extract_filename(true)
|
154
|
+
end
|
155
|
+
|
156
|
+
def test_extract_filename_special_character
|
157
|
+
@parser.response = {}
|
158
|
+
|
159
|
+
invisible = "\t\n\v\f\r"
|
160
|
+
|
161
|
+
invisible.chars.each do |char|
|
162
|
+
begin
|
163
|
+
@parser.uri = URI "http://example/#{char}"
|
164
|
+
|
165
|
+
assert_equal 'index.html', @parser.extract_filename, char.inspect
|
166
|
+
rescue URI::InvalidURIError
|
167
|
+
# ignore
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
escaped = "<>\"\\|"
|
172
|
+
|
173
|
+
escaped.chars.each do |char|
|
174
|
+
escaped_char = CGI.escape char
|
175
|
+
|
176
|
+
@parser.uri = URI "http://example/#{escaped_char}"
|
177
|
+
|
178
|
+
assert_equal "#{escaped_char}.html", @parser.extract_filename, char
|
179
|
+
end
|
180
|
+
|
181
|
+
@parser.uri = URI "http://example/?"
|
182
|
+
|
183
|
+
assert_equal 'index.html_', @parser.extract_filename, 'empty query'
|
184
|
+
|
185
|
+
@parser.uri = URI "http://example/:"
|
186
|
+
|
187
|
+
assert_equal '_.html', @parser.extract_filename, 'colon'
|
188
|
+
|
189
|
+
@parser.uri = URI "http://example/*"
|
190
|
+
|
191
|
+
assert_equal '_.html', @parser.extract_filename, 'asterisk'
|
192
|
+
end
|
193
|
+
|
194
|
+
def test_extract_filename_uri
|
195
|
+
@parser.response = {}
|
196
|
+
@parser.uri = URI 'http://example/foo'
|
197
|
+
|
198
|
+
assert_equal 'foo.html', @parser.extract_filename
|
199
|
+
|
200
|
+
@parser.uri += '/foo.jpg'
|
201
|
+
|
202
|
+
assert_equal 'foo.jpg', @parser.extract_filename
|
203
|
+
end
|
204
|
+
|
205
|
+
def test_extract_filename_uri_full_path
|
206
|
+
@parser.response = {}
|
207
|
+
@parser.uri = URI 'http://example/foo'
|
208
|
+
|
209
|
+
assert_equal 'example/foo.html', @parser.extract_filename(true)
|
210
|
+
|
211
|
+
@parser.uri += '/foo.jpg'
|
212
|
+
|
213
|
+
assert_equal 'example/foo.jpg', @parser.extract_filename(true)
|
214
|
+
end
|
215
|
+
|
216
|
+
def test_extract_filename_uri_query
|
217
|
+
@parser.response = {}
|
218
|
+
@parser.uri = URI 'http://example/?id=5'
|
219
|
+
|
220
|
+
assert_equal 'index.html_id=5', @parser.extract_filename
|
221
|
+
|
222
|
+
@parser.uri += '/foo.html?id=5'
|
223
|
+
|
224
|
+
assert_equal 'foo.html_id=5', @parser.extract_filename
|
225
|
+
end
|
226
|
+
|
227
|
+
def test_extract_filename_uri_slash
|
228
|
+
@parser.response = {}
|
229
|
+
@parser.uri = URI 'http://example/foo/'
|
230
|
+
|
231
|
+
assert_equal 'example/foo/index.html', @parser.extract_filename(true)
|
232
|
+
|
233
|
+
@parser.uri += '/foo///'
|
234
|
+
|
235
|
+
assert_equal 'example/foo/index.html', @parser.extract_filename(true)
|
236
|
+
end
|
237
|
+
|
238
|
+
def test_extract_filename_windows_special
|
239
|
+
@parser.uri = URI 'http://example'
|
240
|
+
@parser.response = {}
|
241
|
+
|
242
|
+
windows_special = %w[
|
243
|
+
AUX
|
244
|
+
COM1
|
245
|
+
COM2
|
246
|
+
COM3
|
247
|
+
COM4
|
248
|
+
COM5
|
249
|
+
COM6
|
250
|
+
COM7
|
251
|
+
COM8
|
252
|
+
COM9
|
253
|
+
CON
|
254
|
+
LPT1
|
255
|
+
LPT2
|
256
|
+
LPT3
|
257
|
+
LPT4
|
258
|
+
LPT5
|
259
|
+
LPT6
|
260
|
+
LPT7
|
261
|
+
LPT8
|
262
|
+
LPT9
|
263
|
+
NUL
|
264
|
+
PRN
|
265
|
+
]
|
266
|
+
|
267
|
+
windows_special.each do |special|
|
268
|
+
@parser.uri += "/#{special}"
|
269
|
+
|
270
|
+
assert_equal "_#{special}.html", @parser.extract_filename
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
def test_fill_header
|
275
|
+
@parser.fill_header 'a' => 'b'
|
276
|
+
|
277
|
+
expected = { 'a' => 'b' }
|
278
|
+
|
279
|
+
assert_equal expected, @parser.response
|
280
|
+
end
|
281
|
+
|
282
|
+
def test_fill_header_nil
|
283
|
+
@parser.fill_header nil
|
284
|
+
|
285
|
+
assert_empty @parser.response
|
286
|
+
end
|
287
|
+
|
288
|
+
end
|
289
|
+
|