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,7 @@
1
- module ActionController
1
+ require 'active_support/core_ext/hash/keys'
2
+ require 'rack/request'
3
+
4
+ module ActionDispatch
2
5
  module Session
3
6
  # This cookie-based session store is the Rails default. Sessions typically
4
7
  # contain at most a user_id and flash message; both fit within the 4K cookie
@@ -36,8 +39,6 @@ module ActionController
36
39
  #
37
40
  # Note that changing digest or secret invalidates all existing sessions!
38
41
  class CookieStore
39
- include AbstractStore::SessionUtils
40
-
41
42
  # Cookies can typically store 4096 bytes.
42
43
  MAX = 4096
43
44
  SECRET_MIN_LENGTH = 30 # characters
@@ -50,8 +51,20 @@ module ActionController
50
51
  :httponly => true
51
52
  }.freeze
52
53
 
54
+ class OptionsHash < Hash
55
+ def initialize(by, env, default_options)
56
+ @session_data = env[CookieStore::ENV_SESSION_KEY]
57
+ default_options.each { |key, value| self[key] = value }
58
+ end
59
+
60
+ def [](key)
61
+ key == :id ? @session_data[:session_id] : super(key)
62
+ end
63
+ end
64
+
53
65
  ENV_SESSION_KEY = "rack.session".freeze
54
66
  ENV_SESSION_OPTIONS_KEY = "rack.session.options".freeze
67
+ HTTP_SET_COOKIE = "Set-Cookie".freeze
55
68
 
56
69
  # Raised when storing more than 4K of session data.
57
70
  class CookieOverflow < StandardError; end
@@ -60,18 +73,12 @@ module ActionController
60
73
  # Process legacy CGI options
61
74
  options = options.symbolize_keys
62
75
  if options.has_key?(:session_path)
63
- ActiveSupport::Deprecation.warn "Giving :session_path to SessionStore is deprecated, " <<
64
- "please use :path instead", caller
65
76
  options[:path] = options.delete(:session_path)
66
77
  end
67
78
  if options.has_key?(:session_key)
68
- ActiveSupport::Deprecation.warn "Giving :session_key to SessionStore is deprecated, " <<
69
- "please use :key instead", caller
70
79
  options[:key] = options.delete(:session_key)
71
80
  end
72
81
  if options.has_key?(:session_http_only)
73
- ActiveSupport::Deprecation.warn "Giving :session_http_only to SessionStore is deprecated, " <<
74
- "please use :httponly instead", caller
75
82
  options[:httponly] = options.delete(:session_http_only)
76
83
  end
77
84
 
@@ -94,81 +101,74 @@ module ActionController
94
101
  end
95
102
 
96
103
  def call(env)
97
- prepare!(env)
98
-
104
+ env[ENV_SESSION_KEY] = AbstractStore::SessionHash.new(self, env)
105
+ env[ENV_SESSION_OPTIONS_KEY] = OptionsHash.new(self, env, @default_options)
106
+
99
107
  status, headers, body = @app.call(env)
100
108
 
101
109
  session_data = env[ENV_SESSION_KEY]
102
110
  options = env[ENV_SESSION_OPTIONS_KEY]
103
- request = ActionController::Request.new(env)
104
-
105
- if !(options[:secure] && !request.ssl?) && (!session_data.is_a?(AbstractStore::SessionHash) || session_data.loaded? || options[:expire_after])
106
- session_data.send(:load!) if session_data.is_a?(AbstractStore::SessionHash) && !session_data.loaded?
107
111
 
108
- persistent_session_id!(session_data)
112
+ if !session_data.is_a?(AbstractStore::SessionHash) || session_data.send(:loaded?) || options[:expire_after]
113
+ session_data.send(:load!) if session_data.is_a?(AbstractStore::SessionHash) && !session_data.send(:loaded?)
109
114
  session_data = marshal(session_data.to_hash)
110
115
 
111
116
  raise CookieOverflow if session_data.size > MAX
117
+
112
118
  cookie = Hash.new
113
119
  cookie[:value] = session_data
114
120
  unless options[:expire_after].nil?
115
121
  cookie[:expires] = Time.now + options[:expire_after]
116
122
  end
117
123
 
118
- Rack::Utils.set_cookie_header!(headers, @key, cookie.merge(options))
124
+ cookie = build_cookie(@key, cookie.merge(options))
125
+ unless headers[HTTP_SET_COOKIE].blank?
126
+ headers[HTTP_SET_COOKIE] << "\n#{cookie}"
127
+ else
128
+ headers[HTTP_SET_COOKIE] = cookie
129
+ end
119
130
  end
120
131
 
121
132
  [status, headers, body]
122
133
  end
123
134
 
124
135
  private
125
-
126
- def prepare!(env)
127
- env[ENV_SESSION_KEY] = AbstractStore::SessionHash.new(self, env)
128
- env[ENV_SESSION_OPTIONS_KEY] = AbstractStore::OptionsHash.new(self, env, @default_options)
129
- end
130
-
131
- def load_session(env)
132
- data = unpacked_cookie_data(env)
133
- data = persistent_session_id!(data)
134
- [data[:session_id], data]
135
- end
136
-
137
- def extract_session_id(env)
138
- if data = unpacked_cookie_data(env)
139
- persistent_session_id!(data) unless data.empty?
140
- data[:session_id]
141
- else
142
- nil
136
+ # Should be in Rack::Utils soon
137
+ def build_cookie(key, value)
138
+ case value
139
+ when Hash
140
+ domain = "; domain=" + value[:domain] if value[:domain]
141
+ path = "; path=" + value[:path] if value[:path]
142
+ # According to RFC 2109, we need dashes here.
143
+ # N.B.: cgi.rb uses spaces...
144
+ expires = "; expires=" + value[:expires].clone.gmtime.
145
+ strftime("%a, %d-%b-%Y %H:%M:%S GMT") if value[:expires]
146
+ secure = "; secure" if value[:secure]
147
+ httponly = "; HttpOnly" if value[:httponly]
148
+ value = value[:value]
143
149
  end
150
+ value = [value] unless Array === value
151
+ cookie = Rack::Utils.escape(key) + "=" +
152
+ value.map { |v| Rack::Utils.escape(v) }.join("&") +
153
+ "#{domain}#{path}#{expires}#{secure}#{httponly}"
144
154
  end
145
155
 
146
- def current_session_id(env)
147
- env[ENV_SESSION_OPTIONS_KEY][:id]
148
- end
149
-
150
- def exists?(env)
151
- current_session_id(env).present?
152
- end
153
-
154
- def unpacked_cookie_data(env)
155
- env["action_dispatch.request.unsigned_session_cookie"] ||= begin
156
- stale_session_check! do
157
- request = Rack::Request.new(env)
158
- session_data = request.cookies[@key]
159
- unmarshal(session_data) || {}
160
- end
161
- end
156
+ def load_session(env)
157
+ request = Rack::Request.new(env)
158
+ session_data = request.cookies[@key]
159
+ data = unmarshal(session_data) || persistent_session_id!({})
160
+ data.stringify_keys!
161
+ [data["session_id"], data]
162
162
  end
163
163
 
164
164
  # Marshal a session hash into safe cookie data. Include an integrity hash.
165
165
  def marshal(session)
166
- @verifier.generate(session)
166
+ @verifier.generate(persistent_session_id!(session))
167
167
  end
168
168
 
169
169
  # Unmarshal cookie data to a hash and verify its integrity.
170
170
  def unmarshal(cookie)
171
- @verifier.verify(cookie) if cookie
171
+ persistent_session_id!(@verifier.verify(cookie)) if cookie
172
172
  rescue ActiveSupport::MessageVerifier::InvalidSignature
173
173
  nil
174
174
  end
@@ -179,7 +179,7 @@ module ActionController
179
179
  'cookie containing the session data. Use ' +
180
180
  'config.action_controller.session = { :key => ' +
181
181
  '"_myapp_session", :secret => "some secret phrase" } in ' +
182
- 'config/environment.rb'
182
+ 'config/application.rb'
183
183
  end
184
184
  end
185
185
 
@@ -216,21 +216,17 @@ module ActionController
216
216
  ActiveSupport::SecureRandom.hex(16)
217
217
  end
218
218
 
219
- def destroy(env)
220
- # session data is stored on client; nothing to do here
221
- end
222
-
223
219
  def persistent_session_id!(data)
224
220
  (data ||= {}).merge!(inject_persistent_session_id(data))
225
221
  end
226
222
 
227
223
  def inject_persistent_session_id(data)
228
- requires_session_id?(data) ? { :session_id => generate_sid } : {}
224
+ requires_session_id?(data) ? { "session_id" => generate_sid } : {}
229
225
  end
230
226
 
231
227
  def requires_session_id?(data)
232
228
  if data
233
- data.respond_to?(:key?) && !data.key?(:session_id)
229
+ data.respond_to?(:key?) && !data.key?("session_id")
234
230
  else
235
231
  true
236
232
  end
@@ -0,0 +1,47 @@
1
+ module ActionDispatch
2
+ module Session
3
+ class MemCacheStore < AbstractStore
4
+ def initialize(app, options = {})
5
+ require 'memcache'
6
+
7
+ # Support old :expires option
8
+ options[:expire_after] ||= options[:expires]
9
+
10
+ super
11
+
12
+ @default_options = {
13
+ :namespace => 'rack:session',
14
+ :memcache_server => 'localhost:11211'
15
+ }.merge(@default_options)
16
+
17
+ @pool = options[:cache] || MemCache.new(@default_options[:memcache_server], @default_options)
18
+ unless @pool.servers.any? { |s| s.alive? }
19
+ raise "#{self} unable to find server during initialization."
20
+ end
21
+ @mutex = Mutex.new
22
+
23
+ super
24
+ end
25
+
26
+ private
27
+ def get_session(env, sid)
28
+ sid ||= generate_sid
29
+ begin
30
+ session = @pool.get(sid) || {}
31
+ rescue MemCache::MemCacheError, Errno::ECONNREFUSED
32
+ session = {}
33
+ end
34
+ [sid, session]
35
+ end
36
+
37
+ def set_session(env, sid, session_data)
38
+ options = env['rack.session.options']
39
+ expiry = options[:expire_after] || 0
40
+ @pool.set(sid, session_data, expiry)
41
+ return true
42
+ rescue MemCache::MemCacheError, Errno::ECONNREFUSED
43
+ return false
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,173 @@
1
+ require 'active_support/core_ext/exception'
2
+ require 'active_support/notifications'
3
+ require 'action_dispatch/http/request'
4
+
5
+ module ActionDispatch
6
+ # This middleware rescues any exception returned by the application and renders
7
+ # nice exception pages if it's being rescued locally.
8
+ #
9
+ # Every time an exception is caught, a notification is published, becoming a good API
10
+ # to deal with exceptions. So, if you want send an e-mail through ActionMailer
11
+ # everytime this notification is published, you just need to do the following:
12
+ #
13
+ # ActiveSupport::Notifications.subscribe "action_dispatch.show_exception" do |name, start, end, instrumentation_id, payload|
14
+ # ExceptionNotifier.deliver_exception(start, payload)
15
+ # end
16
+ #
17
+ # The payload is a hash which has two pairs:
18
+ #
19
+ # * :env - Contains the rack env for the given request;
20
+ # * :exception - The exception raised;
21
+ #
22
+ class ShowExceptions
23
+ LOCALHOST = ['127.0.0.1', '::1'].freeze
24
+
25
+ RESCUES_TEMPLATE_PATH = File.join(File.dirname(__FILE__), 'templates')
26
+
27
+ cattr_accessor :rescue_responses
28
+ @@rescue_responses = Hash.new(:internal_server_error)
29
+ @@rescue_responses.update({
30
+ 'ActionController::RoutingError' => :not_found,
31
+ 'AbstractController::ActionNotFound' => :not_found,
32
+ 'ActiveRecord::RecordNotFound' => :not_found,
33
+ 'ActiveRecord::StaleObjectError' => :conflict,
34
+ 'ActiveRecord::RecordInvalid' => :unprocessable_entity,
35
+ 'ActiveRecord::RecordNotSaved' => :unprocessable_entity,
36
+ 'ActionController::MethodNotAllowed' => :method_not_allowed,
37
+ 'ActionController::NotImplemented' => :not_implemented,
38
+ 'ActionController::InvalidAuthenticityToken' => :unprocessable_entity
39
+ })
40
+
41
+ cattr_accessor :rescue_templates
42
+ @@rescue_templates = Hash.new('diagnostics')
43
+ @@rescue_templates.update({
44
+ 'ActionView::MissingTemplate' => 'missing_template',
45
+ 'ActionController::RoutingError' => 'routing_error',
46
+ 'AbstractController::ActionNotFound' => 'unknown_action',
47
+ 'ActionView::Template::Error' => 'template_error'
48
+ })
49
+
50
+ FAILSAFE_RESPONSE = [500, {'Content-Type' => 'text/html'},
51
+ ["<html><body><h1>500 Internal Server Error</h1>" <<
52
+ "If you are the administrator of this website, then please read this web " <<
53
+ "application's log file and/or the web server's log file to find out what " <<
54
+ "went wrong.</body></html>"]]
55
+
56
+ def initialize(app, consider_all_requests_local = false)
57
+ @app = app
58
+ @consider_all_requests_local = consider_all_requests_local
59
+ end
60
+
61
+ def call(env)
62
+ @app.call(env)
63
+ rescue Exception => exception
64
+ raise exception if env['action_dispatch.show_exceptions'] == false
65
+ render_exception(env, exception)
66
+ end
67
+
68
+ private
69
+ def render_exception(env, exception)
70
+ log_error(exception)
71
+
72
+ request = Request.new(env)
73
+ if @consider_all_requests_local || local_request?(request)
74
+ rescue_action_locally(request, exception)
75
+ else
76
+ rescue_action_in_public(exception)
77
+ end
78
+ rescue Exception => failsafe_error
79
+ $stderr.puts "Error during failsafe response: #{failsafe_error}"
80
+ FAILSAFE_RESPONSE
81
+ end
82
+
83
+ # Render detailed diagnostics for unhandled exceptions rescued from
84
+ # a controller action.
85
+ def rescue_action_locally(request, exception)
86
+ template = ActionView::Base.new([RESCUES_TEMPLATE_PATH],
87
+ :request => request,
88
+ :exception => exception,
89
+ :application_trace => application_trace(exception),
90
+ :framework_trace => framework_trace(exception),
91
+ :full_trace => full_trace(exception)
92
+ )
93
+ file = "rescues/#{@@rescue_templates[exception.class.name]}.erb"
94
+ body = template.render(:file => file, :layout => 'rescues/layout.erb')
95
+ render(status_code(exception), body)
96
+ end
97
+
98
+ # Attempts to render a static error page based on the
99
+ # <tt>status_code</tt> thrown, or just return headers if no such file
100
+ # exists. At first, it will try to render a localized static page.
101
+ # For example, if a 500 error is being handled Rails and locale is :da,
102
+ # it will first attempt to render the file at <tt>public/500.da.html</tt>
103
+ # then attempt to render <tt>public/500.html</tt>. If none of them exist,
104
+ # the body of the response will be left empty.
105
+ def rescue_action_in_public(exception)
106
+ status = status_code(exception)
107
+ locale_path = "#{public_path}/#{status}.#{I18n.locale}.html" if I18n.locale
108
+ path = "#{public_path}/#{status}.html"
109
+
110
+ if locale_path && File.exist?(locale_path)
111
+ render(status, File.read(locale_path))
112
+ elsif File.exist?(path)
113
+ render(status, File.read(path))
114
+ else
115
+ render(status, '')
116
+ end
117
+ end
118
+
119
+ # True if the request came from localhost, 127.0.0.1.
120
+ def local_request?(request)
121
+ LOCALHOST.any?{ |local_ip| request.remote_addr == local_ip && request.remote_ip == local_ip }
122
+ end
123
+
124
+ def status_code(exception)
125
+ Rack::Utils.status_code(@@rescue_responses[exception.class.name])
126
+ end
127
+
128
+ def render(status, body)
129
+ [status, {'Content-Type' => 'text/html', 'Content-Length' => body.length.to_s}, [body]]
130
+ end
131
+
132
+ def public_path
133
+ defined?(Rails.public_path) ? Rails.public_path : 'public_path'
134
+ end
135
+
136
+ def log_error(exception)
137
+ return unless logger
138
+
139
+ ActiveSupport::Deprecation.silence do
140
+ if ActionView::Template::Error === exception
141
+ logger.fatal(exception.to_s)
142
+ else
143
+ logger.fatal(
144
+ "\n#{exception.class} (#{exception.message}):\n " +
145
+ clean_backtrace(exception).join("\n ") + "\n\n"
146
+ )
147
+ end
148
+ end
149
+ end
150
+
151
+ def application_trace(exception)
152
+ clean_backtrace(exception, :silent)
153
+ end
154
+
155
+ def framework_trace(exception)
156
+ clean_backtrace(exception, :noise)
157
+ end
158
+
159
+ def full_trace(exception)
160
+ clean_backtrace(exception, :all)
161
+ end
162
+
163
+ def clean_backtrace(exception, *args)
164
+ defined?(Rails) && Rails.respond_to?(:backtrace_cleaner) ?
165
+ Rails.backtrace_cleaner.clean(exception.backtrace, *args) :
166
+ exception.backtrace
167
+ end
168
+
169
+ def logger
170
+ defined?(Rails.logger) ? Rails.logger : Logger.new($stderr)
171
+ end
172
+ end
173
+ end
@@ -1,4 +1,6 @@
1
- module ActionController
1
+ require "active_support/inflector/methods"
2
+
3
+ module ActionDispatch
2
4
  class MiddlewareStack < Array
3
5
  class Middleware
4
6
  def self.new(klass, *args, &block)
@@ -27,15 +29,13 @@ module ActionController
27
29
  end
28
30
 
29
31
  def klass
30
- if @klass.respond_to?(:call)
31
- @klass.call
32
- elsif @klass.is_a?(Class)
32
+ if @klass.respond_to?(:new)
33
33
  @klass
34
+ elsif @klass.respond_to?(:call)
35
+ @klass.call
34
36
  else
35
- @klass.to_s.constantize
37
+ ActiveSupport::Inflector.constantize(@klass.to_s)
36
38
  end
37
- rescue NameError
38
- @klass
39
39
  end
40
40
 
41
41
  def active?
@@ -55,14 +55,16 @@ module ActionController
55
55
  when Class
56
56
  klass == middleware
57
57
  else
58
- klass == middleware.to_s.constantize
58
+ if lazy_compare?(@klass) && lazy_compare?(middleware)
59
+ normalize(@klass) == normalize(middleware)
60
+ else
61
+ klass == ActiveSupport::Inflector.constantize(middleware.to_s)
62
+ end
59
63
  end
60
64
  end
61
65
 
62
66
  def inspect
63
- str = klass.to_s
64
- args.each { |arg| str += ", #{arg.inspect}" }
65
- str
67
+ klass.to_s
66
68
  end
67
69
 
68
70
  def build(app)
@@ -74,6 +76,13 @@ module ActionController
74
76
  end
75
77
 
76
78
  private
79
+ def lazy_compare?(object)
80
+ object.is_a?(String) || object.is_a?(Symbol)
81
+ end
82
+
83
+ def normalize(object)
84
+ object.to_s.strip.sub(/^::/, '')
85
+ end
77
86
 
78
87
  def build_args
79
88
  Array(args).map { |arg| arg.respond_to?(:call) ? arg.call : arg }
@@ -94,8 +103,9 @@ module ActionController
94
103
  alias_method :insert_before, :insert
95
104
 
96
105
  def insert_after(index, *args, &block)
97
- index = self.index(index) unless index.is_a?(Integer)
98
- insert(index + 1, *args, &block)
106
+ i = index.is_a?(Integer) ? index : self.index(index)
107
+ raise "No such middleware to insert after: #{index.inspect}" unless i
108
+ insert(i + 1, *args, &block)
99
109
  end
100
110
 
101
111
  def swap(target, *args, &block)