actionpack-rack-upgrade-2 2.3.15

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 (441) hide show
  1. data/CHANGELOG +5250 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +409 -0
  4. data/RUNNING_UNIT_TESTS +24 -0
  5. data/Rakefile +158 -0
  6. data/install.rb +30 -0
  7. data/lib/action_controller.rb +113 -0
  8. data/lib/action_controller/assertions/dom_assertions.rb +55 -0
  9. data/lib/action_controller/assertions/model_assertions.rb +21 -0
  10. data/lib/action_controller/assertions/response_assertions.rb +169 -0
  11. data/lib/action_controller/assertions/routing_assertions.rb +146 -0
  12. data/lib/action_controller/assertions/selector_assertions.rb +638 -0
  13. data/lib/action_controller/assertions/tag_assertions.rb +127 -0
  14. data/lib/action_controller/base.rb +1425 -0
  15. data/lib/action_controller/benchmarking.rb +107 -0
  16. data/lib/action_controller/caching.rb +71 -0
  17. data/lib/action_controller/caching/actions.rb +177 -0
  18. data/lib/action_controller/caching/fragments.rb +120 -0
  19. data/lib/action_controller/caching/pages.rb +152 -0
  20. data/lib/action_controller/caching/sweeper.rb +45 -0
  21. data/lib/action_controller/caching/sweeping.rb +55 -0
  22. data/lib/action_controller/cgi_ext.rb +15 -0
  23. data/lib/action_controller/cgi_ext/cookie.rb +112 -0
  24. data/lib/action_controller/cgi_ext/query_extension.rb +22 -0
  25. data/lib/action_controller/cgi_ext/stdinput.rb +24 -0
  26. data/lib/action_controller/cgi_process.rb +77 -0
  27. data/lib/action_controller/cookies.rb +197 -0
  28. data/lib/action_controller/dispatcher.rb +133 -0
  29. data/lib/action_controller/failsafe.rb +87 -0
  30. data/lib/action_controller/filters.rb +680 -0
  31. data/lib/action_controller/flash.rb +213 -0
  32. data/lib/action_controller/headers.rb +33 -0
  33. data/lib/action_controller/helpers.rb +225 -0
  34. data/lib/action_controller/http_authentication.rb +309 -0
  35. data/lib/action_controller/integration.rb +708 -0
  36. data/lib/action_controller/layout.rb +286 -0
  37. data/lib/action_controller/middleware_stack.rb +119 -0
  38. data/lib/action_controller/middlewares.rb +14 -0
  39. data/lib/action_controller/mime_responds.rb +193 -0
  40. data/lib/action_controller/mime_type.rb +212 -0
  41. data/lib/action_controller/mime_types.rb +21 -0
  42. data/lib/action_controller/params_parser.rb +77 -0
  43. data/lib/action_controller/performance_test.rb +15 -0
  44. data/lib/action_controller/polymorphic_routes.rb +189 -0
  45. data/lib/action_controller/rack_lint_patch.rb +36 -0
  46. data/lib/action_controller/record_identifier.rb +104 -0
  47. data/lib/action_controller/reloader.rb +54 -0
  48. data/lib/action_controller/request.rb +495 -0
  49. data/lib/action_controller/request_forgery_protection.rb +116 -0
  50. data/lib/action_controller/rescue.rb +183 -0
  51. data/lib/action_controller/resources.rb +682 -0
  52. data/lib/action_controller/response.rb +237 -0
  53. data/lib/action_controller/routing.rb +388 -0
  54. data/lib/action_controller/routing/builder.rb +197 -0
  55. data/lib/action_controller/routing/optimisations.rb +130 -0
  56. data/lib/action_controller/routing/recognition_optimisation.rb +167 -0
  57. data/lib/action_controller/routing/route.rb +265 -0
  58. data/lib/action_controller/routing/route_set.rb +503 -0
  59. data/lib/action_controller/routing/routing_ext.rb +49 -0
  60. data/lib/action_controller/routing/segments.rb +343 -0
  61. data/lib/action_controller/session/abstract_store.rb +276 -0
  62. data/lib/action_controller/session/cookie_store.rb +240 -0
  63. data/lib/action_controller/session/mem_cache_store.rb +60 -0
  64. data/lib/action_controller/session_management.rb +54 -0
  65. data/lib/action_controller/status_codes.rb +88 -0
  66. data/lib/action_controller/streaming.rb +181 -0
  67. data/lib/action_controller/string_coercion.rb +29 -0
  68. data/lib/action_controller/templates/rescues/_request_and_response.erb +24 -0
  69. data/lib/action_controller/templates/rescues/_trace.erb +26 -0
  70. data/lib/action_controller/templates/rescues/diagnostics.erb +11 -0
  71. data/lib/action_controller/templates/rescues/layout.erb +29 -0
  72. data/lib/action_controller/templates/rescues/missing_template.erb +2 -0
  73. data/lib/action_controller/templates/rescues/routing_error.erb +10 -0
  74. data/lib/action_controller/templates/rescues/template_error.erb +21 -0
  75. data/lib/action_controller/templates/rescues/unknown_action.erb +2 -0
  76. data/lib/action_controller/test_case.rb +209 -0
  77. data/lib/action_controller/test_process.rb +580 -0
  78. data/lib/action_controller/translation.rb +13 -0
  79. data/lib/action_controller/uploaded_file.rb +44 -0
  80. data/lib/action_controller/url_rewriter.rb +229 -0
  81. data/lib/action_controller/vendor/html-scanner.rb +16 -0
  82. data/lib/action_controller/vendor/html-scanner/html/document.rb +68 -0
  83. data/lib/action_controller/vendor/html-scanner/html/node.rb +537 -0
  84. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +173 -0
  85. data/lib/action_controller/vendor/html-scanner/html/selector.rb +828 -0
  86. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +105 -0
  87. data/lib/action_controller/vendor/html-scanner/html/version.rb +11 -0
  88. data/lib/action_controller/verification.rb +130 -0
  89. data/lib/action_pack.rb +24 -0
  90. data/lib/action_pack/version.rb +9 -0
  91. data/lib/action_view.rb +58 -0
  92. data/lib/action_view/base.rb +362 -0
  93. data/lib/action_view/helpers.rb +61 -0
  94. data/lib/action_view/helpers/active_record_helper.rb +305 -0
  95. data/lib/action_view/helpers/asset_tag_helper.rb +695 -0
  96. data/lib/action_view/helpers/atom_feed_helper.rb +198 -0
  97. data/lib/action_view/helpers/benchmark_helper.rb +54 -0
  98. data/lib/action_view/helpers/cache_helper.rb +39 -0
  99. data/lib/action_view/helpers/capture_helper.rb +136 -0
  100. data/lib/action_view/helpers/csrf_helper.rb +14 -0
  101. data/lib/action_view/helpers/date_helper.rb +989 -0
  102. data/lib/action_view/helpers/debug_helper.rb +38 -0
  103. data/lib/action_view/helpers/form_helper.rb +1118 -0
  104. data/lib/action_view/helpers/form_options_helper.rb +599 -0
  105. data/lib/action_view/helpers/form_tag_helper.rb +490 -0
  106. data/lib/action_view/helpers/javascript_helper.rb +208 -0
  107. data/lib/action_view/helpers/number_helper.rb +308 -0
  108. data/lib/action_view/helpers/prototype_helper.rb +1305 -0
  109. data/lib/action_view/helpers/raw_output_helper.rb +9 -0
  110. data/lib/action_view/helpers/record_identification_helper.rb +20 -0
  111. data/lib/action_view/helpers/record_tag_helper.rb +58 -0
  112. data/lib/action_view/helpers/sanitize_helper.rb +251 -0
  113. data/lib/action_view/helpers/scriptaculous_helper.rb +226 -0
  114. data/lib/action_view/helpers/tag_helper.rb +151 -0
  115. data/lib/action_view/helpers/text_helper.rb +597 -0
  116. data/lib/action_view/helpers/translation_helper.rb +67 -0
  117. data/lib/action_view/helpers/url_helper.rb +637 -0
  118. data/lib/action_view/inline_template.rb +19 -0
  119. data/lib/action_view/locale/en.yml +117 -0
  120. data/lib/action_view/partials.rb +241 -0
  121. data/lib/action_view/paths.rb +77 -0
  122. data/lib/action_view/reloadable_template.rb +117 -0
  123. data/lib/action_view/renderable.rb +109 -0
  124. data/lib/action_view/renderable_partial.rb +53 -0
  125. data/lib/action_view/template.rb +252 -0
  126. data/lib/action_view/template_error.rb +99 -0
  127. data/lib/action_view/template_handler.rb +34 -0
  128. data/lib/action_view/template_handlers.rb +48 -0
  129. data/lib/action_view/template_handlers/builder.rb +17 -0
  130. data/lib/action_view/template_handlers/erb.rb +25 -0
  131. data/lib/action_view/template_handlers/rjs.rb +13 -0
  132. data/lib/action_view/test_case.rb +162 -0
  133. data/lib/actionpack.rb +2 -0
  134. data/test/abstract_unit.rb +78 -0
  135. data/test/active_record_unit.rb +104 -0
  136. data/test/activerecord/active_record_store_test.rb +221 -0
  137. data/test/activerecord/render_partial_with_record_identification_test.rb +188 -0
  138. data/test/adv_attr_test.rb +20 -0
  139. data/test/controller/action_pack_assertions_test.rb +545 -0
  140. data/test/controller/addresses_render_test.rb +37 -0
  141. data/test/controller/assert_select_test.rb +735 -0
  142. data/test/controller/base_test.rb +217 -0
  143. data/test/controller/benchmark_test.rb +32 -0
  144. data/test/controller/caching_test.rb +743 -0
  145. data/test/controller/capture_test.rb +66 -0
  146. data/test/controller/content_type_test.rb +178 -0
  147. data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  148. data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  149. data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  150. data/test/controller/cookie_test.rb +208 -0
  151. data/test/controller/deprecation/deprecated_base_methods_test.rb +32 -0
  152. data/test/controller/dispatcher_test.rb +144 -0
  153. data/test/controller/dom_assertions_test.rb +53 -0
  154. data/test/controller/failsafe_test.rb +60 -0
  155. data/test/controller/fake_controllers.rb +33 -0
  156. data/test/controller/fake_models.rb +19 -0
  157. data/test/controller/filter_params_test.rb +52 -0
  158. data/test/controller/filters_test.rb +885 -0
  159. data/test/controller/flash_test.rb +174 -0
  160. data/test/controller/header_test.rb +14 -0
  161. data/test/controller/helper_test.rb +224 -0
  162. data/test/controller/html-scanner/cdata_node_test.rb +15 -0
  163. data/test/controller/html-scanner/document_test.rb +148 -0
  164. data/test/controller/html-scanner/node_test.rb +89 -0
  165. data/test/controller/html-scanner/sanitizer_test.rb +281 -0
  166. data/test/controller/html-scanner/tag_node_test.rb +238 -0
  167. data/test/controller/html-scanner/text_node_test.rb +50 -0
  168. data/test/controller/html-scanner/tokenizer_test.rb +131 -0
  169. data/test/controller/http_basic_authentication_test.rb +113 -0
  170. data/test/controller/http_digest_authentication_test.rb +254 -0
  171. data/test/controller/integration_test.rb +526 -0
  172. data/test/controller/layout_test.rb +215 -0
  173. data/test/controller/localized_templates_test.rb +24 -0
  174. data/test/controller/logging_test.rb +46 -0
  175. data/test/controller/middleware_stack_test.rb +90 -0
  176. data/test/controller/mime_responds_test.rb +536 -0
  177. data/test/controller/mime_type_test.rb +93 -0
  178. data/test/controller/output_escaping_test.rb +19 -0
  179. data/test/controller/polymorphic_routes_test.rb +297 -0
  180. data/test/controller/rack_test.rb +308 -0
  181. data/test/controller/record_identifier_test.rb +139 -0
  182. data/test/controller/redirect_test.rb +285 -0
  183. data/test/controller/reloader_test.rb +125 -0
  184. data/test/controller/render_test.rb +1783 -0
  185. data/test/controller/request/json_params_parsing_test.rb +65 -0
  186. data/test/controller/request/multipart_params_parsing_test.rb +177 -0
  187. data/test/controller/request/query_string_parsing_test.rb +120 -0
  188. data/test/controller/request/test_request_test.rb +35 -0
  189. data/test/controller/request/url_encoded_params_parsing_test.rb +146 -0
  190. data/test/controller/request/xml_params_parsing_test.rb +103 -0
  191. data/test/controller/request_forgery_protection_test.rb +233 -0
  192. data/test/controller/request_test.rb +398 -0
  193. data/test/controller/rescue_test.rb +541 -0
  194. data/test/controller/resources_test.rb +1393 -0
  195. data/test/controller/routing_test.rb +2592 -0
  196. data/test/controller/selector_test.rb +628 -0
  197. data/test/controller/send_file_test.rb +171 -0
  198. data/test/controller/session/abstract_store_test.rb +64 -0
  199. data/test/controller/session/cookie_store_test.rb +354 -0
  200. data/test/controller/session/mem_cache_store_test.rb +187 -0
  201. data/test/controller/session/test_session_test.rb +58 -0
  202. data/test/controller/test_test.rb +700 -0
  203. data/test/controller/translation_test.rb +26 -0
  204. data/test/controller/url_rewriter_test.rb +395 -0
  205. data/test/controller/verification_test.rb +270 -0
  206. data/test/controller/view_paths_test.rb +141 -0
  207. data/test/controller/webservice_test.rb +273 -0
  208. data/test/fixtures/_top_level_partial.html.erb +1 -0
  209. data/test/fixtures/_top_level_partial_only.erb +1 -0
  210. data/test/fixtures/addresses/list.erb +1 -0
  211. data/test/fixtures/alternate_helpers/foo_helper.rb +3 -0
  212. data/test/fixtures/bad_customers/_bad_customer.html.erb +1 -0
  213. data/test/fixtures/companies.yml +24 -0
  214. data/test/fixtures/company.rb +10 -0
  215. data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +1 -0
  216. data/test/fixtures/content_type/render_default_for_rhtml.rhtml +1 -0
  217. data/test/fixtures/content_type/render_default_for_rjs.rjs +1 -0
  218. data/test/fixtures/content_type/render_default_for_rxml.rxml +1 -0
  219. data/test/fixtures/customers/_customer.html.erb +1 -0
  220. data/test/fixtures/db_definitions/sqlite.sql +49 -0
  221. data/test/fixtures/developer.rb +9 -0
  222. data/test/fixtures/developers.yml +21 -0
  223. data/test/fixtures/developers/_developer.erb +1 -0
  224. data/test/fixtures/developers_projects.yml +13 -0
  225. data/test/fixtures/failsafe/500.html +1 -0
  226. data/test/fixtures/fun/games/_game.erb +1 -0
  227. data/test/fixtures/fun/games/hello_world.erb +1 -0
  228. data/test/fixtures/fun/serious/games/_game.erb +1 -0
  229. data/test/fixtures/functional_caching/_partial.erb +3 -0
  230. data/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +3 -0
  231. data/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +6 -0
  232. data/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +5 -0
  233. data/test/fixtures/functional_caching/fragment_cached.html.erb +2 -0
  234. data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +1 -0
  235. data/test/fixtures/functional_caching/inline_fragment_cached.html.erb +2 -0
  236. data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +1 -0
  237. data/test/fixtures/good_customers/_good_customer.html.erb +1 -0
  238. data/test/fixtures/helpers/abc_helper.rb +5 -0
  239. data/test/fixtures/helpers/fun/games_helper.rb +3 -0
  240. data/test/fixtures/helpers/fun/pdf_helper.rb +3 -0
  241. data/test/fixtures/layout_tests/abs_path_layout.rhtml +1 -0
  242. data/test/fixtures/layout_tests/alt/hello.rhtml +1 -0
  243. data/test/fixtures/layout_tests/alt/layouts/alt.rhtml +0 -0
  244. data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +1 -0
  245. data/test/fixtures/layout_tests/layouts/item.rhtml +1 -0
  246. data/test/fixtures/layout_tests/layouts/layout_test.rhtml +1 -0
  247. data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +1 -0
  248. data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +1 -0
  249. data/test/fixtures/layout_tests/views/hello.rhtml +1 -0
  250. data/test/fixtures/layouts/_column.html.erb +2 -0
  251. data/test/fixtures/layouts/block_with_layout.erb +3 -0
  252. data/test/fixtures/layouts/builder.builder +3 -0
  253. data/test/fixtures/layouts/default_html.html.erb +1 -0
  254. data/test/fixtures/layouts/partial_with_layout.erb +3 -0
  255. data/test/fixtures/layouts/standard.erb +1 -0
  256. data/test/fixtures/layouts/talk_from_action.erb +2 -0
  257. data/test/fixtures/layouts/xhr.html.erb +2 -0
  258. data/test/fixtures/layouts/yield.erb +2 -0
  259. data/test/fixtures/localized/hello_world.de.html +1 -0
  260. data/test/fixtures/localized/hello_world.en.html +1 -0
  261. data/test/fixtures/mascot.rb +3 -0
  262. data/test/fixtures/mascots.yml +4 -0
  263. data/test/fixtures/mascots/_mascot.html.erb +1 -0
  264. data/test/fixtures/multipart/binary_file +0 -0
  265. data/test/fixtures/multipart/boundary_problem_file +10 -0
  266. data/test/fixtures/multipart/bracketed_param +5 -0
  267. data/test/fixtures/multipart/empty +10 -0
  268. data/test/fixtures/multipart/hello.txt +1 -0
  269. data/test/fixtures/multipart/large_text_file +10 -0
  270. data/test/fixtures/multipart/mixed_files +0 -0
  271. data/test/fixtures/multipart/mona_lisa.jpg +0 -0
  272. data/test/fixtures/multipart/none +9 -0
  273. data/test/fixtures/multipart/single_parameter +5 -0
  274. data/test/fixtures/multipart/text_file +10 -0
  275. data/test/fixtures/override/test/hello_world.erb +1 -0
  276. data/test/fixtures/override2/layouts/test/sub.erb +1 -0
  277. data/test/fixtures/post_test/layouts/post.html.erb +1 -0
  278. data/test/fixtures/post_test/layouts/super_post.iphone.erb +1 -0
  279. data/test/fixtures/post_test/post/index.html.erb +1 -0
  280. data/test/fixtures/post_test/post/index.iphone.erb +1 -0
  281. data/test/fixtures/post_test/super_post/index.html.erb +1 -0
  282. data/test/fixtures/post_test/super_post/index.iphone.erb +1 -0
  283. data/test/fixtures/project.rb +3 -0
  284. data/test/fixtures/projects.yml +7 -0
  285. data/test/fixtures/projects/_project.erb +1 -0
  286. data/test/fixtures/public/404.html +1 -0
  287. data/test/fixtures/public/500.da.html +1 -0
  288. data/test/fixtures/public/500.html +1 -0
  289. data/test/fixtures/public/absolute/test.css +23 -0
  290. data/test/fixtures/public/absolute/test.js +63 -0
  291. data/test/fixtures/public/images/rails.png +0 -0
  292. data/test/fixtures/public/javascripts/application.js +1 -0
  293. data/test/fixtures/public/javascripts/bank.js +1 -0
  294. data/test/fixtures/public/javascripts/controls.js +1 -0
  295. data/test/fixtures/public/javascripts/dragdrop.js +1 -0
  296. data/test/fixtures/public/javascripts/effects.js +1 -0
  297. data/test/fixtures/public/javascripts/prototype.js +1 -0
  298. data/test/fixtures/public/javascripts/robber.js +1 -0
  299. data/test/fixtures/public/javascripts/subdir/subdir.js +1 -0
  300. data/test/fixtures/public/javascripts/version.1.0.js +1 -0
  301. data/test/fixtures/public/stylesheets/bank.css +1 -0
  302. data/test/fixtures/public/stylesheets/robber.css +1 -0
  303. data/test/fixtures/public/stylesheets/subdir/subdir.css +1 -0
  304. data/test/fixtures/public/stylesheets/version.1.0.css +1 -0
  305. data/test/fixtures/quiz/questions/_question.html.erb +1 -0
  306. data/test/fixtures/replies.yml +15 -0
  307. data/test/fixtures/replies/_reply.erb +1 -0
  308. data/test/fixtures/reply.rb +7 -0
  309. data/test/fixtures/respond_to/all_types_with_layout.html.erb +1 -0
  310. data/test/fixtures/respond_to/all_types_with_layout.js.rjs +1 -0
  311. data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +1 -0
  312. data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +1 -0
  313. data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +1 -0
  314. data/test/fixtures/respond_to/layouts/missing.html.erb +1 -0
  315. data/test/fixtures/respond_to/layouts/standard.html.erb +1 -0
  316. data/test/fixtures/respond_to/layouts/standard.iphone.erb +1 -0
  317. data/test/fixtures/respond_to/using_defaults.html.erb +1 -0
  318. data/test/fixtures/respond_to/using_defaults.js.rjs +1 -0
  319. data/test/fixtures/respond_to/using_defaults.xml.builder +1 -0
  320. data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +1 -0
  321. data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +1 -0
  322. data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +1 -0
  323. data/test/fixtures/scope/test/modgreet.erb +1 -0
  324. data/test/fixtures/session_autoload_test/session_autoload_test/foo.rb +10 -0
  325. data/test/fixtures/shared.html.erb +1 -0
  326. data/test/fixtures/symlink_parent/symlinked_layout.erb +5 -0
  327. data/test/fixtures/test/_counter.html.erb +1 -0
  328. data/test/fixtures/test/_customer.erb +1 -0
  329. data/test/fixtures/test/_customer_counter.erb +1 -0
  330. data/test/fixtures/test/_customer_counter_with_as.erb +1 -0
  331. data/test/fixtures/test/_customer_greeting.erb +1 -0
  332. data/test/fixtures/test/_customer_with_var.erb +1 -0
  333. data/test/fixtures/test/_form.erb +1 -0
  334. data/test/fixtures/test/_from_helper.erb +1 -0
  335. data/test/fixtures/test/_hash_greeting.erb +1 -0
  336. data/test/fixtures/test/_hash_object.erb +2 -0
  337. data/test/fixtures/test/_hello.builder +1 -0
  338. data/test/fixtures/test/_labelling_form.erb +1 -0
  339. data/test/fixtures/test/_layout_for_block_with_args.html.erb +3 -0
  340. data/test/fixtures/test/_layout_for_partial.html.erb +3 -0
  341. data/test/fixtures/test/_local_inspector.html.erb +1 -0
  342. data/test/fixtures/test/_one.html.erb +1 -0
  343. data/test/fixtures/test/_partial.erb +1 -0
  344. data/test/fixtures/test/_partial.html.erb +1 -0
  345. data/test/fixtures/test/_partial.js.erb +1 -0
  346. data/test/fixtures/test/_partial_for_use_in_layout.html.erb +1 -0
  347. data/test/fixtures/test/_partial_only.erb +1 -0
  348. data/test/fixtures/test/_partial_with_only_html_version.html.erb +1 -0
  349. data/test/fixtures/test/_person.erb +2 -0
  350. data/test/fixtures/test/_raise.html.erb +1 -0
  351. data/test/fixtures/test/_two.html.erb +1 -0
  352. data/test/fixtures/test/_utf8_partial.html.erb +1 -0
  353. data/test/fixtures/test/_utf8_partial_magic.html.erb +2 -0
  354. data/test/fixtures/test/action_talk_to_layout.erb +2 -0
  355. data/test/fixtures/test/array_translation.erb +1 -0
  356. data/test/fixtures/test/calling_partial_with_layout.html.erb +1 -0
  357. data/test/fixtures/test/capturing.erb +4 -0
  358. data/test/fixtures/test/content_for.erb +2 -0
  359. data/test/fixtures/test/content_for_concatenated.erb +3 -0
  360. data/test/fixtures/test/content_for_with_parameter.erb +2 -0
  361. data/test/fixtures/test/delete_with_js.rjs +2 -0
  362. data/test/fixtures/test/dont_pick_me +1 -0
  363. data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +1 -0
  364. data/test/fixtures/test/enum_rjs_test.rjs +6 -0
  365. data/test/fixtures/test/formatted_html_erb.html.erb +1 -0
  366. data/test/fixtures/test/formatted_xml_erb.builder +1 -0
  367. data/test/fixtures/test/formatted_xml_erb.html.erb +1 -0
  368. data/test/fixtures/test/formatted_xml_erb.xml.erb +1 -0
  369. data/test/fixtures/test/greeting.erb +1 -0
  370. data/test/fixtures/test/greeting.js.rjs +1 -0
  371. data/test/fixtures/test/hello.builder +4 -0
  372. data/test/fixtures/test/hello_world.da.html.erb +1 -0
  373. data/test/fixtures/test/hello_world.erb +1 -0
  374. data/test/fixtures/test/hello_world.erb~ +1 -0
  375. data/test/fixtures/test/hello_world.pt-BR.html.erb +1 -0
  376. data/test/fixtures/test/hello_world_container.builder +3 -0
  377. data/test/fixtures/test/hello_world_from_rxml.builder +4 -0
  378. data/test/fixtures/test/hello_world_with_layout_false.erb +1 -0
  379. data/test/fixtures/test/hello_xml_world.builder +11 -0
  380. data/test/fixtures/test/hyphen-ated.erb +1 -0
  381. data/test/fixtures/test/implicit_content_type.atom.builder +2 -0
  382. data/test/fixtures/test/list.erb +1 -0
  383. data/test/fixtures/test/malformed/malformed.en.html.erb~ +1 -0
  384. data/test/fixtures/test/malformed/malformed.erb~ +1 -0
  385. data/test/fixtures/test/malformed/malformed.html.erb~ +1 -0
  386. data/test/fixtures/test/nested_layout.erb +3 -0
  387. data/test/fixtures/test/non_erb_block_content_for.builder +4 -0
  388. data/test/fixtures/test/potential_conflicts.erb +4 -0
  389. data/test/fixtures/test/render_explicit_html_template.js.rjs +1 -0
  390. data/test/fixtures/test/render_file_from_template.html.erb +1 -0
  391. data/test/fixtures/test/render_file_with_ivar.erb +1 -0
  392. data/test/fixtures/test/render_file_with_locals.erb +1 -0
  393. data/test/fixtures/test/render_implicit_html_template.js.rjs +1 -0
  394. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb +1 -0
  395. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb +1 -0
  396. data/test/fixtures/test/render_implicit_js_template_without_layout.js.erb +1 -0
  397. data/test/fixtures/test/render_to_string_test.erb +1 -0
  398. data/test/fixtures/test/scoped_array_translation.erb +1 -0
  399. data/test/fixtures/test/sub_template_raise.html.erb +1 -0
  400. data/test/fixtures/test/template.erb +1 -0
  401. data/test/fixtures/test/translation.erb +1 -0
  402. data/test/fixtures/test/update_element_with_capture.erb +9 -0
  403. data/test/fixtures/test/using_layout_around_block.html.erb +1 -0
  404. data/test/fixtures/test/using_layout_around_block_with_args.html.erb +1 -0
  405. data/test/fixtures/test/utf8.html.erb +4 -0
  406. data/test/fixtures/test/utf8_magic.html.erb +5 -0
  407. data/test/fixtures/test/utf8_magic_with_bare_partial.html.erb +5 -0
  408. data/test/fixtures/topic.rb +3 -0
  409. data/test/fixtures/topics.yml +22 -0
  410. data/test/fixtures/topics/_topic.html.erb +1 -0
  411. data/test/template/active_record_helper_i18n_test.rb +51 -0
  412. data/test/template/active_record_helper_test.rb +302 -0
  413. data/test/template/asset_tag_helper_test.rb +770 -0
  414. data/test/template/atom_feed_helper_test.rb +315 -0
  415. data/test/template/benchmark_helper_test.rb +86 -0
  416. data/test/template/compiled_templates_test.rb +204 -0
  417. data/test/template/date_helper_i18n_test.rb +121 -0
  418. data/test/template/date_helper_test.rb +2603 -0
  419. data/test/template/erb_util_test.rb +36 -0
  420. data/test/template/form_helper_test.rb +1447 -0
  421. data/test/template/form_options_helper_i18n_test.rb +27 -0
  422. data/test/template/form_options_helper_test.rb +811 -0
  423. data/test/template/form_tag_helper_test.rb +356 -0
  424. data/test/template/javascript_helper_test.rb +106 -0
  425. data/test/template/number_helper_i18n_test.rb +69 -0
  426. data/test/template/number_helper_test.rb +132 -0
  427. data/test/template/prototype_helper_test.rb +639 -0
  428. data/test/template/raw_output_helper_test.rb +21 -0
  429. data/test/template/record_tag_helper_test.rb +58 -0
  430. data/test/template/render_test.rb +329 -0
  431. data/test/template/sanitize_helper_test.rb +57 -0
  432. data/test/template/scriptaculous_helper_test.rb +90 -0
  433. data/test/template/tag_helper_test.rb +98 -0
  434. data/test/template/template_test.rb +32 -0
  435. data/test/template/test_test.rb +54 -0
  436. data/test/template/text_helper_test.rb +597 -0
  437. data/test/template/translation_helper_test.rb +95 -0
  438. data/test/template/url_helper_test.rb +641 -0
  439. data/test/testing_sandbox.rb +15 -0
  440. data/test/view/test_case_test.rb +176 -0
  441. metadata +519 -0
@@ -0,0 +1,152 @@
1
+ require 'fileutils'
2
+ require 'uri'
3
+
4
+ module ActionController #:nodoc:
5
+ module Caching
6
+ # Page caching is an approach to caching where the entire action output of is stored as a HTML file that the web server
7
+ # can serve without going through Action Pack. This is the fastest way to cache your content as opposed to going dynamically
8
+ # through the process of generating the content. Unfortunately, this incredible speed-up is only available to stateless pages
9
+ # where all visitors are treated the same. Content management systems -- including weblogs and wikis -- have many pages that are
10
+ # a great fit for this approach, but account-based systems where people log in and manipulate their own data are often less
11
+ # likely candidates.
12
+ #
13
+ # Specifying which actions to cache is done through the <tt>caches_page</tt> class method:
14
+ #
15
+ # class WeblogController < ActionController::Base
16
+ # caches_page :show, :new
17
+ # end
18
+ #
19
+ # This will generate cache files such as <tt>weblog/show/5.html</tt> and <tt>weblog/new.html</tt>,
20
+ # which match the URLs used to trigger the dynamic generation. This is how the web server is able
21
+ # pick up a cache file when it exists and otherwise let the request pass on to Action Pack to generate it.
22
+ #
23
+ # Expiration of the cache is handled by deleting the cached file, which results in a lazy regeneration approach where the cache
24
+ # is not restored before another hit is made against it. The API for doing so mimics the options from +url_for+ and friends:
25
+ #
26
+ # class WeblogController < ActionController::Base
27
+ # def update
28
+ # List.update(params[:list][:id], params[:list])
29
+ # expire_page :action => "show", :id => params[:list][:id]
30
+ # redirect_to :action => "show", :id => params[:list][:id]
31
+ # end
32
+ # end
33
+ #
34
+ # Additionally, you can expire caches using Sweepers that act on changes in the model to determine when a cache is supposed to be
35
+ # expired.
36
+ module Pages
37
+ def self.included(base) #:nodoc:
38
+ base.extend(ClassMethods)
39
+ base.class_eval do
40
+ @@page_cache_directory = defined?(Rails.public_path) ? Rails.public_path : ""
41
+ ##
42
+ # :singleton-method:
43
+ # The cache directory should be the document root for the web server and is set using <tt>Base.page_cache_directory = "/document/root"</tt>.
44
+ # For Rails, this directory has already been set to Rails.public_path (which is usually set to <tt>RAILS_ROOT + "/public"</tt>). Changing
45
+ # this setting can be useful to avoid naming conflicts with files in <tt>public/</tt>, but doing so will likely require configuring your
46
+ # web server to look in the new location for cached files.
47
+ cattr_accessor :page_cache_directory
48
+
49
+ @@page_cache_extension = '.html'
50
+ ##
51
+ # :singleton-method:
52
+ # Most Rails requests do not have an extension, such as <tt>/weblog/new</tt>. In these cases, the page caching mechanism will add one in
53
+ # order to make it easy for the cached files to be picked up properly by the web server. By default, this cache extension is <tt>.html</tt>.
54
+ # If you want something else, like <tt>.php</tt> or <tt>.shtml</tt>, just set Base.page_cache_extension. In cases where a request already has an
55
+ # extension, such as <tt>.xml</tt> or <tt>.rss</tt>, page caching will not add an extension. This allows it to work well with RESTful apps.
56
+ cattr_accessor :page_cache_extension
57
+ end
58
+ end
59
+
60
+ module ClassMethods
61
+ # Expires the page that was cached with the +path+ as a key. Example:
62
+ # expire_page "/lists/show"
63
+ def expire_page(path)
64
+ return unless perform_caching
65
+
66
+ benchmark "Expired page: #{page_cache_file(path)}" do
67
+ File.delete(page_cache_path(path)) if File.exist?(page_cache_path(path))
68
+ end
69
+ end
70
+
71
+ # Manually cache the +content+ in the key determined by +path+. Example:
72
+ # cache_page "I'm the cached content", "/lists/show"
73
+ def cache_page(content, path)
74
+ return unless perform_caching
75
+
76
+ benchmark "Cached page: #{page_cache_file(path)}" do
77
+ FileUtils.makedirs(File.dirname(page_cache_path(path)))
78
+ File.open(page_cache_path(path), "wb+") { |f| f.write(content) }
79
+ end
80
+ end
81
+
82
+ # Caches the +actions+ using the page-caching approach that'll store the cache in a path within the page_cache_directory that
83
+ # matches the triggering url.
84
+ #
85
+ # Usage:
86
+ #
87
+ # # cache the index action
88
+ # caches_page :index
89
+ #
90
+ # # cache the index action except for JSON requests
91
+ # caches_page :index, :if => Proc.new { |c| !c.request.format.json? }
92
+ def caches_page(*actions)
93
+ return unless perform_caching
94
+ options = actions.extract_options!
95
+ after_filter({:only => actions}.merge(options)) { |c| c.cache_page }
96
+ end
97
+
98
+ private
99
+ def page_cache_file(path)
100
+ name = (path.empty? || path == "/") ? "/index" : URI.unescape(path.chomp('/'))
101
+ name << page_cache_extension unless (name.split('/').last || name).include? '.'
102
+ return name
103
+ end
104
+
105
+ def page_cache_path(path)
106
+ page_cache_directory + page_cache_file(path)
107
+ end
108
+ end
109
+
110
+ # Expires the page that was cached with the +options+ as a key. Example:
111
+ # expire_page :controller => "lists", :action => "show"
112
+ def expire_page(options = {})
113
+ return unless perform_caching
114
+
115
+ if options.is_a?(Hash)
116
+ if options[:action].is_a?(Array)
117
+ options[:action].dup.each do |action|
118
+ self.class.expire_page(url_for(options.merge(:only_path => true, :skip_relative_url_root => true, :action => action)))
119
+ end
120
+ else
121
+ self.class.expire_page(url_for(options.merge(:only_path => true, :skip_relative_url_root => true)))
122
+ end
123
+ else
124
+ self.class.expire_page(options)
125
+ end
126
+ end
127
+
128
+ # Manually cache the +content+ in the key determined by +options+. If no content is provided, the contents of response.body is used
129
+ # If no options are provided, the requested url is used. Example:
130
+ # cache_page "I'm the cached content", :controller => "lists", :action => "show"
131
+ def cache_page(content = nil, options = nil)
132
+ return unless perform_caching && caching_allowed
133
+
134
+ path = case options
135
+ when Hash
136
+ url_for(options.merge(:only_path => true, :skip_relative_url_root => true, :format => params[:format]))
137
+ when String
138
+ options
139
+ else
140
+ request.path
141
+ end
142
+
143
+ self.class.cache_page(content || response.body, path)
144
+ end
145
+
146
+ private
147
+ def caching_allowed
148
+ request.get? && response.status.to_i == 200
149
+ end
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,45 @@
1
+ require 'active_record'
2
+
3
+ module ActionController #:nodoc:
4
+ module Caching
5
+ class Sweeper < ActiveRecord::Observer #:nodoc:
6
+ attr_accessor :controller
7
+
8
+ def before(controller)
9
+ self.controller = controller
10
+ callback(:before) if controller.perform_caching
11
+ end
12
+
13
+ def after(controller)
14
+ callback(:after) if controller.perform_caching
15
+ # Clean up, so that the controller can be collected after this request
16
+ self.controller = nil
17
+ end
18
+
19
+ protected
20
+ # gets the action cache path for the given options.
21
+ def action_path_for(options)
22
+ ActionController::Caching::Actions::ActionCachePath.path_for(controller, options)
23
+ end
24
+
25
+ # Retrieve instance variables set in the controller.
26
+ def assigns(key)
27
+ controller.instance_variable_get("@#{key}")
28
+ end
29
+
30
+ private
31
+ def callback(timing)
32
+ controller_callback_method_name = "#{timing}_#{controller.controller_name.underscore}"
33
+ action_callback_method_name = "#{controller_callback_method_name}_#{controller.action_name}"
34
+
35
+ __send__(controller_callback_method_name) if respond_to?(controller_callback_method_name, true)
36
+ __send__(action_callback_method_name) if respond_to?(action_callback_method_name, true)
37
+ end
38
+
39
+ def method_missing(method, *arguments, &block)
40
+ return if @controller.nil?
41
+ @controller.__send__(method, *arguments, &block)
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,55 @@
1
+ module ActionController #:nodoc:
2
+ module Caching
3
+ # Sweepers are the terminators of the caching world and responsible for expiring caches when model objects change.
4
+ # They do this by being half-observers, half-filters and implementing callbacks for both roles. A Sweeper example:
5
+ #
6
+ # class ListSweeper < ActionController::Caching::Sweeper
7
+ # observe List, Item
8
+ #
9
+ # def after_save(record)
10
+ # list = record.is_a?(List) ? record : record.list
11
+ # expire_page(:controller => "lists", :action => %w( show public feed ), :id => list.id)
12
+ # expire_action(:controller => "lists", :action => "all")
13
+ # list.shares.each { |share| expire_page(:controller => "lists", :action => "show", :id => share.url_key) }
14
+ # end
15
+ # end
16
+ #
17
+ # The sweeper is assigned in the controllers that wish to have its job performed using the <tt>cache_sweeper</tt> class method:
18
+ #
19
+ # class ListsController < ApplicationController
20
+ # caches_action :index, :show, :public, :feed
21
+ # cache_sweeper :list_sweeper, :only => [ :edit, :destroy, :share ]
22
+ # end
23
+ #
24
+ # In the example above, four actions are cached and three actions are responsible for expiring those caches.
25
+ #
26
+ # You can also name an explicit class in the declaration of a sweeper, which is needed if the sweeper is in a module:
27
+ #
28
+ # class ListsController < ApplicationController
29
+ # caches_action :index, :show, :public, :feed
30
+ # cache_sweeper OpenBar::Sweeper, :only => [ :edit, :destroy, :share ]
31
+ # end
32
+ module Sweeping
33
+ def self.included(base) #:nodoc:
34
+ base.extend(ClassMethods)
35
+ end
36
+
37
+ module ClassMethods #:nodoc:
38
+ def cache_sweeper(*sweepers)
39
+ configuration = sweepers.extract_options!
40
+
41
+ sweepers.each do |sweeper|
42
+ ActiveRecord::Base.observers << sweeper if defined?(ActiveRecord) and defined?(ActiveRecord::Base)
43
+ sweeper_instance = (sweeper.is_a?(Symbol) ? Object.const_get(sweeper.to_s.classify) : sweeper).instance
44
+
45
+ if sweeper_instance.is_a?(Sweeper)
46
+ around_filter(sweeper_instance, :only => configuration[:only])
47
+ else
48
+ after_filter(sweeper_instance, :only => configuration[:only])
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,15 @@
1
+ require 'action_controller/cgi_ext/stdinput'
2
+ require 'action_controller/cgi_ext/query_extension'
3
+ require 'action_controller/cgi_ext/cookie'
4
+
5
+ class CGI #:nodoc:
6
+ include ActionController::CgiExt::Stdinput
7
+
8
+ class << self
9
+ alias :escapeHTML_fail_on_nil :escapeHTML
10
+
11
+ def escapeHTML(string)
12
+ escapeHTML_fail_on_nil(string) unless string.nil?
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,112 @@
1
+ require 'delegate'
2
+
3
+ CGI.module_eval { remove_const "Cookie" }
4
+
5
+ # TODO: document how this differs from stdlib CGI::Cookie
6
+ class CGI #:nodoc:
7
+ class Cookie < DelegateClass(Array)
8
+ attr_accessor :name, :value, :path, :domain, :expires
9
+ attr_reader :secure, :http_only
10
+
11
+ # Creates a new CGI::Cookie object.
12
+ #
13
+ # The contents of the cookie can be specified as a +name+ and one
14
+ # or more +value+ arguments. Alternatively, the contents can
15
+ # be specified as a single hash argument. The possible keywords of
16
+ # this hash are as follows:
17
+ #
18
+ # * <tt>:name</tt> - The name of the cookie. Required.
19
+ # * <tt>:value</tt> - The cookie's value or list of values.
20
+ # * <tt>:path</tt> - The path for which this cookie applies. Defaults to the
21
+ # base directory of the CGI script.
22
+ # * <tt>:domain</tt> - The domain for which this cookie applies.
23
+ # * <tt>:expires</tt> - The time at which this cookie expires, as a Time object.
24
+ # * <tt>:secure</tt> - Whether this cookie is a secure cookie or not (defaults to
25
+ # +false+). Secure cookies are only transmitted to HTTPS servers.
26
+ # * <tt>:http_only</tt> - Whether this cookie can be accessed by client side scripts (e.g. document.cookie) or only over HTTP.
27
+ # More details in http://msdn2.microsoft.com/en-us/library/system.web.httpcookie.httponly.aspx. Defaults to +false+.
28
+ #
29
+ # These keywords correspond to attributes of the cookie object.
30
+ def initialize(name = '', *value)
31
+ if name.kind_of?(String)
32
+ @name = name
33
+ @value = Array(value)
34
+ @domain = nil
35
+ @expires = nil
36
+ @secure = false
37
+ @http_only = false
38
+ @path = nil
39
+ else
40
+ @name = name['name']
41
+ @value = (name['value'].kind_of?(String) ? [name['value']] : Array(name['value'])).delete_if(&:blank?)
42
+ @domain = name['domain']
43
+ @expires = name['expires']
44
+ @secure = name['secure'] || false
45
+ @http_only = name['http_only'] || false
46
+ @path = name['path']
47
+ end
48
+
49
+ raise ArgumentError, "`name' required" unless @name
50
+
51
+ # simple support for IE
52
+ unless @path
53
+ %r|^(.*/)|.match(ENV['SCRIPT_NAME'])
54
+ @path = ($1 or '')
55
+ end
56
+
57
+ super(@value)
58
+ end
59
+
60
+ # Sets whether the Cookie is a secure cookie or not.
61
+ def secure=(val)
62
+ @secure = val == true
63
+ end
64
+
65
+ # Sets whether the Cookie is an HTTP only cookie or not.
66
+ def http_only=(val)
67
+ @http_only = val == true
68
+ end
69
+
70
+ # Converts the Cookie to its string representation.
71
+ def to_s
72
+ buf = ''
73
+ buf << @name << '='
74
+ buf << (@value.kind_of?(String) ? CGI::escape(@value) : @value.collect{|v| CGI::escape(v) }.join("&"))
75
+ buf << '; domain=' << @domain if @domain
76
+ buf << '; path=' << @path if @path
77
+ buf << '; expires=' << CGI::rfc1123_date(@expires) if @expires
78
+ buf << '; secure' if @secure
79
+ buf << '; HttpOnly' if @http_only
80
+ buf
81
+ end
82
+
83
+ # FIXME: work around broken 1.8.7 DelegateClass#respond_to?
84
+ def respond_to?(method, include_private = false)
85
+ return true if super(method)
86
+ return __getobj__.respond_to?(method, include_private)
87
+ end
88
+
89
+ # Parses a raw cookie string into a hash of <tt>cookie-name => cookie-object</tt>
90
+ # pairs.
91
+ #
92
+ # cookies = CGI::Cookie::parse("raw_cookie_string")
93
+ # # => { "name1" => cookie1, "name2" => cookie2, ... }
94
+ #
95
+ def self.parse(raw_cookie)
96
+ cookies = Hash.new([])
97
+
98
+ if raw_cookie
99
+ raw_cookie.split(/;\s?/).each do |pairs|
100
+ name, value = pairs.split('=',2)
101
+ next unless name and value
102
+ name = CGI::unescape(name)
103
+ unless cookies.has_key?(name)
104
+ cookies[name] = new(name, CGI::unescape(value))
105
+ end
106
+ end
107
+ end
108
+
109
+ cookies
110
+ end
111
+ end # class Cookie
112
+ end
@@ -0,0 +1,22 @@
1
+ require 'cgi'
2
+
3
+ class CGI #:nodoc:
4
+ module QueryExtension
5
+ # Remove the old initialize_query method before redefining it.
6
+ remove_method :initialize_query
7
+
8
+ # Neuter CGI parameter parsing.
9
+ def initialize_query
10
+ # Fix some strange request environments.
11
+ env_table['REQUEST_METHOD'] ||= 'GET'
12
+
13
+ # POST assumes missing Content-Type is application/x-www-form-urlencoded.
14
+ if env_table['CONTENT_TYPE'].blank? && env_table['REQUEST_METHOD'] == 'POST'
15
+ env_table['CONTENT_TYPE'] = 'application/x-www-form-urlencoded'
16
+ end
17
+
18
+ @cookies = CGI::Cookie::parse(env_table['HTTP_COOKIE'] || env_table['COOKIE'])
19
+ @params = {}
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,24 @@
1
+ require 'cgi'
2
+
3
+ module ActionController
4
+ module CgiExt
5
+ # Publicize the CGI's internal input stream so we can lazy-read
6
+ # request.body. Make it writable so we don't have to play $stdin games.
7
+ module Stdinput
8
+ def self.included(base)
9
+ base.class_eval do
10
+ remove_method :stdinput
11
+ attr_accessor :stdinput
12
+ end
13
+
14
+ base.alias_method_chain :initialize, :stdinput
15
+ end
16
+
17
+ def initialize_with_stdinput(type = nil, stdinput = $stdin)
18
+ @stdinput = stdinput
19
+ @stdinput.set_encoding(Encoding::BINARY) if @stdinput.respond_to?(:set_encoding)
20
+ initialize_without_stdinput(type || 'query')
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,77 @@
1
+ require 'action_controller/cgi_ext'
2
+
3
+ module ActionController #:nodoc:
4
+ class CGIHandler
5
+ module ProperStream
6
+ def each
7
+ while line = gets
8
+ yield line
9
+ end
10
+ end
11
+
12
+ def read(*args)
13
+ if args.empty?
14
+ super || ""
15
+ else
16
+ super
17
+ end
18
+ end
19
+ end
20
+
21
+ def self.dispatch_cgi(app, cgi, out = $stdout)
22
+ env = cgi.__send__(:env_table)
23
+ env.delete "HTTP_CONTENT_LENGTH"
24
+
25
+ cgi.stdinput.extend ProperStream
26
+
27
+ env["SCRIPT_NAME"] = "" if env["SCRIPT_NAME"] == "/"
28
+
29
+ env.update({
30
+ "rack.version" => [0,1],
31
+ "rack.input" => cgi.stdinput,
32
+ "rack.errors" => $stderr,
33
+ "rack.multithread" => false,
34
+ "rack.multiprocess" => true,
35
+ "rack.run_once" => false,
36
+ "rack.url_scheme" => ["yes", "on", "1"].include?(env["HTTPS"]) ? "https" : "http"
37
+ })
38
+
39
+ env["QUERY_STRING"] ||= ""
40
+ env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"]
41
+ env["REQUEST_PATH"] ||= "/"
42
+ env.delete "PATH_INFO" if env["PATH_INFO"] == ""
43
+
44
+ status, headers, body = app.call(env)
45
+ begin
46
+ out.binmode if out.respond_to?(:binmode)
47
+ out.sync = false if out.respond_to?(:sync=)
48
+
49
+ headers['Status'] = status.to_s
50
+
51
+ if headers.include?('Set-Cookie')
52
+ headers['cookie'] = headers.delete('Set-Cookie').split("\n")
53
+ end
54
+
55
+ out.write(cgi.header(headers))
56
+
57
+ body.each { |part|
58
+ out.write part
59
+ out.flush if out.respond_to?(:flush)
60
+ }
61
+ ensure
62
+ body.close if body.respond_to?(:close)
63
+ end
64
+ end
65
+ end
66
+
67
+ class CgiRequest #:nodoc:
68
+ DEFAULT_SESSION_OPTIONS = {
69
+ :database_manager => nil,
70
+ :prefix => "ruby_sess.",
71
+ :session_path => "/",
72
+ :session_key => "_session_id",
73
+ :cookie_only => true,
74
+ :session_http_only => true
75
+ }
76
+ end
77
+ end