tenderlove-mechanize 0.9.3.20090617085936

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 (173) hide show
  1. data/CHANGELOG.rdoc +496 -0
  2. data/EXAMPLES.rdoc +171 -0
  3. data/FAQ.rdoc +11 -0
  4. data/GUIDE.rdoc +122 -0
  5. data/LICENSE.rdoc +340 -0
  6. data/Manifest.txt +169 -0
  7. data/README.rdoc +60 -0
  8. data/Rakefile +43 -0
  9. data/examples/flickr_upload.rb +23 -0
  10. data/examples/mech-dump.rb +7 -0
  11. data/examples/proxy_req.rb +9 -0
  12. data/examples/rubyforge.rb +21 -0
  13. data/examples/spider.rb +11 -0
  14. data/lib/mechanize.rb +7 -0
  15. data/lib/www/mechanize/chain/auth_headers.rb +80 -0
  16. data/lib/www/mechanize/chain/body_decoding_handler.rb +48 -0
  17. data/lib/www/mechanize/chain/connection_resolver.rb +78 -0
  18. data/lib/www/mechanize/chain/custom_headers.rb +23 -0
  19. data/lib/www/mechanize/chain/handler.rb +9 -0
  20. data/lib/www/mechanize/chain/header_resolver.rb +53 -0
  21. data/lib/www/mechanize/chain/parameter_resolver.rb +24 -0
  22. data/lib/www/mechanize/chain/post_connect_hook.rb +0 -0
  23. data/lib/www/mechanize/chain/pre_connect_hook.rb +22 -0
  24. data/lib/www/mechanize/chain/request_resolver.rb +32 -0
  25. data/lib/www/mechanize/chain/response_body_parser.rb +40 -0
  26. data/lib/www/mechanize/chain/response_header_handler.rb +50 -0
  27. data/lib/www/mechanize/chain/response_reader.rb +41 -0
  28. data/lib/www/mechanize/chain/ssl_resolver.rb +42 -0
  29. data/lib/www/mechanize/chain/uri_resolver.rb +77 -0
  30. data/lib/www/mechanize/chain.rb +34 -0
  31. data/lib/www/mechanize/content_type_error.rb +16 -0
  32. data/lib/www/mechanize/cookie.rb +72 -0
  33. data/lib/www/mechanize/cookie_jar.rb +191 -0
  34. data/lib/www/mechanize/file.rb +73 -0
  35. data/lib/www/mechanize/file_response.rb +62 -0
  36. data/lib/www/mechanize/file_saver.rb +39 -0
  37. data/lib/www/mechanize/form/button.rb +8 -0
  38. data/lib/www/mechanize/form/check_box.rb +13 -0
  39. data/lib/www/mechanize/form/field.rb +28 -0
  40. data/lib/www/mechanize/form/file_upload.rb +24 -0
  41. data/lib/www/mechanize/form/image_button.rb +23 -0
  42. data/lib/www/mechanize/form/multi_select_list.rb +69 -0
  43. data/lib/www/mechanize/form/option.rb +51 -0
  44. data/lib/www/mechanize/form/radio_button.rb +38 -0
  45. data/lib/www/mechanize/form/select_list.rb +45 -0
  46. data/lib/www/mechanize/form.rb +360 -0
  47. data/lib/www/mechanize/headers.rb +12 -0
  48. data/lib/www/mechanize/history.rb +67 -0
  49. data/lib/www/mechanize/inspect.rb +90 -0
  50. data/lib/www/mechanize/monkey_patch.rb +37 -0
  51. data/lib/www/mechanize/page/base.rb +10 -0
  52. data/lib/www/mechanize/page/frame.rb +22 -0
  53. data/lib/www/mechanize/page/link.rb +50 -0
  54. data/lib/www/mechanize/page/meta.rb +51 -0
  55. data/lib/www/mechanize/page.rb +176 -0
  56. data/lib/www/mechanize/pluggable_parsers.rb +103 -0
  57. data/lib/www/mechanize/redirect_limit_reached_error.rb +18 -0
  58. data/lib/www/mechanize/redirect_not_get_or_head_error.rb +20 -0
  59. data/lib/www/mechanize/response_code_error.rb +25 -0
  60. data/lib/www/mechanize/unsupported_scheme_error.rb +10 -0
  61. data/lib/www/mechanize/util.rb +76 -0
  62. data/lib/www/mechanize.rb +619 -0
  63. data/mechanize.gemspec +41 -0
  64. data/test/chain/test_argument_validator.rb +14 -0
  65. data/test/chain/test_auth_headers.rb +25 -0
  66. data/test/chain/test_custom_headers.rb +18 -0
  67. data/test/chain/test_header_resolver.rb +28 -0
  68. data/test/chain/test_parameter_resolver.rb +35 -0
  69. data/test/chain/test_request_resolver.rb +29 -0
  70. data/test/chain/test_response_reader.rb +24 -0
  71. data/test/data/htpasswd +1 -0
  72. data/test/data/server.crt +16 -0
  73. data/test/data/server.csr +12 -0
  74. data/test/data/server.key +15 -0
  75. data/test/data/server.pem +15 -0
  76. data/test/helper.rb +129 -0
  77. data/test/htdocs/alt_text.html +10 -0
  78. data/test/htdocs/bad_form_test.html +9 -0
  79. data/test/htdocs/button.jpg +0 -0
  80. data/test/htdocs/empty_form.html +6 -0
  81. data/test/htdocs/file_upload.html +26 -0
  82. data/test/htdocs/find_link.html +41 -0
  83. data/test/htdocs/form_multi_select.html +16 -0
  84. data/test/htdocs/form_multival.html +37 -0
  85. data/test/htdocs/form_no_action.html +18 -0
  86. data/test/htdocs/form_no_input_name.html +16 -0
  87. data/test/htdocs/form_select.html +16 -0
  88. data/test/htdocs/form_select_all.html +16 -0
  89. data/test/htdocs/form_select_none.html +17 -0
  90. data/test/htdocs/form_select_noopts.html +10 -0
  91. data/test/htdocs/form_set_fields.html +14 -0
  92. data/test/htdocs/form_test.html +188 -0
  93. data/test/htdocs/frame_test.html +30 -0
  94. data/test/htdocs/google.html +13 -0
  95. data/test/htdocs/iframe_test.html +16 -0
  96. data/test/htdocs/index.html +6 -0
  97. data/test/htdocs/link with space.html +5 -0
  98. data/test/htdocs/meta_cookie.html +11 -0
  99. data/test/htdocs/no_title_test.html +6 -0
  100. data/test/htdocs/relative/tc_relative_links.html +21 -0
  101. data/test/htdocs/tc_bad_links.html +5 -0
  102. data/test/htdocs/tc_base_link.html +8 -0
  103. data/test/htdocs/tc_blank_form.html +11 -0
  104. data/test/htdocs/tc_checkboxes.html +19 -0
  105. data/test/htdocs/tc_encoded_links.html +5 -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_links.html +18 -0
  109. data/test/htdocs/tc_no_attributes.html +16 -0
  110. data/test/htdocs/tc_pretty_print.html +17 -0
  111. data/test/htdocs/tc_radiobuttons.html +17 -0
  112. data/test/htdocs/tc_referer.html +10 -0
  113. data/test/htdocs/tc_relative_links.html +19 -0
  114. data/test/htdocs/tc_textarea.html +23 -0
  115. data/test/htdocs/unusual______.html +5 -0
  116. data/test/servlets.rb +365 -0
  117. data/test/ssl_server.rb +48 -0
  118. data/test/test_authenticate.rb +71 -0
  119. data/test/test_bad_links.rb +25 -0
  120. data/test/test_blank_form.rb +16 -0
  121. data/test/test_checkboxes.rb +61 -0
  122. data/test/test_content_type.rb +13 -0
  123. data/test/test_cookie_class.rb +338 -0
  124. data/test/test_cookie_jar.rb +362 -0
  125. data/test/test_cookies.rb +123 -0
  126. data/test/test_encoded_links.rb +20 -0
  127. data/test/test_errors.rb +49 -0
  128. data/test/test_follow_meta.rb +108 -0
  129. data/test/test_form_action.rb +44 -0
  130. data/test/test_form_as_hash.rb +61 -0
  131. data/test/test_form_button.rb +38 -0
  132. data/test/test_form_no_inputname.rb +15 -0
  133. data/test/test_forms.rb +564 -0
  134. data/test/test_frames.rb +25 -0
  135. data/test/test_get_headers.rb +52 -0
  136. data/test/test_gzipping.rb +22 -0
  137. data/test/test_hash_api.rb +45 -0
  138. data/test/test_history.rb +142 -0
  139. data/test/test_history_added.rb +16 -0
  140. data/test/test_html_unscape_forms.rb +39 -0
  141. data/test/test_if_modified_since.rb +20 -0
  142. data/test/test_keep_alive.rb +31 -0
  143. data/test/test_links.rb +120 -0
  144. data/test/test_mech.rb +268 -0
  145. data/test/test_mechanize_file.rb +47 -0
  146. data/test/test_meta.rb +65 -0
  147. data/test/test_multi_select.rb +106 -0
  148. data/test/test_no_attributes.rb +13 -0
  149. data/test/test_option.rb +18 -0
  150. data/test/test_page.rb +119 -0
  151. data/test/test_pluggable_parser.rb +145 -0
  152. data/test/test_post_form.rb +34 -0
  153. data/test/test_pretty_print.rb +22 -0
  154. data/test/test_radiobutton.rb +75 -0
  155. data/test/test_redirect_limit_reached.rb +41 -0
  156. data/test/test_redirect_verb_handling.rb +45 -0
  157. data/test/test_referer.rb +39 -0
  158. data/test/test_relative_links.rb +40 -0
  159. data/test/test_request.rb +13 -0
  160. data/test/test_response_code.rb +52 -0
  161. data/test/test_save_file.rb +48 -0
  162. data/test/test_scheme.rb +48 -0
  163. data/test/test_select.rb +106 -0
  164. data/test/test_select_all.rb +15 -0
  165. data/test/test_select_none.rb +15 -0
  166. data/test/test_select_noopts.rb +16 -0
  167. data/test/test_set_fields.rb +44 -0
  168. data/test/test_ssl_server.rb +20 -0
  169. data/test/test_subclass.rb +14 -0
  170. data/test/test_textarea.rb +45 -0
  171. data/test/test_upload.rb +109 -0
  172. data/test/test_verbs.rb +25 -0
  173. metadata +314 -0
data/test/servlets.rb ADDED
@@ -0,0 +1,365 @@
1
+ require 'webrick'
2
+ require 'logger'
3
+ require 'date'
4
+ require 'zlib'
5
+ require 'stringio'
6
+ require 'base64'
7
+
8
+ class VerbServlet < WEBrick::HTTPServlet::AbstractServlet
9
+ %w(HEAD GET POST PUT DELETE).each do |verb|
10
+ eval(<<-eomethod)
11
+ def do_#{verb}(req, res)
12
+ res.body = "method: #{verb}"
13
+ end
14
+ eomethod
15
+ end
16
+ end
17
+
18
+ class BasicAuthServlet < WEBrick::HTTPServlet::AbstractServlet
19
+ def do_GET(req,res)
20
+ htpd = WEBrick::HTTPAuth::Htpasswd.new('dot.htpasswd')
21
+ htpd.set_passwd('Blah', 'user', 'pass')
22
+ authenticator = WEBrick::HTTPAuth::BasicAuth.new({
23
+ :UserDB => htpd,
24
+ :Realm => 'Blah',
25
+ :Logger => Logger.new(nil)
26
+ }
27
+ )
28
+ begin
29
+ authenticator.authenticate(req,res)
30
+ res.body = 'You are authenticated'
31
+ rescue WEBrick::HTTPStatus::Unauthorized => ex
32
+ res.status = 401
33
+ end
34
+ FileUtils.rm('dot.htpasswd')
35
+ end
36
+ alias :do_POST :do_GET
37
+ end
38
+
39
+ class DigestAuthServlet < WEBrick::HTTPServlet::AbstractServlet
40
+ htpd = WEBrick::HTTPAuth::Htdigest.new('digest.htpasswd')
41
+ htpd.set_passwd('Blah', 'user', 'pass')
42
+ @@authenticator = WEBrick::HTTPAuth::DigestAuth.new({
43
+ :UserDB => htpd,
44
+ :Realm => 'Blah',
45
+ :Algorithm => 'MD5',
46
+ :Logger => Logger.new(nil)
47
+ }
48
+ )
49
+ def do_GET(req,res)
50
+ def req.request_time; Time.now; end
51
+ def req.request_uri; '/digest_auth'; end
52
+ def req.request_method; "GET"; end
53
+
54
+ begin
55
+ @@authenticator.authenticate(req,res)
56
+ res.body = 'You are authenticated'
57
+ rescue WEBrick::HTTPStatus::Unauthorized => ex
58
+ res.status = 401
59
+ end
60
+ FileUtils.rm('digest.htpasswd') if File.exists?('digest.htpasswd')
61
+ end
62
+ alias :do_POST :do_GET
63
+ end
64
+
65
+ class HeaderServlet < WEBrick::HTTPServlet::AbstractServlet
66
+ def do_GET(req, res)
67
+ res['Content-Type'] = "text/html"
68
+
69
+ req.query.each do |x,y|
70
+ res[x] = y
71
+ end
72
+
73
+ body = ''
74
+ req.each_header do |k,v|
75
+ body << "#{k}|#{v}\n"
76
+ end
77
+ res.body = body
78
+ end
79
+ end
80
+
81
+ class RefererServlet < WEBrick::HTTPServlet::AbstractServlet
82
+ def do_GET(req, res)
83
+ res['Content-Type'] = "text/html"
84
+ res.body = req['Referer'] || ''
85
+ end
86
+
87
+ def do_POST(req, res)
88
+ res['Content-Type'] = "text/html"
89
+ res.body = req['Referer'] || ''
90
+ end
91
+ end
92
+
93
+ class ModifiedSinceServlet < WEBrick::HTTPServlet::AbstractServlet
94
+ def do_GET(req, res)
95
+ s_time = 'Fri, 04 May 2001 00:00:38 GMT'
96
+
97
+ my_time = Time.parse(s_time)
98
+
99
+ if req['If-Modified-Since']
100
+ your_time = Time.parse(req['If-Modified-Since'])
101
+ if my_time > your_time
102
+ res.body = 'This page was updated since you requested'
103
+ else
104
+ res.status = 304
105
+ end
106
+ else
107
+ res.body = 'You did not send an If-Modified-Since header'
108
+ end
109
+
110
+ res['Last-Modified'] = s_time
111
+ end
112
+ end
113
+
114
+ class GzipServlet < WEBrick::HTTPServlet::AbstractServlet
115
+ def do_GET(req, res)
116
+ if req['Accept-Encoding'] =~ /gzip/
117
+ if req.query['file']
118
+ File.open("#{BASE_DIR}/htdocs/#{req.query['file']}", 'r') do |file|
119
+ string = ""
120
+ zipped = StringIO.new string, 'w'
121
+ gz = Zlib::GzipWriter.new(zipped)
122
+ gz.write file.read
123
+ gz.close
124
+ res.body = string
125
+ end
126
+ else
127
+ res.body = ''
128
+ end
129
+ res['Content-Encoding'] = 'gzip'
130
+ res['Content-Type'] = "text/html"
131
+ else
132
+ raise 'no gzip'
133
+ end
134
+ end
135
+ end
136
+
137
+ class BadContentTypeTest < WEBrick::HTTPServlet::AbstractServlet
138
+ def do_GET(req, res)
139
+ res['Content-Type'] = "text/xml"
140
+ res.body = "Hello World"
141
+ end
142
+ end
143
+
144
+ class ContentTypeTest < WEBrick::HTTPServlet::AbstractServlet
145
+ def do_GET(req, res)
146
+ ct = req.query['ct'] || "text/html; charset=utf-8"
147
+ res['Content-Type'] = ct
148
+ res.body = "Hello World"
149
+ end
150
+ end
151
+
152
+ class FileUploadTest < WEBrick::HTTPServlet::AbstractServlet
153
+ def do_POST(req, res)
154
+ res.body = req.body
155
+ end
156
+ end
157
+
158
+ class InfiniteRefreshTest < WEBrick::HTTPServlet::AbstractServlet
159
+ def do_GET(req, res)
160
+ res['Content-Type'] = req.query['ct'] || "text/html"
161
+ res.status = req.query['code'] ? req.query['code'].to_i : '302'
162
+ number = req.query['q'] ? req.query['q'].to_i : 0
163
+ res['Refresh'] = " 0;url=http://localhost/infinite_refresh?q=#{number + 1}\r\n";
164
+ end
165
+ end
166
+
167
+ class RefreshWithoutUrl < WEBrick::HTTPServlet::AbstractServlet
168
+ @@count = 0
169
+ def do_GET(req, res)
170
+ res['Content-Type'] = "text/html"
171
+ @@count += 1
172
+ if @@count > 1
173
+ res['Refresh'] = "0; url=http://localhost/index.html";
174
+ else
175
+ res['Refresh'] = "0";
176
+ end
177
+ end
178
+ end
179
+
180
+ class RefreshWithEmptyUrl < WEBrick::HTTPServlet::AbstractServlet
181
+ @@count = 0
182
+ def do_GET(req, res)
183
+ res['Content-Type'] = "text/html"
184
+ @@count += 1
185
+ if @@count > 1
186
+ res['Refresh'] = "0; url=http://localhost/index.html";
187
+ else
188
+ res['Refresh'] = "0; url=";
189
+ end
190
+ end
191
+ end
192
+
193
+ class InfiniteRedirectTest < WEBrick::HTTPServlet::AbstractServlet
194
+ def do_GET(req, res)
195
+ res['Content-Type'] = req.query['ct'] || "text/html"
196
+ res.status = req.query['code'] ? req.query['code'].to_i : '302'
197
+ number = req.query['q'] ? req.query['q'].to_i : 0
198
+ res['Location'] = "/infinite_redirect?q=#{number + 1}"
199
+ end
200
+ alias :do_POST :do_GET
201
+ end
202
+
203
+ class RedirectTest < WEBrick::HTTPServlet::AbstractServlet
204
+ def do_GET(req, res)
205
+ res['Content-Type'] = req.query['ct'] || "text/html"
206
+ res.status = req.query['code'] ? req.query['code'].to_i : '302'
207
+ res['Location'] = "/verb"
208
+ end
209
+
210
+ alias :do_POST :do_GET
211
+ alias :do_HEAD :do_GET
212
+ alias :do_PUT :do_GET
213
+ alias :do_DELETE :do_GET
214
+ end
215
+
216
+ class ResponseCodeTest < WEBrick::HTTPServlet::AbstractServlet
217
+ def do_GET(req, res)
218
+ res['Content-Type'] = req.query['ct'] || "text/html"
219
+ if req.query['code']
220
+ code = req.query['code'].to_i
221
+ case code
222
+ when 300, 301, 302, 303, 304, 305, 307
223
+ res['Location'] = "/index.html"
224
+ end
225
+ res.status = code
226
+ else
227
+ end
228
+ end
229
+ end
230
+
231
+ class HttpRefreshTest < WEBrick::HTTPServlet::AbstractServlet
232
+ def do_GET(req, res)
233
+ res['Content-Type'] = req.query['ct'] || "text/html"
234
+ refresh_time = req.query['refresh_time'] || 0
235
+ refresh_url = req.query['refresh_url'] || '/index.html'
236
+ res['Refresh'] = " #{refresh_time};url=#{refresh_url}\r\n";
237
+ end
238
+ end
239
+
240
+ class FormTest < WEBrick::HTTPServlet::AbstractServlet
241
+ def do_GET(req, res)
242
+ res.body = "<HTML><body>"
243
+ req.query.each_key { |k|
244
+ req.query[k].each_data { |data|
245
+ res.body << "<a href=\"#\">#{URI.unescape(k)}:#{URI.unescape(data)}</a><br />"
246
+ }
247
+ }
248
+ res.body << "</body></HTML>"
249
+ res['Content-Type'] = "text/html"
250
+ end
251
+
252
+ def do_POST(req, res)
253
+ res.body = "<HTML><body>"
254
+ req.query.each_key { |k|
255
+ req.query[k].each_data { |data|
256
+ res.body << "<a href=\"#\">#{k}:#{data}</a><br />"
257
+ }
258
+ }
259
+ res.body << "</body></HTML>"
260
+ res['Content-Type'] = "text/html"
261
+ end
262
+ end
263
+
264
+ class OneCookieTest < WEBrick::HTTPServlet::AbstractServlet
265
+ def do_GET(req, res)
266
+ cookie = WEBrick::Cookie.new("foo", "bar")
267
+ cookie.path = "/"
268
+ cookie.expires = Time.now + 86400
269
+ res.cookies << cookie
270
+ res['Content-Type'] = "text/html"
271
+ res.body = "<html><body>hello</body></html>"
272
+ end
273
+ end
274
+
275
+ class OneCookieNoSpacesTest < WEBrick::HTTPServlet::AbstractServlet
276
+ def do_GET(req, res)
277
+ cookie = WEBrick::Cookie.new("foo", "bar")
278
+ cookie.path = "/"
279
+ cookie.expires = Time.now + 86400
280
+ res.cookies << cookie.to_s.gsub(/; /, ';')
281
+ res['Content-Type'] = "text/html"
282
+ res.body = "<html><body>hello</body></html>"
283
+ end
284
+ end
285
+
286
+ class ManyCookiesTest < WEBrick::HTTPServlet::AbstractServlet
287
+ def do_GET(req, res)
288
+ name_cookie = WEBrick::Cookie.new("name", "Aaron")
289
+ name_cookie.path = "/"
290
+ name_cookie.expires = Time.now + 86400
291
+ res.cookies << name_cookie
292
+ res.cookies << name_cookie
293
+ res.cookies << name_cookie
294
+ res.cookies << name_cookie
295
+
296
+ expired_cookie = WEBrick::Cookie.new("expired", "doh")
297
+ expired_cookie.path = "/"
298
+ expired_cookie.expires = Time.now - 86400
299
+ res.cookies << expired_cookie
300
+
301
+ different_path_cookie = WEBrick::Cookie.new("a_path", "some_path")
302
+ different_path_cookie.path = "/some_path"
303
+ different_path_cookie.expires = Time.now + 86400
304
+ res.cookies << different_path_cookie
305
+
306
+ no_path_cookie = WEBrick::Cookie.new("no_path", "no_path")
307
+ no_path_cookie.expires = Time.now + 86400
308
+ res.cookies << no_path_cookie
309
+
310
+ no_exp_path_cookie = WEBrick::Cookie.new("no_expires", "nope")
311
+ no_exp_path_cookie.path = "/"
312
+ res.cookies << no_exp_path_cookie
313
+
314
+ res['Content-Type'] = "text/html"
315
+ res.body = "<html><body>hello</body></html>"
316
+ end
317
+ end
318
+
319
+ class ManyCookiesAsStringTest < WEBrick::HTTPServlet::AbstractServlet
320
+ def do_GET(req, res)
321
+ cookies = []
322
+ name_cookie = WEBrick::Cookie.new("name", "Aaron")
323
+ name_cookie.path = "/"
324
+ name_cookie.expires = Time.now + 86400
325
+ name_cookie.domain = 'localhost'
326
+ cookies << name_cookie
327
+ cookies << name_cookie
328
+ cookies << name_cookie
329
+ cookies << "#{name_cookie}; HttpOnly"
330
+
331
+ expired_cookie = WEBrick::Cookie.new("expired", "doh")
332
+ expired_cookie.path = "/"
333
+ expired_cookie.expires = Time.now - 86400
334
+ cookies << expired_cookie
335
+
336
+ different_path_cookie = WEBrick::Cookie.new("a_path", "some_path")
337
+ different_path_cookie.path = "/some_path"
338
+ different_path_cookie.expires = Time.now + 86400
339
+ cookies << different_path_cookie
340
+
341
+ no_path_cookie = WEBrick::Cookie.new("no_path", "no_path")
342
+ no_path_cookie.expires = Time.now + 86400
343
+ cookies << no_path_cookie
344
+
345
+ no_exp_path_cookie = WEBrick::Cookie.new("no_expires", "nope")
346
+ no_exp_path_cookie.path = "/"
347
+ cookies << no_exp_path_cookie
348
+
349
+ res['Set-Cookie'] = cookies.join(', ')
350
+
351
+ res['Content-Type'] = "text/html"
352
+ res.body = "<html><body>hello</body></html>"
353
+ end
354
+ end
355
+
356
+ class SendCookiesTest < WEBrick::HTTPServlet::AbstractServlet
357
+ def do_GET(req, res)
358
+ res['Content-Type'] = "text/html"
359
+ res.body = "<html><body>"
360
+ req.cookies.each { |c|
361
+ res.body << "<a href=\"#\">#{c.name}:#{c.value}</a>"
362
+ }
363
+ res.body << "</body></html>"
364
+ end
365
+ end
@@ -0,0 +1,48 @@
1
+ require 'webrick'
2
+ require 'webrick/https'
3
+ require 'servlets'
4
+ require 'logger'
5
+
6
+ base_dir = FileTest.exists?(Dir::pwd + '/test') ? Dir::pwd + '/test' : Dir::pwd
7
+
8
+ s = WEBrick::HTTPServer.new(
9
+ :Port => 2002,
10
+ :DocumentRoot => base_dir + "/htdocs",
11
+ :SSLEnable => true,
12
+ :SSLVerifyClient => OpenSSL::SSL::VERIFY_NONE,
13
+ :SSLCertificate => OpenSSL::X509::Certificate.new(
14
+ File.read("data/server.crt")
15
+ ),
16
+ :SSLPrivateKey => OpenSSL::PKey::RSA.new(
17
+ File.read("data/server.pem")
18
+ ),
19
+ :Logger => Logger.new(nil),
20
+ :AccessLog => Logger.new(nil)
21
+ )
22
+ s.mount("/one_cookie", OneCookieTest)
23
+ s.mount("/one_cookie_no_space", OneCookieNoSpacesTest)
24
+ s.mount("/many_cookies", ManyCookiesTest)
25
+ s.mount("/many_cookies_as_string", ManyCookiesAsStringTest)
26
+ s.mount("/send_cookies", SendCookiesTest)
27
+ s.mount("/form_post", FormTest)
28
+ s.mount("/form post", FormTest)
29
+ s.mount("/response_code", ResponseCodeTest)
30
+ s.mount("/file_upload", FileUploadTest)
31
+ s.mount("/bad_content_type", BadContentTypeTest)
32
+ s.mount("/content_type_test", ContentTypeTest)
33
+
34
+ htpasswd = WEBrick::HTTPAuth::Htpasswd.new(base_dir + '/data/htpasswd')
35
+ auth = WEBrick::HTTPAuth::BasicAuth.new(
36
+ :UserDB => htpasswd,
37
+ :Realm => 'mechanize',
38
+ :Logger => Logger.new(nil),
39
+ :AccessLog => Logger.new(nil)
40
+ )
41
+ s.mount_proc('/htpasswd_auth') { |req, res|
42
+ auth.authenticate(req, res)
43
+ res.body = "You are authenticated"
44
+ }
45
+
46
+ trap("INT") { s.stop }
47
+
48
+ s.start
@@ -0,0 +1,71 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "helper"))
2
+ require 'pp'
3
+
4
+ class BasicAuthTest < Test::Unit::TestCase
5
+ def setup
6
+ @agent = WWW::Mechanize.new
7
+ end
8
+
9
+ def test_auth_success
10
+ @agent.basic_auth('user', 'pass')
11
+ page = @agent.get("http://localhost/basic_auth")
12
+ assert_equal('You are authenticated', page.body)
13
+ end
14
+
15
+ def test_digest_auth_success
16
+ @agent.basic_auth('user', 'pass')
17
+ page = @agent.get("http://localhost/digest_auth")
18
+ assert_equal('You are authenticated', page.body)
19
+ end
20
+
21
+ def test_no_duplicate_headers
22
+ block_called = false
23
+ @agent.pre_connect_hooks << lambda { |params|
24
+ block_called = true
25
+ params[:request].to_hash.each do |k,v|
26
+ assert_equal(1, v.length)
27
+ end
28
+ }
29
+ @agent.basic_auth('user', 'pass')
30
+ page = @agent.get("http://localhost/digest_auth")
31
+ assert block_called
32
+ end
33
+
34
+ def test_post_auth_success
35
+ class << @agent
36
+ alias :old_fetch_page :fetch_page
37
+ attr_accessor :requests
38
+ def fetch_page(args)
39
+ @requests ||= []
40
+ x = old_fetch_page(args)
41
+ @requests << args[:verb]
42
+ x
43
+ end
44
+ end
45
+ @agent.basic_auth('user', 'pass')
46
+ page = @agent.post("http://localhost/basic_auth")
47
+ assert_equal('You are authenticated', page.body)
48
+ assert_equal(2, @agent.requests.length)
49
+ r1 = @agent.requests[0]
50
+ r2 = @agent.requests[1]
51
+ assert_equal(r1, r2)
52
+ end
53
+
54
+ def test_auth_bad_user_pass
55
+ @agent.basic_auth('aaron', 'aaron')
56
+ begin
57
+ page = @agent.get("http://localhost/basic_auth")
58
+ rescue WWW::Mechanize::ResponseCodeError => e
59
+ assert_equal("401", e.response_code)
60
+ end
61
+ end
62
+
63
+ def test_auth_failure
64
+ begin
65
+ page = @agent.get("http://localhost/basic_auth")
66
+ rescue WWW::Mechanize::ResponseCodeError => e
67
+ assert_equal("401", e.response_code)
68
+ end
69
+ end
70
+
71
+ end
@@ -0,0 +1,25 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "helper"))
2
+
3
+ class TestBadLinks < Test::Unit::TestCase
4
+ def setup
5
+ @agent = WWW::Mechanize.new
6
+ @page = @agent.get("http://localhost/tc_bad_links.html")
7
+ end
8
+
9
+ def test_space_in_link
10
+ assert_nothing_raised do
11
+ @agent.click @page.links.first
12
+ end
13
+ assert_match(/alt_text.html$/, @agent.history.last.uri.to_s)
14
+ assert_equal(2, @agent.history.length)
15
+ end
16
+
17
+ def test_space_in_url
18
+ page = nil
19
+ assert_nothing_raised do
20
+ page = @agent.get("http://localhost/tc_bad_links.html ")
21
+ end
22
+ assert_match(/tc_bad_links.html$/, @agent.history.last.uri.to_s)
23
+ assert_equal(2, @agent.history.length)
24
+ end
25
+ end
@@ -0,0 +1,16 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "helper"))
2
+
3
+ class BlankFormTest < Test::Unit::TestCase
4
+ def setup
5
+ @agent = WWW::Mechanize.new
6
+ end
7
+
8
+ def test_blank_form_query_string
9
+ page = @agent.get('http://localhost/tc_blank_form.html')
10
+ form = page.forms.first
11
+ query = form.build_query
12
+ assert(query.length > 0)
13
+ assert query.all? { |x| x[1] == '' }
14
+ end
15
+ end
16
+
@@ -0,0 +1,61 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "helper"))
2
+
3
+ class TestCheckBoxes < Test::Unit::TestCase
4
+ def setup
5
+ @agent = WWW::Mechanize.new
6
+ @page = @agent.get('http://localhost/tc_checkboxes.html')
7
+ end
8
+
9
+ def test_select_one
10
+ form = @page.forms.first
11
+ form.checkbox_with(:name => 'green').check
12
+ assert(form.checkbox_with(:name => 'green').checked)
13
+ %w{ red blue yellow brown }.each do |color|
14
+ assert_equal(false, form.checkbox_with(:name => color).checked)
15
+ end
16
+ end
17
+
18
+ def test_select_all
19
+ form = @page.forms.first
20
+ form.checkboxes.each do |b|
21
+ b.check
22
+ end
23
+ form.checkboxes.each do |b|
24
+ assert_equal(true, b.checked)
25
+ end
26
+ end
27
+
28
+ def test_select_none
29
+ form = @page.forms.first
30
+ form.checkboxes.each do |b|
31
+ b.uncheck
32
+ end
33
+ form.checkboxes.each do |b|
34
+ assert_equal(false, b.checked)
35
+ end
36
+ end
37
+
38
+ def test_check_one
39
+ form = @page.forms.first
40
+ assert_equal(2, form.checkboxes_with(:name => 'green').length)
41
+ form.checkboxes_with(:name => 'green')[1].check
42
+ assert_equal(false, form.checkboxes_with(:name => 'green')[0].checked)
43
+ assert_equal(true, form.checkboxes_with(:name => 'green')[1].checked)
44
+ page = @agent.submit(form)
45
+ assert_equal(1, page.links.length)
46
+ assert_equal('green:on', page.links.first.text)
47
+ end
48
+
49
+ def test_check_two
50
+ form = @page.forms.first
51
+ assert_equal(2, form.checkboxes_with(:name => 'green').length)
52
+ form.checkboxes_with(:name => 'green')[0].check
53
+ form.checkboxes_with(:name => 'green')[1].check
54
+ assert_equal(true, form.checkboxes_with(:name => 'green')[0].checked)
55
+ assert_equal(true, form.checkboxes_with(:name => 'green')[1].checked)
56
+ page = @agent.submit(form)
57
+ assert_equal(2, page.links.length)
58
+ assert_equal('green:on', page.links.first.text)
59
+ assert_equal('green:on', page.links[1].text)
60
+ end
61
+ end
@@ -0,0 +1,13 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "helper"))
2
+
3
+ class TestContentType < Test::Unit::TestCase
4
+ def setup
5
+ @agent = WWW::Mechanize.new
6
+ end
7
+
8
+ def test_application_xhtml_xml
9
+ url = 'http://localhost/content_type_test?ct=application/xhtml%2Bxml'
10
+ page = @agent.get url
11
+ assert_equal WWW::Mechanize::Page, page.class, "xhtml docs should return a Page"
12
+ end
13
+ end