actionpack_csi 2.3.5.p6

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 (429) hide show
  1. data/CHANGELOG +5184 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +409 -0
  4. data/RUNNING_UNIT_TESTS +24 -0
  5. data/Rakefile +160 -0
  6. data/install.rb +30 -0
  7. data/lib/action_controller/assertions/dom_assertions.rb +55 -0
  8. data/lib/action_controller/assertions/model_assertions.rb +21 -0
  9. data/lib/action_controller/assertions/response_assertions.rb +160 -0
  10. data/lib/action_controller/assertions/routing_assertions.rb +146 -0
  11. data/lib/action_controller/assertions/selector_assertions.rb +638 -0
  12. data/lib/action_controller/assertions/tag_assertions.rb +127 -0
  13. data/lib/action_controller/base.rb +1423 -0
  14. data/lib/action_controller/benchmarking.rb +107 -0
  15. data/lib/action_controller/caching/actions.rb +177 -0
  16. data/lib/action_controller/caching/fragments.rb +120 -0
  17. data/lib/action_controller/caching/pages.rb +152 -0
  18. data/lib/action_controller/caching/sweeper.rb +45 -0
  19. data/lib/action_controller/caching/sweeping.rb +55 -0
  20. data/lib/action_controller/caching.rb +71 -0
  21. data/lib/action_controller/cgi_ext/cookie.rb +112 -0
  22. data/lib/action_controller/cgi_ext/query_extension.rb +22 -0
  23. data/lib/action_controller/cgi_ext/stdinput.rb +24 -0
  24. data/lib/action_controller/cgi_ext.rb +15 -0
  25. data/lib/action_controller/cgi_process.rb +77 -0
  26. data/lib/action_controller/cookies.rb +95 -0
  27. data/lib/action_controller/dispatcher.rb +133 -0
  28. data/lib/action_controller/failsafe.rb +86 -0
  29. data/lib/action_controller/filters.rb +680 -0
  30. data/lib/action_controller/flash.rb +171 -0
  31. data/lib/action_controller/headers.rb +33 -0
  32. data/lib/action_controller/helpers.rb +225 -0
  33. data/lib/action_controller/http_authentication.rb +309 -0
  34. data/lib/action_controller/integration.rb +692 -0
  35. data/lib/action_controller/layout.rb +286 -0
  36. data/lib/action_controller/middleware_stack.rb +119 -0
  37. data/lib/action_controller/middlewares.rb +14 -0
  38. data/lib/action_controller/mime_responds.rb +193 -0
  39. data/lib/action_controller/mime_type.rb +212 -0
  40. data/lib/action_controller/mime_types.rb +21 -0
  41. data/lib/action_controller/params_parser.rb +77 -0
  42. data/lib/action_controller/performance_test.rb +15 -0
  43. data/lib/action_controller/polymorphic_routes.rb +189 -0
  44. data/lib/action_controller/rack_lint_patch.rb +36 -0
  45. data/lib/action_controller/record_identifier.rb +104 -0
  46. data/lib/action_controller/reloader.rb +54 -0
  47. data/lib/action_controller/request.rb +493 -0
  48. data/lib/action_controller/request_forgery_protection.rb +113 -0
  49. data/lib/action_controller/rescue.rb +183 -0
  50. data/lib/action_controller/resources.rb +682 -0
  51. data/lib/action_controller/response.rb +239 -0
  52. data/lib/action_controller/routing/builder.rb +197 -0
  53. data/lib/action_controller/routing/optimisations.rb +130 -0
  54. data/lib/action_controller/routing/recognition_optimisation.rb +167 -0
  55. data/lib/action_controller/routing/route.rb +265 -0
  56. data/lib/action_controller/routing/route_set.rb +502 -0
  57. data/lib/action_controller/routing/routing_ext.rb +49 -0
  58. data/lib/action_controller/routing/segments.rb +343 -0
  59. data/lib/action_controller/routing.rb +388 -0
  60. data/lib/action_controller/session/abstract_store.rb +181 -0
  61. data/lib/action_controller/session/cookie_store.rb +221 -0
  62. data/lib/action_controller/session/mem_cache_store.rb +51 -0
  63. data/lib/action_controller/session_management.rb +54 -0
  64. data/lib/action_controller/status_codes.rb +88 -0
  65. data/lib/action_controller/streaming.rb +181 -0
  66. data/lib/action_controller/string_coercion.rb +29 -0
  67. data/lib/action_controller/templates/rescues/_request_and_response.erb +24 -0
  68. data/lib/action_controller/templates/rescues/_trace.erb +26 -0
  69. data/lib/action_controller/templates/rescues/diagnostics.erb +11 -0
  70. data/lib/action_controller/templates/rescues/layout.erb +29 -0
  71. data/lib/action_controller/templates/rescues/missing_template.erb +2 -0
  72. data/lib/action_controller/templates/rescues/routing_error.erb +10 -0
  73. data/lib/action_controller/templates/rescues/template_error.erb +21 -0
  74. data/lib/action_controller/templates/rescues/unknown_action.erb +2 -0
  75. data/lib/action_controller/test_case.rb +209 -0
  76. data/lib/action_controller/test_process.rb +580 -0
  77. data/lib/action_controller/translation.rb +13 -0
  78. data/lib/action_controller/uploaded_file.rb +44 -0
  79. data/lib/action_controller/url_rewriter.rb +216 -0
  80. data/lib/action_controller/vendor/html-scanner/html/document.rb +68 -0
  81. data/lib/action_controller/vendor/html-scanner/html/node.rb +537 -0
  82. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +173 -0
  83. data/lib/action_controller/vendor/html-scanner/html/selector.rb +828 -0
  84. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +105 -0
  85. data/lib/action_controller/vendor/html-scanner/html/version.rb +11 -0
  86. data/lib/action_controller/vendor/html-scanner.rb +16 -0
  87. data/lib/action_controller/verification.rb +130 -0
  88. data/lib/action_controller.rb +113 -0
  89. data/lib/action_pack/version.rb +9 -0
  90. data/lib/action_pack.rb +24 -0
  91. data/lib/action_view/base.rb +362 -0
  92. data/lib/action_view/erb/util.rb +44 -0
  93. data/lib/action_view/helpers/active_record_helper.rb +305 -0
  94. data/lib/action_view/helpers/asset_tag_helper.rb +694 -0
  95. data/lib/action_view/helpers/atom_feed_helper.rb +198 -0
  96. data/lib/action_view/helpers/benchmark_helper.rb +54 -0
  97. data/lib/action_view/helpers/cache_helper.rb +39 -0
  98. data/lib/action_view/helpers/capture_helper.rb +136 -0
  99. data/lib/action_view/helpers/date_helper.rb +988 -0
  100. data/lib/action_view/helpers/debug_helper.rb +38 -0
  101. data/lib/action_view/helpers/form_helper.rb +1074 -0
  102. data/lib/action_view/helpers/form_options_helper.rb +600 -0
  103. data/lib/action_view/helpers/form_tag_helper.rb +487 -0
  104. data/lib/action_view/helpers/javascript_helper.rb +208 -0
  105. data/lib/action_view/helpers/number_helper.rb +308 -0
  106. data/lib/action_view/helpers/prototype_helper.rb +1305 -0
  107. data/lib/action_view/helpers/raw_output_helper.rb +9 -0
  108. data/lib/action_view/helpers/record_identification_helper.rb +20 -0
  109. data/lib/action_view/helpers/record_tag_helper.rb +58 -0
  110. data/lib/action_view/helpers/sanitize_helper.rb +259 -0
  111. data/lib/action_view/helpers/scriptaculous_helper.rb +226 -0
  112. data/lib/action_view/helpers/tag_helper.rb +150 -0
  113. data/lib/action_view/helpers/text_helper.rb +587 -0
  114. data/lib/action_view/helpers/translation_helper.rb +39 -0
  115. data/lib/action_view/helpers/url_helper.rb +639 -0
  116. data/lib/action_view/helpers.rb +59 -0
  117. data/lib/action_view/inline_template.rb +19 -0
  118. data/lib/action_view/locale/en.yml +117 -0
  119. data/lib/action_view/partials.rb +240 -0
  120. data/lib/action_view/paths.rb +69 -0
  121. data/lib/action_view/reloadable_template.rb +117 -0
  122. data/lib/action_view/renderable.rb +95 -0
  123. data/lib/action_view/renderable_partial.rb +47 -0
  124. data/lib/action_view/safe_buffer.rb +28 -0
  125. data/lib/action_view/template.rb +252 -0
  126. data/lib/action_view/template_error.rb +99 -0
  127. data/lib/action_view/template_handler.rb +34 -0
  128. data/lib/action_view/template_handlers/builder.rb +17 -0
  129. data/lib/action_view/template_handlers/erb.rb +22 -0
  130. data/lib/action_view/template_handlers/rjs.rb +13 -0
  131. data/lib/action_view/template_handlers.rb +48 -0
  132. data/lib/action_view/test_case.rb +162 -0
  133. data/lib/action_view.rb +58 -0
  134. data/lib/actionpack.rb +2 -0
  135. data/test/abstract_unit.rb +61 -0
  136. data/test/active_record_unit.rb +104 -0
  137. data/test/activerecord/active_record_store_test.rb +174 -0
  138. data/test/activerecord/render_partial_with_record_identification_test.rb +188 -0
  139. data/test/adv_attr_test.rb +20 -0
  140. data/test/controller/action_pack_assertions_test.rb +543 -0
  141. data/test/controller/addresses_render_test.rb +37 -0
  142. data/test/controller/assert_select_test.rb +734 -0
  143. data/test/controller/base_test.rb +217 -0
  144. data/test/controller/benchmark_test.rb +32 -0
  145. data/test/controller/caching_test.rb +729 -0
  146. data/test/controller/capture_test.rb +66 -0
  147. data/test/controller/content_type_test.rb +168 -0
  148. data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  149. data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  150. data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  151. data/test/controller/cookie_test.rb +134 -0
  152. data/test/controller/deprecation/deprecated_base_methods_test.rb +32 -0
  153. data/test/controller/dispatcher_test.rb +144 -0
  154. data/test/controller/dom_assertions_test.rb +53 -0
  155. data/test/controller/failsafe_test.rb +60 -0
  156. data/test/controller/fake_controllers.rb +33 -0
  157. data/test/controller/fake_models.rb +19 -0
  158. data/test/controller/filter_params_test.rb +52 -0
  159. data/test/controller/filters_test.rb +885 -0
  160. data/test/controller/flash_test.rb +147 -0
  161. data/test/controller/header_test.rb +14 -0
  162. data/test/controller/helper_test.rb +224 -0
  163. data/test/controller/html-scanner/cdata_node_test.rb +15 -0
  164. data/test/controller/html-scanner/document_test.rb +148 -0
  165. data/test/controller/html-scanner/node_test.rb +89 -0
  166. data/test/controller/html-scanner/sanitizer_test.rb +274 -0
  167. data/test/controller/html-scanner/tag_node_test.rb +238 -0
  168. data/test/controller/html-scanner/text_node_test.rb +50 -0
  169. data/test/controller/html-scanner/tokenizer_test.rb +131 -0
  170. data/test/controller/http_basic_authentication_test.rb +113 -0
  171. data/test/controller/http_digest_authentication_test.rb +254 -0
  172. data/test/controller/integration_test.rb +483 -0
  173. data/test/controller/layout_test.rb +215 -0
  174. data/test/controller/logging_test.rb +46 -0
  175. data/test/controller/middleware_stack_test.rb +90 -0
  176. data/test/controller/mime_responds_test.rb +536 -0
  177. data/test/controller/mime_type_test.rb +93 -0
  178. data/test/controller/polymorphic_routes_test.rb +297 -0
  179. data/test/controller/rack_test.rb +311 -0
  180. data/test/controller/record_identifier_test.rb +139 -0
  181. data/test/controller/redirect_test.rb +285 -0
  182. data/test/controller/reloader_test.rb +124 -0
  183. data/test/controller/render_test.rb +1762 -0
  184. data/test/controller/request/json_params_parsing_test.rb +65 -0
  185. data/test/controller/request/multipart_params_parsing_test.rb +162 -0
  186. data/test/controller/request/query_string_parsing_test.rb +120 -0
  187. data/test/controller/request/test_request_test.rb +35 -0
  188. data/test/controller/request/url_encoded_params_parsing_test.rb +146 -0
  189. data/test/controller/request/xml_params_parsing_test.rb +103 -0
  190. data/test/controller/request_forgery_protection_test.rb +265 -0
  191. data/test/controller/request_test.rb +395 -0
  192. data/test/controller/rescue_test.rb +536 -0
  193. data/test/controller/resources_test.rb +1393 -0
  194. data/test/controller/routing_test.rb +2591 -0
  195. data/test/controller/selector_test.rb +628 -0
  196. data/test/controller/send_file_test.rb +171 -0
  197. data/test/controller/session/cookie_store_test.rb +216 -0
  198. data/test/controller/session/mem_cache_store_test.rb +127 -0
  199. data/test/controller/session/test_session_test.rb +58 -0
  200. data/test/controller/test_test.rb +700 -0
  201. data/test/controller/translation_test.rb +26 -0
  202. data/test/controller/url_rewriter_test.rb +385 -0
  203. data/test/controller/verification_test.rb +270 -0
  204. data/test/controller/view_paths_test.rb +141 -0
  205. data/test/controller/webservice_test.rb +273 -0
  206. data/test/fixtures/_top_level_partial.html.erb +1 -0
  207. data/test/fixtures/_top_level_partial_only.erb +1 -0
  208. data/test/fixtures/addresses/list.erb +1 -0
  209. data/test/fixtures/alternate_helpers/foo_helper.rb +3 -0
  210. data/test/fixtures/bad_customers/_bad_customer.html.erb +1 -0
  211. data/test/fixtures/companies.yml +24 -0
  212. data/test/fixtures/company.rb +10 -0
  213. data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +1 -0
  214. data/test/fixtures/content_type/render_default_for_rhtml.rhtml +1 -0
  215. data/test/fixtures/content_type/render_default_for_rjs.rjs +1 -0
  216. data/test/fixtures/content_type/render_default_for_rxml.rxml +1 -0
  217. data/test/fixtures/customers/_customer.html.erb +1 -0
  218. data/test/fixtures/db_definitions/sqlite.sql +49 -0
  219. data/test/fixtures/developer.rb +9 -0
  220. data/test/fixtures/developers/_developer.erb +1 -0
  221. data/test/fixtures/developers.yml +21 -0
  222. data/test/fixtures/developers_projects.yml +13 -0
  223. data/test/fixtures/failsafe/500.html +1 -0
  224. data/test/fixtures/fun/games/_game.erb +1 -0
  225. data/test/fixtures/fun/games/hello_world.erb +1 -0
  226. data/test/fixtures/fun/serious/games/_game.erb +1 -0
  227. data/test/fixtures/functional_caching/_partial.erb +3 -0
  228. data/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +3 -0
  229. data/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +6 -0
  230. data/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +5 -0
  231. data/test/fixtures/functional_caching/fragment_cached.html.erb +2 -0
  232. data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +1 -0
  233. data/test/fixtures/functional_caching/inline_fragment_cached.html.erb +2 -0
  234. data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +1 -0
  235. data/test/fixtures/good_customers/_good_customer.html.erb +1 -0
  236. data/test/fixtures/helpers/abc_helper.rb +5 -0
  237. data/test/fixtures/helpers/fun/games_helper.rb +3 -0
  238. data/test/fixtures/helpers/fun/pdf_helper.rb +3 -0
  239. data/test/fixtures/layout_tests/abs_path_layout.rhtml +1 -0
  240. data/test/fixtures/layout_tests/alt/hello.rhtml +1 -0
  241. data/test/fixtures/layout_tests/alt/layouts/alt.rhtml +0 -0
  242. data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +1 -0
  243. data/test/fixtures/layout_tests/layouts/item.rhtml +1 -0
  244. data/test/fixtures/layout_tests/layouts/layout_test.rhtml +1 -0
  245. data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +1 -0
  246. data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +1 -0
  247. data/test/fixtures/layout_tests/views/hello.rhtml +1 -0
  248. data/test/fixtures/layouts/_column.html.erb +2 -0
  249. data/test/fixtures/layouts/block_with_layout.erb +3 -0
  250. data/test/fixtures/layouts/builder.builder +3 -0
  251. data/test/fixtures/layouts/default_html.html.erb +1 -0
  252. data/test/fixtures/layouts/partial_with_layout.erb +3 -0
  253. data/test/fixtures/layouts/standard.erb +1 -0
  254. data/test/fixtures/layouts/talk_from_action.erb +2 -0
  255. data/test/fixtures/layouts/xhr.html.erb +2 -0
  256. data/test/fixtures/layouts/yield.erb +2 -0
  257. data/test/fixtures/mascot.rb +3 -0
  258. data/test/fixtures/mascots/_mascot.html.erb +1 -0
  259. data/test/fixtures/mascots.yml +4 -0
  260. data/test/fixtures/multipart/binary_file +0 -0
  261. data/test/fixtures/multipart/boundary_problem_file +10 -0
  262. data/test/fixtures/multipart/bracketed_param +5 -0
  263. data/test/fixtures/multipart/empty +10 -0
  264. data/test/fixtures/multipart/hello.txt +1 -0
  265. data/test/fixtures/multipart/large_text_file +10 -0
  266. data/test/fixtures/multipart/mixed_files +0 -0
  267. data/test/fixtures/multipart/mona_lisa.jpg +0 -0
  268. data/test/fixtures/multipart/none +9 -0
  269. data/test/fixtures/multipart/single_parameter +5 -0
  270. data/test/fixtures/multipart/text_file +10 -0
  271. data/test/fixtures/override/test/hello_world.erb +1 -0
  272. data/test/fixtures/override2/layouts/test/sub.erb +1 -0
  273. data/test/fixtures/post_test/layouts/post.html.erb +1 -0
  274. data/test/fixtures/post_test/layouts/super_post.iphone.erb +1 -0
  275. data/test/fixtures/post_test/post/index.html.erb +1 -0
  276. data/test/fixtures/post_test/post/index.iphone.erb +1 -0
  277. data/test/fixtures/post_test/super_post/index.html.erb +1 -0
  278. data/test/fixtures/post_test/super_post/index.iphone.erb +1 -0
  279. data/test/fixtures/project.rb +3 -0
  280. data/test/fixtures/projects/_project.erb +1 -0
  281. data/test/fixtures/projects.yml +7 -0
  282. data/test/fixtures/public/404.html +1 -0
  283. data/test/fixtures/public/500.da.html +1 -0
  284. data/test/fixtures/public/500.html +1 -0
  285. data/test/fixtures/public/absolute/test.css +23 -0
  286. data/test/fixtures/public/absolute/test.js +63 -0
  287. data/test/fixtures/public/images/rails.png +0 -0
  288. data/test/fixtures/public/javascripts/application.js +1 -0
  289. data/test/fixtures/public/javascripts/bank.js +1 -0
  290. data/test/fixtures/public/javascripts/controls.js +1 -0
  291. data/test/fixtures/public/javascripts/dragdrop.js +1 -0
  292. data/test/fixtures/public/javascripts/effects.js +1 -0
  293. data/test/fixtures/public/javascripts/prototype.js +1 -0
  294. data/test/fixtures/public/javascripts/robber.js +1 -0
  295. data/test/fixtures/public/javascripts/subdir/subdir.js +1 -0
  296. data/test/fixtures/public/javascripts/version.1.0.js +1 -0
  297. data/test/fixtures/public/stylesheets/bank.css +1 -0
  298. data/test/fixtures/public/stylesheets/robber.css +1 -0
  299. data/test/fixtures/public/stylesheets/subdir/subdir.css +1 -0
  300. data/test/fixtures/public/stylesheets/version.1.0.css +1 -0
  301. data/test/fixtures/quiz/questions/_question.html.erb +1 -0
  302. data/test/fixtures/replies/_reply.erb +1 -0
  303. data/test/fixtures/replies.yml +15 -0
  304. data/test/fixtures/reply.rb +7 -0
  305. data/test/fixtures/respond_to/all_types_with_layout.html.erb +1 -0
  306. data/test/fixtures/respond_to/all_types_with_layout.js.rjs +1 -0
  307. data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +1 -0
  308. data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +1 -0
  309. data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +1 -0
  310. data/test/fixtures/respond_to/layouts/missing.html.erb +1 -0
  311. data/test/fixtures/respond_to/layouts/standard.html.erb +1 -0
  312. data/test/fixtures/respond_to/layouts/standard.iphone.erb +1 -0
  313. data/test/fixtures/respond_to/using_defaults.html.erb +1 -0
  314. data/test/fixtures/respond_to/using_defaults.js.rjs +1 -0
  315. data/test/fixtures/respond_to/using_defaults.xml.builder +1 -0
  316. data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +1 -0
  317. data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +1 -0
  318. data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +1 -0
  319. data/test/fixtures/scope/test/modgreet.erb +1 -0
  320. data/test/fixtures/shared.html.erb +1 -0
  321. data/test/fixtures/symlink_parent/symlinked_layout.erb +5 -0
  322. data/test/fixtures/test/_counter.html.erb +1 -0
  323. data/test/fixtures/test/_customer.erb +1 -0
  324. data/test/fixtures/test/_customer_counter.erb +1 -0
  325. data/test/fixtures/test/_customer_greeting.erb +1 -0
  326. data/test/fixtures/test/_customer_with_var.erb +1 -0
  327. data/test/fixtures/test/_form.erb +1 -0
  328. data/test/fixtures/test/_from_helper.erb +1 -0
  329. data/test/fixtures/test/_hash_greeting.erb +1 -0
  330. data/test/fixtures/test/_hash_object.erb +2 -0
  331. data/test/fixtures/test/_hello.builder +1 -0
  332. data/test/fixtures/test/_labelling_form.erb +1 -0
  333. data/test/fixtures/test/_layout_for_block_with_args.html.erb +3 -0
  334. data/test/fixtures/test/_layout_for_partial.html.erb +3 -0
  335. data/test/fixtures/test/_local_inspector.html.erb +1 -0
  336. data/test/fixtures/test/_one.html.erb +1 -0
  337. data/test/fixtures/test/_partial.erb +1 -0
  338. data/test/fixtures/test/_partial.html.erb +1 -0
  339. data/test/fixtures/test/_partial.js.erb +1 -0
  340. data/test/fixtures/test/_partial_for_use_in_layout.html.erb +1 -0
  341. data/test/fixtures/test/_partial_only.erb +1 -0
  342. data/test/fixtures/test/_partial_with_only_html_version.html.erb +1 -0
  343. data/test/fixtures/test/_person.erb +2 -0
  344. data/test/fixtures/test/_raise.html.erb +1 -0
  345. data/test/fixtures/test/_two.html.erb +1 -0
  346. data/test/fixtures/test/action_talk_to_layout.erb +2 -0
  347. data/test/fixtures/test/calling_partial_with_layout.html.erb +1 -0
  348. data/test/fixtures/test/capturing.erb +4 -0
  349. data/test/fixtures/test/content_for.erb +2 -0
  350. data/test/fixtures/test/content_for_concatenated.erb +3 -0
  351. data/test/fixtures/test/content_for_with_parameter.erb +2 -0
  352. data/test/fixtures/test/delete_with_js.rjs +2 -0
  353. data/test/fixtures/test/dont_pick_me +1 -0
  354. data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +1 -0
  355. data/test/fixtures/test/enum_rjs_test.rjs +6 -0
  356. data/test/fixtures/test/formatted_html_erb.html.erb +1 -0
  357. data/test/fixtures/test/formatted_xml_erb.builder +1 -0
  358. data/test/fixtures/test/formatted_xml_erb.html.erb +1 -0
  359. data/test/fixtures/test/formatted_xml_erb.xml.erb +1 -0
  360. data/test/fixtures/test/greeting.erb +1 -0
  361. data/test/fixtures/test/greeting.js.rjs +1 -0
  362. data/test/fixtures/test/hello.builder +4 -0
  363. data/test/fixtures/test/hello_world.da.html.erb +1 -0
  364. data/test/fixtures/test/hello_world.erb +1 -0
  365. data/test/fixtures/test/hello_world.erb~ +1 -0
  366. data/test/fixtures/test/hello_world.pt-BR.html.erb +1 -0
  367. data/test/fixtures/test/hello_world_container.builder +3 -0
  368. data/test/fixtures/test/hello_world_from_rxml.builder +4 -0
  369. data/test/fixtures/test/hello_world_with_layout_false.erb +1 -0
  370. data/test/fixtures/test/hello_xml_world.builder +11 -0
  371. data/test/fixtures/test/hyphen-ated.erb +1 -0
  372. data/test/fixtures/test/implicit_content_type.atom.builder +2 -0
  373. data/test/fixtures/test/list.erb +1 -0
  374. data/test/fixtures/test/malformed/malformed.en.html.erb~ +1 -0
  375. data/test/fixtures/test/malformed/malformed.erb~ +1 -0
  376. data/test/fixtures/test/malformed/malformed.html.erb~ +1 -0
  377. data/test/fixtures/test/nested_layout.erb +3 -0
  378. data/test/fixtures/test/non_erb_block_content_for.builder +4 -0
  379. data/test/fixtures/test/potential_conflicts.erb +4 -0
  380. data/test/fixtures/test/render_explicit_html_template.js.rjs +1 -0
  381. data/test/fixtures/test/render_file_from_template.html.erb +1 -0
  382. data/test/fixtures/test/render_file_with_ivar.erb +1 -0
  383. data/test/fixtures/test/render_file_with_locals.erb +1 -0
  384. data/test/fixtures/test/render_implicit_html_template.js.rjs +1 -0
  385. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb +1 -0
  386. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb +1 -0
  387. data/test/fixtures/test/render_implicit_js_template_without_layout.js.erb +1 -0
  388. data/test/fixtures/test/render_to_string_test.erb +1 -0
  389. data/test/fixtures/test/sub_template_raise.html.erb +1 -0
  390. data/test/fixtures/test/template.erb +1 -0
  391. data/test/fixtures/test/update_element_with_capture.erb +9 -0
  392. data/test/fixtures/test/using_layout_around_block.html.erb +1 -0
  393. data/test/fixtures/test/using_layout_around_block_with_args.html.erb +1 -0
  394. data/test/fixtures/test/utf8.html.erb +2 -0
  395. data/test/fixtures/topic.rb +3 -0
  396. data/test/fixtures/topics/_topic.html.erb +1 -0
  397. data/test/fixtures/topics.yml +22 -0
  398. data/test/template/active_record_helper_i18n_test.rb +44 -0
  399. data/test/template/active_record_helper_test.rb +302 -0
  400. data/test/template/asset_tag_helper_test.rb +771 -0
  401. data/test/template/atom_feed_helper_test.rb +315 -0
  402. data/test/template/benchmark_helper_test.rb +86 -0
  403. data/test/template/compiled_templates_test.rb +204 -0
  404. data/test/template/date_helper_i18n_test.rb +121 -0
  405. data/test/template/date_helper_test.rb +2485 -0
  406. data/test/template/erb_util_test.rb +24 -0
  407. data/test/template/form_helper_test.rb +1393 -0
  408. data/test/template/form_options_helper_i18n_test.rb +27 -0
  409. data/test/template/form_options_helper_test.rb +807 -0
  410. data/test/template/form_tag_helper_test.rb +344 -0
  411. data/test/template/javascript_helper_test.rb +106 -0
  412. data/test/template/number_helper_i18n_test.rb +69 -0
  413. data/test/template/number_helper_test.rb +132 -0
  414. data/test/template/prototype_helper_test.rb +639 -0
  415. data/test/template/raw_output_helper_test.rb +21 -0
  416. data/test/template/record_tag_helper_test.rb +58 -0
  417. data/test/template/render_test.rb +290 -0
  418. data/test/template/sanitize_helper_test.rb +57 -0
  419. data/test/template/scriptaculous_helper_test.rb +90 -0
  420. data/test/template/tag_helper_test.rb +98 -0
  421. data/test/template/template_test.rb +32 -0
  422. data/test/template/test_test.rb +54 -0
  423. data/test/template/text_helper_test.rb +543 -0
  424. data/test/template/translation_helper_test.rb +32 -0
  425. data/test/template/url_helper_test.rb +622 -0
  426. data/test/testing_sandbox.rb +15 -0
  427. data/test/view/safe_buffer_test.rb +36 -0
  428. data/test/view/test_case_test.rb +176 -0
  429. metadata +531 -0
@@ -0,0 +1,131 @@
1
+ require 'abstract_unit'
2
+
3
+ class TokenizerTest < Test::Unit::TestCase
4
+
5
+ def test_blank
6
+ tokenize ""
7
+ assert_end
8
+ end
9
+
10
+ def test_space
11
+ tokenize " "
12
+ assert_next " "
13
+ assert_end
14
+ end
15
+
16
+ def test_tag_simple_open
17
+ tokenize "<tag>"
18
+ assert_next "<tag>"
19
+ assert_end
20
+ end
21
+
22
+ def test_tag_simple_self_closing
23
+ tokenize "<tag />"
24
+ assert_next "<tag />"
25
+ assert_end
26
+ end
27
+
28
+ def test_tag_simple_closing
29
+ tokenize "</tag>"
30
+ assert_next "</tag>"
31
+ end
32
+
33
+ def test_tag_with_single_quoted_attribute
34
+ tokenize %{<tag a='hello'>x}
35
+ assert_next %{<tag a='hello'>}
36
+ end
37
+
38
+ def test_tag_with_single_quoted_attribute_with_escape
39
+ tokenize %{<tag a='hello\\''>x}
40
+ assert_next %{<tag a='hello\\''>}
41
+ end
42
+
43
+ def test_tag_with_double_quoted_attribute
44
+ tokenize %{<tag a="hello">x}
45
+ assert_next %{<tag a="hello">}
46
+ end
47
+
48
+ def test_tag_with_double_quoted_attribute_with_escape
49
+ tokenize %{<tag a="hello\\"">x}
50
+ assert_next %{<tag a="hello\\"">}
51
+ end
52
+
53
+ def test_tag_with_unquoted_attribute
54
+ tokenize %{<tag a=hello>x}
55
+ assert_next %{<tag a=hello>}
56
+ end
57
+
58
+ def test_tag_with_lt_char_in_attribute
59
+ tokenize %{<tag a="x < y">x}
60
+ assert_next %{<tag a="x < y">}
61
+ end
62
+
63
+ def test_tag_with_gt_char_in_attribute
64
+ tokenize %{<tag a="x > y">x}
65
+ assert_next %{<tag a="x > y">}
66
+ end
67
+
68
+ def test_doctype_tag
69
+ tokenize %{<!DOCTYPE "blah" "blah" "blah">\n <html>}
70
+ assert_next %{<!DOCTYPE "blah" "blah" "blah">}
71
+ assert_next %{\n }
72
+ assert_next %{<html>}
73
+ end
74
+
75
+ def test_cdata_tag
76
+ tokenize %{<![CDATA[<br>]]>}
77
+ assert_next %{<![CDATA[<br>]]>}
78
+ assert_end
79
+ end
80
+
81
+ def test_unterminated_cdata_tag
82
+ tokenize %{<content:encoded><![CDATA[ neverending...}
83
+ assert_next %{<content:encoded>}
84
+ assert_next %{<![CDATA[ neverending...}
85
+ assert_end
86
+ end
87
+
88
+ def test_less_than_with_space
89
+ tokenize %{original < hello > world}
90
+ assert_next %{original }
91
+ assert_next %{< hello > world}
92
+ end
93
+
94
+ def test_less_than_without_matching_greater_than
95
+ tokenize %{hello <span onmouseover="gotcha"\n<b>foo</b>\nbar</span>}
96
+ assert_next %{hello }
97
+ assert_next %{<span onmouseover="gotcha"\n}
98
+ assert_next %{<b>}
99
+ assert_next %{foo}
100
+ assert_next %{</b>}
101
+ assert_next %{\nbar}
102
+ assert_next %{</span>}
103
+ assert_end
104
+ end
105
+
106
+ def test_unterminated_comment
107
+ tokenize %{hello <!-- neverending...}
108
+ assert_next %{hello }
109
+ assert_next %{<!-- neverending...}
110
+ assert_end
111
+ end
112
+
113
+ private
114
+
115
+ def tokenize(text)
116
+ @tokenizer = HTML::Tokenizer.new(text)
117
+ end
118
+
119
+ def assert_next(expected, message=nil)
120
+ token = @tokenizer.next
121
+ assert_equal expected, token, message
122
+ end
123
+
124
+ def assert_sequence(*expected)
125
+ assert_next expected.shift until expected.empty?
126
+ end
127
+
128
+ def assert_end(message=nil)
129
+ assert_nil @tokenizer.next, message
130
+ end
131
+ end
@@ -0,0 +1,113 @@
1
+ require 'abstract_unit'
2
+
3
+ class HttpBasicAuthenticationTest < ActionController::TestCase
4
+ class DummyController < ActionController::Base
5
+ before_filter :authenticate, :only => :index
6
+ before_filter :authenticate_with_request, :only => :display
7
+ before_filter :authenticate_long_credentials, :only => :show
8
+
9
+ def index
10
+ render :text => "Hello Secret"
11
+ end
12
+
13
+ def display
14
+ render :text => 'Definitely Maybe'
15
+ end
16
+
17
+ def show
18
+ render :text => 'Only for loooooong credentials'
19
+ end
20
+
21
+ private
22
+
23
+ def authenticate
24
+ authenticate_or_request_with_http_basic do |username, password|
25
+ username == 'lifo' && password == 'world'
26
+ end
27
+ end
28
+
29
+ def authenticate_with_request
30
+ if authenticate_with_http_basic { |username, password| username == 'pretty' && password == 'please' }
31
+ @logged_in = true
32
+ else
33
+ request_http_basic_authentication("SuperSecret")
34
+ end
35
+ end
36
+
37
+ def authenticate_long_credentials
38
+ authenticate_or_request_with_http_basic do |username, password|
39
+ username == '1234567890123456789012345678901234567890' && password == '1234567890123456789012345678901234567890'
40
+ end
41
+ end
42
+ end
43
+
44
+ AUTH_HEADERS = ['HTTP_AUTHORIZATION', 'X-HTTP_AUTHORIZATION', 'X_HTTP_AUTHORIZATION', 'REDIRECT_X_HTTP_AUTHORIZATION']
45
+
46
+ tests DummyController
47
+
48
+ AUTH_HEADERS.each do |header|
49
+ test "successful authentication with #{header.downcase}" do
50
+ @request.env[header] = encode_credentials('lifo', 'world')
51
+ get :index
52
+
53
+ assert_response :success
54
+ assert_equal 'Hello Secret', @response.body, "Authentication failed for request header #{header}"
55
+ end
56
+ test "successful authentication with #{header.downcase} and long credentials" do
57
+ @request.env[header] = encode_credentials('1234567890123456789012345678901234567890', '1234567890123456789012345678901234567890')
58
+ get :show
59
+
60
+ assert_response :success
61
+ assert_equal 'Only for loooooong credentials', @response.body, "Authentication failed for request header #{header} and long credentials"
62
+ end
63
+ end
64
+
65
+ AUTH_HEADERS.each do |header|
66
+ test "unsuccessful authentication with #{header.downcase}" do
67
+ @request.env[header] = encode_credentials('h4x0r', 'world')
68
+ get :index
69
+
70
+ assert_response :unauthorized
71
+ assert_equal "HTTP Basic: Access denied.\n", @response.body, "Authentication didn't fail for request header #{header}"
72
+ end
73
+ test "unsuccessful authentication with #{header.downcase} and long credentials" do
74
+ @request.env[header] = encode_credentials('h4x0rh4x0rh4x0rh4x0rh4x0rh4x0rh4x0rh4x0r', 'worldworldworldworldworldworldworldworld')
75
+ get :show
76
+
77
+ assert_response :unauthorized
78
+ assert_equal "HTTP Basic: Access denied.\n", @response.body, "Authentication didn't fail for request header #{header} and long credentials"
79
+ end
80
+ end
81
+
82
+ test "authentication request without credential" do
83
+ get :display
84
+
85
+ assert_response :unauthorized
86
+ assert_equal "HTTP Basic: Access denied.\n", @response.body
87
+ assert_equal 'Basic realm="SuperSecret"', @response.headers['WWW-Authenticate']
88
+ end
89
+
90
+ test "authentication request with invalid credential" do
91
+ @request.env['HTTP_AUTHORIZATION'] = encode_credentials('pretty', 'foo')
92
+ get :display
93
+
94
+ assert_response :unauthorized
95
+ assert_equal "HTTP Basic: Access denied.\n", @response.body
96
+ assert_equal 'Basic realm="SuperSecret"', @response.headers['WWW-Authenticate']
97
+ end
98
+
99
+ test "authentication request with valid credential" do
100
+ @request.env['HTTP_AUTHORIZATION'] = encode_credentials('pretty', 'please')
101
+ get :display
102
+
103
+ assert_response :success
104
+ assert assigns(:logged_in)
105
+ assert_equal 'Definitely Maybe', @response.body
106
+ end
107
+
108
+ private
109
+
110
+ def encode_credentials(username, password)
111
+ "Basic #{ActiveSupport::Base64.encode64("#{username}:#{password}")}"
112
+ end
113
+ end
@@ -0,0 +1,254 @@
1
+ require 'abstract_unit'
2
+
3
+ class HttpDigestAuthenticationTest < ActionController::TestCase
4
+ class DummyDigestController < ActionController::Base
5
+ before_filter :authenticate, :only => :index
6
+ before_filter :authenticate_with_request, :only => :display
7
+
8
+ USERS = { 'lifo' => 'world', 'pretty' => 'please',
9
+ 'dhh' => ::Digest::MD5::hexdigest(["dhh","SuperSecret","secret"].join(":"))}
10
+
11
+ def index
12
+ render :text => "Hello Secret"
13
+ end
14
+
15
+ def display
16
+ render :text => 'Definitely Maybe'
17
+ end
18
+
19
+ private
20
+
21
+ def authenticate
22
+ authenticate_or_request_with_http_digest("SuperSecret") do |username|
23
+ # Return the password
24
+ USERS[username]
25
+ end
26
+ end
27
+
28
+ def authenticate_with_request
29
+ if authenticate_with_http_digest("SuperSecret") { |username| USERS[username] }
30
+ @logged_in = true
31
+ else
32
+ request_http_digest_authentication("SuperSecret", "Authentication Failed")
33
+ end
34
+ end
35
+ end
36
+
37
+ AUTH_HEADERS = ['HTTP_AUTHORIZATION', 'X-HTTP_AUTHORIZATION', 'X_HTTP_AUTHORIZATION', 'REDIRECT_X_HTTP_AUTHORIZATION']
38
+
39
+ tests DummyDigestController
40
+
41
+ AUTH_HEADERS.each do |header|
42
+ test "successful authentication with #{header.downcase}" do
43
+ @request.env[header] = encode_credentials(:username => 'lifo', :password => 'world')
44
+ get :index
45
+
46
+ assert_response :success
47
+ assert_equal 'Hello Secret', @response.body, "Authentication failed for request header #{header}"
48
+ end
49
+ end
50
+
51
+ AUTH_HEADERS.each do |header|
52
+ test "unsuccessful authentication with #{header.downcase}" do
53
+ @request.env[header] = encode_credentials(:username => 'h4x0r', :password => 'world')
54
+ get :index
55
+
56
+ assert_response :unauthorized
57
+ assert_equal "HTTP Digest: Access denied.\n", @response.body, "Authentication didn't fail for request header #{header}"
58
+ end
59
+ end
60
+
61
+ test "authentication request without credential" do
62
+ get :display
63
+
64
+ assert_response :unauthorized
65
+ assert_equal "Authentication Failed", @response.body
66
+ credentials = decode_credentials(@response.headers['WWW-Authenticate'])
67
+ assert_equal 'SuperSecret', credentials[:realm]
68
+ end
69
+
70
+ test "authentication request with nil credentials" do
71
+ @request.env['HTTP_AUTHORIZATION'] = encode_credentials(:username => nil, :password => nil)
72
+ get :index
73
+
74
+ assert_response :unauthorized
75
+ assert_equal "HTTP Digest: Access denied.\n", @response.body, "Authentication didn't fail for request"
76
+ assert_not_equal 'Hello Secret', @response.body, "Authentication didn't fail for request"
77
+ end
78
+
79
+ test "authentication request with invalid password" do
80
+ @request.env['HTTP_AUTHORIZATION'] = encode_credentials(:username => 'pretty', :password => 'foo')
81
+ get :display
82
+
83
+ assert_response :unauthorized
84
+ assert_equal "Authentication Failed", @response.body
85
+ end
86
+
87
+ test "authentication request with invalid nonce" do
88
+ @request.env['HTTP_AUTHORIZATION'] = encode_credentials(:username => 'pretty', :password => 'please', :nonce => "xxyyzz")
89
+ get :display
90
+
91
+ assert_response :unauthorized
92
+ assert_equal "Authentication Failed", @response.body
93
+ end
94
+
95
+ test "authentication request with missing nonce should return 401" do
96
+ @request.env['HTTP_AUTHORIZATION'] = encode_credentials(:username => 'pretty', :password => 'please', :remove_nonce => true)
97
+ get :display
98
+
99
+ assert_response :unauthorized
100
+ assert_equal "Authentication Failed", @response.body
101
+ end
102
+
103
+ test "authentication request with Basic auth credentials should return 401" do
104
+ ActionController::Base.session_options[:secret] = "session_options_secret"
105
+ @request.env['HTTP_AUTHORIZATION'] = ActionController::HttpAuthentication::Basic.encode_credentials('pretty', 'please')
106
+ get :display
107
+
108
+ assert_response :unauthorized
109
+ assert_equal "Authentication Failed", @response.body
110
+ end
111
+
112
+ test "authentication request with invalid opaque" do
113
+ @request.env['HTTP_AUTHORIZATION'] = encode_credentials(:username => 'pretty', :password => 'foo', :opaque => "xxyyzz")
114
+ get :display
115
+
116
+ assert_response :unauthorized
117
+ assert_equal "Authentication Failed", @response.body
118
+ end
119
+
120
+ test "authentication request with invalid realm" do
121
+ @request.env['HTTP_AUTHORIZATION'] = encode_credentials(:username => 'pretty', :password => 'foo', :realm => "NotSecret")
122
+ get :display
123
+
124
+ assert_response :unauthorized
125
+ assert_equal "Authentication Failed", @response.body
126
+ end
127
+
128
+ test "authentication request with valid credential" do
129
+ @request.env['HTTP_AUTHORIZATION'] = encode_credentials(:username => 'pretty', :password => 'please')
130
+ get :display
131
+
132
+ assert_response :success
133
+ assert assigns(:logged_in)
134
+ assert_equal 'Definitely Maybe', @response.body
135
+ end
136
+
137
+ test "authentication request with valid credential and nil session" do
138
+ @request.env['HTTP_AUTHORIZATION'] = encode_credentials(:username => 'pretty', :password => 'please')
139
+
140
+ # session_id = "" in functional test, but is +nil+ in real life
141
+ @request.session.session_id = nil
142
+ get :display
143
+
144
+ assert_response :success
145
+ assert assigns(:logged_in)
146
+ assert_equal 'Definitely Maybe', @response.body
147
+ end
148
+
149
+ test "authentication request with request-uri that doesn't match credentials digest-uri" do
150
+ @request.env['HTTP_AUTHORIZATION'] = encode_credentials(:username => 'pretty', :password => 'please')
151
+ @request.env['REQUEST_URI'] = "/http_digest_authentication_test/dummy_digest/altered/uri"
152
+ get :display
153
+
154
+ assert_response :unauthorized
155
+ assert_equal "Authentication Failed", @response.body
156
+ end
157
+
158
+ test "authentication request with absolute request uri (as in webrick)" do
159
+ @request.env['HTTP_AUTHORIZATION'] = encode_credentials(:username => 'pretty', :password => 'please')
160
+ @request.env['REQUEST_URI'] = "http://test.host/http_digest_authentication_test/dummy_digest"
161
+
162
+ get :display
163
+
164
+ assert_response :success
165
+ assert assigns(:logged_in)
166
+ assert_equal 'Definitely Maybe', @response.body
167
+ end
168
+
169
+ test "authentication request with absolute uri in credentials (as in IE)" do
170
+ @request.env['HTTP_AUTHORIZATION'] = encode_credentials(:url => "http://test.host/http_digest_authentication_test/dummy_digest",
171
+ :username => 'pretty', :password => 'please')
172
+
173
+ get :display
174
+
175
+ assert_response :success
176
+ assert assigns(:logged_in)
177
+ assert_equal 'Definitely Maybe', @response.body
178
+ end
179
+
180
+ test "authentication request with absolute uri in both request and credentials (as in Webrick with IE)" do
181
+ @request.env['HTTP_AUTHORIZATION'] = encode_credentials(:url => "http://test.host/http_digest_authentication_test/dummy_digest",
182
+ :username => 'pretty', :password => 'please')
183
+ @request.env['REQUEST_URI'] = "http://test.host/http_digest_authentication_test/dummy_digest"
184
+
185
+ get :display
186
+
187
+ assert_response :success
188
+ assert assigns(:logged_in)
189
+ assert_equal 'Definitely Maybe', @response.body
190
+ end
191
+
192
+ test "authentication request with password stored as ha1 digest hash" do
193
+ @request.env['HTTP_AUTHORIZATION'] = encode_credentials(:username => 'dhh',
194
+ :password => ::Digest::MD5::hexdigest(["dhh","SuperSecret","secret"].join(":")),
195
+ :password_is_ha1 => true)
196
+ get :display
197
+
198
+ assert_response :success
199
+ assert assigns(:logged_in)
200
+ assert_equal 'Definitely Maybe', @response.body
201
+ end
202
+
203
+ test "authentication request with _method" do
204
+ @request.env['HTTP_AUTHORIZATION'] = encode_credentials(:username => 'pretty', :password => 'please', :method => :post)
205
+ @request.env['rack.methodoverride.original_method'] = 'POST'
206
+ put :display
207
+
208
+ assert_response :success
209
+ assert assigns(:logged_in)
210
+ assert_equal 'Definitely Maybe', @response.body
211
+ end
212
+
213
+ test "validate_digest_response should fail with nil returning password_procedure" do
214
+ @request.env['HTTP_AUTHORIZATION'] = encode_credentials(:username => nil, :password => nil)
215
+ assert !ActionController::HttpAuthentication::Digest.validate_digest_response(@request, "SuperSecret"){nil}
216
+ end
217
+
218
+ private
219
+
220
+ def encode_credentials(options)
221
+ options.reverse_merge!(:nc => "00000001", :cnonce => "0a4f113b", :password_is_ha1 => false)
222
+ password = options.delete(:password)
223
+
224
+ # Set in /initializers/session_store.rb. Used as secret in generating nonce
225
+ # to prevent tampering of timestamp
226
+ ActionController::Base.session_options[:secret] = "session_options_secret"
227
+
228
+ # Perform unauthenticated request to retrieve digest parameters to use on subsequent request
229
+ method = options.delete(:method) || 'GET'
230
+
231
+ case method.to_s.upcase
232
+ when 'GET'
233
+ get :index
234
+ when 'POST'
235
+ post :index
236
+ end
237
+
238
+ assert_response :unauthorized
239
+
240
+ remove_nonce = options.delete(:remove_nonce)
241
+
242
+ credentials = decode_credentials(@response.headers['WWW-Authenticate'])
243
+ credentials.merge!(options)
244
+ credentials.merge!(:uri => @request.env['REQUEST_URI'].to_s)
245
+
246
+ credentials.delete(:nonce) if remove_nonce
247
+
248
+ ActionController::HttpAuthentication::Digest.encode_credentials(method, credentials, password, options[:password_is_ha1])
249
+ end
250
+
251
+ def decode_credentials(header)
252
+ ActionController::HttpAuthentication::Digest.decode_credentials(@response.headers['WWW-Authenticate'])
253
+ end
254
+ end