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.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +27 -1
  3. data/README.md +7 -0
  4. data/SECURITY.md +11 -0
  5. data/lib/mechanize/directory_saver.rb +2 -1
  6. data/lib/mechanize/file_saver.rb +2 -0
  7. data/lib/mechanize/http/agent.rb +83 -29
  8. data/lib/mechanize/parser.rb +33 -3
  9. data/lib/mechanize/test_case.rb +2 -9
  10. data/lib/mechanize/version.rb +1 -1
  11. data/lib/mechanize.rb +12 -2
  12. data/test/htdocs/frame_test.html +8 -6
  13. data/test/htdocs/relative/tc_relative_links.html +1 -1
  14. metadata +7 -174
  15. data/.autotest +0 -6
  16. data/.github/dependabot.yml +0 -11
  17. data/.github/workflows/ci.yml +0 -43
  18. data/.github/workflows/upstream.yml +0 -51
  19. data/.gitignore +0 -15
  20. data/.yardopts +0 -8
  21. data/Gemfile +0 -12
  22. data/Rakefile +0 -56
  23. data/examples/flickr_upload.rb +0 -22
  24. data/examples/latest_user_agents.rb +0 -100
  25. data/examples/mech-dump.rb +0 -5
  26. data/examples/proxy_req.rb +0 -7
  27. data/examples/rubygems.rb +0 -23
  28. data/examples/spider.rb +0 -22
  29. data/examples/wikipedia_links_to_philosophy.rb +0 -158
  30. data/mechanize.gemspec +0 -74
  31. data/test/data/htpasswd +0 -1
  32. data/test/data/server.crt +0 -16
  33. data/test/data/server.csr +0 -12
  34. data/test/data/server.key +0 -15
  35. data/test/data/server.pem +0 -15
  36. data/test/test_mechanize.rb +0 -1382
  37. data/test/test_mechanize_cookie.rb +0 -559
  38. data/test/test_mechanize_cookie_jar.rb +0 -615
  39. data/test/test_mechanize_directory_saver.rb +0 -60
  40. data/test/test_mechanize_download.rb +0 -102
  41. data/test/test_mechanize_element_not_found_error.rb +0 -16
  42. data/test/test_mechanize_file.rb +0 -118
  43. data/test/test_mechanize_file_connection.rb +0 -40
  44. data/test/test_mechanize_file_request.rb +0 -26
  45. data/test/test_mechanize_file_response.rb +0 -48
  46. data/test/test_mechanize_file_saver.rb +0 -22
  47. data/test/test_mechanize_form.rb +0 -1025
  48. data/test/test_mechanize_form_check_box.rb +0 -49
  49. data/test/test_mechanize_form_encoding.rb +0 -110
  50. data/test/test_mechanize_form_field.rb +0 -78
  51. data/test/test_mechanize_form_file_upload.rb +0 -21
  52. data/test/test_mechanize_form_image_button.rb +0 -13
  53. data/test/test_mechanize_form_keygen.rb +0 -34
  54. data/test/test_mechanize_form_multi_select_list.rb +0 -98
  55. data/test/test_mechanize_form_option.rb +0 -60
  56. data/test/test_mechanize_form_radio_button.rb +0 -96
  57. data/test/test_mechanize_form_select_list.rb +0 -81
  58. data/test/test_mechanize_form_textarea.rb +0 -53
  59. data/test/test_mechanize_headers.rb +0 -36
  60. data/test/test_mechanize_history.rb +0 -104
  61. data/test/test_mechanize_http_agent.rb +0 -1915
  62. data/test/test_mechanize_http_auth_challenge.rb +0 -64
  63. data/test/test_mechanize_http_auth_realm.rb +0 -56
  64. data/test/test_mechanize_http_auth_store.rb +0 -233
  65. data/test/test_mechanize_http_content_disposition_parser.rb +0 -167
  66. data/test/test_mechanize_http_www_authenticate_parser.rb +0 -204
  67. data/test/test_mechanize_image.rb +0 -9
  68. data/test/test_mechanize_link.rb +0 -171
  69. data/test/test_mechanize_page.rb +0 -295
  70. data/test/test_mechanize_page_encoding.rb +0 -215
  71. data/test/test_mechanize_page_frame.rb +0 -17
  72. data/test/test_mechanize_page_image.rb +0 -191
  73. data/test/test_mechanize_page_link.rb +0 -377
  74. data/test/test_mechanize_page_meta_refresh.rb +0 -151
  75. data/test/test_mechanize_parser.rb +0 -316
  76. data/test/test_mechanize_pluggable_parser.rb +0 -68
  77. data/test/test_mechanize_redirect_limit_reached_error.rb +0 -25
  78. data/test/test_mechanize_redirect_not_get_or_head_error.rb +0 -15
  79. data/test/test_mechanize_response_read_error.rb +0 -29
  80. data/test/test_mechanize_subclass.rb +0 -23
  81. data/test/test_mechanize_util.rb +0 -144
  82. data/test/test_mechanize_xml_file.rb +0 -30
  83. 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
-
@@ -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
-