eactionpack 2.1.2

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 (338) hide show
  1. data/CHANGELOG +7 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +469 -0
  4. data/RUNNING_UNIT_TESTS +24 -0
  5. data/Rakefile +146 -0
  6. data/install.rb +30 -0
  7. data/lib/action_controller.rb +79 -0
  8. data/lib/action_controller/assertions.rb +69 -0
  9. data/lib/action_controller/assertions/dom_assertions.rb +39 -0
  10. data/lib/action_controller/assertions/model_assertions.rb +20 -0
  11. data/lib/action_controller/assertions/response_assertions.rb +172 -0
  12. data/lib/action_controller/assertions/routing_assertions.rb +146 -0
  13. data/lib/action_controller/assertions/selector_assertions.rb +491 -0
  14. data/lib/action_controller/assertions/tag_assertions.rb +130 -0
  15. data/lib/action_controller/base.rb +1288 -0
  16. data/lib/action_controller/benchmarking.rb +94 -0
  17. data/lib/action_controller/caching.rb +72 -0
  18. data/lib/action_controller/caching/actions.rb +144 -0
  19. data/lib/action_controller/caching/fragments.rb +138 -0
  20. data/lib/action_controller/caching/pages.rb +154 -0
  21. data/lib/action_controller/caching/sql_cache.rb +18 -0
  22. data/lib/action_controller/caching/sweeping.rb +97 -0
  23. data/lib/action_controller/cgi_ext.rb +16 -0
  24. data/lib/action_controller/cgi_ext/cookie.rb +110 -0
  25. data/lib/action_controller/cgi_ext/query_extension.rb +22 -0
  26. data/lib/action_controller/cgi_ext/session.rb +73 -0
  27. data/lib/action_controller/cgi_ext/stdinput.rb +24 -0
  28. data/lib/action_controller/cgi_process.rb +223 -0
  29. data/lib/action_controller/components.rb +166 -0
  30. data/lib/action_controller/cookies.rb +96 -0
  31. data/lib/action_controller/dispatcher.rb +162 -0
  32. data/lib/action_controller/filters.rb +642 -0
  33. data/lib/action_controller/flash.rb +172 -0
  34. data/lib/action_controller/headers.rb +31 -0
  35. data/lib/action_controller/helpers.rb +221 -0
  36. data/lib/action_controller/http_authentication.rb +124 -0
  37. data/lib/action_controller/integration.rb +634 -0
  38. data/lib/action_controller/layout.rb +309 -0
  39. data/lib/action_controller/mime_responds.rb +173 -0
  40. data/lib/action_controller/mime_type.rb +186 -0
  41. data/lib/action_controller/mime_types.rb +20 -0
  42. data/lib/action_controller/polymorphic_routes.rb +191 -0
  43. data/lib/action_controller/record_identifier.rb +102 -0
  44. data/lib/action_controller/request.rb +764 -0
  45. data/lib/action_controller/request_forgery_protection.rb +140 -0
  46. data/lib/action_controller/request_profiler.rb +169 -0
  47. data/lib/action_controller/rescue.rb +258 -0
  48. data/lib/action_controller/resources.rb +572 -0
  49. data/lib/action_controller/response.rb +76 -0
  50. data/lib/action_controller/routing.rb +387 -0
  51. data/lib/action_controller/routing/builder.rb +203 -0
  52. data/lib/action_controller/routing/optimisations.rb +120 -0
  53. data/lib/action_controller/routing/recognition_optimisation.rb +162 -0
  54. data/lib/action_controller/routing/route.rb +240 -0
  55. data/lib/action_controller/routing/route_set.rb +436 -0
  56. data/lib/action_controller/routing/routing_ext.rb +46 -0
  57. data/lib/action_controller/routing/segments.rb +283 -0
  58. data/lib/action_controller/session/active_record_store.rb +340 -0
  59. data/lib/action_controller/session/cookie_store.rb +166 -0
  60. data/lib/action_controller/session/drb_server.rb +32 -0
  61. data/lib/action_controller/session/drb_store.rb +35 -0
  62. data/lib/action_controller/session/mem_cache_store.rb +98 -0
  63. data/lib/action_controller/session_management.rb +158 -0
  64. data/lib/action_controller/status_codes.rb +88 -0
  65. data/lib/action_controller/streaming.rb +155 -0
  66. data/lib/action_controller/templates/rescues/_request_and_response.erb +24 -0
  67. data/lib/action_controller/templates/rescues/_trace.erb +26 -0
  68. data/lib/action_controller/templates/rescues/diagnostics.erb +11 -0
  69. data/lib/action_controller/templates/rescues/layout.erb +29 -0
  70. data/lib/action_controller/templates/rescues/missing_template.erb +2 -0
  71. data/lib/action_controller/templates/rescues/routing_error.erb +10 -0
  72. data/lib/action_controller/templates/rescues/template_error.erb +21 -0
  73. data/lib/action_controller/templates/rescues/unknown_action.erb +2 -0
  74. data/lib/action_controller/test_case.rb +83 -0
  75. data/lib/action_controller/test_process.rb +526 -0
  76. data/lib/action_controller/url_rewriter.rb +142 -0
  77. data/lib/action_controller/vendor/html-scanner/html/document.rb +68 -0
  78. data/lib/action_controller/vendor/html-scanner/html/node.rb +537 -0
  79. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +173 -0
  80. data/lib/action_controller/vendor/html-scanner/html/selector.rb +828 -0
  81. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +105 -0
  82. data/lib/action_controller/vendor/html-scanner/html/version.rb +11 -0
  83. data/lib/action_controller/verification.rb +130 -0
  84. data/lib/action_pack.rb +24 -0
  85. data/lib/action_pack/version.rb +9 -0
  86. data/lib/action_view.rb +44 -0
  87. data/lib/action_view/base.rb +335 -0
  88. data/lib/action_view/helpers/active_record_helper.rb +276 -0
  89. data/lib/action_view/helpers/asset_tag_helper.rb +599 -0
  90. data/lib/action_view/helpers/atom_feed_helper.rb +143 -0
  91. data/lib/action_view/helpers/benchmark_helper.rb +33 -0
  92. data/lib/action_view/helpers/cache_helper.rb +40 -0
  93. data/lib/action_view/helpers/capture_helper.rb +161 -0
  94. data/lib/action_view/helpers/date_helper.rb +711 -0
  95. data/lib/action_view/helpers/debug_helper.rb +31 -0
  96. data/lib/action_view/helpers/form_helper.rb +767 -0
  97. data/lib/action_view/helpers/form_options_helper.rb +458 -0
  98. data/lib/action_view/helpers/form_tag_helper.rb +458 -0
  99. data/lib/action_view/helpers/javascript_helper.rb +148 -0
  100. data/lib/action_view/helpers/number_helper.rb +186 -0
  101. data/lib/action_view/helpers/record_identification_helper.rb +20 -0
  102. data/lib/action_view/helpers/record_tag_helper.rb +59 -0
  103. data/lib/action_view/helpers/sanitize_helper.rb +229 -0
  104. data/lib/action_view/helpers/tag_helper.rb +134 -0
  105. data/lib/action_view/helpers/text_helper.rb +507 -0
  106. data/lib/action_view/helpers/url_helper.rb +573 -0
  107. data/lib/action_view/inline_template.rb +20 -0
  108. data/lib/action_view/partial_template.rb +70 -0
  109. data/lib/action_view/partials.rb +158 -0
  110. data/lib/action_view/template.rb +125 -0
  111. data/lib/action_view/template_error.rb +110 -0
  112. data/lib/action_view/template_finder.rb +176 -0
  113. data/lib/action_view/template_handler.rb +34 -0
  114. data/lib/action_view/template_handlers/builder.rb +27 -0
  115. data/lib/action_view/template_handlers/compilable.rb +128 -0
  116. data/lib/action_view/template_handlers/erb.rb +56 -0
  117. data/lib/action_view/test_case.rb +58 -0
  118. data/lib/actionpack.rb +1 -0
  119. data/test/abstract_unit.rb +36 -0
  120. data/test/active_record_unit.rb +105 -0
  121. data/test/activerecord/active_record_store_test.rb +141 -0
  122. data/test/activerecord/render_partial_with_record_identification_test.rb +191 -0
  123. data/test/adv_attr_test.rb +20 -0
  124. data/test/controller/action_pack_assertions_test.rb +543 -0
  125. data/test/controller/addresses_render_test.rb +43 -0
  126. data/test/controller/assert_select_test.rb +331 -0
  127. data/test/controller/base_test.rb +219 -0
  128. data/test/controller/benchmark_test.rb +32 -0
  129. data/test/controller/caching_test.rb +581 -0
  130. data/test/controller/capture_test.rb +89 -0
  131. data/test/controller/cgi_test.rb +116 -0
  132. data/test/controller/components_test.rb +140 -0
  133. data/test/controller/content_type_test.rb +139 -0
  134. data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  135. data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  136. data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  137. data/test/controller/cookie_test.rb +146 -0
  138. data/test/controller/custom_handler_test.rb +45 -0
  139. data/test/controller/deprecation/deprecated_base_methods_test.rb +37 -0
  140. data/test/controller/dispatcher_test.rb +105 -0
  141. data/test/controller/fake_controllers.rb +33 -0
  142. data/test/controller/fake_models.rb +11 -0
  143. data/test/controller/filter_params_test.rb +49 -0
  144. data/test/controller/filters_test.rb +881 -0
  145. data/test/controller/flash_test.rb +146 -0
  146. data/test/controller/header_test.rb +14 -0
  147. data/test/controller/helper_test.rb +210 -0
  148. data/test/controller/html-scanner/cdata_node_test.rb +15 -0
  149. data/test/controller/html-scanner/document_test.rb +148 -0
  150. data/test/controller/html-scanner/node_test.rb +89 -0
  151. data/test/controller/html-scanner/sanitizer_test.rb +269 -0
  152. data/test/controller/html-scanner/tag_node_test.rb +238 -0
  153. data/test/controller/html-scanner/text_node_test.rb +50 -0
  154. data/test/controller/html-scanner/tokenizer_test.rb +131 -0
  155. data/test/controller/http_authentication_test.rb +54 -0
  156. data/test/controller/integration_test.rb +252 -0
  157. data/test/controller/integration_upload_test.rb +43 -0
  158. data/test/controller/layout_test.rb +255 -0
  159. data/test/controller/mime_responds_test.rb +514 -0
  160. data/test/controller/mime_type_test.rb +84 -0
  161. data/test/controller/new_render_test.rb +843 -0
  162. data/test/controller/polymorphic_routes_test.rb +174 -0
  163. data/test/controller/record_identifier_test.rb +139 -0
  164. data/test/controller/redirect_test.rb +289 -0
  165. data/test/controller/render_test.rb +484 -0
  166. data/test/controller/request_forgery_protection_test.rb +305 -0
  167. data/test/controller/request_test.rb +928 -0
  168. data/test/controller/rescue_test.rb +517 -0
  169. data/test/controller/resources_test.rb +873 -0
  170. data/test/controller/routing_test.rb +2464 -0
  171. data/test/controller/selector_test.rb +628 -0
  172. data/test/controller/send_file_test.rb +138 -0
  173. data/test/controller/session/cookie_store_test.rb +258 -0
  174. data/test/controller/session/mem_cache_store_test.rb +181 -0
  175. data/test/controller/session_fixation_test.rb +89 -0
  176. data/test/controller/session_management_test.rb +178 -0
  177. data/test/controller/test_test.rb +695 -0
  178. data/test/controller/url_rewriter_test.rb +310 -0
  179. data/test/controller/verification_test.rb +270 -0
  180. data/test/controller/view_paths_test.rb +140 -0
  181. data/test/controller/webservice_test.rb +229 -0
  182. data/test/fixtures/addresses/list.erb +1 -0
  183. data/test/fixtures/bad_customers/_bad_customer.html.erb +1 -0
  184. data/test/fixtures/companies.yml +24 -0
  185. data/test/fixtures/company.rb +10 -0
  186. data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +1 -0
  187. data/test/fixtures/content_type/render_default_for_js.js.erb +1 -0
  188. data/test/fixtures/content_type/render_default_for_rhtml.rhtml +1 -0
  189. data/test/fixtures/content_type/render_default_for_rxml.rxml +1 -0
  190. data/test/fixtures/customers/_customer.html.erb +1 -0
  191. data/test/fixtures/db_definitions/sqlite.sql +49 -0
  192. data/test/fixtures/developer.rb +9 -0
  193. data/test/fixtures/developers.yml +21 -0
  194. data/test/fixtures/developers_projects.yml +13 -0
  195. data/test/fixtures/fun/games/hello_world.erb +1 -0
  196. data/test/fixtures/functional_caching/_partial.erb +3 -0
  197. data/test/fixtures/functional_caching/fragment_cached.html.erb +2 -0
  198. data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +1 -0
  199. data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +1 -0
  200. data/test/fixtures/good_customers/_good_customer.html.erb +1 -0
  201. data/test/fixtures/helpers/abc_helper.rb +5 -0
  202. data/test/fixtures/helpers/fun/games_helper.rb +3 -0
  203. data/test/fixtures/helpers/fun/pdf_helper.rb +3 -0
  204. data/test/fixtures/layout_tests/alt/hello.rhtml +1 -0
  205. data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +1 -0
  206. data/test/fixtures/layout_tests/layouts/item.rhtml +1 -0
  207. data/test/fixtures/layout_tests/layouts/layout_test.rhtml +1 -0
  208. data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +1 -0
  209. data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +1 -0
  210. data/test/fixtures/layout_tests/views/hello.rhtml +1 -0
  211. data/test/fixtures/layouts/block_with_layout.erb +3 -0
  212. data/test/fixtures/layouts/builder.builder +3 -0
  213. data/test/fixtures/layouts/partial_with_layout.erb +3 -0
  214. data/test/fixtures/layouts/standard.erb +1 -0
  215. data/test/fixtures/layouts/talk_from_action.erb +2 -0
  216. data/test/fixtures/layouts/yield.erb +2 -0
  217. data/test/fixtures/mascot.rb +3 -0
  218. data/test/fixtures/mascots.yml +4 -0
  219. data/test/fixtures/mascots/_mascot.html.erb +1 -0
  220. data/test/fixtures/multipart/binary_file +0 -0
  221. data/test/fixtures/multipart/boundary_problem_file +10 -0
  222. data/test/fixtures/multipart/bracketed_param +5 -0
  223. data/test/fixtures/multipart/large_text_file +10 -0
  224. data/test/fixtures/multipart/mixed_files +0 -0
  225. data/test/fixtures/multipart/mona_lisa.jpg +0 -0
  226. data/test/fixtures/multipart/single_parameter +5 -0
  227. data/test/fixtures/multipart/text_file +10 -0
  228. data/test/fixtures/override/test/hello_world.erb +1 -0
  229. data/test/fixtures/override2/layouts/test/sub.erb +1 -0
  230. data/test/fixtures/post_test/layouts/post.html.erb +1 -0
  231. data/test/fixtures/post_test/layouts/super_post.iphone.erb +1 -0
  232. data/test/fixtures/post_test/post/index.html.erb +1 -0
  233. data/test/fixtures/post_test/post/index.iphone.erb +1 -0
  234. data/test/fixtures/post_test/super_post/index.html.erb +1 -0
  235. data/test/fixtures/post_test/super_post/index.iphone.erb +1 -0
  236. data/test/fixtures/project.rb +3 -0
  237. data/test/fixtures/projects.yml +7 -0
  238. data/test/fixtures/public/404.html +1 -0
  239. data/test/fixtures/public/500.html +1 -0
  240. data/test/fixtures/public/images/rails.png +0 -0
  241. data/test/fixtures/public/javascripts/application.js +1 -0
  242. data/test/fixtures/public/javascripts/bank.js +1 -0
  243. data/test/fixtures/public/javascripts/robber.js +1 -0
  244. data/test/fixtures/public/javascripts/version.1.0.js +1 -0
  245. data/test/fixtures/public/stylesheets/bank.css +1 -0
  246. data/test/fixtures/public/stylesheets/robber.css +1 -0
  247. data/test/fixtures/public/stylesheets/version.1.0.css +1 -0
  248. data/test/fixtures/replies.yml +15 -0
  249. data/test/fixtures/reply.rb +7 -0
  250. data/test/fixtures/respond_to/all_types_with_layout.html.erb +1 -0
  251. data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +1 -0
  252. data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +1 -0
  253. data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +1 -0
  254. data/test/fixtures/respond_to/layouts/missing.html.erb +1 -0
  255. data/test/fixtures/respond_to/layouts/standard.html.erb +1 -0
  256. data/test/fixtures/respond_to/layouts/standard.iphone.erb +1 -0
  257. data/test/fixtures/respond_to/using_defaults.html.erb +1 -0
  258. data/test/fixtures/respond_to/using_defaults.js.rjs +1 -0
  259. data/test/fixtures/respond_to/using_defaults.xml.builder +1 -0
  260. data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +1 -0
  261. data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +1 -0
  262. data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +1 -0
  263. data/test/fixtures/scope/test/modgreet.erb +1 -0
  264. data/test/fixtures/shared.html.erb +1 -0
  265. data/test/fixtures/symlink_parent/symlinked_layout.erb +5 -0
  266. data/test/fixtures/test/_customer.erb +1 -0
  267. data/test/fixtures/test/_customer_counter.erb +1 -0
  268. data/test/fixtures/test/_customer_greeting.erb +1 -0
  269. data/test/fixtures/test/_form.erb +1 -0
  270. data/test/fixtures/test/_hash_greeting.erb +1 -0
  271. data/test/fixtures/test/_hash_object.erb +2 -0
  272. data/test/fixtures/test/_hello.builder +1 -0
  273. data/test/fixtures/test/_labelling_form.erb +1 -0
  274. data/test/fixtures/test/_layout_for_partial.html.erb +3 -0
  275. data/test/fixtures/test/_partial.erb +1 -0
  276. data/test/fixtures/test/_partial.html.erb +1 -0
  277. data/test/fixtures/test/_partial.js.erb +1 -0
  278. data/test/fixtures/test/_partial_for_use_in_layout.html.erb +1 -0
  279. data/test/fixtures/test/_partial_only.erb +1 -0
  280. data/test/fixtures/test/_person.erb +2 -0
  281. data/test/fixtures/test/_raise.html.erb +1 -0
  282. data/test/fixtures/test/action_talk_to_layout.erb +2 -0
  283. data/test/fixtures/test/block_content_for.erb +2 -0
  284. data/test/fixtures/test/calling_partial_with_layout.html.erb +1 -0
  285. data/test/fixtures/test/capturing.erb +4 -0
  286. data/test/fixtures/test/content_for.erb +2 -0
  287. data/test/fixtures/test/content_for_concatenated.erb +3 -0
  288. data/test/fixtures/test/content_for_with_parameter.erb +2 -0
  289. data/test/fixtures/test/delete_with_js.rjs +2 -0
  290. data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +1 -0
  291. data/test/fixtures/test/enum_rjs_test.rjs +6 -0
  292. data/test/fixtures/test/erb_content_for.erb +2 -0
  293. data/test/fixtures/test/formatted_html_erb.html.erb +1 -0
  294. data/test/fixtures/test/formatted_xml_erb.builder +1 -0
  295. data/test/fixtures/test/formatted_xml_erb.html.erb +1 -0
  296. data/test/fixtures/test/formatted_xml_erb.xml.erb +1 -0
  297. data/test/fixtures/test/greeting.erb +1 -0
  298. data/test/fixtures/test/greeting.js.rjs +1 -0
  299. data/test/fixtures/test/hello.builder +4 -0
  300. data/test/fixtures/test/hello_world.erb +1 -0
  301. data/test/fixtures/test/hello_world_container.builder +3 -0
  302. data/test/fixtures/test/hello_world_from_rxml.builder +4 -0
  303. data/test/fixtures/test/hello_world_with_layout_false.erb +1 -0
  304. data/test/fixtures/test/hello_xml_world.builder +11 -0
  305. data/test/fixtures/test/list.erb +1 -0
  306. data/test/fixtures/test/non_erb_block_content_for.builder +4 -0
  307. data/test/fixtures/test/potential_conflicts.erb +4 -0
  308. data/test/fixtures/test/render_file_from_template.html.erb +1 -0
  309. data/test/fixtures/test/render_file_with_ivar.erb +1 -0
  310. data/test/fixtures/test/render_file_with_locals.erb +1 -0
  311. data/test/fixtures/test/render_to_string_test.erb +1 -0
  312. data/test/fixtures/test/update_element_with_capture.erb +9 -0
  313. data/test/fixtures/test/using_layout_around_block.html.erb +1 -0
  314. data/test/fixtures/topic.rb +3 -0
  315. data/test/fixtures/topics.yml +22 -0
  316. data/test/fixtures/topics/_topic.html.erb +1 -0
  317. data/test/template/active_record_helper_test.rb +268 -0
  318. data/test/template/asset_tag_helper_test.rb +514 -0
  319. data/test/template/atom_feed_helper_test.rb +179 -0
  320. data/test/template/benchmark_helper_test.rb +60 -0
  321. data/test/template/date_helper_test.rb +1791 -0
  322. data/test/template/deprecated_erb_variable_test.rb +9 -0
  323. data/test/template/erb_util_test.rb +24 -0
  324. data/test/template/form_helper_test.rb +885 -0
  325. data/test/template/form_options_helper_test.rb +1333 -0
  326. data/test/template/form_tag_helper_test.rb +272 -0
  327. data/test/template/javascript_helper_test.rb +73 -0
  328. data/test/template/number_helper_test.rb +97 -0
  329. data/test/template/record_tag_helper_test.rb +54 -0
  330. data/test/template/sanitize_helper_test.rb +48 -0
  331. data/test/template/tag_helper_test.rb +77 -0
  332. data/test/template/template_finder_test.rb +73 -0
  333. data/test/template/template_object_test.rb +95 -0
  334. data/test/template/test_test.rb +56 -0
  335. data/test/template/text_helper_test.rb +367 -0
  336. data/test/template/url_helper_test.rb +544 -0
  337. data/test/testing_sandbox.rb +15 -0
  338. metadata +469 -0
@@ -0,0 +1,88 @@
1
+ module ActionController
2
+ module StatusCodes #:nodoc:
3
+ # Defines the standard HTTP status codes, by integer, with their
4
+ # corresponding default message texts.
5
+ # Source: http://www.iana.org/assignments/http-status-codes
6
+ STATUS_CODES = {
7
+ 100 => "Continue",
8
+ 101 => "Switching Protocols",
9
+ 102 => "Processing",
10
+
11
+ 200 => "OK",
12
+ 201 => "Created",
13
+ 202 => "Accepted",
14
+ 203 => "Non-Authoritative Information",
15
+ 204 => "No Content",
16
+ 205 => "Reset Content",
17
+ 206 => "Partial Content",
18
+ 207 => "Multi-Status",
19
+ 226 => "IM Used",
20
+
21
+ 300 => "Multiple Choices",
22
+ 301 => "Moved Permanently",
23
+ 302 => "Found",
24
+ 303 => "See Other",
25
+ 304 => "Not Modified",
26
+ 305 => "Use Proxy",
27
+ 307 => "Temporary Redirect",
28
+
29
+ 400 => "Bad Request",
30
+ 401 => "Unauthorized",
31
+ 402 => "Payment Required",
32
+ 403 => "Forbidden",
33
+ 404 => "Not Found",
34
+ 405 => "Method Not Allowed",
35
+ 406 => "Not Acceptable",
36
+ 407 => "Proxy Authentication Required",
37
+ 408 => "Request Timeout",
38
+ 409 => "Conflict",
39
+ 410 => "Gone",
40
+ 411 => "Length Required",
41
+ 412 => "Precondition Failed",
42
+ 413 => "Request Entity Too Large",
43
+ 414 => "Request-URI Too Long",
44
+ 415 => "Unsupported Media Type",
45
+ 416 => "Requested Range Not Satisfiable",
46
+ 417 => "Expectation Failed",
47
+ 422 => "Unprocessable Entity",
48
+ 423 => "Locked",
49
+ 424 => "Failed Dependency",
50
+ 426 => "Upgrade Required",
51
+
52
+ 500 => "Internal Server Error",
53
+ 501 => "Not Implemented",
54
+ 502 => "Bad Gateway",
55
+ 503 => "Service Unavailable",
56
+ 504 => "Gateway Timeout",
57
+ 505 => "HTTP Version Not Supported",
58
+ 507 => "Insufficient Storage",
59
+ 510 => "Not Extended"
60
+ }
61
+
62
+ # Provides a symbol-to-fixnum lookup for converting a symbol (like
63
+ # :created or :not_implemented) into its corresponding HTTP status
64
+ # code (like 200 or 501).
65
+ SYMBOL_TO_STATUS_CODE = STATUS_CODES.inject({}) do |hash, (code, message)|
66
+ hash[message.gsub(/ /, "").underscore.to_sym] = code
67
+ hash
68
+ end
69
+
70
+ # Given a status parameter, determine whether it needs to be converted
71
+ # to a string. If it is a fixnum, use the STATUS_CODES hash to lookup
72
+ # the default message. If it is a symbol, use the SYMBOL_TO_STATUS_CODE
73
+ # hash to convert it.
74
+ def interpret_status(status)
75
+ case status
76
+ when Fixnum then
77
+ "#{status} #{STATUS_CODES[status]}".strip
78
+ when Symbol then
79
+ interpret_status(SYMBOL_TO_STATUS_CODE[status] ||
80
+ "500 Unknown Status #{status.inspect}")
81
+ else
82
+ status.to_s
83
+ end
84
+ end
85
+ private :interpret_status
86
+
87
+ end
88
+ end
@@ -0,0 +1,155 @@
1
+ module ActionController #:nodoc:
2
+ # Methods for sending files and streams to the browser instead of rendering.
3
+ module Streaming
4
+ DEFAULT_SEND_FILE_OPTIONS = {
5
+ :type => 'application/octet-stream'.freeze,
6
+ :disposition => 'attachment'.freeze,
7
+ :stream => true,
8
+ :buffer_size => 4096,
9
+ :x_sendfile => false
10
+ }.freeze
11
+
12
+ X_SENDFILE_HEADER = 'X-Sendfile'.freeze
13
+
14
+ protected
15
+ # Sends the file by streaming it 4096 bytes at a time. This way the
16
+ # whole file doesn't need to be read into memory at once. This makes
17
+ # it feasible to send even large files.
18
+ #
19
+ # Be careful to sanitize the path parameter if it coming from a web
20
+ # page. <tt>send_file(params[:path])</tt> allows a malicious user to
21
+ # download any file on your server.
22
+ #
23
+ # Options:
24
+ # * <tt>:filename</tt> - suggests a filename for the browser to use.
25
+ # Defaults to <tt>File.basename(path)</tt>.
26
+ # * <tt>:type</tt> - specifies an HTTP content type.
27
+ # Defaults to 'application/octet-stream'.
28
+ # * <tt>:disposition</tt> - specifies whether the file will be shown inline or downloaded.
29
+ # Valid values are 'inline' and 'attachment' (default).
30
+ # * <tt>:stream</tt> - whether to send the file to the user agent as it is read (+true+)
31
+ # or to read the entire file before sending (+false+). Defaults to +true+.
32
+ # * <tt>:buffer_size</tt> - specifies size (in bytes) of the buffer used to stream the file.
33
+ # Defaults to 4096.
34
+ # * <tt>:status</tt> - specifies the status code to send with the response. Defaults to '200 OK'.
35
+ # * <tt>:url_based_filename</tt> - set to +true+ if you want the browser guess the filename from
36
+ # the URL, which is necessary for i18n filenames on certain browsers
37
+ # (setting <tt>:filename</tt> overrides this option).
38
+ #
39
+ # The default Content-Type and Content-Disposition headers are
40
+ # set to download arbitrary binary files in as many browsers as
41
+ # possible. IE versions 4, 5, 5.5, and 6 are all known to have
42
+ # a variety of quirks (especially when downloading over SSL).
43
+ #
44
+ # Simple download:
45
+ #
46
+ # send_file '/path/to.zip'
47
+ #
48
+ # Show a JPEG in the browser:
49
+ #
50
+ # send_file '/path/to.jpeg', :type => 'image/jpeg', :disposition => 'inline'
51
+ #
52
+ # Show a 404 page in the browser:
53
+ #
54
+ # send_file '/path/to/404.html', :type => 'text/html; charset=utf-8', :status => 404
55
+ #
56
+ # Read about the other Content-* HTTP headers if you'd like to
57
+ # provide the user with more information (such as Content-Description) in
58
+ # http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.11.
59
+ #
60
+ # Also be aware that the document may be cached by proxies and browsers.
61
+ # The Pragma and Cache-Control headers declare how the file may be cached
62
+ # by intermediaries. They default to require clients to validate with
63
+ # the server before releasing cached responses. See
64
+ # http://www.mnot.net/cache_docs/ for an overview of web caching and
65
+ # http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9
66
+ # for the Cache-Control header spec.
67
+ def send_file(path, options = {}) #:doc:
68
+ raise MissingFile, "Cannot read file #{path}" unless File.file?(path) and File.readable?(path)
69
+
70
+ options[:length] ||= File.size(path)
71
+ options[:filename] ||= File.basename(path) unless options[:url_based_filename]
72
+ send_file_headers! options
73
+
74
+ @performed_render = false
75
+
76
+ if options[:x_sendfile]
77
+ logger.info "Sending #{X_SENDFILE_HEADER} header #{path}" if logger
78
+ head options[:status], X_SENDFILE_HEADER => path
79
+ else
80
+ if options[:stream]
81
+ render :status => options[:status], :text => Proc.new { |response, output|
82
+ logger.info "Streaming file #{path}" unless logger.nil?
83
+ len = options[:buffer_size] || 4096
84
+ File.open(path, 'rb') do |file|
85
+ while buf = file.read(len)
86
+ output.write(buf)
87
+ end
88
+ end
89
+ }
90
+ else
91
+ logger.info "Sending file #{path}" unless logger.nil?
92
+ File.open(path, 'rb') { |file| render :status => options[:status], :text => file.read }
93
+ end
94
+ end
95
+ end
96
+
97
+ # Send binary data to the user as a file download. May set content type, apparent file name,
98
+ # and specify whether to show data inline or download as an attachment.
99
+ #
100
+ # Options:
101
+ # * <tt>:filename</tt> - suggests a filename for the browser to use.
102
+ # * <tt>:type</tt> - specifies an HTTP content type.
103
+ # Defaults to 'application/octet-stream'.
104
+ # * <tt>:disposition</tt> - specifies whether the file will be shown inline or downloaded.
105
+ # Valid values are 'inline' and 'attachment' (default).
106
+ # * <tt>:status</tt> - specifies the status code to send with the response. Defaults to '200 OK'.
107
+ #
108
+ # Generic data download:
109
+ #
110
+ # send_data buffer
111
+ #
112
+ # Download a dynamically-generated tarball:
113
+ #
114
+ # send_data generate_tgz('dir'), :filename => 'dir.tgz'
115
+ #
116
+ # Display an image Active Record in the browser:
117
+ #
118
+ # send_data image.data, :type => image.content_type, :disposition => 'inline'
119
+ #
120
+ # See +send_file+ for more information on HTTP Content-* headers and caching.
121
+ def send_data(data, options = {}) #:doc:
122
+ logger.info "Sending data #{options[:filename]}" if logger
123
+ send_file_headers! options.merge(:length => data.size)
124
+ @performed_render = false
125
+ render :status => options[:status], :text => data
126
+ end
127
+
128
+ private
129
+ def send_file_headers!(options)
130
+ options.update(DEFAULT_SEND_FILE_OPTIONS.merge(options))
131
+ [:length, :type, :disposition].each do |arg|
132
+ raise ArgumentError, ":#{arg} option required" if options[arg].nil?
133
+ end
134
+
135
+ disposition = options[:disposition].dup || 'attachment'
136
+
137
+ disposition <<= %(; filename="#{options[:filename]}") if options[:filename]
138
+
139
+ headers.update(
140
+ 'Content-Length' => options[:length],
141
+ 'Content-Type' => options[:type].to_s.strip, # fixes a problem with extra '\r' with some browsers
142
+ 'Content-Disposition' => disposition,
143
+ 'Content-Transfer-Encoding' => 'binary'
144
+ )
145
+
146
+ # Fix a problem with IE 6.0 on opening downloaded files:
147
+ # If Cache-Control: no-cache is set (which Rails does by default),
148
+ # IE removes the file it just downloaded from its cache immediately
149
+ # after it displays the "open/save" dialog, which means that if you
150
+ # hit "open" the file isn't there anymore when the application that
151
+ # is called for handling the download is run, so let's workaround that
152
+ headers['Cache-Control'] = 'private' if headers['Cache-Control'] == 'no-cache'
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,24 @@
1
+ <% unless @exception.blamed_files.blank? %>
2
+ <% if (hide = @exception.blamed_files.length > 8) %>
3
+ <a href="#" onclick="document.getElementById('blame_trace').style.display='block'; return false;">Show blamed files</a>
4
+ <% end %>
5
+ <pre id="blame_trace" <%='style="display:none"' if hide %>><code><%=h @exception.describe_blame %></code></pre>
6
+ <% end %>
7
+
8
+ <%
9
+ clean_params = request.parameters.clone
10
+ clean_params.delete("action")
11
+ clean_params.delete("controller")
12
+
13
+ request_dump = clean_params.empty? ? 'None' : clean_params.inspect.gsub(',', ",\n")
14
+ %>
15
+
16
+ <h2 style="margin-top: 30px">Request</h2>
17
+ <p><b>Parameters</b>: <pre><%=h request_dump %></pre></p>
18
+
19
+ <p><a href="#" onclick="document.getElementById('session_dump').style.display='block'; return false;">Show session dump</a></p>
20
+ <div id="session_dump" style="display:none"><%= debug(request.session.instance_variable_get("@data")) %></div>
21
+
22
+
23
+ <h2 style="margin-top: 30px">Response</h2>
24
+ <p><b>Headers</b>: <pre><%=h response ? response.headers.inspect.gsub(',', ",\n") : 'None' %></pre></p>
@@ -0,0 +1,26 @@
1
+ <%
2
+ traces = [
3
+ ["Application Trace", @exception.application_backtrace],
4
+ ["Framework Trace", @exception.framework_backtrace],
5
+ ["Full Trace", @exception.clean_backtrace]
6
+ ]
7
+ names = traces.collect {|name, trace| name}
8
+ %>
9
+
10
+ <p><code>RAILS_ROOT: <%= defined?(RAILS_ROOT) ? RAILS_ROOT : "unset" %></code></p>
11
+
12
+ <div id="traces">
13
+ <% names.each do |name| %>
14
+ <%
15
+ show = "document.getElementById('#{name.gsub /\s/, '-'}').style.display='block';"
16
+ hide = (names - [name]).collect {|hide_name| "document.getElementById('#{hide_name.gsub /\s/, '-'}').style.display='none';"}
17
+ %>
18
+ <a href="#" onclick="<%= hide %><%= show %>; return false;"><%= name %></a> <%= '|' unless names.last == name %>
19
+ <% end %>
20
+
21
+ <% traces.each do |name, trace| %>
22
+ <div id="<%= name.gsub /\s/, '-' %>" style="display: <%= name == "Application Trace" ? 'block' : 'none' %>;">
23
+ <pre><code><%= trace.join "\n" %></code></pre>
24
+ </div>
25
+ <% end %>
26
+ </div>
@@ -0,0 +1,11 @@
1
+ <h1>
2
+ <%=h @exception.class.to_s %>
3
+ <% if request.parameters['controller'] %>
4
+ in <%=h request.parameters['controller'].humanize %>Controller<% if request.parameters['action'] %>#<%=h request.parameters['action'] %><% end %>
5
+ <% end %>
6
+ </h1>
7
+ <pre><%=h @exception.clean_message %></pre>
8
+
9
+ <%= render_file(@rescues_path + "/_trace.erb", false) %>
10
+
11
+ <%= render_file(@rescues_path + "/_request_and_response.erb", false) %>
@@ -0,0 +1,29 @@
1
+ <html xmlns="http://www.w3.org/1999/xhtml">
2
+ <head>
3
+ <title>Action Controller: Exception caught</title>
4
+ <style>
5
+ body { background-color: #fff; color: #333; }
6
+
7
+ body, p, ol, ul, td {
8
+ font-family: verdana, arial, helvetica, sans-serif;
9
+ font-size: 13px;
10
+ line-height: 18px;
11
+ }
12
+
13
+ pre {
14
+ background-color: #eee;
15
+ padding: 10px;
16
+ font-size: 11px;
17
+ }
18
+
19
+ a { color: #000; }
20
+ a:visited { color: #666; }
21
+ a:hover { color: #fff; background-color:#000; }
22
+ </style>
23
+ </head>
24
+ <body>
25
+
26
+ <%= @contents %>
27
+
28
+ </body>
29
+ </html>
@@ -0,0 +1,2 @@
1
+ <h1>Template is missing</h1>
2
+ <p><%=h @exception.message %></p>
@@ -0,0 +1,10 @@
1
+ <h1>Routing Error</h1>
2
+ <p><pre><%=h @exception.message %></pre></p>
3
+ <% unless @exception.failures.empty? %><p>
4
+ <h2>Failure reasons:</h2>
5
+ <ol>
6
+ <% @exception.failures.each do |route, reason| %>
7
+ <li><code><%=h route.inspect.gsub('\\', '') %></code> failed because <%=h reason.downcase %></li>
8
+ <% end %>
9
+ </ol>
10
+ </p><% end %>
@@ -0,0 +1,21 @@
1
+ <h1>
2
+ <%=h @exception.original_exception.class.to_s %> in
3
+ <%=h request.parameters["controller"].capitalize if request.parameters["controller"]%>#<%=h request.parameters["action"] %>
4
+ </h1>
5
+
6
+ <p>
7
+ Showing <i><%=h @exception.file_name %></i> where line <b>#<%=h @exception.line_number %></b> raised:
8
+ <pre><code><%=h @exception.message %></code></pre>
9
+ </p>
10
+
11
+ <p>Extracted source (around line <b>#<%=h @exception.line_number %></b>):
12
+ <pre><code><%=h @exception.source_extract %></code></pre></p>
13
+
14
+ <p><%=h @exception.sub_template_message %></p>
15
+
16
+ <% @real_exception = @exception
17
+ @exception = @exception.original_exception || @exception %>
18
+ <%= render_file(@rescues_path + "/_trace.erb", false) %>
19
+ <% @exception = @real_exception %>
20
+
21
+ <%= render_file(@rescues_path + "/_request_and_response.erb", false) %>
@@ -0,0 +1,2 @@
1
+ <h1>Unknown action</h1>
2
+ <p><%=h @exception.message %></p>
@@ -0,0 +1,83 @@
1
+ require 'active_support/test_case'
2
+
3
+ module ActionController
4
+ class NonInferrableControllerError < ActionControllerError
5
+ def initialize(name)
6
+ @name = name
7
+ super "Unable to determine the controller to test from #{name}. " +
8
+ "You'll need to specify it using 'tests YourController' in your " +
9
+ "test case definition. This could mean that #{inferred_controller_name} does not exist " +
10
+ "or it contains syntax errors"
11
+ end
12
+
13
+ def inferred_controller_name
14
+ @name.sub(/Test$/, '')
15
+ end
16
+ end
17
+
18
+ class TestCase < ActiveSupport::TestCase
19
+ # When the request.remote_addr remains the default for testing, which is 0.0.0.0, the exception is simply raised inline
20
+ # (bystepping the regular exception handling from rescue_action). If the request.remote_addr is anything else, the regular
21
+ # rescue_action process takes place. This means you can test your rescue_action code by setting remote_addr to something else
22
+ # than 0.0.0.0.
23
+ #
24
+ # The exception is stored in the exception accessor for further inspection.
25
+ module RaiseActionExceptions
26
+ attr_accessor :exception
27
+
28
+ def rescue_action(e)
29
+ self.exception = e
30
+
31
+ if request.remote_addr == "0.0.0.0"
32
+ raise(e)
33
+ else
34
+ super(e)
35
+ end
36
+ end
37
+ end
38
+
39
+ setup :setup_controller_request_and_response
40
+
41
+ @@controller_class = nil
42
+
43
+ class << self
44
+ def tests(controller_class)
45
+ self.controller_class = controller_class
46
+ end
47
+
48
+ def controller_class=(new_class)
49
+ prepare_controller_class(new_class)
50
+ write_inheritable_attribute(:controller_class, new_class)
51
+ end
52
+
53
+ def controller_class
54
+ if current_controller_class = read_inheritable_attribute(:controller_class)
55
+ current_controller_class
56
+ else
57
+ self.controller_class = determine_default_controller_class(name)
58
+ end
59
+ end
60
+
61
+ def determine_default_controller_class(name)
62
+ name.sub(/Test$/, '').constantize
63
+ rescue NameError
64
+ raise NonInferrableControllerError.new(name)
65
+ end
66
+
67
+ def prepare_controller_class(new_class)
68
+ new_class.send :include, RaiseActionExceptions
69
+ end
70
+ end
71
+
72
+ def setup_controller_request_and_response
73
+ @controller = self.class.controller_class.new
74
+ @controller.request = @request = TestRequest.new
75
+ @response = TestResponse.new
76
+ end
77
+
78
+ # Cause the action to be rescued according to the regular rules for rescue_action when the visitor is not local
79
+ def rescue_action_in_public!
80
+ @request.remote_addr = '208.77.188.166' # example.com
81
+ end
82
+ end
83
+ end