mechanize 2.14.0 → 2.14.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +27 -1
- data/README.md +7 -0
- data/SECURITY.md +11 -0
- data/lib/mechanize/directory_saver.rb +2 -1
- data/lib/mechanize/file_saver.rb +2 -0
- data/lib/mechanize/http/agent.rb +83 -29
- data/lib/mechanize/parser.rb +33 -3
- data/lib/mechanize/test_case.rb +2 -9
- data/lib/mechanize/version.rb +1 -1
- data/lib/mechanize.rb +12 -2
- data/test/htdocs/frame_test.html +8 -6
- data/test/htdocs/relative/tc_relative_links.html +1 -1
- metadata +7 -174
- data/.autotest +0 -6
- data/.github/dependabot.yml +0 -11
- data/.github/workflows/ci.yml +0 -43
- data/.github/workflows/upstream.yml +0 -51
- data/.gitignore +0 -15
- data/.yardopts +0 -8
- data/Gemfile +0 -12
- data/Rakefile +0 -56
- data/examples/flickr_upload.rb +0 -22
- data/examples/latest_user_agents.rb +0 -100
- data/examples/mech-dump.rb +0 -5
- data/examples/proxy_req.rb +0 -7
- data/examples/rubygems.rb +0 -23
- data/examples/spider.rb +0 -22
- data/examples/wikipedia_links_to_philosophy.rb +0 -158
- data/mechanize.gemspec +0 -74
- data/test/data/htpasswd +0 -1
- data/test/data/server.crt +0 -16
- data/test/data/server.csr +0 -12
- data/test/data/server.key +0 -15
- data/test/data/server.pem +0 -15
- data/test/test_mechanize.rb +0 -1382
- data/test/test_mechanize_cookie.rb +0 -559
- data/test/test_mechanize_cookie_jar.rb +0 -615
- data/test/test_mechanize_directory_saver.rb +0 -60
- data/test/test_mechanize_download.rb +0 -102
- data/test/test_mechanize_element_not_found_error.rb +0 -16
- data/test/test_mechanize_file.rb +0 -118
- data/test/test_mechanize_file_connection.rb +0 -40
- data/test/test_mechanize_file_request.rb +0 -26
- data/test/test_mechanize_file_response.rb +0 -48
- data/test/test_mechanize_file_saver.rb +0 -22
- data/test/test_mechanize_form.rb +0 -1025
- data/test/test_mechanize_form_check_box.rb +0 -49
- data/test/test_mechanize_form_encoding.rb +0 -110
- data/test/test_mechanize_form_field.rb +0 -78
- data/test/test_mechanize_form_file_upload.rb +0 -21
- data/test/test_mechanize_form_image_button.rb +0 -13
- data/test/test_mechanize_form_keygen.rb +0 -34
- data/test/test_mechanize_form_multi_select_list.rb +0 -98
- data/test/test_mechanize_form_option.rb +0 -60
- data/test/test_mechanize_form_radio_button.rb +0 -96
- data/test/test_mechanize_form_select_list.rb +0 -81
- data/test/test_mechanize_form_textarea.rb +0 -53
- data/test/test_mechanize_headers.rb +0 -36
- data/test/test_mechanize_history.rb +0 -104
- data/test/test_mechanize_http_agent.rb +0 -1915
- data/test/test_mechanize_http_auth_challenge.rb +0 -64
- data/test/test_mechanize_http_auth_realm.rb +0 -56
- data/test/test_mechanize_http_auth_store.rb +0 -233
- data/test/test_mechanize_http_content_disposition_parser.rb +0 -167
- data/test/test_mechanize_http_www_authenticate_parser.rb +0 -204
- data/test/test_mechanize_image.rb +0 -9
- data/test/test_mechanize_link.rb +0 -171
- data/test/test_mechanize_page.rb +0 -295
- data/test/test_mechanize_page_encoding.rb +0 -215
- data/test/test_mechanize_page_frame.rb +0 -17
- data/test/test_mechanize_page_image.rb +0 -191
- data/test/test_mechanize_page_link.rb +0 -377
- data/test/test_mechanize_page_meta_refresh.rb +0 -151
- data/test/test_mechanize_parser.rb +0 -316
- data/test/test_mechanize_pluggable_parser.rb +0 -68
- data/test/test_mechanize_redirect_limit_reached_error.rb +0 -25
- data/test/test_mechanize_redirect_not_get_or_head_error.rb +0 -15
- data/test/test_mechanize_response_read_error.rb +0 -29
- data/test/test_mechanize_subclass.rb +0 -23
- data/test/test_mechanize_util.rb +0 -144
- data/test/test_mechanize_xml_file.rb +0 -30
- data/test/test_multi_select.rb +0 -120
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
require 'mechanize/test_case'
|
|
3
|
-
|
|
4
|
-
class TestMechanizeDownload < Mechanize::TestCase
|
|
5
|
-
|
|
6
|
-
def setup
|
|
7
|
-
super
|
|
8
|
-
|
|
9
|
-
@parser = Mechanize::Download
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def test_body
|
|
13
|
-
uri = URI.parse 'http://example/foo.html'
|
|
14
|
-
body_io = StringIO.new '0123456789'
|
|
15
|
-
|
|
16
|
-
download = @parser.new uri, nil, body_io
|
|
17
|
-
|
|
18
|
-
assert_equal '0123456789', download.body
|
|
19
|
-
assert_equal 0, download.body_io.pos
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def test_save_string_io
|
|
23
|
-
uri = URI.parse 'http://example/foo.html'
|
|
24
|
-
body_io = StringIO.new '0123456789'
|
|
25
|
-
|
|
26
|
-
download = @parser.new uri, nil, body_io
|
|
27
|
-
|
|
28
|
-
in_tmpdir do
|
|
29
|
-
filename = download.save
|
|
30
|
-
|
|
31
|
-
assert File.exist? 'foo.html'
|
|
32
|
-
assert_equal "foo.html", filename
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def test_save_bang
|
|
37
|
-
uri = URI.parse 'http://example/foo.html'
|
|
38
|
-
body_io = StringIO.new '0123456789'
|
|
39
|
-
|
|
40
|
-
download = @parser.new uri, nil, body_io
|
|
41
|
-
|
|
42
|
-
in_tmpdir do
|
|
43
|
-
filename = download.save!
|
|
44
|
-
|
|
45
|
-
assert File.exist? 'foo.html'
|
|
46
|
-
assert_equal "foo.html", filename
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
def test_save_bang_does_not_allow_command_injection
|
|
51
|
-
skip if windows?
|
|
52
|
-
uri = URI.parse 'http://example/foo.html'
|
|
53
|
-
body_io = StringIO.new '0123456789'
|
|
54
|
-
|
|
55
|
-
download = @parser.new uri, nil, body_io
|
|
56
|
-
|
|
57
|
-
in_tmpdir do
|
|
58
|
-
download.save!('| ruby -rfileutils -e \'FileUtils.touch("vul.txt")\'')
|
|
59
|
-
refute_operator(File, :exist?, "vul.txt")
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def test_save_tempfile
|
|
64
|
-
uri = URI.parse 'http://example/foo.html'
|
|
65
|
-
Tempfile.open @NAME do |body_io|
|
|
66
|
-
body_io.unlink
|
|
67
|
-
body_io.write '0123456789'
|
|
68
|
-
|
|
69
|
-
body_io.flush
|
|
70
|
-
body_io.rewind
|
|
71
|
-
|
|
72
|
-
download = @parser.new uri, nil, body_io
|
|
73
|
-
|
|
74
|
-
in_tmpdir do
|
|
75
|
-
filename = download.save
|
|
76
|
-
|
|
77
|
-
assert File.exist? 'foo.html'
|
|
78
|
-
assert_equal "foo.html", filename
|
|
79
|
-
|
|
80
|
-
filename = download.save
|
|
81
|
-
|
|
82
|
-
assert File.exist? 'foo.html.1'
|
|
83
|
-
assert_equal "foo.html.1", filename
|
|
84
|
-
|
|
85
|
-
filename = download.save
|
|
86
|
-
|
|
87
|
-
assert File.exist? 'foo.html.2'
|
|
88
|
-
assert_equal "foo.html.2", filename
|
|
89
|
-
end
|
|
90
|
-
end
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
def test_filename
|
|
94
|
-
uri = URI.parse 'http://example/foo.html'
|
|
95
|
-
body_io = StringIO.new '0123456789'
|
|
96
|
-
|
|
97
|
-
download = @parser.new uri, nil, body_io
|
|
98
|
-
|
|
99
|
-
assert_equal "foo.html", download.filename
|
|
100
|
-
end
|
|
101
|
-
end
|
|
102
|
-
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
require 'mechanize/test_case'
|
|
3
|
-
|
|
4
|
-
class TestMechanizeRedirectLimitReachedError < Mechanize::TestCase
|
|
5
|
-
|
|
6
|
-
def test_to_s
|
|
7
|
-
page = fake_page
|
|
8
|
-
|
|
9
|
-
error = Mechanize::ElementNotFoundError.new(page, :element, :conditions)
|
|
10
|
-
|
|
11
|
-
assert_match(/element/, error.to_s)
|
|
12
|
-
assert_match(/conditions/, error.to_s)
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
end
|
|
16
|
-
|
data/test/test_mechanize_file.rb
DELETED
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
require 'mechanize/test_case'
|
|
3
|
-
|
|
4
|
-
class TestMechanizeFile < Mechanize::TestCase
|
|
5
|
-
|
|
6
|
-
def setup
|
|
7
|
-
super
|
|
8
|
-
|
|
9
|
-
@parser = Mechanize::File
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def test_save
|
|
13
|
-
uri = URI 'http://example/name.html'
|
|
14
|
-
page = Mechanize::File.new uri, nil, '0123456789'
|
|
15
|
-
|
|
16
|
-
Dir.mktmpdir do |dir|
|
|
17
|
-
Dir.chdir dir do
|
|
18
|
-
filename = page.save 'test.html'
|
|
19
|
-
|
|
20
|
-
assert File.exist? 'test.html'
|
|
21
|
-
assert_equal '0123456789', File.read('test.html')
|
|
22
|
-
assert_equal "test.html", filename
|
|
23
|
-
|
|
24
|
-
filename = page.save 'test.html'
|
|
25
|
-
|
|
26
|
-
assert File.exist? 'test.html.1'
|
|
27
|
-
assert_equal '0123456789', File.read('test.html.1')
|
|
28
|
-
assert_equal "test.html.1", filename
|
|
29
|
-
|
|
30
|
-
filename = page.save 'test.html'
|
|
31
|
-
|
|
32
|
-
assert File.exist? 'test.html.2'
|
|
33
|
-
assert_equal '0123456789', File.read('test.html.2')
|
|
34
|
-
assert_equal "test.html.2", filename
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def test_save_default
|
|
40
|
-
uri = URI 'http://example/test.html'
|
|
41
|
-
page = Mechanize::File.new uri, nil, ''
|
|
42
|
-
|
|
43
|
-
Dir.mktmpdir do |dir|
|
|
44
|
-
Dir.chdir dir do
|
|
45
|
-
filename = page.save
|
|
46
|
-
|
|
47
|
-
assert File.exist? 'test.html'
|
|
48
|
-
assert_equal "test.html", filename
|
|
49
|
-
|
|
50
|
-
filename = page.save
|
|
51
|
-
|
|
52
|
-
assert File.exist? 'test.html.1'
|
|
53
|
-
assert_equal "test.html.1", filename
|
|
54
|
-
|
|
55
|
-
filename = page.save
|
|
56
|
-
|
|
57
|
-
assert File.exist? 'test.html.2'
|
|
58
|
-
assert_equal "test.html.2", filename
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def test_save_default_dots
|
|
64
|
-
uri = URI 'http://localhost/../test.html'
|
|
65
|
-
page = Mechanize::File.new uri, nil, ''
|
|
66
|
-
|
|
67
|
-
Dir.mktmpdir do |dir|
|
|
68
|
-
Dir.chdir dir do
|
|
69
|
-
filename = page.save
|
|
70
|
-
assert File.exist? 'test.html'
|
|
71
|
-
assert_equal "test.html", filename
|
|
72
|
-
|
|
73
|
-
filename = page.save
|
|
74
|
-
assert File.exist? 'test.html.1'
|
|
75
|
-
assert_equal "test.html.1", filename
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
def test_filename
|
|
81
|
-
uri = URI 'http://localhost/test.html'
|
|
82
|
-
page = Mechanize::File.new uri, nil, ''
|
|
83
|
-
|
|
84
|
-
assert_equal "test.html", page.filename
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
def test_save_overwrite
|
|
88
|
-
uri = URI 'http://example/test.html'
|
|
89
|
-
page = Mechanize::File.new uri, nil, ''
|
|
90
|
-
|
|
91
|
-
Dir.mktmpdir do |dir|
|
|
92
|
-
Dir.chdir dir do
|
|
93
|
-
filename = page.save 'test.html'
|
|
94
|
-
|
|
95
|
-
assert File.exist? 'test.html'
|
|
96
|
-
assert_equal "test.html", filename
|
|
97
|
-
|
|
98
|
-
filename = page.save! 'test.html'
|
|
99
|
-
|
|
100
|
-
assert File.exist? 'test.html'
|
|
101
|
-
refute File.exist? 'test.html.1'
|
|
102
|
-
assert_equal "test.html", filename
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
def test_save_bang_does_not_allow_command_injection
|
|
108
|
-
skip if windows?
|
|
109
|
-
uri = URI 'http://example/test.html'
|
|
110
|
-
page = Mechanize::File.new uri, nil, ''
|
|
111
|
-
|
|
112
|
-
in_tmpdir do
|
|
113
|
-
page.save!('| ruby -rfileutils -e \'FileUtils.touch("vul.txt")\'')
|
|
114
|
-
refute_operator(File, :exist?, "vul.txt")
|
|
115
|
-
end
|
|
116
|
-
end
|
|
117
|
-
end
|
|
118
|
-
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
require 'mechanize/test_case'
|
|
3
|
-
|
|
4
|
-
class TestMechanizeFileConnection < Mechanize::TestCase
|
|
5
|
-
|
|
6
|
-
def test_request
|
|
7
|
-
file_path = File.expand_path(__FILE__)
|
|
8
|
-
uri = URI.parse "file://#{file_path}"
|
|
9
|
-
conn = Mechanize::FileConnection.new
|
|
10
|
-
|
|
11
|
-
body = +''
|
|
12
|
-
|
|
13
|
-
conn.request uri, nil do |response|
|
|
14
|
-
assert_equal(file_path, response.file_path)
|
|
15
|
-
response.read_body do |part|
|
|
16
|
-
body << part
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
assert_equal File.read(__FILE__), body.gsub(/\r\n/, "\n")
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def test_request_on_uri_with_windows_drive
|
|
24
|
-
uri_string = "file://C:/path/to/file.html"
|
|
25
|
-
expected_file_path = "C:/path/to/file.html"
|
|
26
|
-
|
|
27
|
-
uri = URI.parse(uri_string)
|
|
28
|
-
conn = Mechanize::FileConnection.new
|
|
29
|
-
|
|
30
|
-
called = false
|
|
31
|
-
yielded_file_path = nil
|
|
32
|
-
conn.request(uri, nil) do |response|
|
|
33
|
-
called = true
|
|
34
|
-
yielded_file_path = response.file_path
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
assert(called)
|
|
38
|
-
assert_equal(expected_file_path, yielded_file_path)
|
|
39
|
-
end
|
|
40
|
-
end
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
require 'mechanize/test_case'
|
|
3
|
-
|
|
4
|
-
class TestMechanizeFileRequest < Mechanize::TestCase
|
|
5
|
-
|
|
6
|
-
def setup
|
|
7
|
-
@uri = URI.parse 'file:///nonexistent'
|
|
8
|
-
|
|
9
|
-
@r = Mechanize::FileRequest.new @uri
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def test_initialize
|
|
13
|
-
assert_equal @uri, @r.uri
|
|
14
|
-
assert_equal '/nonexistent', @r.path
|
|
15
|
-
|
|
16
|
-
assert_respond_to @r, :[]=
|
|
17
|
-
assert_respond_to @r, :add_field
|
|
18
|
-
assert_respond_to @r, :each_header
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def test_response_body_permitted_eh
|
|
22
|
-
assert @r.response_body_permitted?
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
end
|
|
26
|
-
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
require 'mechanize/test_case'
|
|
3
|
-
|
|
4
|
-
class TestMechanizeFileResponse < Mechanize::TestCase
|
|
5
|
-
def test_file_path
|
|
6
|
-
res = Mechanize::FileResponse.new("/path/to/foo.html")
|
|
7
|
-
assert_equal("/path/to/foo.html", res.file_path)
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def test_content_type
|
|
11
|
-
Tempfile.open %w[pi .nothtml] do |tempfile|
|
|
12
|
-
res = Mechanize::FileResponse.new tempfile.path
|
|
13
|
-
assert_nil res['content-type']
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
Tempfile.open %w[pi .xhtml] do |tempfile|
|
|
17
|
-
res = Mechanize::FileResponse.new tempfile.path
|
|
18
|
-
assert_equal 'text/html', res['content-type']
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
Tempfile.open %w[pi .html] do |tempfile|
|
|
22
|
-
res = Mechanize::FileResponse.new tempfile.path
|
|
23
|
-
assert_equal 'text/html', res['Content-Type']
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def test_read_body
|
|
28
|
-
Tempfile.open %w[pi .html] do |tempfile|
|
|
29
|
-
tempfile.write("asdfasdfasdf")
|
|
30
|
-
tempfile.close
|
|
31
|
-
|
|
32
|
-
res = Mechanize::FileResponse.new(tempfile.path)
|
|
33
|
-
res.read_body do |input|
|
|
34
|
-
assert_equal("asdfasdfasdf", input)
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def test_read_body_does_not_allow_command_injection
|
|
40
|
-
skip if windows?
|
|
41
|
-
in_tmpdir do
|
|
42
|
-
FileUtils.touch('| ruby -rfileutils -e \'FileUtils.touch("vul.txt")\'')
|
|
43
|
-
res = Mechanize::FileResponse.new('| ruby -rfileutils -e \'FileUtils.touch("vul.txt")\'')
|
|
44
|
-
res.read_body { |_| }
|
|
45
|
-
refute_operator(File, :exist?, "vul.txt")
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
end
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
require 'mechanize/test_case'
|
|
3
|
-
|
|
4
|
-
class TestMechanizeFileSaver < Mechanize::TestCase
|
|
5
|
-
|
|
6
|
-
def setup
|
|
7
|
-
super
|
|
8
|
-
|
|
9
|
-
@uri = URI 'http://example'
|
|
10
|
-
@io = StringIO.new 'hello world'
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def test_initialize
|
|
14
|
-
in_tmpdir do
|
|
15
|
-
Mechanize::FileSaver.new @uri, nil, @io, 200
|
|
16
|
-
|
|
17
|
-
assert File.exist? 'example/index.html'
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
end
|
|
22
|
-
|