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,14 +0,0 @@
|
|
1
|
-
use "Rack::Lock", :if => lambda {
|
2
|
-
!ActionController::Base.allow_concurrency
|
3
|
-
}
|
4
|
-
|
5
|
-
use "ActionController::Failsafe"
|
6
|
-
|
7
|
-
use lambda { ActionController::Base.session_store },
|
8
|
-
lambda { ActionController::Base.session_options }
|
9
|
-
|
10
|
-
use "ActionController::ParamsParser"
|
11
|
-
use "Rack::MethodOverride"
|
12
|
-
use "Rack::Head"
|
13
|
-
|
14
|
-
use "ActionController::StringCoercion"
|
@@ -1,193 +0,0 @@
|
|
1
|
-
module ActionController #:nodoc:
|
2
|
-
module MimeResponds #:nodoc:
|
3
|
-
def self.included(base)
|
4
|
-
base.module_eval do
|
5
|
-
include ActionController::MimeResponds::InstanceMethods
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
module InstanceMethods
|
10
|
-
# Without web-service support, an action which collects the data for displaying a list of people
|
11
|
-
# might look something like this:
|
12
|
-
#
|
13
|
-
# def index
|
14
|
-
# @people = Person.find(:all)
|
15
|
-
# end
|
16
|
-
#
|
17
|
-
# Here's the same action, with web-service support baked in:
|
18
|
-
#
|
19
|
-
# def index
|
20
|
-
# @people = Person.find(:all)
|
21
|
-
#
|
22
|
-
# respond_to do |format|
|
23
|
-
# format.html
|
24
|
-
# format.xml { render :xml => @people.to_xml }
|
25
|
-
# end
|
26
|
-
# end
|
27
|
-
#
|
28
|
-
# What that says is, "if the client wants HTML in response to this action, just respond as we
|
29
|
-
# would have before, but if the client wants XML, return them the list of people in XML format."
|
30
|
-
# (Rails determines the desired response format from the HTTP Accept header submitted by the client.)
|
31
|
-
#
|
32
|
-
# Supposing you have an action that adds a new person, optionally creating their company
|
33
|
-
# (by name) if it does not already exist, without web-services, it might look like this:
|
34
|
-
#
|
35
|
-
# def create
|
36
|
-
# @company = Company.find_or_create_by_name(params[:company][:name])
|
37
|
-
# @person = @company.people.create(params[:person])
|
38
|
-
#
|
39
|
-
# redirect_to(person_list_url)
|
40
|
-
# end
|
41
|
-
#
|
42
|
-
# Here's the same action, with web-service support baked in:
|
43
|
-
#
|
44
|
-
# def create
|
45
|
-
# company = params[:person].delete(:company)
|
46
|
-
# @company = Company.find_or_create_by_name(company[:name])
|
47
|
-
# @person = @company.people.create(params[:person])
|
48
|
-
#
|
49
|
-
# respond_to do |format|
|
50
|
-
# format.html { redirect_to(person_list_url) }
|
51
|
-
# format.js
|
52
|
-
# format.xml { render :xml => @person.to_xml(:include => @company) }
|
53
|
-
# end
|
54
|
-
# end
|
55
|
-
#
|
56
|
-
# If the client wants HTML, we just redirect them back to the person list. If they want Javascript
|
57
|
-
# (format.js), then it is an RJS request and we render the RJS template associated with this action.
|
58
|
-
# Lastly, if the client wants XML, we render the created person as XML, but with a twist: we also
|
59
|
-
# include the person's company in the rendered XML, so you get something like this:
|
60
|
-
#
|
61
|
-
# <person>
|
62
|
-
# <id>...</id>
|
63
|
-
# ...
|
64
|
-
# <company>
|
65
|
-
# <id>...</id>
|
66
|
-
# <name>...</name>
|
67
|
-
# ...
|
68
|
-
# </company>
|
69
|
-
# </person>
|
70
|
-
#
|
71
|
-
# Note, however, the extra bit at the top of that action:
|
72
|
-
#
|
73
|
-
# company = params[:person].delete(:company)
|
74
|
-
# @company = Company.find_or_create_by_name(company[:name])
|
75
|
-
#
|
76
|
-
# This is because the incoming XML document (if a web-service request is in process) can only contain a
|
77
|
-
# single root-node. So, we have to rearrange things so that the request looks like this (url-encoded):
|
78
|
-
#
|
79
|
-
# person[name]=...&person[company][name]=...&...
|
80
|
-
#
|
81
|
-
# And, like this (xml-encoded):
|
82
|
-
#
|
83
|
-
# <person>
|
84
|
-
# <name>...</name>
|
85
|
-
# <company>
|
86
|
-
# <name>...</name>
|
87
|
-
# </company>
|
88
|
-
# </person>
|
89
|
-
#
|
90
|
-
# In other words, we make the request so that it operates on a single entity's person. Then, in the action,
|
91
|
-
# we extract the company data from the request, find or create the company, and then create the new person
|
92
|
-
# with the remaining data.
|
93
|
-
#
|
94
|
-
# Note that you can define your own XML parameter parser which would allow you to describe multiple entities
|
95
|
-
# in a single request (i.e., by wrapping them all in a single root node), but if you just go with the flow
|
96
|
-
# and accept Rails' defaults, life will be much easier.
|
97
|
-
#
|
98
|
-
# If you need to use a MIME type which isn't supported by default, you can register your own handlers in
|
99
|
-
# environment.rb as follows.
|
100
|
-
#
|
101
|
-
# Mime::Type.register "image/jpg", :jpg
|
102
|
-
def respond_to(*types, &block)
|
103
|
-
raise ArgumentError, "respond_to takes either types or a block, never both" unless types.any? ^ block
|
104
|
-
block ||= lambda { |responder| types.each { |type| responder.send(type) } }
|
105
|
-
responder = Responder.new(self)
|
106
|
-
block.call(responder)
|
107
|
-
responder.respond
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
class Responder #:nodoc:
|
112
|
-
def initialize(controller)
|
113
|
-
@controller = controller
|
114
|
-
@request = controller.request
|
115
|
-
@response = controller.response
|
116
|
-
|
117
|
-
if ActionController::Base.use_accept_header
|
118
|
-
@mime_type_priority = Array(Mime::Type.lookup_by_extension(@request.parameters[:format]) || @request.accepts)
|
119
|
-
else
|
120
|
-
@mime_type_priority = [@request.format]
|
121
|
-
end
|
122
|
-
|
123
|
-
@order = []
|
124
|
-
@responses = {}
|
125
|
-
end
|
126
|
-
|
127
|
-
def custom(mime_type, &block)
|
128
|
-
mime_type = mime_type.is_a?(Mime::Type) ? mime_type : Mime::Type.lookup(mime_type.to_s)
|
129
|
-
|
130
|
-
@order << mime_type
|
131
|
-
|
132
|
-
@responses[mime_type] ||= Proc.new do
|
133
|
-
@response.template.template_format = mime_type.to_sym
|
134
|
-
@response.content_type = mime_type.to_s
|
135
|
-
block_given? ? block.call : @controller.send(:render, :action => @controller.action_name)
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
def any(*args, &block)
|
140
|
-
if args.any?
|
141
|
-
args.each { |type| send(type, &block) }
|
142
|
-
else
|
143
|
-
custom(@mime_type_priority.first, &block)
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
def self.generate_method_for_mime(mime)
|
148
|
-
sym = mime.is_a?(Symbol) ? mime : mime.to_sym
|
149
|
-
const = sym.to_s.upcase
|
150
|
-
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
151
|
-
def #{sym}(&block) # def html(&block)
|
152
|
-
custom(Mime::#{const}, &block) # custom(Mime::HTML, &block)
|
153
|
-
end # end
|
154
|
-
RUBY
|
155
|
-
end
|
156
|
-
|
157
|
-
Mime::SET.each do |mime|
|
158
|
-
generate_method_for_mime(mime)
|
159
|
-
end
|
160
|
-
|
161
|
-
def method_missing(symbol, &block)
|
162
|
-
mime_constant = Mime.const_get(symbol.to_s.upcase)
|
163
|
-
|
164
|
-
if Mime::SET.include?(mime_constant)
|
165
|
-
self.class.generate_method_for_mime(mime_constant)
|
166
|
-
send(symbol, &block)
|
167
|
-
else
|
168
|
-
super
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
|
-
def respond
|
173
|
-
for priority in @mime_type_priority
|
174
|
-
if priority == Mime::ALL
|
175
|
-
@responses[@order.first].call
|
176
|
-
return
|
177
|
-
else
|
178
|
-
if @responses[priority]
|
179
|
-
@responses[priority].call
|
180
|
-
return # mime type match found, be happy and return
|
181
|
-
end
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
if @order.include?(Mime::ALL)
|
186
|
-
@responses[Mime::ALL].call
|
187
|
-
else
|
188
|
-
@controller.send :head, :not_acceptable
|
189
|
-
end
|
190
|
-
end
|
191
|
-
end
|
192
|
-
end
|
193
|
-
end
|
@@ -1,77 +0,0 @@
|
|
1
|
-
module ActionController
|
2
|
-
class ParamsParser
|
3
|
-
ActionController::Base.param_parsers[Mime::XML] = :xml_simple
|
4
|
-
ActionController::Base.param_parsers[Mime::JSON] = :json
|
5
|
-
|
6
|
-
def initialize(app)
|
7
|
-
@app = app
|
8
|
-
end
|
9
|
-
|
10
|
-
def call(env)
|
11
|
-
if params = parse_formatted_parameters(env)
|
12
|
-
env["action_controller.request.request_parameters"] = params
|
13
|
-
end
|
14
|
-
|
15
|
-
@app.call(env)
|
16
|
-
end
|
17
|
-
|
18
|
-
private
|
19
|
-
def parse_formatted_parameters(env)
|
20
|
-
request = Request.new(env)
|
21
|
-
|
22
|
-
return false if request.content_length.zero?
|
23
|
-
|
24
|
-
mime_type = content_type_from_legacy_post_data_format_header(env) || request.content_type
|
25
|
-
strategy = ActionController::Base.param_parsers[mime_type]
|
26
|
-
|
27
|
-
return false unless strategy
|
28
|
-
|
29
|
-
case strategy
|
30
|
-
when Proc
|
31
|
-
strategy.call(request.raw_post)
|
32
|
-
when :xml_simple, :xml_node
|
33
|
-
body = request.raw_post
|
34
|
-
body.blank? ? {} : Hash.from_xml(body).with_indifferent_access
|
35
|
-
when :yaml
|
36
|
-
YAML.load(request.raw_post)
|
37
|
-
when :json
|
38
|
-
body = request.raw_post
|
39
|
-
if body.blank?
|
40
|
-
{}
|
41
|
-
else
|
42
|
-
data = ActiveSupport::JSON.decode(body)
|
43
|
-
data = {:_json => data} unless data.is_a?(Hash)
|
44
|
-
data.with_indifferent_access
|
45
|
-
end
|
46
|
-
else
|
47
|
-
false
|
48
|
-
end
|
49
|
-
rescue Exception => e # YAML, XML or Ruby code block errors
|
50
|
-
logger.debug "Error occurred while parsing request parameters.\nContents:\n\n#{request.raw_post}"
|
51
|
-
|
52
|
-
raise
|
53
|
-
{ "body" => request.raw_post,
|
54
|
-
"content_type" => request.content_type,
|
55
|
-
"content_length" => request.content_length,
|
56
|
-
"exception" => "#{e.message} (#{e.class})",
|
57
|
-
"backtrace" => e.backtrace }
|
58
|
-
end
|
59
|
-
|
60
|
-
def content_type_from_legacy_post_data_format_header(env)
|
61
|
-
if x_post_format = env['HTTP_X_POST_DATA_FORMAT']
|
62
|
-
case x_post_format.to_s.downcase
|
63
|
-
when 'yaml'
|
64
|
-
return Mime::YAML
|
65
|
-
when 'xml'
|
66
|
-
return Mime::XML
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
nil
|
71
|
-
end
|
72
|
-
|
73
|
-
def logger
|
74
|
-
defined?(Rails.logger) ? Rails.logger : Logger.new($stderr)
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
require 'active_support/testing/performance'
|
2
|
-
require 'active_support/testing/default'
|
3
|
-
|
4
|
-
module ActionController
|
5
|
-
# An integration test that runs a code profiler on your test methods.
|
6
|
-
# Profiling output for combinations of each test method, measurement, and
|
7
|
-
# output format are written to your tmp/performance directory.
|
8
|
-
#
|
9
|
-
# By default, process_time is measured and both flat and graph_html output
|
10
|
-
# formats are written, so you'll have two output files per test method.
|
11
|
-
class PerformanceTest < ActionController::IntegrationTest
|
12
|
-
include ActiveSupport::Testing::Performance
|
13
|
-
include ActiveSupport::Testing::Default
|
14
|
-
end
|
15
|
-
end
|
@@ -1,36 +0,0 @@
|
|
1
|
-
# Rack 1.0 does not allow string subclass body. This does not play well with our ActiveSupport::SafeBuffer.
|
2
|
-
# The next release of Rack will be allowing string subclass body - http://github.com/rack/rack/commit/de668df02802a0335376a81ba709270e43ba9d55
|
3
|
-
# TODO : Remove this monkey patch after the next release of Rack
|
4
|
-
|
5
|
-
module RackLintPatch
|
6
|
-
module AllowStringSubclass
|
7
|
-
def self.included(base)
|
8
|
-
base.send :alias_method, :each, :each_with_hack
|
9
|
-
end
|
10
|
-
|
11
|
-
def each_with_hack
|
12
|
-
@closed = false
|
13
|
-
|
14
|
-
@body.each { |part|
|
15
|
-
assert("Body yielded non-string value #{part.inspect}") {
|
16
|
-
part.kind_of?(String)
|
17
|
-
}
|
18
|
-
yield part
|
19
|
-
}
|
20
|
-
|
21
|
-
if @body.respond_to?(:to_path)
|
22
|
-
assert("The file identified by body.to_path does not exist") {
|
23
|
-
::File.exist? @body.to_path
|
24
|
-
}
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
begin
|
30
|
-
app = proc {|env| [200, {"Content-Type" => "text/plain", "Content-Length" => "12"}, [Class.new(String).new("Hello World!")]] }
|
31
|
-
response = Rack::MockRequest.new(Rack::Lint.new(app)).get('/')
|
32
|
-
rescue Rack::Lint::LintError => e
|
33
|
-
raise(e) unless e.message =~ /Body yielded non-string value/
|
34
|
-
Rack::Lint.send :include, AllowStringSubclass
|
35
|
-
end
|
36
|
-
end
|
@@ -1,54 +0,0 @@
|
|
1
|
-
require 'thread'
|
2
|
-
|
3
|
-
module ActionController
|
4
|
-
class Reloader
|
5
|
-
@@default_lock = Mutex.new
|
6
|
-
cattr_accessor :default_lock
|
7
|
-
|
8
|
-
class BodyWrapper
|
9
|
-
def initialize(body, lock)
|
10
|
-
@body = body
|
11
|
-
@lock = lock
|
12
|
-
end
|
13
|
-
|
14
|
-
def close
|
15
|
-
@body.close if @body.respond_to?(:close)
|
16
|
-
ensure
|
17
|
-
Dispatcher.cleanup_application
|
18
|
-
@lock.unlock
|
19
|
-
end
|
20
|
-
|
21
|
-
def method_missing(*args, &block)
|
22
|
-
@body.send(*args, &block)
|
23
|
-
end
|
24
|
-
|
25
|
-
def respond_to?(symbol, include_private = false)
|
26
|
-
symbol == :close || @body.respond_to?(symbol, include_private)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def self.run(lock = @@default_lock)
|
31
|
-
lock.lock
|
32
|
-
begin
|
33
|
-
Dispatcher.reload_application
|
34
|
-
status, headers, body = yield
|
35
|
-
# We do not want to call 'cleanup_application' in an ensure block
|
36
|
-
# because the returned Rack response body may lazily generate its data. This
|
37
|
-
# is for example the case if one calls
|
38
|
-
#
|
39
|
-
# render :text => lambda { ... code here which refers to application models ... }
|
40
|
-
#
|
41
|
-
# in an ActionController.
|
42
|
-
#
|
43
|
-
# Instead, we will want to cleanup the application code after the request is
|
44
|
-
# completely finished. So we wrap the body in a BodyWrapper class so that
|
45
|
-
# when the Rack handler calls #close during the end of the request, we get to
|
46
|
-
# run our cleanup code.
|
47
|
-
[status, headers, BodyWrapper.new(body, lock)]
|
48
|
-
rescue Exception
|
49
|
-
lock.unlock
|
50
|
-
raise
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
@@ -1,518 +0,0 @@
|
|
1
|
-
require 'tempfile'
|
2
|
-
require 'stringio'
|
3
|
-
require 'strscan'
|
4
|
-
|
5
|
-
require 'active_support/memoizable'
|
6
|
-
require 'action_controller/cgi_ext'
|
7
|
-
|
8
|
-
module ActionController
|
9
|
-
class Request < Rack::Request
|
10
|
-
|
11
|
-
%w[ AUTH_TYPE GATEWAY_INTERFACE
|
12
|
-
PATH_TRANSLATED REMOTE_HOST
|
13
|
-
REMOTE_IDENT REMOTE_USER REMOTE_ADDR
|
14
|
-
SERVER_NAME SERVER_PROTOCOL
|
15
|
-
|
16
|
-
HTTP_ACCEPT HTTP_ACCEPT_CHARSET HTTP_ACCEPT_ENCODING
|
17
|
-
HTTP_ACCEPT_LANGUAGE HTTP_CACHE_CONTROL HTTP_FROM
|
18
|
-
HTTP_NEGOTIATE HTTP_PRAGMA HTTP_REFERER HTTP_USER_AGENT ].each do |env|
|
19
|
-
define_method(env.sub(/^HTTP_/n, '').downcase) do
|
20
|
-
@env[env]
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def key?(key)
|
25
|
-
@env.key?(key)
|
26
|
-
end
|
27
|
-
|
28
|
-
HTTP_METHODS = %w(get head put post delete options)
|
29
|
-
HTTP_METHOD_LOOKUP = HTTP_METHODS.inject({}) { |h, m| h[m] = h[m.upcase] = m.to_sym; h }
|
30
|
-
|
31
|
-
# Returns the true HTTP request \method as a lowercase symbol, such as
|
32
|
-
# <tt>:get</tt>. If the request \method is not listed in the HTTP_METHODS
|
33
|
-
# constant above, an UnknownHttpMethod exception is raised.
|
34
|
-
def request_method
|
35
|
-
@request_method ||= HTTP_METHOD_LOOKUP[super] || raise(UnknownHttpMethod, "#{super}, accepted HTTP methods are #{HTTP_METHODS.to_sentence(:locale => :en)}")
|
36
|
-
end
|
37
|
-
|
38
|
-
# Returns the HTTP request \method used for action processing as a
|
39
|
-
# lowercase symbol, such as <tt>:post</tt>. (Unlike #request_method, this
|
40
|
-
# method returns <tt>:get</tt> for a HEAD request because the two are
|
41
|
-
# functionally equivalent from the application's perspective.)
|
42
|
-
def method
|
43
|
-
request_method == :head ? :get : request_method
|
44
|
-
end
|
45
|
-
|
46
|
-
# Is this a GET (or HEAD) request? Equivalent to <tt>request.method == :get</tt>.
|
47
|
-
def get?
|
48
|
-
method == :get
|
49
|
-
end
|
50
|
-
|
51
|
-
# Is this a POST request? Equivalent to <tt>request.method == :post</tt>.
|
52
|
-
def post?
|
53
|
-
request_method == :post
|
54
|
-
end
|
55
|
-
|
56
|
-
# Is this a PUT request? Equivalent to <tt>request.method == :put</tt>.
|
57
|
-
def put?
|
58
|
-
request_method == :put
|
59
|
-
end
|
60
|
-
|
61
|
-
# Is this a DELETE request? Equivalent to <tt>request.method == :delete</tt>.
|
62
|
-
def delete?
|
63
|
-
request_method == :delete
|
64
|
-
end
|
65
|
-
|
66
|
-
# Is this a HEAD request? Since <tt>request.method</tt> sees HEAD as <tt>:get</tt>,
|
67
|
-
# this \method checks the actual HTTP \method directly.
|
68
|
-
def head?
|
69
|
-
request_method == :head
|
70
|
-
end
|
71
|
-
|
72
|
-
# Provides access to the request's HTTP headers, for example:
|
73
|
-
#
|
74
|
-
# request.headers["Content-Type"] # => "text/plain"
|
75
|
-
def headers
|
76
|
-
@headers ||= ActionController::Http::Headers.new(@env)
|
77
|
-
end
|
78
|
-
|
79
|
-
# Returns the content length of the request as an integer.
|
80
|
-
def content_length
|
81
|
-
super.to_i
|
82
|
-
end
|
83
|
-
|
84
|
-
# The MIME type of the HTTP request, such as Mime::XML.
|
85
|
-
#
|
86
|
-
# For backward compatibility, the post \format is extracted from the
|
87
|
-
# X-Post-Data-Format HTTP header if present.
|
88
|
-
def content_type
|
89
|
-
@content_type ||= begin
|
90
|
-
if @env['CONTENT_TYPE'] =~ /^([^,\;]*)/
|
91
|
-
Mime::Type.lookup($1.strip.downcase)
|
92
|
-
else
|
93
|
-
nil
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
def media_type
|
99
|
-
content_type.to_s
|
100
|
-
end
|
101
|
-
|
102
|
-
# Returns the accepted MIME type for the request.
|
103
|
-
def accepts
|
104
|
-
@accepts ||= begin
|
105
|
-
header = @env['HTTP_ACCEPT'].to_s.strip
|
106
|
-
|
107
|
-
if header.empty?
|
108
|
-
[content_type, Mime::ALL].compact
|
109
|
-
else
|
110
|
-
Mime::Type.parse(header)
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
def if_modified_since
|
116
|
-
if since = env['HTTP_IF_MODIFIED_SINCE']
|
117
|
-
Time.rfc2822(since) rescue nil
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
def if_none_match
|
122
|
-
env['HTTP_IF_NONE_MATCH']
|
123
|
-
end
|
124
|
-
|
125
|
-
def not_modified?(modified_at)
|
126
|
-
if_modified_since && modified_at && if_modified_since >= modified_at
|
127
|
-
end
|
128
|
-
|
129
|
-
def etag_matches?(etag)
|
130
|
-
if_none_match && if_none_match == etag
|
131
|
-
end
|
132
|
-
|
133
|
-
# Check response freshness (Last-Modified and ETag) against request
|
134
|
-
# If-Modified-Since and If-None-Match conditions. If both headers are
|
135
|
-
# supplied, both must match, or the request is not considered fresh.
|
136
|
-
def fresh?(response)
|
137
|
-
case
|
138
|
-
when if_modified_since && if_none_match
|
139
|
-
not_modified?(response.last_modified) && etag_matches?(response.etag)
|
140
|
-
when if_modified_since
|
141
|
-
not_modified?(response.last_modified)
|
142
|
-
when if_none_match
|
143
|
-
etag_matches?(response.etag)
|
144
|
-
else
|
145
|
-
false
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
|
-
# Returns the Mime type for the \format used in the request.
|
150
|
-
#
|
151
|
-
# GET /posts/5.xml | request.format => Mime::XML
|
152
|
-
# GET /posts/5.xhtml | request.format => Mime::HTML
|
153
|
-
# 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>
|
154
|
-
def format
|
155
|
-
@format ||=
|
156
|
-
if parameters[:format]
|
157
|
-
Mime::Type.lookup_by_extension(parameters[:format])
|
158
|
-
elsif ActionController::Base.use_accept_header
|
159
|
-
accepts.first
|
160
|
-
elsif xhr?
|
161
|
-
Mime::Type.lookup_by_extension("js")
|
162
|
-
else
|
163
|
-
Mime::Type.lookup_by_extension("html")
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
|
168
|
-
# Sets the \format by string extension, which can be used to force custom formats
|
169
|
-
# that are not controlled by the extension.
|
170
|
-
#
|
171
|
-
# class ApplicationController < ActionController::Base
|
172
|
-
# before_filter :adjust_format_for_iphone
|
173
|
-
#
|
174
|
-
# private
|
175
|
-
# def adjust_format_for_iphone
|
176
|
-
# request.format = :iphone if request.env["HTTP_USER_AGENT"][/iPhone/]
|
177
|
-
# end
|
178
|
-
# end
|
179
|
-
def format=(extension)
|
180
|
-
parameters[:format] = extension.to_s
|
181
|
-
@format = Mime::Type.lookup_by_extension(parameters[:format])
|
182
|
-
end
|
183
|
-
|
184
|
-
# Returns a symbolized version of the <tt>:format</tt> parameter of the request.
|
185
|
-
# If no \format is given it returns <tt>:js</tt>for Ajax requests and <tt>:html</tt>
|
186
|
-
# otherwise.
|
187
|
-
def template_format
|
188
|
-
parameter_format = parameters[:format]
|
189
|
-
|
190
|
-
if parameter_format
|
191
|
-
parameter_format
|
192
|
-
elsif xhr?
|
193
|
-
:js
|
194
|
-
else
|
195
|
-
:html
|
196
|
-
end
|
197
|
-
end
|
198
|
-
|
199
|
-
def cache_format
|
200
|
-
parameters[:format]
|
201
|
-
end
|
202
|
-
|
203
|
-
# Returns true if the request's "X-Requested-With" header contains
|
204
|
-
# "XMLHttpRequest". (The Prototype Javascript library sends this header with
|
205
|
-
# every Ajax request.)
|
206
|
-
def xml_http_request?
|
207
|
-
!(@env['HTTP_X_REQUESTED_WITH'] !~ /XMLHttpRequest/i)
|
208
|
-
end
|
209
|
-
alias xhr? :xml_http_request?
|
210
|
-
|
211
|
-
# Which IP addresses are "trusted proxies" that can be stripped from
|
212
|
-
# the right-hand-side of X-Forwarded-For
|
213
|
-
TRUSTED_PROXIES = /^127\.0\.0\.1$|^(10|172\.(1[6-9]|2[0-9]|30|31)|192\.168)\./i
|
214
|
-
|
215
|
-
# Determines originating IP address. REMOTE_ADDR is the standard
|
216
|
-
# but will fail if the user is behind a proxy. HTTP_CLIENT_IP and/or
|
217
|
-
# HTTP_X_FORWARDED_FOR are set by proxies so check for these if
|
218
|
-
# REMOTE_ADDR is a proxy. HTTP_X_FORWARDED_FOR may be a comma-
|
219
|
-
# delimited list in the case of multiple chained proxies; the last
|
220
|
-
# address which is not trusted is the originating IP.
|
221
|
-
def remote_ip
|
222
|
-
remote_addr_list = @env['REMOTE_ADDR'] && @env['REMOTE_ADDR'].scan(/[^,\s]+/)
|
223
|
-
|
224
|
-
unless remote_addr_list.blank?
|
225
|
-
not_trusted_addrs = remote_addr_list.reject {|addr| addr =~ TRUSTED_PROXIES}
|
226
|
-
return not_trusted_addrs.first unless not_trusted_addrs.empty?
|
227
|
-
end
|
228
|
-
remote_ips = @env['HTTP_X_FORWARDED_FOR'].present? && @env['HTTP_X_FORWARDED_FOR'].split(',')
|
229
|
-
|
230
|
-
if @env.include? 'HTTP_CLIENT_IP'
|
231
|
-
if ActionController::Base.ip_spoofing_check && remote_ips && !remote_ips.include?(@env['HTTP_CLIENT_IP'])
|
232
|
-
# We don't know which came from the proxy, and which from the user
|
233
|
-
raise ActionControllerError.new(<<EOM)
|
234
|
-
IP spoofing attack?!
|
235
|
-
HTTP_CLIENT_IP=#{@env['HTTP_CLIENT_IP'].inspect}
|
236
|
-
HTTP_X_FORWARDED_FOR=#{@env['HTTP_X_FORWARDED_FOR'].inspect}
|
237
|
-
EOM
|
238
|
-
end
|
239
|
-
|
240
|
-
return @env['HTTP_CLIENT_IP']
|
241
|
-
end
|
242
|
-
|
243
|
-
if remote_ips
|
244
|
-
while remote_ips.size > 1 && TRUSTED_PROXIES =~ remote_ips.last.strip
|
245
|
-
remote_ips.pop
|
246
|
-
end
|
247
|
-
|
248
|
-
return remote_ips.last.strip
|
249
|
-
end
|
250
|
-
|
251
|
-
@env['REMOTE_ADDR']
|
252
|
-
end
|
253
|
-
|
254
|
-
# Returns the lowercase name of the HTTP server software.
|
255
|
-
def server_software
|
256
|
-
(@env['SERVER_SOFTWARE'] && /^([a-zA-Z]+)/ =~ @env['SERVER_SOFTWARE']) ? $1.downcase : nil
|
257
|
-
end
|
258
|
-
|
259
|
-
# Returns the complete URL used for this request.
|
260
|
-
def url
|
261
|
-
protocol + host_with_port + request_uri
|
262
|
-
end
|
263
|
-
|
264
|
-
# Returns 'https://' if this is an SSL request and 'http://' otherwise.
|
265
|
-
def protocol
|
266
|
-
ssl? ? 'https://' : 'http://'
|
267
|
-
end
|
268
|
-
|
269
|
-
# Is this an SSL request?
|
270
|
-
def ssl?
|
271
|
-
@env['HTTPS'] == 'on' || @env['HTTP_X_FORWARDED_PROTO'] == 'https'
|
272
|
-
end
|
273
|
-
|
274
|
-
# Returns the \host for this request, such as "example.com".
|
275
|
-
def raw_host_with_port
|
276
|
-
if forwarded = env["HTTP_X_FORWARDED_HOST"]
|
277
|
-
forwarded.split(/,\s?/).last
|
278
|
-
else
|
279
|
-
env['HTTP_HOST'] || "#{env['SERVER_NAME'] || env['SERVER_ADDR']}:#{env['SERVER_PORT']}"
|
280
|
-
end
|
281
|
-
end
|
282
|
-
|
283
|
-
# Returns the host for this request, such as example.com.
|
284
|
-
def host
|
285
|
-
raw_host_with_port.sub(/:\d+$/, '')
|
286
|
-
end
|
287
|
-
|
288
|
-
# Returns a \host:\port string for this request, such as "example.com" or
|
289
|
-
# "example.com:8080".
|
290
|
-
def host_with_port
|
291
|
-
"#{host}#{port_string}"
|
292
|
-
end
|
293
|
-
|
294
|
-
# Returns the port number of this request as an integer.
|
295
|
-
def port
|
296
|
-
if raw_host_with_port =~ /:(\d+)$/
|
297
|
-
$1.to_i
|
298
|
-
else
|
299
|
-
standard_port
|
300
|
-
end
|
301
|
-
end
|
302
|
-
|
303
|
-
# Returns the standard \port number for this request's protocol.
|
304
|
-
def standard_port
|
305
|
-
case protocol
|
306
|
-
when 'https://' then 443
|
307
|
-
else 80
|
308
|
-
end
|
309
|
-
end
|
310
|
-
|
311
|
-
# Returns a \port suffix like ":8080" if the \port number of this request
|
312
|
-
# is not the default HTTP \port 80 or HTTPS \port 443.
|
313
|
-
def port_string
|
314
|
-
port == standard_port ? '' : ":#{port}"
|
315
|
-
end
|
316
|
-
|
317
|
-
# Returns the \domain part of a \host, such as "rubyonrails.org" in "www.rubyonrails.org". You can specify
|
318
|
-
# a different <tt>tld_length</tt>, such as 2 to catch rubyonrails.co.uk in "www.rubyonrails.co.uk".
|
319
|
-
def domain(tld_length = 1)
|
320
|
-
return nil unless named_host?(host)
|
321
|
-
|
322
|
-
host.split('.').last(1 + tld_length).join('.')
|
323
|
-
end
|
324
|
-
|
325
|
-
# Returns all the \subdomains as an array, so <tt>["dev", "www"]</tt> would be
|
326
|
-
# returned for "dev.www.rubyonrails.org". You can specify a different <tt>tld_length</tt>,
|
327
|
-
# such as 2 to catch <tt>["www"]</tt> instead of <tt>["www", "rubyonrails"]</tt>
|
328
|
-
# in "www.rubyonrails.co.uk".
|
329
|
-
def subdomains(tld_length = 1)
|
330
|
-
return [] unless named_host?(host)
|
331
|
-
parts = host.split('.')
|
332
|
-
parts[0..-(tld_length+2)]
|
333
|
-
end
|
334
|
-
|
335
|
-
# Returns the query string, accounting for server idiosyncrasies.
|
336
|
-
def query_string
|
337
|
-
@env['QUERY_STRING'].present? ? @env['QUERY_STRING'] : (@env['REQUEST_URI'].split('?', 2)[1] || '')
|
338
|
-
end
|
339
|
-
|
340
|
-
# Returns the request URI, accounting for server idiosyncrasies.
|
341
|
-
# WEBrick includes the full URL. IIS leaves REQUEST_URI blank.
|
342
|
-
def request_uri
|
343
|
-
if uri = @env['REQUEST_URI']
|
344
|
-
# Remove domain, which webrick puts into the request_uri.
|
345
|
-
(%r{^\w+\://[^/]+(/.*|$)$} =~ uri) ? $1 : uri
|
346
|
-
else
|
347
|
-
# Construct IIS missing REQUEST_URI from SCRIPT_NAME and PATH_INFO.
|
348
|
-
uri = @env['PATH_INFO'].to_s
|
349
|
-
|
350
|
-
if script_filename = @env['SCRIPT_NAME'].to_s.match(%r{[^/]+$})
|
351
|
-
uri = uri.sub(/#{script_filename}\//, '')
|
352
|
-
end
|
353
|
-
|
354
|
-
env_qs = @env['QUERY_STRING'].to_s
|
355
|
-
uri += "?#{env_qs}" unless env_qs.empty?
|
356
|
-
|
357
|
-
if uri.blank?
|
358
|
-
@env.delete('REQUEST_URI')
|
359
|
-
else
|
360
|
-
@env['REQUEST_URI'] = uri
|
361
|
-
end
|
362
|
-
end
|
363
|
-
end
|
364
|
-
|
365
|
-
# Returns the interpreted \path to requested resource after all the installation
|
366
|
-
# directory of this application was taken into account.
|
367
|
-
def path
|
368
|
-
path = request_uri.to_s[/\A[^\?]*/]
|
369
|
-
path.sub!(/\A#{ActionController::Base.relative_url_root}/, '')
|
370
|
-
path
|
371
|
-
end
|
372
|
-
|
373
|
-
# Read the request \body. This is useful for web services that need to
|
374
|
-
# work with raw requests directly.
|
375
|
-
def raw_post
|
376
|
-
unless @env.include? 'RAW_POST_DATA'
|
377
|
-
@env['RAW_POST_DATA'] = body.read(@env['CONTENT_LENGTH'].to_i)
|
378
|
-
body.rewind if body.respond_to?(:rewind)
|
379
|
-
end
|
380
|
-
@env['RAW_POST_DATA']
|
381
|
-
end
|
382
|
-
|
383
|
-
# Returns both GET and POST \parameters in a single hash.
|
384
|
-
def parameters
|
385
|
-
@parameters ||= request_parameters.merge(query_parameters).update(path_parameters).with_indifferent_access
|
386
|
-
end
|
387
|
-
alias_method :params, :parameters
|
388
|
-
|
389
|
-
def path_parameters=(parameters) #:nodoc:
|
390
|
-
@env["action_controller.request.path_parameters"] = parameters
|
391
|
-
@symbolized_path_parameters = @parameters = nil
|
392
|
-
end
|
393
|
-
|
394
|
-
# The same as <tt>path_parameters</tt> with explicitly symbolized keys.
|
395
|
-
def symbolized_path_parameters
|
396
|
-
@symbolized_path_parameters ||= path_parameters.symbolize_keys
|
397
|
-
end
|
398
|
-
|
399
|
-
# Returns a hash with the \parameters used to form the \path of the request.
|
400
|
-
# Returned hash keys are strings:
|
401
|
-
#
|
402
|
-
# {'action' => 'my_action', 'controller' => 'my_controller'}
|
403
|
-
#
|
404
|
-
# See <tt>symbolized_path_parameters</tt> for symbolized keys.
|
405
|
-
def path_parameters
|
406
|
-
@env["action_controller.request.path_parameters"] ||= {}
|
407
|
-
end
|
408
|
-
|
409
|
-
# The request body is an IO input stream. If the RAW_POST_DATA environment
|
410
|
-
# variable is already set, wrap it in a StringIO.
|
411
|
-
def body
|
412
|
-
if raw_post = @env['RAW_POST_DATA']
|
413
|
-
raw_post.force_encoding(Encoding::BINARY) if raw_post.respond_to?(:force_encoding)
|
414
|
-
StringIO.new(raw_post)
|
415
|
-
else
|
416
|
-
@env['rack.input']
|
417
|
-
end
|
418
|
-
end
|
419
|
-
|
420
|
-
def form_data?
|
421
|
-
FORM_DATA_MEDIA_TYPES.include?(content_type.to_s)
|
422
|
-
end
|
423
|
-
|
424
|
-
# Override Rack's GET method to support indifferent access
|
425
|
-
def GET
|
426
|
-
@env["action_controller.request.query_parameters"] ||= normalize_parameters(super)
|
427
|
-
end
|
428
|
-
alias_method :query_parameters, :GET
|
429
|
-
|
430
|
-
# Override Rack's POST method to support indifferent access
|
431
|
-
def POST
|
432
|
-
@env["action_controller.request.request_parameters"] ||= normalize_parameters(super)
|
433
|
-
end
|
434
|
-
alias_method :request_parameters, :POST
|
435
|
-
|
436
|
-
def body_stream #:nodoc:
|
437
|
-
@env['rack.input']
|
438
|
-
end
|
439
|
-
|
440
|
-
def session
|
441
|
-
@env['rack.session'] ||= {}
|
442
|
-
end
|
443
|
-
|
444
|
-
def session=(session) #:nodoc:
|
445
|
-
@env['rack.session'] = session
|
446
|
-
end
|
447
|
-
|
448
|
-
def reset_session
|
449
|
-
# session may be a hash, if so, we do not want to call destroy
|
450
|
-
# fixes issue 6440
|
451
|
-
session.destroy if session and session.respond_to?(:destroy)
|
452
|
-
self.session = {}
|
453
|
-
end
|
454
|
-
|
455
|
-
def session_options
|
456
|
-
@env['rack.session.options'] ||= {}
|
457
|
-
end
|
458
|
-
|
459
|
-
def session_options=(options)
|
460
|
-
@env['rack.session.options'] = options
|
461
|
-
end
|
462
|
-
|
463
|
-
def server_port
|
464
|
-
@env['SERVER_PORT'].to_i
|
465
|
-
end
|
466
|
-
|
467
|
-
private
|
468
|
-
def named_host?(host)
|
469
|
-
!(host.nil? || /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.match(host))
|
470
|
-
end
|
471
|
-
|
472
|
-
# Convert nested Hashs to HashWithIndifferentAccess and replace
|
473
|
-
# file upload hashs with UploadedFile objects
|
474
|
-
def normalize_parameters(value)
|
475
|
-
case value
|
476
|
-
when Hash
|
477
|
-
if value.has_key?(:tempfile)
|
478
|
-
upload = value[:tempfile]
|
479
|
-
upload.extend(UploadedFile)
|
480
|
-
upload.original_path = value[:filename]
|
481
|
-
upload.content_type = value[:type]
|
482
|
-
upload
|
483
|
-
else
|
484
|
-
h = {}
|
485
|
-
value.each { |k, v| h[k] = normalize_parameters(v) }
|
486
|
-
h.with_indifferent_access
|
487
|
-
end
|
488
|
-
when Array
|
489
|
-
value.map { |e| normalize_parameters(e) }
|
490
|
-
else
|
491
|
-
value
|
492
|
-
end
|
493
|
-
end
|
494
|
-
protected
|
495
|
-
|
496
|
-
# Remove nils from the params hash
|
497
|
-
def deep_munge(hash)
|
498
|
-
keys = hash.keys.find_all { |k| hash[k] == [nil] }
|
499
|
-
keys.each { |k| hash[k] = nil }
|
500
|
-
|
501
|
-
hash.each_value do |v|
|
502
|
-
case v
|
503
|
-
when Array
|
504
|
-
v.grep(Hash) { |x| deep_munge(x) }
|
505
|
-
v.compact!
|
506
|
-
when Hash
|
507
|
-
deep_munge(v)
|
508
|
-
end
|
509
|
-
end
|
510
|
-
|
511
|
-
hash
|
512
|
-
end
|
513
|
-
|
514
|
-
def parse_query(qs)
|
515
|
-
deep_munge(super)
|
516
|
-
end
|
517
|
-
end
|
518
|
-
end
|