actionpack 3.2.19 → 4.2.11.3
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 +7 -0
- data/CHANGELOG.md +412 -503
- data/MIT-LICENSE +1 -1
- data/README.rdoc +11 -294
- data/lib/abstract_controller/asset_paths.rb +2 -2
- data/lib/abstract_controller/base.rb +52 -18
- data/lib/abstract_controller/callbacks.rb +87 -89
- data/lib/abstract_controller/collector.rb +17 -3
- data/lib/abstract_controller/helpers.rb +41 -14
- data/lib/abstract_controller/logger.rb +1 -2
- data/lib/abstract_controller/railties/routes_helpers.rb +3 -3
- data/lib/abstract_controller/rendering.rb +65 -118
- data/lib/abstract_controller/translation.rb +16 -1
- data/lib/abstract_controller/url_for.rb +7 -7
- data/lib/abstract_controller.rb +2 -10
- data/lib/action_controller/base.rb +61 -28
- data/lib/action_controller/caching/fragments.rb +30 -54
- data/lib/action_controller/caching.rb +38 -35
- data/lib/action_controller/log_subscriber.rb +35 -18
- data/lib/action_controller/metal/conditional_get.rb +103 -34
- data/lib/action_controller/metal/data_streaming.rb +20 -26
- data/lib/action_controller/metal/etag_with_template_digest.rb +50 -0
- data/lib/action_controller/metal/exceptions.rb +19 -6
- data/lib/action_controller/metal/flash.rb +41 -9
- data/lib/action_controller/metal/force_ssl.rb +70 -12
- data/lib/action_controller/metal/head.rb +30 -7
- data/lib/action_controller/metal/helpers.rb +11 -11
- data/lib/action_controller/metal/hide_actions.rb +0 -1
- data/lib/action_controller/metal/http_authentication.rb +140 -94
- data/lib/action_controller/metal/implicit_render.rb +1 -1
- data/lib/action_controller/metal/instrumentation.rb +11 -7
- data/lib/action_controller/metal/live.rb +328 -0
- data/lib/action_controller/metal/mime_responds.rb +161 -152
- data/lib/action_controller/metal/params_wrapper.rb +126 -81
- data/lib/action_controller/metal/rack_delegation.rb +10 -4
- data/lib/action_controller/metal/redirecting.rb +44 -41
- data/lib/action_controller/metal/renderers.rb +48 -19
- data/lib/action_controller/metal/rendering.rb +46 -11
- data/lib/action_controller/metal/request_forgery_protection.rb +250 -29
- data/lib/action_controller/metal/streaming.rb +30 -38
- data/lib/action_controller/metal/strong_parameters.rb +669 -0
- data/lib/action_controller/metal/testing.rb +12 -18
- data/lib/action_controller/metal/url_for.rb +31 -29
- data/lib/action_controller/metal.rb +31 -40
- data/lib/action_controller/model_naming.rb +12 -0
- data/lib/action_controller/railtie.rb +38 -18
- data/lib/action_controller/railties/helpers.rb +22 -0
- data/lib/action_controller/test_case.rb +359 -173
- data/lib/action_controller.rb +9 -16
- data/lib/action_dispatch/http/cache.rb +64 -11
- data/lib/action_dispatch/http/filter_parameters.rb +20 -10
- data/lib/action_dispatch/http/filter_redirect.rb +38 -0
- data/lib/action_dispatch/http/headers.rb +85 -17
- data/lib/action_dispatch/http/mime_negotiation.rb +55 -5
- data/lib/action_dispatch/http/mime_type.rb +167 -114
- data/lib/action_dispatch/http/mime_types.rb +2 -1
- data/lib/action_dispatch/http/parameter_filter.rb +44 -46
- data/lib/action_dispatch/http/parameters.rb +30 -46
- data/lib/action_dispatch/http/rack_cache.rb +2 -3
- data/lib/action_dispatch/http/request.rb +108 -45
- data/lib/action_dispatch/http/response.rb +247 -48
- data/lib/action_dispatch/http/upload.rb +60 -29
- data/lib/action_dispatch/http/url.rb +135 -45
- data/lib/action_dispatch/journey/backwards.rb +5 -0
- data/lib/action_dispatch/journey/formatter.rb +166 -0
- data/lib/action_dispatch/journey/gtg/builder.rb +162 -0
- data/lib/action_dispatch/journey/gtg/simulator.rb +47 -0
- data/lib/action_dispatch/journey/gtg/transition_table.rb +157 -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 +128 -0
- data/lib/action_dispatch/journey/parser.rb +198 -0
- data/lib/action_dispatch/journey/parser.y +49 -0
- data/lib/action_dispatch/journey/parser_extras.rb +23 -0
- data/lib/action_dispatch/journey/path/pattern.rb +193 -0
- data/lib/action_dispatch/journey/route.rb +125 -0
- data/lib/action_dispatch/journey/router/strexp.rb +27 -0
- data/lib/action_dispatch/journey/router/utils.rb +93 -0
- data/lib/action_dispatch/journey/router.rb +144 -0
- data/lib/action_dispatch/journey/routes.rb +80 -0
- data/lib/action_dispatch/journey/scanner.rb +61 -0
- data/lib/action_dispatch/journey/visitors.rb +221 -0
- data/lib/action_dispatch/journey/visualizer/fsm.css +30 -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/journey.rb +5 -0
- data/lib/action_dispatch/middleware/callbacks.rb +16 -11
- data/lib/action_dispatch/middleware/cookies.rb +346 -125
- data/lib/action_dispatch/middleware/debug_exceptions.rb +52 -24
- data/lib/action_dispatch/middleware/exception_wrapper.rb +75 -9
- data/lib/action_dispatch/middleware/flash.rb +85 -72
- data/lib/action_dispatch/middleware/params_parser.rb +16 -31
- data/lib/action_dispatch/middleware/public_exceptions.rb +39 -14
- data/lib/action_dispatch/middleware/reloader.rb +16 -7
- data/lib/action_dispatch/middleware/remote_ip.rb +132 -40
- data/lib/action_dispatch/middleware/request_id.rb +3 -7
- 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 +84 -29
- data/lib/action_dispatch/middleware/session/mem_cache_store.rb +8 -3
- data/lib/action_dispatch/middleware/show_exceptions.rb +15 -44
- data/lib/action_dispatch/middleware/ssl.rb +72 -0
- data/lib/action_dispatch/middleware/stack.rb +6 -1
- data/lib/action_dispatch/middleware/static.rb +80 -23
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +34 -0
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb +23 -0
- data/lib/action_dispatch/middleware/templates/rescues/_source.erb +27 -0
- data/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb +52 -0
- data/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb +9 -0
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +16 -0
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +9 -0
- data/lib/action_dispatch/middleware/templates/rescues/layout.erb +133 -5
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +11 -0
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.text.erb +3 -0
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +32 -0
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.text.erb +11 -0
- data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +20 -0
- data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +7 -0
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.html.erb +6 -0
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.text.erb +3 -0
- data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
- data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +200 -0
- data/lib/action_dispatch/railtie.rb +19 -6
- data/lib/action_dispatch/request/session.rb +193 -0
- data/lib/action_dispatch/request/utils.rb +35 -0
- data/lib/action_dispatch/routing/endpoint.rb +10 -0
- data/lib/action_dispatch/routing/inspector.rb +234 -0
- data/lib/action_dispatch/routing/mapper.rb +897 -436
- data/lib/action_dispatch/routing/polymorphic_routes.rb +213 -92
- data/lib/action_dispatch/routing/redirection.rb +97 -37
- data/lib/action_dispatch/routing/route_set.rb +432 -239
- data/lib/action_dispatch/routing/routes_proxy.rb +7 -4
- data/lib/action_dispatch/routing/url_for.rb +63 -34
- data/lib/action_dispatch/routing.rb +57 -89
- data/lib/action_dispatch/testing/assertions/dom.rb +2 -36
- data/lib/action_dispatch/testing/assertions/response.rb +24 -38
- data/lib/action_dispatch/testing/assertions/routing.rb +55 -54
- data/lib/action_dispatch/testing/assertions/selector.rb +2 -434
- data/lib/action_dispatch/testing/assertions/tag.rb +2 -137
- data/lib/action_dispatch/testing/assertions.rb +11 -7
- data/lib/action_dispatch/testing/integration.rb +88 -72
- data/lib/action_dispatch/testing/test_process.rb +9 -6
- data/lib/action_dispatch/testing/test_request.rb +13 -9
- data/lib/action_dispatch/testing/test_response.rb +1 -5
- data/lib/action_dispatch.rb +24 -21
- data/lib/action_pack/gem_version.rb +15 -0
- data/lib/action_pack/version.rb +5 -7
- data/lib/action_pack.rb +1 -1
- metadata +181 -292
- data/lib/abstract_controller/layouts.rb +0 -423
- data/lib/abstract_controller/view_paths.rb +0 -96
- 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/integration_test.rb +0 -2
- data/lib/action_controller/deprecated/performance_test.rb +0 -1
- data/lib/action_controller/deprecated.rb +0 -3
- data/lib/action_controller/metal/compatibility.rb +0 -65
- data/lib/action_controller/metal/responder.rb +0 -286
- data/lib/action_controller/metal/session_management.rb +0 -14
- data/lib/action_controller/railties/paths.rb +0 -25
- data/lib/action_controller/record_identifier.rb +0 -85
- data/lib/action_controller/vendor/html-scanner/html/document.rb +0 -68
- data/lib/action_controller/vendor/html-scanner/html/node.rb +0 -532
- data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +0 -177
- data/lib/action_controller/vendor/html-scanner/html/selector.rb +0 -830
- data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +0 -107
- data/lib/action_controller/vendor/html-scanner/html/version.rb +0 -11
- data/lib/action_controller/vendor/html-scanner.rb +0 -20
- 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/middleware/templates/rescues/_request_and_response.erb +0 -31
- data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +0 -26
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +0 -10
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +0 -2
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +0 -15
- data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +0 -17
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +0 -2
- data/lib/action_dispatch/testing/performance_test.rb +0 -10
- data/lib/action_view/asset_paths.rb +0 -142
- data/lib/action_view/base.rb +0 -220
- data/lib/action_view/buffers.rb +0 -43
- data/lib/action_view/context.rb +0 -36
- data/lib/action_view/flows.rb +0 -79
- data/lib/action_view/helpers/active_model_helper.rb +0 -50
- data/lib/action_view/helpers/asset_paths.rb +0 -7
- data/lib/action_view/helpers/asset_tag_helper.rb +0 -457
- 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/action_view/helpers/atom_feed_helper.rb +0 -200
- data/lib/action_view/helpers/cache_helper.rb +0 -64
- data/lib/action_view/helpers/capture_helper.rb +0 -203
- data/lib/action_view/helpers/controller_helper.rb +0 -25
- data/lib/action_view/helpers/csrf_helper.rb +0 -32
- data/lib/action_view/helpers/date_helper.rb +0 -1062
- data/lib/action_view/helpers/debug_helper.rb +0 -40
- data/lib/action_view/helpers/form_helper.rb +0 -1486
- data/lib/action_view/helpers/form_options_helper.rb +0 -658
- data/lib/action_view/helpers/form_tag_helper.rb +0 -685
- data/lib/action_view/helpers/javascript_helper.rb +0 -110
- data/lib/action_view/helpers/number_helper.rb +0 -622
- data/lib/action_view/helpers/output_safety_helper.rb +0 -38
- data/lib/action_view/helpers/record_tag_helper.rb +0 -111
- data/lib/action_view/helpers/rendering_helper.rb +0 -90
- data/lib/action_view/helpers/sanitize_helper.rb +0 -259
- data/lib/action_view/helpers/tag_helper.rb +0 -160
- data/lib/action_view/helpers/text_helper.rb +0 -426
- data/lib/action_view/helpers/translation_helper.rb +0 -91
- data/lib/action_view/helpers/url_helper.rb +0 -693
- data/lib/action_view/helpers.rb +0 -60
- data/lib/action_view/locale/en.yml +0 -160
- data/lib/action_view/log_subscriber.rb +0 -28
- data/lib/action_view/lookup_context.rb +0 -254
- data/lib/action_view/path_set.rb +0 -89
- data/lib/action_view/railtie.rb +0 -55
- data/lib/action_view/renderer/abstract_renderer.rb +0 -41
- data/lib/action_view/renderer/partial_renderer.rb +0 -415
- data/lib/action_view/renderer/renderer.rb +0 -54
- data/lib/action_view/renderer/streaming_template_renderer.rb +0 -106
- data/lib/action_view/renderer/template_renderer.rb +0 -94
- data/lib/action_view/template/error.rb +0 -128
- data/lib/action_view/template/handlers/builder.rb +0 -26
- data/lib/action_view/template/handlers/erb.rb +0 -125
- data/lib/action_view/template/handlers.rb +0 -50
- data/lib/action_view/template/resolver.rb +0 -272
- data/lib/action_view/template/text.rb +0 -30
- data/lib/action_view/template.rb +0 -337
- data/lib/action_view/test_case.rb +0 -245
- data/lib/action_view/testing/resolvers.rb +0 -50
- data/lib/action_view.rb +0 -84
- 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/isolated_helper.rb +0 -13
- data/lib/sprockets/helpers/rails_helper.rb +0 -182
- data/lib/sprockets/helpers.rb +0 -6
- data/lib/sprockets/railtie.rb +0 -62
- data/lib/sprockets/static_compiler.rb +0 -56
@@ -1,11 +1,12 @@
|
|
1
1
|
require 'set'
|
2
|
-
require '
|
3
|
-
require 'active_support/core_ext/
|
2
|
+
require 'singleton'
|
3
|
+
require 'active_support/core_ext/module/attribute_accessors'
|
4
|
+
require 'active_support/core_ext/string/starts_ends_with'
|
4
5
|
|
5
6
|
module Mime
|
6
7
|
class Mimes < Array
|
7
8
|
def symbols
|
8
|
-
@symbols ||= map {|m| m.to_sym }
|
9
|
+
@symbols ||= map { |m| m.to_sym }
|
9
10
|
end
|
10
11
|
|
11
12
|
%w(<< concat shift unshift push pop []= clear compact! collect!
|
@@ -22,11 +23,18 @@ module Mime
|
|
22
23
|
|
23
24
|
SET = Mimes.new
|
24
25
|
EXTENSION_LOOKUP = {}
|
25
|
-
LOOKUP =
|
26
|
+
LOOKUP = {}
|
26
27
|
|
27
|
-
|
28
|
-
|
29
|
-
|
28
|
+
class << self
|
29
|
+
def [](type)
|
30
|
+
return type if type.is_a?(Type)
|
31
|
+
Type.lookup_by_extension(type)
|
32
|
+
end
|
33
|
+
|
34
|
+
def fetch(type)
|
35
|
+
return type if type.is_a?(Type)
|
36
|
+
EXTENSION_LOOKUP.fetch(type.to_s) { |k| yield k }
|
37
|
+
end
|
30
38
|
end
|
31
39
|
|
32
40
|
# Encapsulates the notion of a mime type. Can be used at render time, for example, with:
|
@@ -37,8 +45,8 @@ module Mime
|
|
37
45
|
#
|
38
46
|
# respond_to do |format|
|
39
47
|
# format.html
|
40
|
-
# format.ics { render :
|
41
|
-
# format.xml { render :
|
48
|
+
# format.ics { render text: @post.to_ics, mime_type: Mime::Type["text/calendar"] }
|
49
|
+
# format.xml { render xml: @post }
|
42
50
|
# end
|
43
51
|
# end
|
44
52
|
# end
|
@@ -46,46 +54,99 @@ module Mime
|
|
46
54
|
@@html_types = Set.new [:html, :all]
|
47
55
|
cattr_reader :html_types
|
48
56
|
|
49
|
-
# These are the content types which browsers can generate without using ajax, flash, etc
|
50
|
-
# i.e. following a link, getting an image or posting a form. CSRF protection
|
51
|
-
# only needs to protect against these types.
|
52
|
-
@@browser_generated_types = Set.new [:html, :url_encoded_form, :multipart_form, :text]
|
53
|
-
cattr_reader :browser_generated_types
|
54
57
|
attr_reader :symbol
|
55
58
|
|
59
|
+
@register_callbacks = []
|
60
|
+
|
56
61
|
# A simple helper class used in parsing the accept header
|
57
62
|
class AcceptItem #:nodoc:
|
58
|
-
attr_accessor :
|
63
|
+
attr_accessor :index, :name, :q
|
64
|
+
alias :to_s :name
|
59
65
|
|
60
|
-
def initialize(
|
61
|
-
@
|
62
|
-
@name = name
|
63
|
-
q ||= 0.0 if @name == Mime::ALL # default wildcard match to end of list
|
66
|
+
def initialize(index, name, q = nil)
|
67
|
+
@index = index
|
68
|
+
@name = name
|
69
|
+
q ||= 0.0 if @name == Mime::ALL.to_s # default wildcard match to end of list
|
64
70
|
@q = ((q || 1.0).to_f * 100).to_i
|
65
71
|
end
|
66
72
|
|
67
|
-
def to_s
|
68
|
-
@name
|
69
|
-
end
|
70
|
-
|
71
73
|
def <=>(item)
|
72
|
-
result = item.q <=> q
|
73
|
-
result =
|
74
|
+
result = item.q <=> @q
|
75
|
+
result = @index <=> item.index if result == 0
|
74
76
|
result
|
75
77
|
end
|
76
78
|
|
77
79
|
def ==(item)
|
78
|
-
name ==
|
80
|
+
@name == item.to_s
|
79
81
|
end
|
80
82
|
end
|
81
83
|
|
82
|
-
class
|
84
|
+
class AcceptList < Array #:nodoc:
|
85
|
+
def assort!
|
86
|
+
sort!
|
87
|
+
|
88
|
+
# Take care of the broken text/xml entry by renaming or deleting it
|
89
|
+
if text_xml_idx && app_xml_idx
|
90
|
+
app_xml.q = [text_xml.q, app_xml.q].max # set the q value to the max of the two
|
91
|
+
exchange_xml_items if app_xml_idx > text_xml_idx # make sure app_xml is ahead of text_xml in the list
|
92
|
+
delete_at(text_xml_idx) # delete text_xml from the list
|
93
|
+
elsif text_xml_idx
|
94
|
+
text_xml.name = Mime::XML.to_s
|
95
|
+
end
|
96
|
+
|
97
|
+
# Look for more specific XML-based types and sort them ahead of app/xml
|
98
|
+
if app_xml_idx
|
99
|
+
idx = app_xml_idx
|
100
|
+
|
101
|
+
while idx < length
|
102
|
+
type = self[idx]
|
103
|
+
break if type.q < app_xml.q
|
104
|
+
|
105
|
+
if type.name.ends_with? '+xml'
|
106
|
+
self[app_xml_idx], self[idx] = self[idx], app_xml
|
107
|
+
@app_xml_idx = idx
|
108
|
+
end
|
109
|
+
idx += 1
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
map! { |i| Mime::Type.lookup(i.name) }.uniq!
|
114
|
+
to_a
|
115
|
+
end
|
116
|
+
|
117
|
+
private
|
118
|
+
def text_xml_idx
|
119
|
+
@text_xml_idx ||= index('text/xml')
|
120
|
+
end
|
121
|
+
|
122
|
+
def app_xml_idx
|
123
|
+
@app_xml_idx ||= index(Mime::XML.to_s)
|
124
|
+
end
|
83
125
|
|
126
|
+
def text_xml
|
127
|
+
self[text_xml_idx]
|
128
|
+
end
|
129
|
+
|
130
|
+
def app_xml
|
131
|
+
self[app_xml_idx]
|
132
|
+
end
|
133
|
+
|
134
|
+
def exchange_xml_items
|
135
|
+
self[app_xml_idx], self[text_xml_idx] = text_xml, app_xml
|
136
|
+
@app_xml_idx, @text_xml_idx = text_xml_idx, app_xml_idx
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
class << self
|
84
141
|
TRAILING_STAR_REGEXP = /(text|application)\/\*/
|
85
|
-
|
142
|
+
PARAMETER_SEPARATOR_REGEXP = /;\s*\w+="?\w+"?/
|
143
|
+
|
144
|
+
def register_callback(&block)
|
145
|
+
@register_callbacks << block
|
146
|
+
end
|
86
147
|
|
87
148
|
def lookup(string)
|
88
|
-
LOOKUP[string]
|
149
|
+
LOOKUP[string] || Type.new(string)
|
89
150
|
end
|
90
151
|
|
91
152
|
def lookup_by_extension(extension)
|
@@ -99,91 +160,51 @@ module Mime
|
|
99
160
|
end
|
100
161
|
|
101
162
|
def register(string, symbol, mime_type_synonyms = [], extension_synonyms = [], skip_lookup = false)
|
102
|
-
Mime.const_set(symbol.
|
163
|
+
Mime.const_set(symbol.upcase, Type.new(string, symbol, mime_type_synonyms))
|
103
164
|
|
104
|
-
|
165
|
+
new_mime = Mime.const_get(symbol.upcase)
|
166
|
+
SET << new_mime
|
105
167
|
|
106
168
|
([string] + mime_type_synonyms).each { |str| LOOKUP[str] = SET.last } unless skip_lookup
|
107
169
|
([symbol] + extension_synonyms).each { |ext| EXTENSION_LOOKUP[ext.to_s] = SET.last }
|
170
|
+
|
171
|
+
@register_callbacks.each do |callback|
|
172
|
+
callback.call(new_mime)
|
173
|
+
end
|
108
174
|
end
|
109
175
|
|
110
176
|
def parse(accept_header)
|
111
|
-
if accept_header
|
112
|
-
accept_header = accept_header.split(
|
113
|
-
|
114
|
-
parse_data_with_trailing_star($1)
|
115
|
-
else
|
116
|
-
[Mime::Type.lookup(accept_header)]
|
117
|
-
end
|
177
|
+
if !accept_header.include?(',')
|
178
|
+
accept_header = accept_header.split(PARAMETER_SEPARATOR_REGEXP).first
|
179
|
+
parse_trailing_star(accept_header) || [Mime::Type.lookup(accept_header)].compact
|
118
180
|
else
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
params, q = header.split(Q_SEPARATOR_REGEXP)
|
181
|
+
list, index = AcceptList.new, 0
|
182
|
+
accept_header.split(',').each do |header|
|
183
|
+
params, q = header.split(PARAMETER_SEPARATOR_REGEXP)
|
123
184
|
if params.present?
|
124
185
|
params.strip!
|
125
186
|
|
126
|
-
|
127
|
-
parse_data_with_trailing_star($1).each do |m|
|
128
|
-
list << AcceptItem.new(index, m.to_s, q)
|
129
|
-
index += 1
|
130
|
-
end
|
131
|
-
else
|
132
|
-
list << AcceptItem.new(index, params, q)
|
133
|
-
index += 1
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|
137
|
-
list.sort!
|
138
|
-
|
139
|
-
# Take care of the broken text/xml entry by renaming or deleting it
|
140
|
-
text_xml = list.index("text/xml")
|
141
|
-
app_xml = list.index(Mime::XML.to_s)
|
142
|
-
|
143
|
-
if text_xml && app_xml
|
144
|
-
# set the q value to the max of the two
|
145
|
-
list[app_xml].q = [list[text_xml].q, list[app_xml].q].max
|
187
|
+
params = parse_trailing_star(params) || [params]
|
146
188
|
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
app_xml, text_xml = text_xml, app_xml
|
151
|
-
end
|
152
|
-
|
153
|
-
# delete text_xml from the list
|
154
|
-
list.delete_at(text_xml)
|
155
|
-
|
156
|
-
elsif text_xml
|
157
|
-
list[text_xml].name = Mime::XML.to_s
|
158
|
-
end
|
159
|
-
|
160
|
-
# Look for more specific XML-based types and sort them ahead of app/xml
|
161
|
-
|
162
|
-
if app_xml
|
163
|
-
idx = app_xml
|
164
|
-
app_xml_type = list[app_xml]
|
165
|
-
|
166
|
-
while(idx < list.length)
|
167
|
-
type = list[idx]
|
168
|
-
break if type.q < app_xml_type.q
|
169
|
-
if type.name =~ /\+xml$/
|
170
|
-
list[app_xml], list[idx] = list[idx], list[app_xml]
|
171
|
-
app_xml = idx
|
189
|
+
params.each do |m|
|
190
|
+
list << AcceptItem.new(index, m.to_s, q)
|
191
|
+
index += 1
|
172
192
|
end
|
173
|
-
idx += 1
|
174
193
|
end
|
175
194
|
end
|
176
|
-
|
177
|
-
list.map! { |i| Mime::Type.lookup(i.name) }.uniq!
|
178
|
-
list
|
195
|
+
list.assort!
|
179
196
|
end
|
180
197
|
end
|
181
198
|
|
182
|
-
|
183
|
-
|
199
|
+
def parse_trailing_star(accept_header)
|
200
|
+
parse_data_with_trailing_star($1) if accept_header =~ TRAILING_STAR_REGEXP
|
201
|
+
end
|
202
|
+
|
203
|
+
# For an input of <tt>'text'</tt>, returns <tt>[Mime::JSON, Mime::XML, Mime::ICS,
|
204
|
+
# Mime::HTML, Mime::CSS, Mime::CSV, Mime::JS, Mime::YAML, Mime::TEXT]</tt>.
|
184
205
|
#
|
185
|
-
# input
|
186
|
-
#
|
206
|
+
# For an input of <tt>'application'</tt>, returns <tt>[Mime::HTML, Mime::JS,
|
207
|
+
# Mime::XML, Mime::YAML, Mime::ATOM, Mime::JSON, Mime::RSS, Mime::URL_ENCODED_FORM]</tt>.
|
187
208
|
def parse_data_with_trailing_star(input)
|
188
209
|
Mime::SET.select { |m| m =~ input }
|
189
210
|
end
|
@@ -192,21 +213,24 @@ module Mime
|
|
192
213
|
#
|
193
214
|
# Usage:
|
194
215
|
#
|
195
|
-
#
|
216
|
+
# Mime::Type.unregister(:mobile)
|
196
217
|
def unregister(symbol)
|
197
|
-
symbol = symbol.
|
218
|
+
symbol = symbol.upcase
|
198
219
|
mime = Mime.const_get(symbol)
|
199
220
|
Mime.instance_eval { remove_const(symbol) }
|
200
221
|
|
201
222
|
SET.delete_if { |v| v.eql?(mime) }
|
202
|
-
LOOKUP.delete_if { |
|
203
|
-
EXTENSION_LOOKUP.delete_if { |
|
223
|
+
LOOKUP.delete_if { |_,v| v.eql?(mime) }
|
224
|
+
EXTENSION_LOOKUP.delete_if { |_,v| v.eql?(mime) }
|
204
225
|
end
|
205
226
|
end
|
206
227
|
|
228
|
+
attr_reader :hash
|
229
|
+
|
207
230
|
def initialize(string, symbol = nil, synonyms = [])
|
208
231
|
@symbol, @synonyms = symbol, synonyms
|
209
232
|
@string = string
|
233
|
+
@hash = [@string, @synonyms, @symbol].hash
|
210
234
|
end
|
211
235
|
|
212
236
|
def to_s
|
@@ -240,6 +264,13 @@ module Mime
|
|
240
264
|
end
|
241
265
|
end
|
242
266
|
|
267
|
+
def eql?(other)
|
268
|
+
super || (self.class == other.class &&
|
269
|
+
@string == other.string &&
|
270
|
+
@synonyms == other.synonyms &&
|
271
|
+
@symbol == other.symbol)
|
272
|
+
end
|
273
|
+
|
243
274
|
def =~(mime_type)
|
244
275
|
return false if mime_type.blank?
|
245
276
|
regexp = Regexp.new(Regexp.quote(mime_type.to_s))
|
@@ -248,28 +279,50 @@ module Mime
|
|
248
279
|
end
|
249
280
|
end
|
250
281
|
|
251
|
-
# Returns true if Action Pack should check requests using this Mime Type for possible request forgery. See
|
252
|
-
# ActionController::RequestForgeryProtection.
|
253
|
-
def verify_request?
|
254
|
-
@@browser_generated_types.include?(to_sym)
|
255
|
-
end
|
256
|
-
|
257
282
|
def html?
|
258
283
|
@@html_types.include?(to_sym) || @string =~ /html/
|
259
284
|
end
|
260
285
|
|
261
|
-
|
262
|
-
|
263
|
-
|
286
|
+
|
287
|
+
protected
|
288
|
+
|
289
|
+
attr_reader :string, :synonyms
|
264
290
|
|
265
291
|
private
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
292
|
+
|
293
|
+
def to_ary; end
|
294
|
+
def to_a; end
|
295
|
+
|
296
|
+
def method_missing(method, *args)
|
297
|
+
if method.to_s.ends_with? '?'
|
298
|
+
method[0..-2].downcase.to_sym == to_sym
|
299
|
+
else
|
300
|
+
super
|
272
301
|
end
|
302
|
+
end
|
303
|
+
|
304
|
+
def respond_to_missing?(method, include_private = false) #:nodoc:
|
305
|
+
method.to_s.ends_with? '?'
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
309
|
+
class NullType
|
310
|
+
include Singleton
|
311
|
+
|
312
|
+
def nil?
|
313
|
+
true
|
314
|
+
end
|
315
|
+
|
316
|
+
def ref; end
|
317
|
+
|
318
|
+
def respond_to_missing?(method, include_private = false)
|
319
|
+
method.to_s.ends_with? '?'
|
320
|
+
end
|
321
|
+
|
322
|
+
private
|
323
|
+
def method_missing(method, *args)
|
324
|
+
false if method.to_s.ends_with? '?'
|
325
|
+
end
|
273
326
|
end
|
274
327
|
end
|
275
328
|
|
@@ -7,9 +7,10 @@ Mime::Type.register "text/javascript", :js, %w( application/javascript applicati
|
|
7
7
|
Mime::Type.register "text/css", :css
|
8
8
|
Mime::Type.register "text/calendar", :ics
|
9
9
|
Mime::Type.register "text/csv", :csv
|
10
|
+
Mime::Type.register "text/vcard", :vcf
|
10
11
|
|
11
12
|
Mime::Type.register "image/png", :png, [], %w(png)
|
12
|
-
Mime::Type.register "image/jpeg", :jpeg, [], %w(jpg jpeg jpe)
|
13
|
+
Mime::Type.register "image/jpeg", :jpeg, [], %w(jpg jpeg jpe pjpeg)
|
13
14
|
Mime::Type.register "image/gif", :gif, [], %w(gif)
|
14
15
|
Mime::Type.register "image/bmp", :bmp, [], %w(bmp)
|
15
16
|
Mime::Type.register "image/tiff", :tiff, [], %w(tif tiff)
|
@@ -1,74 +1,72 @@
|
|
1
1
|
module ActionDispatch
|
2
2
|
module Http
|
3
3
|
class ParameterFilter
|
4
|
+
FILTERED = '[FILTERED]'.freeze # :nodoc:
|
4
5
|
|
5
|
-
def initialize(filters)
|
6
|
+
def initialize(filters = [])
|
6
7
|
@filters = filters
|
7
8
|
end
|
8
9
|
|
9
10
|
def filter(params)
|
10
|
-
|
11
|
-
compiled_filter.call(params)
|
12
|
-
else
|
13
|
-
params.dup
|
14
|
-
end
|
11
|
+
compiled_filter.call(params)
|
15
12
|
end
|
16
13
|
|
17
14
|
private
|
18
15
|
|
19
|
-
def
|
20
|
-
@filters
|
16
|
+
def compiled_filter
|
17
|
+
@compiled_filter ||= CompiledFilter.compile(@filters)
|
21
18
|
end
|
22
19
|
|
23
|
-
|
20
|
+
class CompiledFilter # :nodoc:
|
21
|
+
def self.compile(filters)
|
22
|
+
return lambda { |params| params.dup } if filters.empty?
|
24
23
|
|
25
|
-
|
26
|
-
@compiled_filter ||= begin
|
27
|
-
regexps, blocks = compile_filter
|
24
|
+
strings, regexps, blocks = [], [], []
|
28
25
|
|
29
|
-
|
30
|
-
|
26
|
+
filters.each do |item|
|
27
|
+
case item
|
28
|
+
when Proc
|
29
|
+
blocks << item
|
30
|
+
when Regexp
|
31
|
+
regexps << item
|
32
|
+
else
|
33
|
+
strings << item.to_s
|
34
|
+
end
|
35
|
+
end
|
31
36
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
elsif value.is_a?(Hash)
|
36
|
-
value = filter(value)
|
37
|
-
elsif value.is_a?(Array)
|
38
|
-
value = value.map { |v| v.is_a?(Hash) ? filter(v) : v }
|
39
|
-
elsif blocks.present?
|
40
|
-
key = key.dup
|
41
|
-
value = value.dup if value.duplicable?
|
42
|
-
blocks.each { |b| b.call(key, value) }
|
43
|
-
end
|
37
|
+
regexps << Regexp.new(strings.join('|'), true) unless strings.empty?
|
38
|
+
new regexps, blocks
|
39
|
+
end
|
44
40
|
|
45
|
-
|
46
|
-
end
|
41
|
+
attr_reader :regexps, :blocks
|
47
42
|
|
48
|
-
|
49
|
-
|
43
|
+
def initialize(regexps, blocks)
|
44
|
+
@regexps = regexps
|
45
|
+
@blocks = blocks
|
50
46
|
end
|
51
|
-
end
|
52
47
|
|
53
|
-
|
54
|
-
|
48
|
+
def call(original_params)
|
49
|
+
filtered_params = {}
|
50
|
+
|
51
|
+
original_params.each do |key, value|
|
52
|
+
if regexps.any? { |r| key =~ r }
|
53
|
+
value = FILTERED
|
54
|
+
elsif value.is_a?(Hash)
|
55
|
+
value = call(value)
|
56
|
+
elsif value.is_a?(Array)
|
57
|
+
value = value.map { |v| v.is_a?(Hash) ? call(v) : v }
|
58
|
+
elsif blocks.any?
|
59
|
+
key = key.dup if key.duplicable?
|
60
|
+
value = value.dup if value.duplicable?
|
61
|
+
blocks.each { |b| b.call(key, value) }
|
62
|
+
end
|
55
63
|
|
56
|
-
|
57
|
-
case item
|
58
|
-
when NilClass
|
59
|
-
when Proc
|
60
|
-
blocks << item
|
61
|
-
when Regexp
|
62
|
-
regexps << item
|
63
|
-
else
|
64
|
-
strings << item.to_s
|
64
|
+
filtered_params[key] = value
|
65
65
|
end
|
66
|
-
end
|
67
66
|
|
68
|
-
|
69
|
-
|
67
|
+
filtered_params
|
68
|
+
end
|
70
69
|
end
|
71
|
-
|
72
70
|
end
|
73
71
|
end
|
74
72
|
end
|
@@ -1,81 +1,65 @@
|
|
1
1
|
require 'active_support/core_ext/hash/keys'
|
2
2
|
require 'active_support/core_ext/hash/indifferent_access'
|
3
|
+
require 'active_support/deprecation'
|
3
4
|
|
4
5
|
module ActionDispatch
|
5
6
|
module Http
|
6
7
|
module Parameters
|
8
|
+
PARAMETERS_KEY = 'action_dispatch.request.path_parameters'
|
9
|
+
|
7
10
|
# Returns both GET and POST \parameters in a single hash.
|
8
11
|
def parameters
|
9
12
|
@env["action_dispatch.request.parameters"] ||= begin
|
10
|
-
params =
|
13
|
+
params = begin
|
14
|
+
request_parameters.merge(query_parameters)
|
15
|
+
rescue EOFError
|
16
|
+
query_parameters.dup
|
17
|
+
end
|
11
18
|
params.merge!(path_parameters)
|
12
|
-
encode_params(params).with_indifferent_access
|
13
19
|
end
|
14
20
|
end
|
15
21
|
alias :params :parameters
|
16
22
|
|
17
23
|
def path_parameters=(parameters) #:nodoc:
|
18
|
-
@
|
19
|
-
@env
|
20
|
-
@env["action_dispatch.request.path_parameters"] = parameters
|
24
|
+
@env.delete('action_dispatch.request.parameters')
|
25
|
+
@env[PARAMETERS_KEY] = parameters
|
21
26
|
end
|
22
27
|
|
23
|
-
# The same as <tt>path_parameters</tt> with explicitly symbolized keys.
|
24
28
|
def symbolized_path_parameters
|
25
|
-
|
29
|
+
ActiveSupport::Deprecation.warn(
|
30
|
+
'`symbolized_path_parameters` is deprecated. Please use `path_parameters`.'
|
31
|
+
)
|
32
|
+
path_parameters
|
26
33
|
end
|
27
34
|
|
28
35
|
# Returns a hash with the \parameters used to form the \path of the request.
|
29
36
|
# Returned hash keys are strings:
|
30
37
|
#
|
31
38
|
# {'action' => 'my_action', 'controller' => 'my_controller'}
|
32
|
-
#
|
33
|
-
# See <tt>symbolized_path_parameters</tt> for symbolized keys.
|
34
39
|
def path_parameters
|
35
|
-
@env[
|
36
|
-
end
|
37
|
-
|
38
|
-
def reset_parameters #:nodoc:
|
39
|
-
@env.delete("action_dispatch.request.parameters")
|
40
|
+
@env[PARAMETERS_KEY] ||= {}
|
40
41
|
end
|
41
42
|
|
42
43
|
private
|
43
44
|
|
44
|
-
#
|
45
|
-
#
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
return params.force_encoding("UTF-8").encode!
|
52
|
-
elsif !params.is_a?(Hash)
|
53
|
-
return params
|
54
|
-
end
|
55
|
-
|
56
|
-
params.each do |k, v|
|
57
|
-
case v
|
58
|
-
when Hash
|
59
|
-
encode_params(v)
|
60
|
-
when Array
|
61
|
-
v.map! {|el| encode_params(el) }
|
45
|
+
# Convert nested Hash to HashWithIndifferentAccess.
|
46
|
+
#
|
47
|
+
def normalize_encode_params(params)
|
48
|
+
case params
|
49
|
+
when Hash
|
50
|
+
if params.has_key?(:tempfile)
|
51
|
+
UploadedFile.new(params)
|
62
52
|
else
|
63
|
-
|
53
|
+
params.each_with_object({}) do |(key, val), new_hash|
|
54
|
+
new_hash[key] = if val.is_a?(Array)
|
55
|
+
val.map! { |el| normalize_encode_params(el) }
|
56
|
+
else
|
57
|
+
normalize_encode_params(val)
|
58
|
+
end
|
59
|
+
end.with_indifferent_access
|
64
60
|
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
# Convert nested Hash to HashWithIndifferentAccess
|
69
|
-
def normalize_parameters(value)
|
70
|
-
case value
|
71
|
-
when Hash
|
72
|
-
h = {}
|
73
|
-
value.each { |k, v| h[k] = normalize_parameters(v) }
|
74
|
-
h.with_indifferent_access
|
75
|
-
when Array
|
76
|
-
value.map { |e| normalize_parameters(e) }
|
77
61
|
else
|
78
|
-
|
62
|
+
params
|
79
63
|
end
|
80
64
|
end
|
81
65
|
end
|
@@ -8,8 +8,7 @@ module ActionDispatch
|
|
8
8
|
new
|
9
9
|
end
|
10
10
|
|
11
|
-
|
12
|
-
def initialize(store = RAILS_CACHE)
|
11
|
+
def initialize(store = Rails.cache)
|
13
12
|
@store = store
|
14
13
|
end
|
15
14
|
|
@@ -33,7 +32,7 @@ module ActionDispatch
|
|
33
32
|
new
|
34
33
|
end
|
35
34
|
|
36
|
-
def initialize(store =
|
35
|
+
def initialize(store = Rails.cache)
|
37
36
|
@store = store
|
38
37
|
end
|
39
38
|
|