actionpack 3.2.22.5 → 4.0.0.beta1
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +641 -418
- data/MIT-LICENSE +1 -1
- data/README.rdoc +5 -288
- data/lib/abstract_controller.rb +1 -8
- data/lib/abstract_controller/asset_paths.rb +2 -2
- data/lib/abstract_controller/base.rb +39 -37
- data/lib/abstract_controller/callbacks.rb +101 -82
- data/lib/abstract_controller/collector.rb +7 -3
- data/lib/abstract_controller/helpers.rb +23 -11
- data/lib/abstract_controller/layouts.rb +68 -73
- data/lib/abstract_controller/logger.rb +1 -2
- data/lib/abstract_controller/rendering.rb +22 -13
- data/lib/abstract_controller/translation.rb +16 -1
- data/lib/abstract_controller/url_for.rb +6 -6
- data/lib/abstract_controller/view_paths.rb +1 -1
- data/lib/action_controller.rb +15 -6
- data/lib/action_controller/base.rb +46 -22
- data/lib/action_controller/caching.rb +46 -33
- data/lib/action_controller/caching/fragments.rb +23 -53
- data/lib/action_controller/deprecated.rb +5 -1
- data/lib/action_controller/deprecated/integration_test.rb +3 -0
- data/lib/action_controller/log_subscriber.rb +11 -8
- data/lib/action_controller/metal.rb +16 -30
- data/lib/action_controller/metal/conditional_get.rb +76 -32
- data/lib/action_controller/metal/data_streaming.rb +20 -26
- data/lib/action_controller/metal/exceptions.rb +19 -6
- data/lib/action_controller/metal/flash.rb +24 -9
- data/lib/action_controller/metal/force_ssl.rb +32 -9
- data/lib/action_controller/metal/head.rb +25 -4
- data/lib/action_controller/metal/helpers.rb +6 -9
- data/lib/action_controller/metal/hide_actions.rb +1 -2
- data/lib/action_controller/metal/http_authentication.rb +105 -87
- data/lib/action_controller/metal/implicit_render.rb +1 -1
- data/lib/action_controller/metal/instrumentation.rb +2 -1
- data/lib/action_controller/metal/live.rb +141 -0
- data/lib/action_controller/metal/mime_responds.rb +161 -47
- data/lib/action_controller/metal/params_wrapper.rb +112 -74
- data/lib/action_controller/metal/rack_delegation.rb +9 -3
- data/lib/action_controller/metal/redirecting.rb +15 -20
- data/lib/action_controller/metal/renderers.rb +11 -9
- data/lib/action_controller/metal/rendering.rb +8 -0
- data/lib/action_controller/metal/request_forgery_protection.rb +112 -19
- data/lib/action_controller/metal/responder.rb +20 -19
- data/lib/action_controller/metal/streaming.rb +12 -18
- data/lib/action_controller/metal/strong_parameters.rb +516 -0
- data/lib/action_controller/metal/testing.rb +13 -18
- data/lib/action_controller/metal/url_for.rb +27 -25
- data/lib/action_controller/model_naming.rb +12 -0
- data/lib/action_controller/railtie.rb +33 -17
- data/lib/action_controller/railties/helpers.rb +22 -0
- data/lib/action_controller/record_identifier.rb +18 -72
- data/lib/action_controller/test_case.rb +215 -123
- data/lib/action_controller/vendor/html-scanner.rb +4 -19
- data/lib/action_dispatch.rb +27 -19
- data/lib/action_dispatch/http/cache.rb +63 -11
- data/lib/action_dispatch/http/filter_parameters.rb +18 -8
- data/lib/action_dispatch/http/filter_redirect.rb +37 -0
- data/lib/action_dispatch/http/headers.rb +27 -19
- data/lib/action_dispatch/http/mime_negotiation.rb +25 -2
- data/lib/action_dispatch/http/mime_type.rb +145 -113
- data/lib/action_dispatch/http/mime_types.rb +1 -1
- data/lib/action_dispatch/http/parameter_filter.rb +44 -46
- data/lib/action_dispatch/http/parameters.rb +12 -5
- data/lib/action_dispatch/http/rack_cache.rb +2 -3
- data/lib/action_dispatch/http/request.rb +49 -18
- data/lib/action_dispatch/http/response.rb +129 -35
- data/lib/action_dispatch/http/upload.rb +60 -17
- data/lib/action_dispatch/http/url.rb +53 -31
- data/lib/action_dispatch/journey.rb +5 -0
- data/lib/action_dispatch/journey/backwards.rb +5 -0
- data/lib/action_dispatch/journey/formatter.rb +146 -0
- data/lib/action_dispatch/journey/gtg/builder.rb +162 -0
- data/lib/action_dispatch/journey/gtg/simulator.rb +44 -0
- data/lib/action_dispatch/journey/gtg/transition_table.rb +156 -0
- data/lib/action_dispatch/journey/nfa/builder.rb +76 -0
- data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
- data/lib/action_dispatch/journey/nfa/simulator.rb +47 -0
- data/lib/action_dispatch/journey/nfa/transition_table.rb +163 -0
- data/lib/action_dispatch/journey/nodes/node.rb +124 -0
- data/lib/action_dispatch/journey/parser.rb +206 -0
- data/lib/action_dispatch/journey/parser.y +47 -0
- data/lib/action_dispatch/journey/parser_extras.rb +23 -0
- data/lib/action_dispatch/journey/path/pattern.rb +196 -0
- data/lib/action_dispatch/journey/route.rb +116 -0
- data/lib/action_dispatch/journey/router.rb +164 -0
- data/lib/action_dispatch/journey/router/strexp.rb +24 -0
- data/lib/action_dispatch/journey/router/utils.rb +54 -0
- data/lib/action_dispatch/journey/routes.rb +75 -0
- data/lib/action_dispatch/journey/scanner.rb +61 -0
- data/lib/action_dispatch/journey/visitors.rb +189 -0
- data/lib/action_dispatch/journey/visualizer/fsm.css +34 -0
- data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
- data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
- data/lib/action_dispatch/middleware/callbacks.rb +9 -4
- data/lib/action_dispatch/middleware/cookies.rb +168 -57
- data/lib/action_dispatch/middleware/debug_exceptions.rb +26 -17
- data/lib/action_dispatch/middleware/exception_wrapper.rb +27 -3
- data/lib/action_dispatch/middleware/flash.rb +58 -58
- data/lib/action_dispatch/middleware/params_parser.rb +14 -29
- data/lib/action_dispatch/middleware/public_exceptions.rb +31 -14
- data/lib/action_dispatch/middleware/reloader.rb +6 -6
- data/lib/action_dispatch/middleware/remote_ip.rb +145 -39
- data/lib/action_dispatch/middleware/request_id.rb +2 -6
- data/lib/action_dispatch/middleware/session/abstract_store.rb +22 -20
- data/lib/action_dispatch/middleware/session/cache_store.rb +3 -3
- data/lib/action_dispatch/middleware/session/cookie_store.rb +81 -7
- data/lib/action_dispatch/middleware/session/mem_cache_store.rb +8 -3
- data/lib/action_dispatch/middleware/show_exceptions.rb +12 -45
- data/lib/action_dispatch/middleware/ssl.rb +70 -0
- data/lib/action_dispatch/middleware/stack.rb +6 -1
- data/lib/action_dispatch/middleware/static.rb +5 -24
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +14 -11
- data/lib/action_dispatch/middleware/templates/rescues/_source.erb +25 -0
- data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +3 -3
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +15 -9
- data/lib/action_dispatch/middleware/templates/rescues/layout.erb +121 -5
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +7 -2
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +30 -15
- data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +39 -13
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +6 -2
- data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
- data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +144 -0
- data/lib/action_dispatch/railtie.rb +16 -6
- data/lib/action_dispatch/request/session.rb +181 -0
- data/lib/action_dispatch/routing.rb +41 -40
- data/lib/action_dispatch/routing/inspector.rb +240 -0
- data/lib/action_dispatch/routing/mapper.rb +501 -273
- data/lib/action_dispatch/routing/polymorphic_routes.rb +16 -20
- data/lib/action_dispatch/routing/redirection.rb +46 -29
- data/lib/action_dispatch/routing/route_set.rb +203 -164
- data/lib/action_dispatch/routing/routes_proxy.rb +2 -0
- data/lib/action_dispatch/routing/url_for.rb +48 -33
- data/lib/action_dispatch/testing/assertions/dom.rb +3 -13
- data/lib/action_dispatch/testing/assertions/response.rb +32 -40
- data/lib/action_dispatch/testing/assertions/routing.rb +40 -39
- data/lib/action_dispatch/testing/assertions/selector.rb +15 -20
- data/lib/action_dispatch/testing/assertions/tag.rb +20 -23
- data/lib/action_dispatch/testing/integration.rb +41 -22
- data/lib/action_dispatch/testing/test_process.rb +9 -6
- data/lib/action_dispatch/testing/test_request.rb +7 -3
- data/lib/action_pack.rb +1 -1
- data/lib/action_pack/version.rb +4 -4
- data/lib/action_view.rb +17 -8
- data/lib/action_view/base.rb +15 -34
- data/lib/action_view/buffers.rb +1 -1
- data/lib/action_view/context.rb +4 -4
- data/lib/action_view/dependency_tracker.rb +91 -0
- data/lib/action_view/digestor.rb +85 -0
- data/lib/action_view/flows.rb +1 -4
- data/lib/action_view/helpers.rb +2 -4
- data/lib/action_view/helpers/active_model_helper.rb +3 -4
- data/lib/action_view/helpers/asset_tag_helper.rb +211 -353
- data/lib/action_view/helpers/asset_url_helper.rb +354 -0
- data/lib/action_view/helpers/atom_feed_helper.rb +13 -10
- data/lib/action_view/helpers/cache_helper.rb +150 -18
- data/lib/action_view/helpers/capture_helper.rb +42 -29
- data/lib/action_view/helpers/csrf_helper.rb +0 -2
- data/lib/action_view/helpers/date_helper.rb +268 -247
- data/lib/action_view/helpers/debug_helper.rb +10 -11
- data/lib/action_view/helpers/form_helper.rb +904 -547
- data/lib/action_view/helpers/form_options_helper.rb +341 -166
- data/lib/action_view/helpers/form_tag_helper.rb +188 -88
- data/lib/action_view/helpers/javascript_helper.rb +23 -16
- data/lib/action_view/helpers/number_helper.rb +148 -354
- data/lib/action_view/helpers/output_safety_helper.rb +3 -3
- data/lib/action_view/helpers/record_tag_helper.rb +17 -22
- data/lib/action_view/helpers/rendering_helper.rb +2 -4
- data/lib/action_view/helpers/sanitize_helper.rb +3 -6
- data/lib/action_view/helpers/tag_helper.rb +43 -37
- data/lib/action_view/helpers/tags.rb +39 -0
- data/lib/action_view/helpers/tags/base.rb +148 -0
- data/lib/action_view/helpers/tags/check_box.rb +64 -0
- data/lib/action_view/helpers/tags/checkable.rb +16 -0
- data/lib/action_view/helpers/tags/collection_check_boxes.rb +43 -0
- data/lib/action_view/helpers/tags/collection_helpers.rb +83 -0
- data/lib/action_view/helpers/tags/collection_radio_buttons.rb +36 -0
- data/lib/action_view/helpers/tags/collection_select.rb +28 -0
- data/lib/action_view/helpers/tags/color_field.rb +25 -0
- data/lib/action_view/helpers/tags/date_field.rb +13 -0
- data/lib/action_view/helpers/tags/date_select.rb +72 -0
- data/lib/action_view/helpers/tags/datetime_field.rb +22 -0
- data/lib/action_view/helpers/tags/datetime_local_field.rb +19 -0
- data/lib/action_view/helpers/tags/datetime_select.rb +8 -0
- data/lib/action_view/helpers/tags/email_field.rb +8 -0
- data/lib/action_view/helpers/tags/file_field.rb +8 -0
- data/lib/action_view/helpers/tags/grouped_collection_select.rb +29 -0
- data/lib/action_view/helpers/tags/hidden_field.rb +8 -0
- data/lib/action_view/helpers/tags/label.rb +65 -0
- data/lib/action_view/helpers/tags/month_field.rb +13 -0
- data/lib/action_view/helpers/tags/number_field.rb +18 -0
- data/lib/action_view/helpers/tags/password_field.rb +12 -0
- data/lib/action_view/helpers/tags/radio_button.rb +31 -0
- data/lib/action_view/helpers/tags/range_field.rb +8 -0
- data/lib/action_view/helpers/tags/search_field.rb +24 -0
- data/lib/action_view/helpers/tags/select.rb +41 -0
- data/lib/action_view/helpers/tags/tel_field.rb +8 -0
- data/lib/action_view/helpers/tags/text_area.rb +18 -0
- data/lib/action_view/helpers/tags/text_field.rb +29 -0
- data/lib/action_view/helpers/tags/time_field.rb +13 -0
- data/lib/action_view/helpers/tags/time_select.rb +8 -0
- data/lib/action_view/helpers/tags/time_zone_select.rb +20 -0
- data/lib/action_view/helpers/tags/url_field.rb +8 -0
- data/lib/action_view/helpers/tags/week_field.rb +13 -0
- data/lib/action_view/helpers/text_helper.rb +126 -113
- data/lib/action_view/helpers/translation_helper.rb +32 -16
- data/lib/action_view/helpers/url_helper.rb +200 -271
- data/lib/action_view/locale/en.yml +1 -105
- data/lib/action_view/log_subscriber.rb +6 -4
- data/lib/action_view/lookup_context.rb +15 -39
- data/lib/action_view/model_naming.rb +12 -0
- data/lib/action_view/path_set.rb +9 -39
- data/lib/action_view/railtie.rb +6 -22
- data/lib/action_view/record_identifier.rb +84 -0
- data/lib/action_view/renderer/abstract_renderer.rb +10 -19
- data/lib/action_view/renderer/partial_renderer.rb +144 -81
- data/lib/action_view/renderer/renderer.rb +2 -19
- data/lib/action_view/renderer/streaming_template_renderer.rb +2 -5
- data/lib/action_view/renderer/template_renderer.rb +14 -13
- data/lib/action_view/routing_url_for.rb +107 -0
- data/lib/action_view/template.rb +22 -21
- data/lib/action_view/template/error.rb +22 -12
- data/lib/action_view/template/handlers.rb +12 -9
- data/lib/action_view/template/handlers/builder.rb +1 -1
- data/lib/action_view/template/handlers/erb.rb +11 -16
- data/lib/action_view/template/handlers/raw.rb +11 -0
- data/lib/action_view/template/resolver.rb +111 -83
- data/lib/action_view/template/text.rb +12 -8
- data/lib/action_view/template/types.rb +57 -0
- data/lib/action_view/test_case.rb +66 -43
- data/lib/action_view/testing/resolvers.rb +3 -2
- data/lib/action_view/vendor/html-scanner.rb +20 -0
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/document.rb +0 -0
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/node.rb +12 -12
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/sanitizer.rb +18 -7
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/selector.rb +1 -1
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/tokenizer.rb +1 -1
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/version.rb +0 -0
- metadata +135 -125
- data/lib/action_controller/caching/actions.rb +0 -185
- data/lib/action_controller/caching/pages.rb +0 -187
- data/lib/action_controller/caching/sweeping.rb +0 -97
- data/lib/action_controller/deprecated/performance_test.rb +0 -1
- data/lib/action_controller/metal/compatibility.rb +0 -65
- data/lib/action_controller/metal/session_management.rb +0 -14
- data/lib/action_controller/railties/paths.rb +0 -25
- data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
- data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
- data/lib/action_dispatch/middleware/head.rb +0 -18
- data/lib/action_dispatch/middleware/rescue.rb +0 -26
- data/lib/action_dispatch/testing/performance_test.rb +0 -10
- data/lib/action_view/asset_paths.rb +0 -142
- data/lib/action_view/helpers/asset_paths.rb +0 -7
- data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
- data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
- data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
- data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
- data/lib/sprockets/assets.rake +0 -99
- data/lib/sprockets/bootstrap.rb +0 -37
- data/lib/sprockets/compressors.rb +0 -83
- data/lib/sprockets/helpers.rb +0 -6
- data/lib/sprockets/helpers/isolated_helper.rb +0 -13
- data/lib/sprockets/helpers/rails_helper.rb +0 -182
- data/lib/sprockets/railtie.rb +0 -62
- data/lib/sprockets/static_compiler.rb +0 -56
@@ -1,20 +1,5 @@
|
|
1
|
-
|
1
|
+
require 'action_view/vendor/html-scanner'
|
2
|
+
require 'active_support/deprecation'
|
2
3
|
|
3
|
-
|
4
|
-
|
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
|
20
|
-
end
|
4
|
+
ActiveSupport::Deprecation.warn 'Vendored html-scanner was moved to action_view, please require "action_view/vendor/html-scanner" instead. ' +
|
5
|
+
'This file will be removed in Rails 4.1'
|
data/lib/action_dispatch.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright (c) 2004-
|
2
|
+
# Copyright (c) 2004-2013 David Heinemeier Hansson
|
3
3
|
#
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining
|
5
5
|
# a copy of this software and associated documentation files (the
|
@@ -21,17 +21,11 @@
|
|
21
21
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
22
|
#++
|
23
23
|
|
24
|
-
activesupport_path = File.expand_path('../../../activesupport/lib', __FILE__)
|
25
|
-
$:.unshift(activesupport_path) if File.directory?(activesupport_path) && !$:.include?(activesupport_path)
|
26
|
-
|
27
|
-
activemodel_path = File.expand_path('../../../activemodel/lib', __FILE__)
|
28
|
-
$:.unshift(activemodel_path) if File.directory?(activemodel_path) && !$:.include?(activemodel_path)
|
29
|
-
|
30
24
|
require 'active_support'
|
31
|
-
require 'active_support/
|
25
|
+
require 'active_support/rails'
|
26
|
+
require 'active_support/core_ext/module/attribute_accessors'
|
32
27
|
|
33
28
|
require 'action_pack'
|
34
|
-
require 'active_model'
|
35
29
|
require 'rack'
|
36
30
|
|
37
31
|
module Rack
|
@@ -41,14 +35,18 @@ end
|
|
41
35
|
module ActionDispatch
|
42
36
|
extend ActiveSupport::Autoload
|
43
37
|
|
44
|
-
|
45
|
-
|
46
|
-
|
38
|
+
class IllegalStateError < StandardError
|
39
|
+
end
|
40
|
+
|
41
|
+
eager_autoload do
|
42
|
+
autoload_under 'http' do
|
43
|
+
autoload :Request
|
44
|
+
autoload :Response
|
45
|
+
end
|
47
46
|
end
|
48
47
|
|
49
48
|
autoload_under 'middleware' do
|
50
49
|
autoload :RequestId
|
51
|
-
autoload :BestStandardsSupport
|
52
50
|
autoload :Callbacks
|
53
51
|
autoload :Cookies
|
54
52
|
autoload :DebugExceptions
|
@@ -59,11 +57,12 @@ module ActionDispatch
|
|
59
57
|
autoload :PublicExceptions
|
60
58
|
autoload :Reloader
|
61
59
|
autoload :RemoteIp
|
62
|
-
autoload :Rescue
|
63
60
|
autoload :ShowExceptions
|
61
|
+
autoload :SSL
|
64
62
|
autoload :Static
|
65
63
|
end
|
66
64
|
|
65
|
+
autoload :Journey
|
67
66
|
autoload :MiddlewareStack, 'action_dispatch/middleware/stack'
|
68
67
|
autoload :Routing
|
69
68
|
|
@@ -76,23 +75,27 @@ module ActionDispatch
|
|
76
75
|
autoload :Parameters
|
77
76
|
autoload :ParameterFilter
|
78
77
|
autoload :FilterParameters
|
78
|
+
autoload :FilterRedirect
|
79
79
|
autoload :Upload
|
80
80
|
autoload :UploadedFile, 'action_dispatch/http/upload'
|
81
81
|
autoload :URL
|
82
82
|
end
|
83
83
|
|
84
84
|
module Session
|
85
|
-
autoload :AbstractStore,
|
86
|
-
autoload :CookieStore,
|
87
|
-
autoload :
|
88
|
-
autoload :
|
85
|
+
autoload :AbstractStore, 'action_dispatch/middleware/session/abstract_store'
|
86
|
+
autoload :CookieStore, 'action_dispatch/middleware/session/cookie_store'
|
87
|
+
autoload :EncryptedCookieStore, 'action_dispatch/middleware/session/cookie_store'
|
88
|
+
autoload :UpgradeSignatureToEncryptionCookieStore, 'action_dispatch/middleware/session/cookie_store'
|
89
|
+
autoload :MemCacheStore, 'action_dispatch/middleware/session/mem_cache_store'
|
90
|
+
autoload :CacheStore, 'action_dispatch/middleware/session/cache_store'
|
89
91
|
end
|
90
92
|
|
93
|
+
mattr_accessor :test_app
|
94
|
+
|
91
95
|
autoload_under 'testing' do
|
92
96
|
autoload :Assertions
|
93
97
|
autoload :Integration
|
94
98
|
autoload :IntegrationTest, 'action_dispatch/testing/integration'
|
95
|
-
autoload :PerformanceTest
|
96
99
|
autoload :TestProcess
|
97
100
|
autoload :TestRequest
|
98
101
|
autoload :TestResponse
|
@@ -100,3 +103,8 @@ module ActionDispatch
|
|
100
103
|
end
|
101
104
|
|
102
105
|
autoload :Mime, 'action_dispatch/http/mime_type'
|
106
|
+
|
107
|
+
ActiveSupport.on_load(:action_view) do
|
108
|
+
ActionView::Base.default_formats ||= Mime::SET.symbols
|
109
|
+
ActionView::Template::Types.delegate_to Mime
|
110
|
+
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'active_support/core_ext/object/blank'
|
2
1
|
|
3
2
|
module ActionDispatch
|
4
3
|
module Http
|
@@ -18,12 +17,21 @@ module ActionDispatch
|
|
18
17
|
env[HTTP_IF_NONE_MATCH]
|
19
18
|
end
|
20
19
|
|
20
|
+
def if_none_match_etags
|
21
|
+
(if_none_match ? if_none_match.split(/\s*,\s*/) : []).collect do |etag|
|
22
|
+
etag.gsub(/^\"|\"$/, "")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
21
26
|
def not_modified?(modified_at)
|
22
27
|
if_modified_since && modified_at && if_modified_since >= modified_at
|
23
28
|
end
|
24
29
|
|
25
30
|
def etag_matches?(etag)
|
26
|
-
|
31
|
+
if etag
|
32
|
+
etag = etag.gsub(/^\"|\"$/, "")
|
33
|
+
if_none_match_etags.include?(etag)
|
34
|
+
end
|
27
35
|
end
|
28
36
|
|
29
37
|
# Check response freshness (Last-Modified and ETag) against request
|
@@ -60,6 +68,20 @@ module ActionDispatch
|
|
60
68
|
headers[LAST_MODIFIED] = utc_time.httpdate
|
61
69
|
end
|
62
70
|
|
71
|
+
def date
|
72
|
+
if date_header = headers['Date']
|
73
|
+
Time.httpdate(date_header)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def date?
|
78
|
+
headers.include?('Date')
|
79
|
+
end
|
80
|
+
|
81
|
+
def date=(utc_time)
|
82
|
+
headers['Date'] = utc_time.httpdate
|
83
|
+
end
|
84
|
+
|
63
85
|
def etag=(etag)
|
64
86
|
key = ActiveSupport::Cache.expand_cache_key(etag)
|
65
87
|
@etag = self[ETAG] = %("#{Digest::MD5.hexdigest(key)}")
|
@@ -70,17 +92,37 @@ module ActionDispatch
|
|
70
92
|
LAST_MODIFIED = "Last-Modified".freeze
|
71
93
|
ETAG = "ETag".freeze
|
72
94
|
CACHE_CONTROL = "Cache-Control".freeze
|
95
|
+
SPESHUL_KEYS = %w[extras no-cache max-age public must-revalidate]
|
73
96
|
|
74
|
-
def
|
75
|
-
@cache_control = {}
|
76
|
-
@etag = self[ETAG]
|
77
|
-
|
97
|
+
def cache_control_segments
|
78
98
|
if cache_control = self[CACHE_CONTROL]
|
79
|
-
cache_control.split(
|
80
|
-
|
81
|
-
|
99
|
+
cache_control.delete(' ').split(',')
|
100
|
+
else
|
101
|
+
[]
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def cache_control_headers
|
106
|
+
cache_control = {}
|
107
|
+
|
108
|
+
cache_control_segments.each do |segment|
|
109
|
+
directive, argument = segment.split('=', 2)
|
110
|
+
|
111
|
+
if SPESHUL_KEYS.include? directive
|
112
|
+
key = directive.tr('-', '_')
|
113
|
+
cache_control[key.to_sym] = argument || true
|
114
|
+
else
|
115
|
+
cache_control[:extras] ||= []
|
116
|
+
cache_control[:extras] << segment
|
82
117
|
end
|
83
118
|
end
|
119
|
+
|
120
|
+
cache_control
|
121
|
+
end
|
122
|
+
|
123
|
+
def prepare_cache_control!
|
124
|
+
@cache_control = cache_control_headers
|
125
|
+
@etag = self[ETAG]
|
84
126
|
end
|
85
127
|
|
86
128
|
def handle_conditional_get!
|
@@ -96,14 +138,24 @@ module ActionDispatch
|
|
96
138
|
MUST_REVALIDATE = "must-revalidate".freeze
|
97
139
|
|
98
140
|
def set_conditional_cache_control!
|
99
|
-
|
141
|
+
control = {}
|
142
|
+
cc_headers = cache_control_headers
|
143
|
+
if extras = cc_headers.delete(:extras)
|
144
|
+
@cache_control[:extras] ||= []
|
145
|
+
@cache_control[:extras] += extras
|
146
|
+
@cache_control[:extras].uniq!
|
147
|
+
end
|
100
148
|
|
101
|
-
control
|
149
|
+
control.merge! cc_headers
|
150
|
+
control.merge! @cache_control
|
102
151
|
|
103
152
|
if control.empty?
|
104
153
|
headers[CACHE_CONTROL] = DEFAULT_CACHE_CONTROL
|
105
154
|
elsif control[:no_cache]
|
106
155
|
headers[CACHE_CONTROL] = NO_CACHE
|
156
|
+
if control[:extras]
|
157
|
+
headers[CACHE_CONTROL] += ", #{control[:extras].join(', ')}"
|
158
|
+
end
|
107
159
|
else
|
108
160
|
extras = control[:extras]
|
109
161
|
max_age = control[:max_age]
|
@@ -1,6 +1,6 @@
|
|
1
|
-
require 'active_support/core_ext/object/blank'
|
2
1
|
require 'active_support/core_ext/hash/keys'
|
3
2
|
require 'active_support/core_ext/object/duplicable'
|
3
|
+
require 'action_dispatch/http/parameter_filter'
|
4
4
|
|
5
5
|
module ActionDispatch
|
6
6
|
module Http
|
@@ -10,8 +10,6 @@ module ActionDispatch
|
|
10
10
|
# value of the params hash and all subhashes is passed to it, the value
|
11
11
|
# or key can be replaced using String#replace or similar method.
|
12
12
|
#
|
13
|
-
# Examples:
|
14
|
-
#
|
15
13
|
# env["action_dispatch.parameter_filter"] = [:password]
|
16
14
|
# => replaces the value to all keys matching /password/i with "[FILTERED]"
|
17
15
|
#
|
@@ -22,9 +20,17 @@ module ActionDispatch
|
|
22
20
|
# v.reverse! if k =~ /secret/i
|
23
21
|
# end
|
24
22
|
# => reverses the value to all keys matching /secret/i
|
25
|
-
#
|
26
23
|
module FilterParameters
|
27
|
-
|
24
|
+
ENV_MATCH = [/RAW_POST_DATA/, "rack.request.form_vars"] # :nodoc:
|
25
|
+
NULL_PARAM_FILTER = ParameterFilter.new # :nodoc:
|
26
|
+
NULL_ENV_FILTER = ParameterFilter.new ENV_MATCH # :nodoc:
|
27
|
+
|
28
|
+
def initialize(env)
|
29
|
+
super
|
30
|
+
@filtered_parameters = nil
|
31
|
+
@filtered_env = nil
|
32
|
+
@filtered_path = nil
|
33
|
+
end
|
28
34
|
|
29
35
|
# Return a hash of parameters with all sensitive data replaced.
|
30
36
|
def filtered_parameters
|
@@ -44,11 +50,16 @@ module ActionDispatch
|
|
44
50
|
protected
|
45
51
|
|
46
52
|
def parameter_filter
|
47
|
-
parameter_filter_for
|
53
|
+
parameter_filter_for @env.fetch("action_dispatch.parameter_filter") {
|
54
|
+
return NULL_PARAM_FILTER
|
55
|
+
}
|
48
56
|
end
|
49
57
|
|
50
58
|
def env_filter
|
51
|
-
|
59
|
+
user_key = @env.fetch("action_dispatch.parameter_filter") {
|
60
|
+
return NULL_ENV_FILTER
|
61
|
+
}
|
62
|
+
parameter_filter_for(Array(user_key) + ENV_MATCH)
|
52
63
|
end
|
53
64
|
|
54
65
|
def parameter_filter_for(filters)
|
@@ -62,7 +73,6 @@ module ActionDispatch
|
|
62
73
|
parameter_filter.filter([[$1, $2]]).first.join("=")
|
63
74
|
end
|
64
75
|
end
|
65
|
-
|
66
76
|
end
|
67
77
|
end
|
68
78
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module ActionDispatch
|
2
|
+
module Http
|
3
|
+
module FilterRedirect
|
4
|
+
|
5
|
+
FILTERED = '[FILTERED]'.freeze # :nodoc:
|
6
|
+
|
7
|
+
def filtered_location
|
8
|
+
if !location_filter.empty? && location_filter_match?
|
9
|
+
FILTERED
|
10
|
+
else
|
11
|
+
location
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def location_filter
|
18
|
+
if request.present?
|
19
|
+
request.env['action_dispatch.redirect_filter'] || []
|
20
|
+
else
|
21
|
+
[]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def location_filter_match?
|
26
|
+
location_filter.any? do |filter|
|
27
|
+
if String === filter
|
28
|
+
location.include?(filter)
|
29
|
+
elsif Regexp === filter
|
30
|
+
location.match(filter)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -1,31 +1,39 @@
|
|
1
1
|
module ActionDispatch
|
2
2
|
module Http
|
3
|
-
class Headers
|
4
|
-
|
3
|
+
class Headers
|
4
|
+
include Enumerable
|
5
5
|
|
6
|
-
def initialize(
|
7
|
-
|
8
|
-
if args.size == 1 && args[0].is_a?(Hash)
|
9
|
-
super()
|
10
|
-
update(args[0])
|
11
|
-
else
|
12
|
-
super
|
13
|
-
end
|
6
|
+
def initialize(env = {})
|
7
|
+
@headers = env
|
14
8
|
end
|
15
9
|
|
16
10
|
def [](header_name)
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
11
|
+
@headers[env_name(header_name)]
|
12
|
+
end
|
13
|
+
|
14
|
+
def []=(k,v); @headers[k] = v; end
|
15
|
+
def key?(k); @headers.key? k; end
|
16
|
+
alias :include? :key?
|
17
|
+
|
18
|
+
def fetch(header_name, *args, &block)
|
19
|
+
@headers.fetch env_name(header_name), *args, &block
|
20
|
+
end
|
21
|
+
|
22
|
+
def each(&block)
|
23
|
+
@headers.each(&block)
|
22
24
|
end
|
23
25
|
|
24
26
|
private
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
27
|
+
|
28
|
+
# Converts a HTTP header name to an environment variable name if it is
|
29
|
+
# not contained within the headers hash.
|
30
|
+
def env_name(header_name)
|
31
|
+
@headers.include?(header_name) ? header_name : cgi_name(header_name)
|
32
|
+
end
|
33
|
+
|
34
|
+
def cgi_name(k)
|
35
|
+
"HTTP_#{k.upcase.gsub(/-/, '_')}"
|
36
|
+
end
|
29
37
|
end
|
30
38
|
end
|
31
39
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'active_support/core_ext/module/attribute_accessors'
|
2
|
+
|
1
3
|
module ActionDispatch
|
2
4
|
module Http
|
3
5
|
module MimeNegotiation
|
@@ -66,7 +68,7 @@ module ActionDispatch
|
|
66
68
|
# that are not controlled by the extension.
|
67
69
|
#
|
68
70
|
# class ApplicationController < ActionController::Base
|
69
|
-
#
|
71
|
+
# before_action :adjust_format_for_iphone
|
70
72
|
#
|
71
73
|
# private
|
72
74
|
# def adjust_format_for_iphone
|
@@ -78,6 +80,27 @@ module ActionDispatch
|
|
78
80
|
@env["action_dispatch.request.formats"] = [Mime::Type.lookup_by_extension(parameters[:format])]
|
79
81
|
end
|
80
82
|
|
83
|
+
# Sets the \formats by string extensions. This differs from #format= by allowing you
|
84
|
+
# to set multiple, ordered formats, which is useful when you want to have a fallback.
|
85
|
+
#
|
86
|
+
# In this example, the :iphone format will be used if it's available, otherwise it'll fallback
|
87
|
+
# to the :html format.
|
88
|
+
#
|
89
|
+
# class ApplicationController < ActionController::Base
|
90
|
+
# before_action :adjust_format_for_iphone_with_html_fallback
|
91
|
+
#
|
92
|
+
# private
|
93
|
+
# def adjust_format_for_iphone_with_html_fallback
|
94
|
+
# request.formats = [ :iphone, :html ] if request.env["HTTP_USER_AGENT"][/iPhone/]
|
95
|
+
# end
|
96
|
+
# end
|
97
|
+
def formats=(extensions)
|
98
|
+
parameters[:format] = extensions.first.to_s
|
99
|
+
@env["action_dispatch.request.formats"] = extensions.collect do |extension|
|
100
|
+
Mime::Type.lookup_by_extension(extension)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
81
104
|
# Receives an array of mimes and return the first user sent mime that
|
82
105
|
# matches the order array.
|
83
106
|
#
|
@@ -98,7 +121,7 @@ module ActionDispatch
|
|
98
121
|
BROWSER_LIKE_ACCEPTS = /,\s*\*\/\*|\*\/\*\s*,/
|
99
122
|
|
100
123
|
def valid_accept_header
|
101
|
-
(xhr? && (accept
|
124
|
+
(xhr? && (accept || content_mime_type)) ||
|
102
125
|
(accept.present? && accept !~ BROWSER_LIKE_ACCEPTS)
|
103
126
|
end
|
104
127
|
|