actionpack 2.3.18 → 3.0.0.beta
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of actionpack might be problematic. Click here for more details.
- data/CHANGELOG +15 -64
- data/README +39 -48
- data/lib/abstract_controller.rb +22 -0
- data/lib/abstract_controller/base.rb +191 -0
- data/lib/abstract_controller/callbacks.rb +113 -0
- data/lib/abstract_controller/collector.rb +30 -0
- data/lib/abstract_controller/compatibility.rb +18 -0
- data/lib/abstract_controller/helpers.rb +163 -0
- data/lib/abstract_controller/layouts.rb +413 -0
- data/lib/abstract_controller/localized_cache.rb +49 -0
- data/lib/abstract_controller/logger.rb +13 -0
- data/lib/abstract_controller/rendering.rb +238 -0
- data/lib/{action_controller → abstract_controller}/translation.rb +1 -1
- data/lib/action_controller.rb +68 -102
- data/lib/action_controller/base.rb +77 -1409
- data/lib/action_controller/caching.rb +58 -45
- data/lib/action_controller/caching/actions.rb +100 -114
- data/lib/action_controller/caching/fragments.rb +17 -19
- data/lib/action_controller/caching/pages.rb +12 -6
- data/lib/action_controller/caching/sweeping.rb +42 -0
- data/lib/action_controller/deprecated.rb +5 -0
- data/lib/action_controller/deprecated/dispatcher.rb +28 -0
- data/lib/action_controller/deprecated/integration_test.rb +2 -0
- data/lib/action_controller/deprecated/performance_test.rb +1 -0
- data/lib/action_controller/metal.rb +125 -0
- data/lib/action_controller/metal/compatibility.rb +141 -0
- data/lib/action_controller/metal/conditional_get.rb +86 -0
- data/lib/action_controller/metal/configuration.rb +28 -0
- data/lib/action_controller/metal/cookies.rb +17 -0
- data/lib/action_controller/metal/exceptions.rb +46 -0
- data/lib/action_controller/metal/flash.rb +28 -0
- data/lib/action_controller/metal/head.rb +33 -0
- data/lib/action_controller/metal/helpers.rb +116 -0
- data/lib/action_controller/metal/hide_actions.rb +50 -0
- data/lib/action_controller/{http_authentication.rb → metal/http_authentication.rb} +18 -15
- data/lib/action_controller/metal/instrumentation.rb +99 -0
- data/lib/action_controller/metal/mime_responds.rb +300 -0
- data/lib/action_controller/metal/rack_delegation.rb +35 -0
- data/lib/action_controller/metal/redirecting.rb +90 -0
- data/lib/action_controller/metal/renderers.rb +95 -0
- data/lib/action_controller/metal/rendering.rb +69 -0
- data/lib/action_controller/metal/request_forgery_protection.rb +115 -0
- data/lib/action_controller/metal/rescue.rb +13 -0
- data/lib/action_controller/metal/responder.rb +220 -0
- data/lib/action_controller/{session_management.rb → metal/session_management.rb} +5 -14
- data/lib/action_controller/{streaming.rb → metal/streaming.rb} +13 -12
- data/lib/action_controller/metal/testing.rb +42 -0
- data/lib/action_controller/metal/url_for.rb +157 -0
- data/lib/action_controller/{verification.rb → metal/verification.rb} +41 -41
- data/lib/action_controller/middleware.rb +38 -0
- data/lib/action_controller/polymorphic_routes.rb +20 -26
- data/lib/action_controller/railtie.rb +30 -0
- data/lib/action_controller/railties/subscriber.rb +63 -0
- data/lib/action_controller/record_identifier.rb +3 -16
- data/lib/action_controller/test_case.rb +156 -18
- data/lib/action_controller/url_rewriter.rb +47 -200
- data/lib/action_controller/vendor/html-scanner.rb +16 -12
- data/lib/action_controller/vendor/html-scanner/html/node.rb +1 -1
- data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +12 -9
- data/lib/action_dispatch.rb +88 -0
- data/lib/action_dispatch/http/cache.rb +123 -0
- data/lib/action_dispatch/http/filter_parameters.rb +98 -0
- data/lib/{action_controller → action_dispatch/http}/headers.rb +8 -8
- data/lib/action_dispatch/http/mime_negotiation.rb +101 -0
- data/lib/{action_controller → action_dispatch/http}/mime_type.rb +30 -11
- data/lib/{action_controller → action_dispatch/http}/mime_types.rb +5 -3
- data/lib/action_dispatch/http/parameters.rb +49 -0
- data/lib/action_dispatch/http/request.rb +223 -0
- data/lib/action_dispatch/http/response.rb +209 -0
- data/lib/action_dispatch/http/upload.rb +48 -0
- data/lib/action_dispatch/http/url.rb +129 -0
- data/lib/action_dispatch/middleware/callbacks.rb +50 -0
- data/lib/action_dispatch/middleware/cascade.rb +29 -0
- data/lib/action_dispatch/middleware/cookies.rb +216 -0
- data/lib/{action_controller → action_dispatch/middleware}/flash.rb +51 -90
- data/lib/action_dispatch/middleware/head.rb +18 -0
- data/lib/action_dispatch/middleware/params_parser.rb +78 -0
- data/lib/action_dispatch/middleware/rescue.rb +26 -0
- data/lib/action_dispatch/middleware/session/abstract_store.rb +209 -0
- data/lib/{action_controller → action_dispatch/middleware}/session/cookie_store.rb +56 -60
- data/lib/action_dispatch/middleware/session/mem_cache_store.rb +47 -0
- data/lib/action_dispatch/middleware/show_exceptions.rb +173 -0
- data/lib/{action_controller/middleware_stack.rb → action_dispatch/middleware/stack.rb} +23 -13
- data/lib/action_dispatch/middleware/static.rb +44 -0
- data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/_request_and_response.erb +10 -3
- data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/_trace.erb +4 -4
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +10 -0
- data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/layout.erb +2 -2
- data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/missing_template.erb +0 -0
- data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/routing_error.erb +0 -0
- data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/template_error.erb +3 -3
- data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/unknown_action.erb +0 -0
- data/lib/action_dispatch/railtie.rb +15 -0
- data/lib/action_dispatch/routing.rb +217 -0
- data/lib/action_dispatch/routing/deprecated_mapper.rb +877 -0
- data/lib/action_dispatch/routing/mapper.rb +649 -0
- data/lib/action_dispatch/routing/route.rb +55 -0
- data/lib/action_dispatch/routing/route_set.rb +445 -0
- data/lib/action_dispatch/testing/assertions.rb +21 -0
- data/lib/action_dispatch/testing/assertions/dom.rb +37 -0
- data/lib/{action_controller/assertions/model_assertions.rb → action_dispatch/testing/assertions/model.rb} +2 -4
- data/lib/action_dispatch/testing/assertions/response.rb +154 -0
- data/lib/{action_controller/assertions/routing_assertions.rb → action_dispatch/testing/assertions/routing.rb} +72 -34
- data/lib/{action_controller/assertions/selector_assertions.rb → action_dispatch/testing/assertions/selector.rb} +14 -11
- data/lib/{action_controller/assertions/tag_assertions.rb → action_dispatch/testing/assertions/tag.rb} +25 -14
- data/lib/{action_controller → action_dispatch/testing}/integration.rb +173 -406
- data/lib/action_dispatch/testing/performance_test.rb +17 -0
- data/lib/action_dispatch/testing/test_process.rb +42 -0
- data/lib/action_dispatch/testing/test_request.rb +83 -0
- data/lib/action_dispatch/testing/test_response.rb +136 -0
- data/lib/action_pack/version.rb +3 -3
- data/lib/action_view.rb +29 -26
- data/lib/action_view/base.rb +101 -148
- data/lib/action_view/context.rb +44 -0
- data/lib/action_view/helpers.rb +6 -4
- data/lib/action_view/helpers/{active_record_helper.rb → active_model_helper.rb} +63 -63
- data/lib/action_view/helpers/asset_tag_helper.rb +166 -31
- data/lib/action_view/helpers/cache_helper.rb +1 -1
- data/lib/action_view/helpers/capture_helper.rb +40 -8
- data/lib/action_view/helpers/csrf_helper.rb +2 -4
- data/lib/action_view/helpers/date_helper.rb +14 -15
- data/lib/action_view/helpers/form_helper.rb +121 -24
- data/lib/action_view/helpers/form_options_helper.rb +26 -25
- data/lib/action_view/helpers/form_tag_helper.rb +42 -33
- data/lib/action_view/helpers/javascript_helper.rb +1 -109
- data/lib/action_view/helpers/number_helper.rb +4 -1
- data/lib/action_view/helpers/prototype_helper.rb +75 -499
- data/lib/action_view/helpers/raw_output_helper.rb +1 -1
- data/lib/action_view/helpers/record_tag_helper.rb +3 -3
- data/lib/action_view/helpers/sanitize_helper.rb +3 -2
- data/lib/action_view/helpers/scriptaculous_helper.rb +89 -53
- data/lib/action_view/helpers/tag_helper.rb +12 -13
- data/lib/action_view/helpers/text_helper.rb +33 -38
- data/lib/action_view/helpers/translation_helper.rb +11 -35
- data/lib/action_view/helpers/url_helper.rb +140 -134
- data/lib/action_view/locale/en.yml +34 -28
- data/lib/action_view/paths.rb +27 -24
- data/lib/action_view/railtie.rb +17 -0
- data/lib/action_view/railties/subscriber.rb +24 -0
- data/lib/action_view/{partials.rb → render/partials.rb} +161 -51
- data/lib/action_view/render/rendering.rb +117 -0
- data/lib/action_view/template.rb +88 -217
- data/lib/action_view/template/error.rb +105 -0
- data/lib/action_view/template/handler.rb +41 -0
- data/lib/action_view/template/handlers.rb +54 -0
- data/lib/action_view/{template_handlers → template/handlers}/builder.rb +6 -6
- data/lib/action_view/template/handlers/erb.rb +58 -0
- data/lib/action_view/{template_handlers → template/handlers}/rjs.rb +8 -3
- data/lib/action_view/template/resolver.rb +164 -0
- data/lib/action_view/template/text.rb +40 -0
- data/lib/action_view/test_case.rb +18 -18
- metadata +165 -420
- data/RUNNING_UNIT_TESTS +0 -24
- data/Rakefile +0 -158
- data/install.rb +0 -30
- data/lib/action_controller/assertions/dom_assertions.rb +0 -55
- data/lib/action_controller/assertions/response_assertions.rb +0 -169
- data/lib/action_controller/benchmarking.rb +0 -107
- data/lib/action_controller/caching/sweeper.rb +0 -45
- data/lib/action_controller/cgi_ext.rb +0 -15
- data/lib/action_controller/cgi_ext/cookie.rb +0 -112
- data/lib/action_controller/cgi_ext/query_extension.rb +0 -22
- data/lib/action_controller/cgi_ext/stdinput.rb +0 -24
- data/lib/action_controller/cgi_process.rb +0 -77
- data/lib/action_controller/cookies.rb +0 -197
- data/lib/action_controller/dispatcher.rb +0 -133
- data/lib/action_controller/failsafe.rb +0 -87
- data/lib/action_controller/filters.rb +0 -680
- data/lib/action_controller/helpers.rb +0 -225
- data/lib/action_controller/layout.rb +0 -286
- data/lib/action_controller/middlewares.rb +0 -14
- data/lib/action_controller/mime_responds.rb +0 -193
- data/lib/action_controller/params_parser.rb +0 -77
- data/lib/action_controller/performance_test.rb +0 -15
- data/lib/action_controller/rack_lint_patch.rb +0 -36
- data/lib/action_controller/reloader.rb +0 -54
- data/lib/action_controller/request.rb +0 -518
- data/lib/action_controller/request_forgery_protection.rb +0 -116
- data/lib/action_controller/rescue.rb +0 -183
- data/lib/action_controller/resources.rb +0 -682
- data/lib/action_controller/response.rb +0 -237
- data/lib/action_controller/routing.rb +0 -388
- data/lib/action_controller/routing/builder.rb +0 -197
- data/lib/action_controller/routing/optimisations.rb +0 -130
- data/lib/action_controller/routing/recognition_optimisation.rb +0 -167
- data/lib/action_controller/routing/route.rb +0 -265
- data/lib/action_controller/routing/route_set.rb +0 -503
- data/lib/action_controller/routing/routing_ext.rb +0 -49
- data/lib/action_controller/routing/segments.rb +0 -343
- data/lib/action_controller/session/abstract_store.rb +0 -276
- data/lib/action_controller/session/mem_cache_store.rb +0 -60
- data/lib/action_controller/status_codes.rb +0 -88
- data/lib/action_controller/string_coercion.rb +0 -29
- data/lib/action_controller/templates/rescues/diagnostics.erb +0 -11
- data/lib/action_controller/test_process.rb +0 -580
- data/lib/action_controller/uploaded_file.rb +0 -44
- data/lib/action_view/helpers/benchmark_helper.rb +0 -54
- data/lib/action_view/inline_template.rb +0 -19
- data/lib/action_view/reloadable_template.rb +0 -117
- data/lib/action_view/renderable.rb +0 -109
- data/lib/action_view/renderable_partial.rb +0 -53
- data/lib/action_view/template_error.rb +0 -99
- data/lib/action_view/template_handler.rb +0 -34
- data/lib/action_view/template_handlers.rb +0 -48
- data/lib/action_view/template_handlers/erb.rb +0 -25
- data/lib/actionpack.rb +0 -2
- data/test/abstract_unit.rb +0 -78
- data/test/active_record_unit.rb +0 -104
- data/test/activerecord/active_record_store_test.rb +0 -221
- data/test/activerecord/render_partial_with_record_identification_test.rb +0 -188
- data/test/adv_attr_test.rb +0 -20
- data/test/controller/action_pack_assertions_test.rb +0 -545
- data/test/controller/addresses_render_test.rb +0 -37
- data/test/controller/assert_select_test.rb +0 -735
- data/test/controller/base_test.rb +0 -217
- data/test/controller/benchmark_test.rb +0 -32
- data/test/controller/caching_test.rb +0 -743
- data/test/controller/capture_test.rb +0 -66
- data/test/controller/content_type_test.rb +0 -178
- data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
- data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
- data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
- data/test/controller/cookie_test.rb +0 -208
- data/test/controller/deprecation/deprecated_base_methods_test.rb +0 -32
- data/test/controller/dispatcher_test.rb +0 -144
- data/test/controller/dom_assertions_test.rb +0 -53
- data/test/controller/failsafe_test.rb +0 -60
- data/test/controller/fake_controllers.rb +0 -33
- data/test/controller/fake_models.rb +0 -19
- data/test/controller/filter_params_test.rb +0 -52
- data/test/controller/filters_test.rb +0 -885
- data/test/controller/flash_test.rb +0 -174
- data/test/controller/header_test.rb +0 -14
- data/test/controller/helper_test.rb +0 -224
- data/test/controller/html-scanner/cdata_node_test.rb +0 -15
- data/test/controller/html-scanner/document_test.rb +0 -148
- data/test/controller/html-scanner/node_test.rb +0 -89
- data/test/controller/html-scanner/sanitizer_test.rb +0 -300
- data/test/controller/html-scanner/tag_node_test.rb +0 -238
- data/test/controller/html-scanner/text_node_test.rb +0 -50
- data/test/controller/html-scanner/tokenizer_test.rb +0 -131
- data/test/controller/http_basic_authentication_test.rb +0 -113
- data/test/controller/http_digest_authentication_test.rb +0 -254
- data/test/controller/integration_test.rb +0 -526
- data/test/controller/layout_test.rb +0 -215
- data/test/controller/localized_templates_test.rb +0 -24
- data/test/controller/logging_test.rb +0 -46
- data/test/controller/middleware_stack_test.rb +0 -90
- data/test/controller/mime_responds_test.rb +0 -536
- data/test/controller/mime_type_test.rb +0 -93
- data/test/controller/output_escaping_test.rb +0 -19
- data/test/controller/polymorphic_routes_test.rb +0 -297
- data/test/controller/rack_test.rb +0 -308
- data/test/controller/record_identifier_test.rb +0 -139
- data/test/controller/redirect_test.rb +0 -285
- data/test/controller/reloader_test.rb +0 -125
- data/test/controller/render_test.rb +0 -1783
- data/test/controller/request/json_params_parsing_test.rb +0 -65
- data/test/controller/request/multipart_params_parsing_test.rb +0 -177
- data/test/controller/request/query_string_parsing_test.rb +0 -129
- data/test/controller/request/test_request_test.rb +0 -35
- data/test/controller/request/url_encoded_params_parsing_test.rb +0 -146
- data/test/controller/request/xml_params_parsing_test.rb +0 -103
- data/test/controller/request_forgery_protection_test.rb +0 -233
- data/test/controller/request_test.rb +0 -398
- data/test/controller/rescue_test.rb +0 -541
- data/test/controller/resources_test.rb +0 -1393
- data/test/controller/routing_test.rb +0 -2592
- data/test/controller/selector_test.rb +0 -628
- data/test/controller/send_file_test.rb +0 -171
- data/test/controller/session/abstract_store_test.rb +0 -64
- data/test/controller/session/cookie_store_test.rb +0 -354
- data/test/controller/session/mem_cache_store_test.rb +0 -187
- data/test/controller/session/test_session_test.rb +0 -58
- data/test/controller/test_test.rb +0 -700
- data/test/controller/translation_test.rb +0 -26
- data/test/controller/url_rewriter_test.rb +0 -395
- data/test/controller/verification_test.rb +0 -270
- data/test/controller/view_paths_test.rb +0 -141
- data/test/controller/webservice_test.rb +0 -273
- data/test/fixtures/_top_level_partial.html.erb +0 -1
- data/test/fixtures/_top_level_partial_only.erb +0 -1
- data/test/fixtures/addresses/list.erb +0 -1
- data/test/fixtures/alternate_helpers/foo_helper.rb +0 -3
- data/test/fixtures/bad_customers/_bad_customer.html.erb +0 -1
- data/test/fixtures/companies.yml +0 -24
- data/test/fixtures/company.rb +0 -10
- data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +0 -1
- data/test/fixtures/content_type/render_default_for_rhtml.rhtml +0 -1
- data/test/fixtures/content_type/render_default_for_rjs.rjs +0 -1
- data/test/fixtures/content_type/render_default_for_rxml.rxml +0 -1
- data/test/fixtures/customers/_customer.html.erb +0 -1
- data/test/fixtures/db_definitions/sqlite.sql +0 -49
- data/test/fixtures/developer.rb +0 -9
- data/test/fixtures/developers.yml +0 -21
- data/test/fixtures/developers/_developer.erb +0 -1
- data/test/fixtures/developers_projects.yml +0 -13
- data/test/fixtures/failsafe/500.html +0 -1
- data/test/fixtures/fun/games/_game.erb +0 -1
- data/test/fixtures/fun/games/hello_world.erb +0 -1
- data/test/fixtures/fun/serious/games/_game.erb +0 -1
- data/test/fixtures/functional_caching/_partial.erb +0 -3
- data/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +0 -3
- data/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +0 -6
- data/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +0 -5
- data/test/fixtures/functional_caching/fragment_cached.html.erb +0 -2
- data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +0 -1
- data/test/fixtures/functional_caching/inline_fragment_cached.html.erb +0 -2
- data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +0 -1
- data/test/fixtures/good_customers/_good_customer.html.erb +0 -1
- data/test/fixtures/helpers/abc_helper.rb +0 -5
- data/test/fixtures/helpers/fun/games_helper.rb +0 -3
- data/test/fixtures/helpers/fun/pdf_helper.rb +0 -3
- data/test/fixtures/layout_tests/abs_path_layout.rhtml +0 -1
- data/test/fixtures/layout_tests/alt/hello.rhtml +0 -1
- data/test/fixtures/layout_tests/alt/layouts/alt.rhtml +0 -0
- data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +0 -1
- data/test/fixtures/layout_tests/layouts/item.rhtml +0 -1
- data/test/fixtures/layout_tests/layouts/layout_test.rhtml +0 -1
- data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +0 -1
- data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +0 -1
- data/test/fixtures/layout_tests/views/hello.rhtml +0 -1
- data/test/fixtures/layouts/_column.html.erb +0 -2
- data/test/fixtures/layouts/block_with_layout.erb +0 -3
- data/test/fixtures/layouts/builder.builder +0 -3
- data/test/fixtures/layouts/default_html.html.erb +0 -1
- data/test/fixtures/layouts/partial_with_layout.erb +0 -3
- data/test/fixtures/layouts/standard.erb +0 -1
- data/test/fixtures/layouts/talk_from_action.erb +0 -2
- data/test/fixtures/layouts/xhr.html.erb +0 -2
- data/test/fixtures/layouts/yield.erb +0 -2
- data/test/fixtures/localized/hello_world.de.html +0 -1
- data/test/fixtures/localized/hello_world.en.html +0 -1
- data/test/fixtures/mascot.rb +0 -3
- data/test/fixtures/mascots.yml +0 -4
- data/test/fixtures/mascots/_mascot.html.erb +0 -1
- data/test/fixtures/multipart/binary_file +0 -0
- data/test/fixtures/multipart/boundary_problem_file +0 -10
- data/test/fixtures/multipart/bracketed_param +0 -5
- data/test/fixtures/multipart/empty +0 -10
- data/test/fixtures/multipart/hello.txt +0 -1
- data/test/fixtures/multipart/large_text_file +0 -10
- data/test/fixtures/multipart/mixed_files +0 -0
- data/test/fixtures/multipart/mona_lisa.jpg +0 -0
- data/test/fixtures/multipart/none +0 -9
- data/test/fixtures/multipart/single_parameter +0 -5
- data/test/fixtures/multipart/text_file +0 -10
- data/test/fixtures/override/test/hello_world.erb +0 -1
- data/test/fixtures/override2/layouts/test/sub.erb +0 -1
- data/test/fixtures/post_test/layouts/post.html.erb +0 -1
- data/test/fixtures/post_test/layouts/super_post.iphone.erb +0 -1
- data/test/fixtures/post_test/post/index.html.erb +0 -1
- data/test/fixtures/post_test/post/index.iphone.erb +0 -1
- data/test/fixtures/post_test/super_post/index.html.erb +0 -1
- data/test/fixtures/post_test/super_post/index.iphone.erb +0 -1
- data/test/fixtures/project.rb +0 -3
- data/test/fixtures/projects.yml +0 -7
- data/test/fixtures/projects/_project.erb +0 -1
- data/test/fixtures/public/404.html +0 -1
- data/test/fixtures/public/500.da.html +0 -1
- data/test/fixtures/public/500.html +0 -1
- data/test/fixtures/public/absolute/test.css +0 -23
- data/test/fixtures/public/absolute/test.js +0 -63
- data/test/fixtures/public/images/rails.png +0 -0
- data/test/fixtures/public/javascripts/application.js +0 -1
- data/test/fixtures/public/javascripts/bank.js +0 -1
- data/test/fixtures/public/javascripts/controls.js +0 -1
- data/test/fixtures/public/javascripts/dragdrop.js +0 -1
- data/test/fixtures/public/javascripts/effects.js +0 -1
- data/test/fixtures/public/javascripts/prototype.js +0 -1
- data/test/fixtures/public/javascripts/robber.js +0 -1
- data/test/fixtures/public/javascripts/subdir/subdir.js +0 -1
- data/test/fixtures/public/javascripts/version.1.0.js +0 -1
- data/test/fixtures/public/stylesheets/bank.css +0 -1
- data/test/fixtures/public/stylesheets/robber.css +0 -1
- data/test/fixtures/public/stylesheets/subdir/subdir.css +0 -1
- data/test/fixtures/public/stylesheets/version.1.0.css +0 -1
- data/test/fixtures/quiz/questions/_question.html.erb +0 -1
- data/test/fixtures/replies.yml +0 -15
- data/test/fixtures/replies/_reply.erb +0 -1
- data/test/fixtures/reply.rb +0 -7
- data/test/fixtures/respond_to/all_types_with_layout.html.erb +0 -1
- data/test/fixtures/respond_to/all_types_with_layout.js.rjs +0 -1
- data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +0 -1
- data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +0 -1
- data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +0 -1
- data/test/fixtures/respond_to/layouts/missing.html.erb +0 -1
- data/test/fixtures/respond_to/layouts/standard.html.erb +0 -1
- data/test/fixtures/respond_to/layouts/standard.iphone.erb +0 -1
- data/test/fixtures/respond_to/using_defaults.html.erb +0 -1
- data/test/fixtures/respond_to/using_defaults.js.rjs +0 -1
- data/test/fixtures/respond_to/using_defaults.xml.builder +0 -1
- data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +0 -1
- data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +0 -1
- data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +0 -1
- data/test/fixtures/scope/test/modgreet.erb +0 -1
- data/test/fixtures/session_autoload_test/session_autoload_test/foo.rb +0 -10
- data/test/fixtures/shared.html.erb +0 -1
- data/test/fixtures/symlink_parent/symlinked_layout.erb +0 -5
- data/test/fixtures/test/_counter.html.erb +0 -1
- data/test/fixtures/test/_customer.erb +0 -1
- data/test/fixtures/test/_customer_counter.erb +0 -1
- data/test/fixtures/test/_customer_counter_with_as.erb +0 -1
- data/test/fixtures/test/_customer_greeting.erb +0 -1
- data/test/fixtures/test/_customer_with_var.erb +0 -1
- data/test/fixtures/test/_form.erb +0 -1
- data/test/fixtures/test/_from_helper.erb +0 -1
- data/test/fixtures/test/_hash_greeting.erb +0 -1
- data/test/fixtures/test/_hash_object.erb +0 -2
- data/test/fixtures/test/_hello.builder +0 -1
- data/test/fixtures/test/_labelling_form.erb +0 -1
- data/test/fixtures/test/_layout_for_block_with_args.html.erb +0 -3
- data/test/fixtures/test/_layout_for_partial.html.erb +0 -3
- data/test/fixtures/test/_local_inspector.html.erb +0 -1
- data/test/fixtures/test/_one.html.erb +0 -1
- data/test/fixtures/test/_partial.erb +0 -1
- data/test/fixtures/test/_partial.html.erb +0 -1
- data/test/fixtures/test/_partial.js.erb +0 -1
- data/test/fixtures/test/_partial_for_use_in_layout.html.erb +0 -1
- data/test/fixtures/test/_partial_only.erb +0 -1
- data/test/fixtures/test/_partial_with_only_html_version.html.erb +0 -1
- data/test/fixtures/test/_person.erb +0 -2
- data/test/fixtures/test/_raise.html.erb +0 -1
- data/test/fixtures/test/_two.html.erb +0 -1
- data/test/fixtures/test/_utf8_partial.html.erb +0 -1
- data/test/fixtures/test/_utf8_partial_magic.html.erb +0 -2
- data/test/fixtures/test/action_talk_to_layout.erb +0 -2
- data/test/fixtures/test/array_translation.erb +0 -1
- data/test/fixtures/test/calling_partial_with_layout.html.erb +0 -1
- data/test/fixtures/test/capturing.erb +0 -4
- data/test/fixtures/test/content_for.erb +0 -2
- data/test/fixtures/test/content_for_concatenated.erb +0 -3
- data/test/fixtures/test/content_for_with_parameter.erb +0 -2
- data/test/fixtures/test/delete_with_js.rjs +0 -2
- data/test/fixtures/test/dont_pick_me +0 -1
- data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +0 -1
- data/test/fixtures/test/enum_rjs_test.rjs +0 -6
- data/test/fixtures/test/formatted_html_erb.html.erb +0 -1
- data/test/fixtures/test/formatted_xml_erb.builder +0 -1
- data/test/fixtures/test/formatted_xml_erb.html.erb +0 -1
- data/test/fixtures/test/formatted_xml_erb.xml.erb +0 -1
- data/test/fixtures/test/greeting.erb +0 -1
- data/test/fixtures/test/greeting.js.rjs +0 -1
- data/test/fixtures/test/hello.builder +0 -4
- data/test/fixtures/test/hello_world.da.html.erb +0 -1
- data/test/fixtures/test/hello_world.erb +0 -1
- data/test/fixtures/test/hello_world.erb~ +0 -1
- data/test/fixtures/test/hello_world.pt-BR.html.erb +0 -1
- data/test/fixtures/test/hello_world_container.builder +0 -3
- data/test/fixtures/test/hello_world_from_rxml.builder +0 -4
- data/test/fixtures/test/hello_world_with_layout_false.erb +0 -1
- data/test/fixtures/test/hello_xml_world.builder +0 -11
- data/test/fixtures/test/hyphen-ated.erb +0 -1
- data/test/fixtures/test/implicit_content_type.atom.builder +0 -2
- data/test/fixtures/test/list.erb +0 -1
- data/test/fixtures/test/malformed/malformed.en.html.erb~ +0 -1
- data/test/fixtures/test/malformed/malformed.erb~ +0 -1
- data/test/fixtures/test/malformed/malformed.html.erb~ +0 -1
- data/test/fixtures/test/nested_layout.erb +0 -3
- data/test/fixtures/test/non_erb_block_content_for.builder +0 -4
- data/test/fixtures/test/potential_conflicts.erb +0 -4
- data/test/fixtures/test/render_explicit_html_template.js.rjs +0 -1
- data/test/fixtures/test/render_file_from_template.html.erb +0 -1
- data/test/fixtures/test/render_file_with_ivar.erb +0 -1
- data/test/fixtures/test/render_file_with_locals.erb +0 -1
- data/test/fixtures/test/render_implicit_html_template.js.rjs +0 -1
- data/test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb +0 -1
- data/test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb +0 -1
- data/test/fixtures/test/render_implicit_js_template_without_layout.js.erb +0 -1
- data/test/fixtures/test/render_to_string_test.erb +0 -1
- data/test/fixtures/test/scoped_array_translation.erb +0 -1
- data/test/fixtures/test/sub_template_raise.html.erb +0 -1
- data/test/fixtures/test/template.erb +0 -1
- data/test/fixtures/test/translation.erb +0 -1
- data/test/fixtures/test/update_element_with_capture.erb +0 -9
- data/test/fixtures/test/using_layout_around_block.html.erb +0 -1
- data/test/fixtures/test/using_layout_around_block_with_args.html.erb +0 -1
- data/test/fixtures/test/utf8.html.erb +0 -4
- data/test/fixtures/test/utf8_magic.html.erb +0 -5
- data/test/fixtures/test/utf8_magic_with_bare_partial.html.erb +0 -5
- data/test/fixtures/topic.rb +0 -3
- data/test/fixtures/topics.yml +0 -22
- data/test/fixtures/topics/_topic.html.erb +0 -1
- data/test/template/active_record_helper_i18n_test.rb +0 -51
- data/test/template/active_record_helper_test.rb +0 -302
- data/test/template/asset_tag_helper_test.rb +0 -770
- data/test/template/atom_feed_helper_test.rb +0 -315
- data/test/template/benchmark_helper_test.rb +0 -86
- data/test/template/compiled_templates_test.rb +0 -204
- data/test/template/date_helper_i18n_test.rb +0 -121
- data/test/template/date_helper_test.rb +0 -2603
- data/test/template/erb_util_test.rb +0 -36
- data/test/template/form_helper_test.rb +0 -1447
- data/test/template/form_options_helper_i18n_test.rb +0 -27
- data/test/template/form_options_helper_test.rb +0 -811
- data/test/template/form_tag_helper_test.rb +0 -356
- data/test/template/javascript_helper_test.rb +0 -106
- data/test/template/number_helper_i18n_test.rb +0 -69
- data/test/template/number_helper_test.rb +0 -132
- data/test/template/prototype_helper_test.rb +0 -639
- data/test/template/raw_output_helper_test.rb +0 -21
- data/test/template/record_tag_helper_test.rb +0 -58
- data/test/template/render_test.rb +0 -329
- data/test/template/sanitize_helper_test.rb +0 -57
- data/test/template/scriptaculous_helper_test.rb +0 -90
- data/test/template/tag_helper_test.rb +0 -98
- data/test/template/template_test.rb +0 -32
- data/test/template/test_test.rb +0 -54
- data/test/template/text_helper_test.rb +0 -601
- data/test/template/translation_helper_test.rb +0 -95
- data/test/template/url_helper_test.rb +0 -641
- data/test/testing_sandbox.rb +0 -15
- data/test/view/test_case_test.rb +0 -176
@@ -0,0 +1,48 @@
|
|
1
|
+
module ActionDispatch
|
2
|
+
module Http
|
3
|
+
module UploadedFile
|
4
|
+
def self.extended(object)
|
5
|
+
object.class_eval do
|
6
|
+
attr_accessor :original_path, :content_type
|
7
|
+
alias_method :local_path, :path if method_defined?(:path)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
# Take the basename of the upload's original filename.
|
12
|
+
# This handles the full Windows paths given by Internet Explorer
|
13
|
+
# (and perhaps other broken user agents) without affecting
|
14
|
+
# those which give the lone filename.
|
15
|
+
# The Windows regexp is adapted from Perl's File::Basename.
|
16
|
+
def original_filename
|
17
|
+
unless defined? @original_filename
|
18
|
+
@original_filename =
|
19
|
+
unless original_path.blank?
|
20
|
+
if original_path =~ /^(?:.*[:\\\/])?(.*)/m
|
21
|
+
$1
|
22
|
+
else
|
23
|
+
File.basename original_path
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
@original_filename
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
module Upload
|
32
|
+
# Convert nested Hashs to HashWithIndifferentAccess and replace
|
33
|
+
# file upload hashs with UploadedFile objects
|
34
|
+
def normalize_parameters(value)
|
35
|
+
if Hash === value && value.has_key?(:tempfile)
|
36
|
+
upload = value[:tempfile]
|
37
|
+
upload.extend(UploadedFile)
|
38
|
+
upload.original_path = value[:filename]
|
39
|
+
upload.content_type = value[:type]
|
40
|
+
upload
|
41
|
+
else
|
42
|
+
super
|
43
|
+
end
|
44
|
+
end
|
45
|
+
private :normalize_parameters
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
module ActionDispatch
|
2
|
+
module Http
|
3
|
+
module URL
|
4
|
+
# Returns the complete URL used for this request.
|
5
|
+
def url
|
6
|
+
protocol + host_with_port + request_uri
|
7
|
+
end
|
8
|
+
|
9
|
+
# Returns 'https://' if this is an SSL request and 'http://' otherwise.
|
10
|
+
def protocol
|
11
|
+
ssl? ? 'https://' : 'http://'
|
12
|
+
end
|
13
|
+
|
14
|
+
# Is this an SSL request?
|
15
|
+
def ssl?
|
16
|
+
@env['HTTPS'] == 'on' || @env['HTTP_X_FORWARDED_PROTO'] == 'https'
|
17
|
+
end
|
18
|
+
|
19
|
+
# Returns the \host for this request, such as "example.com".
|
20
|
+
def raw_host_with_port
|
21
|
+
if forwarded = env["HTTP_X_FORWARDED_HOST"]
|
22
|
+
forwarded.split(/,\s?/).last
|
23
|
+
else
|
24
|
+
env['HTTP_HOST'] || "#{env['SERVER_NAME'] || env['SERVER_ADDR']}:#{env['SERVER_PORT']}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Returns the host for this request, such as example.com.
|
29
|
+
def host
|
30
|
+
raw_host_with_port.sub(/:\d+$/, '')
|
31
|
+
end
|
32
|
+
|
33
|
+
# Returns a \host:\port string for this request, such as "example.com" or
|
34
|
+
# "example.com:8080".
|
35
|
+
def host_with_port
|
36
|
+
"#{host}#{port_string}"
|
37
|
+
end
|
38
|
+
|
39
|
+
# Returns the port number of this request as an integer.
|
40
|
+
def port
|
41
|
+
if raw_host_with_port =~ /:(\d+)$/
|
42
|
+
$1.to_i
|
43
|
+
else
|
44
|
+
standard_port
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Returns the standard \port number for this request's protocol.
|
49
|
+
def standard_port
|
50
|
+
case protocol
|
51
|
+
when 'https://' then 443
|
52
|
+
else 80
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# Returns a \port suffix like ":8080" if the \port number of this request
|
57
|
+
# is not the default HTTP \port 80 or HTTPS \port 443.
|
58
|
+
def port_string
|
59
|
+
port == standard_port ? '' : ":#{port}"
|
60
|
+
end
|
61
|
+
|
62
|
+
def server_port
|
63
|
+
@env['SERVER_PORT'].to_i
|
64
|
+
end
|
65
|
+
|
66
|
+
# Returns the \domain part of a \host, such as "rubyonrails.org" in "www.rubyonrails.org". You can specify
|
67
|
+
# a different <tt>tld_length</tt>, such as 2 to catch rubyonrails.co.uk in "www.rubyonrails.co.uk".
|
68
|
+
def domain(tld_length = 1)
|
69
|
+
return nil unless named_host?(host)
|
70
|
+
|
71
|
+
host.split('.').last(1 + tld_length).join('.')
|
72
|
+
end
|
73
|
+
|
74
|
+
# Returns all the \subdomains as an array, so <tt>["dev", "www"]</tt> would be
|
75
|
+
# returned for "dev.www.rubyonrails.org". You can specify a different <tt>tld_length</tt>,
|
76
|
+
# such as 2 to catch <tt>["www"]</tt> instead of <tt>["www", "rubyonrails"]</tt>
|
77
|
+
# in "www.rubyonrails.co.uk".
|
78
|
+
def subdomains(tld_length = 1)
|
79
|
+
return [] unless named_host?(host)
|
80
|
+
parts = host.split('.')
|
81
|
+
parts[0..-(tld_length+2)]
|
82
|
+
end
|
83
|
+
|
84
|
+
# Returns the query string, accounting for server idiosyncrasies.
|
85
|
+
def query_string
|
86
|
+
@env['QUERY_STRING'].present? ? @env['QUERY_STRING'] : (@env['REQUEST_URI'].to_s.split('?', 2)[1] || '')
|
87
|
+
end
|
88
|
+
|
89
|
+
# Returns the request URI, accounting for server idiosyncrasies.
|
90
|
+
# WEBrick includes the full URL. IIS leaves REQUEST_URI blank.
|
91
|
+
def request_uri
|
92
|
+
if uri = @env['REQUEST_URI']
|
93
|
+
# Remove domain, which webrick puts into the request_uri.
|
94
|
+
(%r{^\w+\://[^/]+(/.*|$)$} =~ uri) ? $1 : uri
|
95
|
+
else
|
96
|
+
# Construct IIS missing REQUEST_URI from SCRIPT_NAME and PATH_INFO.
|
97
|
+
uri = @env['PATH_INFO'].to_s
|
98
|
+
|
99
|
+
if script_filename = @env['SCRIPT_NAME'].to_s.match(%r{[^/]+$})
|
100
|
+
uri = uri.sub(/#{script_filename}\//, '')
|
101
|
+
end
|
102
|
+
|
103
|
+
env_qs = @env['QUERY_STRING'].to_s
|
104
|
+
uri += "?#{env_qs}" unless env_qs.empty?
|
105
|
+
|
106
|
+
if uri.blank?
|
107
|
+
@env.delete('REQUEST_URI')
|
108
|
+
else
|
109
|
+
@env['REQUEST_URI'] = uri
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
# Returns the interpreted \path to requested resource after all the installation
|
115
|
+
# directory of this application was taken into account.
|
116
|
+
def path
|
117
|
+
path = request_uri.to_s[/\A[^\?]*/]
|
118
|
+
path.sub!(/\A#{ActionController::Base.relative_url_root}/, '')
|
119
|
+
path
|
120
|
+
end
|
121
|
+
|
122
|
+
private
|
123
|
+
|
124
|
+
def named_host?(host)
|
125
|
+
!(host.nil? || /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.match(host))
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module ActionDispatch
|
2
|
+
# Provide callbacks to be executed before and after the request dispatch.
|
3
|
+
#
|
4
|
+
# It also provides a to_prepare callback, which is performed in all requests
|
5
|
+
# in development by only once in production and notification callback for async
|
6
|
+
# operations.
|
7
|
+
#
|
8
|
+
class Callbacks
|
9
|
+
include ActiveSupport::Callbacks
|
10
|
+
|
11
|
+
define_callbacks :call, :terminator => "result == false", :rescuable => true
|
12
|
+
define_callbacks :prepare, :scope => :name
|
13
|
+
|
14
|
+
# Add a preparation callback. Preparation callbacks are run before every
|
15
|
+
# request in development mode, and before the first request in production mode.
|
16
|
+
#
|
17
|
+
# If a symbol with a block is given, the symbol is used as an identifier.
|
18
|
+
# That allows to_prepare to be called again with the same identifier to
|
19
|
+
# replace the existing callback. Passing an identifier is a suggested
|
20
|
+
# practice if the code adding a preparation block may be reloaded.
|
21
|
+
def self.to_prepare(*args, &block)
|
22
|
+
if args.first.is_a?(Symbol) && block_given?
|
23
|
+
define_method :"__#{args.first}", &block
|
24
|
+
set_callback(:prepare, :"__#{args.first}")
|
25
|
+
else
|
26
|
+
set_callback(:prepare, *args, &block)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.before(*args, &block)
|
31
|
+
set_callback(:call, :before, *args, &block)
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.after(*args, &block)
|
35
|
+
set_callback(:call, :after, *args, &block)
|
36
|
+
end
|
37
|
+
|
38
|
+
def initialize(app, prepare_each_request = false)
|
39
|
+
@app, @prepare_each_request = app, prepare_each_request
|
40
|
+
run_callbacks(:prepare) unless @prepare_each_request
|
41
|
+
end
|
42
|
+
|
43
|
+
def call(env)
|
44
|
+
run_callbacks(:call) do
|
45
|
+
run_callbacks(:prepare) if @prepare_each_request
|
46
|
+
@app.call(env)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module ActionDispatch
|
2
|
+
class Cascade
|
3
|
+
def self.new(*apps)
|
4
|
+
apps = apps.flatten
|
5
|
+
|
6
|
+
case apps.length
|
7
|
+
when 0
|
8
|
+
raise ArgumentError, "app is required"
|
9
|
+
when 1
|
10
|
+
apps.first
|
11
|
+
else
|
12
|
+
super(apps)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize(apps)
|
17
|
+
@apps = apps
|
18
|
+
end
|
19
|
+
|
20
|
+
def call(env)
|
21
|
+
result = nil
|
22
|
+
@apps.each do |app|
|
23
|
+
result = app.call(env)
|
24
|
+
break unless result[1]["X-Cascade"] == "pass"
|
25
|
+
end
|
26
|
+
result
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,216 @@
|
|
1
|
+
module ActionDispatch
|
2
|
+
class Request
|
3
|
+
def cookie_jar
|
4
|
+
env['action_dispatch.cookies'] ||= Cookies::CookieJar.build(self)
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
# Cookies are read and written through ActionController#cookies.
|
9
|
+
#
|
10
|
+
# The cookies being read are the ones received along with the request, the cookies
|
11
|
+
# being written will be sent out with the response. Reading a cookie does not get
|
12
|
+
# the cookie object itself back, just the value it holds.
|
13
|
+
#
|
14
|
+
# Examples for writing:
|
15
|
+
#
|
16
|
+
# # Sets a simple session cookie.
|
17
|
+
# cookies[:user_name] = "david"
|
18
|
+
#
|
19
|
+
# # Sets a cookie that expires in 1 hour.
|
20
|
+
# cookies[:login] = { :value => "XJ-122", :expires => 1.hour.from_now }
|
21
|
+
#
|
22
|
+
# Examples for reading:
|
23
|
+
#
|
24
|
+
# cookies[:user_name] # => "david"
|
25
|
+
# cookies.size # => 2
|
26
|
+
#
|
27
|
+
# Example for deleting:
|
28
|
+
#
|
29
|
+
# cookies.delete :user_name
|
30
|
+
#
|
31
|
+
# Please note that if you specify a :domain when setting a cookie, you must also specify the domain when deleting the cookie:
|
32
|
+
#
|
33
|
+
# cookies[:key] = {
|
34
|
+
# :value => 'a yummy cookie',
|
35
|
+
# :expires => 1.year.from_now,
|
36
|
+
# :domain => 'domain.com'
|
37
|
+
# }
|
38
|
+
#
|
39
|
+
# cookies.delete(:key, :domain => 'domain.com')
|
40
|
+
#
|
41
|
+
# The option symbols for setting cookies are:
|
42
|
+
#
|
43
|
+
# * <tt>:value</tt> - The cookie's value or list of values (as an array).
|
44
|
+
# * <tt>:path</tt> - The path for which this cookie applies. Defaults to the root
|
45
|
+
# of the application.
|
46
|
+
# * <tt>:domain</tt> - The domain for which this cookie applies.
|
47
|
+
# * <tt>:expires</tt> - The time at which this cookie expires, as a Time object.
|
48
|
+
# * <tt>:secure</tt> - Whether this cookie is a only transmitted to HTTPS servers.
|
49
|
+
# Default is +false+.
|
50
|
+
# * <tt>:httponly</tt> - Whether this cookie is accessible via scripting or
|
51
|
+
# only HTTP. Defaults to +false+.
|
52
|
+
class Cookies
|
53
|
+
class CookieJar < Hash #:nodoc:
|
54
|
+
def self.build(request)
|
55
|
+
new.tap do |hash|
|
56
|
+
hash.update(request.cookies)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def initialize
|
61
|
+
@set_cookies = {}
|
62
|
+
@delete_cookies = {}
|
63
|
+
|
64
|
+
super
|
65
|
+
end
|
66
|
+
|
67
|
+
# Returns the value of the cookie by +name+, or +nil+ if no such cookie exists.
|
68
|
+
def [](name)
|
69
|
+
super(name.to_s)
|
70
|
+
end
|
71
|
+
|
72
|
+
# Sets the cookie named +name+. The second argument may be the very cookie
|
73
|
+
# value, or a hash of options as documented above.
|
74
|
+
def []=(key, options)
|
75
|
+
if options.is_a?(Hash)
|
76
|
+
options.symbolize_keys!
|
77
|
+
value = options[:value]
|
78
|
+
else
|
79
|
+
value = options
|
80
|
+
options = { :value => value }
|
81
|
+
end
|
82
|
+
|
83
|
+
value = super(key.to_s, value)
|
84
|
+
|
85
|
+
options[:path] ||= "/"
|
86
|
+
@set_cookies[key] = options
|
87
|
+
value
|
88
|
+
end
|
89
|
+
|
90
|
+
# Removes the cookie on the client machine by setting the value to an empty string
|
91
|
+
# and setting its expiration date into the past. Like <tt>[]=</tt>, you can pass in
|
92
|
+
# an options hash to delete cookies with extra data such as a <tt>:path</tt>.
|
93
|
+
def delete(key, options = {})
|
94
|
+
options.symbolize_keys!
|
95
|
+
options[:path] ||= "/"
|
96
|
+
value = super(key.to_s)
|
97
|
+
@delete_cookies[key] = options
|
98
|
+
value
|
99
|
+
end
|
100
|
+
|
101
|
+
# Returns a jar that'll automatically set the assigned cookies to have an expiration date 20 years from now. Example:
|
102
|
+
#
|
103
|
+
# cookies.permanent[:prefers_open_id] = true
|
104
|
+
# # => Set-Cookie: prefers_open_id=true; path=/; expires=Sun, 16-Dec-2029 03:24:16 GMT
|
105
|
+
#
|
106
|
+
# This jar is only meant for writing. You'll read permanent cookies through the regular accessor.
|
107
|
+
#
|
108
|
+
# This jar allows chaining with the signed jar as well, so you can set permanent, signed cookies. Examples:
|
109
|
+
#
|
110
|
+
# cookies.permanent.signed[:remember_me] = current_user.id
|
111
|
+
# # => Set-Cookie: discount=BAhU--848956038e692d7046deab32b7131856ab20e14e; path=/; expires=Sun, 16-Dec-2029 03:24:16 GMT
|
112
|
+
def permanent
|
113
|
+
@permanent ||= PermanentCookieJar.new(self)
|
114
|
+
end
|
115
|
+
|
116
|
+
# Returns a jar that'll automatically generate a signed representation of cookie value and verify it when reading from
|
117
|
+
# the cookie again. This is useful for creating cookies with values that the user is not supposed to change. If a signed
|
118
|
+
# cookie was tampered with by the user (or a 3rd party), an ActiveSupport::MessageVerifier::InvalidSignature exception will
|
119
|
+
# be raised.
|
120
|
+
#
|
121
|
+
# This jar requires that you set a suitable secret for the verification on ActionController::Base.cookie_verifier_secret.
|
122
|
+
#
|
123
|
+
# Example:
|
124
|
+
#
|
125
|
+
# cookies.signed[:discount] = 45
|
126
|
+
# # => Set-Cookie: discount=BAhpMg==--2c1c6906c90a3bc4fd54a51ffb41dffa4bf6b5f7; path=/
|
127
|
+
#
|
128
|
+
# cookies.signed[:discount] # => 45
|
129
|
+
def signed
|
130
|
+
@signed ||= SignedCookieJar.new(self)
|
131
|
+
end
|
132
|
+
|
133
|
+
def write(response)
|
134
|
+
@set_cookies.each { |k, v| response.set_cookie(k, v) }
|
135
|
+
@delete_cookies.each { |k, v| response.delete_cookie(k, v) }
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
class PermanentCookieJar < CookieJar #:nodoc:
|
140
|
+
def initialize(parent_jar)
|
141
|
+
@parent_jar = parent_jar
|
142
|
+
end
|
143
|
+
|
144
|
+
def []=(key, options)
|
145
|
+
if options.is_a?(Hash)
|
146
|
+
options.symbolize_keys!
|
147
|
+
else
|
148
|
+
options = { :value => options }
|
149
|
+
end
|
150
|
+
|
151
|
+
options[:expires] = 20.years.from_now
|
152
|
+
@parent_jar[key] = options
|
153
|
+
end
|
154
|
+
|
155
|
+
def signed
|
156
|
+
@signed ||= SignedCookieJar.new(self)
|
157
|
+
end
|
158
|
+
|
159
|
+
def controller
|
160
|
+
@parent_jar.controller
|
161
|
+
end
|
162
|
+
|
163
|
+
def method_missing(method, *arguments, &block)
|
164
|
+
@parent_jar.send(method, *arguments, &block)
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
class SignedCookieJar < CookieJar #:nodoc:
|
169
|
+
def initialize(parent_jar)
|
170
|
+
unless ActionController::Base.cookie_verifier_secret
|
171
|
+
raise "You must set ActionController::Base.cookie_verifier_secret to use signed cookies"
|
172
|
+
end
|
173
|
+
|
174
|
+
@parent_jar = parent_jar
|
175
|
+
@verifier = ActiveSupport::MessageVerifier.new(ActionController::Base.cookie_verifier_secret)
|
176
|
+
end
|
177
|
+
|
178
|
+
def [](name)
|
179
|
+
if value = @parent_jar[name]
|
180
|
+
@verifier.verify(value)
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
def []=(key, options)
|
185
|
+
if options.is_a?(Hash)
|
186
|
+
options.symbolize_keys!
|
187
|
+
options[:value] = @verifier.generate(options[:value])
|
188
|
+
else
|
189
|
+
options = { :value => @verifier.generate(options) }
|
190
|
+
end
|
191
|
+
|
192
|
+
@parent_jar[key] = options
|
193
|
+
end
|
194
|
+
|
195
|
+
def method_missing(method, *arguments, &block)
|
196
|
+
@parent_jar.send(method, *arguments, &block)
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
def initialize(app)
|
201
|
+
@app = app
|
202
|
+
end
|
203
|
+
|
204
|
+
def call(env)
|
205
|
+
status, headers, body = @app.call(env)
|
206
|
+
|
207
|
+
if cookie_jar = env['action_dispatch.cookies']
|
208
|
+
response = Rack::Response.new(body, status, headers)
|
209
|
+
cookie_jar.write(response)
|
210
|
+
response.to_a
|
211
|
+
else
|
212
|
+
[status, headers, body]
|
213
|
+
end
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|