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.

Files changed (242) hide show
  1. data/README +32 -0
  2. data/doc/classes/Net/HTTP.html +1716 -0
  3. data/doc/classes/Net/HTTP.src/M000103.html +18 -0
  4. data/doc/classes/Net/HTTP.src/M000104.html +18 -0
  5. data/doc/classes/Net/HTTP.src/M000105.html +18 -0
  6. data/doc/classes/Net/HTTP.src/M000106.html +18 -0
  7. data/doc/classes/Net/HTTP.src/M000107.html +29 -0
  8. data/doc/classes/Net/HTTP.src/M000108.html +18 -0
  9. data/doc/classes/Net/HTTP.src/M000109.html +22 -0
  10. data/doc/classes/Net/HTTP.src/M000110.html +18 -0
  11. data/doc/classes/Net/HTTP.src/M000111.html +18 -0
  12. data/doc/classes/Net/HTTP.src/M000112.html +18 -0
  13. data/doc/classes/Net/HTTP.src/M000113.html +18 -0
  14. data/doc/classes/Net/HTTP.src/M000114.html +22 -0
  15. data/doc/classes/Net/HTTP.src/M000115.html +29 -0
  16. data/doc/classes/Net/HTTP.src/M000116.html +18 -0
  17. data/doc/classes/Net/HTTP.src/M000117.html +19 -0
  18. data/doc/classes/Net/HTTP.src/M000118.html +19 -0
  19. data/doc/classes/Net/HTTP.src/M000119.html +18 -0
  20. data/doc/classes/Net/HTTP.src/M000121.html +18 -0
  21. data/doc/classes/Net/HTTP.src/M000122.html +28 -0
  22. data/doc/classes/Net/HTTP.src/M000123.html +19 -0
  23. data/doc/classes/Net/HTTP.src/M000124.html +30 -0
  24. data/doc/classes/Net/HTTP.src/M000125.html +18 -0
  25. data/doc/classes/Net/HTTP.src/M000126.html +18 -0
  26. data/doc/classes/Net/HTTP.src/M000127.html +18 -0
  27. data/doc/classes/Net/HTTP.src/M000128.html +18 -0
  28. data/doc/classes/Net/HTTP.src/M000129.html +18 -0
  29. data/doc/classes/Net/HTTP.src/M000130.html +18 -0
  30. data/doc/classes/Net/HTTP.src/M000133.html +28 -0
  31. data/doc/classes/Net/HTTP.src/M000134.html +20 -0
  32. data/doc/classes/Net/HTTP.src/M000135.html +28 -0
  33. data/doc/classes/Net/HTTP.src/M000136.html +18 -0
  34. data/doc/classes/Net/HTTP.src/M000137.html +18 -0
  35. data/doc/classes/Net/HTTP.src/M000138.html +18 -0
  36. data/doc/classes/Net/HTTP.src/M000139.html +18 -0
  37. data/doc/classes/Net/HTTP.src/M000140.html +18 -0
  38. data/doc/classes/Net/HTTP.src/M000141.html +18 -0
  39. data/doc/classes/Net/HTTP.src/M000142.html +18 -0
  40. data/doc/classes/Net/HTTP.src/M000143.html +18 -0
  41. data/doc/classes/Net/HTTP.src/M000144.html +18 -0
  42. data/doc/classes/Net/HTTP.src/M000145.html +18 -0
  43. data/doc/classes/Net/HTTP.src/M000146.html +18 -0
  44. data/doc/classes/Net/HTTP.src/M000147.html +18 -0
  45. data/doc/classes/Net/HTTP.src/M000148.html +18 -0
  46. data/doc/classes/Net/HTTP.src/M000152.html +19 -0
  47. data/doc/classes/Net/HTTP.src/M000153.html +39 -0
  48. data/doc/classes/Net/HTTP.src/M000154.html +18 -0
  49. data/doc/classes/Net/HTTP.src/M000156.html +24 -0
  50. data/doc/classes/Net/HTTP.src/M000157.html +18 -0
  51. data/doc/classes/Net/HTTP.src/M000158.html +19 -0
  52. data/doc/classes/Net/HTTP.src/M000159.html +21 -0
  53. data/doc/classes/Net/HTTP.src/M000161.html +19 -0
  54. data/doc/classes/Net/HTTP/Copy.html +134 -0
  55. data/doc/classes/Net/HTTP/Delete.html +134 -0
  56. data/doc/classes/Net/HTTP/Get.html +134 -0
  57. data/doc/classes/Net/HTTP/Head.html +134 -0
  58. data/doc/classes/Net/HTTP/Lock.html +134 -0
  59. data/doc/classes/Net/HTTP/Mkcol.html +134 -0
  60. data/doc/classes/Net/HTTP/Move.html +134 -0
  61. data/doc/classes/Net/HTTP/Options.html +134 -0
  62. data/doc/classes/Net/HTTP/Post.html +134 -0
  63. data/doc/classes/Net/HTTP/Propfind.html +134 -0
  64. data/doc/classes/Net/HTTP/Proppatch.html +134 -0
  65. data/doc/classes/Net/HTTP/Put.html +134 -0
  66. data/doc/classes/Net/HTTP/Trace.html +134 -0
  67. data/doc/classes/Net/HTTP/Unlock.html +134 -0
  68. data/doc/classes/Net/HTTPError.html +120 -0
  69. data/doc/classes/Net/HTTPExceptions.html +137 -0
  70. data/doc/classes/Net/HTTPFatalError.html +120 -0
  71. data/doc/classes/Net/HTTPGenericRequest.html +274 -0
  72. data/doc/classes/Net/HTTPGenericRequest.src/M000088.html +26 -0
  73. data/doc/classes/Net/HTTPGenericRequest.src/M000089.html +18 -0
  74. data/doc/classes/Net/HTTPGenericRequest.src/M000090.html +18 -0
  75. data/doc/classes/Net/HTTPGenericRequest.src/M000091.html +18 -0
  76. data/doc/classes/Net/HTTPGenericRequest.src/M000092.html +19 -0
  77. data/doc/classes/Net/HTTPGenericRequest.src/M000093.html +20 -0
  78. data/doc/classes/Net/HTTPGenericRequest.src/M000094.html +20 -0
  79. data/doc/classes/Net/HTTPHeader.html +734 -0
  80. data/doc/classes/Net/HTTPHeader.src/M000055.html +23 -0
  81. data/doc/classes/Net/HTTPHeader.src/M000056.html +19 -0
  82. data/doc/classes/Net/HTTPHeader.src/M000057.html +22 -0
  83. data/doc/classes/Net/HTTPHeader.src/M000058.html +22 -0
  84. data/doc/classes/Net/HTTPHeader.src/M000059.html +19 -0
  85. data/doc/classes/Net/HTTPHeader.src/M000060.html +19 -0
  86. data/doc/classes/Net/HTTPHeader.src/M000061.html +20 -0
  87. data/doc/classes/Net/HTTPHeader.src/M000063.html +18 -0
  88. data/doc/classes/Net/HTTPHeader.src/M000065.html +20 -0
  89. data/doc/classes/Net/HTTPHeader.src/M000066.html +20 -0
  90. data/doc/classes/Net/HTTPHeader.src/M000067.html +18 -0
  91. data/doc/classes/Net/HTTPHeader.src/M000068.html +18 -0
  92. data/doc/classes/Net/HTTPHeader.src/M000069.html +18 -0
  93. data/doc/classes/Net/HTTPHeader.src/M000070.html +20 -0
  94. data/doc/classes/Net/HTTPHeader.src/M000072.html +30 -0
  95. data/doc/classes/Net/HTTPHeader.src/M000073.html +43 -0
  96. data/doc/classes/Net/HTTPHeader.src/M000075.html +21 -0
  97. data/doc/classes/Net/HTTPHeader.src/M000076.html +22 -0
  98. data/doc/classes/Net/HTTPHeader.src/M000077.html +20 -0
  99. data/doc/classes/Net/HTTPHeader.src/M000078.html +21 -0
  100. data/doc/classes/Net/HTTPHeader.src/M000079.html +19 -0
  101. data/doc/classes/Net/HTTPHeader.src/M000080.html +18 -0
  102. data/doc/classes/Net/HTTPHeader.src/M000081.html +19 -0
  103. data/doc/classes/Net/HTTPHeader.src/M000082.html +19 -0
  104. data/doc/classes/Net/HTTPHeader.src/M000083.html +23 -0
  105. data/doc/classes/Net/HTTPHeader.src/M000084.html +18 -0
  106. data/doc/classes/Net/HTTPHeader.src/M000086.html +18 -0
  107. data/doc/classes/Net/HTTPHeader.src/M000087.html +18 -0
  108. data/doc/classes/Net/HTTPRequest.html +150 -0
  109. data/doc/classes/Net/HTTPRequest.src/M000102.html +21 -0
  110. data/doc/classes/Net/HTTPResponse.html +425 -0
  111. data/doc/classes/Net/HTTPResponse.src/M000162.html +18 -0
  112. data/doc/classes/Net/HTTPResponse.src/M000163.html +18 -0
  113. data/doc/classes/Net/HTTPResponse.src/M000164.html +23 -0
  114. data/doc/classes/Net/HTTPResponse.src/M000165.html +18 -0
  115. data/doc/classes/Net/HTTPResponse.src/M000166.html +32 -0
  116. data/doc/classes/Net/HTTPResponse.src/M000167.html +18 -0
  117. data/doc/classes/Net/HTTPRetriableError.html +120 -0
  118. data/doc/classes/Net/HTTPServerException.html +120 -0
  119. data/doc/classes/Net/ProtoAuthError.html +113 -0
  120. data/doc/classes/Net/ProtoCommandError.html +113 -0
  121. data/doc/classes/Net/ProtoFatalError.html +113 -0
  122. data/doc/classes/Net/ProtoRetriableError.html +113 -0
  123. data/doc/classes/Net/ProtoServerError.html +113 -0
  124. data/doc/classes/Net/ProtoSyntaxError.html +113 -0
  125. data/doc/classes/Net/ProtoUnknownError.html +113 -0
  126. data/doc/classes/Net/ProtocolError.html +111 -0
  127. data/doc/classes/Net/WriteAdapter.html +235 -0
  128. data/doc/classes/Net/WriteAdapter.src/M000095.html +19 -0
  129. data/doc/classes/Net/WriteAdapter.src/M000096.html +18 -0
  130. data/doc/classes/Net/WriteAdapter.src/M000097.html +18 -0
  131. data/doc/classes/Net/WriteAdapter.src/M000099.html +19 -0
  132. data/doc/classes/Net/WriteAdapter.src/M000100.html +18 -0
  133. data/doc/classes/Net/WriteAdapter.src/M000101.html +18 -0
  134. data/doc/classes/REXML.html +109 -0
  135. data/doc/classes/REXML/Comment.html +137 -0
  136. data/doc/classes/REXML/Comment.src/M000053.html +18 -0
  137. data/doc/classes/REXML/Node.html +240 -0
  138. data/doc/classes/REXML/Node.src/M000047.html +21 -0
  139. data/doc/classes/REXML/Node.src/M000048.html +21 -0
  140. data/doc/classes/REXML/Node.src/M000049.html +22 -0
  141. data/doc/classes/REXML/Node.src/M000050.html +18 -0
  142. data/doc/classes/REXML/Node.src/M000051.html +18 -0
  143. data/doc/classes/REXML/Node.src/M000052.html +18 -0
  144. data/doc/classes/REXML/Text.html +137 -0
  145. data/doc/classes/REXML/Text.src/M000054.html +18 -0
  146. data/doc/classes/WWW.html +130 -0
  147. data/doc/classes/WWW/Button.html +190 -0
  148. data/doc/classes/WWW/Button.src/M000028.html +18 -0
  149. data/doc/classes/WWW/Button.src/M000029.html +18 -0
  150. data/doc/classes/WWW/Button.src/M000030.html +25 -0
  151. data/doc/classes/WWW/CheckBox.html +160 -0
  152. data/doc/classes/WWW/CheckBox.src/M000024.html +18 -0
  153. data/doc/classes/WWW/Cookie.html +207 -0
  154. data/doc/classes/WWW/Cookie.src/M000032.html +59 -0
  155. data/doc/classes/WWW/Cookie.src/M000033.html +21 -0
  156. data/doc/classes/WWW/Cookie.src/M000034.html +18 -0
  157. data/doc/classes/WWW/CookieJar.html +197 -0
  158. data/doc/classes/WWW/CookieJar.src/M000008.html +18 -0
  159. data/doc/classes/WWW/CookieJar.src/M000009.html +22 -0
  160. data/doc/classes/WWW/CookieJar.src/M000010.html +33 -0
  161. data/doc/classes/WWW/CookieJar.src/M000011.html +18 -0
  162. data/doc/classes/WWW/Field.html +174 -0
  163. data/doc/classes/WWW/Field.src/M000045.html +18 -0
  164. data/doc/classes/WWW/Field.src/M000046.html +26 -0
  165. data/doc/classes/WWW/FileUpload.html +163 -0
  166. data/doc/classes/WWW/FileUpload.src/M000031.html +19 -0
  167. data/doc/classes/WWW/Form.html +152 -0
  168. data/doc/classes/WWW/Form.src/M000044.html +19 -0
  169. data/doc/classes/WWW/GlobalForm.html +271 -0
  170. data/doc/classes/WWW/GlobalForm.src/M000004.html +24 -0
  171. data/doc/classes/WWW/GlobalForm.src/M000005.html +26 -0
  172. data/doc/classes/WWW/GlobalForm.src/M000006.html +46 -0
  173. data/doc/classes/WWW/GlobalForm.src/M000007.html +46 -0
  174. data/doc/classes/WWW/ImageButton.html +157 -0
  175. data/doc/classes/WWW/ImageButton.src/M000027.html +22 -0
  176. data/doc/classes/WWW/Link.html +160 -0
  177. data/doc/classes/WWW/Link.src/M000025.html +20 -0
  178. data/doc/classes/WWW/Mechanize.html +379 -0
  179. data/doc/classes/WWW/Mechanize.src/M000013.html +21 -0
  180. data/doc/classes/WWW/Mechanize.src/M000014.html +18 -0
  181. data/doc/classes/WWW/Mechanize.src/M000015.html +24 -0
  182. data/doc/classes/WWW/Mechanize.src/M000016.html +19 -0
  183. data/doc/classes/WWW/Mechanize.src/M000017.html +23 -0
  184. data/doc/classes/WWW/Mechanize.src/M000018.html +32 -0
  185. data/doc/classes/WWW/Mechanize.src/M000019.html +19 -0
  186. data/doc/classes/WWW/Mechanize.src/M000020.html +18 -0
  187. data/doc/classes/WWW/Mechanize.src/M000021.html +33 -0
  188. data/doc/classes/WWW/Mechanize.src/M000022.html +18 -0
  189. data/doc/classes/WWW/Meta.html +113 -0
  190. data/doc/classes/WWW/Page.html +313 -0
  191. data/doc/classes/WWW/Page.src/M000036.html +18 -0
  192. data/doc/classes/WWW/Page.src/M000037.html +18 -0
  193. data/doc/classes/WWW/Page.src/M000038.html +18 -0
  194. data/doc/classes/WWW/Page.src/M000039.html +19 -0
  195. data/doc/classes/WWW/Page.src/M000040.html +19 -0
  196. data/doc/classes/WWW/Page.src/M000041.html +19 -0
  197. data/doc/classes/WWW/Page.src/M000042.html +19 -0
  198. data/doc/classes/WWW/Page.src/M000043.html +19 -0
  199. data/doc/classes/WWW/RadioButton.html +160 -0
  200. data/doc/classes/WWW/RadioButton.src/M000012.html +18 -0
  201. data/doc/classes/WWW/ResponseCodeError.html +150 -0
  202. data/doc/classes/WWW/ResponseCodeError.src/M000035.html +18 -0
  203. data/doc/classes/WWW/SelectList.html +160 -0
  204. data/doc/classes/WWW/SelectList.src/M000026.html +28 -0
  205. data/doc/created.rid +1 -0
  206. data/doc/files/CHANGELOG.html +136 -0
  207. data/doc/files/LICENSE.html +531 -0
  208. data/doc/files/README.html +161 -0
  209. data/doc/files/lib/mechanize/cookie_rb.html +101 -0
  210. data/doc/files/lib/mechanize/net-overrides/net/http_rb.html +139 -0
  211. data/doc/files/lib/mechanize/net-overrides/net/https_rb.html +109 -0
  212. data/doc/files/lib/mechanize/net-overrides/net/protocol_rb.html +117 -0
  213. data/doc/files/lib/mechanize/parsing_rb.html +267 -0
  214. data/doc/files/lib/mechanize/parsing_rb.src/M000001.html +22 -0
  215. data/doc/files/lib/mechanize/parsing_rb.src/M000002.html +44 -0
  216. data/doc/files/lib/mechanize/parsing_rb.src/M000003.html +34 -0
  217. data/doc/files/lib/mechanize_rb.html +152 -0
  218. data/doc/fr_class_index.html +80 -0
  219. data/doc/fr_file_index.html +35 -0
  220. data/doc/fr_method_index.html +194 -0
  221. data/doc/index.html +24 -0
  222. data/doc/rdoc-style.css +208 -0
  223. data/lib/mechanize.rb +128 -26
  224. data/lib/mechanize/cookie.rb +98 -0
  225. data/lib/mechanize/net-overrides/net/http.rb +2 -2
  226. data/test/README +7 -0
  227. data/test/htdocs/find_link.html +40 -0
  228. data/test/htdocs/form_test.html +154 -0
  229. data/test/htdocs/google.html +13 -0
  230. data/test/htdocs/index.html +6 -0
  231. data/test/server.rb +19 -0
  232. data/test/servlets.rb +130 -0
  233. data/test/tc_cookies.rb +125 -0
  234. data/test/tc_forms.rb +339 -0
  235. data/test/tc_links.rb +25 -0
  236. data/test/tc_mech.rb +70 -0
  237. data/test/tc_response_code.rb +31 -0
  238. data/test/ts_mech.rb +9 -0
  239. metadata +310 -41
  240. data/Rakefile +0 -14
  241. data/examples/rubyforge.rb +0 -13
  242. data/mechanize.gemspec +0 -22
@@ -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>
@@ -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; }
@@ -1,23 +1,28 @@
1
- #
1
+ # Original Code:
2
2
  # Copyright (c) 2005 by Michael Neumann (mneumann@ntecs.de)
3
3
  #
4
- # This is a quick hack, to get something like Perl's WWW::Mechanize. Sure, we
5
- # have Web::Unit, but, that does not work for me as expected, as it does not
6
- # set cookies (I might be wrong), does not automatically redirect and has
7
- # problems with some html documents.
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.3.1"
10
+ Version = "0.4.0"
10
11
 
11
12
  # required due to the missing get_fields method in Ruby 1.8.2
12
- $LOAD_PATH.unshift File.join(File.dirname(__FILE__), "mechanize", "net-overrides")
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'] || 'POST').upcase
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 :cookies
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
- @cookies = []
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.add_header('Content-Type', 'application/x-www-form-urlencoded')
396
- request.add_header('Content-Length', request_data[0].size.to_s)
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
- get(uri + "?" + build_query_string(query))
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
- http.use_ssl = true if uri.scheme == "https"
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 @cookies.empty?
474
- cookie = @cookies.uniq.join("; ")
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.add_header('Cookie', cookie)
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.add_header('Referer', cur_page.uri.to_s)
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.add_header('User-Agent', @user_agent) if @user_agent
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
- @cookies << cookie.split(";").first.strip
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 < @max_history
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