knu-mechanize 0.9.3.20090623142847
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.
- data/CHANGELOG.rdoc +504 -0
- data/EXAMPLES.rdoc +171 -0
- data/FAQ.rdoc +11 -0
- data/GUIDE.rdoc +122 -0
- data/LICENSE.rdoc +340 -0
- data/Manifest.txt +169 -0
- data/README.rdoc +60 -0
- data/Rakefile +43 -0
- data/examples/flickr_upload.rb +23 -0
- data/examples/mech-dump.rb +7 -0
- data/examples/proxy_req.rb +9 -0
- data/examples/rubyforge.rb +21 -0
- data/examples/spider.rb +11 -0
- data/lib/mechanize.rb +7 -0
- data/lib/www/mechanize.rb +619 -0
- data/lib/www/mechanize/chain.rb +34 -0
- data/lib/www/mechanize/chain/auth_headers.rb +80 -0
- data/lib/www/mechanize/chain/body_decoding_handler.rb +48 -0
- data/lib/www/mechanize/chain/connection_resolver.rb +78 -0
- data/lib/www/mechanize/chain/custom_headers.rb +23 -0
- data/lib/www/mechanize/chain/handler.rb +9 -0
- data/lib/www/mechanize/chain/header_resolver.rb +53 -0
- data/lib/www/mechanize/chain/parameter_resolver.rb +24 -0
- data/lib/www/mechanize/chain/post_connect_hook.rb +0 -0
- data/lib/www/mechanize/chain/pre_connect_hook.rb +22 -0
- data/lib/www/mechanize/chain/request_resolver.rb +32 -0
- data/lib/www/mechanize/chain/response_body_parser.rb +40 -0
- data/lib/www/mechanize/chain/response_header_handler.rb +50 -0
- data/lib/www/mechanize/chain/response_reader.rb +41 -0
- data/lib/www/mechanize/chain/ssl_resolver.rb +42 -0
- data/lib/www/mechanize/chain/uri_resolver.rb +77 -0
- data/lib/www/mechanize/content_type_error.rb +16 -0
- data/lib/www/mechanize/cookie.rb +72 -0
- data/lib/www/mechanize/cookie_jar.rb +191 -0
- data/lib/www/mechanize/file.rb +73 -0
- data/lib/www/mechanize/file_response.rb +62 -0
- data/lib/www/mechanize/file_saver.rb +39 -0
- data/lib/www/mechanize/form.rb +360 -0
- data/lib/www/mechanize/form/button.rb +8 -0
- data/lib/www/mechanize/form/check_box.rb +13 -0
- data/lib/www/mechanize/form/field.rb +28 -0
- data/lib/www/mechanize/form/file_upload.rb +24 -0
- data/lib/www/mechanize/form/image_button.rb +23 -0
- data/lib/www/mechanize/form/multi_select_list.rb +69 -0
- data/lib/www/mechanize/form/option.rb +51 -0
- data/lib/www/mechanize/form/radio_button.rb +38 -0
- data/lib/www/mechanize/form/select_list.rb +45 -0
- data/lib/www/mechanize/headers.rb +12 -0
- data/lib/www/mechanize/history.rb +67 -0
- data/lib/www/mechanize/inspect.rb +90 -0
- data/lib/www/mechanize/monkey_patch.rb +37 -0
- data/lib/www/mechanize/page.rb +181 -0
- data/lib/www/mechanize/page/base.rb +10 -0
- data/lib/www/mechanize/page/frame.rb +22 -0
- data/lib/www/mechanize/page/link.rb +50 -0
- data/lib/www/mechanize/page/meta.rb +51 -0
- data/lib/www/mechanize/pluggable_parsers.rb +103 -0
- data/lib/www/mechanize/redirect_limit_reached_error.rb +18 -0
- data/lib/www/mechanize/redirect_not_get_or_head_error.rb +20 -0
- data/lib/www/mechanize/response_code_error.rb +25 -0
- data/lib/www/mechanize/unsupported_scheme_error.rb +10 -0
- data/lib/www/mechanize/util.rb +76 -0
- data/mechanize.gemspec +41 -0
- data/test/chain/test_argument_validator.rb +14 -0
- data/test/chain/test_auth_headers.rb +25 -0
- data/test/chain/test_custom_headers.rb +18 -0
- data/test/chain/test_header_resolver.rb +28 -0
- data/test/chain/test_parameter_resolver.rb +35 -0
- data/test/chain/test_request_resolver.rb +29 -0
- data/test/chain/test_response_reader.rb +24 -0
- data/test/data/htpasswd +1 -0
- data/test/data/server.crt +16 -0
- data/test/data/server.csr +12 -0
- data/test/data/server.key +15 -0
- data/test/data/server.pem +15 -0
- data/test/helper.rb +129 -0
- data/test/htdocs/alt_text.html +10 -0
- data/test/htdocs/bad_form_test.html +9 -0
- data/test/htdocs/button.jpg +0 -0
- data/test/htdocs/empty_form.html +6 -0
- data/test/htdocs/file_upload.html +26 -0
- data/test/htdocs/find_link.html +41 -0
- data/test/htdocs/form_multi_select.html +16 -0
- data/test/htdocs/form_multival.html +37 -0
- data/test/htdocs/form_no_action.html +18 -0
- data/test/htdocs/form_no_input_name.html +16 -0
- data/test/htdocs/form_select.html +16 -0
- data/test/htdocs/form_select_all.html +16 -0
- data/test/htdocs/form_select_none.html +17 -0
- data/test/htdocs/form_select_noopts.html +10 -0
- data/test/htdocs/form_set_fields.html +14 -0
- data/test/htdocs/form_test.html +188 -0
- data/test/htdocs/frame_test.html +30 -0
- data/test/htdocs/google.html +13 -0
- data/test/htdocs/iframe_test.html +16 -0
- data/test/htdocs/index.html +6 -0
- data/test/htdocs/link with space.html +5 -0
- data/test/htdocs/meta_cookie.html +11 -0
- data/test/htdocs/no_title_test.html +6 -0
- data/test/htdocs/relative/tc_relative_links.html +21 -0
- data/test/htdocs/tc_bad_links.html +5 -0
- data/test/htdocs/tc_base_link.html +8 -0
- data/test/htdocs/tc_blank_form.html +11 -0
- data/test/htdocs/tc_checkboxes.html +19 -0
- data/test/htdocs/tc_encoded_links.html +5 -0
- data/test/htdocs/tc_follow_meta.html +8 -0
- data/test/htdocs/tc_form_action.html +48 -0
- data/test/htdocs/tc_links.html +18 -0
- data/test/htdocs/tc_no_attributes.html +16 -0
- data/test/htdocs/tc_pretty_print.html +17 -0
- data/test/htdocs/tc_radiobuttons.html +17 -0
- data/test/htdocs/tc_referer.html +10 -0
- data/test/htdocs/tc_relative_links.html +19 -0
- data/test/htdocs/tc_textarea.html +23 -0
- data/test/htdocs/unusual______.html +5 -0
- data/test/servlets.rb +365 -0
- data/test/ssl_server.rb +48 -0
- data/test/test_authenticate.rb +71 -0
- data/test/test_bad_links.rb +25 -0
- data/test/test_blank_form.rb +16 -0
- data/test/test_checkboxes.rb +61 -0
- data/test/test_content_type.rb +13 -0
- data/test/test_cookie_class.rb +338 -0
- data/test/test_cookie_jar.rb +362 -0
- data/test/test_cookies.rb +123 -0
- data/test/test_encoded_links.rb +20 -0
- data/test/test_errors.rb +49 -0
- data/test/test_follow_meta.rb +108 -0
- data/test/test_form_action.rb +52 -0
- data/test/test_form_as_hash.rb +61 -0
- data/test/test_form_button.rb +38 -0
- data/test/test_form_no_inputname.rb +15 -0
- data/test/test_forms.rb +564 -0
- data/test/test_frames.rb +25 -0
- data/test/test_get_headers.rb +52 -0
- data/test/test_gzipping.rb +22 -0
- data/test/test_hash_api.rb +45 -0
- data/test/test_history.rb +142 -0
- data/test/test_history_added.rb +16 -0
- data/test/test_html_unscape_forms.rb +39 -0
- data/test/test_if_modified_since.rb +20 -0
- data/test/test_keep_alive.rb +31 -0
- data/test/test_links.rb +120 -0
- data/test/test_mech.rb +268 -0
- data/test/test_mechanize_file.rb +47 -0
- data/test/test_meta.rb +65 -0
- data/test/test_multi_select.rb +106 -0
- data/test/test_no_attributes.rb +13 -0
- data/test/test_option.rb +18 -0
- data/test/test_page.rb +119 -0
- data/test/test_pluggable_parser.rb +145 -0
- data/test/test_post_form.rb +34 -0
- data/test/test_pretty_print.rb +22 -0
- data/test/test_radiobutton.rb +75 -0
- data/test/test_redirect_limit_reached.rb +41 -0
- data/test/test_redirect_verb_handling.rb +45 -0
- data/test/test_referer.rb +39 -0
- data/test/test_relative_links.rb +40 -0
- data/test/test_request.rb +13 -0
- data/test/test_response_code.rb +52 -0
- data/test/test_save_file.rb +48 -0
- data/test/test_scheme.rb +48 -0
- data/test/test_select.rb +106 -0
- data/test/test_select_all.rb +15 -0
- data/test/test_select_none.rb +15 -0
- data/test/test_select_noopts.rb +16 -0
- data/test/test_set_fields.rb +44 -0
- data/test/test_ssl_server.rb +20 -0
- data/test/test_subclass.rb +14 -0
- data/test/test_textarea.rb +45 -0
- data/test/test_upload.rb +109 -0
- data/test/test_verbs.rb +25 -0
- metadata +314 -0
@@ -0,0 +1,30 @@
|
|
1
|
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
|
2
|
+
"http://www.w3.org/TR/html4/frameset.dtd">
|
3
|
+
<HTML>
|
4
|
+
<HEAD>
|
5
|
+
<TITLE>A simple frameset document</TITLE>
|
6
|
+
</HEAD>
|
7
|
+
<FRAMESET cols="20%, 80%">
|
8
|
+
<FRAMESET rows="100, 200">
|
9
|
+
<FRAME name="frame1" src="/google.html">
|
10
|
+
<FRAME name="frame2" src="/form_test.html">
|
11
|
+
</FRAMESET>
|
12
|
+
<FRAMESET rows="100, 200">
|
13
|
+
<FRAME name="frame3" src="/file_upload.html">
|
14
|
+
<IFRAME src="http://google.com/" name="frame4">
|
15
|
+
[Your user agent does not support frames or is currently configured
|
16
|
+
not to display frames. However, you may visit
|
17
|
+
<A href="foo.html">the related document.</A>]
|
18
|
+
</IFRAME>
|
19
|
+
</FRAMESET>
|
20
|
+
<NOFRAMES>
|
21
|
+
<P>This frameset document contains:
|
22
|
+
<UL>
|
23
|
+
<LI><A href="/google.html">Some neat contents</A>
|
24
|
+
<LI><A href="/form_test.html" class="bar">Form Test</A>
|
25
|
+
<LI><A href="/file_upload.html">Some other neat contents</A>
|
26
|
+
</UL>
|
27
|
+
</NOFRAMES>
|
28
|
+
</FRAMESET>
|
29
|
+
</HTML>
|
30
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<html><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"><title>Google</title><style><!--
|
2
|
+
body,td,a,p,.h{font-family:arial,sans-serif;}
|
3
|
+
.h{font-size: 20px;}
|
4
|
+
.q{color:#0000cc;}
|
5
|
+
//-->
|
6
|
+
</style>
|
7
|
+
<script>
|
8
|
+
<!--
|
9
|
+
function sf(){document.f.q.focus();}
|
10
|
+
// -->
|
11
|
+
</script>
|
12
|
+
</head><body bgcolor=#ffffff text=#000000 link=#0000cc vlink=#551a8b alink=#ff0000 onLoad=sf() topmargin=3 marginheight=3><center><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td align=right nowrap><font size=-1><a href="/url?sa=p&pref=ig&pval=2&q=http://www.google.com/ig%3Fhl%3Den">Personalized Home</a> | <a href="https://www.google.com/accounts/Login?continue=http://www.google.com/&hl=en">Sign in</a></font></td></tr><tr height=4><td><img alt="" width=1 height=1></td></tr></table><img src="/intl/en/images/logo.gif" width=276 height=110 alt="Google"><br><br>
|
13
|
+
<form action=/search name=f><table border=0 cellspacing=0 cellpadding=4><tr><td nowrap><font size=-1><b>Web</b> <a id=1a class=q href="/imghp?hl=en&tab=wi&ie=UTF-8">Images</a> <a id=2a class=q href="http://groups.google.com/grphp?hl=en&tab=wg&ie=UTF-8">Groups</a> <a id=4a class=q href="http://news.google.com/nwshp?hl=en&tab=wn&ie=UTF-8">News</a> <a id=5a class=q href="http://froogle.google.com/frghp?hl=en&tab=wf&ie=UTF-8">Froogle</a> <a id=7a class=q href="/lochp?hl=en&tab=wl&ie=UTF-8">Local</a> <b><a href="/intl/en/options/" class=q>more »</a></b></font></td></tr></table><table cellspacing=0 cellpadding=0><tr><td width=25%> </td><td align=center><input type=hidden name=hl value=en><input type=hidden name=ie value="ISO-8859-1"><input maxlength=2048 size=55 name=q value="" title="Google Search"><br><input type=submit value="Google Search" name=btnG><input type=submit value="I'm Feeling Lucky" name=btnI></td><td valign=top nowrap width=25%><font size=-2> <a href=/advanced_search?hl=en>Advanced Search</a><br> <a href=/preferences?hl=en>Preferences</a><br> <a href=/language_tools?hl=en>Language Tools</a></font></td></tr></table></form><br><br><font size=-1><a href="/ads/">Advertising Programs</a> - <a href=/services/>Business Solutions</a> - <a href=/intl/en/about.html>About Google</a></font><p><font size=-2>©2006 Google</font></p></center></body></html>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
|
2
|
+
"http://www.w3.org/TR/html4/frameset.dtd">
|
3
|
+
<HTML>
|
4
|
+
<HEAD>
|
5
|
+
<TITLE>A simple frameset document</TITLE>
|
6
|
+
</HEAD>
|
7
|
+
<BODY>
|
8
|
+
<IFRAME src="/file_upload.html" name="frame4">
|
9
|
+
[Your user agent does not support frames or is currently configured
|
10
|
+
not to display frames. However, you may visit
|
11
|
+
<A href="foo.html">the related document.</A>]
|
12
|
+
</IFRAME>
|
13
|
+
</BODY>
|
14
|
+
</HTML>
|
15
|
+
|
16
|
+
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<html>
|
2
|
+
<meta http-equiv="Set-Cookie" content="tender=live;expires=Sun, 27-Sep-2037 00:00:00 GMT; path=/">
|
3
|
+
<body>
|
4
|
+
<a href="alt_text.html"><img alt="alt text" src="hello"></a>
|
5
|
+
<a href="no_alt_text.html"><img src="hello"></a>
|
6
|
+
<a href="nil_alt_text.html"><img alt src="hello"></a>
|
7
|
+
<a href="no_image.html">no image</a>
|
8
|
+
<a href="no_text.html"></a>
|
9
|
+
</body>
|
10
|
+
</html>
|
11
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<html>
|
2
|
+
<body>
|
3
|
+
<a href="../tc_relative_links.html">dot dot slash</a>
|
4
|
+
<a href="../../../../../tc_relative_links.html">too many dots</a>
|
5
|
+
<FRAMESET cols="20%, 80%">
|
6
|
+
<FRAMESET rows="100, 200, 200">
|
7
|
+
<FRAME name="frame1" src="../tc_relative_links.html">
|
8
|
+
<FRAME name="frame2" src="../tc_relative_links.html">
|
9
|
+
</FRAMESET>
|
10
|
+
<FRAMESET rows="100, 200">
|
11
|
+
<FRAME name="frame3" src="/file_upload.html">
|
12
|
+
<IFRAME src="http://google.com/" name="frame4">
|
13
|
+
[Your user agent does not support frames or is currently configured
|
14
|
+
not to display frames. However, you may visit
|
15
|
+
<A href="foo.html">the related document.</A>]
|
16
|
+
<a href="?a=b">just the query string</A>
|
17
|
+
</IFRAME>
|
18
|
+
</FRAMESET>
|
19
|
+
</FRAMESET>
|
20
|
+
</body>
|
21
|
+
</html>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<html>
|
2
|
+
<body>
|
3
|
+
<form name="test" method="post">
|
4
|
+
<input type="hidden" name="hidden_blank" value=''/>
|
5
|
+
<input type="hidden" name="hidden_noval"/>
|
6
|
+
<input type="text" name="visible_blank" value=''/>
|
7
|
+
<input type="text" name="visible_noval"/>
|
8
|
+
<input type="submit"/>
|
9
|
+
</form>
|
10
|
+
</body>
|
11
|
+
</html>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<html>
|
2
|
+
<head><title>tc_checkboxbuttons.html</title></head>
|
3
|
+
<body>
|
4
|
+
<form name="form1" method="post" action="/form_post">
|
5
|
+
Gender:<br />
|
6
|
+
M: <input type="checkbox" name="male" /><br />
|
7
|
+
F: <input type="checkbox" name="female" /><br />
|
8
|
+
Your one favorite color:<br />
|
9
|
+
Green: <input type="checkbox" name="green" /><br />
|
10
|
+
Green: <input type="checkbox" name="green" /><br />
|
11
|
+
Red: <input type="checkbox" name="red" /><br />
|
12
|
+
Blue: <input type="checkbox" name="blue" /><br />
|
13
|
+
Yellow: <input type="checkbox" name="yellow" /><br />
|
14
|
+
Brown: <input type="checkbox" name="brown" /><br />
|
15
|
+
Purple: <input type="checkbox" name="purple" /><br />
|
16
|
+
<input type="submit" value="Submit" />
|
17
|
+
</form>
|
18
|
+
</body>
|
19
|
+
</html>
|
@@ -0,0 +1,48 @@
|
|
1
|
+
<html>
|
2
|
+
<head><title>Page Title</title></head>
|
3
|
+
<body>
|
4
|
+
<h1>Post Form 1</h1>
|
5
|
+
<form name="post_form1" method="post" action="/form_post?a=b&b=c">
|
6
|
+
<table>
|
7
|
+
<tr>
|
8
|
+
<td>First Name</td>
|
9
|
+
<td><input type="text" name="first_name" /></td>
|
10
|
+
</tr>
|
11
|
+
</table><br />
|
12
|
+
<input type="submit" value="Submit" />
|
13
|
+
</form>
|
14
|
+
|
15
|
+
<h1>Post Form 2</h1>
|
16
|
+
<form name="post_form2" method="get" action="/form_post?a=b&b=c">
|
17
|
+
<table>
|
18
|
+
<tr>
|
19
|
+
<td>First Name</td>
|
20
|
+
<td><input type="text" name="first_name" /></td>
|
21
|
+
</tr>
|
22
|
+
</table><br />
|
23
|
+
<input type="submit" value="Submit" />
|
24
|
+
</form>
|
25
|
+
|
26
|
+
<h1>Post Form 3</h1>
|
27
|
+
<form name="post_form3" method="post" action="/form_post?a=b&b=c">
|
28
|
+
<table>
|
29
|
+
<tr>
|
30
|
+
<td>First Name</td>
|
31
|
+
<td><input type="text" name="first_name" /></td>
|
32
|
+
</tr>
|
33
|
+
</table><br />
|
34
|
+
<input type="submit" value="Submit" />
|
35
|
+
</form>
|
36
|
+
|
37
|
+
<h1>Post Form 4</h1>
|
38
|
+
<form name="post_form4" method="post" action="/form_post#1">
|
39
|
+
<table>
|
40
|
+
<tr>
|
41
|
+
<td>First Name</td>
|
42
|
+
<td><input type="text" name="first_name" /></td>
|
43
|
+
</tr>
|
44
|
+
</table><br />
|
45
|
+
<input type="submit" value="Submit" />
|
46
|
+
</form>
|
47
|
+
</body>
|
48
|
+
</html>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<html>
|
2
|
+
<body>
|
3
|
+
<a href="thing.html"><b>Bold Dude</b></a>
|
4
|
+
<a href="thing.html">Dude</a>
|
5
|
+
<a href="thing.html">Aaron <b>James</b> Patterson</a>
|
6
|
+
<a href="thing.html"><b>Aaron</b> Patterson</a>
|
7
|
+
<a href="thing.html">Ruby <b>Rocks!</b></a>
|
8
|
+
<!-- Testing a bug with escaped stuff in links:
|
9
|
+
http://rubyforge.org/pipermail/mechanize-users/2006-September/000002.html
|
10
|
+
-->
|
11
|
+
<a href="link%20with%20space.html">encoded space</a>
|
12
|
+
<a href="link with space.html">not encoded space</a>
|
13
|
+
<!-- End escaped bug -->
|
14
|
+
<a href="unusual&&%3F%3F%23%23.html">unusual characters</a>
|
15
|
+
|
16
|
+
<a href="javascript:new_page('1')">javascript link</a>
|
17
|
+
</body>
|
18
|
+
</html>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<html>
|
2
|
+
<head><title>tc_pretty_print.html</title></head>
|
3
|
+
<body>
|
4
|
+
<a href="http://google.com/">Google</a><br />
|
5
|
+
<form method="post" action="/form_post" name="form1">
|
6
|
+
<input type="text" name="first_name"/><br />
|
7
|
+
<input type="password" name="password" /><br />
|
8
|
+
<input type="hidden" name="secret" value="hey" />
|
9
|
+
<input type="checkbox" name="checkme" />
|
10
|
+
<input type="radio" name="r" value="one" /><br />
|
11
|
+
<input type="radio" name="r" value="two" /><br />
|
12
|
+
<input type="submit" value="Submit" />
|
13
|
+
</form>
|
14
|
+
<frame src="http://memepool.com/" />
|
15
|
+
<iframe src="http://memepool.com/" />
|
16
|
+
</body>
|
17
|
+
</html>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<html>
|
2
|
+
<head><title>tc_radiobuttons.html</title></head>
|
3
|
+
<body>
|
4
|
+
<form name="form1" method="post" action="/form_post">
|
5
|
+
Gender:<br />
|
6
|
+
M: <input type="radio" name="gender" value="male" /><br />
|
7
|
+
F: <input type="radio" name="gender" value="female" /><br />
|
8
|
+
Your one favorite color:<br />
|
9
|
+
Green: <input type="radio" name="color" value="green" /><br />
|
10
|
+
Red: <input type="radio" name="color" value="red" /><br />
|
11
|
+
Blue: <input type="radio" name="color" value="blue" /><br />
|
12
|
+
Yellow: <input type="radio" name="color" value="yellow" /><br />
|
13
|
+
Brown: <input type="radio" name="color" value="brown" /><br />
|
14
|
+
<input type="submit" value="Submit" />
|
15
|
+
</form>
|
16
|
+
</body>
|
17
|
+
</html>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<html>
|
2
|
+
<body>
|
3
|
+
<a href="relative/tc_relative_links.html">forward</a>
|
4
|
+
<FRAMESET cols="20%, 80%">
|
5
|
+
<FRAMESET rows="100, 200, 200">
|
6
|
+
<FRAME name="frame1" src="relative/tc_relative_links.html">
|
7
|
+
<FRAME name="frame2" src="relative/tc_relative_links.html">
|
8
|
+
</FRAMESET>
|
9
|
+
<FRAMESET rows="100, 200">
|
10
|
+
<FRAME name="frame3" src="/file_upload.html">
|
11
|
+
<IFRAME src="http://google.com/" name="frame4">
|
12
|
+
[Your user agent does not support frames or is currently configured
|
13
|
+
not to display frames. However, you may visit
|
14
|
+
<A href="foo.html">the related document.</A>]
|
15
|
+
</IFRAME>
|
16
|
+
</FRAMESET>
|
17
|
+
</FRAMESET>
|
18
|
+
</body>
|
19
|
+
</html>
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<html>
|
2
|
+
<head><title>tc_textarea.html</title></head>
|
3
|
+
<body>
|
4
|
+
<form name="form1" method="post" action="/form_post">
|
5
|
+
<textarea name="text1"></textarea>
|
6
|
+
<br />
|
7
|
+
<input type="submit" value="Submit" />
|
8
|
+
</form>
|
9
|
+
<br />
|
10
|
+
<form name="form2" method="post" action="/form_post">
|
11
|
+
<textarea name="text1">sample text</textarea>
|
12
|
+
<br />
|
13
|
+
<input type="submit" value="Submit" />
|
14
|
+
</form>
|
15
|
+
<br />
|
16
|
+
<form name="form3" method="post" action="/form_post">
|
17
|
+
<textarea name="text1"></textarea>
|
18
|
+
<textarea name="text1">sample text</textarea>
|
19
|
+
<br />
|
20
|
+
<input type="submit" value="Submit" />
|
21
|
+
</form>
|
22
|
+
</body>
|
23
|
+
</html>
|
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
|