IOWA 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (502) hide show
  1. checksums.yaml +7 -0
  2. data/CONTRIBUTORS +14 -0
  3. data/README.md +23 -0
  4. data/RELEASE_NOTES +77 -0
  5. data/ToDo +21 -0
  6. data/components/CRUDList/CRUDList.html +13 -0
  7. data/components/CRUDList/CRUDList.iwa +136 -0
  8. data/components/Content/Content.html +0 -0
  9. data/components/Content/Content.iwa +143 -0
  10. data/components/Content/example/README +9 -0
  11. data/components/Content/example/cgi/iowa.cgi +10 -0
  12. data/components/Content/example/demo.rb +30 -0
  13. data/components/Content/example/doc/index.html +7 -0
  14. data/components/Content/example/iowa/Content.html +1 -0
  15. data/components/Content/example/iowa/Content.iwa +1 -0
  16. data/components/Content/example/iowa/Main.html +6 -0
  17. data/components/Content/example/iowa/Main.iwa +3 -0
  18. data/components/Content/example/iowa/_content/body +7 -0
  19. data/components/Content/example/iowa/_content/body2 +3 -0
  20. data/components/Content/example/iowa/_content/title +2 -0
  21. data/components/Content/example/iowa/app.cnf +8 -0
  22. data/components/Content/example/iowa/app.rb +8 -0
  23. data/components/Content/example/webrick.rb +38 -0
  24. data/components/Include/Include.html +1 -0
  25. data/components/Include/Include.iwa +30 -0
  26. data/components/Include/readme +5 -0
  27. data/components/JumpTo/JumpTo.html +8 -0
  28. data/components/JumpTo/JumpTo.iwa +8 -0
  29. data/components/JumpTo/readme +6 -0
  30. data/doc/Architecture.txt +6 -0
  31. data/doc/History.txt +33 -0
  32. data/doc/StandardDispatcher.txt +19 -0
  33. data/examples/blog/README +1 -0
  34. data/examples/hello_world/README +17 -0
  35. data/examples/hello_world/htdocs/hello_world_html.html +24 -0
  36. data/examples/hello_world/htdocs/hello_world_ruby.html +41 -0
  37. data/examples/hello_world/iowa/HelloWorld.html +14 -0
  38. data/examples/hello_world/iowa/HelloWorld.iwa +31 -0
  39. data/examples/hello_world/iowa/Index.html +16 -0
  40. data/examples/hello_world/iowa/Index.iwa +5 -0
  41. data/examples/hello_world/iowa/iowa_hello_world.cnf +19 -0
  42. data/examples/hello_world/iowa/iowa_hello_world.rb +5 -0
  43. data/examples/hello_world/iowa/mapfile.cnf +6 -0
  44. data/examples/hw1/iowa/Main.html +1 -0
  45. data/examples/hw1/iowa/README +9 -0
  46. data/examples/hw1/iowa/hw.rb +4 -0
  47. data/examples/hw2/iowa/Main.html +10 -0
  48. data/examples/hw2/iowa/Main.iwa +7 -0
  49. data/examples/hw2/iowa/README +16 -0
  50. data/examples/hw2/iowa/hw.rb +4 -0
  51. data/examples/hw3/iowa/Main.html +11 -0
  52. data/examples/hw3/iowa/Main.iwa +7 -0
  53. data/examples/hw3/iowa/README +22 -0
  54. data/examples/hw3/iowa/hw.rb +4 -0
  55. data/examples/hw4/iowa/Greetings.html +10 -0
  56. data/examples/hw4/iowa/Greetings.iwa +9 -0
  57. data/examples/hw4/iowa/Main.html +12 -0
  58. data/examples/hw4/iowa/Main.iwa +10 -0
  59. data/examples/hw4/iowa/README +28 -0
  60. data/examples/hw4/iowa/hw.rb +4 -0
  61. data/examples/hw5/iowa/Footer.html +2 -0
  62. data/examples/hw5/iowa/Greetings.html +4 -0
  63. data/examples/hw5/iowa/Greetings.iwa +12 -0
  64. data/examples/hw5/iowa/Header.html +6 -0
  65. data/examples/hw5/iowa/Main.html +12 -0
  66. data/examples/hw5/iowa/Main.iwa +13 -0
  67. data/examples/hw5/iowa/README +16 -0
  68. data/examples/hw5/iowa/hw.rb +4 -0
  69. data/examples/template_server/iowa/Content.iwa +121 -0
  70. data/examples/template_server/iowa/Content.view +0 -0
  71. data/examples/template_server/iowa/DBContentDispatcher.rb +112 -0
  72. data/examples/template_server/iowa/DBContentPage.html +3 -0
  73. data/examples/template_server/iowa/DBContentPage.iwa +85 -0
  74. data/examples/template_server/iowa/app.cnf +13 -0
  75. data/examples/template_server/iowa/app.rb +5 -0
  76. data/ext/Classifier/classifier.c +256 -0
  77. data/ext/Classifier/ext_help.h +14 -0
  78. data/ext/Classifier/extconf.rb +5 -0
  79. data/ext/Classifier/tst.h +40 -0
  80. data/ext/Classifier/tst_cleanup.c +24 -0
  81. data/ext/Classifier/tst_delete.c +146 -0
  82. data/ext/Classifier/tst_grow_node_free_list.c +38 -0
  83. data/ext/Classifier/tst_init.c +41 -0
  84. data/ext/Classifier/tst_insert.c +192 -0
  85. data/ext/Classifier/tst_search.c +68 -0
  86. data/ext/http11/README +11 -0
  87. data/ext/http11/ext_help.h +15 -0
  88. data/ext/http11/extconf.rb +5 -0
  89. data/ext/http11/http11.c +534 -0
  90. data/ext/http11/http11.c.dif +422 -0
  91. data/ext/http11/http11_parser.c +1243 -0
  92. data/ext/http11/http11_parser.c.dif +193 -0
  93. data/ext/http11/http11_parser.h +49 -0
  94. data/ext/http11/http11_parser.h.dif +20 -0
  95. data/ext/http11/http11_parser.rl +192 -0
  96. data/ext/httpmachine/Makefile +149 -0
  97. data/ext/httpmachine/extconf.rb +33 -0
  98. data/ext/httpmachine/http.cpp +430 -0
  99. data/ext/httpmachine/http.h +156 -0
  100. data/ext/httpmachine/rubyhttp.cpp +165 -0
  101. data/external/mime-types/LICENCE +18 -0
  102. data/external/mime-types/README +46 -0
  103. data/external/mime-types/doc/classes/MIME.html +120 -0
  104. data/external/mime-types/doc/classes/MIME/InvalidContentType.html +119 -0
  105. data/external/mime-types/doc/classes/MIME/Type.html +866 -0
  106. data/external/mime-types/doc/classes/MIME/Type.src/M000010.html +22 -0
  107. data/external/mime-types/doc/classes/MIME/Type.src/M000011.html +18 -0
  108. data/external/mime-types/doc/classes/MIME/Type.src/M000012.html +19 -0
  109. data/external/mime-types/doc/classes/MIME/Type.src/M000013.html +18 -0
  110. data/external/mime-types/doc/classes/MIME/Type.src/M000014.html +26 -0
  111. data/external/mime-types/doc/classes/MIME/Type.src/M000015.html +33 -0
  112. data/external/mime-types/doc/classes/MIME/Type.src/M000016.html +27 -0
  113. data/external/mime-types/doc/classes/MIME/Type.src/M000017.html +35 -0
  114. data/external/mime-types/doc/classes/MIME/Type.src/M000018.html +34 -0
  115. data/external/mime-types/doc/classes/MIME/Type.src/M000019.html +24 -0
  116. data/external/mime-types/doc/classes/MIME/Type.src/M000020.html +38 -0
  117. data/external/mime-types/doc/classes/MIME/Type.src/M000021.html +22 -0
  118. data/external/mime-types/doc/classes/MIME/Type.src/M000022.html +18 -0
  119. data/external/mime-types/doc/classes/MIME/Type.src/M000023.html +18 -0
  120. data/external/mime-types/doc/classes/MIME/Type.src/M000024.html +18 -0
  121. data/external/mime-types/doc/classes/MIME/Type.src/M000025.html +18 -0
  122. data/external/mime-types/doc/classes/MIME/Type.src/M000026.html +18 -0
  123. data/external/mime-types/doc/classes/MIME/Type.src/M000027.html +18 -0
  124. data/external/mime-types/doc/classes/MIME/Type.src/M000028.html +18 -0
  125. data/external/mime-types/doc/classes/MIME/Type.src/M000029.html +18 -0
  126. data/external/mime-types/doc/classes/MIME/Type.src/M000030.html +19 -0
  127. data/external/mime-types/doc/classes/MIME/Type.src/M000031.html +26 -0
  128. data/external/mime-types/doc/classes/MIME/Types.html +459 -0
  129. data/external/mime-types/doc/classes/MIME/Types.src/M000001.html +19 -0
  130. data/external/mime-types/doc/classes/MIME/Types.src/M000002.html +32 -0
  131. data/external/mime-types/doc/classes/MIME/Types.src/M000003.html +21 -0
  132. data/external/mime-types/doc/classes/MIME/Types.src/M000004.html +18 -0
  133. data/external/mime-types/doc/classes/MIME/Types.src/M000005.html +26 -0
  134. data/external/mime-types/doc/classes/MIME/Types.src/M000006.html +18 -0
  135. data/external/mime-types/doc/classes/MIME/Types.src/M000007.html +18 -0
  136. data/external/mime-types/doc/classes/MIME/Types.src/M000008.html +18 -0
  137. data/external/mime-types/doc/classes/MIME/Types.src/M000009.html +18 -0
  138. data/external/mime-types/doc/created.rid +1 -0
  139. data/external/mime-types/doc/files/ChangeLog.html +320 -0
  140. data/external/mime-types/doc/files/README.html +145 -0
  141. data/external/mime-types/doc/files/lib/mime/types_rb.html +101 -0
  142. data/external/mime-types/doc/fr_class_index.html +30 -0
  143. data/external/mime-types/doc/fr_file_index.html +29 -0
  144. data/external/mime-types/doc/fr_method_index.html +57 -0
  145. data/external/mime-types/doc/index.html +24 -0
  146. data/external/mime-types/doc/rdoc-style.css +208 -0
  147. data/external/mime-types/lib/mime/types.rb +1558 -0
  148. data/external/package.rb +672 -0
  149. data/external/test_support.rb +95 -0
  150. data/external/tmail/README +7 -0
  151. data/external/tmail/tmail.rb +4 -0
  152. data/external/tmail/tmail/address.rb +222 -0
  153. data/external/tmail/tmail/base64.rb +52 -0
  154. data/external/tmail/tmail/compat.rb +39 -0
  155. data/external/tmail/tmail/config.rb +50 -0
  156. data/external/tmail/tmail/encode.rb +447 -0
  157. data/external/tmail/tmail/header.rb +895 -0
  158. data/external/tmail/tmail/info.rb +14 -0
  159. data/external/tmail/tmail/loader.rb +1 -0
  160. data/external/tmail/tmail/mail.rb +869 -0
  161. data/external/tmail/tmail/mailbox.rb +386 -0
  162. data/external/tmail/tmail/mbox.rb +1 -0
  163. data/external/tmail/tmail/net.rb +260 -0
  164. data/external/tmail/tmail/obsolete.rb +123 -0
  165. data/external/tmail/tmail/parser.rb +1475 -0
  166. data/external/tmail/tmail/parser.y +372 -0
  167. data/external/tmail/tmail/port.rb +356 -0
  168. data/external/tmail/tmail/scanner.rb +17 -0
  169. data/external/tmail/tmail/scanner_r.rb +243 -0
  170. data/external/tmail/tmail/stringio.rb +256 -0
  171. data/external/tmail/tmail/textutils.rb +197 -0
  172. data/external/tmail/tmail/tmail.rb +1 -0
  173. data/external/tmail/tmail/utils.rb +23 -0
  174. data/external/win32-process/README +133 -0
  175. data/external/win32-process/lib/win32/process.rb +561 -0
  176. data/external/windows-pr/README +145 -0
  177. data/external/windows-pr/doc/conversion_guide.txt +25 -0
  178. data/external/windows-pr/lib/windows/clipboard.rb +72 -0
  179. data/external/windows-pr/lib/windows/console.rb +323 -0
  180. data/external/windows-pr/lib/windows/device_io.rb +88 -0
  181. data/external/windows-pr/lib/windows/directory.rb +80 -0
  182. data/external/windows-pr/lib/windows/error.rb +313 -0
  183. data/external/windows-pr/lib/windows/eventlog.rb +120 -0
  184. data/external/windows-pr/lib/windows/file.rb +349 -0
  185. data/external/windows-pr/lib/windows/filesystem.rb +16 -0
  186. data/external/windows-pr/lib/windows/handle.rb +31 -0
  187. data/external/windows-pr/lib/windows/library.rb +76 -0
  188. data/external/windows-pr/lib/windows/limits.rb +13 -0
  189. data/external/windows-pr/lib/windows/memory.rb +117 -0
  190. data/external/windows-pr/lib/windows/msvcrt/buffer.rb +48 -0
  191. data/external/windows-pr/lib/windows/msvcrt/file.rb +18 -0
  192. data/external/windows-pr/lib/windows/msvcrt/string.rb +46 -0
  193. data/external/windows-pr/lib/windows/national.rb +557 -0
  194. data/external/windows-pr/lib/windows/path.rb +296 -0
  195. data/external/windows-pr/lib/windows/pipe.rb +77 -0
  196. data/external/windows-pr/lib/windows/process.rb +171 -0
  197. data/external/windows-pr/lib/windows/registry.rb +238 -0
  198. data/external/windows-pr/lib/windows/security.rb +89 -0
  199. data/external/windows-pr/lib/windows/service.rb +183 -0
  200. data/external/windows-pr/lib/windows/shell.rb +88 -0
  201. data/external/windows-pr/lib/windows/sound.rb +52 -0
  202. data/external/windows-pr/lib/windows/synchronize.rb +161 -0
  203. data/external/windows-pr/lib/windows/system_info.rb +70 -0
  204. data/external/windows-pr/lib/windows/unicode.rb +138 -0
  205. data/external/windows-pr/lib/windows/window.rb +22 -0
  206. data/iowa.gemspec +45 -0
  207. data/microprojects/DiskCache/LICENSE +28 -0
  208. data/microprojects/DiskCache/README +17 -0
  209. data/microprojects/DiskCache/external/package.rb +608 -0
  210. data/microprojects/DiskCache/external/test_support.rb +8 -0
  211. data/microprojects/DiskCache/setup.rb +22 -0
  212. data/microprojects/DiskCache/src/iowa/Association.rb +67 -0
  213. data/microprojects/DiskCache/src/iowa/Constants.rb +159 -0
  214. data/microprojects/DiskCache/src/iowa/DiskStore.rb +377 -0
  215. data/microprojects/DiskCache/src/iowa/Hash.rb +63 -0
  216. data/microprojects/DiskCache/src/iowa/Lockfile.rb +575 -0
  217. data/microprojects/DiskCache/src/iowa/Mutex.rb +142 -0
  218. data/microprojects/DiskCache/src/iowa/caches/DiskCache.rb +605 -0
  219. data/microprojects/DiskCache/src/iowa/caches/LRUCache.rb +287 -0
  220. data/microprojects/DiskCache/test/TC_DiskCache.rb +218 -0
  221. data/microprojects/LRUCache/LICENSE +28 -0
  222. data/microprojects/LRUCache/README +13 -0
  223. data/microprojects/LRUCache/external/package.rb +608 -0
  224. data/microprojects/LRUCache/external/test_support.rb +8 -0
  225. data/microprojects/LRUCache/setup.rb +22 -0
  226. data/microprojects/LRUCache/src/iowa/Association.rb +57 -0
  227. data/microprojects/LRUCache/src/iowa/Constants.rb +159 -0
  228. data/microprojects/LRUCache/src/iowa/Hash.rb +63 -0
  229. data/microprojects/LRUCache/src/iowa/Mutex.rb +129 -0
  230. data/microprojects/LRUCache/src/iowa/caches/LRUCache.rb +287 -0
  231. data/microprojects/LRUCache/test/TC_LRUCache.rb +65 -0
  232. data/microprojects/LinkedList/LICENSE +28 -0
  233. data/microprojects/LinkedList/README +13 -0
  234. data/microprojects/LinkedList/external/package.rb +608 -0
  235. data/microprojects/LinkedList/external/test_support.rb +8 -0
  236. data/microprojects/LinkedList/setup.rb +22 -0
  237. data/microprojects/LinkedList/src/iowa/LinkedList.rb +165 -0
  238. data/microprojects/LinkedList/test/TC_LinkedList.rb +42 -0
  239. data/microprojects/README +8 -0
  240. data/setup.rb +116 -0
  241. data/share/iowa/app_skeleton/Main.html +8 -0
  242. data/share/iowa/app_skeleton/Main.iwa +15 -0
  243. data/share/iowa/app_skeleton/app.cnf +48 -0
  244. data/share/iowa/app_skeleton/app.rb +58 -0
  245. data/share/iowa/app_skeleton/models/model.rb +49 -0
  246. data/src/ihc.rb +223 -0
  247. data/src/iowa.cgi +29 -0
  248. data/src/iowa.rb +637 -0
  249. data/src/iowa/AbstractCache.rb +96 -0
  250. data/src/iowa/AcceptLanguage.rb +76 -0
  251. data/src/iowa/Application.rb +928 -0
  252. data/src/iowa/ApplicationStats.rb +72 -0
  253. data/src/iowa/Association.rb +67 -0
  254. data/src/iowa/BindingsParser.rb +62 -0
  255. data/src/iowa/Breakpoint.rb +273 -0
  256. data/src/iowa/CSS.rb +564 -0
  257. data/src/iowa/Client.rb +192 -0
  258. data/src/iowa/Component.rb +405 -0
  259. data/src/iowa/ComponentProxy.rb +26 -0
  260. data/src/iowa/Config.rb +21 -0
  261. data/src/iowa/Constants.rb +226 -0
  262. data/src/iowa/Context.rb +218 -0
  263. data/src/iowa/ContextLogger.rb +16 -0
  264. data/src/iowa/DbPool.rb +222 -0
  265. data/src/iowa/DetachedComponent.rb +18 -0
  266. data/src/iowa/Dispatcher.rb +27 -0
  267. data/src/iowa/DynamicElements.rb +471 -0
  268. data/src/iowa/Element.rb +100 -0
  269. data/src/iowa/Email.rb +287 -0
  270. data/src/iowa/Extensions/AllExtensions.rb +4 -0
  271. data/src/iowa/Extensions/Class.rb +94 -0
  272. data/src/iowa/Extensions/Date.rb +88 -0
  273. data/src/iowa/Extensions/DateTime.rb +88 -0
  274. data/src/iowa/Extensions/Hash.rb +22 -0
  275. data/src/iowa/Extensions/Kernel.rb +6 -0
  276. data/src/iowa/Extensions/Numeric.rb +47 -0
  277. data/src/iowa/Extensions/Object.rb +11 -0
  278. data/src/iowa/Extensions/String.rb +60 -0
  279. data/src/iowa/Extensions/Time.rb +89 -0
  280. data/src/iowa/Extensions/TimeExtensions.rb +6 -0
  281. data/src/iowa/Form.rb +368 -0
  282. data/src/iowa/Hash.rb +85 -0
  283. data/src/iowa/ISAAC.rb +175 -0
  284. data/src/iowa/ImageSize.rb +279 -0
  285. data/src/iowa/IowaComponentMixins.rb +7 -0
  286. data/src/iowa/JSON-lexer.rb +296 -0
  287. data/src/iowa/JSON-objects.rb +201 -0
  288. data/src/iowa/KeyValueCoding.rb +91 -0
  289. data/src/iowa/LinkedList.rb +175 -0
  290. data/src/iowa/Loader.rb +22 -0
  291. data/src/iowa/Lockfile.rb +575 -0
  292. data/src/iowa/Logger.rb +74 -0
  293. data/src/iowa/Monkey.rb +20 -0
  294. data/src/iowa/Mutex.rb +142 -0
  295. data/src/iowa/Policy.rb +70 -0
  296. data/src/iowa/Pool.rb +243 -0
  297. data/src/iowa/PrettyException.rb +1091 -0
  298. data/src/iowa/Request.rb +244 -0
  299. data/src/iowa/Response.rb +133 -0
  300. data/src/iowa/Session.rb +354 -0
  301. data/src/iowa/SessionStats.rb +78 -0
  302. data/src/iowa/String.rb +65 -0
  303. data/src/iowa/Tag.rb +101 -0
  304. data/src/iowa/TemplateParser.rb +236 -0
  305. data/src/iowa/Util.rb +314 -0
  306. data/src/iowa/Webcache.rb +122 -0
  307. data/src/iowa/caches/BiLevelCache.rb +65 -0
  308. data/src/iowa/caches/ClassLimitedCache.rb +67 -0
  309. data/src/iowa/caches/DiskCache.rb +609 -0
  310. data/src/iowa/caches/DiskStore.rb +380 -0
  311. data/src/iowa/caches/LRUCache-alternative.rb +155 -0
  312. data/src/iowa/caches/LRUCache.rb +290 -0
  313. data/src/iowa/caches/SimpleLRUCache.rb +112 -0
  314. data/src/iowa/dispatchers/StandardDispatcher.rb +396 -0
  315. data/src/iowa/dispatchers/StandardDispatcherWithClassifier.rb +93 -0
  316. data/src/iowa/js/iowa_jsonrpc.js +381 -0
  317. data/src/iowa/js/jsonrpc.js +187 -0
  318. data/src/iowa/js/jsonrpc_async.js +261 -0
  319. data/src/iowa/loaders/DiskLoader.rb +50 -0
  320. data/src/iowa/loggers/Analogger.rb +54 -0
  321. data/src/iowa/loggers/AsyncLogger.rb +54 -0
  322. data/src/iowa/loggers/BitBucket.rb +38 -0
  323. data/src/iowa/loggers/Log4R.rb +13 -0
  324. data/src/iowa/loggers/Log4rLogger.rb +48 -0
  325. data/src/iowa/loggers/Logger.rb +29 -0
  326. data/src/iowa/loggers/RubyLogger.rb +9 -0
  327. data/src/iowa/pools/DBConnectionPool.rb +53 -0
  328. data/src/iowa/request/Apache.rb +90 -0
  329. data/src/iowa/request/EMHybrid.rb +59 -0
  330. data/src/iowa/request/ENV.rb +80 -0
  331. data/src/iowa/request/FCGI.rb +68 -0
  332. data/src/iowa/request/HTTPMachine.rb +75 -0
  333. data/src/iowa/request/Mongrel.rb +68 -0
  334. data/src/iowa/request/WEBrick.rb +48 -0
  335. data/src/iowa/version.rb +3 -0
  336. data/src/iowa/webrick/HTTPServer.rb +43 -0
  337. data/src/iowa/webrick/WEBrickServlet.rb +28 -0
  338. data/src/iowa_fcgi_handler.rb +101 -0
  339. data/src/iowa_httpmachine.rb +141 -0
  340. data/src/iowa_hybrid.rb +193 -0
  341. data/src/iowa_hybrid_cluster.rb +231 -0
  342. data/src/iowa_mongrel.rb +136 -0
  343. data/src/iowa_webrick.rb +194 -0
  344. data/src/iowa_webrick_legacy.rb +104 -0
  345. data/src/mod_iowa.rb +104 -0
  346. data/tcss.rb +61 -0
  347. data/test/README.windows +12 -0
  348. data/test/TC_AcceptLanguage.rb +61 -0
  349. data/test/TC_AppConfig.rb +43 -0
  350. data/test/TC_AppConfig/cgi/iowa.cgi +7 -0
  351. data/test/TC_AppConfig/doc/index.html +1 -0
  352. data/test/TC_AppConfig/iowa/Main.html +4 -0
  353. data/test/TC_AppConfig/iowa/Main.iwa +17 -0
  354. data/test/TC_AppConfig/iowa/README +1 -0
  355. data/test/TC_AppConfig/iowa/app.cnf +19 -0
  356. data/test/TC_AppConfig/iowa/app.rb +8 -0
  357. data/test/TC_AppConfig/webrick.rb +38 -0
  358. data/test/TC_Association.rb +29 -0
  359. data/test/TC_BiLevelCache.rb +71 -0
  360. data/test/TC_CGI_Adaptor.rb +55 -0
  361. data/test/TC_CGI_Adaptor/cgi/iowa.cgi +7 -0
  362. data/test/TC_CGI_Adaptor/doc/index.html +1 -0
  363. data/test/TC_CGI_Adaptor/iowa/Main.html +8 -0
  364. data/test/TC_CGI_Adaptor/iowa/Main.iwa +14 -0
  365. data/test/TC_CGI_Adaptor/iowa/README +1 -0
  366. data/test/TC_CGI_Adaptor/iowa/app.cnf +8 -0
  367. data/test/TC_CGI_Adaptor/iowa/app.rb +8 -0
  368. data/test/TC_CGI_Adaptor/webrick.rb +38 -0
  369. data/test/TC_CSS.rb +660 -0
  370. data/test/TC_ClassLimitedCache.rb +89 -0
  371. data/test/TC_Classifier.rb +80 -0
  372. data/test/TC_DbPool.rb +127 -0
  373. data/test/TC_DiskCache.rb +218 -0
  374. data/test/TC_Hybrid.rb +58 -0
  375. data/test/TC_Hybrid/doc/thing.txt +1 -0
  376. data/test/TC_Hybrid/iowa/Main.html +3 -0
  377. data/test/TC_Hybrid/iowa/Main.iwa +7 -0
  378. data/test/TC_Hybrid/iowa/NewPage.html +1 -0
  379. data/test/TC_Hybrid/iowa/NewPage.iwa +5 -0
  380. data/test/TC_Hybrid/iowa/app.cnf +10 -0
  381. data/test/TC_Hybrid/iowa/app.rb +5 -0
  382. data/test/TC_IOWAFunctions/doc/Ajax1.html +1 -0
  383. data/test/TC_IOWAFunctions/doc/Ajax1.iwa +1 -0
  384. data/test/TC_IOWAFunctions/doc/index.html +1 -0
  385. data/test/TC_IOWAFunctions/doc/js/dojo.js +9686 -0
  386. data/test/TC_IOWAFunctions/iowa/Ajax1.html +40 -0
  387. data/test/TC_IOWAFunctions/iowa/Ajax1.iwa +23 -0
  388. data/test/TC_IOWAFunctions/iowa/AjaxWidget.iwa +19 -0
  389. data/test/TC_IOWAFunctions/iowa/AjaxWidget.view +22 -0
  390. data/test/TC_IOWAFunctions/iowa/DanielTest.html +9 -0
  391. data/test/TC_IOWAFunctions/iowa/DanielTest.iwa +10 -0
  392. data/test/TC_IOWAFunctions/iowa/IntervalWidget.html +1 -0
  393. data/test/TC_IOWAFunctions/iowa/IntervalWidget.iwa +14 -0
  394. data/test/TC_IOWAFunctions/iowa/Main.html +1 -0
  395. data/test/TC_IOWAFunctions/iowa/NestedRepeat1.html +12 -0
  396. data/test/TC_IOWAFunctions/iowa/NestedRepeat1.iwa +24 -0
  397. data/test/TC_IOWAFunctions/iowa/RPCResponse.iwa +7 -0
  398. data/test/TC_IOWAFunctions/iowa/RPCResponse.view +1 -0
  399. data/test/TC_IOWAFunctions/iowa/Repeat1.iwa +31 -0
  400. data/test/TC_IOWAFunctions/iowa/Repeat1.view +9 -0
  401. data/test/TC_IOWAFunctions/iowa/Repeat2.iwa +32 -0
  402. data/test/TC_IOWAFunctions/iowa/Repeat2.view +11 -0
  403. data/test/TC_IOWAFunctions/iowa/Repeat3.iwa +44 -0
  404. data/test/TC_IOWAFunctions/iowa/Repeat3.view +18 -0
  405. data/test/TC_IOWAFunctions/iowa/TesCon.html +1 -0
  406. data/test/TC_IOWAFunctions/iowa/TesCon.iwa +5 -0
  407. data/test/TC_IOWAFunctions/iowa/app.cnf +19 -0
  408. data/test/TC_IOWAFunctions/iowa/app.rb +9 -0
  409. data/test/TC_IOWAFunctions/iowa/mapfile.cnf +8 -0
  410. data/test/TC_ISAAC.rb +52 -0
  411. data/test/TC_ImageSize.rb +84 -0
  412. data/test/TC_ImageSize/img.bmp +0 -0
  413. data/test/TC_ImageSize/img.gif +0 -0
  414. data/test/TC_ImageSize/img.jpg +0 -0
  415. data/test/TC_ImageSize/img.pcx +0 -0
  416. data/test/TC_ImageSize/img.pgm +7144 -0
  417. data/test/TC_ImageSize/img.png +0 -0
  418. data/test/TC_ImageSize/img.ppm +0 -0
  419. data/test/TC_ImageSize/img.psd +0 -0
  420. data/test/TC_ImageSize/img.tiff +0 -0
  421. data/test/TC_ImageSize/img.xbm +22 -0
  422. data/test/TC_KeyValueCoding.rb +35 -0
  423. data/test/TC_LRUCache.rb +296 -0
  424. data/test/TC_LinkedList.rb +46 -0
  425. data/test/TC_Lockfile.rb +106 -0
  426. data/test/TC_Minimal.rb +45 -0
  427. data/test/TC_Minimal/app.cnf +8 -0
  428. data/test/TC_Minimal/cgi-bin/iowa.cgi +11 -0
  429. data/test/TC_Minimal/doc/index.html +1 -0
  430. data/test/TC_Minimal/iowa/Main.html +1 -0
  431. data/test/TC_Minimal/iowa/README +1 -0
  432. data/test/TC_Minimal/iowa/app.rb +3 -0
  433. data/test/TC_Minimal/webrick.rb +38 -0
  434. data/test/TC_Mongrel.rb +58 -0
  435. data/test/TC_Mongrel/doc/thing.txt +1 -0
  436. data/test/TC_Mongrel/iowa/Main.html +3 -0
  437. data/test/TC_Mongrel/iowa/Main.iwa +7 -0
  438. data/test/TC_Mongrel/iowa/NewPage.html +1 -0
  439. data/test/TC_Mongrel/iowa/NewPage.iwa +5 -0
  440. data/test/TC_Mongrel/iowa/app.cnf +10 -0
  441. data/test/TC_Mongrel/iowa/app.rb +5 -0
  442. data/test/TC_NoSubclass.rb +56 -0
  443. data/test/TC_NoSubclass/cgi/iowa.cgi +7 -0
  444. data/test/TC_NoSubclass/doc/index.html +1 -0
  445. data/test/TC_NoSubclass/iowa/Main.html +8 -0
  446. data/test/TC_NoSubclass/iowa/Main.iwa +14 -0
  447. data/test/TC_NoSubclass/iowa/README +1 -0
  448. data/test/TC_NoSubclass/iowa/app.cnf +8 -0
  449. data/test/TC_NoSubclass/iowa/app.rb +5 -0
  450. data/test/TC_NoSubclass/webrick.rb +38 -0
  451. data/test/TC_Pool.rb +139 -0
  452. data/test/TC_RenderedCache/doc/thing.txt +1 -0
  453. data/test/TC_RenderedCache/iowa/BigPage.html +1 -0
  454. data/test/TC_RenderedCache/iowa/BigPage.iwa +12 -0
  455. data/test/TC_RenderedCache/iowa/Main.html +3 -0
  456. data/test/TC_RenderedCache/iowa/Main.iwa +7 -0
  457. data/test/TC_RenderedCache/iowa/NewPage.html +1 -0
  458. data/test/TC_RenderedCache/iowa/NewPage.iwa +11 -0
  459. data/test/TC_RenderedCache/iowa/app.cnf +13 -0
  460. data/test/TC_RenderedCache/iowa/app.rb +5 -0
  461. data/test/TC_RenderedCache/iowa/mapfile.map +4 -0
  462. data/test/TC_ResourceURL.rb +73 -0
  463. data/test/TC_ResourceURL/iowa/Main.html +2 -0
  464. data/test/TC_ResourceURL/iowa/Main.iwa +10 -0
  465. data/test/TC_ResourceURL/iowa/app.cnf +10 -0
  466. data/test/TC_ResourceURL/iowa/app.rb +5 -0
  467. data/test/TC_SimpleDetached.rb +41 -0
  468. data/test/TC_StandardDispatcher.rb +362 -0
  469. data/test/TC_StandardDispatcherWithClassifier.rb +358 -0
  470. data/test/TC_String.rb +24 -0
  471. data/test/TC_Tag.rb +41 -0
  472. data/test/TC_Webrick.rb +56 -0
  473. data/test/TC_Webrick/doc/thing.txt +1 -0
  474. data/test/TC_Webrick/iowa/Main.html +3 -0
  475. data/test/TC_Webrick/iowa/Main.iwa +7 -0
  476. data/test/TC_Webrick/iowa/NewPage.html +1 -0
  477. data/test/TC_Webrick/iowa/NewPage.iwa +5 -0
  478. data/test/TC_Webrick/iowa/app.cnf +10 -0
  479. data/test/TC_Webrick/iowa/app.rb +5 -0
  480. data/test/tc_template.rb +15 -0
  481. data/test/tests.conf +19 -0
  482. data/utils/CVS/Entries +3 -0
  483. data/utils/CVS/Repository +1 -0
  484. data/utils/CVS/Root +1 -0
  485. data/utils/QuickCert-1.0.2.tar.gz +0 -0
  486. data/utils/QuickCert-1.0.2/InstalledFiles +7 -0
  487. data/utils/QuickCert-1.0.2/MANIFEST +10 -0
  488. data/utils/QuickCert-1.0.2/Makefile +15 -0
  489. data/utils/QuickCert-1.0.2/README +56 -0
  490. data/utils/QuickCert-1.0.2/bin/QuickCert +355 -0
  491. data/utils/QuickCert-1.0.2/config.save +12 -0
  492. data/utils/QuickCert-1.0.2/data/examples/ruby/QuickCert/README +60 -0
  493. data/utils/QuickCert-1.0.2/data/examples/ruby/QuickCert/drbssl_c.rb +26 -0
  494. data/utils/QuickCert-1.0.2/data/examples/ruby/QuickCert/drbssl_s.rb +35 -0
  495. data/utils/QuickCert-1.0.2/data/examples/ruby/QuickCert/qc_config +21 -0
  496. data/utils/QuickCert-1.0.2/lib/QuickCert/defaults.rb +28 -0
  497. data/utils/QuickCert-1.0.2/setup.rb +1312 -0
  498. data/utils/iowa_apps +422 -0
  499. data/utils/smtp_sink.rb +9 -0
  500. data/utils/startup_template.cnf +27 -0
  501. data/utils/startup_template.rb +73 -0
  502. metadata +551 -0
@@ -0,0 +1,136 @@
1
+ Iowa.runmode = :mongrel
2
+ require 'mongrel'
3
+ require 'mongrel/handlers'
4
+ require 'iowa/request/Mongrel'
5
+ require 'iowa/Client'
6
+
7
+ Socket.do_not_reverse_lookup = true
8
+
9
+ module Iowa
10
+ class MongrelHandler < ::Mongrel::HttpHandler
11
+ def initialize(config)
12
+ @config = config
13
+ @filemap = {}
14
+ end
15
+
16
+ def deliver_file(filename,suffix,res)
17
+ res.status = 200
18
+ ct = MIME::Types.type_for("foo.#{suffix}").first
19
+ res.header['Content-Type'] = ct ? ct.content_type : 'application/octet-stream'
20
+ res.body << File.read(filename)
21
+ Logger['iowa_log'].info "Delivered static file: #{filename}"
22
+ end
23
+
24
+ def handle_file(req, res)
25
+ path_info = req.params['PATH_INFO']
26
+ if path_info == '/' or path_info == ''
27
+ path_info = '/index.html'
28
+ elsif path_info =~ /^([^.]+)$/
29
+ path_info = "#{$1}/index.html"
30
+ end
31
+
32
+ qsfilename = "#{@config[Iowa::Capplication][Iowa::Cdoc_root]}#{path_info}__#{req.params['QUERY_STRING']}"
33
+ filename = "#{@config[Iowa::Capplication][Iowa::Cdoc_root]}#{path_info}"
34
+
35
+ if (FileTest.exist?(qsfilename) and File.expand_path(qsfilename).index(@config[Iowa::Capplication][Iowa::Cdoc_root]) == 0)
36
+ suffix = path_info.sub(/[_\s]*$/,C_empty)
37
+ deliver_file(filename, File.extname(suffix)[1..-1],res)
38
+ true
39
+ elsif (FileTest.exist?(filename) and File.expand_path(filename).index(@config[Iowa::Capplication][Iowa::Cdoc_root]) == 0)
40
+ suffix = path_info.sub(/[_\s]*$/,C_empty)
41
+ deliver_file(filename, File.extname(suffix)[1..-1],res)
42
+ true
43
+ else
44
+ false
45
+ end
46
+ end
47
+
48
+ def process(req, res)
49
+ Thread.current[:worker] = true
50
+ unless handle_file(req, res)
51
+ request = Iowa::Request::Mongrel.new(req)
52
+ response = Iowa.handleConnection request
53
+ ::Iowa::InlineClient.new(request,response).print(res)
54
+ end
55
+ end
56
+ end
57
+
58
+
59
+
60
+ # Handle the communications coming in on the monitored socket,
61
+ # create a context object from the data received, and then pass
62
+ # the context information into the Application object for final
63
+ # handling. Exception handling is simply via capturing the Exception
64
+ # and outputting a stack backtrace (this could be improved).
65
+
66
+ def self.handleConnection(request)
67
+ start_time = read_time = Time.now
68
+ mylog = Logger[Ciowa_log]
69
+
70
+ status = []
71
+ response = handleRequest(request)
72
+ begin
73
+ response.status_line = request.status_line if request.status_line
74
+ response.content_type = request.content_type if request.content_type
75
+ status[0] = response.status_line
76
+ if request.headers_out.respond_to?(:length) and request.headers_out.length > 0
77
+ request.headers_out.each {|k,v| response.headers.set(k,v)}
78
+ end
79
+ rescue Exception => e
80
+ mylog.info e.to_s, e.backtrace.inspect
81
+ end
82
+
83
+ end_time = Time.now
84
+ logline = "#{start_time} (#{read_time - start_time}/#{end_time - start_time}) :: #{request.uri} \"#{status[0]}\" #{response.body.length}B"
85
+ mylog.info logline
86
+ response
87
+ end
88
+
89
+ # Outputs the location of the socket being monitored, then enters the
90
+ # event loop to wait for and handle connections.
91
+
92
+ def self.eventLoop
93
+ Logger[Ciowa_log].info 'Entering the mongrel event loop...'
94
+ @mongrel.run
95
+ @mongrel_thread = @mongrel.acceptor
96
+ @mongrel_thread.join
97
+ end
98
+
99
+ def self.run(*args)
100
+ run_check_started(*args)
101
+ mylog = Logger[Ciowa_log]
102
+ my_ip = @config[Csocket][Chostname]
103
+ my_ip_hex = my_ip.split('.',4).collect {|x| to_hex(x)}.join
104
+
105
+ if @config[Csocket].has_key? Cport
106
+ socket_host = @config[Csocket][Chostname]
107
+ socket_port = @config[Csocket][Cport]
108
+ my_port_hex = sprintf('%04s',socket_port.to_i.to_s(16)).gsub(' ','0')
109
+ Iowa.app.location = "#{my_ip_hex}#{my_port_hex}"
110
+ else
111
+ if Iowa.app.serial_number.to_s != ''
112
+ Iowa.app.location = "00000000#{sprintf('%04s',Iowa.app.serial_number.to_i.to_s(16)).gsub(' ','0')}"
113
+ else
114
+ Iowa.app.location = ''
115
+ end
116
+ end
117
+
118
+ mongrel_options = {:BindAddress => @config[Csocket][Chostname],
119
+ :Port => @config[Csocket][Cport],
120
+ :DocumentRoot => "#{@config[Capplication][Croot_url]}/doc"}
121
+ @mongrel = ::Mongrel::HttpServer.new(mongrel_options[:BindAddress], mongrel_options[:Port])
122
+ @mongrel.register('/', MongrelHandler.new(@config))
123
+
124
+ app.initialLoad()
125
+ @server = nil
126
+ setup_signal_handlers
127
+
128
+ begin
129
+ eventLoop
130
+ rescue Exception => exception
131
+ mylog.fatal "Catastrophic failure in main event loop: #{exception} :: " + exception.backtrace.join(".....").to_s
132
+ ensure
133
+ File.delete(@config[Csocket][Cpath]) if @config[Csocket].has_key? Cpath
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,194 @@
1
+ Iowa.runmode = :webrick
2
+ require 'iowa/Client'
3
+ require 'iowa/request/WEBrick'
4
+ require 'webrick'
5
+
6
+ module Iowa
7
+ module WEBrick
8
+ class SwallowLogs
9
+ def method_missing(*args)
10
+ end
11
+ end
12
+
13
+ class IWAServlet < ::WEBrick::HTTPServlet::AbstractServlet
14
+ def deliver_file(response, filename, suffix)
15
+ d = File.read(filename)
16
+ ct = MIME::Types.type_for("foo.#{suffix}").first
17
+ response["Date"] = Time.now.httpdate
18
+ response["Connection"] = "close"
19
+ response["Content-type"] = ct ? ct.content_type : 'application/octet-stream'
20
+ response["Content-Length"] = d.length
21
+ response.body = d
22
+ Logger[Ciowa_log].info "Delivered static file: #{filename}"
23
+ end
24
+
25
+ def handle_file(request,response)
26
+ path_info = request.path
27
+ qs = request.query_string
28
+ if path_info == C_slash or path_info == C_empty
29
+ path_info = C_slashindex_html
30
+ elsif path_info =~ /^([^.]+)$/
31
+ path_info = "#{$1}/index.html"
32
+ end
33
+
34
+ qsfilename = "#{Iowa.config[Iowa::Capplication][Iowa::Cdoc_root]}#{path_info}__#{qs}"
35
+ filename = "#{Iowa.config[Iowa::Capplication][Iowa::Cdoc_root]}#{path_info}"
36
+ if (FileTest.exist?(filename) and File.expand_path(filename).index(Iowa.config[Iowa::Capplication][Iowa::Cdoc_root]) == 0)
37
+ suffix = path_info.sub(/[_\s]*$/,C_empty)
38
+ deliver_file(response, filename, File.extname(suffix)[1..-1])
39
+ true
40
+ elsif qs and (FileTest.exist?(qsfilename) and File.expand_path(qsfilename).index(Iowa.config[Iowa::Capplication][Iowa::Cdoc_root]) == 0)
41
+ suffix = path_info.sub(/[_\s]*$/,C_empty)
42
+ deliver_file(qsfilename, File.extname(suffix)[1..-1])
43
+ true
44
+ else
45
+ false
46
+ end
47
+ end
48
+
49
+ def do_GET request, response
50
+ unless handle_file(request,response)
51
+ rq = Iowa::Request::WEBrick.new(request)
52
+ rs = Iowa::handleConnection(rq)
53
+
54
+ response.status = rs.status
55
+ response.reason_phrase = ::Iowa::Response::RESPONSE_CODES[rs.status]
56
+ response["Date"] = Time.now.httpdate
57
+ response["Connection"] = "close"
58
+ response["Content-type"] = rs.content_type || "text/html"
59
+ response["Content-Length"] = rs.body.length
60
+ rs.headers.each {|k,v| response[k] = v}
61
+ response.body = rs.body
62
+ end
63
+ end
64
+ alias do_POST do_GET
65
+ end
66
+
67
+
68
+ class HTTPServer < ::WEBrick::HTTPServer
69
+
70
+ def initialize(options)
71
+ @mappings = {}
72
+ @iowa_servlet = Iowa::WEBrick::IWAServlet
73
+ super
74
+ end
75
+
76
+ def service(req,res)
77
+ if req.unparsed_uri == "*"
78
+ if req.request_method == "OPTIONS"
79
+ do_OPTIONS(req, res)
80
+ raise ::HTTPStatus::OK
81
+ end
82
+ raise ::HTTPStatus::NotFound, "`#{req.unparsed_uri}' not found."
83
+ end
84
+
85
+ servlet, options, script_name, path_info = search_servlet(req.path)
86
+ unless servlet
87
+ servlet = @iowa_servlet
88
+ script_name = 'Iowa'
89
+ path_info = req.path
90
+ end
91
+ req.script_name = script_name
92
+ req.path_info = path_info
93
+ si = servlet.get_instance(self, *options)
94
+ si.service(req, res)
95
+ end
96
+ end
97
+ end
98
+ end
99
+
100
+ module Iowa
101
+
102
+ # Handle the communications coming in on the monitored socket,
103
+ # create a context object from the data received, and then pass
104
+ # the context information into the Application object for final
105
+ # handling.
106
+
107
+ def self.handleConnection(request)
108
+ start_time = read_time = Time.now
109
+ mylog = Logger[Ciowa_log]
110
+
111
+ status = []
112
+ response = handleRequest(request)
113
+ begin
114
+ response.status_line = request.status_line if request.status_line
115
+ response.content_type = request.content_type if request.content_type
116
+ status[0] = response.status_line
117
+ if request.headers_out.respond_to?(:length) and request.headers_out.length > 0
118
+ request.headers_out.each {|k,v| response.headers.set(k,v)}
119
+ end
120
+ rescue Exception => e
121
+ mylog.info e.to_s, e.backtrace.inspect
122
+ end
123
+
124
+ end_time = Time.now
125
+ logline = "#{start_time} (#{read_time - start_time}/#{end_time - start_time}) :: #{request.uri} \"#{status[0]}\" #{response.body.length}B"
126
+ mylog.info logline
127
+ response
128
+ end
129
+
130
+ # Outputs the location of the socket being monitored, then enters the
131
+ # event loop to wait for and handle connections.
132
+
133
+ def self.eventLoop(server)
134
+ Logger[Ciowa_log].info 'Entering the WEBrick event loop...'
135
+ server.start
136
+ end
137
+
138
+ def self.run(*args)
139
+ run_check_started(*args)
140
+ mylog = Logger[Ciowa_log]
141
+ my_ip = @config[Csocket][Chostname]
142
+ my_ip_hex = my_ip.split('.',4).collect {|x| to_hex(x)}.join
143
+
144
+ ruby = File.join(::RbConfig::CONFIG['bindir'],
145
+ ::RbConfig::CONFIG['ruby_install_name']) << ::RbConfig::CONFIG['EXEEXT']
146
+
147
+ if @config[Csocket].has_key? Cport
148
+ socket_host = @config[Csocket][Chostname]
149
+ socket_port = @config[Csocket][Cport]
150
+ my_port_hex = sprintf('%04s',socket_port.to_i.to_s(16)).gsub(' ','0')
151
+ Iowa.app.location = "#{my_ip_hex}#{my_port_hex}"
152
+ else
153
+ if Iowa.app.serial_number.to_s != ''
154
+ Iowa.app.location = "00000000#{sprintf('%04s',Iowa.app.serial_number.to_i.to_s(16)).gsub(' ','0')}"
155
+ else
156
+ Iowa.app.location = ''
157
+ end
158
+ end
159
+
160
+
161
+ app.initialLoad()
162
+ setup_signal_handlers
163
+
164
+ swallow_logs = Iowa::WEBrick::SwallowLogs.new
165
+
166
+ @server = Iowa::WEBrick::HTTPServer.new(
167
+ :Port => @config[Csocket][Cport],
168
+ :BindAddress => @config[Csocket][Chostname],
169
+ :DocumentRoot => Iowa.app.class.docroot,
170
+ :Logger => swallow_logs,
171
+ :AccessLog => swallow_logs,
172
+ :CGIInterpreter => ruby)
173
+
174
+ if Iowa.app.class.cgiroot and FileTest.exist?(Iowa.app.class.cgiroot)
175
+ file_handler_options = {:HandlerTable => Hash.new(::WEBrick::HTTPServlet::CGIHandler)}
176
+ prefix = Iowa.app.class.cgiroot =~ /cgi-bin/ ? '/cgi-bin' : 'cgi'
177
+ @server.mount(prefix, ::WEBrick::HTTPServlet::FileHandler, Iowa.app.class.cgiroot, file_handler_options)
178
+ end
179
+ @server.mount('/',Iowa::WEBrick::IWAServlet)
180
+
181
+ setup_signal_handlers
182
+
183
+ begin
184
+ eventLoop(@server)
185
+ rescue Exception => exception
186
+ mylog.fatal "Catastrophic failure in main event loop: #{exception} :: " + exception.backtrace.join(".....").to_s
187
+ ensure
188
+ File.delete(@config[Csocket][Cpath]) if @config[Csocket].has_key? Cpath
189
+ @server.shutdown
190
+ exit
191
+ end
192
+ end
193
+ end
194
+
@@ -0,0 +1,104 @@
1
+ require 'iowa'
2
+ require 'iowa/request/WEBrick'
3
+ require 'iowa/webrick/HTTPServer'
4
+ require 'rbconfig'
5
+
6
+ module Iowa
7
+ def Iowa.checkConfiguration
8
+ unless @config.has_key? Csocket
9
+ @config[Csocket][Cport] = 2001
10
+ @config[Csocket][Chostname] = '127.0.0.1'
11
+ end
12
+ @config[Cwebrick] = {} unless @config[Cwebrick].length > 0
13
+ @config[Capplication][Cdaemonize] = false unless @config[Capplication][Cdaemonize].is_a?(String)
14
+ if @config.has_key? Clogging
15
+ if @config[Clogging].has_key? Cbasedir
16
+ raise "The logging basedir (#{@config[Clogging][Cbasedir]}) must be a directory." unless FileTest.directory? @config[Clogging][Cbasedir]
17
+ raise "The logging basedir #{@config[Clogging][Cbasedir]}) must be writeable." unless FileTest.writable? @config[Clogging][Cbasedir]
18
+ end
19
+
20
+ raise "The minimum logging level (minlevel) must be an integer between 0 to 7, inclusively." if @config[Clogging].has_key? Cminlevel and (@config[Clogging][Cminlevel] < 0 or @config[Clogging][Cminlevel] > 7)
21
+
22
+ raise "The maximum log file size (maxsize) must be greater than zero." if @config.has_key? Cmaxsize and @config[Cmaxsize] <= 0
23
+
24
+ raise "The maximum log file age (maxage) must be greater than zero." if @config.has_key? Cmaxage and @config[Cmaxage] <= 0
25
+ end
26
+
27
+ # Now apply any defaults for optional items which were not specified.
28
+
29
+ @config[Clogging] = {} unless @config.has_key? Clogging
30
+ @config[Clogging][Cbasedir] = '/tmp' unless @config[Clogging].has_key? Cbasedir
31
+ @config[Clogging][Cminlevel] = 0 unless @config[Clogging].has_key? Cminlevel
32
+ @config[Clogging][Cmaxsize] = 1024 * 1024 unless @config[Clogging].has_key? Cmaxsize
33
+ @config[Clogging][Cmaxage] = 86400 unless @config[Clogging].has_key? Cmaxage
34
+ if @config[Csocket].has_key? 'path'
35
+ @config[Clogging][Cfilename] = "#{@config[Clogging][Cbasedir]}/#{@config[Csocket]['basename']}.log"
36
+ else
37
+ @config[Clogging][Cfilename] = "#{@config[Clogging][Cbasedir]}/#{@config[Csocket]['hostname']}:#{@config[Csocket]['port']}.log"
38
+ end
39
+
40
+ @config[Cwebrick]['port'] ||= 2000
41
+ @config[Cwebrick][Cdocroot] ||= '../htdocs'
42
+ @config[Cwebrick]['cgiprefix'] ||= '/cgi-bin'
43
+ @config[Cwebrick]['cgiroot'] ||= '../cgi-bin'
44
+
45
+ configureExceptionScreens
46
+ end
47
+
48
+ def Iowa.handleConnection(request,response)
49
+ start_time = Time.now
50
+ status = 'OK'
51
+ buffer = nil
52
+ iowa_log = Logger[Iowa::Ciowa_log]
53
+ req = Iowa::Request::WEBrick.new(request)
54
+ read_time = Time.now
55
+
56
+ buffer = handleRequest(req)
57
+
58
+ if req.status_line and m = /^(\d+)/.match(req.status_line)
59
+ response.status = m[1]
60
+ end
61
+
62
+ response[ "Date" ] = "#{Time.now.asctime}"
63
+ response[ "Pragma" ] = "no_cache"
64
+ response[ "Connection" ] = "close"
65
+ response[ "Content-type" ] = req.content_type || "text/html"
66
+ response[ "Content-Length" ] = buffer.length
67
+ req.headers_out.each do |k,v| response[ k ] = v end
68
+
69
+ response.body = buffer
70
+
71
+ end_time = Time.now
72
+ referer = req.headers_in['Referer'] != '' ? req.headers_in['Referer'] : request.uri
73
+ iowa_log.info "#{start_time} (#{read_time.to_f - start_time.to_f}/#{end_time.to_f - start_time.to_f}) :: #{req.uri} #{status} #{buffer.length}B"
74
+ end
75
+
76
+ def Iowa.run(*args)
77
+ run_check_started(*args)
78
+ mylog = Logger['iowa_log']
79
+
80
+ ruby = File.join(::RbConfig::CONFIG['bindir'],
81
+ ::RbConfig::CONFIG['ruby_install_name'])
82
+ ruby << ::RbConfig::CONFIG['EXEEXT']
83
+
84
+ @config[Cwebrick][Cdocroot] = nil unless @config[Cwebrick].has_key? Cdocroot
85
+
86
+ mylog.info("Creating WEBrick server on port #{@config[Cwebrick]['port']} with a document root of #{@config[Cwebrick][Cdocroot]}. The mapfile is at #{Iowa.app.class.Dispatcher.mapfile}, and the Ruby interpreter used for CGI programs is #{ruby}.")
87
+ server = Iowa::HTTPServer.new(
88
+ :Port => @config[Cwebrick]['port'],
89
+ :DocumentRoot => @config[Cwebrick][Cdocroot],
90
+ :MapFile => Iowa.app.class.Dispatcher.mapfile,
91
+ :Logger => mylog,
92
+ :CGIInterpreter => ruby)
93
+
94
+ if FileTest.exist?(@config[Cwebrick]['cgiroot'])
95
+ file_handler_options = {:HandlerTable => Hash.new(WEBrick::HTTPServlet::CGIHandler)}
96
+ mylog.info("Mounting #{@config[Cwebrick]['cgiroot']} as the cgi-bin directory at #{@config[Cwebrick]['cgiprefix']}.")
97
+ server.mount(@config[Cwebrick]['cgiprefix'], WEBrick::HTTPServlet::FileHandler, @config[Cwebrick]['cgiroot'], file_handler_options)
98
+ end
99
+
100
+ trap("INT") {server.shutdown}
101
+ mylog.info("Starting WEBrick...")
102
+ server.start
103
+ end
104
+ end
@@ -0,0 +1,104 @@
1
+ require 'iowa/Client'
2
+ include Iowa
3
+
4
+ module Apache
5
+ class Iowa
6
+
7
+ URIRegex = Regexp.new('(/*(?:[^/]*/*)*?)(\w+\-\w+\-\w+\.\w+\.[\w\.]+)*$')
8
+
9
+ def Iowa.translate_uri(r)
10
+ r.setup_cgi_env
11
+ mapfile = ENV['MAP_FILE'] ? ENV['MAP_FILE'].dup : ''
12
+ mapfile.untaint
13
+ @IowaMapMTime ||= 0
14
+ @IowaMap ||= nil
15
+
16
+ if mapfile.to_s != ''
17
+ if @IowaMap and File.stat(mapfile).mtime != @IowaMapMTime
18
+ @IowaMapMTime = File.stat(mapfile)
19
+ @IowaMap = load_map_file(mapfile)
20
+ elsif mapfile.to_s != ''
21
+ @IowaMapMTime = File.stat(mapfile)
22
+ @IowaMap = load_map_file(mapfile)
23
+ end
24
+ end
25
+
26
+ if @IowaMap and mapfile.to_s != ''
27
+ upuri = r.unparsed_uri
28
+ upuri.gsub!('\?.*$','') if upuri =~ /\?/
29
+ m = URIRegex.match upuri
30
+ urlRoot = m[1]
31
+ urlRoot.chop! if m[2] unless urlRoot == '/'
32
+ if @IowaMap.has_key? urlRoot
33
+ r.uri = upuri
34
+ r.filename = urlRoot
35
+ return OK
36
+ else
37
+ return DECLINED
38
+ end
39
+ else
40
+ return DECLINED
41
+ end
42
+ end
43
+
44
+
45
+ def Iowa.handler(r)
46
+ if r.method_number == M_OPTIONS
47
+ r.allowed |= (1 << M_GET)
48
+ r.allowed |= (1 << M_POST)
49
+ return DECLINED
50
+ end
51
+
52
+ @IowaMapMTime ||= 0
53
+ @IowaMap ||= nil
54
+ r.setup_cgi_env
55
+
56
+ mapfile = ENV['MAP_FILE'] ? ENV['MAP_FILE'].dup : ''
57
+ mapfile.untaint
58
+
59
+ if mapfile.to_s != ''
60
+ if @IowaMap and File.stat(mapfile).mtime != @IowaMapMTime
61
+ @IowaMapMTime = File.stat(mapfile)
62
+ @IowaMap = load_map_file(mapfile)
63
+ elsif mapfile.to_s != ''
64
+ @IowaMapMTime = File.stat(mapfile)
65
+ @IowaMap = load_map_file(mapfile)
66
+ end
67
+ end
68
+
69
+ if @IowaMap and mapfile.to_s != ''
70
+ uri = r.uri.to_s
71
+ m = URIRegex.match(uri)
72
+ urlRoot = m[1]
73
+ urlRoot.chop! if m[2] unless urlRoot == '/'
74
+ unless @IowaMap.has_key? urlRoot
75
+ return DECLINED
76
+ end
77
+ end
78
+
79
+ client = Iowa::Client.new(ENV['IOWA_SOCKET'])
80
+ client.initiate(r)
81
+ client.receive
82
+ client.print
83
+ return OK
84
+ end
85
+
86
+ def Iowa.load_map_file(mapfile)
87
+ map = {}
88
+ begin
89
+ File.open(mapfile,'r') do |fh|
90
+ fh.each do |line|
91
+ next if line =~ /^\s*#/
92
+ line.chomp!
93
+ line.gsub!(/: .*$/,'')
94
+ map[line] = true
95
+ end
96
+ end
97
+ rescue Exception
98
+ map = nil
99
+ end
100
+
101
+ return map
102
+ end
103
+ end
104
+ end