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,10 +1,33 @@
1
1
  require 'set'
2
+ require 'active_support/core_ext/class/attribute_accessors'
2
3
 
3
4
  module Mime
4
- SET = []
5
- EXTENSION_LOOKUP = Hash.new { |h, k| h[k] = Type.new(k) unless k.blank? }
5
+ class Mimes < Array
6
+ def symbols
7
+ @symbols ||= map {|m| m.to_sym }
8
+ end
9
+
10
+ %w(<< concat shift unshift push pop []= clear compact! collect!
11
+ delete delete_at delete_if flatten! map! insert reject! reverse!
12
+ replace slice! sort! uniq!).each do |method|
13
+ module_eval <<-CODE, __FILE__, __LINE__ + 1
14
+ def #{method}(*)
15
+ @symbols = nil
16
+ super
17
+ end
18
+ CODE
19
+ end
20
+ end
21
+
22
+ SET = Mimes.new
23
+ EXTENSION_LOOKUP = {}
6
24
  LOOKUP = Hash.new { |h, k| h[k] = Type.new(k) unless k.blank? }
7
25
 
26
+ def self.[](type)
27
+ return type if type.is_a?(Type)
28
+ Type.lookup_by_extension(type.to_s)
29
+ end
30
+
8
31
  # Encapsulates the notion of a mime type. Can be used at render time, for example, with:
9
32
  #
10
33
  # class PostsController < ActionController::Base
@@ -27,7 +50,7 @@ module Mime
27
50
  # only needs to protect against these types.
28
51
  @@browser_generated_types = Set.new [:html, :url_encoded_form, :multipart_form, :text]
29
52
  cattr_reader :browser_generated_types
30
-
53
+ attr_reader :symbol
31
54
 
32
55
  @@unverifiable_types = Set.new [:text, :json, :csv, :xml, :rss, :atom, :yaml]
33
56
  def self.unverifiable_types
@@ -67,7 +90,7 @@ module Mime
67
90
  end
68
91
 
69
92
  def lookup_by_extension(extension)
70
- EXTENSION_LOOKUP[extension]
93
+ EXTENSION_LOOKUP[extension.to_s]
71
94
  end
72
95
 
73
96
  # Registers an alias that's not used on mime type lookup, but can be referenced directly. Especially useful for
@@ -81,7 +104,7 @@ module Mime
81
104
 
82
105
  SET << Mime.const_get(symbol.to_s.upcase)
83
106
 
84
- ([string] + mime_type_synonyms).each { |string| LOOKUP[string] = SET.last } unless skip_lookup
107
+ ([string] + mime_type_synonyms).each { |str| LOOKUP[str] = SET.last } unless skip_lookup
85
108
  ([symbol.to_s] + extension_synonyms).each { |ext| EXTENSION_LOOKUP[ext] = SET.last }
86
109
  end
87
110
 
@@ -187,17 +210,13 @@ module Mime
187
210
  # Returns true if Action Pack should check requests using this Mime Type for possible request forgery. See
188
211
  # ActionController::RequestForgeryProtection.
189
212
  def verify_request?
190
- browser_generated?
213
+ @@browser_generated_types.include?(to_sym)
191
214
  end
192
215
 
193
216
  def html?
194
217
  @@html_types.include?(to_sym) || @string =~ /html/
195
218
  end
196
219
 
197
- def browser_generated?
198
- @@browser_generated_types.include?(to_sym)
199
- end
200
-
201
220
  private
202
221
  def method_missing(method, *args)
203
222
  if method.to_s =~ /(\w+)\?$/
@@ -209,4 +228,4 @@ module Mime
209
228
  end
210
229
  end
211
230
 
212
- require 'action_controller/mime_types'
231
+ require 'action_dispatch/http/mime_types'
@@ -1,9 +1,8 @@
1
1
  # Build list of Mime types for HTTP responses
2
2
  # http://www.iana.org/assignments/media-types/
3
3
 
4
- Mime::Type.register "*/*", :all
5
- Mime::Type.register "text/plain", :text, [], %w(txt)
6
4
  Mime::Type.register "text/html", :html, %w( application/xhtml+xml ), %w( xhtml )
5
+ Mime::Type.register "text/plain", :text, [], %w(txt)
7
6
  Mime::Type.register "text/javascript", :js, %w( application/javascript application/x-javascript )
8
7
  Mime::Type.register "text/css", :css
9
8
  Mime::Type.register "text/calendar", :ics
@@ -18,4 +17,7 @@ Mime::Type.register "application/x-www-form-urlencoded", :url_encoded_form
18
17
 
19
18
  # http://www.ietf.org/rfc/rfc4627.txt
20
19
  # http://www.json.org/JSONRequest.html
21
- Mime::Type.register "application/json", :json, %w( text/x-json application/jsonrequest )
20
+ Mime::Type.register "application/json", :json, %w( text/x-json application/jsonrequest )
21
+
22
+ # Create Mime::ALL but do not add it to the SET.
23
+ Mime::ALL = Mime::Type.new("*/*", :all, [])
@@ -0,0 +1,49 @@
1
+ require 'active_support/core_ext/hash/keys'
2
+
3
+ module ActionDispatch
4
+ module Http
5
+ module Parameters
6
+ # Returns both GET and POST \parameters in a single hash.
7
+ def parameters
8
+ @env["action_dispatch.request.parameters"] ||= request_parameters.merge(query_parameters).update(path_parameters).with_indifferent_access
9
+ end
10
+ alias :params :parameters
11
+
12
+ def path_parameters=(parameters) #:nodoc:
13
+ @env.delete("action_dispatch.request.symbolized_path_parameters")
14
+ @env.delete("action_dispatch.request.parameters")
15
+ @env["action_dispatch.request.path_parameters"] = parameters
16
+ end
17
+
18
+ # The same as <tt>path_parameters</tt> with explicitly symbolized keys.
19
+ def symbolized_path_parameters
20
+ @env["action_dispatch.request.symbolized_path_parameters"] ||= path_parameters.symbolize_keys
21
+ end
22
+
23
+ # Returns a hash with the \parameters used to form the \path of the request.
24
+ # Returned hash keys are strings:
25
+ #
26
+ # {'action' => 'my_action', 'controller' => 'my_controller'}
27
+ #
28
+ # See <tt>symbolized_path_parameters</tt> for symbolized keys.
29
+ def path_parameters
30
+ @env["action_dispatch.request.path_parameters"] ||= {}
31
+ end
32
+
33
+ private
34
+ # Convert nested Hashs to HashWithIndifferentAccess
35
+ def normalize_parameters(value)
36
+ case value
37
+ when Hash
38
+ h = {}
39
+ value.each { |k, v| h[k] = normalize_parameters(v) }
40
+ h.with_indifferent_access
41
+ when Array
42
+ value.map { |e| normalize_parameters(e) }
43
+ else
44
+ value
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,223 @@
1
+ require 'tempfile'
2
+ require 'stringio'
3
+ require 'strscan'
4
+
5
+ require 'active_support/core_ext/hash/indifferent_access'
6
+ require 'active_support/core_ext/string/access'
7
+ require 'action_dispatch/http/headers'
8
+
9
+ module ActionDispatch
10
+ class Request < Rack::Request
11
+ include ActionDispatch::Http::Cache::Request
12
+ include ActionDispatch::Http::MimeNegotiation
13
+ include ActionDispatch::Http::Parameters
14
+ include ActionDispatch::Http::FilterParameters
15
+ include ActionDispatch::Http::Upload
16
+ include ActionDispatch::Http::URL
17
+
18
+ %w[ AUTH_TYPE GATEWAY_INTERFACE
19
+ PATH_TRANSLATED REMOTE_HOST
20
+ REMOTE_IDENT REMOTE_USER REMOTE_ADDR
21
+ SERVER_NAME SERVER_PROTOCOL
22
+
23
+ HTTP_ACCEPT HTTP_ACCEPT_CHARSET HTTP_ACCEPT_ENCODING
24
+ HTTP_ACCEPT_LANGUAGE HTTP_CACHE_CONTROL HTTP_FROM
25
+ HTTP_NEGOTIATE HTTP_PRAGMA ].each do |env|
26
+ class_eval <<-METHOD, __FILE__, __LINE__ + 1
27
+ def #{env.sub(/^HTTP_/n, '').downcase}
28
+ @env["#{env}"]
29
+ end
30
+ METHOD
31
+ end
32
+
33
+ def key?(key)
34
+ @env.key?(key)
35
+ end
36
+
37
+ HTTP_METHODS = %w(get head put post delete options)
38
+ HTTP_METHOD_LOOKUP = HTTP_METHODS.inject({}) { |h, m| h[m] = h[m.upcase] = m.to_sym; h }
39
+
40
+ # Returns the true HTTP request \method as a lowercase symbol, such as
41
+ # <tt>:get</tt>. If the request \method is not listed in the HTTP_METHODS
42
+ # constant above, an UnknownHttpMethod exception is raised.
43
+ def request_method
44
+ method = env["rack.methodoverride.original_method"] || env["REQUEST_METHOD"]
45
+ HTTP_METHOD_LOOKUP[method] || raise(ActionController::UnknownHttpMethod, "#{method}, accepted HTTP methods are #{HTTP_METHODS.to_sentence(:locale => :en)}")
46
+ end
47
+
48
+ # Returns the HTTP request \method used for action processing as a
49
+ # lowercase symbol, such as <tt>:post</tt>. (Unlike #request_method, this
50
+ # method returns <tt>:get</tt> for a HEAD request because the two are
51
+ # functionally equivalent from the application's perspective.)
52
+ def method
53
+ method = env["REQUEST_METHOD"]
54
+ HTTP_METHOD_LOOKUP[method] || raise(ActionController::UnknownHttpMethod, "#{method}, accepted HTTP methods are #{HTTP_METHODS.to_sentence(:locale => :en)}")
55
+ end
56
+
57
+ # Is this a GET (or HEAD) request? Equivalent to <tt>request.method == :get</tt>.
58
+ def get?
59
+ method == :get
60
+ end
61
+
62
+ # Is this a POST request? Equivalent to <tt>request.method == :post</tt>.
63
+ def post?
64
+ method == :post
65
+ end
66
+
67
+ # Is this a PUT request? Equivalent to <tt>request.method == :put</tt>.
68
+ def put?
69
+ method == :put
70
+ end
71
+
72
+ # Is this a DELETE request? Equivalent to <tt>request.method == :delete</tt>.
73
+ def delete?
74
+ method == :delete
75
+ end
76
+
77
+ # Is this a HEAD request? Since <tt>request.method</tt> sees HEAD as <tt>:get</tt>,
78
+ # this \method checks the actual HTTP \method directly.
79
+ def head?
80
+ request_method == :head
81
+ end
82
+
83
+ # Provides access to the request's HTTP headers, for example:
84
+ #
85
+ # request.headers["Content-Type"] # => "text/plain"
86
+ def headers
87
+ Http::Headers.new(@env)
88
+ end
89
+
90
+ def forgery_whitelisted?
91
+ method == :get || xhr? || content_type.nil? || !content_type.verify_request?
92
+ end
93
+
94
+ def media_type
95
+ content_type.to_s
96
+ end
97
+
98
+ # Returns the content length of the request as an integer.
99
+ def content_length
100
+ super.to_i
101
+ end
102
+
103
+ # Returns true if the request's "X-Requested-With" header contains
104
+ # "XMLHttpRequest". (The Prototype Javascript library sends this header with
105
+ # every Ajax request.)
106
+ def xml_http_request?
107
+ !(@env['HTTP_X_REQUESTED_WITH'] !~ /XMLHttpRequest/i)
108
+ end
109
+ alias :xhr? :xml_http_request?
110
+
111
+ # Which IP addresses are "trusted proxies" that can be stripped from
112
+ # the right-hand-side of X-Forwarded-For
113
+ TRUSTED_PROXIES = /^127\.0\.0\.1$|^(10|172\.(1[6-9]|2[0-9]|30|31)|192\.168)\./i
114
+
115
+ # Determines originating IP address. REMOTE_ADDR is the standard
116
+ # but will fail if the user is behind a proxy. HTTP_CLIENT_IP and/or
117
+ # HTTP_X_FORWARDED_FOR are set by proxies so check for these if
118
+ # REMOTE_ADDR is a proxy. HTTP_X_FORWARDED_FOR may be a comma-
119
+ # delimited list in the case of multiple chained proxies; the last
120
+ # address which is not trusted is the originating IP.
121
+ def remote_ip
122
+ remote_addr_list = @env['REMOTE_ADDR'] && @env['REMOTE_ADDR'].scan(/[^,\s]+/)
123
+
124
+ unless remote_addr_list.blank?
125
+ not_trusted_addrs = remote_addr_list.reject {|addr| addr =~ TRUSTED_PROXIES || addr =~ ActionController::Base.trusted_proxies}
126
+ return not_trusted_addrs.first unless not_trusted_addrs.empty?
127
+ end
128
+ remote_ips = @env['HTTP_X_FORWARDED_FOR'] && @env['HTTP_X_FORWARDED_FOR'].split(',')
129
+
130
+ if @env.include? 'HTTP_CLIENT_IP'
131
+ if ActionController::Base.ip_spoofing_check && remote_ips && !remote_ips.include?(@env['HTTP_CLIENT_IP'])
132
+ # We don't know which came from the proxy, and which from the user
133
+ raise ActionController::ActionControllerError.new <<EOM
134
+ IP spoofing attack?!
135
+ HTTP_CLIENT_IP=#{@env['HTTP_CLIENT_IP'].inspect}
136
+ HTTP_X_FORWARDED_FOR=#{@env['HTTP_X_FORWARDED_FOR'].inspect}
137
+ EOM
138
+ end
139
+
140
+ return @env['HTTP_CLIENT_IP']
141
+ end
142
+
143
+ if remote_ips
144
+ while remote_ips.size > 1 && (TRUSTED_PROXIES =~ remote_ips.last.strip || ActionController::Base.trusted_proxies =~ remote_ips.last.strip)
145
+ remote_ips.pop
146
+ end
147
+
148
+ return remote_ips.last.strip
149
+ end
150
+
151
+ @env['REMOTE_ADDR']
152
+ end
153
+
154
+ # Returns the lowercase name of the HTTP server software.
155
+ def server_software
156
+ (@env['SERVER_SOFTWARE'] && /^([a-zA-Z]+)/ =~ @env['SERVER_SOFTWARE']) ? $1.downcase : nil
157
+ end
158
+
159
+ # Read the request \body. This is useful for web services that need to
160
+ # work with raw requests directly.
161
+ def raw_post
162
+ unless @env.include? 'RAW_POST_DATA'
163
+ @env['RAW_POST_DATA'] = body.read(@env['CONTENT_LENGTH'].to_i)
164
+ body.rewind if body.respond_to?(:rewind)
165
+ end
166
+ @env['RAW_POST_DATA']
167
+ end
168
+
169
+ # The request body is an IO input stream. If the RAW_POST_DATA environment
170
+ # variable is already set, wrap it in a StringIO.
171
+ def body
172
+ if raw_post = @env['RAW_POST_DATA']
173
+ raw_post.force_encoding(Encoding::BINARY) if raw_post.respond_to?(:force_encoding)
174
+ StringIO.new(raw_post)
175
+ else
176
+ @env['rack.input']
177
+ end
178
+ end
179
+
180
+ def form_data?
181
+ FORM_DATA_MEDIA_TYPES.include?(content_type.to_s)
182
+ end
183
+
184
+ def body_stream #:nodoc:
185
+ @env['rack.input']
186
+ end
187
+
188
+ def reset_session
189
+ self.session_options.delete(:id)
190
+ self.session = {}
191
+ end
192
+
193
+ def session=(session) #:nodoc:
194
+ @env['rack.session'] = session
195
+ end
196
+
197
+ def session_options=(options)
198
+ @env['rack.session.options'] = options
199
+ end
200
+
201
+ # Override Rack's GET method to support indifferent access
202
+ def GET
203
+ @env["action_dispatch.request.query_parameters"] ||= normalize_parameters(super)
204
+ end
205
+ alias :query_parameters :GET
206
+
207
+ # Override Rack's POST method to support indifferent access
208
+ def POST
209
+ @env["action_dispatch.request.request_parameters"] ||= normalize_parameters(super)
210
+ end
211
+ alias :request_parameters :POST
212
+
213
+
214
+ # Returns the authorization header regardless of whether it was specified directly or through one of the
215
+ # proxy alternatives.
216
+ def authorization
217
+ @env['HTTP_AUTHORIZATION'] ||
218
+ @env['X-HTTP_AUTHORIZATION'] ||
219
+ @env['X_HTTP_AUTHORIZATION'] ||
220
+ @env['REDIRECT_X_HTTP_AUTHORIZATION']
221
+ end
222
+ end
223
+ end
@@ -0,0 +1,209 @@
1
+ require 'digest/md5'
2
+ require 'active_support/core_ext/module/delegation'
3
+
4
+ module ActionDispatch # :nodoc:
5
+ # Represents an HTTP response generated by a controller action. One can use
6
+ # an ActionDispatch::Response object to retrieve the current state
7
+ # of the response, or customize the response. An Response object can
8
+ # either represent a "real" HTTP response (i.e. one that is meant to be sent
9
+ # back to the web browser) or a test response (i.e. one that is generated
10
+ # from integration tests). See CgiResponse and TestResponse, respectively.
11
+ #
12
+ # Response is mostly a Ruby on Rails framework implement detail, and
13
+ # should never be used directly in controllers. Controllers should use the
14
+ # methods defined in ActionController::Base instead. For example, if you want
15
+ # to set the HTTP response's content MIME type, then use
16
+ # ActionControllerBase#headers instead of Response#headers.
17
+ #
18
+ # Nevertheless, integration tests may want to inspect controller responses in
19
+ # more detail, and that's when Response can be useful for application
20
+ # developers. Integration test methods such as
21
+ # ActionDispatch::Integration::Session#get and
22
+ # ActionDispatch::Integration::Session#post return objects of type
23
+ # TestResponse (which are of course also of type Response).
24
+ #
25
+ # For example, the following demo integration "test" prints the body of the
26
+ # controller response to the console:
27
+ #
28
+ # class DemoControllerTest < ActionDispatch::IntegrationTest
29
+ # def test_print_root_path_to_console
30
+ # get('/')
31
+ # puts @response.body
32
+ # end
33
+ # end
34
+ class Response < Rack::Response
35
+ include ActionDispatch::Http::Cache::Response
36
+
37
+ attr_accessor :request, :blank
38
+
39
+ attr_writer :header, :sending_file
40
+ alias_method :headers=, :header=
41
+
42
+ def initialize
43
+ @status = 200
44
+ @header = {}
45
+ @cache_control = {}
46
+
47
+ @writer = lambda { |x| @body << x }
48
+ @block = nil
49
+ @length = 0
50
+
51
+ @body, @cookie = [], []
52
+ @sending_file = false
53
+
54
+ @blank = false
55
+ @etag = nil
56
+
57
+ yield self if block_given?
58
+ end
59
+
60
+ def status=(status)
61
+ @status = Rack::Utils.status_code(status)
62
+ end
63
+
64
+ # The response code of the request
65
+ def response_code
66
+ @status
67
+ end
68
+
69
+ # Returns a String to ensure compatibility with Net::HTTPResponse
70
+ def code
71
+ @status.to_s
72
+ end
73
+
74
+ def message
75
+ Rack::Utils::HTTP_STATUS_CODES[@status]
76
+ end
77
+ alias_method :status_message, :message
78
+
79
+ def body
80
+ str = ''
81
+ each { |part| str << part.to_s }
82
+ str
83
+ end
84
+
85
+ EMPTY = " "
86
+
87
+ def body=(body)
88
+ @blank = true if body == EMPTY
89
+ @body = body.respond_to?(:to_str) ? [body] : body
90
+ end
91
+
92
+ def body_parts
93
+ @body
94
+ end
95
+
96
+ def location
97
+ headers['Location']
98
+ end
99
+ alias_method :redirect_url, :location
100
+
101
+ def location=(url)
102
+ headers['Location'] = url
103
+ end
104
+
105
+ # Sets the HTTP response's content MIME type. For example, in the controller
106
+ # you could write this:
107
+ #
108
+ # response.content_type = "text/plain"
109
+ #
110
+ # If a character set has been defined for this response (see charset=) then
111
+ # the character set information will also be included in the content type
112
+ # information.
113
+ attr_accessor :charset, :content_type
114
+
115
+ CONTENT_TYPE = "Content-Type"
116
+
117
+ cattr_accessor(:default_charset) { "utf-8" }
118
+
119
+ def to_a
120
+ assign_default_content_type_and_charset!
121
+ handle_conditional_get!
122
+ self["Set-Cookie"] = @cookie.join("\n") unless @cookie.blank?
123
+ self["ETag"] = @etag if @etag
124
+ super
125
+ end
126
+
127
+ alias prepare! to_a
128
+
129
+ def each(&callback)
130
+ if @body.respond_to?(:call)
131
+ @writer = lambda { |x| callback.call(x) }
132
+ @body.call(self, self)
133
+ else
134
+ @body.each { |part| callback.call(part.to_s) }
135
+ end
136
+
137
+ @writer = callback
138
+ @block.call(self) if @block
139
+ end
140
+
141
+ def write(str)
142
+ str = str.to_s
143
+ @writer.call str
144
+ str
145
+ end
146
+
147
+ # Returns the response cookies, converted to a Hash of (name => value) pairs
148
+ #
149
+ # assert_equal 'AuthorOfNewPage', r.cookies['author']
150
+ def cookies
151
+ cookies = {}
152
+ if header = @cookie
153
+ header = header.split("\n") if header.respond_to?(:to_str)
154
+ header.each do |cookie|
155
+ if pair = cookie.split(';').first
156
+ key, value = pair.split("=").map { |v| Rack::Utils.unescape(v) }
157
+ cookies[key] = value
158
+ end
159
+ end
160
+ end
161
+ cookies
162
+ end
163
+
164
+ def set_cookie(key, value)
165
+ case value
166
+ when Hash
167
+ domain = "; domain=" + value[:domain] if value[:domain]
168
+ path = "; path=" + value[:path] if value[:path]
169
+ # According to RFC 2109, we need dashes here.
170
+ # N.B.: cgi.rb uses spaces...
171
+ expires = "; expires=" + value[:expires].clone.gmtime.
172
+ strftime("%a, %d-%b-%Y %H:%M:%S GMT") if value[:expires]
173
+ secure = "; secure" if value[:secure]
174
+ httponly = "; HttpOnly" if value[:httponly]
175
+ value = value[:value]
176
+ end
177
+ value = [value] unless Array === value
178
+ cookie = Rack::Utils.escape(key) + "=" +
179
+ value.map { |v| Rack::Utils.escape v }.join("&") +
180
+ "#{domain}#{path}#{expires}#{secure}#{httponly}"
181
+
182
+ @cookie << cookie
183
+ end
184
+
185
+ def delete_cookie(key, value={})
186
+ @cookie.reject! { |cookie|
187
+ cookie =~ /\A#{Rack::Utils.escape(key)}=/
188
+ }
189
+
190
+ set_cookie(key,
191
+ {:value => '', :path => nil, :domain => nil,
192
+ :expires => Time.at(0) }.merge(value))
193
+ end
194
+
195
+ private
196
+ def assign_default_content_type_and_charset!
197
+ return if headers[CONTENT_TYPE].present?
198
+
199
+ @content_type ||= Mime::HTML
200
+ @charset ||= self.class.default_charset
201
+
202
+ type = @content_type.to_s.dup
203
+ type << "; charset=#{@charset}" unless @sending_file
204
+
205
+ headers[CONTENT_TYPE] = type
206
+ end
207
+
208
+ end
209
+ end