narf 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (657) hide show
  1. data/ChangeLog +163 -0
  2. data/InstalledFiles +2227 -0
  3. data/README +124 -0
  4. data/TODO +88 -0
  5. data/bin/narftest +17 -0
  6. data/bug.rb +9 -0
  7. data/build.rb +314 -0
  8. data/build.rb~ +314 -0
  9. data/config.save +12 -0
  10. data/doc/apache_cgi.txt +17 -0
  11. data/doc/fastcgi.txt +19 -0
  12. data/doc/mod_ruby.txt +7 -0
  13. data/doc/rdoc/classes/Web.html +366 -0
  14. data/doc/rdoc/classes/Web.src/M000002.html +15 -0
  15. data/doc/rdoc/classes/Web.src/M000003.html +15 -0
  16. data/doc/rdoc/classes/Web.src/M000004.html +15 -0
  17. data/doc/rdoc/classes/Web.src/M000005.html +15 -0
  18. data/doc/rdoc/classes/Web.src/M000006.html +20 -0
  19. data/doc/rdoc/classes/Web.src/M000007.html +18 -0
  20. data/doc/rdoc/classes/Web.src/M000008.html +18 -0
  21. data/doc/rdoc/classes/Web.src/M000009.html +18 -0
  22. data/doc/rdoc/classes/Web.src/M000010.html +15 -0
  23. data/doc/rdoc/classes/Web.src/M000011.html +15 -0
  24. data/doc/rdoc/classes/Web.src/M000012.html +15 -0
  25. data/doc/rdoc/classes/Web/CGD.html +173 -0
  26. data/doc/rdoc/classes/Web/CGD.src/M000037.html +24 -0
  27. data/doc/rdoc/classes/Web/CGD.src/M000038.html +23 -0
  28. data/doc/rdoc/classes/Web/CGD.src/M000039.html +15 -0
  29. data/doc/rdoc/classes/Web/CGD.src/M000040.html +15 -0
  30. data/doc/rdoc/classes/Web/CGD.src/M000041.html +23 -0
  31. data/doc/rdoc/classes/Web/CGI.html +946 -0
  32. data/doc/rdoc/classes/Web/CGI.src/M000051.html +15 -0
  33. data/doc/rdoc/classes/Web/CGI.src/M000052.html +24 -0
  34. data/doc/rdoc/classes/Web/CGI.src/M000053.html +15 -0
  35. data/doc/rdoc/classes/Web/CGI.src/M000054.html +15 -0
  36. data/doc/rdoc/classes/Web/CGI.src/M000055.html +15 -0
  37. data/doc/rdoc/classes/Web/CGI.src/M000056.html +15 -0
  38. data/doc/rdoc/classes/Web/CGI.src/M000057.html +17 -0
  39. data/doc/rdoc/classes/Web/CGI.src/M000058.html +34 -0
  40. data/doc/rdoc/classes/Web/CGI.src/M000059.html +22 -0
  41. data/doc/rdoc/classes/Web/CGI.src/M000060.html +15 -0
  42. data/doc/rdoc/classes/Web/CGI.src/M000061.html +15 -0
  43. data/doc/rdoc/classes/Web/CGI.src/M000062.html +19 -0
  44. data/doc/rdoc/classes/Web/CGI.src/M000063.html +18 -0
  45. data/doc/rdoc/classes/Web/CGI.src/M000064.html +19 -0
  46. data/doc/rdoc/classes/Web/CGI.src/M000065.html +15 -0
  47. data/doc/rdoc/classes/Web/CGI.src/M000066.html +15 -0
  48. data/doc/rdoc/classes/Web/CGI.src/M000067.html +15 -0
  49. data/doc/rdoc/classes/Web/CGI.src/M000068.html +13 -0
  50. data/doc/rdoc/classes/Web/CGI.src/M000069.html +13 -0
  51. data/doc/rdoc/classes/Web/CGI.src/M000070.html +13 -0
  52. data/doc/rdoc/classes/Web/CGI.src/M000071.html +13 -0
  53. data/doc/rdoc/classes/Web/CGI.src/M000072.html +19 -0
  54. data/doc/rdoc/classes/Web/CGI.src/M000073.html +15 -0
  55. data/doc/rdoc/classes/Web/CGI.src/M000074.html +19 -0
  56. data/doc/rdoc/classes/Web/CGI.src/M000075.html +15 -0
  57. data/doc/rdoc/classes/Web/CGI.src/M000076.html +15 -0
  58. data/doc/rdoc/classes/Web/CGI.src/M000077.html +15 -0
  59. data/doc/rdoc/classes/Web/CGI.src/M000078.html +20 -0
  60. data/doc/rdoc/classes/Web/CGI.src/M000079.html +36 -0
  61. data/doc/rdoc/classes/Web/CGI.src/M000080.html +19 -0
  62. data/doc/rdoc/classes/Web/CGI.src/M000081.html +18 -0
  63. data/doc/rdoc/classes/Web/CGI.src/M000082.html +15 -0
  64. data/doc/rdoc/classes/Web/CGI.src/M000083.html +17 -0
  65. data/doc/rdoc/classes/Web/CGI.src/M000084.html +15 -0
  66. data/doc/rdoc/classes/Web/CGI.src/M000085.html +16 -0
  67. data/doc/rdoc/classes/Web/CGI.src/M000086.html +15 -0
  68. data/doc/rdoc/classes/Web/CGI.src/M000087.html +15 -0
  69. data/doc/rdoc/classes/Web/CGI.src/M000088.html +15 -0
  70. data/doc/rdoc/classes/Web/CGI.src/M000089.html +16 -0
  71. data/doc/rdoc/classes/Web/CGI.src/M000090.html +15 -0
  72. data/doc/rdoc/classes/Web/CGI.src/M000091.html +15 -0
  73. data/doc/rdoc/classes/Web/CGI.src/M000092.html +15 -0
  74. data/doc/rdoc/classes/Web/CGI.src/M000093.html +15 -0
  75. data/doc/rdoc/classes/Web/CGI.src/M000094.html +15 -0
  76. data/doc/rdoc/classes/Web/CGI.src/M000095.html +15 -0
  77. data/doc/rdoc/classes/Web/CGI.src/M000096.html +19 -0
  78. data/doc/rdoc/classes/Web/CGI.src/M000097.html +15 -0
  79. data/doc/rdoc/classes/Web/CGI.src/M000098.html +15 -0
  80. data/doc/rdoc/classes/Web/CGI.src/M000099.html +43 -0
  81. data/doc/rdoc/classes/Web/CGI.src/M000100.html +18 -0
  82. data/doc/rdoc/classes/Web/CGI.src/M000101.html +20 -0
  83. data/doc/rdoc/classes/Web/CGI.src/M000102.html +15 -0
  84. data/doc/rdoc/classes/Web/CGI.src/M000103.html +15 -0
  85. data/doc/rdoc/classes/Web/CGI.src/M000104.html +15 -0
  86. data/doc/rdoc/classes/Web/CGI.src/M000105.html +24 -0
  87. data/doc/rdoc/classes/Web/CGI.src/M000106.html +24 -0
  88. data/doc/rdoc/classes/Web/CGI.src/M000107.html +22 -0
  89. data/doc/rdoc/classes/Web/CaseInsensitiveHash.html +104 -0
  90. data/doc/rdoc/classes/Web/CaseInsensitiveHash.src/M000118.html +15 -0
  91. data/doc/rdoc/classes/Web/CaseInsensitiveHash.src/M000119.html +15 -0
  92. data/doc/rdoc/classes/Web/CaseInsensitiveHash.src/M000120.html +15 -0
  93. data/doc/rdoc/classes/Web/Mime.html +122 -0
  94. data/doc/rdoc/classes/Web/Mime.src/M000118.html +15 -0
  95. data/doc/rdoc/classes/Web/Mime.src/M000119.html +15 -0
  96. data/doc/rdoc/classes/Web/Mime.src/M000120.html +23 -0
  97. data/doc/rdoc/classes/Web/Mime.src/M000121.html +15 -0
  98. data/doc/rdoc/classes/Web/Mime.src/M000122.html +15 -0
  99. data/doc/rdoc/classes/Web/Mime.src/M000123.html +23 -0
  100. data/doc/rdoc/classes/Web/Mime.src/M000124.html +15 -0
  101. data/doc/rdoc/classes/Web/Narflates.html +132 -0
  102. data/doc/rdoc/classes/Web/Parser.html +219 -0
  103. data/doc/rdoc/classes/Web/Parser.src/M000013.html +21 -0
  104. data/doc/rdoc/classes/Web/Parser.src/M000014.html +19 -0
  105. data/doc/rdoc/classes/Web/Parser.src/M000015.html +21 -0
  106. data/doc/rdoc/classes/Web/Parser.src/M000016.html +15 -0
  107. data/doc/rdoc/classes/Web/Parser.src/M000017.html +30 -0
  108. data/doc/rdoc/classes/Web/Parser.src/M000018.html +15 -0
  109. data/doc/rdoc/classes/Web/Parser.src/M000019.html +19 -0
  110. data/doc/rdoc/classes/Web/Parser.src/M000020.html +27 -0
  111. data/doc/rdoc/classes/Web/Parser.src/M000021.html +15 -0
  112. data/doc/rdoc/classes/Web/Parser.src/M000022.html +16 -0
  113. data/doc/rdoc/classes/Web/Parser.src/M000023.html +18 -0
  114. data/doc/rdoc/classes/Web/Session.html +178 -0
  115. data/doc/rdoc/classes/Web/Session.src/M000042.html +20 -0
  116. data/doc/rdoc/classes/Web/Session.src/M000043.html +19 -0
  117. data/doc/rdoc/classes/Web/Session.src/M000044.html +21 -0
  118. data/doc/rdoc/classes/Web/Session.src/M000045.html +21 -0
  119. data/doc/rdoc/classes/Web/Session.src/M000046.html +15 -0
  120. data/doc/rdoc/classes/Web/Session.src/M000047.html +17 -0
  121. data/doc/rdoc/classes/Web/Session.src/M000048.html +15 -0
  122. data/doc/rdoc/classes/Web/Session.src/M000049.html +15 -0
  123. data/doc/rdoc/classes/Web/Session.src/M000050.html +16 -0
  124. data/doc/rdoc/classes/Web/Testing.html +474 -0
  125. data/doc/rdoc/classes/Web/Testing.src/M000024.html +15 -0
  126. data/doc/rdoc/classes/Web/Testing.src/M000025.html +25 -0
  127. data/doc/rdoc/classes/Web/Testing.src/M000026.html +15 -0
  128. data/doc/rdoc/classes/Web/Testing.src/M000027.html +28 -0
  129. data/doc/rdoc/classes/Web/Testing.src/M000028.html +58 -0
  130. data/doc/rdoc/classes/Web/Testing.src/M000029.html +15 -0
  131. data/doc/rdoc/classes/Web/Testing.src/M000030.html +15 -0
  132. data/doc/rdoc/classes/Web/Testing.src/M000031.html +15 -0
  133. data/doc/rdoc/classes/Web/Testing.src/M000032.html +15 -0
  134. data/doc/rdoc/classes/Web/Testing.src/M000033.html +15 -0
  135. data/doc/rdoc/classes/Web/Testing.src/M000034.html +15 -0
  136. data/doc/rdoc/classes/Web/Testing.src/M000035.html +15 -0
  137. data/doc/rdoc/classes/Web/Testing.src/M000036.html +18 -0
  138. data/doc/rdoc/classes/Web/Upload.html +160 -0
  139. data/doc/rdoc/classes/Web/Upload.src/M000108.html +25 -0
  140. data/doc/rdoc/classes/Web/Upload.src/M000109.html +18 -0
  141. data/doc/rdoc/classes/Web/Upload.src/M000110.html +16 -0
  142. data/doc/rdoc/classes/Web/Upload.src/M000111.html +16 -0
  143. data/doc/rdoc/classes/Web/Wiki.html +249 -0
  144. data/doc/rdoc/classes/Web/Wiki.src/M000112.html +25 -0
  145. data/doc/rdoc/classes/Web/Wiki.src/M000113.html +15 -0
  146. data/doc/rdoc/classes/Web/Wiki.src/M000114.html +26 -0
  147. data/doc/rdoc/classes/Web/Wiki.src/M000115.html +21 -0
  148. data/doc/rdoc/classes/Web/Wiki.src/M000116.html +18 -0
  149. data/doc/rdoc/classes/Web/Wiki.src/M000117.html +19 -0
  150. data/doc/rdoc/created.rid +1 -0
  151. data/doc/rdoc/files/README.html +226 -0
  152. data/doc/rdoc/files/doc/apache_cgi_txt.html +82 -0
  153. data/doc/rdoc/files/doc/fastcgi_txt.html +82 -0
  154. data/doc/rdoc/files/doc/mod_ruby_txt.html +62 -0
  155. data/doc/rdoc/files/doc/webrick_txt.html +79 -0
  156. data/doc/rdoc/files/examples/examples_rdoc.html +73 -0
  157. data/doc/rdoc/files/lib/web/cgi_rb.html +75 -0
  158. data/doc/rdoc/files/lib/web/mime_rb.html +67 -0
  159. data/doc/rdoc/files/lib/web/parser_rb.html +73 -0
  160. data/doc/rdoc/files/lib/web/session_rb.html +73 -0
  161. data/doc/rdoc/files/lib/web/template_rb.html +73 -0
  162. data/doc/rdoc/files/lib/web/testing_rb.html +67 -0
  163. data/doc/rdoc/files/lib/web/upload_rb.html +73 -0
  164. data/doc/rdoc/files/lib/web/wiki_rb.html +79 -0
  165. data/doc/rdoc/files/lib/web_rb.html +116 -0
  166. data/doc/rdoc/files/lib/web_rb.src/M000001.html +15 -0
  167. data/doc/rdoc/fr_class_index.html +47 -0
  168. data/doc/rdoc/fr_file_index.html +52 -0
  169. data/doc/rdoc/fr_method_index.html +158 -0
  170. data/doc/rdoc/index.html +22 -0
  171. data/doc/rdoc/rdoc-style.css +99 -0
  172. data/doc/webrick.txt +23 -0
  173. data/examples/admin.rb +8 -0
  174. data/examples/admin.rb~ +5 -0
  175. data/examples/cookbook.rdoc +247 -0
  176. data/examples/cookbook.rdoc~ +238 -0
  177. data/examples/examples.rdoc +19 -0
  178. data/examples/examples.rdoc~ +17 -0
  179. data/examples/hello.world.rb +5 -0
  180. data/examples/hello.world.rb~ +3 -0
  181. data/examples/session.rb +34 -0
  182. data/examples/session.rb~ +31 -0
  183. data/examples/test/test.hello.world.rb +9 -0
  184. data/examples/test/test.hello.world.rb~ +9 -0
  185. data/examples/test/test.session.rb +37 -0
  186. data/examples/test/test.session.rb~ +37 -0
  187. data/examples/webunit/COPYING +340 -0
  188. data/examples/webunit/Makefile +14 -0
  189. data/examples/webunit/TIPS-ja.html +126 -0
  190. data/examples/webunit/TIPS-ja.rd +154 -0
  191. data/examples/webunit/TODO-ja.html +35 -0
  192. data/examples/webunit/TODO-ja.rd +28 -0
  193. data/examples/webunit/changes.rd +185 -0
  194. data/examples/webunit/conv/digit-0.cgi +40 -0
  195. data/examples/webunit/conv/digit-0.rb +21 -0
  196. data/examples/webunit/conv/digit-1.cgi +44 -0
  197. data/examples/webunit/conv/digit-1.rb +17 -0
  198. data/examples/webunit/conv/digit.cgi +59 -0
  199. data/examples/webunit/conv/digit.rb +23 -0
  200. data/examples/webunit/conv/test_digit-0.rb +16 -0
  201. data/examples/webunit/conv/test_digit-1.rb +19 -0
  202. data/examples/webunit/conv/test_digit.rb +26 -0
  203. data/examples/webunit/conv/test_digit_view-0.rb +76 -0
  204. data/examples/webunit/conv/test_digit_view-1.rb +102 -0
  205. data/examples/webunit/conv/test_digit_view.rb +134 -0
  206. data/examples/webunit/example.rd +37 -0
  207. data/examples/webunit/index-en.html +263 -0
  208. data/examples/webunit/index-en.rd +60 -0
  209. data/examples/webunit/index-ja.html +263 -0
  210. data/examples/webunit/index-ja.rd +60 -0
  211. data/examples/wiki.rb +7 -0
  212. data/examples/wiki.rb~ +5 -0
  213. data/install.rb +1022 -0
  214. data/lib/web.rb +290 -0
  215. data/lib/web.rb~ +290 -0
  216. data/lib/web/#assertinclude.rb# +110 -0
  217. data/lib/web/action.rb +82 -0
  218. data/lib/web/assertinclude.rb +110 -0
  219. data/lib/web/assertinclude.rb~ +110 -0
  220. data/lib/web/buffer.rb +20 -0
  221. data/lib/web/cgi.rb +641 -0
  222. data/lib/web/cgi.rb~ +640 -0
  223. data/lib/web/formreader.rb +317 -0
  224. data/lib/web/forms.rb +104 -0
  225. data/lib/web/htmlparser/html-parser.rb +429 -0
  226. data/lib/web/htmlparser/html-parser.rb~ +429 -0
  227. data/lib/web/htmlparser/sgml-parser.rb +332 -0
  228. data/lib/web/htmlparser/sgml-parser.rb~ +332 -0
  229. data/lib/web/htmltools/element.rb +296 -0
  230. data/lib/web/htmltools/element.rb~ +296 -0
  231. data/lib/web/htmltools/stparser.rb +276 -0
  232. data/lib/web/htmltools/stparser.rb~ +276 -0
  233. data/lib/web/htmltools/tags.rb +286 -0
  234. data/lib/web/htmltools/tags.rb~ +286 -0
  235. data/lib/web/htmltools/tree.rb +139 -0
  236. data/lib/web/htmltools/tree.rb~ +139 -0
  237. data/lib/web/htmltools/xmltree.rb +160 -0
  238. data/lib/web/htmltools/xmltree.rb~ +160 -0
  239. data/lib/web/htmltools/xpath.rb +71 -0
  240. data/lib/web/htmltools/xpath.rb~ +71 -0
  241. data/lib/web/mime.rb +82 -0
  242. data/lib/web/parser.rb +266 -0
  243. data/lib/web/parser.rb~ +266 -0
  244. data/lib/web/request.rb~ +238 -0
  245. data/lib/web/resources/mime.types +483 -0
  246. data/lib/web/runner.rb +26 -0
  247. data/lib/web/runner.rb~ +26 -0
  248. data/lib/web/sapi/fastcgi.rb +26 -0
  249. data/lib/web/sapi/fastcgi.rb~ +25 -0
  250. data/lib/web/sapi/mod_ruby.rb +46 -0
  251. data/lib/web/sapi/mod_ruby.rb~ +46 -0
  252. data/lib/web/sapi/webrick.rb +91 -0
  253. data/lib/web/sapi/webrick.rb~ +89 -0
  254. data/lib/web/session.rb +75 -0
  255. data/lib/web/session.rb~ +75 -0
  256. data/lib/web/simpledispatcher.rb +155 -0
  257. data/lib/web/strscanparser.rb +24 -0
  258. data/lib/web/tagparser.rb +96 -0
  259. data/lib/web/tagparser.rb~ +96 -0
  260. data/lib/web/template.rb +613 -0
  261. data/lib/web/template.rb~ +613 -0
  262. data/lib/web/testing.rb +546 -0
  263. data/lib/web/testing.rb~ +546 -0
  264. data/lib/web/traceoutput.rb +32 -0
  265. data/lib/web/unit.rb +27 -0
  266. data/lib/web/unit/assert.rb +154 -0
  267. data/lib/web/unit/converter.rb +148 -0
  268. data/lib/web/unit/cookie.rb +120 -0
  269. data/lib/web/unit/domwalker.rb +187 -0
  270. data/lib/web/unit/exception.rb +15 -0
  271. data/lib/web/unit/form.rb +118 -0
  272. data/lib/web/unit/formatter.rb +314 -0
  273. data/lib/web/unit/frame.rb +39 -0
  274. data/lib/web/unit/html-parser.rb +432 -0
  275. data/lib/web/unit/htmlelem.rb +124 -0
  276. data/lib/web/unit/htmlrepair.rb +116 -0
  277. data/lib/web/unit/htmlsplit.rb +840 -0
  278. data/lib/web/unit/image.rb +27 -0
  279. data/lib/web/unit/jscript.rb +32 -0
  280. data/lib/web/unit/link.rb +35 -0
  281. data/lib/web/unit/params.rb +323 -0
  282. data/lib/web/unit/parser.rb +226 -0
  283. data/lib/web/unit/resources/assert.html +101 -0
  284. data/lib/web/unit/resources/auth/index.html +5 -0
  285. data/lib/web/unit/resources/badtags.html +7 -0
  286. data/lib/web/unit/resources/cookie.cgi +33 -0
  287. data/lib/web/unit/resources/document.xml +13 -0
  288. data/lib/web/unit/resources/form.html +150 -0
  289. data/lib/web/unit/resources/frame-0.html +10 -0
  290. data/lib/web/unit/resources/frame-1.html +10 -0
  291. data/lib/web/unit/resources/frame.html +10 -0
  292. data/lib/web/unit/resources/image.html +17 -0
  293. data/lib/web/unit/resources/images/x.gif +0 -0
  294. data/lib/web/unit/resources/images/y.gif +0 -0
  295. data/lib/web/unit/resources/jscript-0.html +10 -0
  296. data/lib/web/unit/resources/jscript-1.html +10 -0
  297. data/lib/web/unit/resources/jscript.html +19 -0
  298. data/lib/web/unit/resources/link.html +19 -0
  299. data/lib/web/unit/resources/multipart.cgi +28 -0
  300. data/lib/web/unit/resources/multipart.html +74 -0
  301. data/lib/web/unit/resources/params.html +65 -0
  302. data/lib/web/unit/resources/redirect.cgi +13 -0
  303. data/lib/web/unit/resources/response.html +67 -0
  304. data/lib/web/unit/resources/simple.cgi +14 -0
  305. data/lib/web/unit/resources/stock.cgi +35 -0
  306. data/lib/web/unit/resources/table.html +83 -0
  307. data/lib/web/unit/response.rb +469 -0
  308. data/lib/web/unit/response.rb~ +461 -0
  309. data/lib/web/unit/runtest.rb +44 -0
  310. data/lib/web/unit/sgml-parser.rb +336 -0
  311. data/lib/web/unit/table.rb +150 -0
  312. data/lib/web/unit/testcase.rb +49 -0
  313. data/lib/web/unit/ui/cui/testrunner.rb +52 -0
  314. data/lib/web/unit/ui/cui/testrunner.rb~ +50 -0
  315. data/lib/web/unit/utils.rb +70 -0
  316. data/lib/web/unit/webunit.rb +28 -0
  317. data/lib/web/upload.rb +55 -0
  318. data/lib/web/upload.rb~ +262 -0
  319. data/lib/web/wiki.rb +506 -0
  320. data/lib/web/wiki.rb~ +506 -0
  321. data/lib/web/wiki/linker.rb +72 -0
  322. data/lib/web/wiki/linker.rb~ +72 -0
  323. data/lib/web/wiki/mime.rb~ +68 -0
  324. data/lib/web/wiki/page.rb +192 -0
  325. data/lib/web/wiki/page.rb~ +192 -0
  326. data/lib/web/wiki/resources/#edit.html# +65 -0
  327. data/lib/web/wiki/resources/admin.html +13 -0
  328. data/lib/web/wiki/resources/admin.html~ +13 -0
  329. data/lib/web/wiki/resources/asset_history.html +3 -0
  330. data/lib/web/wiki/resources/basic.html +1 -0
  331. data/lib/web/wiki/resources/default-content_editor.html +1 -0
  332. data/lib/web/wiki/resources/default-content_editor.html~ +1 -0
  333. data/lib/web/wiki/resources/edit.html +1 -1
  334. data/lib/web/wiki/resources/edit.html~ +1 -1
  335. data/lib/web/wiki/resources/ekit-content_editor.html +1 -0
  336. data/lib/web/wiki/resources/home.html +10 -0
  337. data/lib/web/wiki/resources/home.html~ +10 -0
  338. data/lib/web/wiki/resources/htmlarea/ChangeLog +1185 -0
  339. data/lib/web/wiki/resources/htmlarea/dialog.js +72 -0
  340. data/lib/web/wiki/resources/htmlarea/examples/2-areas.cgi +16 -0
  341. data/lib/web/wiki/resources/htmlarea/examples/2-areas.html +158 -0
  342. data/lib/web/wiki/resources/htmlarea/examples/context-menu.html +95 -0
  343. data/lib/web/wiki/resources/htmlarea/examples/core.html +184 -0
  344. data/lib/web/wiki/resources/htmlarea/examples/css.html +88 -0
  345. data/lib/web/wiki/resources/htmlarea/examples/custom.css +29 -0
  346. data/lib/web/wiki/resources/htmlarea/examples/full-page.html +75 -0
  347. data/lib/web/wiki/resources/htmlarea/examples/fully-loaded.html +248 -0
  348. data/lib/web/wiki/resources/htmlarea/examples/index.html +40 -0
  349. data/lib/web/wiki/resources/htmlarea/examples/spell-checker.html +132 -0
  350. data/lib/web/wiki/resources/htmlarea/examples/table-operations.html +116 -0
  351. data/lib/web/wiki/resources/htmlarea/examples/test.cgi +21 -0
  352. data/lib/web/wiki/resources/htmlarea/htmlarea.css +180 -0
  353. data/lib/web/wiki/resources/htmlarea/htmlarea.js +2175 -0
  354. data/lib/web/wiki/resources/htmlarea/images/ed_about.gif +0 -0
  355. data/lib/web/wiki/resources/htmlarea/images/ed_align_center.gif +0 -0
  356. data/lib/web/wiki/resources/htmlarea/images/ed_align_justify.gif +0 -0
  357. data/lib/web/wiki/resources/htmlarea/images/ed_align_left.gif +0 -0
  358. data/lib/web/wiki/resources/htmlarea/images/ed_align_right.gif +0 -0
  359. data/lib/web/wiki/resources/htmlarea/images/ed_blank.gif +0 -0
  360. data/lib/web/wiki/resources/htmlarea/images/ed_charmap.gif +0 -0
  361. data/lib/web/wiki/resources/htmlarea/images/ed_color_bg.gif +0 -0
  362. data/lib/web/wiki/resources/htmlarea/images/ed_color_fg.gif +0 -0
  363. data/lib/web/wiki/resources/htmlarea/images/ed_copy.gif +0 -0
  364. data/lib/web/wiki/resources/htmlarea/images/ed_custom.gif +0 -0
  365. data/lib/web/wiki/resources/htmlarea/images/ed_cut.gif +0 -0
  366. data/lib/web/wiki/resources/htmlarea/images/ed_delete.gif +0 -0
  367. data/lib/web/wiki/resources/htmlarea/images/ed_format_bold.gif +0 -0
  368. data/lib/web/wiki/resources/htmlarea/images/ed_format_italic.gif +0 -0
  369. data/lib/web/wiki/resources/htmlarea/images/ed_format_strike.gif +0 -0
  370. data/lib/web/wiki/resources/htmlarea/images/ed_format_sub.gif +0 -0
  371. data/lib/web/wiki/resources/htmlarea/images/ed_format_sup.gif +0 -0
  372. data/lib/web/wiki/resources/htmlarea/images/ed_format_underline.gif +0 -0
  373. data/lib/web/wiki/resources/htmlarea/images/ed_help.gif +0 -0
  374. data/lib/web/wiki/resources/htmlarea/images/ed_hr.gif +0 -0
  375. data/lib/web/wiki/resources/htmlarea/images/ed_html.gif +0 -0
  376. data/lib/web/wiki/resources/htmlarea/images/ed_image.gif +0 -0
  377. data/lib/web/wiki/resources/htmlarea/images/ed_indent_less.gif +0 -0
  378. data/lib/web/wiki/resources/htmlarea/images/ed_indent_more.gif +0 -0
  379. data/lib/web/wiki/resources/htmlarea/images/ed_left_to_right.gif +0 -0
  380. data/lib/web/wiki/resources/htmlarea/images/ed_link.gif +0 -0
  381. data/lib/web/wiki/resources/htmlarea/images/ed_list_bullet.gif +0 -0
  382. data/lib/web/wiki/resources/htmlarea/images/ed_list_num.gif +0 -0
  383. data/lib/web/wiki/resources/htmlarea/images/ed_paste.gif +0 -0
  384. data/lib/web/wiki/resources/htmlarea/images/ed_redo.gif +0 -0
  385. data/lib/web/wiki/resources/htmlarea/images/ed_right_to_left.gif +0 -0
  386. data/lib/web/wiki/resources/htmlarea/images/ed_save.gif +0 -0
  387. data/lib/web/wiki/resources/htmlarea/images/ed_show_border.gif +0 -0
  388. data/lib/web/wiki/resources/htmlarea/images/ed_splitcel.gif +0 -0
  389. data/lib/web/wiki/resources/htmlarea/images/ed_undo.gif +0 -0
  390. data/lib/web/wiki/resources/htmlarea/images/fullscreen_maximize.gif +0 -0
  391. data/lib/web/wiki/resources/htmlarea/images/fullscreen_minimize.gif +0 -0
  392. data/lib/web/wiki/resources/htmlarea/images/insert_table.gif +0 -0
  393. data/lib/web/wiki/resources/htmlarea/index.html +199 -0
  394. data/lib/web/wiki/resources/htmlarea/lang/b5.js +36 -0
  395. data/lib/web/wiki/resources/htmlarea/lang/cz.js +63 -0
  396. data/lib/web/wiki/resources/htmlarea/lang/da.js +38 -0
  397. data/lib/web/wiki/resources/htmlarea/lang/de.js +54 -0
  398. data/lib/web/wiki/resources/htmlarea/lang/ee.js +63 -0
  399. data/lib/web/wiki/resources/htmlarea/lang/el.js +75 -0
  400. data/lib/web/wiki/resources/htmlarea/lang/en.js +88 -0
  401. data/lib/web/wiki/resources/htmlarea/lang/es.js +51 -0
  402. data/lib/web/wiki/resources/htmlarea/lang/fi.js +46 -0
  403. data/lib/web/wiki/resources/htmlarea/lang/fr.js +61 -0
  404. data/lib/web/wiki/resources/htmlarea/lang/gb.js +36 -0
  405. data/lib/web/wiki/resources/htmlarea/lang/he.js +63 -0
  406. data/lib/web/wiki/resources/htmlarea/lang/hu.js +63 -0
  407. data/lib/web/wiki/resources/htmlarea/lang/it.js +54 -0
  408. data/lib/web/wiki/resources/htmlarea/lang/ja-euc.js +37 -0
  409. data/lib/web/wiki/resources/htmlarea/lang/ja-jis.js +37 -0
  410. data/lib/web/wiki/resources/htmlarea/lang/ja-sjis.js +37 -0
  411. data/lib/web/wiki/resources/htmlarea/lang/ja-utf8.js +37 -0
  412. data/lib/web/wiki/resources/htmlarea/lang/lt.js +55 -0
  413. data/lib/web/wiki/resources/htmlarea/lang/lv.js +55 -0
  414. data/lib/web/wiki/resources/htmlarea/lang/nb.js +36 -0
  415. data/lib/web/wiki/resources/htmlarea/lang/nl.js +90 -0
  416. data/lib/web/wiki/resources/htmlarea/lang/no.js +79 -0
  417. data/lib/web/wiki/resources/htmlarea/lang/pl.js +36 -0
  418. data/lib/web/wiki/resources/htmlarea/lang/pt_br.js +37 -0
  419. data/lib/web/wiki/resources/htmlarea/lang/ro.js +80 -0
  420. data/lib/web/wiki/resources/htmlarea/lang/ru.js +63 -0
  421. data/lib/web/wiki/resources/htmlarea/lang/se.js +38 -0
  422. data/lib/web/wiki/resources/htmlarea/lang/si.js +63 -0
  423. data/lib/web/wiki/resources/htmlarea/lang/vn.js +51 -0
  424. data/lib/web/wiki/resources/htmlarea/license.txt +30 -0
  425. data/lib/web/wiki/resources/htmlarea/plugins/CSS/css.js +116 -0
  426. data/lib/web/wiki/resources/htmlarea/plugins/CSS/lang/en.js +2 -0
  427. data/lib/web/wiki/resources/htmlarea/plugins/ContextMenu/context-menu.js +416 -0
  428. data/lib/web/wiki/resources/htmlarea/plugins/ContextMenu/lang/de.js +59 -0
  429. data/lib/web/wiki/resources/htmlarea/plugins/ContextMenu/lang/el.js +57 -0
  430. data/lib/web/wiki/resources/htmlarea/plugins/ContextMenu/lang/en.js +66 -0
  431. data/lib/web/wiki/resources/htmlarea/plugins/ContextMenu/lang/nl.js +66 -0
  432. data/lib/web/wiki/resources/htmlarea/plugins/ContextMenu/menu.css +64 -0
  433. data/lib/web/wiki/resources/htmlarea/plugins/FullPage/full-page.js +143 -0
  434. data/lib/web/wiki/resources/htmlarea/plugins/FullPage/img/docprop.gif +0 -0
  435. data/lib/web/wiki/resources/htmlarea/plugins/FullPage/lang/en.js +25 -0
  436. data/lib/web/wiki/resources/htmlarea/plugins/FullPage/lang/ro.js +25 -0
  437. data/lib/web/wiki/resources/htmlarea/plugins/FullPage/popups/docprop.html +131 -0
  438. data/lib/web/wiki/resources/htmlarea/plugins/FullPage/test.html +89 -0
  439. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/img/spell-check.gif +0 -0
  440. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/lang/cz.js +37 -0
  441. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/lang/da.js +37 -0
  442. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/lang/de.js +28 -0
  443. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/lang/en.js +38 -0
  444. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/lang/hu.js +37 -0
  445. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/lang/it.js +28 -0
  446. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/lang/ro.js +37 -0
  447. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/readme-tech.html +114 -0
  448. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/spell-check-logic.cgi +210 -0
  449. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/spell-check-style.css +10 -0
  450. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/spell-check-ui.html +122 -0
  451. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/spell-check-ui.js +397 -0
  452. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/spell-checker.js +79 -0
  453. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/cell-delete.gif +0 -0
  454. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/cell-insert-after.gif +0 -0
  455. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/cell-insert-before.gif +0 -0
  456. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/cell-merge.gif +0 -0
  457. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/cell-prop.gif +0 -0
  458. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/cell-split.gif +0 -0
  459. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/col-delete.gif +0 -0
  460. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/col-insert-after.gif +0 -0
  461. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/col-insert-before.gif +0 -0
  462. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/col-split.gif +0 -0
  463. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/row-delete.gif +0 -0
  464. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/row-insert-above.gif +0 -0
  465. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/row-insert-under.gif +0 -0
  466. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/row-prop.gif +0 -0
  467. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/row-split.gif +0 -0
  468. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/table-prop.gif +0 -0
  469. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/cz.js +90 -0
  470. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/da.js +90 -0
  471. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/de.js +81 -0
  472. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/el.js +81 -0
  473. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/en.js +90 -0
  474. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/fi.js +66 -0
  475. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/hu.js +63 -0
  476. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/it.js +81 -0
  477. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/nl.js +90 -0
  478. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/no.js +91 -0
  479. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/ro.js +90 -0
  480. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/table-operations.js +1160 -0
  481. data/lib/web/wiki/resources/htmlarea/popupdiv.js +369 -0
  482. data/lib/web/wiki/resources/htmlarea/popups/about.html +378 -0
  483. data/lib/web/wiki/resources/htmlarea/popups/blank.html +2 -0
  484. data/lib/web/wiki/resources/htmlarea/popups/custom2.html +35 -0
  485. data/lib/web/wiki/resources/htmlarea/popups/editor_help.html +16 -0
  486. data/lib/web/wiki/resources/htmlarea/popups/fullscreen.html +133 -0
  487. data/lib/web/wiki/resources/htmlarea/popups/insert_image.html +191 -0
  488. data/lib/web/wiki/resources/htmlarea/popups/insert_table.html +174 -0
  489. data/lib/web/wiki/resources/htmlarea/popups/link.html +142 -0
  490. data/lib/web/wiki/resources/htmlarea/popups/old-fullscreen.html +131 -0
  491. data/lib/web/wiki/resources/htmlarea/popups/old_insert_image.html +206 -0
  492. data/lib/web/wiki/resources/htmlarea/popups/popup.js +109 -0
  493. data/lib/web/wiki/resources/htmlarea/popups/select_color.html +347 -0
  494. data/lib/web/wiki/resources/htmlarea/popupwin.js +139 -0
  495. data/lib/web/wiki/resources/htmlarea/reference.html +523 -0
  496. data/lib/web/wiki/resources/htmlarea/release-notes.html +165 -0
  497. data/lib/web/wiki/resources/ie-content_editor.html +1 -0
  498. data/lib/web/wiki/resources/ie-content_editor.js +196 -0
  499. data/lib/web/wiki/resources/illustration.html +1 -0
  500. data/lib/web/wiki/resources/illustration.html~ +1 -0
  501. data/lib/web/wiki/resources/images.html +1 -0
  502. data/lib/web/wiki/resources/index.html +4 -0
  503. data/lib/web/wiki/resources/index.html~ +4 -0
  504. data/lib/web/wiki/resources/more_news.html +5 -0
  505. data/lib/web/wiki/resources/more_news.html~ +5 -0
  506. data/lib/web/wiki/resources/more_news_rss_0.91.html +23 -0
  507. data/lib/web/wiki/resources/narf-logo.gif +0 -0
  508. data/lib/web/wiki/resources/page_history.html +19 -0
  509. data/lib/web/wiki/resources/page_history.html~ +19 -0
  510. data/lib/web/wiki/resources/template.html +13 -0
  511. data/lib/web/wiki/resources/template.html~ +13 -0
  512. data/lib/web/wiki/resources/test_upload.gif +0 -0
  513. data/lib/web/wiki/resources/text-styles.css +1 -0
  514. data/lib/web/writableio.rb +33 -0
  515. data/narf-0.5.1.gem +0 -0
  516. data/narf.gemspec +40 -0
  517. data/narf.gemspec~ +52 -0
  518. data/pre-setup.rb +5 -0
  519. data/sapi/apache_cgi/INSTALL.txt~ +9 -0
  520. data/sapi/apache_cgi/README~ +0 -0
  521. data/sapi/apache_cgi/src/narf.c +13 -0
  522. data/sapi/fastcgi/INSTALL.txt~ +17 -0
  523. data/sapi/mod_ruby/INSTALL.txt~ +5 -0
  524. data/sapi/webrick/INSTALL.txt~ +21 -0
  525. data/sapi/webrick/run_webrick.rb~ +16 -0
  526. data/scripts/dump.rb +14 -0
  527. data/scripts/makedist.rb +49 -0
  528. data/scripts/upload.html +5 -0
  529. data/scripts/uri.rb +41 -0
  530. data/scripts/uri/common.rb +432 -0
  531. data/scripts/uri/ftp.rb +149 -0
  532. data/scripts/uri/generic.rb +1106 -0
  533. data/scripts/uri/http.rb +76 -0
  534. data/scripts/uri/https.rb +26 -0
  535. data/scripts/uri/ldap.rb +238 -0
  536. data/scripts/uri/mailto.rb +260 -0
  537. data/scripts/urireg.rb +174 -0
  538. data/test/bufferedtestrunner.rb +112 -0
  539. data/test/mod_ruby_stub.rb +39 -0
  540. data/test/mod_ruby_stub.rb~ +38 -0
  541. data/test/stringio.rb +2 -0
  542. data/test/test.action.rb +142 -0
  543. data/test/test.action.rb~ +142 -0
  544. data/test/test.app.rb +0 -0
  545. data/test/test.assertinclude.rb +109 -0
  546. data/test/test.assertinclude.rb~ +109 -0
  547. data/test/test.formreader-2.0.rb +352 -0
  548. data/test/test.formreader.rb +465 -0
  549. data/test/test.mime-type.rb +23 -0
  550. data/test/test.narf.cgi.rb +101 -0
  551. data/test/test.narf.cgi.rb~ +105 -0
  552. data/test/test.request.rb +328 -0
  553. data/test/test.request.rb~ +318 -0
  554. data/test/test.response.rb +565 -0
  555. data/test/test.response.rb~ +556 -0
  556. data/test/test.session.rb +50 -0
  557. data/test/test.simpledispatcher.rb +188 -0
  558. data/test/test.tagparser.rb +65 -0
  559. data/test/test.template.rb +831 -0
  560. data/test/test.template.rb~ +832 -0
  561. data/test/test.testing2.rb +341 -0
  562. data/test/test.web.test.rb +463 -0
  563. data/test/test.web.test.rb~ +461 -0
  564. data/test/testfiles/basictemplate.tpl +1 -0
  565. data/test/testfiles/explorer5.multipart.data +9 -0
  566. data/test/testfiles/form.html +7 -0
  567. data/test/testfiles/mozilla.multipart.data +9 -0
  568. data/test/testfiles/netscape4.multipart.data +9 -0
  569. data/test/testfiles/pic hydra.png +1 -0
  570. data/test/testfiles/post.data +1 -0
  571. data/test/testfiles/print.text +1 -0
  572. data/test/testfiles/text +1 -0
  573. data/test/webunit/dont_get_it.test_webunit.rb +27 -0
  574. data/test/webunit/ref +38 -0
  575. data/test/webunit/resources/uploadfile1.txt +1 -0
  576. data/test/webunit/resources/uploadfile2.txt +1 -0
  577. data/test/webunit/test_assert.rb +169 -0
  578. data/test/webunit/test_cookie.rb +128 -0
  579. data/test/webunit/test_cookie.rb~ +128 -0
  580. data/test/webunit/test_domwalker.rb +83 -0
  581. data/test/webunit/test_form.rb +43 -0
  582. data/test/webunit/test_form.rb~ +43 -0
  583. data/test/webunit/test_frame.rb +43 -0
  584. data/test/webunit/test_htmlelem.rb +75 -0
  585. data/test/webunit/test_image.rb +46 -0
  586. data/test/webunit/test_jscript.rb +58 -0
  587. data/test/webunit/test_link.rb +87 -0
  588. data/test/webunit/test_multipart.rb +53 -0
  589. data/test/webunit/test_multipart.rb~ +53 -0
  590. data/test/webunit/test_params.rb +212 -0
  591. data/test/webunit/test_params.rb~ +211 -0
  592. data/test/webunit/test_parser.rb +31 -0
  593. data/test/webunit/test_response.rb +145 -0
  594. data/test/webunit/test_response.rb~ +145 -0
  595. data/test/webunit/test_site/assert.html +101 -0
  596. data/test/webunit/test_site/assert.html~ +1 -0
  597. data/test/webunit/test_site/auth/index.html +5 -0
  598. data/test/webunit/test_site/auth/index.html~ +1 -0
  599. data/test/webunit/test_site/badtags.html +7 -0
  600. data/test/webunit/test_site/badtags.html~ +1 -0
  601. data/test/webunit/test_site/cookie.cgi +37 -0
  602. data/test/webunit/test_site/cookie.cgi~ +35 -0
  603. data/test/webunit/test_site/document.xml +13 -0
  604. data/test/webunit/test_site/document.xml~ +1 -0
  605. data/test/webunit/test_site/form.html +150 -0
  606. data/test/webunit/test_site/form.html~ +1 -0
  607. data/test/webunit/test_site/frame-0.html +10 -0
  608. data/test/webunit/test_site/frame-0.html~ +1 -0
  609. data/test/webunit/test_site/frame-1.html +10 -0
  610. data/test/webunit/test_site/frame-1.html~ +1 -0
  611. data/test/webunit/test_site/frame.html +10 -0
  612. data/test/webunit/test_site/frame.html~ +1 -0
  613. data/test/webunit/test_site/image.html +17 -0
  614. data/test/webunit/test_site/image.html~ +1 -0
  615. data/test/webunit/test_site/images/x.gif +0 -0
  616. data/test/webunit/test_site/images/y.gif +0 -0
  617. data/test/webunit/test_site/include.cgi~ +10 -0
  618. data/test/webunit/test_site/jscript-0.html +10 -0
  619. data/test/webunit/test_site/jscript-0.html~ +1 -0
  620. data/test/webunit/test_site/jscript-1.html +10 -0
  621. data/test/webunit/test_site/jscript-1.html~ +1 -0
  622. data/test/webunit/test_site/jscript.html +19 -0
  623. data/test/webunit/test_site/jscript.html~ +1 -0
  624. data/test/webunit/test_site/link.html +19 -0
  625. data/test/webunit/test_site/link.html~ +1 -0
  626. data/test/webunit/test_site/multipart.cgi +27 -0
  627. data/test/webunit/test_site/multipart.cgi~ +25 -0
  628. data/test/webunit/test_site/multipart.html +74 -0
  629. data/test/webunit/test_site/multipart.html~ +1 -0
  630. data/test/webunit/test_site/params.html +65 -0
  631. data/test/webunit/test_site/params.html~ +1 -0
  632. data/test/webunit/test_site/redirect.cgi +14 -0
  633. data/test/webunit/test_site/redirect.cgi~ +14 -0
  634. data/test/webunit/test_site/response.html +67 -0
  635. data/test/webunit/test_site/response.html~ +1 -0
  636. data/test/webunit/test_site/simple.cgi +17 -0
  637. data/test/webunit/test_site/simple.cgi~ +17 -0
  638. data/test/webunit/test_site/stock.cgi +36 -0
  639. data/test/webunit/test_site/stock.cgi~ +34 -0
  640. data/test/webunit/test_site/table.html +83 -0
  641. data/test/webunit/test_site/table.html~ +1 -0
  642. data/test/webunit/test_site/test.cgi~ +25 -0
  643. data/test/webunit/test_table.rb +70 -0
  644. data/test/webunit/test_utils.rb +107 -0
  645. data/test/wiki/test.history.rb +277 -0
  646. data/test/wiki/test.history.rb~ +254 -0
  647. data/test/wiki/test.illustration_page.rb +287 -0
  648. data/test/wiki/test.illustration_page.rb~ +287 -0
  649. data/test/wiki/test.linker.rb +197 -0
  650. data/test/wiki/test.tarpit.rb +40 -0
  651. data/test/wiki/test.wiki.rb +295 -0
  652. data/test/wiki/test.wiki.rb~ +295 -0
  653. data/test/wikitestroot/big_image.jpg +0 -0
  654. data/test/wikitestroot/mime.types +483 -0
  655. data/test/wikitestroot/test_upload.gif +0 -0
  656. data/vandals.test.txt +3 -0
  657. metadata +768 -0
@@ -0,0 +1,110 @@
1
+ class Array # :nodoc:
2
+ def has_key?(index)
3
+ index >= 0 && index < length
4
+ end
5
+
6
+ def __index(key)
7
+ self[key]
8
+ end
9
+
10
+ def compare_includes? haystack, prefix=[]
11
+ message = ""
12
+ each_with_index{ |v, k|
13
+ fullname = prefix.clone
14
+ if fullname.length > 0
15
+ fullname[fullname.length-1] = "#{fullname.last}[#{k}]"
16
+ else
17
+ fullname[0] = "<Array>[#{k}]"
18
+ end
19
+ fullname_str = fullname.join(".")
20
+ message += do_thing(haystack, k, v, fullname, fullname_str)
21
+ }
22
+ message
23
+ end
24
+ end
25
+
26
+
27
+ class Object # :nodoc:
28
+ def has_key? key
29
+ respond_to? key.intern
30
+ end
31
+
32
+ def __index(key)
33
+ send key.intern
34
+ end
35
+
36
+ def do_thing haystack, k, v, fullname, fullname_str
37
+ message = ""
38
+ # get key
39
+ if !haystack.has_key?(k)
40
+ if v
41
+ message += "Missing from actual: #{fullname_str} => #{v.inspect}\n"
42
+ end
43
+ else
44
+ # inspect key
45
+ # if we are looking for a collection
46
+ if v.kind_of?(Hash) || v.kind_of?(Array)
47
+ # and the haystack has a collection
48
+ if !(haystack.__index(k).kind_of?(String) || haystack.__index(k).kind_of?(TrueClass) || haystack.__index(k).kind_of?(FalseClass) || haystack.__index(k).kind_of?(Fixnum) || haystack.__index(k).kind_of?(Bignum))
49
+ # recurse if both are collections
50
+ message += v.compare_includes?(haystack.__index(k),fullname)
51
+
52
+ # otherwise, complain that we aren't the same
53
+ else
54
+ message += "Difference: required <#{fullname_str} => #{v.inspect}> was <#{fullname_str} => #{haystack.__index(k).inspect}>\n"
55
+ end
56
+
57
+ # if we aren't looking for a collection, see if we aren't the same
58
+ else
59
+ haystack_value = haystack.__index(k)
60
+ if (haystack_value.kind_of? Array and
61
+ haystack_value.length == 1)
62
+ haystack_value = haystack_value.first
63
+ end
64
+ if (haystack_value != v)
65
+ message += "Difference: required <#{fullname_str} => #{v.inspect}> was <#{fullname_str} => #{haystack_value.inspect}>\n"
66
+ end
67
+ end
68
+ end
69
+ message
70
+ end
71
+ end
72
+ �Á�
73
+ class Hash # :nodoc:
74
+ def __index(key)
75
+ self[key]
76
+ end
77
+
78
+ def compare_includes? haystack, prefix=[]
79
+ message = ""
80
+ # check that haystack is the same type?
81
+
82
+ # iterate over your self (particular to self)
83
+ self.each do |k,v|
84
+
85
+ # make a sensible name for each element of the needle (particular to self)
86
+ fullname = prefix.clone.push k
87
+ fullname_str = fullname.join(".")
88
+
89
+ message += do_thing(haystack, k, v, fullname, fullname_str)
90
+ end
91
+
92
+ message
93
+ end
94
+ end
95
+
96
+ module Test # :nodoc: all
97
+ module Unit
98
+ module Assertions
99
+ def assert_includes needle, haystack, message=""
100
+ _wrap_assertion {
101
+ message = needle.compare_includes?( haystack )
102
+ unless( message == "")
103
+ flunk(message.chomp)
104
+ end
105
+ }
106
+ end
107
+ end
108
+ end
109
+ end
110
+
@@ -0,0 +1,82 @@
1
+ module Web
2
+ class Action #:nodoc:
3
+ attr_reader :patterns
4
+ def initialize patterns={}, &function
5
+ @patterns = patterns
6
+ @function = function || lambda{}
7
+ @@all_actions.push self
8
+ end
9
+
10
+ def run cgi=Web::CGI.create
11
+ @function.call( cgi )
12
+ end
13
+
14
+ def old_applies? cgi
15
+ matches = false
16
+ patterns.each{ |key, pattern|
17
+ cgi.multiple_params[key].each{ |value|
18
+ if pattern.kind_of? Regexp
19
+ matches = true if value =~ pattern
20
+ else
21
+ matches = true if value == pattern
22
+ end
23
+ }
24
+ }
25
+ matches
26
+ end
27
+
28
+ def applies? cgi
29
+ relevance = 0;
30
+ unmatched_terms = patterns.size;
31
+ patterns.each{ |key, pattern|
32
+ if pattern.kind_of? Regexp
33
+ if cgi.multiple_params[key].find{ |value| value =~ pattern }
34
+ unmatched_terms = unmatched_terms - 1
35
+ relevance += 1
36
+ end
37
+ else
38
+ if cgi.multiple_params[key].find{ |value| value == pattern }
39
+ unmatched_terms = unmatched_terms - 1
40
+ relevance += 10
41
+ end
42
+ end
43
+ }
44
+ if unmatched_terms == 0
45
+ relevance
46
+ else
47
+ false
48
+ end
49
+ end
50
+
51
+ @@all_actions = []
52
+ def Action.pick( cgi )
53
+ @@all_actions.find_all{ |action|
54
+ action.applies? cgi
55
+ }.sort{|a, b|
56
+ a.applies?(cgi) <=> b.applies?(cgi)
57
+ }.last ||
58
+ @@all_actions.find{ |action| action.patterns == {} } ||
59
+ blank_action
60
+
61
+ # (raise Web::Exception.new( "Could not locate action for #{ cgi.multiple_params.inspect }" ))
62
+ end
63
+
64
+ def Action.blank_action
65
+ blank = Action.new
66
+ @@all_actions.delete blank
67
+ blank
68
+ end
69
+
70
+ def Action.run options={}
71
+ if options.kind_of? Hash
72
+ Web.process(options){ |cgi|
73
+ pick(cgi).run(cgi)
74
+ }
75
+ elsif options.kind_of? Web::CGI
76
+ pick(options).run(options)
77
+ options.close
78
+ options
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,110 @@
1
+ class Array # :nodoc:
2
+ def has_key?(index)
3
+ index >= 0 && index < length
4
+ end
5
+
6
+ def __index(key)
7
+ self[key]
8
+ end
9
+
10
+ def compare_includes? haystack, prefix=[]
11
+ message = ""
12
+ each_with_index{ |v, k|
13
+ fullname = prefix.clone
14
+ if fullname.length > 0
15
+ fullname[fullname.length-1] = "#{fullname.last}[#{k}]"
16
+ else
17
+ fullname[0] = "<Array>[#{k}]"
18
+ end
19
+ fullname_str = fullname.join(".")
20
+ message += do_thing(haystack, k, v, fullname, fullname_str)
21
+ }
22
+ message
23
+ end
24
+ end
25
+
26
+
27
+ class Object # :nodoc:
28
+ def has_key? key
29
+ respond_to? key.intern
30
+ end
31
+
32
+ def __index(key)
33
+ send key.intern
34
+ end
35
+
36
+ def do_thing haystack, k, v, fullname, fullname_str
37
+ message = ""
38
+ # get key
39
+ if !haystack.has_key?(k)
40
+ if v
41
+ message += "Missing from actual: #{fullname_str} => #{v.inspect}\n"
42
+ end
43
+ else
44
+ # inspect key
45
+ # if we are looking for a collection
46
+ if v.kind_of?(Hash) || v.kind_of?(Array)
47
+ # and the haystack has a collection
48
+ if !(haystack.__index(k).kind_of?(String) || haystack.__index(k).kind_of?(TrueClass) || haystack.__index(k).kind_of?(FalseClass) || haystack.__index(k).kind_of?(Fixnum) || haystack.__index(k).kind_of?(Bignum))
49
+ # recurse if both are collections
50
+ message += v.compare_includes?(haystack.__index(k),fullname)
51
+
52
+ # otherwise, complain that we aren't the same
53
+ else
54
+ message += "Difference: required <#{fullname_str} => #{v.inspect}> was <#{fullname_str} => #{haystack.__index(k).inspect}>\n"
55
+ end
56
+
57
+ # if we aren't looking for a collection, see if we aren't the same
58
+ else
59
+ haystack_value = haystack.__index(k)
60
+ if (haystack_value.kind_of? Array and
61
+ haystack_value.length == 1)
62
+ haystack_value = haystack_value.first
63
+ end
64
+ if (haystack_value != v)
65
+ message += "Difference: required <#{fullname_str} => #{v.inspect}> was <#{fullname_str} => #{haystack_value.inspect}>\n"
66
+ end
67
+ end
68
+ end
69
+ message
70
+ end
71
+ end
72
+
73
+ class Hash # :nodoc:
74
+ def __index(key)
75
+ self[key]
76
+ end
77
+
78
+ def compare_includes? haystack, prefix=[]
79
+ message = ""
80
+ # check that haystack is the same type?
81
+
82
+ # iterate over your self (particular to self)
83
+ self.each do |k,v|
84
+
85
+ # make a sensible name for each element of the needle (particular to self)
86
+ fullname = prefix.clone.push k
87
+ fullname_str = fullname.join(".")
88
+
89
+ message += do_thing(haystack, k, v, fullname, fullname_str)
90
+ end
91
+
92
+ message
93
+ end
94
+ end
95
+
96
+ module Test # :nodoc: all
97
+ module Unit
98
+ module Assertions
99
+ def assert_includes needle, haystack, message=""
100
+ _wrap_assertion {
101
+ message = needle.compare_includes?( haystack )
102
+ unless( message == "")
103
+ flunk(message.chomp)
104
+ end
105
+ }
106
+ end
107
+ end
108
+ end
109
+ end
110
+
@@ -0,0 +1,110 @@
1
+ class Array # :nodoc:
2
+ def has_key?(index)
3
+ index >= 0 && index < length
4
+ end
5
+
6
+ def __index(key)
7
+ self[key]
8
+ end
9
+
10
+ def compare_includes? haystack, prefix=[]
11
+ message = ""
12
+ each_with_index{ |v, k|
13
+ fullname = prefix.clone
14
+ if fullname.length > 0
15
+ fullname[fullname.length-1] = "#{fullname.last}[#{k}]"
16
+ else
17
+ fullname[0] = "<Array>[#{k}]"
18
+ end
19
+ fullname_str = fullname.join(".")
20
+ message += do_thing(haystack, k, v, fullname, fullname_str)
21
+ }
22
+ message
23
+ end
24
+ end
25
+
26
+
27
+ class Object # :nodoc:
28
+ def has_key? key
29
+ respond_to? key.intern
30
+ end
31
+
32
+ def __index(key)
33
+ send key.intern
34
+ end
35
+
36
+ def do_thing haystack, k, v, fullname, fullname_str
37
+ message = ""
38
+ # get key
39
+ if !haystack.has_key?(k)
40
+ if v
41
+ message += "Missing from actual: #{fullname_str} => #{v.inspect}\n"
42
+ end
43
+ else
44
+ # inspect key
45
+ # if we are looking for a collection
46
+ if v.kind_of?(Hash) || v.kind_of?(Array)
47
+ # and the haystack has a collection
48
+ if !(haystack.__index(k).kind_of?(String) || haystack.__index(k).kind_of?(TrueClass) || haystack.__index(k).kind_of?(FalseClass) || haystack.__index(k).kind_of?(Fixnum) || haystack.__index(k).kind_of?(Bignum))
49
+ # recurse if both are collections
50
+ message += v.compare_includes?(haystack.__index(k),fullname)
51
+
52
+ # otherwise, complain that we aren't the same
53
+ else
54
+ message += "Difference: required <#{fullname_str} => #{v.inspect}> was <#{fullname_str} => #{haystack.__index(k).inspect}>\n"
55
+ end
56
+
57
+ # if we aren't looking for a collection, see if we aren't the same
58
+ else
59
+ haystack_value = haystack.__index(k)
60
+ if (haystack_value.kind_of? Array and
61
+ haystack_value.length == 1)
62
+ haystack_value = haystack_value.first
63
+ end
64
+ if (haystack_value != v)
65
+ message += "Difference: required <#{fullname_str} => #{v.inspect}> was <#{fullname_str} => #{haystack_value.inspect}>\n"
66
+ end
67
+ end
68
+ end
69
+ message
70
+ end
71
+ end
72
+
73
+ class Hash # :nodoc:
74
+ def __index(key)
75
+ self[key]
76
+ end
77
+
78
+ def compare_includes? haystack, prefix=[]
79
+ message = ""
80
+ # check that haystack is the same type?
81
+
82
+ # iterate over your self (particular to self)
83
+ self.each do |k,v|
84
+
85
+ # make a sensible name for each element of the needle (particular to self)
86
+ fullname = prefix.clone.push k
87
+ fullname_str = fullname.join(".")
88
+
89
+ message += do_thing(haystack, k, v, fullname, fullname_str)
90
+ end
91
+
92
+ message
93
+ end
94
+ end
95
+
96
+ module Test # :nodoc: all
97
+ module Unit
98
+ module Assertions
99
+ def assert_includes needle, haystack, message=""
100
+ _wrap_assertion {
101
+ message = needle.compare_includes?( haystack )
102
+ unless( message == "")
103
+ flunk(message)
104
+ end
105
+ }
106
+ end
107
+ end
108
+ end
109
+ end
110
+
@@ -0,0 +1,20 @@
1
+ module Web
2
+ class Buffer #:nodoc:
3
+ def initialize
4
+ @buffer = ""
5
+ end
6
+
7
+ def flush
8
+ temp = @buffer
9
+ @buffer = ""
10
+ temp
11
+ end
12
+
13
+ def << object
14
+ @buffer << object
15
+ end
16
+ end
17
+ end
18
+
19
+
20
+
@@ -0,0 +1,641 @@
1
+ module Web
2
+ # == Purpose
3
+ #
4
+ # Web::CGI is the core of Narf. You will find documentation for many
5
+ # useful methods here. I recommend calling these methods through the
6
+ # Web module, which will manage the current CGI object and delegate
7
+ # to it.
8
+ #
9
+ class CGI
10
+
11
+ @@__web__cgi = nil
12
+
13
+ # set the singleton cgi object for Web
14
+ def CGI.set_cgi cgi
15
+ @@__web__cgi = cgi
16
+ end
17
+
18
+ # get the singleton cgi object for Web
19
+ def CGI.get_cgi( options={} )
20
+ unless @@__web__cgi
21
+ @@__web__cgi = Web::CGI.new(options)
22
+
23
+ at_exit {
24
+ @@__web__cgi.close if @@__web__cgi
25
+ }
26
+ end
27
+
28
+ @@__web__cgi
29
+
30
+ end
31
+
32
+ def CGI.process( options={} ) #:nodoc:
33
+ cgi = Web::CGI.get_cgi( options )
34
+ yield cgi
35
+ cgi.close
36
+ cgi
37
+ end
38
+
39
+ include Test::Unit::Assertions
40
+
41
+ attr_reader :session, :options
42
+
43
+ def document_root
44
+ @cgd.env['document_root']
45
+ end
46
+
47
+ def script_name
48
+ @cgd.env['script_name']
49
+ end
50
+
51
+ def path_info
52
+ @cgd.env['path_info']
53
+ end
54
+
55
+ def cgd
56
+ @cgd
57
+ end
58
+
59
+ @@cgi_instances = {}
60
+ def CGI::create(options={})
61
+
62
+ options[:out] ||= $stdout
63
+ @@cgi_instances[ options[:out].id ] ||= CGI.new(options)
64
+ end
65
+
66
+ # Construct cgi with the given options. Defaults are in parenthesis.
67
+ # These options are alpha and due for change as narf supports
68
+ # different backends.
69
+ #
70
+ # [:session] set the session to the given hash (Web::Session).
71
+ # [:cgd] pass in a CGD driver
72
+ # [:env] pass in the ENV variables
73
+ # [:in] set the input stream to the given IO ($stdin).
74
+ # [:out] set the output stream to the given IO ($stdout).
75
+ # [:unbuffered] flag whether output should(n't) be buffered. (false)
76
+ # [:path_info] path_info is the part of the query that is after the script,
77
+ # i.e. the Narf.html in /wiki.rb/Narf.html (Request.path_info)
78
+ # [:document_root] Document root of website. (Request.document_root)
79
+ # [:script_name] Script name, ie /wiki.rb in /wiki.rb/Narf.html (Request.script_name)
80
+ def initialize(options={})
81
+ @options = options
82
+ @cgd = options[:cgd] || CGD.create( options )
83
+
84
+ ENV_KEYS.each { |symbol|
85
+ env[symbol.to_s.downcase] = options[symbol] if options[symbol]
86
+ }
87
+
88
+ # set output buffer
89
+ @content = StringIO.new
90
+ if (unbuffered?)
91
+ @output = @cgd.output
92
+ else
93
+ @output = StringIO.new
94
+ end
95
+
96
+ @session = if (options.has_key? :session)
97
+ options[:session]
98
+ else
99
+ Session.new( self, options )
100
+ end
101
+ end
102
+
103
+ def trace_output
104
+ templater = Narflates.new(CGI.trace_output_template,{})
105
+ templater.parse(self,{ "parameters" =>
106
+ multiple_params.collect { |key,value| { "key" => key, "value" => value } },
107
+ "cookies" =>
108
+ cookies.collect { |key,value| { "key" => key, "value" => value } },
109
+ "session" =>
110
+ session.collect { |key,value| { "key" => key, "value" => value } } })
111
+ flush
112
+ end
113
+
114
+
115
+ # returns params as a hash of arrays
116
+ def multiple_params
117
+ @cgd.multiple_params
118
+ end
119
+
120
+ # set multiple params, in case you want to change the state of your app
121
+ # without a round trip to the client.
122
+ def multiple_params= other
123
+ @cgd.multiple_params = other
124
+ end
125
+
126
+ MULTIPLE_KEY = /\[\]\z/
127
+
128
+ # access parameters. If the key is array-style,
129
+ # aka param[], return the array. Otherwise,
130
+ # return the joined string.
131
+ def [] (key)
132
+ if (MULTIPLE_KEY =~ key)
133
+ multiple_params[key]
134
+ else
135
+ single_param(key)
136
+ end
137
+ end
138
+
139
+ # set param at the given key. This is useful to change state
140
+ # in your app without asking the browser to redirect
141
+ def []= (key, value)
142
+ unless value.kind_of? Array
143
+ value = [value]
144
+ end
145
+ multiple_params[key] = value
146
+ end
147
+
148
+ # If params[key][0] is a Web::Upload, returns that value.
149
+ # Otherwise it returns params[key].join( "," )
150
+ def single_param(key)
151
+ if (multiple_params[key].first.kind_of? Web::Upload)
152
+ multiple_params[key].first
153
+ else
154
+ multiple_params[key].join( "," )
155
+ end
156
+ end
157
+
158
+ def split_params #:nodoc:
159
+ Web::Testing::MultiHashTree.new(multiple_params).fields
160
+ end
161
+
162
+ # list the submitted params
163
+ def keys
164
+ multiple_params.keys
165
+ end
166
+
167
+ # test whether a param was submitted
168
+ def key? (key)
169
+ multiple_params.has_key? key
170
+ end
171
+
172
+ # array of cookies sent by the client
173
+ def cookies
174
+ @cgd.cookies
175
+ end
176
+
177
+ #----------------------------------
178
+ # Response methods
179
+ #----------------------------------
180
+
181
+ # these are documentation stubs for rdoc
182
+
183
+ # Append output to client
184
+ def << (*args) end
185
+ # Append output to client with line endings
186
+ def puts(*args) end
187
+ # Append output to client
188
+ def write(*args) end
189
+ # Append output to client
190
+ def print(*args) end
191
+
192
+ # Append output to client
193
+ [ :<<, :puts, :write, :print ].each{ |symbol|
194
+ define_method(symbol) { |*args|
195
+ send_header if (unbuffered?)
196
+ @content.send( symbol, args )
197
+ @output.send( symbol, args )
198
+ }
199
+ }
200
+
201
+ # Reset output buffer. Fails if headers have been sent.
202
+ def clear()
203
+ if header_sent?
204
+ raise( Exception.new( "Can't call Web::clear()" ) )
205
+ else
206
+ @output = StringIO.new
207
+ end
208
+ end
209
+
210
+ def unbuffered?
211
+ @options[:unbuffered]
212
+ end
213
+
214
+ # send header to the client, and flush any buffered output
215
+ def flush
216
+ unless unbuffered?
217
+ send_header
218
+ @cgd.output << @output.string
219
+ @output = StringIO.new
220
+ end
221
+ end
222
+
223
+ # returns the body content of the response
224
+ # (sans headers).
225
+ def get_content
226
+ @content.string
227
+ end
228
+
229
+ # for testing: raises Test::Unit exception if content
230
+ # is not set to the provided string.
231
+ def assert_content expected, message=""
232
+ assert_equal( expected, get_content, message );
233
+ end
234
+
235
+ def get_formreader #:nodoc:
236
+ return @form_fields_cache ||= FormReader.new( get_content )
237
+ end
238
+
239
+ def get_form( name ) #:nodoc:
240
+ get_formreader[name]
241
+ end
242
+
243
+ def get_form_fields(name) #:nodoc:
244
+ get_formreader.get_fields(name)
245
+ end
246
+
247
+ def get_form_value formname, name #:nodoc:
248
+ form = get_form_fields(formname)
249
+ if form == nil
250
+ raise Web::Error.new("Form '#{formname}' does not exist")
251
+ end
252
+
253
+ value = form[name]
254
+ value
255
+ end
256
+
257
+ # assert output content contains a form
258
+ # that includes the given hash of values. See Web::Testing
259
+ def assert_form_includes formname, vars
260
+ assert_includes vars, get_form_fields(formname)
261
+ end
262
+
263
+ # flushes the output and, if applicable, saves the session
264
+ def close
265
+ flush
266
+ if $DISPLAY_TRACE
267
+ trace_output
268
+ end
269
+ @session.save if (@session.respond_to? :save)
270
+ @cgd.close
271
+ end
272
+
273
+ # There's a bit of special casing in here, for the follow reasons:
274
+ # * some headers should only be sent once. If you add
275
+ # Content-Encoding, Location, or Status, it will overwrite the old headers
276
+ # instead of adding a second header
277
+ # * content-type is a strange header. It is a combination of the content-type
278
+ # and charset attributes. setting content-type will cause the content-type
279
+ # attribute to be set; setting charset will cause the charset attribute to
280
+ # be set.
281
+ #
282
+ # I don't know if this is the correct behavior. Should this method assume that
283
+ # the content-type set here is the full content type, and try to split the
284
+ # header into it's two parts?
285
+ #
286
+ # * If the headers have been sent, this will throw a Web::Error
287
+ def add_header(name , value )
288
+ unless header_sent?
289
+ if (/content-encoding/i =~ name )
290
+ header['Content-Encoding'] = [value]
291
+ elsif( /location/i =~ name )
292
+ header['Location'] = [value]
293
+ elsif( /status/i =~ name )
294
+ if /^\d*$/ =~ value.to_s
295
+ self.status = value
296
+ else
297
+ header['Status'] = [value]
298
+ end
299
+ elsif(/content-type/i =~ name)
300
+ header['Content-Type'] = [value]
301
+ elsif(/charset/i =~ name)
302
+ self.charset = value
303
+ else
304
+ header[name] ||= []
305
+ header[name].push value
306
+ end
307
+ else
308
+ raise Web::Error.new( "Can't add_header after header have been sent to client" )
309
+ end
310
+ end
311
+
312
+ # returns an array of header values set with the given name.
313
+ def get_header name
314
+ header.keys.find_all { |key|
315
+ key.downcase == name.downcase
316
+ }.collect{ |key|
317
+ header[key].dup
318
+ }.flatten
319
+ end
320
+
321
+
322
+ # Send header to the client. No more header values can be sent after this method is called!
323
+ def send_header
324
+ unless header_sent?
325
+ @cgd.send_header( self.header )
326
+ @header_sent = true
327
+ end
328
+ end
329
+
330
+ def header_sent?
331
+ @header_sent
332
+ end
333
+
334
+ def header
335
+ @header ||= {"Content-Type" => ["text/html"],
336
+ "Status" => ["200 OK"] }
337
+ @header
338
+ end
339
+
340
+ # Raises Test::Unit::AssertionFailedError if the header
341
+ # has not been set to the provided value(s)
342
+ def assert_header( name, values, message="" )
343
+ assert_equal( [values].flatten, get_header(name), message )
344
+ end
345
+
346
+ # the default status is 200
347
+ def status
348
+ get_header( "Status" ).first =~ /^(\d+)( .*)?$/
349
+ $1
350
+ end
351
+
352
+ def status= new_status
353
+ add_header( "Status", "#{ new_status } #{ Web::HTTP_STATUS[new_status.to_s] }" )
354
+ end
355
+
356
+ def location
357
+ get_header( "Location" ).first
358
+ end
359
+
360
+ # see set redirect
361
+ def location= location
362
+ add_header( "Location", location )
363
+ end
364
+
365
+ # Sets the status and the location appropriately.
366
+ def set_redirect( new_location )
367
+ self.status = "302"
368
+ self.location = new_location
369
+ end
370
+
371
+ def encoding
372
+ get_header( "Content-Encoding" ).first
373
+ end
374
+
375
+ def encoding=( new_encoding )
376
+ add_header( "Content-Encoding", new_encoding )
377
+ end
378
+
379
+ def split_content_type( target = full_content_type )
380
+ target.split( Regexp.new('; charset=') )
381
+ end
382
+
383
+ # The content type header is a combination of the content_type and the charset.
384
+ # This method returns that combination.
385
+ def full_content_type
386
+ get_header( "Content-Type" ).first
387
+ end
388
+
389
+ def set_full_content_type( new_content, new_charset )
390
+ add_header( "Content-type", [ new_content, new_charset ].compact.join('; charset=') )
391
+ end
392
+
393
+ # the default content-type is "text/html"
394
+ def content_type
395
+ split_content_type[0]
396
+ end
397
+
398
+ def content_type= new_content_type
399
+ content1, charset1 = split_content_type
400
+ content2, charset2 = split_content_type( new_content_type )
401
+
402
+ set_full_content_type( content2 || content1,
403
+ charset2 || charset1 )
404
+ end
405
+
406
+ def charset
407
+ split_content_type[1]
408
+ end
409
+
410
+ def charset= new_charset
411
+ set_full_content_type( content_type, new_charset )
412
+ end
413
+
414
+ # Cookies require a name and a value. You can also use these
415
+ # optional keyword arguments:
416
+ # <b>:path</b> => <i>string<i>:: path (need better description)
417
+ # <b>:domain</b> => <i>string</i>:: domain (need better description)
418
+ # <b>:expires</b> => <i>date</i>:: date this cookie should expire
419
+ # <b>:secure</b> => <i>true || false </i>:: whether this cookie should be
420
+ # tagged as secure.
421
+ def set_cookie( name, value, options={} )
422
+ value = Array(value).collect{ |field|
423
+ Web::escape(field)
424
+ }.join("&")
425
+
426
+ cookie = "#{ name }=#{ value }"
427
+
428
+
429
+ path = if (options[:path])
430
+ options[:path]
431
+ else
432
+ %r|^(.*/)|.match(env["script_name"])
433
+ ($1 or "")
434
+ end
435
+
436
+ cookie += "; path=#{ path }"
437
+
438
+ if (options[:domain])
439
+ cookie += "; domain=#{ options[:domain] }"
440
+ end
441
+
442
+ if (options[:expires])
443
+ cookie += "; expires=#{ Web::rfc1123_date( options[:expires] ) }"
444
+ end
445
+
446
+ if (options[:secure])
447
+ cookie += "; secure"
448
+ end
449
+
450
+ add_header( "Set-Cookie", cookie )
451
+ end
452
+
453
+ # returns an array of cookie values that have been set.
454
+ # path / expires / etc. info is currently not returned, should
455
+ # be added in?
456
+ def get_cookie key
457
+ get_header("Set-Cookie").collect{ |cookie|
458
+ /\A(#{ key })=([^;]*)/ =~ cookie
459
+ $2
460
+ }.compact
461
+ end
462
+
463
+ # returns a hash of all the cookie n/v pairs that have
464
+ # been set on the cgi
465
+ def cookies_sent
466
+ cookies = {}
467
+ get_header("Set-Cookie").each do |cookie|
468
+ /\A(.*?)=([^;]*)/ =~ cookie
469
+ cookies[$1] = $2
470
+ end
471
+ cookies
472
+ end
473
+
474
+ # Throws Test::Unit::AssertionFailedException if
475
+ # cookie values are not present.
476
+ def assert_cookie( name, values, message="" )
477
+ assert_equal( [values].flatten, get_cookie(name), message )
478
+ end
479
+
480
+ # Aside from when :nph is set in the options, scripts running in IIS always
481
+ # use nph mode. This code will probably be affected as cgi is re-organized
482
+ # to support multiple backends.
483
+ def nph?
484
+ @cgd.nph?
485
+ end
486
+
487
+ # ENV variables, scoped to the cgi (for in-process servers)
488
+ def env
489
+ @cgd.env
490
+ end
491
+
492
+ ENV_KEYS = [ :path_info, :document_root, :script_name ]
493
+
494
+ ENV_KEYS.each{ |symbol|
495
+ define_method( symbol ) {
496
+ env[symbol.to_s]
497
+ }
498
+ }
499
+
500
+ #------------------------------
501
+ # implementation details, aka
502
+ # refactoring targets below
503
+ #------------------------------
504
+
505
+ end
506
+
507
+ # == Purpose
508
+ # this is the implementation of the cgi interface.
509
+ # As dbi to dbd, cgi to cgd
510
+ class CGD
511
+
512
+ attr_accessor :options, :env, :input, :output, :cookies, :multiple_params
513
+
514
+ include Parser
515
+
516
+ def CGD::create(options={})
517
+ case CGI::server_sniff
518
+ when :fcgi
519
+ require 'web/sapi/fastcgi'
520
+ Web::CGD::Fastcgi.new( options )
521
+ when :mod_ruby
522
+ require 'web/sapi/mod_ruby'
523
+ Web::CGD::ModRuby.new( options )
524
+ else
525
+ CGD.new(options)
526
+ end
527
+ end
528
+
529
+ def initialize(options={})
530
+ @options = options
531
+
532
+ @input = options[:in] || $stdin
533
+ @output = options[:out] || $stdout
534
+ @env = downcase_env( options[:env] || ENV )
535
+
536
+ @env['document_root'] = options[:document_root] || Web.get_docroot || @env['document_root']
537
+ @env['script_name' ] = options[:script_name] || @env['script_name']
538
+
539
+ parse_request
540
+ end
541
+
542
+ def close
543
+
544
+ end
545
+
546
+ # should this be server specific?
547
+ def nph?
548
+ @options[:nph] || /IIS/.match(env["server_software"])
549
+ end
550
+
551
+ def send_header( header )
552
+ send_nph_header( header ) if (nph?)
553
+
554
+ header.sort.each { |name, value|
555
+ value.each { |v|
556
+ output << "#{ name }: #{ v }\r\n"
557
+ }
558
+ }
559
+
560
+ output << "\r\n"
561
+ end
562
+
563
+ def send_nph_header( header ) #:nodoc:
564
+ output << "#{ env['server_protocol'] || 'HTTP/1.0' }: "
565
+ output << "#{ header['Status'] }\r\n"
566
+ output << "Date: #{ Web::rfc1123_date(Time.now) }\r\n"
567
+
568
+ header.delete("Status")
569
+
570
+ unless header.has_key? "Server"
571
+ header["Server"] = [ env["server_software"] || "" ]
572
+ end
573
+ end
574
+
575
+ end
576
+
577
+ class CGI
578
+ def report_error( err )
579
+ self.puts "<h3>ruby error:</h3>"
580
+ self.puts Dir.pwd
581
+ self.puts err.to_s.gsub(/\n/,"<br><br>")
582
+ self.puts "<blockquote>"
583
+ self.puts( if (err.backtrace.size > 3)
584
+ err.backtrace[0...-2]
585
+ else
586
+ err.backtrace
587
+ end).collect{ |string| string + "<br>" }
588
+ self.puts "</blockquote>"
589
+ end
590
+
591
+ # returns one of these values:
592
+ # :cgi, :fastcgi, :mod_ruby, :webrick
593
+ def CGI::server_sniff
594
+ if( Object.const_defined?( "Apache" ) \
595
+ && Apache.const_defined?( "Request" ) \
596
+ && $stdin.kind_of?( Apache::Request ) )
597
+ :mod_ruby
598
+ elsif ( Object.const_defined?( "FCGI" ) \
599
+ && ! FCGI.is_cgi? )
600
+ :fcgi
601
+ else
602
+ :cgi
603
+ end
604
+ end
605
+
606
+ @@in_process = false
607
+ def CGI::basic_process( options={}) #:nodoc:
608
+ unless @@in_process
609
+ @@in_process = true
610
+ Web.set_cgi( CGI.new( options ) )
611
+ yield Web.get_cgi
612
+ Web.get_cgi.close
613
+ @@in_process = false
614
+ Web.get_cgi
615
+ else
616
+ yield Web.get_cgi
617
+ Web.get_cgi
618
+ end
619
+ end
620
+
621
+
622
+ # try to include fastcgi
623
+ begin
624
+ require 'fcgi'
625
+ rescue LoadError
626
+
627
+ end
628
+
629
+ def CGI::process( options={}, &block )
630
+ if CGI::server_sniff == :fcgi
631
+ FCGI::each_request{ |fcgi|
632
+ options[:fcgi] = fcgi
633
+ CGI::basic_process( options, &block )
634
+ }
635
+ else
636
+ CGI::basic_process(options, &block )
637
+ end
638
+ end
639
+
640
+ end
641
+ end