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.

Files changed (244) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +412 -503
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +11 -294
  5. data/lib/abstract_controller/asset_paths.rb +2 -2
  6. data/lib/abstract_controller/base.rb +52 -18
  7. data/lib/abstract_controller/callbacks.rb +87 -89
  8. data/lib/abstract_controller/collector.rb +17 -3
  9. data/lib/abstract_controller/helpers.rb +41 -14
  10. data/lib/abstract_controller/logger.rb +1 -2
  11. data/lib/abstract_controller/railties/routes_helpers.rb +3 -3
  12. data/lib/abstract_controller/rendering.rb +65 -118
  13. data/lib/abstract_controller/translation.rb +16 -1
  14. data/lib/abstract_controller/url_for.rb +7 -7
  15. data/lib/abstract_controller.rb +2 -10
  16. data/lib/action_controller/base.rb +61 -28
  17. data/lib/action_controller/caching/fragments.rb +30 -54
  18. data/lib/action_controller/caching.rb +38 -35
  19. data/lib/action_controller/log_subscriber.rb +35 -18
  20. data/lib/action_controller/metal/conditional_get.rb +103 -34
  21. data/lib/action_controller/metal/data_streaming.rb +20 -26
  22. data/lib/action_controller/metal/etag_with_template_digest.rb +50 -0
  23. data/lib/action_controller/metal/exceptions.rb +19 -6
  24. data/lib/action_controller/metal/flash.rb +41 -9
  25. data/lib/action_controller/metal/force_ssl.rb +70 -12
  26. data/lib/action_controller/metal/head.rb +30 -7
  27. data/lib/action_controller/metal/helpers.rb +11 -11
  28. data/lib/action_controller/metal/hide_actions.rb +0 -1
  29. data/lib/action_controller/metal/http_authentication.rb +140 -94
  30. data/lib/action_controller/metal/implicit_render.rb +1 -1
  31. data/lib/action_controller/metal/instrumentation.rb +11 -7
  32. data/lib/action_controller/metal/live.rb +328 -0
  33. data/lib/action_controller/metal/mime_responds.rb +161 -152
  34. data/lib/action_controller/metal/params_wrapper.rb +126 -81
  35. data/lib/action_controller/metal/rack_delegation.rb +10 -4
  36. data/lib/action_controller/metal/redirecting.rb +44 -41
  37. data/lib/action_controller/metal/renderers.rb +48 -19
  38. data/lib/action_controller/metal/rendering.rb +46 -11
  39. data/lib/action_controller/metal/request_forgery_protection.rb +250 -29
  40. data/lib/action_controller/metal/streaming.rb +30 -38
  41. data/lib/action_controller/metal/strong_parameters.rb +669 -0
  42. data/lib/action_controller/metal/testing.rb +12 -18
  43. data/lib/action_controller/metal/url_for.rb +31 -29
  44. data/lib/action_controller/metal.rb +31 -40
  45. data/lib/action_controller/model_naming.rb +12 -0
  46. data/lib/action_controller/railtie.rb +38 -18
  47. data/lib/action_controller/railties/helpers.rb +22 -0
  48. data/lib/action_controller/test_case.rb +359 -173
  49. data/lib/action_controller.rb +9 -16
  50. data/lib/action_dispatch/http/cache.rb +64 -11
  51. data/lib/action_dispatch/http/filter_parameters.rb +20 -10
  52. data/lib/action_dispatch/http/filter_redirect.rb +38 -0
  53. data/lib/action_dispatch/http/headers.rb +85 -17
  54. data/lib/action_dispatch/http/mime_negotiation.rb +55 -5
  55. data/lib/action_dispatch/http/mime_type.rb +167 -114
  56. data/lib/action_dispatch/http/mime_types.rb +2 -1
  57. data/lib/action_dispatch/http/parameter_filter.rb +44 -46
  58. data/lib/action_dispatch/http/parameters.rb +30 -46
  59. data/lib/action_dispatch/http/rack_cache.rb +2 -3
  60. data/lib/action_dispatch/http/request.rb +108 -45
  61. data/lib/action_dispatch/http/response.rb +247 -48
  62. data/lib/action_dispatch/http/upload.rb +60 -29
  63. data/lib/action_dispatch/http/url.rb +135 -45
  64. data/lib/action_dispatch/journey/backwards.rb +5 -0
  65. data/lib/action_dispatch/journey/formatter.rb +166 -0
  66. data/lib/action_dispatch/journey/gtg/builder.rb +162 -0
  67. data/lib/action_dispatch/journey/gtg/simulator.rb +47 -0
  68. data/lib/action_dispatch/journey/gtg/transition_table.rb +157 -0
  69. data/lib/action_dispatch/journey/nfa/builder.rb +76 -0
  70. data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
  71. data/lib/action_dispatch/journey/nfa/simulator.rb +47 -0
  72. data/lib/action_dispatch/journey/nfa/transition_table.rb +163 -0
  73. data/lib/action_dispatch/journey/nodes/node.rb +128 -0
  74. data/lib/action_dispatch/journey/parser.rb +198 -0
  75. data/lib/action_dispatch/journey/parser.y +49 -0
  76. data/lib/action_dispatch/journey/parser_extras.rb +23 -0
  77. data/lib/action_dispatch/journey/path/pattern.rb +193 -0
  78. data/lib/action_dispatch/journey/route.rb +125 -0
  79. data/lib/action_dispatch/journey/router/strexp.rb +27 -0
  80. data/lib/action_dispatch/journey/router/utils.rb +93 -0
  81. data/lib/action_dispatch/journey/router.rb +144 -0
  82. data/lib/action_dispatch/journey/routes.rb +80 -0
  83. data/lib/action_dispatch/journey/scanner.rb +61 -0
  84. data/lib/action_dispatch/journey/visitors.rb +221 -0
  85. data/lib/action_dispatch/journey/visualizer/fsm.css +30 -0
  86. data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
  87. data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
  88. data/lib/action_dispatch/journey.rb +5 -0
  89. data/lib/action_dispatch/middleware/callbacks.rb +16 -11
  90. data/lib/action_dispatch/middleware/cookies.rb +346 -125
  91. data/lib/action_dispatch/middleware/debug_exceptions.rb +52 -24
  92. data/lib/action_dispatch/middleware/exception_wrapper.rb +75 -9
  93. data/lib/action_dispatch/middleware/flash.rb +85 -72
  94. data/lib/action_dispatch/middleware/params_parser.rb +16 -31
  95. data/lib/action_dispatch/middleware/public_exceptions.rb +39 -14
  96. data/lib/action_dispatch/middleware/reloader.rb +16 -7
  97. data/lib/action_dispatch/middleware/remote_ip.rb +132 -40
  98. data/lib/action_dispatch/middleware/request_id.rb +3 -7
  99. data/lib/action_dispatch/middleware/session/abstract_store.rb +22 -20
  100. data/lib/action_dispatch/middleware/session/cache_store.rb +3 -3
  101. data/lib/action_dispatch/middleware/session/cookie_store.rb +84 -29
  102. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +8 -3
  103. data/lib/action_dispatch/middleware/show_exceptions.rb +15 -44
  104. data/lib/action_dispatch/middleware/ssl.rb +72 -0
  105. data/lib/action_dispatch/middleware/stack.rb +6 -1
  106. data/lib/action_dispatch/middleware/static.rb +80 -23
  107. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +34 -0
  108. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb +23 -0
  109. data/lib/action_dispatch/middleware/templates/rescues/_source.erb +27 -0
  110. data/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb +52 -0
  111. data/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb +9 -0
  112. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +16 -0
  113. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +9 -0
  114. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +133 -5
  115. data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +11 -0
  116. data/lib/action_dispatch/middleware/templates/rescues/missing_template.text.erb +3 -0
  117. data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +32 -0
  118. data/lib/action_dispatch/middleware/templates/rescues/routing_error.text.erb +11 -0
  119. data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +20 -0
  120. data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +7 -0
  121. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.html.erb +6 -0
  122. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.text.erb +3 -0
  123. data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
  124. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +200 -0
  125. data/lib/action_dispatch/railtie.rb +19 -6
  126. data/lib/action_dispatch/request/session.rb +193 -0
  127. data/lib/action_dispatch/request/utils.rb +35 -0
  128. data/lib/action_dispatch/routing/endpoint.rb +10 -0
  129. data/lib/action_dispatch/routing/inspector.rb +234 -0
  130. data/lib/action_dispatch/routing/mapper.rb +897 -436
  131. data/lib/action_dispatch/routing/polymorphic_routes.rb +213 -92
  132. data/lib/action_dispatch/routing/redirection.rb +97 -37
  133. data/lib/action_dispatch/routing/route_set.rb +432 -239
  134. data/lib/action_dispatch/routing/routes_proxy.rb +7 -4
  135. data/lib/action_dispatch/routing/url_for.rb +63 -34
  136. data/lib/action_dispatch/routing.rb +57 -89
  137. data/lib/action_dispatch/testing/assertions/dom.rb +2 -36
  138. data/lib/action_dispatch/testing/assertions/response.rb +24 -38
  139. data/lib/action_dispatch/testing/assertions/routing.rb +55 -54
  140. data/lib/action_dispatch/testing/assertions/selector.rb +2 -434
  141. data/lib/action_dispatch/testing/assertions/tag.rb +2 -137
  142. data/lib/action_dispatch/testing/assertions.rb +11 -7
  143. data/lib/action_dispatch/testing/integration.rb +88 -72
  144. data/lib/action_dispatch/testing/test_process.rb +9 -6
  145. data/lib/action_dispatch/testing/test_request.rb +13 -9
  146. data/lib/action_dispatch/testing/test_response.rb +1 -5
  147. data/lib/action_dispatch.rb +24 -21
  148. data/lib/action_pack/gem_version.rb +15 -0
  149. data/lib/action_pack/version.rb +5 -7
  150. data/lib/action_pack.rb +1 -1
  151. metadata +181 -292
  152. data/lib/abstract_controller/layouts.rb +0 -423
  153. data/lib/abstract_controller/view_paths.rb +0 -96
  154. data/lib/action_controller/caching/actions.rb +0 -185
  155. data/lib/action_controller/caching/pages.rb +0 -187
  156. data/lib/action_controller/caching/sweeping.rb +0 -97
  157. data/lib/action_controller/deprecated/integration_test.rb +0 -2
  158. data/lib/action_controller/deprecated/performance_test.rb +0 -1
  159. data/lib/action_controller/deprecated.rb +0 -3
  160. data/lib/action_controller/metal/compatibility.rb +0 -65
  161. data/lib/action_controller/metal/responder.rb +0 -286
  162. data/lib/action_controller/metal/session_management.rb +0 -14
  163. data/lib/action_controller/railties/paths.rb +0 -25
  164. data/lib/action_controller/record_identifier.rb +0 -85
  165. data/lib/action_controller/vendor/html-scanner/html/document.rb +0 -68
  166. data/lib/action_controller/vendor/html-scanner/html/node.rb +0 -532
  167. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +0 -177
  168. data/lib/action_controller/vendor/html-scanner/html/selector.rb +0 -830
  169. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +0 -107
  170. data/lib/action_controller/vendor/html-scanner/html/version.rb +0 -11
  171. data/lib/action_controller/vendor/html-scanner.rb +0 -20
  172. data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
  173. data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
  174. data/lib/action_dispatch/middleware/head.rb +0 -18
  175. data/lib/action_dispatch/middleware/rescue.rb +0 -26
  176. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +0 -31
  177. data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +0 -26
  178. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +0 -10
  179. data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +0 -2
  180. data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +0 -15
  181. data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +0 -17
  182. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +0 -2
  183. data/lib/action_dispatch/testing/performance_test.rb +0 -10
  184. data/lib/action_view/asset_paths.rb +0 -142
  185. data/lib/action_view/base.rb +0 -220
  186. data/lib/action_view/buffers.rb +0 -43
  187. data/lib/action_view/context.rb +0 -36
  188. data/lib/action_view/flows.rb +0 -79
  189. data/lib/action_view/helpers/active_model_helper.rb +0 -50
  190. data/lib/action_view/helpers/asset_paths.rb +0 -7
  191. data/lib/action_view/helpers/asset_tag_helper.rb +0 -457
  192. data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
  193. data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
  194. data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
  195. data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
  196. data/lib/action_view/helpers/atom_feed_helper.rb +0 -200
  197. data/lib/action_view/helpers/cache_helper.rb +0 -64
  198. data/lib/action_view/helpers/capture_helper.rb +0 -203
  199. data/lib/action_view/helpers/controller_helper.rb +0 -25
  200. data/lib/action_view/helpers/csrf_helper.rb +0 -32
  201. data/lib/action_view/helpers/date_helper.rb +0 -1062
  202. data/lib/action_view/helpers/debug_helper.rb +0 -40
  203. data/lib/action_view/helpers/form_helper.rb +0 -1486
  204. data/lib/action_view/helpers/form_options_helper.rb +0 -658
  205. data/lib/action_view/helpers/form_tag_helper.rb +0 -685
  206. data/lib/action_view/helpers/javascript_helper.rb +0 -110
  207. data/lib/action_view/helpers/number_helper.rb +0 -622
  208. data/lib/action_view/helpers/output_safety_helper.rb +0 -38
  209. data/lib/action_view/helpers/record_tag_helper.rb +0 -111
  210. data/lib/action_view/helpers/rendering_helper.rb +0 -90
  211. data/lib/action_view/helpers/sanitize_helper.rb +0 -259
  212. data/lib/action_view/helpers/tag_helper.rb +0 -160
  213. data/lib/action_view/helpers/text_helper.rb +0 -426
  214. data/lib/action_view/helpers/translation_helper.rb +0 -91
  215. data/lib/action_view/helpers/url_helper.rb +0 -693
  216. data/lib/action_view/helpers.rb +0 -60
  217. data/lib/action_view/locale/en.yml +0 -160
  218. data/lib/action_view/log_subscriber.rb +0 -28
  219. data/lib/action_view/lookup_context.rb +0 -254
  220. data/lib/action_view/path_set.rb +0 -89
  221. data/lib/action_view/railtie.rb +0 -55
  222. data/lib/action_view/renderer/abstract_renderer.rb +0 -41
  223. data/lib/action_view/renderer/partial_renderer.rb +0 -415
  224. data/lib/action_view/renderer/renderer.rb +0 -54
  225. data/lib/action_view/renderer/streaming_template_renderer.rb +0 -106
  226. data/lib/action_view/renderer/template_renderer.rb +0 -94
  227. data/lib/action_view/template/error.rb +0 -128
  228. data/lib/action_view/template/handlers/builder.rb +0 -26
  229. data/lib/action_view/template/handlers/erb.rb +0 -125
  230. data/lib/action_view/template/handlers.rb +0 -50
  231. data/lib/action_view/template/resolver.rb +0 -272
  232. data/lib/action_view/template/text.rb +0 -30
  233. data/lib/action_view/template.rb +0 -337
  234. data/lib/action_view/test_case.rb +0 -245
  235. data/lib/action_view/testing/resolvers.rb +0 -50
  236. data/lib/action_view.rb +0 -84
  237. data/lib/sprockets/assets.rake +0 -99
  238. data/lib/sprockets/bootstrap.rb +0 -37
  239. data/lib/sprockets/compressors.rb +0 -83
  240. data/lib/sprockets/helpers/isolated_helper.rb +0 -13
  241. data/lib/sprockets/helpers/rails_helper.rb +0 -182
  242. data/lib/sprockets/helpers.rb +0 -6
  243. data/lib/sprockets/railtie.rb +0 -62
  244. data/lib/sprockets/static_compiler.rb +0 -56
@@ -1,11 +1,12 @@
1
1
  require 'set'
2
- require 'active_support/core_ext/class/attribute_accessors'
3
- require 'active_support/core_ext/object/blank'
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 = Hash.new { |h, k| h[k] = Type.new(k) unless k.blank? }
26
+ LOOKUP = {}
26
27
 
27
- def self.[](type)
28
- return type if type.is_a?(Type)
29
- Type.lookup_by_extension(type.to_s)
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 :text => post.to_ics, :mime_type => Mime::Type["text/calendar"] }
41
- # format.xml { render :xml => @people.to_xml }
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 :order, :name, :q
63
+ attr_accessor :index, :name, :q
64
+ alias :to_s :name
59
65
 
60
- def initialize(order, name, q=nil)
61
- @order = order
62
- @name = name.strip
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 = order <=> item.order if result == 0
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 == (item.respond_to?(:name) ? item.name : item)
80
+ @name == item.to_s
79
81
  end
80
82
  end
81
83
 
82
- class << self
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
- Q_SEPARATOR_REGEXP = /;\s*q=/
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.to_s.upcase, Type.new(string, symbol, mime_type_synonyms))
163
+ Mime.const_set(symbol.upcase, Type.new(string, symbol, mime_type_synonyms))
103
164
 
104
- SET << Mime.const_get(symbol.to_s.upcase)
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(Q_SEPARATOR_REGEXP).first
113
- if accept_header =~ TRAILING_STAR_REGEXP
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
- # keep track of creation order to keep the subsequent sort stable
120
- list, index = [], 0
121
- accept_header.split(/,/).each do |header|
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
- if params =~ TRAILING_STAR_REGEXP
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
- # make sure app_xml is ahead of text_xml in the list
148
- if app_xml > text_xml
149
- list[app_xml], list[text_xml] = list[text_xml], list[app_xml]
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
- # input: 'text'
183
- # returned value: [Mime::JSON, Mime::XML, Mime::ICS, Mime::HTML, Mime::CSS, Mime::CSV, Mime::JS, Mime::YAML, Mime::TEXT]
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: 'application'
186
- # returned value: [Mime::HTML, Mime::JS, Mime::XML, Mime::YAML, Mime::ATOM, Mime::JSON, Mime::RSS, Mime::URL_ENCODED_FORM]
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
- # Mime::Type.unregister(:mobile)
216
+ # Mime::Type.unregister(:mobile)
196
217
  def unregister(symbol)
197
- symbol = symbol.to_s.upcase
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 { |k,v| v.eql?(mime) }
203
- EXTENSION_LOOKUP.delete_if { |k,v| v.eql?(mime) }
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
- def respond_to?(method, include_private = false) #:nodoc:
262
- super || method.to_s =~ /(\w+)\?$/
263
- end
286
+
287
+ protected
288
+
289
+ attr_reader :string, :synonyms
264
290
 
265
291
  private
266
- def method_missing(method, *args)
267
- if method.to_s =~ /(\w+)\?$/
268
- $1.downcase.to_sym == to_sym
269
- else
270
- super
271
- end
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
- if enabled?
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 enabled?
20
- @filters.present?
16
+ def compiled_filter
17
+ @compiled_filter ||= CompiledFilter.compile(@filters)
21
18
  end
22
19
 
23
- FILTERED = '[FILTERED]'.freeze
20
+ class CompiledFilter # :nodoc:
21
+ def self.compile(filters)
22
+ return lambda { |params| params.dup } if filters.empty?
24
23
 
25
- def compiled_filter
26
- @compiled_filter ||= begin
27
- regexps, blocks = compile_filter
24
+ strings, regexps, blocks = [], [], []
28
25
 
29
- lambda do |original_params|
30
- filtered_params = {}
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
- original_params.each do |key, value|
33
- if regexps.find { |r| key =~ r }
34
- value = FILTERED
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
- filtered_params[key] = value
46
- end
41
+ attr_reader :regexps, :blocks
47
42
 
48
- filtered_params
49
- end
43
+ def initialize(regexps, blocks)
44
+ @regexps = regexps
45
+ @blocks = blocks
50
46
  end
51
- end
52
47
 
53
- def compile_filter
54
- strings, regexps, blocks = [], [], []
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
- @filters.each do |item|
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
- regexps << Regexp.new(strings.join('|'), true) unless strings.empty?
69
- [regexps, blocks]
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 = request_parameters.merge(query_parameters)
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
- @symbolized_path_params = nil
19
- @env.delete("action_dispatch.request.parameters")
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
- @symbolized_path_params ||= path_parameters.symbolize_keys
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["action_dispatch.request.path_parameters"] ||= {}
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
- # TODO: Validate that the characters are UTF-8. If they aren't,
45
- # you'll get a weird error down the road, but our form handling
46
- # should really prevent that from happening
47
- def encode_params(params)
48
- return params unless "ruby".encoding_aware?
49
-
50
- if params.is_a?(String)
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
- encode_params(v)
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
- value
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
- # TODO: Finally deal with the RAILS_CACHE global
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 = RAILS_CACHE)
35
+ def initialize(store = Rails.cache)
37
36
  @store = store
38
37
  end
39
38