actionpack 2.3.18 → 3.0.0.beta

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 (513) hide show
  1. data/CHANGELOG +15 -64
  2. data/README +39 -48
  3. data/lib/abstract_controller.rb +22 -0
  4. data/lib/abstract_controller/base.rb +191 -0
  5. data/lib/abstract_controller/callbacks.rb +113 -0
  6. data/lib/abstract_controller/collector.rb +30 -0
  7. data/lib/abstract_controller/compatibility.rb +18 -0
  8. data/lib/abstract_controller/helpers.rb +163 -0
  9. data/lib/abstract_controller/layouts.rb +413 -0
  10. data/lib/abstract_controller/localized_cache.rb +49 -0
  11. data/lib/abstract_controller/logger.rb +13 -0
  12. data/lib/abstract_controller/rendering.rb +238 -0
  13. data/lib/{action_controller → abstract_controller}/translation.rb +1 -1
  14. data/lib/action_controller.rb +68 -102
  15. data/lib/action_controller/base.rb +77 -1409
  16. data/lib/action_controller/caching.rb +58 -45
  17. data/lib/action_controller/caching/actions.rb +100 -114
  18. data/lib/action_controller/caching/fragments.rb +17 -19
  19. data/lib/action_controller/caching/pages.rb +12 -6
  20. data/lib/action_controller/caching/sweeping.rb +42 -0
  21. data/lib/action_controller/deprecated.rb +5 -0
  22. data/lib/action_controller/deprecated/dispatcher.rb +28 -0
  23. data/lib/action_controller/deprecated/integration_test.rb +2 -0
  24. data/lib/action_controller/deprecated/performance_test.rb +1 -0
  25. data/lib/action_controller/metal.rb +125 -0
  26. data/lib/action_controller/metal/compatibility.rb +141 -0
  27. data/lib/action_controller/metal/conditional_get.rb +86 -0
  28. data/lib/action_controller/metal/configuration.rb +28 -0
  29. data/lib/action_controller/metal/cookies.rb +17 -0
  30. data/lib/action_controller/metal/exceptions.rb +46 -0
  31. data/lib/action_controller/metal/flash.rb +28 -0
  32. data/lib/action_controller/metal/head.rb +33 -0
  33. data/lib/action_controller/metal/helpers.rb +116 -0
  34. data/lib/action_controller/metal/hide_actions.rb +50 -0
  35. data/lib/action_controller/{http_authentication.rb → metal/http_authentication.rb} +18 -15
  36. data/lib/action_controller/metal/instrumentation.rb +99 -0
  37. data/lib/action_controller/metal/mime_responds.rb +300 -0
  38. data/lib/action_controller/metal/rack_delegation.rb +35 -0
  39. data/lib/action_controller/metal/redirecting.rb +90 -0
  40. data/lib/action_controller/metal/renderers.rb +95 -0
  41. data/lib/action_controller/metal/rendering.rb +69 -0
  42. data/lib/action_controller/metal/request_forgery_protection.rb +115 -0
  43. data/lib/action_controller/metal/rescue.rb +13 -0
  44. data/lib/action_controller/metal/responder.rb +220 -0
  45. data/lib/action_controller/{session_management.rb → metal/session_management.rb} +5 -14
  46. data/lib/action_controller/{streaming.rb → metal/streaming.rb} +13 -12
  47. data/lib/action_controller/metal/testing.rb +42 -0
  48. data/lib/action_controller/metal/url_for.rb +157 -0
  49. data/lib/action_controller/{verification.rb → metal/verification.rb} +41 -41
  50. data/lib/action_controller/middleware.rb +38 -0
  51. data/lib/action_controller/polymorphic_routes.rb +20 -26
  52. data/lib/action_controller/railtie.rb +30 -0
  53. data/lib/action_controller/railties/subscriber.rb +63 -0
  54. data/lib/action_controller/record_identifier.rb +3 -16
  55. data/lib/action_controller/test_case.rb +156 -18
  56. data/lib/action_controller/url_rewriter.rb +47 -200
  57. data/lib/action_controller/vendor/html-scanner.rb +16 -12
  58. data/lib/action_controller/vendor/html-scanner/html/node.rb +1 -1
  59. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +12 -9
  60. data/lib/action_dispatch.rb +88 -0
  61. data/lib/action_dispatch/http/cache.rb +123 -0
  62. data/lib/action_dispatch/http/filter_parameters.rb +98 -0
  63. data/lib/{action_controller → action_dispatch/http}/headers.rb +8 -8
  64. data/lib/action_dispatch/http/mime_negotiation.rb +101 -0
  65. data/lib/{action_controller → action_dispatch/http}/mime_type.rb +30 -11
  66. data/lib/{action_controller → action_dispatch/http}/mime_types.rb +5 -3
  67. data/lib/action_dispatch/http/parameters.rb +49 -0
  68. data/lib/action_dispatch/http/request.rb +223 -0
  69. data/lib/action_dispatch/http/response.rb +209 -0
  70. data/lib/action_dispatch/http/upload.rb +48 -0
  71. data/lib/action_dispatch/http/url.rb +129 -0
  72. data/lib/action_dispatch/middleware/callbacks.rb +50 -0
  73. data/lib/action_dispatch/middleware/cascade.rb +29 -0
  74. data/lib/action_dispatch/middleware/cookies.rb +216 -0
  75. data/lib/{action_controller → action_dispatch/middleware}/flash.rb +51 -90
  76. data/lib/action_dispatch/middleware/head.rb +18 -0
  77. data/lib/action_dispatch/middleware/params_parser.rb +78 -0
  78. data/lib/action_dispatch/middleware/rescue.rb +26 -0
  79. data/lib/action_dispatch/middleware/session/abstract_store.rb +209 -0
  80. data/lib/{action_controller → action_dispatch/middleware}/session/cookie_store.rb +56 -60
  81. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +47 -0
  82. data/lib/action_dispatch/middleware/show_exceptions.rb +173 -0
  83. data/lib/{action_controller/middleware_stack.rb → action_dispatch/middleware/stack.rb} +23 -13
  84. data/lib/action_dispatch/middleware/static.rb +44 -0
  85. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/_request_and_response.erb +10 -3
  86. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/_trace.erb +4 -4
  87. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +10 -0
  88. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/layout.erb +2 -2
  89. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/missing_template.erb +0 -0
  90. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/routing_error.erb +0 -0
  91. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/template_error.erb +3 -3
  92. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/unknown_action.erb +0 -0
  93. data/lib/action_dispatch/railtie.rb +15 -0
  94. data/lib/action_dispatch/routing.rb +217 -0
  95. data/lib/action_dispatch/routing/deprecated_mapper.rb +877 -0
  96. data/lib/action_dispatch/routing/mapper.rb +649 -0
  97. data/lib/action_dispatch/routing/route.rb +55 -0
  98. data/lib/action_dispatch/routing/route_set.rb +445 -0
  99. data/lib/action_dispatch/testing/assertions.rb +21 -0
  100. data/lib/action_dispatch/testing/assertions/dom.rb +37 -0
  101. data/lib/{action_controller/assertions/model_assertions.rb → action_dispatch/testing/assertions/model.rb} +2 -4
  102. data/lib/action_dispatch/testing/assertions/response.rb +154 -0
  103. data/lib/{action_controller/assertions/routing_assertions.rb → action_dispatch/testing/assertions/routing.rb} +72 -34
  104. data/lib/{action_controller/assertions/selector_assertions.rb → action_dispatch/testing/assertions/selector.rb} +14 -11
  105. data/lib/{action_controller/assertions/tag_assertions.rb → action_dispatch/testing/assertions/tag.rb} +25 -14
  106. data/lib/{action_controller → action_dispatch/testing}/integration.rb +173 -406
  107. data/lib/action_dispatch/testing/performance_test.rb +17 -0
  108. data/lib/action_dispatch/testing/test_process.rb +42 -0
  109. data/lib/action_dispatch/testing/test_request.rb +83 -0
  110. data/lib/action_dispatch/testing/test_response.rb +136 -0
  111. data/lib/action_pack/version.rb +3 -3
  112. data/lib/action_view.rb +29 -26
  113. data/lib/action_view/base.rb +101 -148
  114. data/lib/action_view/context.rb +44 -0
  115. data/lib/action_view/helpers.rb +6 -4
  116. data/lib/action_view/helpers/{active_record_helper.rb → active_model_helper.rb} +63 -63
  117. data/lib/action_view/helpers/asset_tag_helper.rb +166 -31
  118. data/lib/action_view/helpers/cache_helper.rb +1 -1
  119. data/lib/action_view/helpers/capture_helper.rb +40 -8
  120. data/lib/action_view/helpers/csrf_helper.rb +2 -4
  121. data/lib/action_view/helpers/date_helper.rb +14 -15
  122. data/lib/action_view/helpers/form_helper.rb +121 -24
  123. data/lib/action_view/helpers/form_options_helper.rb +26 -25
  124. data/lib/action_view/helpers/form_tag_helper.rb +42 -33
  125. data/lib/action_view/helpers/javascript_helper.rb +1 -109
  126. data/lib/action_view/helpers/number_helper.rb +4 -1
  127. data/lib/action_view/helpers/prototype_helper.rb +75 -499
  128. data/lib/action_view/helpers/raw_output_helper.rb +1 -1
  129. data/lib/action_view/helpers/record_tag_helper.rb +3 -3
  130. data/lib/action_view/helpers/sanitize_helper.rb +3 -2
  131. data/lib/action_view/helpers/scriptaculous_helper.rb +89 -53
  132. data/lib/action_view/helpers/tag_helper.rb +12 -13
  133. data/lib/action_view/helpers/text_helper.rb +33 -38
  134. data/lib/action_view/helpers/translation_helper.rb +11 -35
  135. data/lib/action_view/helpers/url_helper.rb +140 -134
  136. data/lib/action_view/locale/en.yml +34 -28
  137. data/lib/action_view/paths.rb +27 -24
  138. data/lib/action_view/railtie.rb +17 -0
  139. data/lib/action_view/railties/subscriber.rb +24 -0
  140. data/lib/action_view/{partials.rb → render/partials.rb} +161 -51
  141. data/lib/action_view/render/rendering.rb +117 -0
  142. data/lib/action_view/template.rb +88 -217
  143. data/lib/action_view/template/error.rb +105 -0
  144. data/lib/action_view/template/handler.rb +41 -0
  145. data/lib/action_view/template/handlers.rb +54 -0
  146. data/lib/action_view/{template_handlers → template/handlers}/builder.rb +6 -6
  147. data/lib/action_view/template/handlers/erb.rb +58 -0
  148. data/lib/action_view/{template_handlers → template/handlers}/rjs.rb +8 -3
  149. data/lib/action_view/template/resolver.rb +164 -0
  150. data/lib/action_view/template/text.rb +40 -0
  151. data/lib/action_view/test_case.rb +18 -18
  152. metadata +165 -420
  153. data/RUNNING_UNIT_TESTS +0 -24
  154. data/Rakefile +0 -158
  155. data/install.rb +0 -30
  156. data/lib/action_controller/assertions/dom_assertions.rb +0 -55
  157. data/lib/action_controller/assertions/response_assertions.rb +0 -169
  158. data/lib/action_controller/benchmarking.rb +0 -107
  159. data/lib/action_controller/caching/sweeper.rb +0 -45
  160. data/lib/action_controller/cgi_ext.rb +0 -15
  161. data/lib/action_controller/cgi_ext/cookie.rb +0 -112
  162. data/lib/action_controller/cgi_ext/query_extension.rb +0 -22
  163. data/lib/action_controller/cgi_ext/stdinput.rb +0 -24
  164. data/lib/action_controller/cgi_process.rb +0 -77
  165. data/lib/action_controller/cookies.rb +0 -197
  166. data/lib/action_controller/dispatcher.rb +0 -133
  167. data/lib/action_controller/failsafe.rb +0 -87
  168. data/lib/action_controller/filters.rb +0 -680
  169. data/lib/action_controller/helpers.rb +0 -225
  170. data/lib/action_controller/layout.rb +0 -286
  171. data/lib/action_controller/middlewares.rb +0 -14
  172. data/lib/action_controller/mime_responds.rb +0 -193
  173. data/lib/action_controller/params_parser.rb +0 -77
  174. data/lib/action_controller/performance_test.rb +0 -15
  175. data/lib/action_controller/rack_lint_patch.rb +0 -36
  176. data/lib/action_controller/reloader.rb +0 -54
  177. data/lib/action_controller/request.rb +0 -518
  178. data/lib/action_controller/request_forgery_protection.rb +0 -116
  179. data/lib/action_controller/rescue.rb +0 -183
  180. data/lib/action_controller/resources.rb +0 -682
  181. data/lib/action_controller/response.rb +0 -237
  182. data/lib/action_controller/routing.rb +0 -388
  183. data/lib/action_controller/routing/builder.rb +0 -197
  184. data/lib/action_controller/routing/optimisations.rb +0 -130
  185. data/lib/action_controller/routing/recognition_optimisation.rb +0 -167
  186. data/lib/action_controller/routing/route.rb +0 -265
  187. data/lib/action_controller/routing/route_set.rb +0 -503
  188. data/lib/action_controller/routing/routing_ext.rb +0 -49
  189. data/lib/action_controller/routing/segments.rb +0 -343
  190. data/lib/action_controller/session/abstract_store.rb +0 -276
  191. data/lib/action_controller/session/mem_cache_store.rb +0 -60
  192. data/lib/action_controller/status_codes.rb +0 -88
  193. data/lib/action_controller/string_coercion.rb +0 -29
  194. data/lib/action_controller/templates/rescues/diagnostics.erb +0 -11
  195. data/lib/action_controller/test_process.rb +0 -580
  196. data/lib/action_controller/uploaded_file.rb +0 -44
  197. data/lib/action_view/helpers/benchmark_helper.rb +0 -54
  198. data/lib/action_view/inline_template.rb +0 -19
  199. data/lib/action_view/reloadable_template.rb +0 -117
  200. data/lib/action_view/renderable.rb +0 -109
  201. data/lib/action_view/renderable_partial.rb +0 -53
  202. data/lib/action_view/template_error.rb +0 -99
  203. data/lib/action_view/template_handler.rb +0 -34
  204. data/lib/action_view/template_handlers.rb +0 -48
  205. data/lib/action_view/template_handlers/erb.rb +0 -25
  206. data/lib/actionpack.rb +0 -2
  207. data/test/abstract_unit.rb +0 -78
  208. data/test/active_record_unit.rb +0 -104
  209. data/test/activerecord/active_record_store_test.rb +0 -221
  210. data/test/activerecord/render_partial_with_record_identification_test.rb +0 -188
  211. data/test/adv_attr_test.rb +0 -20
  212. data/test/controller/action_pack_assertions_test.rb +0 -545
  213. data/test/controller/addresses_render_test.rb +0 -37
  214. data/test/controller/assert_select_test.rb +0 -735
  215. data/test/controller/base_test.rb +0 -217
  216. data/test/controller/benchmark_test.rb +0 -32
  217. data/test/controller/caching_test.rb +0 -743
  218. data/test/controller/capture_test.rb +0 -66
  219. data/test/controller/content_type_test.rb +0 -178
  220. data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  221. data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  222. data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  223. data/test/controller/cookie_test.rb +0 -208
  224. data/test/controller/deprecation/deprecated_base_methods_test.rb +0 -32
  225. data/test/controller/dispatcher_test.rb +0 -144
  226. data/test/controller/dom_assertions_test.rb +0 -53
  227. data/test/controller/failsafe_test.rb +0 -60
  228. data/test/controller/fake_controllers.rb +0 -33
  229. data/test/controller/fake_models.rb +0 -19
  230. data/test/controller/filter_params_test.rb +0 -52
  231. data/test/controller/filters_test.rb +0 -885
  232. data/test/controller/flash_test.rb +0 -174
  233. data/test/controller/header_test.rb +0 -14
  234. data/test/controller/helper_test.rb +0 -224
  235. data/test/controller/html-scanner/cdata_node_test.rb +0 -15
  236. data/test/controller/html-scanner/document_test.rb +0 -148
  237. data/test/controller/html-scanner/node_test.rb +0 -89
  238. data/test/controller/html-scanner/sanitizer_test.rb +0 -300
  239. data/test/controller/html-scanner/tag_node_test.rb +0 -238
  240. data/test/controller/html-scanner/text_node_test.rb +0 -50
  241. data/test/controller/html-scanner/tokenizer_test.rb +0 -131
  242. data/test/controller/http_basic_authentication_test.rb +0 -113
  243. data/test/controller/http_digest_authentication_test.rb +0 -254
  244. data/test/controller/integration_test.rb +0 -526
  245. data/test/controller/layout_test.rb +0 -215
  246. data/test/controller/localized_templates_test.rb +0 -24
  247. data/test/controller/logging_test.rb +0 -46
  248. data/test/controller/middleware_stack_test.rb +0 -90
  249. data/test/controller/mime_responds_test.rb +0 -536
  250. data/test/controller/mime_type_test.rb +0 -93
  251. data/test/controller/output_escaping_test.rb +0 -19
  252. data/test/controller/polymorphic_routes_test.rb +0 -297
  253. data/test/controller/rack_test.rb +0 -308
  254. data/test/controller/record_identifier_test.rb +0 -139
  255. data/test/controller/redirect_test.rb +0 -285
  256. data/test/controller/reloader_test.rb +0 -125
  257. data/test/controller/render_test.rb +0 -1783
  258. data/test/controller/request/json_params_parsing_test.rb +0 -65
  259. data/test/controller/request/multipart_params_parsing_test.rb +0 -177
  260. data/test/controller/request/query_string_parsing_test.rb +0 -129
  261. data/test/controller/request/test_request_test.rb +0 -35
  262. data/test/controller/request/url_encoded_params_parsing_test.rb +0 -146
  263. data/test/controller/request/xml_params_parsing_test.rb +0 -103
  264. data/test/controller/request_forgery_protection_test.rb +0 -233
  265. data/test/controller/request_test.rb +0 -398
  266. data/test/controller/rescue_test.rb +0 -541
  267. data/test/controller/resources_test.rb +0 -1393
  268. data/test/controller/routing_test.rb +0 -2592
  269. data/test/controller/selector_test.rb +0 -628
  270. data/test/controller/send_file_test.rb +0 -171
  271. data/test/controller/session/abstract_store_test.rb +0 -64
  272. data/test/controller/session/cookie_store_test.rb +0 -354
  273. data/test/controller/session/mem_cache_store_test.rb +0 -187
  274. data/test/controller/session/test_session_test.rb +0 -58
  275. data/test/controller/test_test.rb +0 -700
  276. data/test/controller/translation_test.rb +0 -26
  277. data/test/controller/url_rewriter_test.rb +0 -395
  278. data/test/controller/verification_test.rb +0 -270
  279. data/test/controller/view_paths_test.rb +0 -141
  280. data/test/controller/webservice_test.rb +0 -273
  281. data/test/fixtures/_top_level_partial.html.erb +0 -1
  282. data/test/fixtures/_top_level_partial_only.erb +0 -1
  283. data/test/fixtures/addresses/list.erb +0 -1
  284. data/test/fixtures/alternate_helpers/foo_helper.rb +0 -3
  285. data/test/fixtures/bad_customers/_bad_customer.html.erb +0 -1
  286. data/test/fixtures/companies.yml +0 -24
  287. data/test/fixtures/company.rb +0 -10
  288. data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +0 -1
  289. data/test/fixtures/content_type/render_default_for_rhtml.rhtml +0 -1
  290. data/test/fixtures/content_type/render_default_for_rjs.rjs +0 -1
  291. data/test/fixtures/content_type/render_default_for_rxml.rxml +0 -1
  292. data/test/fixtures/customers/_customer.html.erb +0 -1
  293. data/test/fixtures/db_definitions/sqlite.sql +0 -49
  294. data/test/fixtures/developer.rb +0 -9
  295. data/test/fixtures/developers.yml +0 -21
  296. data/test/fixtures/developers/_developer.erb +0 -1
  297. data/test/fixtures/developers_projects.yml +0 -13
  298. data/test/fixtures/failsafe/500.html +0 -1
  299. data/test/fixtures/fun/games/_game.erb +0 -1
  300. data/test/fixtures/fun/games/hello_world.erb +0 -1
  301. data/test/fixtures/fun/serious/games/_game.erb +0 -1
  302. data/test/fixtures/functional_caching/_partial.erb +0 -3
  303. data/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +0 -3
  304. data/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +0 -6
  305. data/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +0 -5
  306. data/test/fixtures/functional_caching/fragment_cached.html.erb +0 -2
  307. data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +0 -1
  308. data/test/fixtures/functional_caching/inline_fragment_cached.html.erb +0 -2
  309. data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +0 -1
  310. data/test/fixtures/good_customers/_good_customer.html.erb +0 -1
  311. data/test/fixtures/helpers/abc_helper.rb +0 -5
  312. data/test/fixtures/helpers/fun/games_helper.rb +0 -3
  313. data/test/fixtures/helpers/fun/pdf_helper.rb +0 -3
  314. data/test/fixtures/layout_tests/abs_path_layout.rhtml +0 -1
  315. data/test/fixtures/layout_tests/alt/hello.rhtml +0 -1
  316. data/test/fixtures/layout_tests/alt/layouts/alt.rhtml +0 -0
  317. data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +0 -1
  318. data/test/fixtures/layout_tests/layouts/item.rhtml +0 -1
  319. data/test/fixtures/layout_tests/layouts/layout_test.rhtml +0 -1
  320. data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +0 -1
  321. data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +0 -1
  322. data/test/fixtures/layout_tests/views/hello.rhtml +0 -1
  323. data/test/fixtures/layouts/_column.html.erb +0 -2
  324. data/test/fixtures/layouts/block_with_layout.erb +0 -3
  325. data/test/fixtures/layouts/builder.builder +0 -3
  326. data/test/fixtures/layouts/default_html.html.erb +0 -1
  327. data/test/fixtures/layouts/partial_with_layout.erb +0 -3
  328. data/test/fixtures/layouts/standard.erb +0 -1
  329. data/test/fixtures/layouts/talk_from_action.erb +0 -2
  330. data/test/fixtures/layouts/xhr.html.erb +0 -2
  331. data/test/fixtures/layouts/yield.erb +0 -2
  332. data/test/fixtures/localized/hello_world.de.html +0 -1
  333. data/test/fixtures/localized/hello_world.en.html +0 -1
  334. data/test/fixtures/mascot.rb +0 -3
  335. data/test/fixtures/mascots.yml +0 -4
  336. data/test/fixtures/mascots/_mascot.html.erb +0 -1
  337. data/test/fixtures/multipart/binary_file +0 -0
  338. data/test/fixtures/multipart/boundary_problem_file +0 -10
  339. data/test/fixtures/multipart/bracketed_param +0 -5
  340. data/test/fixtures/multipart/empty +0 -10
  341. data/test/fixtures/multipart/hello.txt +0 -1
  342. data/test/fixtures/multipart/large_text_file +0 -10
  343. data/test/fixtures/multipart/mixed_files +0 -0
  344. data/test/fixtures/multipart/mona_lisa.jpg +0 -0
  345. data/test/fixtures/multipart/none +0 -9
  346. data/test/fixtures/multipart/single_parameter +0 -5
  347. data/test/fixtures/multipart/text_file +0 -10
  348. data/test/fixtures/override/test/hello_world.erb +0 -1
  349. data/test/fixtures/override2/layouts/test/sub.erb +0 -1
  350. data/test/fixtures/post_test/layouts/post.html.erb +0 -1
  351. data/test/fixtures/post_test/layouts/super_post.iphone.erb +0 -1
  352. data/test/fixtures/post_test/post/index.html.erb +0 -1
  353. data/test/fixtures/post_test/post/index.iphone.erb +0 -1
  354. data/test/fixtures/post_test/super_post/index.html.erb +0 -1
  355. data/test/fixtures/post_test/super_post/index.iphone.erb +0 -1
  356. data/test/fixtures/project.rb +0 -3
  357. data/test/fixtures/projects.yml +0 -7
  358. data/test/fixtures/projects/_project.erb +0 -1
  359. data/test/fixtures/public/404.html +0 -1
  360. data/test/fixtures/public/500.da.html +0 -1
  361. data/test/fixtures/public/500.html +0 -1
  362. data/test/fixtures/public/absolute/test.css +0 -23
  363. data/test/fixtures/public/absolute/test.js +0 -63
  364. data/test/fixtures/public/images/rails.png +0 -0
  365. data/test/fixtures/public/javascripts/application.js +0 -1
  366. data/test/fixtures/public/javascripts/bank.js +0 -1
  367. data/test/fixtures/public/javascripts/controls.js +0 -1
  368. data/test/fixtures/public/javascripts/dragdrop.js +0 -1
  369. data/test/fixtures/public/javascripts/effects.js +0 -1
  370. data/test/fixtures/public/javascripts/prototype.js +0 -1
  371. data/test/fixtures/public/javascripts/robber.js +0 -1
  372. data/test/fixtures/public/javascripts/subdir/subdir.js +0 -1
  373. data/test/fixtures/public/javascripts/version.1.0.js +0 -1
  374. data/test/fixtures/public/stylesheets/bank.css +0 -1
  375. data/test/fixtures/public/stylesheets/robber.css +0 -1
  376. data/test/fixtures/public/stylesheets/subdir/subdir.css +0 -1
  377. data/test/fixtures/public/stylesheets/version.1.0.css +0 -1
  378. data/test/fixtures/quiz/questions/_question.html.erb +0 -1
  379. data/test/fixtures/replies.yml +0 -15
  380. data/test/fixtures/replies/_reply.erb +0 -1
  381. data/test/fixtures/reply.rb +0 -7
  382. data/test/fixtures/respond_to/all_types_with_layout.html.erb +0 -1
  383. data/test/fixtures/respond_to/all_types_with_layout.js.rjs +0 -1
  384. data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +0 -1
  385. data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +0 -1
  386. data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +0 -1
  387. data/test/fixtures/respond_to/layouts/missing.html.erb +0 -1
  388. data/test/fixtures/respond_to/layouts/standard.html.erb +0 -1
  389. data/test/fixtures/respond_to/layouts/standard.iphone.erb +0 -1
  390. data/test/fixtures/respond_to/using_defaults.html.erb +0 -1
  391. data/test/fixtures/respond_to/using_defaults.js.rjs +0 -1
  392. data/test/fixtures/respond_to/using_defaults.xml.builder +0 -1
  393. data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +0 -1
  394. data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +0 -1
  395. data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +0 -1
  396. data/test/fixtures/scope/test/modgreet.erb +0 -1
  397. data/test/fixtures/session_autoload_test/session_autoload_test/foo.rb +0 -10
  398. data/test/fixtures/shared.html.erb +0 -1
  399. data/test/fixtures/symlink_parent/symlinked_layout.erb +0 -5
  400. data/test/fixtures/test/_counter.html.erb +0 -1
  401. data/test/fixtures/test/_customer.erb +0 -1
  402. data/test/fixtures/test/_customer_counter.erb +0 -1
  403. data/test/fixtures/test/_customer_counter_with_as.erb +0 -1
  404. data/test/fixtures/test/_customer_greeting.erb +0 -1
  405. data/test/fixtures/test/_customer_with_var.erb +0 -1
  406. data/test/fixtures/test/_form.erb +0 -1
  407. data/test/fixtures/test/_from_helper.erb +0 -1
  408. data/test/fixtures/test/_hash_greeting.erb +0 -1
  409. data/test/fixtures/test/_hash_object.erb +0 -2
  410. data/test/fixtures/test/_hello.builder +0 -1
  411. data/test/fixtures/test/_labelling_form.erb +0 -1
  412. data/test/fixtures/test/_layout_for_block_with_args.html.erb +0 -3
  413. data/test/fixtures/test/_layout_for_partial.html.erb +0 -3
  414. data/test/fixtures/test/_local_inspector.html.erb +0 -1
  415. data/test/fixtures/test/_one.html.erb +0 -1
  416. data/test/fixtures/test/_partial.erb +0 -1
  417. data/test/fixtures/test/_partial.html.erb +0 -1
  418. data/test/fixtures/test/_partial.js.erb +0 -1
  419. data/test/fixtures/test/_partial_for_use_in_layout.html.erb +0 -1
  420. data/test/fixtures/test/_partial_only.erb +0 -1
  421. data/test/fixtures/test/_partial_with_only_html_version.html.erb +0 -1
  422. data/test/fixtures/test/_person.erb +0 -2
  423. data/test/fixtures/test/_raise.html.erb +0 -1
  424. data/test/fixtures/test/_two.html.erb +0 -1
  425. data/test/fixtures/test/_utf8_partial.html.erb +0 -1
  426. data/test/fixtures/test/_utf8_partial_magic.html.erb +0 -2
  427. data/test/fixtures/test/action_talk_to_layout.erb +0 -2
  428. data/test/fixtures/test/array_translation.erb +0 -1
  429. data/test/fixtures/test/calling_partial_with_layout.html.erb +0 -1
  430. data/test/fixtures/test/capturing.erb +0 -4
  431. data/test/fixtures/test/content_for.erb +0 -2
  432. data/test/fixtures/test/content_for_concatenated.erb +0 -3
  433. data/test/fixtures/test/content_for_with_parameter.erb +0 -2
  434. data/test/fixtures/test/delete_with_js.rjs +0 -2
  435. data/test/fixtures/test/dont_pick_me +0 -1
  436. data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +0 -1
  437. data/test/fixtures/test/enum_rjs_test.rjs +0 -6
  438. data/test/fixtures/test/formatted_html_erb.html.erb +0 -1
  439. data/test/fixtures/test/formatted_xml_erb.builder +0 -1
  440. data/test/fixtures/test/formatted_xml_erb.html.erb +0 -1
  441. data/test/fixtures/test/formatted_xml_erb.xml.erb +0 -1
  442. data/test/fixtures/test/greeting.erb +0 -1
  443. data/test/fixtures/test/greeting.js.rjs +0 -1
  444. data/test/fixtures/test/hello.builder +0 -4
  445. data/test/fixtures/test/hello_world.da.html.erb +0 -1
  446. data/test/fixtures/test/hello_world.erb +0 -1
  447. data/test/fixtures/test/hello_world.erb~ +0 -1
  448. data/test/fixtures/test/hello_world.pt-BR.html.erb +0 -1
  449. data/test/fixtures/test/hello_world_container.builder +0 -3
  450. data/test/fixtures/test/hello_world_from_rxml.builder +0 -4
  451. data/test/fixtures/test/hello_world_with_layout_false.erb +0 -1
  452. data/test/fixtures/test/hello_xml_world.builder +0 -11
  453. data/test/fixtures/test/hyphen-ated.erb +0 -1
  454. data/test/fixtures/test/implicit_content_type.atom.builder +0 -2
  455. data/test/fixtures/test/list.erb +0 -1
  456. data/test/fixtures/test/malformed/malformed.en.html.erb~ +0 -1
  457. data/test/fixtures/test/malformed/malformed.erb~ +0 -1
  458. data/test/fixtures/test/malformed/malformed.html.erb~ +0 -1
  459. data/test/fixtures/test/nested_layout.erb +0 -3
  460. data/test/fixtures/test/non_erb_block_content_for.builder +0 -4
  461. data/test/fixtures/test/potential_conflicts.erb +0 -4
  462. data/test/fixtures/test/render_explicit_html_template.js.rjs +0 -1
  463. data/test/fixtures/test/render_file_from_template.html.erb +0 -1
  464. data/test/fixtures/test/render_file_with_ivar.erb +0 -1
  465. data/test/fixtures/test/render_file_with_locals.erb +0 -1
  466. data/test/fixtures/test/render_implicit_html_template.js.rjs +0 -1
  467. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb +0 -1
  468. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb +0 -1
  469. data/test/fixtures/test/render_implicit_js_template_without_layout.js.erb +0 -1
  470. data/test/fixtures/test/render_to_string_test.erb +0 -1
  471. data/test/fixtures/test/scoped_array_translation.erb +0 -1
  472. data/test/fixtures/test/sub_template_raise.html.erb +0 -1
  473. data/test/fixtures/test/template.erb +0 -1
  474. data/test/fixtures/test/translation.erb +0 -1
  475. data/test/fixtures/test/update_element_with_capture.erb +0 -9
  476. data/test/fixtures/test/using_layout_around_block.html.erb +0 -1
  477. data/test/fixtures/test/using_layout_around_block_with_args.html.erb +0 -1
  478. data/test/fixtures/test/utf8.html.erb +0 -4
  479. data/test/fixtures/test/utf8_magic.html.erb +0 -5
  480. data/test/fixtures/test/utf8_magic_with_bare_partial.html.erb +0 -5
  481. data/test/fixtures/topic.rb +0 -3
  482. data/test/fixtures/topics.yml +0 -22
  483. data/test/fixtures/topics/_topic.html.erb +0 -1
  484. data/test/template/active_record_helper_i18n_test.rb +0 -51
  485. data/test/template/active_record_helper_test.rb +0 -302
  486. data/test/template/asset_tag_helper_test.rb +0 -770
  487. data/test/template/atom_feed_helper_test.rb +0 -315
  488. data/test/template/benchmark_helper_test.rb +0 -86
  489. data/test/template/compiled_templates_test.rb +0 -204
  490. data/test/template/date_helper_i18n_test.rb +0 -121
  491. data/test/template/date_helper_test.rb +0 -2603
  492. data/test/template/erb_util_test.rb +0 -36
  493. data/test/template/form_helper_test.rb +0 -1447
  494. data/test/template/form_options_helper_i18n_test.rb +0 -27
  495. data/test/template/form_options_helper_test.rb +0 -811
  496. data/test/template/form_tag_helper_test.rb +0 -356
  497. data/test/template/javascript_helper_test.rb +0 -106
  498. data/test/template/number_helper_i18n_test.rb +0 -69
  499. data/test/template/number_helper_test.rb +0 -132
  500. data/test/template/prototype_helper_test.rb +0 -639
  501. data/test/template/raw_output_helper_test.rb +0 -21
  502. data/test/template/record_tag_helper_test.rb +0 -58
  503. data/test/template/render_test.rb +0 -329
  504. data/test/template/sanitize_helper_test.rb +0 -57
  505. data/test/template/scriptaculous_helper_test.rb +0 -90
  506. data/test/template/tag_helper_test.rb +0 -98
  507. data/test/template/template_test.rb +0 -32
  508. data/test/template/test_test.rb +0 -54
  509. data/test/template/text_helper_test.rb +0 -601
  510. data/test/template/translation_helper_test.rb +0 -95
  511. data/test/template/url_helper_test.rb +0 -641
  512. data/test/testing_sandbox.rb +0 -15
  513. data/test/view/test_case_test.rb +0 -176
@@ -1,4 +1,13 @@
1
- module ActionController #:nodoc:
1
+ module ActionDispatch
2
+ class Request
3
+ # Access the contents of the flash. Use <tt>flash["notice"]</tt> to
4
+ # read a notice you put there or <tt>flash["notice"] = "hello"</tt>
5
+ # to put a new one.
6
+ def flash
7
+ session['flash'] ||= Flash::FlashHash.new
8
+ end
9
+ end
10
+
2
11
  # The flash provides a way to pass temporary objects between actions. Anything you place in the flash will be exposed
3
12
  # to the very next action and then cleared out. This is a great way of doing notices and alerts, such as a create
4
13
  # action that sets <tt>flash[:notice] = "Successfully created"</tt> before redirecting to a display action that can
@@ -25,20 +34,7 @@ module ActionController #:nodoc:
25
34
  # many as you like at a time too. Just remember: They'll be gone by the time the next action has been performed.
26
35
  #
27
36
  # See docs on the FlashHash class for more details about the flash.
28
- module Flash
29
- def self.included(base)
30
- base.class_eval do
31
- include InstanceMethods
32
-
33
- alias_method_chain :perform_action, :flash
34
- alias_method_chain :reset_session, :flash
35
- alias_method_chain :redirect_to, :flash
36
-
37
- helper_method :alert
38
- helper_method :notice
39
- end
40
- end
41
-
37
+ class Flash
42
38
  class FlashNow #:nodoc:
43
39
  def initialize(flash)
44
40
  @flash = flash
@@ -58,7 +54,7 @@ module ActionController #:nodoc:
58
54
  class FlashHash < Hash
59
55
  def initialize #:nodoc:
60
56
  super
61
- @used = {}
57
+ @used = Set.new
62
58
  end
63
59
 
64
60
  def []=(k, v) #:nodoc:
@@ -74,7 +70,7 @@ module ActionController #:nodoc:
74
70
  alias :merge! :update
75
71
 
76
72
  def replace(h) #:nodoc:
77
- @used = {}
73
+ @used = Set.new
78
74
  super
79
75
  end
80
76
 
@@ -113,8 +109,8 @@ module ActionController #:nodoc:
113
109
  # This method is called automatically by filters, so you generally don't need to care about it.
114
110
  def sweep #:nodoc:
115
111
  keys.each do |k|
116
- unless @used[k]
117
- use(k)
112
+ unless @used.include?(k)
113
+ @used << k
118
114
  else
119
115
  delete(k)
120
116
  @used.delete(k)
@@ -122,12 +118,27 @@ module ActionController #:nodoc:
122
118
  end
123
119
 
124
120
  # clean up after keys that could have been left over by calling reject! or shift on the flash
125
- (@used.keys - keys).each{ |k| @used.delete(k) }
121
+ (@used - keys).each{ |k| @used.delete(k) }
122
+ end
123
+
124
+ # Convenience accessor for flash[:alert]
125
+ def alert
126
+ self[:alert]
126
127
  end
127
128
 
128
- def store(session, key = "flash")
129
- return if self.empty?
130
- session[key] = self
129
+ # Convenience accessor for flash[:alert]=
130
+ def alert=(message)
131
+ self[:alert] = message
132
+ end
133
+
134
+ # Convenience accessor for flash[:notice]
135
+ def notice
136
+ self[:notice]
137
+ end
138
+
139
+ # Convenience accessor for flash[:notice]=
140
+ def notice=(message)
141
+ self[:notice] = message
131
142
  end
132
143
 
133
144
  private
@@ -136,78 +147,28 @@ module ActionController #:nodoc:
136
147
  # use('msg') # marks the "msg" entry as used
137
148
  # use(nil, false) # marks the entire flash as unused (keeps it around for one more action)
138
149
  # use('msg', false) # marks the "msg" entry as unused (keeps it around for one more action)
139
- def use(k=nil, v=true)
140
- unless k.nil?
141
- @used[k] = v
142
- else
143
- keys.each{ |key| use(key, v) }
144
- end
150
+ # Returns the single value for the key you asked to be marked (un)used or the FlashHash itself
151
+ # if no key is passed.
152
+ def use(key = nil, used = true)
153
+ Array(key || keys).each { |k| used ? @used << k : @used.delete(k) }
154
+ return key ? self[key] : self
145
155
  end
146
156
  end
147
157
 
148
- module InstanceMethods #:nodoc:
149
- protected
150
- def perform_action_with_flash
151
- perform_action_without_flash
152
- if defined? @_flash
153
- @_flash.store(session)
154
- remove_instance_variable(:@_flash)
155
- end
156
- end
157
-
158
- def reset_session_with_flash
159
- reset_session_without_flash
160
- remove_instance_variable(:@_flash) if defined? @_flash
161
- end
162
-
163
- def redirect_to_with_flash(options = {}, response_status_and_flash = {}) #:doc:
164
- if alert = response_status_and_flash.delete(:alert)
165
- flash[:alert] = alert
166
- end
167
-
168
- if notice = response_status_and_flash.delete(:notice)
169
- flash[:notice] = notice
170
- end
171
-
172
- if other_flashes = response_status_and_flash.delete(:flash)
173
- flash.update(other_flashes)
174
- end
175
-
176
- redirect_to_without_flash(options, response_status_and_flash)
177
- end
178
-
179
- # Access the contents of the flash. Use <tt>flash["notice"]</tt> to
180
- # read a notice you put there or <tt>flash["notice"] = "hello"</tt>
181
- # to put a new one.
182
- def flash #:doc:
183
- if !defined?(@_flash)
184
- @_flash = session["flash"] || FlashHash.new
185
- @_flash.sweep
186
- end
187
-
188
- @_flash
189
- end
158
+ def initialize(app)
159
+ @app = app
160
+ end
190
161
 
191
-
192
- # Convenience accessor for flash[:alert]
193
- def alert
194
- flash[:alert]
195
- end
196
-
197
- # Convenience accessor for flash[:alert]=
198
- def alert=(message)
199
- flash[:alert] = message
200
- end
162
+ def call(env)
163
+ if (session = env['rack.session']) && (flash = session['flash'])
164
+ flash.sweep
165
+ end
201
166
 
202
- # Convenience accessor for flash[:notice]
203
- def notice
204
- flash[:notice]
205
- end
206
-
207
- # Convenience accessor for flash[:notice]=
208
- def notice=(message)
209
- flash[:notice] = message
210
- end
167
+ @app.call(env)
168
+ ensure
169
+ if (session = env['rack.session']) && (flash = session['flash']) && flash.empty?
170
+ session.delete('flash')
171
+ end
211
172
  end
212
173
  end
213
174
  end
@@ -0,0 +1,18 @@
1
+ module ActionDispatch
2
+ class Head
3
+ def initialize(app)
4
+ @app = app
5
+ end
6
+
7
+ def call(env)
8
+ if env["REQUEST_METHOD"] == "HEAD"
9
+ env["REQUEST_METHOD"] = "GET"
10
+ env["rack.methodoverride.original_method"] = "HEAD"
11
+ status, headers, body = @app.call(env)
12
+ [status, headers, []]
13
+ else
14
+ @app.call(env)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,78 @@
1
+ require 'active_support/json'
2
+ require 'action_dispatch/http/request'
3
+
4
+ module ActionDispatch
5
+ class ParamsParser
6
+ DEFAULT_PARSERS = {
7
+ Mime::XML => :xml_simple,
8
+ Mime::JSON => :json
9
+ }
10
+
11
+ def initialize(app, parsers = {})
12
+ @app, @parsers = app, DEFAULT_PARSERS.merge(parsers)
13
+ end
14
+
15
+ def call(env)
16
+ if params = parse_formatted_parameters(env)
17
+ env["action_dispatch.request.request_parameters"] = params
18
+ end
19
+
20
+ @app.call(env)
21
+ end
22
+
23
+ private
24
+ def parse_formatted_parameters(env)
25
+ request = Request.new(env)
26
+
27
+ return false if request.content_length.zero?
28
+
29
+ mime_type = content_type_from_legacy_post_data_format_header(env) || request.content_type
30
+ strategy = @parsers[mime_type]
31
+
32
+ return false unless strategy
33
+
34
+ case strategy
35
+ when Proc
36
+ strategy.call(request.raw_post)
37
+ when :xml_simple, :xml_node
38
+ request.body.size == 0 ? {} : Hash.from_xml(request.raw_post).with_indifferent_access
39
+ when :yaml
40
+ YAML.load(request.raw_post)
41
+ when :json
42
+ if request.body.size == 0
43
+ {}
44
+ else
45
+ data = ActiveSupport::JSON.decode(request.raw_post)
46
+ data = {:_json => data} unless data.is_a?(Hash)
47
+ data.with_indifferent_access
48
+ end
49
+ else
50
+ false
51
+ end
52
+ rescue Exception => e # YAML, XML or Ruby code block errors
53
+ logger.debug "Error occurred while parsing request parameters.\nContents:\n\n#{request.raw_post}"
54
+
55
+ raise
56
+ { "body" => request.raw_post,
57
+ "content_type" => request.content_type,
58
+ "content_length" => request.content_length,
59
+ "exception" => "#{e.message} (#{e.class})",
60
+ "backtrace" => e.backtrace }
61
+ end
62
+
63
+ def content_type_from_legacy_post_data_format_header(env)
64
+ if x_post_format = env['HTTP_X_POST_DATA_FORMAT']
65
+ case x_post_format.to_s.downcase
66
+ when 'yaml' then return Mime::YAML
67
+ when 'xml' then return Mime::XML
68
+ end
69
+ end
70
+
71
+ nil
72
+ end
73
+
74
+ def logger
75
+ defined?(Rails.logger) ? Rails.logger : Logger.new($stderr)
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,26 @@
1
+ module ActionDispatch
2
+ class Rescue
3
+ def initialize(app, rescuers = {}, &block)
4
+ @app, @rescuers = app, {}
5
+ rescuers.each { |exception, rescuer| rescue_from(exception, rescuer) }
6
+ instance_eval(&block) if block_given?
7
+ end
8
+
9
+ def call(env)
10
+ @app.call(env)
11
+ rescue Exception => exception
12
+ if rescuer = @rescuers[exception.class.name]
13
+ env['action_dispatch.rescue.exception'] = exception
14
+ rescuer.call(env)
15
+ else
16
+ raise exception
17
+ end
18
+ end
19
+
20
+ protected
21
+ def rescue_from(exception, rescuer)
22
+ exception = exception.class.name if exception.is_a?(Exception)
23
+ @rescuers[exception.to_s] = rescuer
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,209 @@
1
+ require 'rack/utils'
2
+ require 'rack/request'
3
+
4
+ module ActionDispatch
5
+ module Session
6
+ class SessionRestoreError < StandardError #:nodoc:
7
+ end
8
+
9
+ class AbstractStore
10
+ ENV_SESSION_KEY = 'rack.session'.freeze
11
+ ENV_SESSION_OPTIONS_KEY = 'rack.session.options'.freeze
12
+
13
+ HTTP_COOKIE = 'HTTP_COOKIE'.freeze
14
+ SET_COOKIE = 'Set-Cookie'.freeze
15
+
16
+ class SessionHash < Hash
17
+ def initialize(by, env)
18
+ super()
19
+ @by = by
20
+ @env = env
21
+ @loaded = false
22
+ end
23
+
24
+ def session_id
25
+ ActiveSupport::Deprecation.warn(
26
+ "ActionDispatch::Session::AbstractStore::SessionHash#session_id " +
27
+ "has been deprecated. Please use request.session_options[:id] instead.", caller)
28
+ @env[ENV_SESSION_OPTIONS_KEY][:id]
29
+ end
30
+
31
+ def [](key)
32
+ load! unless @loaded
33
+ super(key.to_s)
34
+ end
35
+
36
+ def []=(key, value)
37
+ load! unless @loaded
38
+ super(key.to_s, value)
39
+ end
40
+
41
+ def to_hash
42
+ h = {}.replace(self)
43
+ h.delete_if { |k,v| v.nil? }
44
+ h
45
+ end
46
+
47
+ def update(hash = nil)
48
+ if hash.nil?
49
+ ActiveSupport::Deprecation.warn('use replace instead', caller)
50
+ replace({})
51
+ else
52
+ load! unless @loaded
53
+ super(hash.stringify_keys)
54
+ end
55
+ end
56
+
57
+ def delete(key = nil)
58
+ if key.nil?
59
+ ActiveSupport::Deprecation.warn('use clear instead', caller)
60
+ clear
61
+ else
62
+ load! unless @loaded
63
+ super(key.to_s)
64
+ end
65
+ end
66
+
67
+ def data
68
+ ActiveSupport::Deprecation.warn(
69
+ "ActionDispatch::Session::AbstractStore::SessionHash#data " +
70
+ "has been deprecated. Please use #to_hash instead.", caller)
71
+ to_hash
72
+ end
73
+
74
+ def close
75
+ ActiveSupport::Deprecation.warn('sessions should no longer be closed', caller)
76
+ end
77
+
78
+ def inspect
79
+ load! unless @loaded
80
+ super
81
+ end
82
+
83
+ private
84
+ def loaded?
85
+ @loaded
86
+ end
87
+
88
+ def load!
89
+ stale_session_check! do
90
+ id, session = @by.send(:load_session, @env)
91
+ (@env[ENV_SESSION_OPTIONS_KEY] ||= {})[:id] = id
92
+ replace(session.stringify_keys)
93
+ @loaded = true
94
+ end
95
+ end
96
+
97
+ def stale_session_check!
98
+ yield
99
+ rescue ArgumentError => argument_error
100
+ if argument_error.message =~ %r{undefined class/module ([\w:]*\w)}
101
+ begin
102
+ # Note that the regexp does not allow $1 to end with a ':'
103
+ $1.constantize
104
+ rescue LoadError, NameError => const_error
105
+ raise ActionDispatch::Session::SessionRestoreError, "Session contains objects whose class definition isn't available.\nRemember to require the classes for all objects kept in the session.\n(Original exception: #{const_error.message} [#{const_error.class}])\n"
106
+ end
107
+
108
+ retry
109
+ else
110
+ raise
111
+ end
112
+ end
113
+ end
114
+
115
+ DEFAULT_OPTIONS = {
116
+ :key => '_session_id',
117
+ :path => '/',
118
+ :domain => nil,
119
+ :expire_after => nil,
120
+ :secure => false,
121
+ :httponly => true,
122
+ :cookie_only => true
123
+ }
124
+
125
+ def initialize(app, options = {})
126
+ # Process legacy CGI options
127
+ options = options.symbolize_keys
128
+ if options.has_key?(:session_path)
129
+ options[:path] = options.delete(:session_path)
130
+ end
131
+ if options.has_key?(:session_key)
132
+ options[:key] = options.delete(:session_key)
133
+ end
134
+ if options.has_key?(:session_http_only)
135
+ options[:httponly] = options.delete(:session_http_only)
136
+ end
137
+
138
+ @app = app
139
+ @default_options = DEFAULT_OPTIONS.merge(options)
140
+ @key = @default_options[:key]
141
+ @cookie_only = @default_options[:cookie_only]
142
+ end
143
+
144
+ def call(env)
145
+ session = SessionHash.new(self, env)
146
+
147
+ env[ENV_SESSION_KEY] = session
148
+ env[ENV_SESSION_OPTIONS_KEY] = @default_options.dup
149
+
150
+ response = @app.call(env)
151
+
152
+ session_data = env[ENV_SESSION_KEY]
153
+ options = env[ENV_SESSION_OPTIONS_KEY]
154
+
155
+ if !session_data.is_a?(AbstractStore::SessionHash) || session_data.send(:loaded?) || options[:expire_after]
156
+ session_data.send(:load!) if session_data.is_a?(AbstractStore::SessionHash) && !session_data.send(:loaded?)
157
+
158
+ sid = options[:id] || generate_sid
159
+
160
+ unless set_session(env, sid, session_data.to_hash)
161
+ return response
162
+ end
163
+
164
+ cookie = Rack::Utils.escape(@key) + '=' + Rack::Utils.escape(sid)
165
+ cookie << "; domain=#{options[:domain]}" if options[:domain]
166
+ cookie << "; path=#{options[:path]}" if options[:path]
167
+ if options[:expire_after]
168
+ expiry = Time.now + options[:expire_after]
169
+ cookie << "; expires=#{expiry.httpdate}"
170
+ end
171
+ cookie << "; Secure" if options[:secure]
172
+ cookie << "; HttpOnly" if options[:httponly]
173
+
174
+ headers = response[1]
175
+ unless headers[SET_COOKIE].blank?
176
+ headers[SET_COOKIE] << "\n#{cookie}"
177
+ else
178
+ headers[SET_COOKIE] = cookie
179
+ end
180
+ end
181
+
182
+ response
183
+ end
184
+
185
+ private
186
+ def generate_sid
187
+ ActiveSupport::SecureRandom.hex(16)
188
+ end
189
+
190
+ def load_session(env)
191
+ request = Rack::Request.new(env)
192
+ sid = request.cookies[@key]
193
+ unless @cookie_only
194
+ sid ||= request.params[@key]
195
+ end
196
+ sid, session = get_session(env, sid)
197
+ [sid, session]
198
+ end
199
+
200
+ def get_session(env, sid)
201
+ raise '#get_session needs to be implemented.'
202
+ end
203
+
204
+ def set_session(env, sid, session_data)
205
+ raise '#set_session needs to be implemented.'
206
+ end
207
+ end
208
+ end
209
+ end