neocoin-mechanize 2.0.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 (174) hide show
  1. data/.autotest +6 -0
  2. data/.gemtest +0 -0
  3. data/CHANGELOG.rdoc +638 -0
  4. data/EXAMPLES.rdoc +187 -0
  5. data/FAQ.rdoc +11 -0
  6. data/GUIDE.rdoc +163 -0
  7. data/LICENSE.rdoc +20 -0
  8. data/Manifest.txt +172 -0
  9. data/README.rdoc +63 -0
  10. data/Rakefile +36 -0
  11. data/examples/flickr_upload.rb +22 -0
  12. data/examples/mech-dump.rb +5 -0
  13. data/examples/proxy_req.rb +7 -0
  14. data/examples/rubyforge.rb +20 -0
  15. data/examples/spider.rb +21 -0
  16. data/lib/mechanize.rb +662 -0
  17. data/lib/mechanize/content_type_error.rb +14 -0
  18. data/lib/mechanize/cookie.rb +85 -0
  19. data/lib/mechanize/cookie_jar.rb +241 -0
  20. data/lib/mechanize/element_matcher.rb +35 -0
  21. data/lib/mechanize/file.rb +80 -0
  22. data/lib/mechanize/file_connection.rb +17 -0
  23. data/lib/mechanize/file_request.rb +26 -0
  24. data/lib/mechanize/file_response.rb +74 -0
  25. data/lib/mechanize/file_saver.rb +37 -0
  26. data/lib/mechanize/form.rb +478 -0
  27. data/lib/mechanize/form/button.rb +9 -0
  28. data/lib/mechanize/form/check_box.rb +11 -0
  29. data/lib/mechanize/form/field.rb +44 -0
  30. data/lib/mechanize/form/file_upload.rb +23 -0
  31. data/lib/mechanize/form/image_button.rb +20 -0
  32. data/lib/mechanize/form/multi_select_list.rb +83 -0
  33. data/lib/mechanize/form/option.rb +49 -0
  34. data/lib/mechanize/form/radio_button.rb +48 -0
  35. data/lib/mechanize/form/select_list.rb +40 -0
  36. data/lib/mechanize/headers.rb +25 -0
  37. data/lib/mechanize/history.rb +83 -0
  38. data/lib/mechanize/http.rb +3 -0
  39. data/lib/mechanize/http/agent.rb +738 -0
  40. data/lib/mechanize/inspect.rb +88 -0
  41. data/lib/mechanize/monkey_patch.rb +37 -0
  42. data/lib/mechanize/page.rb +408 -0
  43. data/lib/mechanize/page/base.rb +8 -0
  44. data/lib/mechanize/page/frame.rb +27 -0
  45. data/lib/mechanize/page/image.rb +30 -0
  46. data/lib/mechanize/page/label.rb +20 -0
  47. data/lib/mechanize/page/link.rb +82 -0
  48. data/lib/mechanize/page/meta_refresh.rb +56 -0
  49. data/lib/mechanize/pluggable_parsers.rb +101 -0
  50. data/lib/mechanize/redirect_limit_reached_error.rb +16 -0
  51. data/lib/mechanize/redirect_not_get_or_head_error.rb +19 -0
  52. data/lib/mechanize/response_code_error.rb +22 -0
  53. data/lib/mechanize/response_read_error.rb +27 -0
  54. data/lib/mechanize/robots_disallowed_error.rb +29 -0
  55. data/lib/mechanize/unsupported_scheme_error.rb +8 -0
  56. data/lib/mechanize/util.rb +113 -0
  57. data/test/data/htpasswd +1 -0
  58. data/test/data/server.crt +16 -0
  59. data/test/data/server.csr +12 -0
  60. data/test/data/server.key +15 -0
  61. data/test/data/server.pem +15 -0
  62. data/test/helper.rb +175 -0
  63. data/test/htdocs/alt_text.html +10 -0
  64. data/test/htdocs/bad_form_test.html +9 -0
  65. data/test/htdocs/button.jpg +0 -0
  66. data/test/htdocs/canonical_uri.html +9 -0
  67. data/test/htdocs/dir with spaces/foo.html +1 -0
  68. data/test/htdocs/empty_form.html +6 -0
  69. data/test/htdocs/file_upload.html +26 -0
  70. data/test/htdocs/find_link.html +41 -0
  71. data/test/htdocs/form_multi_select.html +16 -0
  72. data/test/htdocs/form_multival.html +37 -0
  73. data/test/htdocs/form_no_action.html +18 -0
  74. data/test/htdocs/form_no_input_name.html +16 -0
  75. data/test/htdocs/form_select.html +16 -0
  76. data/test/htdocs/form_select_all.html +16 -0
  77. data/test/htdocs/form_select_none.html +17 -0
  78. data/test/htdocs/form_select_noopts.html +10 -0
  79. data/test/htdocs/form_set_fields.html +14 -0
  80. data/test/htdocs/form_test.html +188 -0
  81. data/test/htdocs/frame_referer_test.html +10 -0
  82. data/test/htdocs/frame_test.html +30 -0
  83. data/test/htdocs/google.html +13 -0
  84. data/test/htdocs/iframe_test.html +16 -0
  85. data/test/htdocs/index.html +6 -0
  86. data/test/htdocs/link with space.html +5 -0
  87. data/test/htdocs/meta_cookie.html +11 -0
  88. data/test/htdocs/no_title_test.html +6 -0
  89. data/test/htdocs/nofollow.html +9 -0
  90. data/test/htdocs/noindex.html +9 -0
  91. data/test/htdocs/norobots.html +8 -0
  92. data/test/htdocs/rails_3_encoding_hack_form_test.html +27 -0
  93. data/test/htdocs/rel_nofollow.html +8 -0
  94. data/test/htdocs/relative/tc_relative_links.html +21 -0
  95. data/test/htdocs/robots.html +8 -0
  96. data/test/htdocs/robots.txt +2 -0
  97. data/test/htdocs/tc_bad_charset.html +9 -0
  98. data/test/htdocs/tc_bad_links.html +5 -0
  99. data/test/htdocs/tc_base_images.html +10 -0
  100. data/test/htdocs/tc_base_link.html +8 -0
  101. data/test/htdocs/tc_blank_form.html +11 -0
  102. data/test/htdocs/tc_charset.html +6 -0
  103. data/test/htdocs/tc_checkboxes.html +19 -0
  104. data/test/htdocs/tc_encoded_links.html +5 -0
  105. data/test/htdocs/tc_field_precedence.html +11 -0
  106. data/test/htdocs/tc_follow_meta.html +8 -0
  107. data/test/htdocs/tc_form_action.html +48 -0
  108. data/test/htdocs/tc_images.html +8 -0
  109. data/test/htdocs/tc_links.html +18 -0
  110. data/test/htdocs/tc_meta_in_body.html +9 -0
  111. data/test/htdocs/tc_no_attributes.html +16 -0
  112. data/test/htdocs/tc_pretty_print.html +17 -0
  113. data/test/htdocs/tc_radiobuttons.html +17 -0
  114. data/test/htdocs/tc_referer.html +16 -0
  115. data/test/htdocs/tc_relative_links.html +19 -0
  116. data/test/htdocs/tc_textarea.html +23 -0
  117. data/test/htdocs/test_bad_encoding.html +52 -0
  118. data/test/htdocs/test_click.html +11 -0
  119. data/test/htdocs/unusual______.html +5 -0
  120. data/test/servlets.rb +402 -0
  121. data/test/ssl_server.rb +48 -0
  122. data/test/test_cookies.rb +129 -0
  123. data/test/test_form_action.rb +52 -0
  124. data/test/test_form_as_hash.rb +59 -0
  125. data/test/test_form_button.rb +46 -0
  126. data/test/test_frames.rb +34 -0
  127. data/test/test_headers.rb +33 -0
  128. data/test/test_history.rb +118 -0
  129. data/test/test_history_added.rb +16 -0
  130. data/test/test_html_unscape_forms.rb +46 -0
  131. data/test/test_if_modified_since.rb +20 -0
  132. data/test/test_images.rb +19 -0
  133. data/test/test_mechanize.rb +842 -0
  134. data/test/test_mechanize_cookie.rb +345 -0
  135. data/test/test_mechanize_cookie_jar.rb +401 -0
  136. data/test/test_mechanize_file.rb +53 -0
  137. data/test/test_mechanize_file_request.rb +19 -0
  138. data/test/test_mechanize_file_response.rb +21 -0
  139. data/test/test_mechanize_form.rb +576 -0
  140. data/test/test_mechanize_form_check_box.rb +37 -0
  141. data/test/test_mechanize_form_encoding.rb +120 -0
  142. data/test/test_mechanize_form_field.rb +21 -0
  143. data/test/test_mechanize_form_image_button.rb +12 -0
  144. data/test/test_mechanize_form_textarea.rb +51 -0
  145. data/test/test_mechanize_http_agent.rb +697 -0
  146. data/test/test_mechanize_link.rb +84 -0
  147. data/test/test_mechanize_page_encoding.rb +147 -0
  148. data/test/test_mechanize_page_link.rb +382 -0
  149. data/test/test_mechanize_page_meta_refresh.rb +115 -0
  150. data/test/test_mechanize_redirect_not_get_or_head_error.rb +18 -0
  151. data/test/test_mechanize_subclass.rb +22 -0
  152. data/test/test_mechanize_util.rb +92 -0
  153. data/test/test_multi_select.rb +118 -0
  154. data/test/test_no_attributes.rb +13 -0
  155. data/test/test_option.rb +18 -0
  156. data/test/test_pluggable_parser.rb +136 -0
  157. data/test/test_post_form.rb +37 -0
  158. data/test/test_pretty_print.rb +22 -0
  159. data/test/test_radiobutton.rb +75 -0
  160. data/test/test_redirect_limit_reached.rb +39 -0
  161. data/test/test_referer.rb +81 -0
  162. data/test/test_relative_links.rb +40 -0
  163. data/test/test_request.rb +13 -0
  164. data/test/test_response_code.rb +53 -0
  165. data/test/test_robots.rb +72 -0
  166. data/test/test_save_file.rb +48 -0
  167. data/test/test_scheme.rb +48 -0
  168. data/test/test_select.rb +119 -0
  169. data/test/test_select_all.rb +15 -0
  170. data/test/test_select_none.rb +15 -0
  171. data/test/test_select_noopts.rb +18 -0
  172. data/test/test_set_fields.rb +44 -0
  173. data/test/test_ssl_server.rb +20 -0
  174. metadata +354 -0
@@ -0,0 +1,37 @@
1
+ require 'helper'
2
+
3
+ class TestMechanizeFormCheckBox < MiniTest::Unit::TestCase
4
+
5
+ def setup
6
+ @agent = Mechanize.new
7
+ @page = @agent.get('http://localhost/tc_checkboxes.html')
8
+ end
9
+
10
+ def test_check
11
+ form = @page.forms.first
12
+
13
+ form.checkbox_with(:name => 'green').check
14
+
15
+ assert(form.checkbox_with(:name => 'green').checked)
16
+
17
+ %w{ red blue yellow brown }.each do |color|
18
+ assert_equal(false, form.checkbox_with(:name => color).checked)
19
+ end
20
+ end
21
+
22
+ def test_uncheck
23
+ form = @page.forms.first
24
+
25
+ checkbox = form.checkbox_with(:name => 'green')
26
+
27
+ checkbox.check
28
+
29
+ assert form.checkbox_with(:name => 'green').checked
30
+
31
+ checkbox.uncheck
32
+
33
+ assert !form.checkbox_with(:name => 'green').checked
34
+ end
35
+
36
+ end
37
+
@@ -0,0 +1,120 @@
1
+ # coding: utf-8
2
+ require "helper"
3
+
4
+ class TestMechanizeFormEncoding < MiniTest::Unit::TestCase
5
+
6
+ # See also: tests of Util.from_native_charset
7
+ # Encoding test should do with non-utf-8 characters
8
+
9
+ INPUTTED_VALUE = "テスト" # "test" in Japanese UTF-8 encoding
10
+ CONTENT_ENCODING = 'Shift_JIS' # one of Japanese encoding
11
+ encoded_value = "\x83\x65\x83\x58\x83\x67" # "test" in Japanese Shift_JIS encoding
12
+ encoded_value.force_encoding(::Encoding::SHIFT_JIS) if encoded_value.respond_to?(:force_encoding)
13
+ EXPECTED_QUERY = "first_name=#{CGI.escape(encoded_value)}&first_name=&gender=&green%5Beggs%5D="
14
+
15
+ if Mechanize::Util::NEW_RUBY_ENCODING
16
+ ENCODING_ERRORS = [EncodingError, Encoding::ConverterNotFoundError] # and so on
17
+ else
18
+ ENCODING_ERRORS = [Iconv::InvalidEncoding, Iconv::IllegalSequence]
19
+ end
20
+
21
+ ENCODING_LOG_MESSAGE = /INFO -- : form encoding: Shift_JIS/
22
+ INVALID_ENCODING = 'UTF-eight'
23
+
24
+ def setup
25
+ @agent = Mechanize.new
26
+ end
27
+
28
+ def set_form_with_encoding(enc)
29
+ page = @agent.get("http://localhost/form_set_fields.html")
30
+ form = page.forms.first
31
+ form.encoding = enc
32
+ form['first_name'] = INPUTTED_VALUE
33
+ form
34
+ end
35
+
36
+
37
+ def test_form_encoding_returns_accept_charset
38
+ page = @agent.get("http://localhost/rails_3_encoding_hack_form_test.html")
39
+ form = page.forms.first
40
+ accept_charset = form.form_node['accept-charset']
41
+
42
+ assert accept_charset
43
+ assert_equal accept_charset, form.encoding
44
+ refute_equal page.encoding, form.encoding
45
+ end
46
+
47
+ def test_form_encoding_returns_page_encoding_when_no_accept_charset
48
+ page = @agent.get("http://localhost/form_set_fields.html")
49
+ form = page.forms.first
50
+ accept_charset = form.form_node['accept-charset']
51
+
52
+ assert_nil accept_charset
53
+ refute_equal accept_charset, form.encoding
54
+ assert_equal page.encoding, form.encoding
55
+ end
56
+
57
+ def test_form_encoding_equals_sets_new_encoding
58
+ page = @agent.get("http://localhost/form_set_fields.html")
59
+ form = page.forms.first
60
+
61
+ refute_equal CONTENT_ENCODING, form.encoding
62
+
63
+ form.encoding = CONTENT_ENCODING
64
+
65
+ assert_equal CONTENT_ENCODING, form.encoding
66
+ end
67
+
68
+ def test_form_encoding_returns_nil_when_no_page_in_initialize
69
+ # this sequence is seen at Mechanize#post(url, query_hash)
70
+
71
+ node = {}
72
+ # Create a fake form
73
+ class << node
74
+ def search(*args); []; end
75
+ end
76
+ node['method'] = 'POST'
77
+ node['enctype'] = 'application/x-www-form-urlencoded'
78
+ form = Mechanize::Form.new(node)
79
+
80
+ assert_equal nil, form.encoding
81
+ end
82
+
83
+
84
+ def test_post_form_with_form_encoding
85
+ form = set_form_with_encoding CONTENT_ENCODING
86
+ form.submit
87
+
88
+ # we can not use "links.find{|l| l.text == 'key:val'}" assertion here
89
+ # because the link text encoding is always UTF-8 regaredless of html encoding
90
+ assert EXPECTED_QUERY, @agent.page.at('div#query').inner_text
91
+ end
92
+
93
+ def test_post_form_with_problematic_encoding
94
+ form = set_form_with_encoding INVALID_ENCODING
95
+
96
+ assert_raises(*ENCODING_ERRORS){ form.submit }
97
+ end
98
+
99
+ def test_form_ignore_encoding_error_is_true
100
+ form = set_form_with_encoding INVALID_ENCODING
101
+ form.ignore_encoding_error = true
102
+
103
+ form.submit
104
+
105
+ # HACK no assertions
106
+ end
107
+
108
+ def test_post_form_logs_form_encoding
109
+ sio = StringIO.new
110
+ @agent.log = Logger.new(sio)
111
+ @agent.log.level = Logger::INFO
112
+
113
+ form = set_form_with_encoding CONTENT_ENCODING
114
+ form.submit
115
+
116
+ assert_match ENCODING_LOG_MESSAGE, sio.string
117
+
118
+ @agent.log = nil
119
+ end
120
+ end
@@ -0,0 +1,21 @@
1
+ require 'helper'
2
+
3
+ class TestMechanizeFormField < MiniTest::Unit::TestCase
4
+
5
+ def test_field_spaceship
6
+ doc = Nokogiri::HTML::Document.new
7
+ node = doc.create_element('input')
8
+ node['name'] = 'foo'
9
+ node['value'] = 'bar'
10
+
11
+ a = Mechanize::Form::Field.new(node)
12
+ b = Mechanize::Form::Field.new({'name' => 'foo'}, 'bar')
13
+ c = Mechanize::Form::Field.new({'name' => 'foo'}, 'bar')
14
+
15
+ assert_equal [a, b], [a, b].sort
16
+ assert_equal [a, b], [b, a].sort
17
+ assert_equal [b, c].sort, [b, c].sort
18
+ end
19
+
20
+ end
21
+
@@ -0,0 +1,12 @@
1
+ require 'helper'
2
+
3
+ class TestMechanizeFormImageButton < MiniTest::Unit::TestCase
4
+
5
+ def test_query_value
6
+ button = Mechanize::Form::ImageButton.new 'name' => 'image_button'
7
+
8
+ assert_equal [%w[image_button.x 0], %w[image_button.y 0]],
9
+ button.query_value
10
+ end
11
+ end
12
+
@@ -0,0 +1,51 @@
1
+ require "helper"
2
+
3
+ class TestMechanizeFormTextarea < MiniTest::Unit::TestCase
4
+ def setup
5
+ @agent = Mechanize.new
6
+ @page = @agent.get("http://localhost/tc_textarea.html")
7
+ end
8
+
9
+ def test_empty_text_area
10
+ form = @page.forms_with(:name => 'form1').first
11
+ assert_equal('', form.field_with(:name => 'text1').value)
12
+ form.text1 = 'Hello World'
13
+ assert_equal('Hello World', form.field_with(:name => 'text1').value)
14
+ page = @agent.submit(form)
15
+ assert_equal(1, page.links.length)
16
+ assert_equal('text1:Hello World', page.links[0].text)
17
+ end
18
+
19
+ def test_non_empty_textfield
20
+ form = @page.forms_with(:name => 'form2').first
21
+ assert_equal('sample text', form.field_with(:name => 'text1').value)
22
+ page = @agent.submit(form)
23
+ assert_equal(1, page.links.length)
24
+ assert_equal('text1:sample text', page.links[0].text)
25
+ end
26
+
27
+ def test_multi_textfield
28
+ form = @page.form_with(:name => 'form3')
29
+
30
+ assert_equal(2, form.fields_with(:name => 'text1').length)
31
+ assert_equal('', form.fields_with(:name => 'text1')[0].value)
32
+ assert_equal('sample text', form.fields_with(:name => 'text1')[1].value)
33
+
34
+ form.text1 = 'Hello World'
35
+
36
+ assert_equal('Hello World', form.fields_with(:name => 'text1')[0].value)
37
+ assert_equal('sample text', form.fields_with(:name => 'text1')[1].value)
38
+
39
+ page = @agent.submit(form)
40
+
41
+ assert_equal(2, page.links.length)
42
+
43
+ link = page.links_with(:text => 'text1:sample text')
44
+
45
+ assert_equal(1, link.length)
46
+
47
+ link = page.links_with(:text => 'text1:Hello World')
48
+
49
+ assert_equal(1, link.length)
50
+ end
51
+ end
@@ -0,0 +1,697 @@
1
+ # coding: utf-8
2
+ require 'helper'
3
+
4
+ class TestMechanizeHttpAgent < MiniTest::Unit::TestCase
5
+
6
+ def setup
7
+ @mech = Mechanize.new
8
+ @agent = @mech.agent
9
+
10
+ @uri = URI.parse 'http://example/'
11
+
12
+ @req = Net::HTTP::Get.new '/'
13
+ @res = Net::HTTPOK.allocate
14
+ @res.instance_variable_set :@code, 200
15
+ @res.instance_variable_set :@header, {}
16
+
17
+ @headers = if RUBY_VERSION > '1.9' then
18
+ %w[accept user-agent]
19
+ else
20
+ %w[accept]
21
+ end
22
+ end
23
+
24
+ def test_connection_for_file
25
+ uri = URI.parse 'file:///nonexistent'
26
+ conn = @agent.connection_for uri
27
+
28
+ assert_equal Mechanize::FileConnection.new, conn
29
+ end
30
+
31
+ def test_connection_for_http
32
+ conn = @agent.connection_for @uri
33
+
34
+ assert_equal @agent.http, conn
35
+ end
36
+
37
+ def test_enable_gzip
38
+ @agent.enable_gzip @req
39
+
40
+ assert_equal 'gzip,deflate,identity', @req['accept-encoding']
41
+ end
42
+
43
+ def test_enable_gzip_no
44
+ @agent.gzip_enabled = false
45
+
46
+ @agent.enable_gzip @req
47
+
48
+ assert_equal 'identity', @req['accept-encoding']
49
+ end
50
+
51
+ def test_fetch_file_plus
52
+ Tempfile.open '++plus++' do |io|
53
+ content = 'plusses +++'
54
+ io.write content
55
+ io.rewind
56
+
57
+ uri = URI.parse "file://#{Mechanize::Util.uri_escape io.path}"
58
+
59
+ page = @agent.fetch uri
60
+
61
+ assert_equal content, page.body
62
+ assert_kind_of Mechanize::File, page
63
+ end
64
+ end
65
+
66
+ def test_fetch_file_space
67
+ foo = File.expand_path("../htdocs/dir with spaces/foo.html", __FILE__)
68
+
69
+ uri = URI.parse "file://#{Mechanize::Util.uri_escape foo}"
70
+
71
+ page = @agent.fetch uri
72
+
73
+ assert_equal File.read(foo), page.body
74
+ assert_kind_of Mechanize::Page, page
75
+ end
76
+
77
+ def test_fetch_file_nonexistent
78
+ uri = URI.parse 'file:///nonexistent'
79
+
80
+ e = assert_raises Mechanize::ResponseCodeError do
81
+ @agent.fetch uri
82
+ end
83
+
84
+ assert_equal '404 => Net::HTTPNotFound', e.message
85
+ end
86
+
87
+ def test_fetch_post_connect_hook
88
+ response = nil
89
+ @agent.post_connect_hooks << lambda { |_, _, res, _| response = res }
90
+
91
+ @agent.fetch 'http://localhost/'
92
+
93
+ assert response
94
+ end
95
+
96
+ def test_get_robots
97
+ robotstxt = @agent.get_robots 'http://localhost/robots.txt'
98
+ refute_equal '', robotstxt
99
+
100
+ robotstxt = @agent.get_robots 'http://localhost/response_code?code=404'
101
+ assert_equal '', robotstxt
102
+ end
103
+
104
+ def test_http_request_file
105
+ uri = URI.parse 'file:///nonexistent'
106
+ request = @agent.http_request uri, :get
107
+
108
+ assert_kind_of Mechanize::FileRequest, request
109
+ assert_equal '/nonexistent', request.path
110
+ end
111
+
112
+ def test_http_request_get
113
+ request = @agent.http_request @uri, :get
114
+
115
+ assert_kind_of Net::HTTP::Get, request
116
+ assert_equal '/', request.path
117
+ end
118
+
119
+ def test_http_request_post
120
+ request = @agent.http_request @uri, :post
121
+
122
+ assert_kind_of Net::HTTP::Post, request
123
+ assert_equal '/', request.path
124
+ end
125
+
126
+ def test_post_connect
127
+ @agent.post_connect_hooks << proc { |agent, uri, response, body|
128
+ assert_equal @agent, agent
129
+ assert_equal @res, response
130
+ assert_equal 'body', body
131
+ throw :called
132
+ }
133
+
134
+ assert_throws :called do
135
+ @agent.post_connect @uri, @res, 'body'
136
+ end
137
+ end
138
+
139
+ def test_pre_connect
140
+ @agent.pre_connect_hooks << proc { |agent, request|
141
+ assert_equal @agent, agent
142
+ assert_equal @req, request
143
+ throw :called
144
+ }
145
+
146
+ assert_throws :called do
147
+ @agent.pre_connect @req
148
+ end
149
+ end
150
+
151
+ def test_request_cookies
152
+ uri = URI.parse 'http://host.example.com'
153
+ Mechanize::Cookie.parse uri, 'hello=world domain=.example.com' do |cookie|
154
+ @agent.cookie_jar.add uri, cookie
155
+ end
156
+
157
+ @agent.request_cookies @req, uri
158
+
159
+ assert_equal 'hello=world domain=.example.com', @req['Cookie']
160
+ end
161
+
162
+ def test_request_cookies_none
163
+ @agent.request_cookies @req, @uri
164
+
165
+ assert_nil @req['Cookie']
166
+ end
167
+
168
+ def test_request_cookies_many
169
+ uri = URI.parse 'http://host.example.com'
170
+ cookie_str = 'a=b domain=.example.com, c=d domain=.example.com'
171
+ Mechanize::Cookie.parse uri, cookie_str do |cookie|
172
+ @agent.cookie_jar.add uri, cookie
173
+ end
174
+
175
+ @agent.request_cookies @req, uri
176
+
177
+ expected = cookie_str.sub ', ', '; '
178
+
179
+ assert_equal expected, @req['Cookie']
180
+ end
181
+
182
+ def test_request_cookies_wrong_domain
183
+ uri = URI.parse 'http://host.example.com'
184
+ Mechanize::Cookie.parse uri, 'hello=world domain=.example.com' do |cookie|
185
+ @agent.cookie_jar.add uri, cookie
186
+ end
187
+
188
+ @agent.request_cookies @req, @uri
189
+
190
+ assert_nil @req['Cookie']
191
+ end
192
+
193
+ def test_request_host
194
+ @agent.request_host @req, @uri
195
+
196
+ assert_equal 'example', @req['host']
197
+ end
198
+
199
+ def test_request_host_nonstandard
200
+ @uri.port = 81
201
+
202
+ @agent.request_host @req, @uri
203
+
204
+ assert_equal 'example:81', @req['host']
205
+ end
206
+
207
+ def test_request_language_charset
208
+ @agent.request_language_charset @req
209
+
210
+ assert_equal 'en-us,en;q=0.5', @req['accept-language']
211
+ assert_equal 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', @req['accept-charset']
212
+ end
213
+
214
+ def test_request_add_headers
215
+ @agent.request_add_headers @req, 'Content-Length' => 300
216
+
217
+ assert_equal '300', @req['content-length']
218
+ end
219
+
220
+ def test_request_add_headers_etag
221
+ @agent.request_add_headers @req, :etag => '300'
222
+
223
+ assert_equal '300', @req['etag']
224
+ end
225
+
226
+ def test_request_add_headers_if_modified_since
227
+ @agent.request_add_headers @req, :if_modified_since => 'some_date'
228
+
229
+ assert_equal 'some_date', @req['if-modified-since']
230
+ end
231
+
232
+ def test_request_add_headers_none
233
+ @agent.request_add_headers @req
234
+
235
+ assert_equal @headers, @req.to_hash.keys.sort
236
+ end
237
+
238
+ def test_request_add_headers_request_headers
239
+ @agent.request_headers['X-Foo'] = 'bar'
240
+
241
+ @agent.request_add_headers @req
242
+
243
+ assert_equal @headers + %w[x-foo], @req.to_hash.keys.sort
244
+ end
245
+
246
+ def test_request_add_headers_symbol
247
+ e = assert_raises ArgumentError do
248
+ @agent.request_add_headers @req, :content_length => 300
249
+ end
250
+
251
+ assert_equal 'unknown header symbol content_length', e.message
252
+ end
253
+
254
+ def test_request_referer
255
+ referer = URI.parse 'http://old.example'
256
+
257
+ @agent.request_referer @req, @uri, referer
258
+
259
+ assert_equal 'http://old.example', @req['referer']
260
+ end
261
+
262
+ def test_request_referer_https
263
+ uri = URI.parse 'https://example'
264
+ referer = URI.parse 'https://old.example'
265
+
266
+ @agent.request_referer @req, uri, referer
267
+
268
+ assert_equal 'https://old.example', @req['referer']
269
+ end
270
+
271
+ def test_request_referer_https_downgrade
272
+ referer = URI.parse 'https://old.example'
273
+
274
+ @agent.request_referer @req, @uri, referer
275
+
276
+ assert_nil @req['referer']
277
+ end
278
+
279
+ def test_request_referer_https_downgrade_case
280
+ uri = URI.parse 'http://example'
281
+ referer = URI.parse 'httpS://old.example'
282
+
283
+ @agent.request_referer @req, uri, referer
284
+
285
+ assert_nil @req['referer']
286
+ end
287
+
288
+ def test_request_referer_none
289
+ @agent.request_referer @req, @uri, nil
290
+
291
+ assert_nil @req['referer']
292
+ end
293
+
294
+ def test_request_user_agent
295
+ @agent.request_user_agent @req
296
+
297
+ assert_match %r%^Mechanize/#{Mechanize::VERSION}%, @req['user-agent']
298
+
299
+ ruby_version = if RUBY_PATCHLEVEL >= 0 then
300
+ "#{RUBY_VERSION}p#{RUBY_PATCHLEVEL}"
301
+ else
302
+ "#{RUBY_VERSION}dev#{RUBY_REVISION}"
303
+ end
304
+
305
+ assert_match %r%Ruby/#{ruby_version}%, @req['user-agent']
306
+ end
307
+
308
+ def test_resolve_bad_uri
309
+ e = assert_raises ArgumentError do
310
+ @agent.resolve 'google'
311
+ end
312
+
313
+ assert_equal 'absolute URL needed (not google)', e.message
314
+ end
315
+
316
+ def test_resolve_utf8
317
+ uri = 'http://example?q=ü'
318
+
319
+ resolved = @agent.resolve uri
320
+
321
+ assert_equal '/?q=%C3%BC', resolved.request_uri
322
+ end
323
+
324
+ def test_resolve_parameters_body
325
+ input_params = { :q => 'hello' }
326
+
327
+ uri, params = @agent.resolve_parameters @uri, :post, input_params
328
+
329
+ assert_equal 'http://example/', uri.to_s
330
+ assert_equal input_params, params
331
+ end
332
+
333
+ def test_resolve_parameters_query
334
+ uri, params = @agent.resolve_parameters @uri, :get, :q => 'hello'
335
+
336
+ assert_equal 'http://example/?q=hello', uri.to_s
337
+ assert_nil params
338
+ end
339
+
340
+ def test_resolve_parameters_query_append
341
+ input_params = { :q => 'hello' }
342
+ @uri.query = 'a=b'
343
+
344
+ uri, params = @agent.resolve_parameters @uri, :get, input_params
345
+
346
+ assert_equal 'http://example/?a=b&q=hello', uri.to_s
347
+ assert_nil params
348
+ end
349
+
350
+ def test_response_content_encoding_7_bit
351
+ def @res.content_length() 4 end
352
+ @res.instance_variable_set :@header, 'content-encoding' => %w[7bit]
353
+
354
+ body = @agent.response_content_encoding @res, StringIO.new('part')
355
+
356
+ assert_equal 'part', body
357
+ end
358
+
359
+ def test_response_content_encoding_deflate
360
+ def @res.content_length() 12 end
361
+ @res.instance_variable_set :@header, 'content-encoding' => %w[deflate]
362
+ body_io = StringIO.new "x\x9C+H,*\x01\x00\x04?\x01\xB8"
363
+
364
+ body = @agent.response_content_encoding @res, body_io
365
+
366
+ assert_equal 'part', body
367
+ end
368
+
369
+ def test_response_content_encoding_deflate_chunked
370
+ def @res.content_length() nil end
371
+ @res.instance_variable_set :@header, 'content-encoding' => %w[deflate]
372
+ body_io = StringIO.new "x\x9C+H,*\x01\x00\x04?\x01\xB8"
373
+
374
+ body = @agent.response_content_encoding @res, body_io
375
+
376
+ assert_equal 'part', body
377
+ end
378
+
379
+ # IIS/6.0 ASP.NET/2.0.50727 does not wrap deflate with zlib, WTF?
380
+ def test_response_content_encoding_deflate_no_zlib
381
+ def @res.content_length() 6 end
382
+ @res.instance_variable_set :@header, 'content-encoding' => %w[deflate]
383
+
384
+ body = @agent.response_content_encoding @res, StringIO.new("+H,*\001\000")
385
+
386
+ assert_equal 'part', body
387
+ end
388
+
389
+ def test_response_content_encoding_gzip
390
+ def @res.content_length() 24 end
391
+ @res.instance_variable_set :@header, 'content-encoding' => %w[gzip]
392
+ body_io = StringIO.new \
393
+ "\037\213\b\0002\002\225M\000\003+H,*\001\000\306p\017I\004\000\000\000"
394
+
395
+ body = @agent.response_content_encoding @res, body_io
396
+
397
+ assert_equal 'part', body
398
+ end
399
+
400
+ def test_response_content_encoding_gzip_chunked
401
+ def @res.content_length() nil end
402
+ @res.instance_variable_set :@header, 'content-encoding' => %w[gzip]
403
+ body_io = StringIO.new \
404
+ "\037\213\b\0002\002\225M\000\003+H,*\001\000\306p\017I\004\000\000\000"
405
+
406
+ body = @agent.response_content_encoding @res, body_io
407
+
408
+ assert_equal 'part', body
409
+ end
410
+
411
+ def test_response_content_encoding_none
412
+ def @res.content_length() 4 end
413
+ @res.instance_variable_set :@header, 'content-encoding' => %w[none]
414
+
415
+ body = @agent.response_content_encoding @res, StringIO.new('part')
416
+
417
+ assert_equal 'part', body
418
+ end
419
+
420
+ def test_response_content_encoding_x_gzip
421
+ def @res.content_length() 24 end
422
+ @res.instance_variable_set :@header, 'content-encoding' => %w[x-gzip]
423
+ body_io = StringIO.new \
424
+ "\037\213\b\0002\002\225M\000\003+H,*\001\000\306p\017I\004\000\000\000"
425
+
426
+ body = @agent.response_content_encoding @res, body_io
427
+
428
+ assert_equal 'part', body
429
+ end
430
+
431
+ def test_response_content_encoding_unknown
432
+ def @res.content_length() 4 end
433
+ @res.instance_variable_set :@header, 'content-encoding' => %w[unknown]
434
+ body = StringIO.new 'part'
435
+
436
+ e = assert_raises Mechanize::Error do
437
+ @agent.response_content_encoding @res, body
438
+ end
439
+
440
+ assert_equal 'Unsupported Content-Encoding: unknown', e.message
441
+ end
442
+
443
+ def test_response_cookies
444
+ uri = URI.parse 'http://host.example.com'
445
+ cookie_str = 'a=b domain=.example.com'
446
+ @res.instance_variable_set(:@header,
447
+ 'set-cookie' => [cookie_str],
448
+ 'content-type' => %w[text/html])
449
+ page = Mechanize::Page.new uri, @res, '', 200, @mech
450
+
451
+ @agent.response_cookies @res, uri, page
452
+
453
+ assert_equal ['a=b domain=.example.com'],
454
+ @agent.cookie_jar.cookies(uri).map { |c| c.to_s }
455
+ end
456
+
457
+ def test_response_cookies_meta
458
+ uri = URI.parse 'http://host.example.com'
459
+ cookie_str = 'a=b domain=.example.com'
460
+
461
+ body = <<-BODY
462
+ <head>
463
+ <meta http-equiv="Set-Cookie" content="#{cookie_str}">
464
+ </head>"
465
+ BODY
466
+
467
+ @res.instance_variable_set(:@header,
468
+ 'content-type' => %w[text/html])
469
+ page = Mechanize::Page.new uri, @res, body, 200, @mech
470
+
471
+ @agent.response_cookies @res, uri, page
472
+
473
+ assert_equal ['a=b domain=.example.com'],
474
+ @agent.cookie_jar.cookies(uri).map { |c| c.to_s }
475
+ end
476
+
477
+ def test_response_follow_meta_refresh
478
+ uri = URI.parse 'http://example/#id+1'
479
+
480
+ body = <<-BODY
481
+ <title></title>
482
+ <meta http-equiv="refresh" content="0">
483
+ BODY
484
+
485
+ page = Mechanize::Page.new(uri, {'content-type' => 'text/html'}, body,
486
+ 200, @mech)
487
+
488
+ @agent.follow_meta_refresh = true
489
+
490
+ page = @agent.response_follow_meta_refresh @res, uri, page, 0
491
+
492
+ assert_equal uri, page.uri
493
+ end
494
+
495
+ def test_response_read
496
+ def @res.read_body() yield 'part' end
497
+ def @res.content_length() 4 end
498
+
499
+ io = @agent.response_read @res, @req
500
+
501
+ body = io.read
502
+
503
+ assert_equal 'part', body
504
+ assert_equal Encoding::BINARY, body.encoding if body.respond_to? :encoding
505
+ end
506
+
507
+ def test_response_read_content_length_head
508
+ req = Net::HTTP::Head.new '/'
509
+
510
+ def @res.content_length() end
511
+ def @res.read_body() end
512
+
513
+ io = @agent.response_read @res, req
514
+
515
+ assert_equal '', io.read
516
+ end
517
+
518
+ def test_response_read_content_length_mismatch
519
+ def @res.content_length() 5 end
520
+ def @res.read_body() yield 'part' end
521
+
522
+ e = assert_raises EOFError do
523
+ @agent.response_read @res, @req
524
+ end
525
+
526
+ assert_equal 'Content-Length (5) does not match response body length (4)',
527
+ e.message
528
+ end
529
+
530
+ def test_response_read_content_length_redirect
531
+ res = Net::HTTPFound.allocate
532
+ def res.content_length() 5 end
533
+ def res.code() 302 end
534
+ def res.read_body() yield 'part' end
535
+ res.instance_variable_set :@header, {}
536
+
537
+ io = @agent.response_read res, @req
538
+
539
+ assert_equal 'part', io.read
540
+ end
541
+
542
+ def test_response_read_error
543
+ def @res.read_body()
544
+ yield 'part'
545
+ raise Net::HTTP::Persistent::Error
546
+ end
547
+
548
+ e = assert_raises Mechanize::ResponseReadError do
549
+ @agent.response_read @res, @req
550
+ end
551
+
552
+ assert_equal @res, e.response
553
+ assert_equal 'part', e.body_io.read
554
+ assert_kind_of Net::HTTP::Persistent::Error, e.error
555
+ end
556
+
557
+ def test_response_read_file
558
+ Tempfile.open 'pi.txt' do |tempfile|
559
+ tempfile.write "π\n"
560
+ tempfile.flush
561
+ tempfile.rewind
562
+
563
+ uri = URI.parse "file://#{tempfile.path}"
564
+ req = Mechanize::FileRequest.new uri
565
+ res = Mechanize::FileResponse.new tempfile.path
566
+
567
+ io = @agent.response_read res, req
568
+
569
+ expected = "π\n"
570
+ expected.force_encoding Encoding::BINARY if expected.respond_to? :encoding
571
+
572
+ body = io.read
573
+ assert_equal expected, body
574
+ assert_equal Encoding::BINARY, body.encoding if body.respond_to? :encoding
575
+ end
576
+ end
577
+
578
+ def test_response_read_no_body
579
+ req = Net::HTTP::Options.new '/'
580
+
581
+ def @res.content_length() end
582
+ def @res.read_body() end
583
+
584
+ io = @agent.response_read @res, req
585
+
586
+ assert_equal '', io.read
587
+ end
588
+
589
+ def test_response_read_unknown_code
590
+ res = Net::HTTPUnknownResponse.allocate
591
+ res.instance_variable_set :@code, 9999
592
+ def res.read_body() yield 'part' end
593
+
594
+ e = assert_raises Mechanize::ResponseCodeError do
595
+ @agent.response_read res, @req
596
+ end
597
+
598
+ assert_equal res, e.page
599
+ end
600
+
601
+ def test_response_parse
602
+ body = '<title>hi</title>'
603
+ @res.instance_variable_set :@header, 'content-type' => %w[text/html]
604
+
605
+ page = @agent.response_parse @res, body, @uri
606
+
607
+ assert_instance_of Mechanize::Page, page
608
+ assert_equal @mech, page.mech
609
+ end
610
+
611
+ def test_response_parse_content_type_case
612
+ body = '<title>hi</title>'
613
+ @res.instance_variable_set(:@header, 'content-type' => %w[text/HTML])
614
+
615
+ page = @agent.response_parse @res, body, @uri
616
+
617
+ assert_instance_of Mechanize::Page, page
618
+
619
+ assert_equal 'text/HTML', page.content_type
620
+ end
621
+
622
+ def test_response_parse_content_type_encoding
623
+ body = '<title>hi</title>'
624
+ @res.instance_variable_set(:@header,
625
+ 'content-type' =>
626
+ %w[text/html;charset=ISO-8859-1])
627
+
628
+ page = @agent.response_parse @res, body, @uri
629
+
630
+ assert_instance_of Mechanize::Page, page
631
+ assert_equal @mech, page.mech
632
+
633
+ assert_equal 'ISO-8859-1', page.encoding
634
+ assert_equal 'ISO-8859-1', page.parser.encoding
635
+ end
636
+
637
+ def test_response_parse_content_type_encoding_garbage
638
+ body = '<title>hi</title>'
639
+ @res.instance_variable_set(:@header,
640
+ 'content-type' =>
641
+ %w[text/html; charset=garbage_charset])
642
+
643
+ page = @agent.response_parse @res, body, @uri
644
+
645
+ assert_instance_of Mechanize::Page, page
646
+ assert_equal @mech, page.mech
647
+ end
648
+
649
+ def test_response_parse_content_type_encoding_broken_iso_8859_1
650
+ body = '<title>hi</title>'
651
+ @res.instance_variable_set(:@header,
652
+ 'content-type' =>
653
+ %w[text/html; charset=ISO_8859-1])
654
+
655
+ page = @agent.response_parse @res, body, @uri
656
+
657
+ assert_instance_of Mechanize::Page, page
658
+ assert_equal 'ISO_8859-1', page.encoding
659
+ end
660
+
661
+ def test_response_parse_content_type_encoding_broken_utf_8
662
+ body = '<title>hi</title>'
663
+ @res.instance_variable_set(:@header,
664
+ 'content-type' =>
665
+ %w[text/html; charset=UTF8])
666
+
667
+ page = @agent.response_parse @res, body, @uri
668
+
669
+ assert_instance_of Mechanize::Page, page
670
+ assert_equal 'UTF8', page.encoding
671
+ assert_equal 'UTF8', page.parser.encoding
672
+ end
673
+
674
+ def test_response_parse_content_type_encoding_semicolon
675
+ body = '<title>hi</title>'
676
+ @res.instance_variable_set(:@header,
677
+ 'content-type' =>
678
+ %w[text/html;charset=UTF-8;])
679
+
680
+ page = @agent.response_parse @res, body, @uri
681
+
682
+ assert_instance_of Mechanize::Page, page
683
+
684
+ assert_equal 'UTF-8', page.encoding
685
+ end
686
+
687
+ def test_set_proxy
688
+ @agent.set_proxy('www.example.com', 9001, 'joe', 'lol')
689
+
690
+ assert_equal(@agent.proxy_uri.host, 'www.example.com')
691
+ assert_equal(@agent.proxy_uri.port, 9001)
692
+ assert_equal(@agent.proxy_uri.user, 'joe')
693
+ assert_equal(@agent.proxy_uri.password, 'lol')
694
+ end
695
+
696
+ end
697
+