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
@@ -1,16 +1,20 @@
|
|
1
1
|
$LOAD_PATH << "#{File.dirname(__FILE__)}/html-scanner"
|
2
2
|
|
3
3
|
module HTML
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
4
|
+
extend ActiveSupport::Autoload
|
5
|
+
|
6
|
+
eager_autoload do
|
7
|
+
autoload :CDATA, 'html/node'
|
8
|
+
autoload :Document, 'html/document'
|
9
|
+
autoload :FullSanitizer, 'html/sanitizer'
|
10
|
+
autoload :LinkSanitizer, 'html/sanitizer'
|
11
|
+
autoload :Node, 'html/node'
|
12
|
+
autoload :Sanitizer, 'html/sanitizer'
|
13
|
+
autoload :Selector, 'html/selector'
|
14
|
+
autoload :Tag, 'html/node'
|
15
|
+
autoload :Text, 'html/node'
|
16
|
+
autoload :Tokenizer, 'html/tokenizer'
|
17
|
+
autoload :Version, 'html/version'
|
18
|
+
autoload :WhiteListSanitizer, 'html/sanitizer'
|
19
|
+
end
|
16
20
|
end
|
@@ -162,7 +162,7 @@ module HTML #:nodoc:
|
|
162
162
|
end
|
163
163
|
|
164
164
|
closing = ( scanner.scan(/\//) ? :close : nil )
|
165
|
-
return Text.new(parent, line, pos, content) unless name = scanner.scan(/[
|
165
|
+
return Text.new(parent, line, pos, content) unless name = scanner.scan(/[\w:-]+/)
|
166
166
|
name.downcase!
|
167
167
|
|
168
168
|
unless closing
|
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'set'
|
2
|
+
require 'active_support/core_ext/class/inheritable_attributes'
|
3
|
+
|
1
4
|
module HTML
|
2
5
|
class Sanitizer
|
3
6
|
def sanitize(text, options = {})
|
@@ -62,8 +65,8 @@ module HTML
|
|
62
65
|
|
63
66
|
# A regular expression of the valid characters used to separate protocols like
|
64
67
|
# the ':' in 'http://foo.com'
|
65
|
-
self.protocol_separator = /:|(�*58)|(p)|(
|
66
|
-
|
68
|
+
self.protocol_separator = /:|(�*58)|(p)|(%|%)3A/
|
69
|
+
|
67
70
|
# Specifies a Set of HTML attributes that can have URIs.
|
68
71
|
self.uri_attributes = Set.new(%w(href src cite action longdesc xlink:href lowsrc))
|
69
72
|
|
@@ -73,7 +76,7 @@ module HTML
|
|
73
76
|
|
74
77
|
# Specifies the default Set of tags that the #sanitize helper will allow unscathed.
|
75
78
|
self.allowed_tags = Set.new(%w(strong em b i p code pre tt samp kbd var sub
|
76
|
-
sup dfn cite big small address hr br div span h1 h2 h3 h4 h5 h6 ul ol li dt dd abbr
|
79
|
+
sup dfn cite big small address hr br div span h1 h2 h3 h4 h5 h6 ul ol li dl dt dd abbr
|
77
80
|
acronym a img blockquote del ins))
|
78
81
|
|
79
82
|
# Specifies the default Set of html attributes that the #sanitize helper will leave
|
@@ -106,8 +109,8 @@ module HTML
|
|
106
109
|
style = style.to_s.gsub(/url\s*\(\s*[^\s)]+?\s*\)\s*/, ' ')
|
107
110
|
|
108
111
|
# gauntlet
|
109
|
-
if style !~
|
110
|
-
style !~
|
112
|
+
if style !~ /^([:,;#%.\sa-zA-Z0-9!]|\w-\w|\'[\s\w]+\'|\"[\s\w]+\"|\([\d,\s]+\))*$/ ||
|
113
|
+
style !~ /^(\s*[-\w]+\s*:\s*[^:;]*(;|$)\s*)*$/
|
111
114
|
return ''
|
112
115
|
end
|
113
116
|
|
@@ -117,8 +120,8 @@ module HTML
|
|
117
120
|
clean << prop + ': ' + val + ';'
|
118
121
|
elsif shorthand_css_properties.include?(prop.split('-')[0].downcase)
|
119
122
|
unless val.split().any? do |keyword|
|
120
|
-
!allowed_css_keywords.include?(keyword) &&
|
121
|
-
keyword !~
|
123
|
+
!allowed_css_keywords.include?(keyword) &&
|
124
|
+
keyword !~ /^(#[0-9a-f]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$/
|
122
125
|
end
|
123
126
|
clean << prop + ': ' + val + ';'
|
124
127
|
end
|
@@ -166,8 +169,8 @@ module HTML
|
|
166
169
|
end
|
167
170
|
|
168
171
|
def contains_bad_protocols?(attr_name, value)
|
169
|
-
uri_attributes.include?(attr_name) &&
|
170
|
-
(value =~ /(^[^\/:]*):|(�*58)|(p)|(
|
172
|
+
uri_attributes.include?(attr_name) &&
|
173
|
+
(value =~ /(^[^\/:]*):|(�*58)|(p)|(%|%)3A/ && !allowed_protocols.include?(value.split(protocol_separator).first))
|
171
174
|
end
|
172
175
|
end
|
173
176
|
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2004-2010 David Heinemeier Hansson
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
#++
|
23
|
+
|
24
|
+
activesupport_path = File.expand_path('../../../activesupport/lib', __FILE__)
|
25
|
+
$:.unshift(activesupport_path) if File.directory?(activesupport_path) && !$:.include?(activesupport_path)
|
26
|
+
|
27
|
+
require 'active_support'
|
28
|
+
require 'active_support/dependencies/autoload'
|
29
|
+
|
30
|
+
require 'rack'
|
31
|
+
|
32
|
+
module Rack
|
33
|
+
autoload :Test, 'rack/test'
|
34
|
+
end
|
35
|
+
|
36
|
+
module ActionDispatch
|
37
|
+
extend ActiveSupport::Autoload
|
38
|
+
|
39
|
+
autoload_under 'http' do
|
40
|
+
autoload :Request
|
41
|
+
autoload :Response
|
42
|
+
end
|
43
|
+
|
44
|
+
autoload_under 'middleware' do
|
45
|
+
autoload :Callbacks
|
46
|
+
autoload :Cascade
|
47
|
+
autoload :Cookies
|
48
|
+
autoload :Flash
|
49
|
+
autoload :Head
|
50
|
+
autoload :ParamsParser
|
51
|
+
autoload :Rescue
|
52
|
+
autoload :ShowExceptions
|
53
|
+
autoload :Static
|
54
|
+
end
|
55
|
+
|
56
|
+
autoload :MiddlewareStack, 'action_dispatch/middleware/stack'
|
57
|
+
autoload :Routing
|
58
|
+
|
59
|
+
module Http
|
60
|
+
extend ActiveSupport::Autoload
|
61
|
+
|
62
|
+
autoload :Cache
|
63
|
+
autoload :Headers
|
64
|
+
autoload :MimeNegotiation
|
65
|
+
autoload :Parameters
|
66
|
+
autoload :FilterParameters
|
67
|
+
autoload :Upload
|
68
|
+
autoload :UploadedFile, 'action_dispatch/http/upload'
|
69
|
+
autoload :URL
|
70
|
+
end
|
71
|
+
|
72
|
+
module Session
|
73
|
+
autoload :AbstractStore, 'action_dispatch/middleware/session/abstract_store'
|
74
|
+
autoload :CookieStore, 'action_dispatch/middleware/session/cookie_store'
|
75
|
+
autoload :MemCacheStore, 'action_dispatch/middleware/session/mem_cache_store'
|
76
|
+
end
|
77
|
+
|
78
|
+
autoload_under 'testing' do
|
79
|
+
autoload :Assertions
|
80
|
+
autoload :Integration
|
81
|
+
autoload :PerformanceTest
|
82
|
+
autoload :TestProcess
|
83
|
+
autoload :TestRequest
|
84
|
+
autoload :TestResponse
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
autoload :Mime, 'action_dispatch/http/mime_type'
|
@@ -0,0 +1,123 @@
|
|
1
|
+
module ActionDispatch
|
2
|
+
module Http
|
3
|
+
module Cache
|
4
|
+
module Request
|
5
|
+
def if_modified_since
|
6
|
+
if since = env['HTTP_IF_MODIFIED_SINCE']
|
7
|
+
Time.rfc2822(since) rescue nil
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def if_none_match
|
12
|
+
env['HTTP_IF_NONE_MATCH']
|
13
|
+
end
|
14
|
+
|
15
|
+
def not_modified?(modified_at)
|
16
|
+
if_modified_since && modified_at && if_modified_since >= modified_at
|
17
|
+
end
|
18
|
+
|
19
|
+
def etag_matches?(etag)
|
20
|
+
if_none_match && if_none_match == etag
|
21
|
+
end
|
22
|
+
|
23
|
+
# Check response freshness (Last-Modified and ETag) against request
|
24
|
+
# If-Modified-Since and If-None-Match conditions. If both headers are
|
25
|
+
# supplied, both must match, or the request is not considered fresh.
|
26
|
+
def fresh?(response)
|
27
|
+
last_modified = if_modified_since
|
28
|
+
etag = if_none_match
|
29
|
+
|
30
|
+
return false unless last_modified || etag
|
31
|
+
|
32
|
+
success = true
|
33
|
+
success &&= not_modified?(response.last_modified) if last_modified
|
34
|
+
success &&= etag_matches?(response.etag) if etag
|
35
|
+
success
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
module Response
|
40
|
+
def cache_control
|
41
|
+
@cache_control ||= {}
|
42
|
+
end
|
43
|
+
|
44
|
+
def last_modified
|
45
|
+
if last = headers['Last-Modified']
|
46
|
+
Time.httpdate(last)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def last_modified?
|
51
|
+
headers.include?('Last-Modified')
|
52
|
+
end
|
53
|
+
|
54
|
+
def last_modified=(utc_time)
|
55
|
+
headers['Last-Modified'] = utc_time.httpdate
|
56
|
+
end
|
57
|
+
|
58
|
+
def etag
|
59
|
+
@etag
|
60
|
+
end
|
61
|
+
|
62
|
+
def etag?
|
63
|
+
@etag
|
64
|
+
end
|
65
|
+
|
66
|
+
def etag=(etag)
|
67
|
+
key = ActiveSupport::Cache.expand_cache_key(etag)
|
68
|
+
@etag = %("#{Digest::MD5.hexdigest(key)}")
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
def handle_conditional_get!
|
74
|
+
if etag? || last_modified? || !@cache_control.empty?
|
75
|
+
set_conditional_cache_control!
|
76
|
+
elsif nonempty_ok_response?
|
77
|
+
self.etag = @body
|
78
|
+
|
79
|
+
if request && request.etag_matches?(etag)
|
80
|
+
self.status = 304
|
81
|
+
self.body = []
|
82
|
+
end
|
83
|
+
|
84
|
+
set_conditional_cache_control!
|
85
|
+
else
|
86
|
+
headers["Cache-Control"] = "no-cache"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def nonempty_ok_response?
|
91
|
+
@status == 200 && string_body?
|
92
|
+
end
|
93
|
+
|
94
|
+
def string_body?
|
95
|
+
!@blank && @body.respond_to?(:all?) && @body.all? { |part| part.is_a?(String) }
|
96
|
+
end
|
97
|
+
|
98
|
+
DEFAULT_CACHE_CONTROL = "max-age=0, private, must-revalidate"
|
99
|
+
|
100
|
+
def set_conditional_cache_control!
|
101
|
+
control = @cache_control
|
102
|
+
|
103
|
+
if control.empty?
|
104
|
+
headers["Cache-Control"] = DEFAULT_CACHE_CONTROL
|
105
|
+
elsif @cache_control[:no_cache]
|
106
|
+
headers["Cache-Control"] = "no-cache"
|
107
|
+
else
|
108
|
+
extras = control[:extras]
|
109
|
+
max_age = control[:max_age]
|
110
|
+
|
111
|
+
options = []
|
112
|
+
options << "max-age=#{max_age.to_i}" if max_age
|
113
|
+
options << (control[:public] ? "public" : "private")
|
114
|
+
options << "must-revalidate" if control[:must_revalidate]
|
115
|
+
options.concat(extras) if extras
|
116
|
+
|
117
|
+
headers["Cache-Control"] = options.join(", ")
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require 'active_support/core_ext/object/blank'
|
2
|
+
require 'active_support/core_ext/hash/keys'
|
3
|
+
|
4
|
+
module ActionDispatch
|
5
|
+
module Http
|
6
|
+
# Allows you to specify sensitive parameters which will be replaced from
|
7
|
+
# the request log by looking in all subhashes of the param hash for keys
|
8
|
+
# to filter. If a block is given, each key and value of the parameter
|
9
|
+
# hash and all subhashes is passed to it, the value or key can be replaced
|
10
|
+
# using String#replace or similar method.
|
11
|
+
#
|
12
|
+
# Examples:
|
13
|
+
#
|
14
|
+
# env["action_dispatch.parameter_filter"] = [:password]
|
15
|
+
# => replaces the value to all keys matching /password/i with "[FILTERED]"
|
16
|
+
#
|
17
|
+
# env["action_dispatch.parameter_filter"] = [:foo, "bar"]
|
18
|
+
# => replaces the value to all keys matching /foo|bar/i with "[FILTERED]"
|
19
|
+
#
|
20
|
+
# env["action_dispatch.parameter_filter"] = lambda do |k,v|
|
21
|
+
# v.reverse! if k =~ /secret/i
|
22
|
+
# end
|
23
|
+
# => reverses the value to all keys matching /secret/i
|
24
|
+
#
|
25
|
+
module FilterParameters
|
26
|
+
extend ActiveSupport::Concern
|
27
|
+
|
28
|
+
# Return a hash of parameters with all sensitive data replaced.
|
29
|
+
def filtered_parameters
|
30
|
+
@filtered_parameters ||= process_parameter_filter(parameters)
|
31
|
+
end
|
32
|
+
alias :fitered_params :filtered_parameters
|
33
|
+
|
34
|
+
# Return a hash of request.env with all sensitive data replaced.
|
35
|
+
def filtered_env
|
36
|
+
filtered_env = @env.dup
|
37
|
+
filtered_env.each do |key, value|
|
38
|
+
if (key =~ /RAW_POST_DATA/i)
|
39
|
+
filtered_env[key] = '[FILTERED]'
|
40
|
+
elsif value.is_a?(Hash)
|
41
|
+
filtered_env[key] = process_parameter_filter(value)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
filtered_env
|
45
|
+
end
|
46
|
+
|
47
|
+
protected
|
48
|
+
|
49
|
+
def compile_parameter_filter #:nodoc:
|
50
|
+
strings, regexps, blocks = [], [], []
|
51
|
+
|
52
|
+
Array(@env["action_dispatch.parameter_filter"]).each do |item|
|
53
|
+
case item
|
54
|
+
when NilClass
|
55
|
+
when Proc
|
56
|
+
blocks << item
|
57
|
+
when Regexp
|
58
|
+
regexps << item
|
59
|
+
else
|
60
|
+
strings << item.to_s
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
regexps << Regexp.new(strings.join('|'), true) unless strings.empty?
|
65
|
+
[regexps, blocks]
|
66
|
+
end
|
67
|
+
|
68
|
+
def filtering_parameters? #:nodoc:
|
69
|
+
@env["action_dispatch.parameter_filter"].present?
|
70
|
+
end
|
71
|
+
|
72
|
+
def process_parameter_filter(original_params) #:nodoc:
|
73
|
+
return original_params.dup unless filtering_parameters?
|
74
|
+
|
75
|
+
filtered_params = {}
|
76
|
+
regexps, blocks = compile_parameter_filter
|
77
|
+
|
78
|
+
original_params.each do |key, value|
|
79
|
+
if regexps.find { |r| key =~ r }
|
80
|
+
value = '[FILTERED]'
|
81
|
+
elsif value.is_a?(Hash)
|
82
|
+
value = process_parameter_filter(value)
|
83
|
+
elsif value.is_a?(Array)
|
84
|
+
value = value.map { |i| process_parameter_filter(i) }
|
85
|
+
elsif blocks.present?
|
86
|
+
key = key.dup
|
87
|
+
value = value.dup if value.duplicable?
|
88
|
+
blocks.each { |b| b.call(key, value) }
|
89
|
+
end
|
90
|
+
|
91
|
+
filtered_params[key] = value
|
92
|
+
end
|
93
|
+
|
94
|
+
filtered_params
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -1,18 +1,18 @@
|
|
1
1
|
require 'active_support/memoizable'
|
2
2
|
|
3
|
-
module
|
3
|
+
module ActionDispatch
|
4
4
|
module Http
|
5
5
|
class Headers < ::Hash
|
6
6
|
extend ActiveSupport::Memoizable
|
7
7
|
|
8
8
|
def initialize(*args)
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
9
|
+
if args.size == 1 && args[0].is_a?(Hash)
|
10
|
+
super()
|
11
|
+
update(args[0])
|
12
|
+
else
|
13
|
+
super
|
14
|
+
end
|
15
|
+
end
|
16
16
|
|
17
17
|
def [](header_name)
|
18
18
|
if include?(header_name)
|
@@ -0,0 +1,101 @@
|
|
1
|
+
module ActionDispatch
|
2
|
+
module Http
|
3
|
+
module MimeNegotiation
|
4
|
+
# The MIME type of the HTTP request, such as Mime::XML.
|
5
|
+
#
|
6
|
+
# For backward compatibility, the post \format is extracted from the
|
7
|
+
# X-Post-Data-Format HTTP header if present.
|
8
|
+
def content_type
|
9
|
+
@env["action_dispatch.request.content_type"] ||= begin
|
10
|
+
if @env['CONTENT_TYPE'] =~ /^([^,\;]*)/
|
11
|
+
Mime::Type.lookup($1.strip.downcase)
|
12
|
+
else
|
13
|
+
nil
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# Returns the accepted MIME type for the request.
|
19
|
+
def accepts
|
20
|
+
@env["action_dispatch.request.accepts"] ||= begin
|
21
|
+
header = @env['HTTP_ACCEPT'].to_s.strip
|
22
|
+
|
23
|
+
if header.empty?
|
24
|
+
[content_type]
|
25
|
+
else
|
26
|
+
Mime::Type.parse(header)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# Returns the Mime type for the \format used in the request.
|
32
|
+
#
|
33
|
+
# GET /posts/5.xml | request.format => Mime::XML
|
34
|
+
# GET /posts/5.xhtml | request.format => Mime::HTML
|
35
|
+
# GET /posts/5 | request.format => Mime::HTML or MIME::JS, or request.accepts.first depending on the value of <tt>ActionController::Base.use_accept_header</tt>
|
36
|
+
#
|
37
|
+
def format(view_path = [])
|
38
|
+
formats.first
|
39
|
+
end
|
40
|
+
|
41
|
+
def formats
|
42
|
+
accept = @env['HTTP_ACCEPT']
|
43
|
+
|
44
|
+
@env["action_dispatch.request.formats"] ||=
|
45
|
+
if parameters[:format]
|
46
|
+
Array(Mime[parameters[:format]])
|
47
|
+
elsif xhr? || (accept && !accept.include?(?,))
|
48
|
+
accepts
|
49
|
+
else
|
50
|
+
[Mime::HTML]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Sets the \format by string extension, which can be used to force custom formats
|
55
|
+
# that are not controlled by the extension.
|
56
|
+
#
|
57
|
+
# class ApplicationController < ActionController::Base
|
58
|
+
# before_filter :adjust_format_for_iphone
|
59
|
+
#
|
60
|
+
# private
|
61
|
+
# def adjust_format_for_iphone
|
62
|
+
# request.format = :iphone if request.env["HTTP_USER_AGENT"][/iPhone/]
|
63
|
+
# end
|
64
|
+
# end
|
65
|
+
def format=(extension)
|
66
|
+
parameters[:format] = extension.to_s
|
67
|
+
@env["action_dispatch.request.formats"] = [Mime::Type.lookup_by_extension(parameters[:format])]
|
68
|
+
end
|
69
|
+
|
70
|
+
# Returns a symbolized version of the <tt>:format</tt> parameter of the request.
|
71
|
+
# If no \format is given it returns <tt>:js</tt>for Ajax requests and <tt>:html</tt>
|
72
|
+
# otherwise.
|
73
|
+
def template_format
|
74
|
+
parameter_format = parameters[:format]
|
75
|
+
|
76
|
+
if parameter_format
|
77
|
+
parameter_format
|
78
|
+
elsif xhr?
|
79
|
+
:js
|
80
|
+
else
|
81
|
+
:html
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# Receives an array of mimes and return the first user sent mime that
|
86
|
+
# matches the order array.
|
87
|
+
#
|
88
|
+
def negotiate_mime(order)
|
89
|
+
formats.each do |priority|
|
90
|
+
if priority == Mime::ALL
|
91
|
+
return order.first
|
92
|
+
elsif order.include?(priority)
|
93
|
+
return priority
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
order.include?(Mime::ALL) ? formats.first : nil
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|