actionpack 2.3.18 → 3.0.0.beta

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of actionpack might be problematic. Click here for more details.

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,14 +0,0 @@
1
- use "Rack::Lock", :if => lambda {
2
- !ActionController::Base.allow_concurrency
3
- }
4
-
5
- use "ActionController::Failsafe"
6
-
7
- use lambda { ActionController::Base.session_store },
8
- lambda { ActionController::Base.session_options }
9
-
10
- use "ActionController::ParamsParser"
11
- use "Rack::MethodOverride"
12
- use "Rack::Head"
13
-
14
- use "ActionController::StringCoercion"
@@ -1,193 +0,0 @@
1
- module ActionController #:nodoc:
2
- module MimeResponds #:nodoc:
3
- def self.included(base)
4
- base.module_eval do
5
- include ActionController::MimeResponds::InstanceMethods
6
- end
7
- end
8
-
9
- module InstanceMethods
10
- # Without web-service support, an action which collects the data for displaying a list of people
11
- # might look something like this:
12
- #
13
- # def index
14
- # @people = Person.find(:all)
15
- # end
16
- #
17
- # Here's the same action, with web-service support baked in:
18
- #
19
- # def index
20
- # @people = Person.find(:all)
21
- #
22
- # respond_to do |format|
23
- # format.html
24
- # format.xml { render :xml => @people.to_xml }
25
- # end
26
- # end
27
- #
28
- # What that says is, "if the client wants HTML in response to this action, just respond as we
29
- # would have before, but if the client wants XML, return them the list of people in XML format."
30
- # (Rails determines the desired response format from the HTTP Accept header submitted by the client.)
31
- #
32
- # Supposing you have an action that adds a new person, optionally creating their company
33
- # (by name) if it does not already exist, without web-services, it might look like this:
34
- #
35
- # def create
36
- # @company = Company.find_or_create_by_name(params[:company][:name])
37
- # @person = @company.people.create(params[:person])
38
- #
39
- # redirect_to(person_list_url)
40
- # end
41
- #
42
- # Here's the same action, with web-service support baked in:
43
- #
44
- # def create
45
- # company = params[:person].delete(:company)
46
- # @company = Company.find_or_create_by_name(company[:name])
47
- # @person = @company.people.create(params[:person])
48
- #
49
- # respond_to do |format|
50
- # format.html { redirect_to(person_list_url) }
51
- # format.js
52
- # format.xml { render :xml => @person.to_xml(:include => @company) }
53
- # end
54
- # end
55
- #
56
- # If the client wants HTML, we just redirect them back to the person list. If they want Javascript
57
- # (format.js), then it is an RJS request and we render the RJS template associated with this action.
58
- # Lastly, if the client wants XML, we render the created person as XML, but with a twist: we also
59
- # include the person's company in the rendered XML, so you get something like this:
60
- #
61
- # <person>
62
- # <id>...</id>
63
- # ...
64
- # <company>
65
- # <id>...</id>
66
- # <name>...</name>
67
- # ...
68
- # </company>
69
- # </person>
70
- #
71
- # Note, however, the extra bit at the top of that action:
72
- #
73
- # company = params[:person].delete(:company)
74
- # @company = Company.find_or_create_by_name(company[:name])
75
- #
76
- # This is because the incoming XML document (if a web-service request is in process) can only contain a
77
- # single root-node. So, we have to rearrange things so that the request looks like this (url-encoded):
78
- #
79
- # person[name]=...&person[company][name]=...&...
80
- #
81
- # And, like this (xml-encoded):
82
- #
83
- # <person>
84
- # <name>...</name>
85
- # <company>
86
- # <name>...</name>
87
- # </company>
88
- # </person>
89
- #
90
- # In other words, we make the request so that it operates on a single entity's person. Then, in the action,
91
- # we extract the company data from the request, find or create the company, and then create the new person
92
- # with the remaining data.
93
- #
94
- # Note that you can define your own XML parameter parser which would allow you to describe multiple entities
95
- # in a single request (i.e., by wrapping them all in a single root node), but if you just go with the flow
96
- # and accept Rails' defaults, life will be much easier.
97
- #
98
- # If you need to use a MIME type which isn't supported by default, you can register your own handlers in
99
- # environment.rb as follows.
100
- #
101
- # Mime::Type.register "image/jpg", :jpg
102
- def respond_to(*types, &block)
103
- raise ArgumentError, "respond_to takes either types or a block, never both" unless types.any? ^ block
104
- block ||= lambda { |responder| types.each { |type| responder.send(type) } }
105
- responder = Responder.new(self)
106
- block.call(responder)
107
- responder.respond
108
- end
109
- end
110
-
111
- class Responder #:nodoc:
112
- def initialize(controller)
113
- @controller = controller
114
- @request = controller.request
115
- @response = controller.response
116
-
117
- if ActionController::Base.use_accept_header
118
- @mime_type_priority = Array(Mime::Type.lookup_by_extension(@request.parameters[:format]) || @request.accepts)
119
- else
120
- @mime_type_priority = [@request.format]
121
- end
122
-
123
- @order = []
124
- @responses = {}
125
- end
126
-
127
- def custom(mime_type, &block)
128
- mime_type = mime_type.is_a?(Mime::Type) ? mime_type : Mime::Type.lookup(mime_type.to_s)
129
-
130
- @order << mime_type
131
-
132
- @responses[mime_type] ||= Proc.new do
133
- @response.template.template_format = mime_type.to_sym
134
- @response.content_type = mime_type.to_s
135
- block_given? ? block.call : @controller.send(:render, :action => @controller.action_name)
136
- end
137
- end
138
-
139
- def any(*args, &block)
140
- if args.any?
141
- args.each { |type| send(type, &block) }
142
- else
143
- custom(@mime_type_priority.first, &block)
144
- end
145
- end
146
-
147
- def self.generate_method_for_mime(mime)
148
- sym = mime.is_a?(Symbol) ? mime : mime.to_sym
149
- const = sym.to_s.upcase
150
- class_eval <<-RUBY, __FILE__, __LINE__ + 1
151
- def #{sym}(&block) # def html(&block)
152
- custom(Mime::#{const}, &block) # custom(Mime::HTML, &block)
153
- end # end
154
- RUBY
155
- end
156
-
157
- Mime::SET.each do |mime|
158
- generate_method_for_mime(mime)
159
- end
160
-
161
- def method_missing(symbol, &block)
162
- mime_constant = Mime.const_get(symbol.to_s.upcase)
163
-
164
- if Mime::SET.include?(mime_constant)
165
- self.class.generate_method_for_mime(mime_constant)
166
- send(symbol, &block)
167
- else
168
- super
169
- end
170
- end
171
-
172
- def respond
173
- for priority in @mime_type_priority
174
- if priority == Mime::ALL
175
- @responses[@order.first].call
176
- return
177
- else
178
- if @responses[priority]
179
- @responses[priority].call
180
- return # mime type match found, be happy and return
181
- end
182
- end
183
- end
184
-
185
- if @order.include?(Mime::ALL)
186
- @responses[Mime::ALL].call
187
- else
188
- @controller.send :head, :not_acceptable
189
- end
190
- end
191
- end
192
- end
193
- end
@@ -1,77 +0,0 @@
1
- module ActionController
2
- class ParamsParser
3
- ActionController::Base.param_parsers[Mime::XML] = :xml_simple
4
- ActionController::Base.param_parsers[Mime::JSON] = :json
5
-
6
- def initialize(app)
7
- @app = app
8
- end
9
-
10
- def call(env)
11
- if params = parse_formatted_parameters(env)
12
- env["action_controller.request.request_parameters"] = params
13
- end
14
-
15
- @app.call(env)
16
- end
17
-
18
- private
19
- def parse_formatted_parameters(env)
20
- request = Request.new(env)
21
-
22
- return false if request.content_length.zero?
23
-
24
- mime_type = content_type_from_legacy_post_data_format_header(env) || request.content_type
25
- strategy = ActionController::Base.param_parsers[mime_type]
26
-
27
- return false unless strategy
28
-
29
- case strategy
30
- when Proc
31
- strategy.call(request.raw_post)
32
- when :xml_simple, :xml_node
33
- body = request.raw_post
34
- body.blank? ? {} : Hash.from_xml(body).with_indifferent_access
35
- when :yaml
36
- YAML.load(request.raw_post)
37
- when :json
38
- body = request.raw_post
39
- if body.blank?
40
- {}
41
- else
42
- data = ActiveSupport::JSON.decode(body)
43
- data = {:_json => data} unless data.is_a?(Hash)
44
- data.with_indifferent_access
45
- end
46
- else
47
- false
48
- end
49
- rescue Exception => e # YAML, XML or Ruby code block errors
50
- logger.debug "Error occurred while parsing request parameters.\nContents:\n\n#{request.raw_post}"
51
-
52
- raise
53
- { "body" => request.raw_post,
54
- "content_type" => request.content_type,
55
- "content_length" => request.content_length,
56
- "exception" => "#{e.message} (#{e.class})",
57
- "backtrace" => e.backtrace }
58
- end
59
-
60
- def content_type_from_legacy_post_data_format_header(env)
61
- if x_post_format = env['HTTP_X_POST_DATA_FORMAT']
62
- case x_post_format.to_s.downcase
63
- when 'yaml'
64
- return Mime::YAML
65
- when 'xml'
66
- return Mime::XML
67
- end
68
- end
69
-
70
- nil
71
- end
72
-
73
- def logger
74
- defined?(Rails.logger) ? Rails.logger : Logger.new($stderr)
75
- end
76
- end
77
- end
@@ -1,15 +0,0 @@
1
- require 'active_support/testing/performance'
2
- require 'active_support/testing/default'
3
-
4
- module ActionController
5
- # An integration test that runs a code profiler on your test methods.
6
- # Profiling output for combinations of each test method, measurement, and
7
- # output format are written to your tmp/performance directory.
8
- #
9
- # By default, process_time is measured and both flat and graph_html output
10
- # formats are written, so you'll have two output files per test method.
11
- class PerformanceTest < ActionController::IntegrationTest
12
- include ActiveSupport::Testing::Performance
13
- include ActiveSupport::Testing::Default
14
- end
15
- end
@@ -1,36 +0,0 @@
1
- # Rack 1.0 does not allow string subclass body. This does not play well with our ActiveSupport::SafeBuffer.
2
- # The next release of Rack will be allowing string subclass body - http://github.com/rack/rack/commit/de668df02802a0335376a81ba709270e43ba9d55
3
- # TODO : Remove this monkey patch after the next release of Rack
4
-
5
- module RackLintPatch
6
- module AllowStringSubclass
7
- def self.included(base)
8
- base.send :alias_method, :each, :each_with_hack
9
- end
10
-
11
- def each_with_hack
12
- @closed = false
13
-
14
- @body.each { |part|
15
- assert("Body yielded non-string value #{part.inspect}") {
16
- part.kind_of?(String)
17
- }
18
- yield part
19
- }
20
-
21
- if @body.respond_to?(:to_path)
22
- assert("The file identified by body.to_path does not exist") {
23
- ::File.exist? @body.to_path
24
- }
25
- end
26
- end
27
- end
28
-
29
- begin
30
- app = proc {|env| [200, {"Content-Type" => "text/plain", "Content-Length" => "12"}, [Class.new(String).new("Hello World!")]] }
31
- response = Rack::MockRequest.new(Rack::Lint.new(app)).get('/')
32
- rescue Rack::Lint::LintError => e
33
- raise(e) unless e.message =~ /Body yielded non-string value/
34
- Rack::Lint.send :include, AllowStringSubclass
35
- end
36
- end
@@ -1,54 +0,0 @@
1
- require 'thread'
2
-
3
- module ActionController
4
- class Reloader
5
- @@default_lock = Mutex.new
6
- cattr_accessor :default_lock
7
-
8
- class BodyWrapper
9
- def initialize(body, lock)
10
- @body = body
11
- @lock = lock
12
- end
13
-
14
- def close
15
- @body.close if @body.respond_to?(:close)
16
- ensure
17
- Dispatcher.cleanup_application
18
- @lock.unlock
19
- end
20
-
21
- def method_missing(*args, &block)
22
- @body.send(*args, &block)
23
- end
24
-
25
- def respond_to?(symbol, include_private = false)
26
- symbol == :close || @body.respond_to?(symbol, include_private)
27
- end
28
- end
29
-
30
- def self.run(lock = @@default_lock)
31
- lock.lock
32
- begin
33
- Dispatcher.reload_application
34
- status, headers, body = yield
35
- # We do not want to call 'cleanup_application' in an ensure block
36
- # because the returned Rack response body may lazily generate its data. This
37
- # is for example the case if one calls
38
- #
39
- # render :text => lambda { ... code here which refers to application models ... }
40
- #
41
- # in an ActionController.
42
- #
43
- # Instead, we will want to cleanup the application code after the request is
44
- # completely finished. So we wrap the body in a BodyWrapper class so that
45
- # when the Rack handler calls #close during the end of the request, we get to
46
- # run our cleanup code.
47
- [status, headers, BodyWrapper.new(body, lock)]
48
- rescue Exception
49
- lock.unlock
50
- raise
51
- end
52
- end
53
- end
54
- end
@@ -1,518 +0,0 @@
1
- require 'tempfile'
2
- require 'stringio'
3
- require 'strscan'
4
-
5
- require 'active_support/memoizable'
6
- require 'action_controller/cgi_ext'
7
-
8
- module ActionController
9
- class Request < Rack::Request
10
-
11
- %w[ AUTH_TYPE GATEWAY_INTERFACE
12
- PATH_TRANSLATED REMOTE_HOST
13
- REMOTE_IDENT REMOTE_USER REMOTE_ADDR
14
- SERVER_NAME SERVER_PROTOCOL
15
-
16
- HTTP_ACCEPT HTTP_ACCEPT_CHARSET HTTP_ACCEPT_ENCODING
17
- HTTP_ACCEPT_LANGUAGE HTTP_CACHE_CONTROL HTTP_FROM
18
- HTTP_NEGOTIATE HTTP_PRAGMA HTTP_REFERER HTTP_USER_AGENT ].each do |env|
19
- define_method(env.sub(/^HTTP_/n, '').downcase) do
20
- @env[env]
21
- end
22
- end
23
-
24
- def key?(key)
25
- @env.key?(key)
26
- end
27
-
28
- HTTP_METHODS = %w(get head put post delete options)
29
- HTTP_METHOD_LOOKUP = HTTP_METHODS.inject({}) { |h, m| h[m] = h[m.upcase] = m.to_sym; h }
30
-
31
- # Returns the true HTTP request \method as a lowercase symbol, such as
32
- # <tt>:get</tt>. If the request \method is not listed in the HTTP_METHODS
33
- # constant above, an UnknownHttpMethod exception is raised.
34
- def request_method
35
- @request_method ||= HTTP_METHOD_LOOKUP[super] || raise(UnknownHttpMethod, "#{super}, accepted HTTP methods are #{HTTP_METHODS.to_sentence(:locale => :en)}")
36
- end
37
-
38
- # Returns the HTTP request \method used for action processing as a
39
- # lowercase symbol, such as <tt>:post</tt>. (Unlike #request_method, this
40
- # method returns <tt>:get</tt> for a HEAD request because the two are
41
- # functionally equivalent from the application's perspective.)
42
- def method
43
- request_method == :head ? :get : request_method
44
- end
45
-
46
- # Is this a GET (or HEAD) request? Equivalent to <tt>request.method == :get</tt>.
47
- def get?
48
- method == :get
49
- end
50
-
51
- # Is this a POST request? Equivalent to <tt>request.method == :post</tt>.
52
- def post?
53
- request_method == :post
54
- end
55
-
56
- # Is this a PUT request? Equivalent to <tt>request.method == :put</tt>.
57
- def put?
58
- request_method == :put
59
- end
60
-
61
- # Is this a DELETE request? Equivalent to <tt>request.method == :delete</tt>.
62
- def delete?
63
- request_method == :delete
64
- end
65
-
66
- # Is this a HEAD request? Since <tt>request.method</tt> sees HEAD as <tt>:get</tt>,
67
- # this \method checks the actual HTTP \method directly.
68
- def head?
69
- request_method == :head
70
- end
71
-
72
- # Provides access to the request's HTTP headers, for example:
73
- #
74
- # request.headers["Content-Type"] # => "text/plain"
75
- def headers
76
- @headers ||= ActionController::Http::Headers.new(@env)
77
- end
78
-
79
- # Returns the content length of the request as an integer.
80
- def content_length
81
- super.to_i
82
- end
83
-
84
- # The MIME type of the HTTP request, such as Mime::XML.
85
- #
86
- # For backward compatibility, the post \format is extracted from the
87
- # X-Post-Data-Format HTTP header if present.
88
- def content_type
89
- @content_type ||= begin
90
- if @env['CONTENT_TYPE'] =~ /^([^,\;]*)/
91
- Mime::Type.lookup($1.strip.downcase)
92
- else
93
- nil
94
- end
95
- end
96
- end
97
-
98
- def media_type
99
- content_type.to_s
100
- end
101
-
102
- # Returns the accepted MIME type for the request.
103
- def accepts
104
- @accepts ||= begin
105
- header = @env['HTTP_ACCEPT'].to_s.strip
106
-
107
- if header.empty?
108
- [content_type, Mime::ALL].compact
109
- else
110
- Mime::Type.parse(header)
111
- end
112
- end
113
- end
114
-
115
- def if_modified_since
116
- if since = env['HTTP_IF_MODIFIED_SINCE']
117
- Time.rfc2822(since) rescue nil
118
- end
119
- end
120
-
121
- def if_none_match
122
- env['HTTP_IF_NONE_MATCH']
123
- end
124
-
125
- def not_modified?(modified_at)
126
- if_modified_since && modified_at && if_modified_since >= modified_at
127
- end
128
-
129
- def etag_matches?(etag)
130
- if_none_match && if_none_match == etag
131
- end
132
-
133
- # Check response freshness (Last-Modified and ETag) against request
134
- # If-Modified-Since and If-None-Match conditions. If both headers are
135
- # supplied, both must match, or the request is not considered fresh.
136
- def fresh?(response)
137
- case
138
- when if_modified_since && if_none_match
139
- not_modified?(response.last_modified) && etag_matches?(response.etag)
140
- when if_modified_since
141
- not_modified?(response.last_modified)
142
- when if_none_match
143
- etag_matches?(response.etag)
144
- else
145
- false
146
- end
147
- end
148
-
149
- # Returns the Mime type for the \format used in the request.
150
- #
151
- # GET /posts/5.xml | request.format => Mime::XML
152
- # GET /posts/5.xhtml | request.format => Mime::HTML
153
- # GET /posts/5 | request.format => Mime::HTML or MIME::JS, or request.accepts.first depending on the value of <tt>ActionController::Base.use_accept_header</tt>
154
- def format
155
- @format ||=
156
- if parameters[:format]
157
- Mime::Type.lookup_by_extension(parameters[:format])
158
- elsif ActionController::Base.use_accept_header
159
- accepts.first
160
- elsif xhr?
161
- Mime::Type.lookup_by_extension("js")
162
- else
163
- Mime::Type.lookup_by_extension("html")
164
- end
165
- end
166
-
167
-
168
- # Sets the \format by string extension, which can be used to force custom formats
169
- # that are not controlled by the extension.
170
- #
171
- # class ApplicationController < ActionController::Base
172
- # before_filter :adjust_format_for_iphone
173
- #
174
- # private
175
- # def adjust_format_for_iphone
176
- # request.format = :iphone if request.env["HTTP_USER_AGENT"][/iPhone/]
177
- # end
178
- # end
179
- def format=(extension)
180
- parameters[:format] = extension.to_s
181
- @format = Mime::Type.lookup_by_extension(parameters[:format])
182
- end
183
-
184
- # Returns a symbolized version of the <tt>:format</tt> parameter of the request.
185
- # If no \format is given it returns <tt>:js</tt>for Ajax requests and <tt>:html</tt>
186
- # otherwise.
187
- def template_format
188
- parameter_format = parameters[:format]
189
-
190
- if parameter_format
191
- parameter_format
192
- elsif xhr?
193
- :js
194
- else
195
- :html
196
- end
197
- end
198
-
199
- def cache_format
200
- parameters[:format]
201
- end
202
-
203
- # Returns true if the request's "X-Requested-With" header contains
204
- # "XMLHttpRequest". (The Prototype Javascript library sends this header with
205
- # every Ajax request.)
206
- def xml_http_request?
207
- !(@env['HTTP_X_REQUESTED_WITH'] !~ /XMLHttpRequest/i)
208
- end
209
- alias xhr? :xml_http_request?
210
-
211
- # Which IP addresses are "trusted proxies" that can be stripped from
212
- # the right-hand-side of X-Forwarded-For
213
- TRUSTED_PROXIES = /^127\.0\.0\.1$|^(10|172\.(1[6-9]|2[0-9]|30|31)|192\.168)\./i
214
-
215
- # Determines originating IP address. REMOTE_ADDR is the standard
216
- # but will fail if the user is behind a proxy. HTTP_CLIENT_IP and/or
217
- # HTTP_X_FORWARDED_FOR are set by proxies so check for these if
218
- # REMOTE_ADDR is a proxy. HTTP_X_FORWARDED_FOR may be a comma-
219
- # delimited list in the case of multiple chained proxies; the last
220
- # address which is not trusted is the originating IP.
221
- def remote_ip
222
- remote_addr_list = @env['REMOTE_ADDR'] && @env['REMOTE_ADDR'].scan(/[^,\s]+/)
223
-
224
- unless remote_addr_list.blank?
225
- not_trusted_addrs = remote_addr_list.reject {|addr| addr =~ TRUSTED_PROXIES}
226
- return not_trusted_addrs.first unless not_trusted_addrs.empty?
227
- end
228
- remote_ips = @env['HTTP_X_FORWARDED_FOR'].present? && @env['HTTP_X_FORWARDED_FOR'].split(',')
229
-
230
- if @env.include? 'HTTP_CLIENT_IP'
231
- if ActionController::Base.ip_spoofing_check && remote_ips && !remote_ips.include?(@env['HTTP_CLIENT_IP'])
232
- # We don't know which came from the proxy, and which from the user
233
- raise ActionControllerError.new(<<EOM)
234
- IP spoofing attack?!
235
- HTTP_CLIENT_IP=#{@env['HTTP_CLIENT_IP'].inspect}
236
- HTTP_X_FORWARDED_FOR=#{@env['HTTP_X_FORWARDED_FOR'].inspect}
237
- EOM
238
- end
239
-
240
- return @env['HTTP_CLIENT_IP']
241
- end
242
-
243
- if remote_ips
244
- while remote_ips.size > 1 && TRUSTED_PROXIES =~ remote_ips.last.strip
245
- remote_ips.pop
246
- end
247
-
248
- return remote_ips.last.strip
249
- end
250
-
251
- @env['REMOTE_ADDR']
252
- end
253
-
254
- # Returns the lowercase name of the HTTP server software.
255
- def server_software
256
- (@env['SERVER_SOFTWARE'] && /^([a-zA-Z]+)/ =~ @env['SERVER_SOFTWARE']) ? $1.downcase : nil
257
- end
258
-
259
- # Returns the complete URL used for this request.
260
- def url
261
- protocol + host_with_port + request_uri
262
- end
263
-
264
- # Returns 'https://' if this is an SSL request and 'http://' otherwise.
265
- def protocol
266
- ssl? ? 'https://' : 'http://'
267
- end
268
-
269
- # Is this an SSL request?
270
- def ssl?
271
- @env['HTTPS'] == 'on' || @env['HTTP_X_FORWARDED_PROTO'] == 'https'
272
- end
273
-
274
- # Returns the \host for this request, such as "example.com".
275
- def raw_host_with_port
276
- if forwarded = env["HTTP_X_FORWARDED_HOST"]
277
- forwarded.split(/,\s?/).last
278
- else
279
- env['HTTP_HOST'] || "#{env['SERVER_NAME'] || env['SERVER_ADDR']}:#{env['SERVER_PORT']}"
280
- end
281
- end
282
-
283
- # Returns the host for this request, such as example.com.
284
- def host
285
- raw_host_with_port.sub(/:\d+$/, '')
286
- end
287
-
288
- # Returns a \host:\port string for this request, such as "example.com" or
289
- # "example.com:8080".
290
- def host_with_port
291
- "#{host}#{port_string}"
292
- end
293
-
294
- # Returns the port number of this request as an integer.
295
- def port
296
- if raw_host_with_port =~ /:(\d+)$/
297
- $1.to_i
298
- else
299
- standard_port
300
- end
301
- end
302
-
303
- # Returns the standard \port number for this request's protocol.
304
- def standard_port
305
- case protocol
306
- when 'https://' then 443
307
- else 80
308
- end
309
- end
310
-
311
- # Returns a \port suffix like ":8080" if the \port number of this request
312
- # is not the default HTTP \port 80 or HTTPS \port 443.
313
- def port_string
314
- port == standard_port ? '' : ":#{port}"
315
- end
316
-
317
- # Returns the \domain part of a \host, such as "rubyonrails.org" in "www.rubyonrails.org". You can specify
318
- # a different <tt>tld_length</tt>, such as 2 to catch rubyonrails.co.uk in "www.rubyonrails.co.uk".
319
- def domain(tld_length = 1)
320
- return nil unless named_host?(host)
321
-
322
- host.split('.').last(1 + tld_length).join('.')
323
- end
324
-
325
- # Returns all the \subdomains as an array, so <tt>["dev", "www"]</tt> would be
326
- # returned for "dev.www.rubyonrails.org". You can specify a different <tt>tld_length</tt>,
327
- # such as 2 to catch <tt>["www"]</tt> instead of <tt>["www", "rubyonrails"]</tt>
328
- # in "www.rubyonrails.co.uk".
329
- def subdomains(tld_length = 1)
330
- return [] unless named_host?(host)
331
- parts = host.split('.')
332
- parts[0..-(tld_length+2)]
333
- end
334
-
335
- # Returns the query string, accounting for server idiosyncrasies.
336
- def query_string
337
- @env['QUERY_STRING'].present? ? @env['QUERY_STRING'] : (@env['REQUEST_URI'].split('?', 2)[1] || '')
338
- end
339
-
340
- # Returns the request URI, accounting for server idiosyncrasies.
341
- # WEBrick includes the full URL. IIS leaves REQUEST_URI blank.
342
- def request_uri
343
- if uri = @env['REQUEST_URI']
344
- # Remove domain, which webrick puts into the request_uri.
345
- (%r{^\w+\://[^/]+(/.*|$)$} =~ uri) ? $1 : uri
346
- else
347
- # Construct IIS missing REQUEST_URI from SCRIPT_NAME and PATH_INFO.
348
- uri = @env['PATH_INFO'].to_s
349
-
350
- if script_filename = @env['SCRIPT_NAME'].to_s.match(%r{[^/]+$})
351
- uri = uri.sub(/#{script_filename}\//, '')
352
- end
353
-
354
- env_qs = @env['QUERY_STRING'].to_s
355
- uri += "?#{env_qs}" unless env_qs.empty?
356
-
357
- if uri.blank?
358
- @env.delete('REQUEST_URI')
359
- else
360
- @env['REQUEST_URI'] = uri
361
- end
362
- end
363
- end
364
-
365
- # Returns the interpreted \path to requested resource after all the installation
366
- # directory of this application was taken into account.
367
- def path
368
- path = request_uri.to_s[/\A[^\?]*/]
369
- path.sub!(/\A#{ActionController::Base.relative_url_root}/, '')
370
- path
371
- end
372
-
373
- # Read the request \body. This is useful for web services that need to
374
- # work with raw requests directly.
375
- def raw_post
376
- unless @env.include? 'RAW_POST_DATA'
377
- @env['RAW_POST_DATA'] = body.read(@env['CONTENT_LENGTH'].to_i)
378
- body.rewind if body.respond_to?(:rewind)
379
- end
380
- @env['RAW_POST_DATA']
381
- end
382
-
383
- # Returns both GET and POST \parameters in a single hash.
384
- def parameters
385
- @parameters ||= request_parameters.merge(query_parameters).update(path_parameters).with_indifferent_access
386
- end
387
- alias_method :params, :parameters
388
-
389
- def path_parameters=(parameters) #:nodoc:
390
- @env["action_controller.request.path_parameters"] = parameters
391
- @symbolized_path_parameters = @parameters = nil
392
- end
393
-
394
- # The same as <tt>path_parameters</tt> with explicitly symbolized keys.
395
- def symbolized_path_parameters
396
- @symbolized_path_parameters ||= path_parameters.symbolize_keys
397
- end
398
-
399
- # Returns a hash with the \parameters used to form the \path of the request.
400
- # Returned hash keys are strings:
401
- #
402
- # {'action' => 'my_action', 'controller' => 'my_controller'}
403
- #
404
- # See <tt>symbolized_path_parameters</tt> for symbolized keys.
405
- def path_parameters
406
- @env["action_controller.request.path_parameters"] ||= {}
407
- end
408
-
409
- # The request body is an IO input stream. If the RAW_POST_DATA environment
410
- # variable is already set, wrap it in a StringIO.
411
- def body
412
- if raw_post = @env['RAW_POST_DATA']
413
- raw_post.force_encoding(Encoding::BINARY) if raw_post.respond_to?(:force_encoding)
414
- StringIO.new(raw_post)
415
- else
416
- @env['rack.input']
417
- end
418
- end
419
-
420
- def form_data?
421
- FORM_DATA_MEDIA_TYPES.include?(content_type.to_s)
422
- end
423
-
424
- # Override Rack's GET method to support indifferent access
425
- def GET
426
- @env["action_controller.request.query_parameters"] ||= normalize_parameters(super)
427
- end
428
- alias_method :query_parameters, :GET
429
-
430
- # Override Rack's POST method to support indifferent access
431
- def POST
432
- @env["action_controller.request.request_parameters"] ||= normalize_parameters(super)
433
- end
434
- alias_method :request_parameters, :POST
435
-
436
- def body_stream #:nodoc:
437
- @env['rack.input']
438
- end
439
-
440
- def session
441
- @env['rack.session'] ||= {}
442
- end
443
-
444
- def session=(session) #:nodoc:
445
- @env['rack.session'] = session
446
- end
447
-
448
- def reset_session
449
- # session may be a hash, if so, we do not want to call destroy
450
- # fixes issue 6440
451
- session.destroy if session and session.respond_to?(:destroy)
452
- self.session = {}
453
- end
454
-
455
- def session_options
456
- @env['rack.session.options'] ||= {}
457
- end
458
-
459
- def session_options=(options)
460
- @env['rack.session.options'] = options
461
- end
462
-
463
- def server_port
464
- @env['SERVER_PORT'].to_i
465
- end
466
-
467
- private
468
- def named_host?(host)
469
- !(host.nil? || /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.match(host))
470
- end
471
-
472
- # Convert nested Hashs to HashWithIndifferentAccess and replace
473
- # file upload hashs with UploadedFile objects
474
- def normalize_parameters(value)
475
- case value
476
- when Hash
477
- if value.has_key?(:tempfile)
478
- upload = value[:tempfile]
479
- upload.extend(UploadedFile)
480
- upload.original_path = value[:filename]
481
- upload.content_type = value[:type]
482
- upload
483
- else
484
- h = {}
485
- value.each { |k, v| h[k] = normalize_parameters(v) }
486
- h.with_indifferent_access
487
- end
488
- when Array
489
- value.map { |e| normalize_parameters(e) }
490
- else
491
- value
492
- end
493
- end
494
- protected
495
-
496
- # Remove nils from the params hash
497
- def deep_munge(hash)
498
- keys = hash.keys.find_all { |k| hash[k] == [nil] }
499
- keys.each { |k| hash[k] = nil }
500
-
501
- hash.each_value do |v|
502
- case v
503
- when Array
504
- v.grep(Hash) { |x| deep_munge(x) }
505
- v.compact!
506
- when Hash
507
- deep_munge(v)
508
- end
509
- end
510
-
511
- hash
512
- end
513
-
514
- def parse_query(qs)
515
- deep_munge(super)
516
- end
517
- end
518
- end