mechanize 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of mechanize might be problematic. Click here for more details.
- data/README +32 -0
- data/doc/classes/Net/HTTP.html +1716 -0
- data/doc/classes/Net/HTTP.src/M000103.html +18 -0
- data/doc/classes/Net/HTTP.src/M000104.html +18 -0
- data/doc/classes/Net/HTTP.src/M000105.html +18 -0
- data/doc/classes/Net/HTTP.src/M000106.html +18 -0
- data/doc/classes/Net/HTTP.src/M000107.html +29 -0
- data/doc/classes/Net/HTTP.src/M000108.html +18 -0
- data/doc/classes/Net/HTTP.src/M000109.html +22 -0
- data/doc/classes/Net/HTTP.src/M000110.html +18 -0
- data/doc/classes/Net/HTTP.src/M000111.html +18 -0
- data/doc/classes/Net/HTTP.src/M000112.html +18 -0
- data/doc/classes/Net/HTTP.src/M000113.html +18 -0
- data/doc/classes/Net/HTTP.src/M000114.html +22 -0
- data/doc/classes/Net/HTTP.src/M000115.html +29 -0
- data/doc/classes/Net/HTTP.src/M000116.html +18 -0
- data/doc/classes/Net/HTTP.src/M000117.html +19 -0
- data/doc/classes/Net/HTTP.src/M000118.html +19 -0
- data/doc/classes/Net/HTTP.src/M000119.html +18 -0
- data/doc/classes/Net/HTTP.src/M000121.html +18 -0
- data/doc/classes/Net/HTTP.src/M000122.html +28 -0
- data/doc/classes/Net/HTTP.src/M000123.html +19 -0
- data/doc/classes/Net/HTTP.src/M000124.html +30 -0
- data/doc/classes/Net/HTTP.src/M000125.html +18 -0
- data/doc/classes/Net/HTTP.src/M000126.html +18 -0
- data/doc/classes/Net/HTTP.src/M000127.html +18 -0
- data/doc/classes/Net/HTTP.src/M000128.html +18 -0
- data/doc/classes/Net/HTTP.src/M000129.html +18 -0
- data/doc/classes/Net/HTTP.src/M000130.html +18 -0
- data/doc/classes/Net/HTTP.src/M000133.html +28 -0
- data/doc/classes/Net/HTTP.src/M000134.html +20 -0
- data/doc/classes/Net/HTTP.src/M000135.html +28 -0
- data/doc/classes/Net/HTTP.src/M000136.html +18 -0
- data/doc/classes/Net/HTTP.src/M000137.html +18 -0
- data/doc/classes/Net/HTTP.src/M000138.html +18 -0
- data/doc/classes/Net/HTTP.src/M000139.html +18 -0
- data/doc/classes/Net/HTTP.src/M000140.html +18 -0
- data/doc/classes/Net/HTTP.src/M000141.html +18 -0
- data/doc/classes/Net/HTTP.src/M000142.html +18 -0
- data/doc/classes/Net/HTTP.src/M000143.html +18 -0
- data/doc/classes/Net/HTTP.src/M000144.html +18 -0
- data/doc/classes/Net/HTTP.src/M000145.html +18 -0
- data/doc/classes/Net/HTTP.src/M000146.html +18 -0
- data/doc/classes/Net/HTTP.src/M000147.html +18 -0
- data/doc/classes/Net/HTTP.src/M000148.html +18 -0
- data/doc/classes/Net/HTTP.src/M000152.html +19 -0
- data/doc/classes/Net/HTTP.src/M000153.html +39 -0
- data/doc/classes/Net/HTTP.src/M000154.html +18 -0
- data/doc/classes/Net/HTTP.src/M000156.html +24 -0
- data/doc/classes/Net/HTTP.src/M000157.html +18 -0
- data/doc/classes/Net/HTTP.src/M000158.html +19 -0
- data/doc/classes/Net/HTTP.src/M000159.html +21 -0
- data/doc/classes/Net/HTTP.src/M000161.html +19 -0
- data/doc/classes/Net/HTTP/Copy.html +134 -0
- data/doc/classes/Net/HTTP/Delete.html +134 -0
- data/doc/classes/Net/HTTP/Get.html +134 -0
- data/doc/classes/Net/HTTP/Head.html +134 -0
- data/doc/classes/Net/HTTP/Lock.html +134 -0
- data/doc/classes/Net/HTTP/Mkcol.html +134 -0
- data/doc/classes/Net/HTTP/Move.html +134 -0
- data/doc/classes/Net/HTTP/Options.html +134 -0
- data/doc/classes/Net/HTTP/Post.html +134 -0
- data/doc/classes/Net/HTTP/Propfind.html +134 -0
- data/doc/classes/Net/HTTP/Proppatch.html +134 -0
- data/doc/classes/Net/HTTP/Put.html +134 -0
- data/doc/classes/Net/HTTP/Trace.html +134 -0
- data/doc/classes/Net/HTTP/Unlock.html +134 -0
- data/doc/classes/Net/HTTPError.html +120 -0
- data/doc/classes/Net/HTTPExceptions.html +137 -0
- data/doc/classes/Net/HTTPFatalError.html +120 -0
- data/doc/classes/Net/HTTPGenericRequest.html +274 -0
- data/doc/classes/Net/HTTPGenericRequest.src/M000088.html +26 -0
- data/doc/classes/Net/HTTPGenericRequest.src/M000089.html +18 -0
- data/doc/classes/Net/HTTPGenericRequest.src/M000090.html +18 -0
- data/doc/classes/Net/HTTPGenericRequest.src/M000091.html +18 -0
- data/doc/classes/Net/HTTPGenericRequest.src/M000092.html +19 -0
- data/doc/classes/Net/HTTPGenericRequest.src/M000093.html +20 -0
- data/doc/classes/Net/HTTPGenericRequest.src/M000094.html +20 -0
- data/doc/classes/Net/HTTPHeader.html +734 -0
- data/doc/classes/Net/HTTPHeader.src/M000055.html +23 -0
- data/doc/classes/Net/HTTPHeader.src/M000056.html +19 -0
- data/doc/classes/Net/HTTPHeader.src/M000057.html +22 -0
- data/doc/classes/Net/HTTPHeader.src/M000058.html +22 -0
- data/doc/classes/Net/HTTPHeader.src/M000059.html +19 -0
- data/doc/classes/Net/HTTPHeader.src/M000060.html +19 -0
- data/doc/classes/Net/HTTPHeader.src/M000061.html +20 -0
- data/doc/classes/Net/HTTPHeader.src/M000063.html +18 -0
- data/doc/classes/Net/HTTPHeader.src/M000065.html +20 -0
- data/doc/classes/Net/HTTPHeader.src/M000066.html +20 -0
- data/doc/classes/Net/HTTPHeader.src/M000067.html +18 -0
- data/doc/classes/Net/HTTPHeader.src/M000068.html +18 -0
- data/doc/classes/Net/HTTPHeader.src/M000069.html +18 -0
- data/doc/classes/Net/HTTPHeader.src/M000070.html +20 -0
- data/doc/classes/Net/HTTPHeader.src/M000072.html +30 -0
- data/doc/classes/Net/HTTPHeader.src/M000073.html +43 -0
- data/doc/classes/Net/HTTPHeader.src/M000075.html +21 -0
- data/doc/classes/Net/HTTPHeader.src/M000076.html +22 -0
- data/doc/classes/Net/HTTPHeader.src/M000077.html +20 -0
- data/doc/classes/Net/HTTPHeader.src/M000078.html +21 -0
- data/doc/classes/Net/HTTPHeader.src/M000079.html +19 -0
- data/doc/classes/Net/HTTPHeader.src/M000080.html +18 -0
- data/doc/classes/Net/HTTPHeader.src/M000081.html +19 -0
- data/doc/classes/Net/HTTPHeader.src/M000082.html +19 -0
- data/doc/classes/Net/HTTPHeader.src/M000083.html +23 -0
- data/doc/classes/Net/HTTPHeader.src/M000084.html +18 -0
- data/doc/classes/Net/HTTPHeader.src/M000086.html +18 -0
- data/doc/classes/Net/HTTPHeader.src/M000087.html +18 -0
- data/doc/classes/Net/HTTPRequest.html +150 -0
- data/doc/classes/Net/HTTPRequest.src/M000102.html +21 -0
- data/doc/classes/Net/HTTPResponse.html +425 -0
- data/doc/classes/Net/HTTPResponse.src/M000162.html +18 -0
- data/doc/classes/Net/HTTPResponse.src/M000163.html +18 -0
- data/doc/classes/Net/HTTPResponse.src/M000164.html +23 -0
- data/doc/classes/Net/HTTPResponse.src/M000165.html +18 -0
- data/doc/classes/Net/HTTPResponse.src/M000166.html +32 -0
- data/doc/classes/Net/HTTPResponse.src/M000167.html +18 -0
- data/doc/classes/Net/HTTPRetriableError.html +120 -0
- data/doc/classes/Net/HTTPServerException.html +120 -0
- data/doc/classes/Net/ProtoAuthError.html +113 -0
- data/doc/classes/Net/ProtoCommandError.html +113 -0
- data/doc/classes/Net/ProtoFatalError.html +113 -0
- data/doc/classes/Net/ProtoRetriableError.html +113 -0
- data/doc/classes/Net/ProtoServerError.html +113 -0
- data/doc/classes/Net/ProtoSyntaxError.html +113 -0
- data/doc/classes/Net/ProtoUnknownError.html +113 -0
- data/doc/classes/Net/ProtocolError.html +111 -0
- data/doc/classes/Net/WriteAdapter.html +235 -0
- data/doc/classes/Net/WriteAdapter.src/M000095.html +19 -0
- data/doc/classes/Net/WriteAdapter.src/M000096.html +18 -0
- data/doc/classes/Net/WriteAdapter.src/M000097.html +18 -0
- data/doc/classes/Net/WriteAdapter.src/M000099.html +19 -0
- data/doc/classes/Net/WriteAdapter.src/M000100.html +18 -0
- data/doc/classes/Net/WriteAdapter.src/M000101.html +18 -0
- data/doc/classes/REXML.html +109 -0
- data/doc/classes/REXML/Comment.html +137 -0
- data/doc/classes/REXML/Comment.src/M000053.html +18 -0
- data/doc/classes/REXML/Node.html +240 -0
- data/doc/classes/REXML/Node.src/M000047.html +21 -0
- data/doc/classes/REXML/Node.src/M000048.html +21 -0
- data/doc/classes/REXML/Node.src/M000049.html +22 -0
- data/doc/classes/REXML/Node.src/M000050.html +18 -0
- data/doc/classes/REXML/Node.src/M000051.html +18 -0
- data/doc/classes/REXML/Node.src/M000052.html +18 -0
- data/doc/classes/REXML/Text.html +137 -0
- data/doc/classes/REXML/Text.src/M000054.html +18 -0
- data/doc/classes/WWW.html +130 -0
- data/doc/classes/WWW/Button.html +190 -0
- data/doc/classes/WWW/Button.src/M000028.html +18 -0
- data/doc/classes/WWW/Button.src/M000029.html +18 -0
- data/doc/classes/WWW/Button.src/M000030.html +25 -0
- data/doc/classes/WWW/CheckBox.html +160 -0
- data/doc/classes/WWW/CheckBox.src/M000024.html +18 -0
- data/doc/classes/WWW/Cookie.html +207 -0
- data/doc/classes/WWW/Cookie.src/M000032.html +59 -0
- data/doc/classes/WWW/Cookie.src/M000033.html +21 -0
- data/doc/classes/WWW/Cookie.src/M000034.html +18 -0
- data/doc/classes/WWW/CookieJar.html +197 -0
- data/doc/classes/WWW/CookieJar.src/M000008.html +18 -0
- data/doc/classes/WWW/CookieJar.src/M000009.html +22 -0
- data/doc/classes/WWW/CookieJar.src/M000010.html +33 -0
- data/doc/classes/WWW/CookieJar.src/M000011.html +18 -0
- data/doc/classes/WWW/Field.html +174 -0
- data/doc/classes/WWW/Field.src/M000045.html +18 -0
- data/doc/classes/WWW/Field.src/M000046.html +26 -0
- data/doc/classes/WWW/FileUpload.html +163 -0
- data/doc/classes/WWW/FileUpload.src/M000031.html +19 -0
- data/doc/classes/WWW/Form.html +152 -0
- data/doc/classes/WWW/Form.src/M000044.html +19 -0
- data/doc/classes/WWW/GlobalForm.html +271 -0
- data/doc/classes/WWW/GlobalForm.src/M000004.html +24 -0
- data/doc/classes/WWW/GlobalForm.src/M000005.html +26 -0
- data/doc/classes/WWW/GlobalForm.src/M000006.html +46 -0
- data/doc/classes/WWW/GlobalForm.src/M000007.html +46 -0
- data/doc/classes/WWW/ImageButton.html +157 -0
- data/doc/classes/WWW/ImageButton.src/M000027.html +22 -0
- data/doc/classes/WWW/Link.html +160 -0
- data/doc/classes/WWW/Link.src/M000025.html +20 -0
- data/doc/classes/WWW/Mechanize.html +379 -0
- data/doc/classes/WWW/Mechanize.src/M000013.html +21 -0
- data/doc/classes/WWW/Mechanize.src/M000014.html +18 -0
- data/doc/classes/WWW/Mechanize.src/M000015.html +24 -0
- data/doc/classes/WWW/Mechanize.src/M000016.html +19 -0
- data/doc/classes/WWW/Mechanize.src/M000017.html +23 -0
- data/doc/classes/WWW/Mechanize.src/M000018.html +32 -0
- data/doc/classes/WWW/Mechanize.src/M000019.html +19 -0
- data/doc/classes/WWW/Mechanize.src/M000020.html +18 -0
- data/doc/classes/WWW/Mechanize.src/M000021.html +33 -0
- data/doc/classes/WWW/Mechanize.src/M000022.html +18 -0
- data/doc/classes/WWW/Meta.html +113 -0
- data/doc/classes/WWW/Page.html +313 -0
- data/doc/classes/WWW/Page.src/M000036.html +18 -0
- data/doc/classes/WWW/Page.src/M000037.html +18 -0
- data/doc/classes/WWW/Page.src/M000038.html +18 -0
- data/doc/classes/WWW/Page.src/M000039.html +19 -0
- data/doc/classes/WWW/Page.src/M000040.html +19 -0
- data/doc/classes/WWW/Page.src/M000041.html +19 -0
- data/doc/classes/WWW/Page.src/M000042.html +19 -0
- data/doc/classes/WWW/Page.src/M000043.html +19 -0
- data/doc/classes/WWW/RadioButton.html +160 -0
- data/doc/classes/WWW/RadioButton.src/M000012.html +18 -0
- data/doc/classes/WWW/ResponseCodeError.html +150 -0
- data/doc/classes/WWW/ResponseCodeError.src/M000035.html +18 -0
- data/doc/classes/WWW/SelectList.html +160 -0
- data/doc/classes/WWW/SelectList.src/M000026.html +28 -0
- data/doc/created.rid +1 -0
- data/doc/files/CHANGELOG.html +136 -0
- data/doc/files/LICENSE.html +531 -0
- data/doc/files/README.html +161 -0
- data/doc/files/lib/mechanize/cookie_rb.html +101 -0
- data/doc/files/lib/mechanize/net-overrides/net/http_rb.html +139 -0
- data/doc/files/lib/mechanize/net-overrides/net/https_rb.html +109 -0
- data/doc/files/lib/mechanize/net-overrides/net/protocol_rb.html +117 -0
- data/doc/files/lib/mechanize/parsing_rb.html +267 -0
- data/doc/files/lib/mechanize/parsing_rb.src/M000001.html +22 -0
- data/doc/files/lib/mechanize/parsing_rb.src/M000002.html +44 -0
- data/doc/files/lib/mechanize/parsing_rb.src/M000003.html +34 -0
- data/doc/files/lib/mechanize_rb.html +152 -0
- data/doc/fr_class_index.html +80 -0
- data/doc/fr_file_index.html +35 -0
- data/doc/fr_method_index.html +194 -0
- data/doc/index.html +24 -0
- data/doc/rdoc-style.css +208 -0
- data/lib/mechanize.rb +128 -26
- data/lib/mechanize/cookie.rb +98 -0
- data/lib/mechanize/net-overrides/net/http.rb +2 -2
- data/test/README +7 -0
- data/test/htdocs/find_link.html +40 -0
- data/test/htdocs/form_test.html +154 -0
- data/test/htdocs/google.html +13 -0
- data/test/htdocs/index.html +6 -0
- data/test/server.rb +19 -0
- data/test/servlets.rb +130 -0
- data/test/tc_cookies.rb +125 -0
- data/test/tc_forms.rb +339 -0
- data/test/tc_links.rb +25 -0
- data/test/tc_mech.rb +70 -0
- data/test/tc_response_code.rb +31 -0
- data/test/ts_mech.rb +9 -0
- metadata +310 -41
- data/Rakefile +0 -14
- data/examples/rubyforge.rb +0 -13
- data/mechanize.gemspec +0 -22
data/doc/index.html
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
|
5
|
+
|
6
|
+
<!--
|
7
|
+
|
8
|
+
RDoc Documentation
|
9
|
+
|
10
|
+
-->
|
11
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
12
|
+
<head>
|
13
|
+
<title>RDoc Documentation</title>
|
14
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
15
|
+
</head>
|
16
|
+
<frameset rows="20%, 80%">
|
17
|
+
<frameset cols="25%,35%,45%">
|
18
|
+
<frame src="fr_file_index.html" title="Files" name="Files" />
|
19
|
+
<frame src="fr_class_index.html" name="Classes" />
|
20
|
+
<frame src="fr_method_index.html" name="Methods" />
|
21
|
+
</frameset>
|
22
|
+
<frame src="files/README.html" name="docwin" />
|
23
|
+
</frameset>
|
24
|
+
</html>
|
data/doc/rdoc-style.css
ADDED
@@ -0,0 +1,208 @@
|
|
1
|
+
|
2
|
+
body {
|
3
|
+
font-family: Verdana,Arial,Helvetica,sans-serif;
|
4
|
+
font-size: 90%;
|
5
|
+
margin: 0;
|
6
|
+
margin-left: 40px;
|
7
|
+
padding: 0;
|
8
|
+
background: white;
|
9
|
+
}
|
10
|
+
|
11
|
+
h1,h2,h3,h4 { margin: 0; color: #efefef; background: transparent; }
|
12
|
+
h1 { font-size: 150%; }
|
13
|
+
h2,h3,h4 { margin-top: 1em; }
|
14
|
+
|
15
|
+
a { background: #eef; color: #039; text-decoration: none; }
|
16
|
+
a:hover { background: #039; color: #eef; }
|
17
|
+
|
18
|
+
/* Override the base stylesheet's Anchor inside a table cell */
|
19
|
+
td > a {
|
20
|
+
background: transparent;
|
21
|
+
color: #039;
|
22
|
+
text-decoration: none;
|
23
|
+
}
|
24
|
+
|
25
|
+
/* and inside a section title */
|
26
|
+
.section-title > a {
|
27
|
+
background: transparent;
|
28
|
+
color: #eee;
|
29
|
+
text-decoration: none;
|
30
|
+
}
|
31
|
+
|
32
|
+
/* === Structural elements =================================== */
|
33
|
+
|
34
|
+
div#index {
|
35
|
+
margin: 0;
|
36
|
+
margin-left: -40px;
|
37
|
+
padding: 0;
|
38
|
+
font-size: 90%;
|
39
|
+
}
|
40
|
+
|
41
|
+
|
42
|
+
div#index a {
|
43
|
+
margin-left: 0.7em;
|
44
|
+
}
|
45
|
+
|
46
|
+
div#index .section-bar {
|
47
|
+
margin-left: 0px;
|
48
|
+
padding-left: 0.7em;
|
49
|
+
background: #ccc;
|
50
|
+
font-size: small;
|
51
|
+
}
|
52
|
+
|
53
|
+
|
54
|
+
div#classHeader, div#fileHeader {
|
55
|
+
width: auto;
|
56
|
+
color: white;
|
57
|
+
padding: 0.5em 1.5em 0.5em 1.5em;
|
58
|
+
margin: 0;
|
59
|
+
margin-left: -40px;
|
60
|
+
border-bottom: 3px solid #006;
|
61
|
+
}
|
62
|
+
|
63
|
+
div#classHeader a, div#fileHeader a {
|
64
|
+
background: inherit;
|
65
|
+
color: white;
|
66
|
+
}
|
67
|
+
|
68
|
+
div#classHeader td, div#fileHeader td {
|
69
|
+
background: inherit;
|
70
|
+
color: white;
|
71
|
+
}
|
72
|
+
|
73
|
+
|
74
|
+
div#fileHeader {
|
75
|
+
background: #057;
|
76
|
+
}
|
77
|
+
|
78
|
+
div#classHeader {
|
79
|
+
background: #048;
|
80
|
+
}
|
81
|
+
|
82
|
+
|
83
|
+
.class-name-in-header {
|
84
|
+
font-size: 180%;
|
85
|
+
font-weight: bold;
|
86
|
+
}
|
87
|
+
|
88
|
+
|
89
|
+
div#bodyContent {
|
90
|
+
padding: 0 1.5em 0 1.5em;
|
91
|
+
}
|
92
|
+
|
93
|
+
div#description {
|
94
|
+
padding: 0.5em 1.5em;
|
95
|
+
background: #efefef;
|
96
|
+
border: 1px dotted #999;
|
97
|
+
}
|
98
|
+
|
99
|
+
div#description h1,h2,h3,h4,h5,h6 {
|
100
|
+
color: #125;;
|
101
|
+
background: transparent;
|
102
|
+
}
|
103
|
+
|
104
|
+
div#validator-badges {
|
105
|
+
text-align: center;
|
106
|
+
}
|
107
|
+
div#validator-badges img { border: 0; }
|
108
|
+
|
109
|
+
div#copyright {
|
110
|
+
color: #333;
|
111
|
+
background: #efefef;
|
112
|
+
font: 0.75em sans-serif;
|
113
|
+
margin-top: 5em;
|
114
|
+
margin-bottom: 0;
|
115
|
+
padding: 0.5em 2em;
|
116
|
+
}
|
117
|
+
|
118
|
+
|
119
|
+
/* === Classes =================================== */
|
120
|
+
|
121
|
+
table.header-table {
|
122
|
+
color: white;
|
123
|
+
font-size: small;
|
124
|
+
}
|
125
|
+
|
126
|
+
.type-note {
|
127
|
+
font-size: small;
|
128
|
+
color: #DEDEDE;
|
129
|
+
}
|
130
|
+
|
131
|
+
.xxsection-bar {
|
132
|
+
background: #eee;
|
133
|
+
color: #333;
|
134
|
+
padding: 3px;
|
135
|
+
}
|
136
|
+
|
137
|
+
.section-bar {
|
138
|
+
color: #333;
|
139
|
+
border-bottom: 1px solid #999;
|
140
|
+
margin-left: -20px;
|
141
|
+
}
|
142
|
+
|
143
|
+
|
144
|
+
.section-title {
|
145
|
+
background: #79a;
|
146
|
+
color: #eee;
|
147
|
+
padding: 3px;
|
148
|
+
margin-top: 2em;
|
149
|
+
margin-left: -30px;
|
150
|
+
border: 1px solid #999;
|
151
|
+
}
|
152
|
+
|
153
|
+
.top-aligned-row { vertical-align: top }
|
154
|
+
.bottom-aligned-row { vertical-align: bottom }
|
155
|
+
|
156
|
+
/* --- Context section classes ----------------------- */
|
157
|
+
|
158
|
+
.context-row { }
|
159
|
+
.context-item-name { font-family: monospace; font-weight: bold; color: black; }
|
160
|
+
.context-item-value { font-size: small; color: #448; }
|
161
|
+
.context-item-desc { color: #333; padding-left: 2em; }
|
162
|
+
|
163
|
+
/* --- Method classes -------------------------- */
|
164
|
+
.method-detail {
|
165
|
+
background: #efefef;
|
166
|
+
padding: 0;
|
167
|
+
margin-top: 0.5em;
|
168
|
+
margin-bottom: 1em;
|
169
|
+
border: 1px dotted #ccc;
|
170
|
+
}
|
171
|
+
.method-heading {
|
172
|
+
color: black;
|
173
|
+
background: #ccc;
|
174
|
+
border-bottom: 1px solid #666;
|
175
|
+
padding: 0.2em 0.5em 0 0.5em;
|
176
|
+
}
|
177
|
+
.method-signature { color: black; background: inherit; }
|
178
|
+
.method-name { font-weight: bold; }
|
179
|
+
.method-args { font-style: italic; }
|
180
|
+
.method-description { padding: 0 0.5em 0 0.5em; }
|
181
|
+
|
182
|
+
/* --- Source code sections -------------------- */
|
183
|
+
|
184
|
+
a.source-toggle { font-size: 90%; }
|
185
|
+
div.method-source-code {
|
186
|
+
background: #262626;
|
187
|
+
color: #ffdead;
|
188
|
+
margin: 1em;
|
189
|
+
padding: 0.5em;
|
190
|
+
border: 1px dashed #999;
|
191
|
+
overflow: hidden;
|
192
|
+
}
|
193
|
+
|
194
|
+
div.method-source-code pre { color: #ffdead; overflow: hidden; }
|
195
|
+
|
196
|
+
/* --- Ruby keyword styles --------------------- */
|
197
|
+
|
198
|
+
.standalone-code { background: #221111; color: #ffdead; overflow: hidden; }
|
199
|
+
|
200
|
+
.ruby-constant { color: #7fffd4; background: transparent; }
|
201
|
+
.ruby-keyword { color: #00ffff; background: transparent; }
|
202
|
+
.ruby-ivar { color: #eedd82; background: transparent; }
|
203
|
+
.ruby-operator { color: #00ffee; background: transparent; }
|
204
|
+
.ruby-identifier { color: #ffdead; background: transparent; }
|
205
|
+
.ruby-node { color: #ffa07a; background: transparent; }
|
206
|
+
.ruby-comment { color: #b22222; font-weight: bold; background: transparent; }
|
207
|
+
.ruby-regexp { color: #ffa07a; background: transparent; }
|
208
|
+
.ruby-value { color: #7fffd4; background: transparent; }
|
data/lib/mechanize.rb
CHANGED
@@ -1,23 +1,28 @@
|
|
1
|
-
#
|
1
|
+
# Original Code:
|
2
2
|
# Copyright (c) 2005 by Michael Neumann (mneumann@ntecs.de)
|
3
3
|
#
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
4
|
+
# New Code:
|
5
|
+
# Copyright (c) 2006 by Aaron Patterson (aaronp@rubyforge.org)
|
6
|
+
#
|
7
|
+
# Please see the LICENSE file for licensing.
|
8
|
+
#
|
8
9
|
|
9
|
-
Version = "0.
|
10
|
+
Version = "0.4.0"
|
10
11
|
|
11
12
|
# required due to the missing get_fields method in Ruby 1.8.2
|
12
|
-
|
13
|
+
unless RUBY_VERSION > "1.8.2"
|
14
|
+
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), "mechanize", "net-overrides")
|
15
|
+
end
|
13
16
|
require 'net/http'
|
14
17
|
require 'net/https'
|
15
18
|
|
16
19
|
require 'web/htmltools/xmltree' # narf
|
17
20
|
require 'mechanize/parsing'
|
21
|
+
require 'mechanize/cookie'
|
18
22
|
require 'uri'
|
19
23
|
require 'logger'
|
20
24
|
require 'webrick'
|
25
|
+
require 'date'
|
21
26
|
|
22
27
|
module WWW
|
23
28
|
|
@@ -150,7 +155,7 @@ class GlobalForm
|
|
150
155
|
def initialize(form_node, elements_node)
|
151
156
|
@form_node, @elements_node = form_node, elements_node
|
152
157
|
|
153
|
-
@method = (@form_node.attributes['method'] || '
|
158
|
+
@method = (@form_node.attributes['method'] || 'GET').upcase
|
154
159
|
@action = @form_node.attributes['action']
|
155
160
|
@name = @form_node.attributes['name']
|
156
161
|
|
@@ -215,7 +220,7 @@ class GlobalForm
|
|
215
220
|
@elements_node.each_recursive {|node|
|
216
221
|
case node.name.downcase
|
217
222
|
when 'input'
|
218
|
-
case (node.attributes['type'] || '').downcase
|
223
|
+
case (node.attributes['type'] || 'text').downcase
|
219
224
|
when 'text', 'password', 'hidden', 'int'
|
220
225
|
@fields << Field.new(node.attributes['name'], node.attributes['value'])
|
221
226
|
when 'radio'
|
@@ -251,13 +256,38 @@ end
|
|
251
256
|
class Link
|
252
257
|
attr_reader :node
|
253
258
|
attr_reader :href
|
259
|
+
attr_reader :text
|
254
260
|
|
255
261
|
def initialize(node)
|
256
262
|
@node = node
|
257
263
|
@href = node.attributes['href']
|
264
|
+
@text = node.all_text
|
258
265
|
end
|
259
266
|
end
|
260
267
|
|
268
|
+
class Meta < Link
|
269
|
+
end
|
270
|
+
|
271
|
+
# = Synopsis
|
272
|
+
# This class encapsulates a page.
|
273
|
+
#
|
274
|
+
# == Example
|
275
|
+
# require 'rubygems'
|
276
|
+
# require 'mechanize'
|
277
|
+
# require 'logger'
|
278
|
+
#
|
279
|
+
# class Body
|
280
|
+
# def initialize(node)
|
281
|
+
# puts node.attributes['bgcolor']
|
282
|
+
# end
|
283
|
+
# end
|
284
|
+
#
|
285
|
+
# agent = WWW::Mechanize.new { |a| a.log = Logger.new("mech.log") }
|
286
|
+
# agent.user_agent_alias = 'Mac Safari'
|
287
|
+
# page = agent.get("http://www.google.com/")
|
288
|
+
# page.watch_for_set = { 'body' => Body }
|
289
|
+
#
|
290
|
+
# body = page.watches
|
261
291
|
class Page
|
262
292
|
attr_accessor :uri, :cookies, :response, :body, :code, :watch_for_set
|
263
293
|
|
@@ -288,11 +318,19 @@ class Page
|
|
288
318
|
@root
|
289
319
|
end
|
290
320
|
|
321
|
+
# This method watches out for a particular tag, and will call back to the
|
322
|
+
# class specified for the tag in the watch_for_set method. See the example
|
323
|
+
# in this class.
|
291
324
|
def watches
|
292
325
|
parse_html() unless @watches
|
293
326
|
@watches
|
294
327
|
end
|
295
328
|
|
329
|
+
def meta
|
330
|
+
parse_html() unless @meta
|
331
|
+
@meta
|
332
|
+
end
|
333
|
+
|
296
334
|
private
|
297
335
|
|
298
336
|
def parse_html
|
@@ -320,6 +358,7 @@ class Page
|
|
320
358
|
|
321
359
|
@forms = []
|
322
360
|
@links = []
|
361
|
+
@meta = []
|
323
362
|
@watches = {}
|
324
363
|
|
325
364
|
@root.each_recursive {|node|
|
@@ -330,6 +369,15 @@ class Page
|
|
330
369
|
@forms << Form.new(node)
|
331
370
|
when 'a'
|
332
371
|
@links << Link.new(node)
|
372
|
+
when 'meta'
|
373
|
+
equiv = node.attributes['http-equiv']
|
374
|
+
content = node.attributes['content']
|
375
|
+
if equiv != nil && equiv.downcase == 'refresh'
|
376
|
+
if content != nil && content =~ /^\d+\s*;\s*url\s*=\s*(\S+)/i
|
377
|
+
node.attributes['href'] = $1
|
378
|
+
@meta << Meta.new(node)
|
379
|
+
end
|
380
|
+
end
|
333
381
|
else
|
334
382
|
if @watch_for_set and @watch_for_set.keys.include?( name )
|
335
383
|
@watches[name] = [] unless @watches[name]
|
@@ -341,6 +389,31 @@ class Page
|
|
341
389
|
end
|
342
390
|
end
|
343
391
|
|
392
|
+
class ResponseCodeError < RuntimeError
|
393
|
+
attr_reader :response_code
|
394
|
+
|
395
|
+
def initialize(response_code)
|
396
|
+
@response_code = response_code
|
397
|
+
end
|
398
|
+
end
|
399
|
+
|
400
|
+
# = Synopsis
|
401
|
+
# The Mechanize library is used for automating interaction with a website. It
|
402
|
+
# can follow links, and submit forms. Form fields can be populated and
|
403
|
+
# submitted. A history of URL's is maintained and can be queried.
|
404
|
+
#
|
405
|
+
# == Example
|
406
|
+
# require 'rubygems'
|
407
|
+
# require 'mechanize'
|
408
|
+
# require 'logger'
|
409
|
+
#
|
410
|
+
# agent = WWW::Mechanize.new { |a| a.log = Logger.new("mech.log") }
|
411
|
+
# agent.user_agent_alias = 'Mac Safari'
|
412
|
+
# page = agent.get("http://www.google.com/")
|
413
|
+
# search_form = page.forms.find { |f| f.name == "f" }
|
414
|
+
# search_form.fields.find { |f| f.name == "q" }.value = "Hello"
|
415
|
+
# search_results = agent.submit(search_form)
|
416
|
+
# puts search_results.body
|
344
417
|
class Mechanize
|
345
418
|
|
346
419
|
AGENT_ALIASES = {
|
@@ -354,14 +427,16 @@ class Mechanize
|
|
354
427
|
|
355
428
|
attr_accessor :log
|
356
429
|
attr_accessor :user_agent
|
357
|
-
attr_accessor :
|
430
|
+
attr_accessor :cookie_jar
|
358
431
|
attr_accessor :open_timeout, :read_timeout
|
359
432
|
attr_accessor :watch_for_set
|
360
433
|
attr_accessor :max_history
|
434
|
+
attr_accessor :ca_file
|
435
|
+
attr_reader :history
|
361
436
|
|
362
437
|
def initialize
|
363
438
|
@history = []
|
364
|
-
@
|
439
|
+
@cookie_jar = CookieJar.new
|
365
440
|
@log = Logger.new(nil)
|
366
441
|
yield self if block_given?
|
367
442
|
end
|
@@ -370,6 +445,16 @@ class Mechanize
|
|
370
445
|
self.user_agent = AGENT_ALIASES[al] || raise("unknown agent alias")
|
371
446
|
end
|
372
447
|
|
448
|
+
def cookies
|
449
|
+
cookies = []
|
450
|
+
@cookie_jar.jar.each_key do |domain|
|
451
|
+
@cookie_jar.jar[domain].each_key do |name|
|
452
|
+
cookies << @cookie_jar.jar[domain][name]
|
453
|
+
end
|
454
|
+
end
|
455
|
+
cookies
|
456
|
+
end
|
457
|
+
|
373
458
|
def basic_authetication(user, password)
|
374
459
|
@user = user
|
375
460
|
@password = password
|
@@ -392,8 +477,8 @@ class Mechanize
|
|
392
477
|
# this is called before the request is sent
|
393
478
|
pre_request_hook = proc {|request|
|
394
479
|
log.debug("query: #{ query.inspect }")
|
395
|
-
request.
|
396
|
-
request.
|
480
|
+
request.add_field('Content-Type', 'application/x-www-form-urlencoded')
|
481
|
+
request.add_field('Content-Length', request_data[0].size.to_s)
|
397
482
|
}
|
398
483
|
|
399
484
|
# fetch the page
|
@@ -407,16 +492,24 @@ class Mechanize
|
|
407
492
|
get(uri)
|
408
493
|
end
|
409
494
|
|
495
|
+
def back
|
496
|
+
@history.pop
|
497
|
+
end
|
498
|
+
|
410
499
|
def submit(form, button=nil)
|
411
500
|
query = form.build_query
|
412
501
|
button.add_to_query(query) if button
|
413
502
|
|
414
|
-
uri = to_absolute_uri(form.action)
|
503
|
+
uri = to_absolute_uri(URI::escape(form.action))
|
415
504
|
case form.method.upcase
|
416
505
|
when 'POST'
|
417
506
|
post(uri, query)
|
418
507
|
when 'GET'
|
419
|
-
|
508
|
+
if uri.query.nil?
|
509
|
+
get(uri.to_s + "?" + build_query_string(query))
|
510
|
+
else
|
511
|
+
get(uri.to_s + "&" + build_query_string(query))
|
512
|
+
end
|
420
513
|
else
|
421
514
|
raise 'unsupported method'
|
422
515
|
end
|
@@ -458,7 +551,16 @@ class Mechanize
|
|
458
551
|
page = Page.new(uri)
|
459
552
|
|
460
553
|
http = Net::HTTP.new(uri.host, uri.port)
|
461
|
-
|
554
|
+
|
555
|
+
if uri.scheme == 'https'
|
556
|
+
http.use_ssl = true
|
557
|
+
if @ca_file
|
558
|
+
http.ca_file = @ca_file
|
559
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
560
|
+
end
|
561
|
+
end
|
562
|
+
|
563
|
+
|
462
564
|
http.start {
|
463
565
|
|
464
566
|
case method
|
@@ -470,21 +572,22 @@ class Mechanize
|
|
470
572
|
raise ArgumentError
|
471
573
|
end
|
472
574
|
|
473
|
-
unless @
|
474
|
-
|
575
|
+
unless @cookie_jar.empty?(uri)
|
576
|
+
cookies = @cookie_jar.cookies(uri)
|
577
|
+
cookie = cookies.length > 0 ? cookies.join("; ") : nil
|
475
578
|
log.debug("use cookie: #{ cookie }")
|
476
|
-
request.
|
579
|
+
request.add_field('Cookie', cookie)
|
477
580
|
end
|
478
581
|
|
479
582
|
# Add Referer header to request
|
480
583
|
|
481
584
|
unless cur_page.uri.nil?
|
482
|
-
request.
|
585
|
+
request.add_field('Referer', cur_page.uri.to_s)
|
483
586
|
end
|
484
587
|
|
485
588
|
# Add User-Agent header to request
|
486
589
|
|
487
|
-
request.
|
590
|
+
request.add_field('User-Agent', @user_agent) if @user_agent
|
488
591
|
|
489
592
|
request.basic_auth(@user, @password) if @user
|
490
593
|
|
@@ -507,10 +610,9 @@ class Mechanize
|
|
507
610
|
|
508
611
|
http.request(request, *request_data) {|response|
|
509
612
|
|
510
|
-
# TODO: expire/validate cookies
|
511
613
|
(response.get_fields('Set-Cookie')||[]).each do |cookie|
|
512
614
|
log.debug("cookie received: #{ cookie }")
|
513
|
-
|
615
|
+
Cookie::parse(uri, cookie) { |c| @cookie_jar.add(c) }
|
514
616
|
end
|
515
617
|
|
516
618
|
response.each_header {|k,v|
|
@@ -530,11 +632,11 @@ class Mechanize
|
|
530
632
|
case page.code
|
531
633
|
when "200"
|
532
634
|
return page
|
533
|
-
when "302"
|
635
|
+
when "301", "302"
|
534
636
|
log.info("follow redirect to: #{ response.header['Location'] }")
|
535
637
|
return fetch_page(to_absolute_uri(response.header['Location'], page), :get, page)
|
536
638
|
else
|
537
|
-
raise
|
639
|
+
raise ResponseCodeError.new(page.code), "Unhandled response", caller
|
538
640
|
end
|
539
641
|
}
|
540
642
|
}
|
@@ -553,7 +655,7 @@ class Mechanize
|
|
553
655
|
|
554
656
|
def add_to_history(page)
|
555
657
|
@history.push(page)
|
556
|
-
if @max_history and @history.size
|
658
|
+
if @max_history and @history.size > @max_history
|
557
659
|
# keep only the last @max_history entries
|
558
660
|
@history = @history[@history.size - @max_history, @max_history]
|
559
661
|
end
|