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.

Files changed (265) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +641 -418
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +5 -288
  5. data/lib/abstract_controller.rb +1 -8
  6. data/lib/abstract_controller/asset_paths.rb +2 -2
  7. data/lib/abstract_controller/base.rb +39 -37
  8. data/lib/abstract_controller/callbacks.rb +101 -82
  9. data/lib/abstract_controller/collector.rb +7 -3
  10. data/lib/abstract_controller/helpers.rb +23 -11
  11. data/lib/abstract_controller/layouts.rb +68 -73
  12. data/lib/abstract_controller/logger.rb +1 -2
  13. data/lib/abstract_controller/rendering.rb +22 -13
  14. data/lib/abstract_controller/translation.rb +16 -1
  15. data/lib/abstract_controller/url_for.rb +6 -6
  16. data/lib/abstract_controller/view_paths.rb +1 -1
  17. data/lib/action_controller.rb +15 -6
  18. data/lib/action_controller/base.rb +46 -22
  19. data/lib/action_controller/caching.rb +46 -33
  20. data/lib/action_controller/caching/fragments.rb +23 -53
  21. data/lib/action_controller/deprecated.rb +5 -1
  22. data/lib/action_controller/deprecated/integration_test.rb +3 -0
  23. data/lib/action_controller/log_subscriber.rb +11 -8
  24. data/lib/action_controller/metal.rb +16 -30
  25. data/lib/action_controller/metal/conditional_get.rb +76 -32
  26. data/lib/action_controller/metal/data_streaming.rb +20 -26
  27. data/lib/action_controller/metal/exceptions.rb +19 -6
  28. data/lib/action_controller/metal/flash.rb +24 -9
  29. data/lib/action_controller/metal/force_ssl.rb +32 -9
  30. data/lib/action_controller/metal/head.rb +25 -4
  31. data/lib/action_controller/metal/helpers.rb +6 -9
  32. data/lib/action_controller/metal/hide_actions.rb +1 -2
  33. data/lib/action_controller/metal/http_authentication.rb +105 -87
  34. data/lib/action_controller/metal/implicit_render.rb +1 -1
  35. data/lib/action_controller/metal/instrumentation.rb +2 -1
  36. data/lib/action_controller/metal/live.rb +141 -0
  37. data/lib/action_controller/metal/mime_responds.rb +161 -47
  38. data/lib/action_controller/metal/params_wrapper.rb +112 -74
  39. data/lib/action_controller/metal/rack_delegation.rb +9 -3
  40. data/lib/action_controller/metal/redirecting.rb +15 -20
  41. data/lib/action_controller/metal/renderers.rb +11 -9
  42. data/lib/action_controller/metal/rendering.rb +8 -0
  43. data/lib/action_controller/metal/request_forgery_protection.rb +112 -19
  44. data/lib/action_controller/metal/responder.rb +20 -19
  45. data/lib/action_controller/metal/streaming.rb +12 -18
  46. data/lib/action_controller/metal/strong_parameters.rb +516 -0
  47. data/lib/action_controller/metal/testing.rb +13 -18
  48. data/lib/action_controller/metal/url_for.rb +27 -25
  49. data/lib/action_controller/model_naming.rb +12 -0
  50. data/lib/action_controller/railtie.rb +33 -17
  51. data/lib/action_controller/railties/helpers.rb +22 -0
  52. data/lib/action_controller/record_identifier.rb +18 -72
  53. data/lib/action_controller/test_case.rb +215 -123
  54. data/lib/action_controller/vendor/html-scanner.rb +4 -19
  55. data/lib/action_dispatch.rb +27 -19
  56. data/lib/action_dispatch/http/cache.rb +63 -11
  57. data/lib/action_dispatch/http/filter_parameters.rb +18 -8
  58. data/lib/action_dispatch/http/filter_redirect.rb +37 -0
  59. data/lib/action_dispatch/http/headers.rb +27 -19
  60. data/lib/action_dispatch/http/mime_negotiation.rb +25 -2
  61. data/lib/action_dispatch/http/mime_type.rb +145 -113
  62. data/lib/action_dispatch/http/mime_types.rb +1 -1
  63. data/lib/action_dispatch/http/parameter_filter.rb +44 -46
  64. data/lib/action_dispatch/http/parameters.rb +12 -5
  65. data/lib/action_dispatch/http/rack_cache.rb +2 -3
  66. data/lib/action_dispatch/http/request.rb +49 -18
  67. data/lib/action_dispatch/http/response.rb +129 -35
  68. data/lib/action_dispatch/http/upload.rb +60 -17
  69. data/lib/action_dispatch/http/url.rb +53 -31
  70. data/lib/action_dispatch/journey.rb +5 -0
  71. data/lib/action_dispatch/journey/backwards.rb +5 -0
  72. data/lib/action_dispatch/journey/formatter.rb +146 -0
  73. data/lib/action_dispatch/journey/gtg/builder.rb +162 -0
  74. data/lib/action_dispatch/journey/gtg/simulator.rb +44 -0
  75. data/lib/action_dispatch/journey/gtg/transition_table.rb +156 -0
  76. data/lib/action_dispatch/journey/nfa/builder.rb +76 -0
  77. data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
  78. data/lib/action_dispatch/journey/nfa/simulator.rb +47 -0
  79. data/lib/action_dispatch/journey/nfa/transition_table.rb +163 -0
  80. data/lib/action_dispatch/journey/nodes/node.rb +124 -0
  81. data/lib/action_dispatch/journey/parser.rb +206 -0
  82. data/lib/action_dispatch/journey/parser.y +47 -0
  83. data/lib/action_dispatch/journey/parser_extras.rb +23 -0
  84. data/lib/action_dispatch/journey/path/pattern.rb +196 -0
  85. data/lib/action_dispatch/journey/route.rb +116 -0
  86. data/lib/action_dispatch/journey/router.rb +164 -0
  87. data/lib/action_dispatch/journey/router/strexp.rb +24 -0
  88. data/lib/action_dispatch/journey/router/utils.rb +54 -0
  89. data/lib/action_dispatch/journey/routes.rb +75 -0
  90. data/lib/action_dispatch/journey/scanner.rb +61 -0
  91. data/lib/action_dispatch/journey/visitors.rb +189 -0
  92. data/lib/action_dispatch/journey/visualizer/fsm.css +34 -0
  93. data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
  94. data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
  95. data/lib/action_dispatch/middleware/callbacks.rb +9 -4
  96. data/lib/action_dispatch/middleware/cookies.rb +168 -57
  97. data/lib/action_dispatch/middleware/debug_exceptions.rb +26 -17
  98. data/lib/action_dispatch/middleware/exception_wrapper.rb +27 -3
  99. data/lib/action_dispatch/middleware/flash.rb +58 -58
  100. data/lib/action_dispatch/middleware/params_parser.rb +14 -29
  101. data/lib/action_dispatch/middleware/public_exceptions.rb +31 -14
  102. data/lib/action_dispatch/middleware/reloader.rb +6 -6
  103. data/lib/action_dispatch/middleware/remote_ip.rb +145 -39
  104. data/lib/action_dispatch/middleware/request_id.rb +2 -6
  105. data/lib/action_dispatch/middleware/session/abstract_store.rb +22 -20
  106. data/lib/action_dispatch/middleware/session/cache_store.rb +3 -3
  107. data/lib/action_dispatch/middleware/session/cookie_store.rb +81 -7
  108. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +8 -3
  109. data/lib/action_dispatch/middleware/show_exceptions.rb +12 -45
  110. data/lib/action_dispatch/middleware/ssl.rb +70 -0
  111. data/lib/action_dispatch/middleware/stack.rb +6 -1
  112. data/lib/action_dispatch/middleware/static.rb +5 -24
  113. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +14 -11
  114. data/lib/action_dispatch/middleware/templates/rescues/_source.erb +25 -0
  115. data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +3 -3
  116. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +15 -9
  117. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +121 -5
  118. data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +7 -2
  119. data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +30 -15
  120. data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +39 -13
  121. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +6 -2
  122. data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
  123. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +144 -0
  124. data/lib/action_dispatch/railtie.rb +16 -6
  125. data/lib/action_dispatch/request/session.rb +181 -0
  126. data/lib/action_dispatch/routing.rb +41 -40
  127. data/lib/action_dispatch/routing/inspector.rb +240 -0
  128. data/lib/action_dispatch/routing/mapper.rb +501 -273
  129. data/lib/action_dispatch/routing/polymorphic_routes.rb +16 -20
  130. data/lib/action_dispatch/routing/redirection.rb +46 -29
  131. data/lib/action_dispatch/routing/route_set.rb +203 -164
  132. data/lib/action_dispatch/routing/routes_proxy.rb +2 -0
  133. data/lib/action_dispatch/routing/url_for.rb +48 -33
  134. data/lib/action_dispatch/testing/assertions/dom.rb +3 -13
  135. data/lib/action_dispatch/testing/assertions/response.rb +32 -40
  136. data/lib/action_dispatch/testing/assertions/routing.rb +40 -39
  137. data/lib/action_dispatch/testing/assertions/selector.rb +15 -20
  138. data/lib/action_dispatch/testing/assertions/tag.rb +20 -23
  139. data/lib/action_dispatch/testing/integration.rb +41 -22
  140. data/lib/action_dispatch/testing/test_process.rb +9 -6
  141. data/lib/action_dispatch/testing/test_request.rb +7 -3
  142. data/lib/action_pack.rb +1 -1
  143. data/lib/action_pack/version.rb +4 -4
  144. data/lib/action_view.rb +17 -8
  145. data/lib/action_view/base.rb +15 -34
  146. data/lib/action_view/buffers.rb +1 -1
  147. data/lib/action_view/context.rb +4 -4
  148. data/lib/action_view/dependency_tracker.rb +91 -0
  149. data/lib/action_view/digestor.rb +85 -0
  150. data/lib/action_view/flows.rb +1 -4
  151. data/lib/action_view/helpers.rb +2 -4
  152. data/lib/action_view/helpers/active_model_helper.rb +3 -4
  153. data/lib/action_view/helpers/asset_tag_helper.rb +211 -353
  154. data/lib/action_view/helpers/asset_url_helper.rb +354 -0
  155. data/lib/action_view/helpers/atom_feed_helper.rb +13 -10
  156. data/lib/action_view/helpers/cache_helper.rb +150 -18
  157. data/lib/action_view/helpers/capture_helper.rb +42 -29
  158. data/lib/action_view/helpers/csrf_helper.rb +0 -2
  159. data/lib/action_view/helpers/date_helper.rb +268 -247
  160. data/lib/action_view/helpers/debug_helper.rb +10 -11
  161. data/lib/action_view/helpers/form_helper.rb +904 -547
  162. data/lib/action_view/helpers/form_options_helper.rb +341 -166
  163. data/lib/action_view/helpers/form_tag_helper.rb +188 -88
  164. data/lib/action_view/helpers/javascript_helper.rb +23 -16
  165. data/lib/action_view/helpers/number_helper.rb +148 -354
  166. data/lib/action_view/helpers/output_safety_helper.rb +3 -3
  167. data/lib/action_view/helpers/record_tag_helper.rb +17 -22
  168. data/lib/action_view/helpers/rendering_helper.rb +2 -4
  169. data/lib/action_view/helpers/sanitize_helper.rb +3 -6
  170. data/lib/action_view/helpers/tag_helper.rb +43 -37
  171. data/lib/action_view/helpers/tags.rb +39 -0
  172. data/lib/action_view/helpers/tags/base.rb +148 -0
  173. data/lib/action_view/helpers/tags/check_box.rb +64 -0
  174. data/lib/action_view/helpers/tags/checkable.rb +16 -0
  175. data/lib/action_view/helpers/tags/collection_check_boxes.rb +43 -0
  176. data/lib/action_view/helpers/tags/collection_helpers.rb +83 -0
  177. data/lib/action_view/helpers/tags/collection_radio_buttons.rb +36 -0
  178. data/lib/action_view/helpers/tags/collection_select.rb +28 -0
  179. data/lib/action_view/helpers/tags/color_field.rb +25 -0
  180. data/lib/action_view/helpers/tags/date_field.rb +13 -0
  181. data/lib/action_view/helpers/tags/date_select.rb +72 -0
  182. data/lib/action_view/helpers/tags/datetime_field.rb +22 -0
  183. data/lib/action_view/helpers/tags/datetime_local_field.rb +19 -0
  184. data/lib/action_view/helpers/tags/datetime_select.rb +8 -0
  185. data/lib/action_view/helpers/tags/email_field.rb +8 -0
  186. data/lib/action_view/helpers/tags/file_field.rb +8 -0
  187. data/lib/action_view/helpers/tags/grouped_collection_select.rb +29 -0
  188. data/lib/action_view/helpers/tags/hidden_field.rb +8 -0
  189. data/lib/action_view/helpers/tags/label.rb +65 -0
  190. data/lib/action_view/helpers/tags/month_field.rb +13 -0
  191. data/lib/action_view/helpers/tags/number_field.rb +18 -0
  192. data/lib/action_view/helpers/tags/password_field.rb +12 -0
  193. data/lib/action_view/helpers/tags/radio_button.rb +31 -0
  194. data/lib/action_view/helpers/tags/range_field.rb +8 -0
  195. data/lib/action_view/helpers/tags/search_field.rb +24 -0
  196. data/lib/action_view/helpers/tags/select.rb +41 -0
  197. data/lib/action_view/helpers/tags/tel_field.rb +8 -0
  198. data/lib/action_view/helpers/tags/text_area.rb +18 -0
  199. data/lib/action_view/helpers/tags/text_field.rb +29 -0
  200. data/lib/action_view/helpers/tags/time_field.rb +13 -0
  201. data/lib/action_view/helpers/tags/time_select.rb +8 -0
  202. data/lib/action_view/helpers/tags/time_zone_select.rb +20 -0
  203. data/lib/action_view/helpers/tags/url_field.rb +8 -0
  204. data/lib/action_view/helpers/tags/week_field.rb +13 -0
  205. data/lib/action_view/helpers/text_helper.rb +126 -113
  206. data/lib/action_view/helpers/translation_helper.rb +32 -16
  207. data/lib/action_view/helpers/url_helper.rb +200 -271
  208. data/lib/action_view/locale/en.yml +1 -105
  209. data/lib/action_view/log_subscriber.rb +6 -4
  210. data/lib/action_view/lookup_context.rb +15 -39
  211. data/lib/action_view/model_naming.rb +12 -0
  212. data/lib/action_view/path_set.rb +9 -39
  213. data/lib/action_view/railtie.rb +6 -22
  214. data/lib/action_view/record_identifier.rb +84 -0
  215. data/lib/action_view/renderer/abstract_renderer.rb +10 -19
  216. data/lib/action_view/renderer/partial_renderer.rb +144 -81
  217. data/lib/action_view/renderer/renderer.rb +2 -19
  218. data/lib/action_view/renderer/streaming_template_renderer.rb +2 -5
  219. data/lib/action_view/renderer/template_renderer.rb +14 -13
  220. data/lib/action_view/routing_url_for.rb +107 -0
  221. data/lib/action_view/template.rb +22 -21
  222. data/lib/action_view/template/error.rb +22 -12
  223. data/lib/action_view/template/handlers.rb +12 -9
  224. data/lib/action_view/template/handlers/builder.rb +1 -1
  225. data/lib/action_view/template/handlers/erb.rb +11 -16
  226. data/lib/action_view/template/handlers/raw.rb +11 -0
  227. data/lib/action_view/template/resolver.rb +111 -83
  228. data/lib/action_view/template/text.rb +12 -8
  229. data/lib/action_view/template/types.rb +57 -0
  230. data/lib/action_view/test_case.rb +66 -43
  231. data/lib/action_view/testing/resolvers.rb +3 -2
  232. data/lib/action_view/vendor/html-scanner.rb +20 -0
  233. data/lib/{action_controller → action_view}/vendor/html-scanner/html/document.rb +0 -0
  234. data/lib/{action_controller → action_view}/vendor/html-scanner/html/node.rb +12 -12
  235. data/lib/{action_controller → action_view}/vendor/html-scanner/html/sanitizer.rb +18 -7
  236. data/lib/{action_controller → action_view}/vendor/html-scanner/html/selector.rb +1 -1
  237. data/lib/{action_controller → action_view}/vendor/html-scanner/html/tokenizer.rb +1 -1
  238. data/lib/{action_controller → action_view}/vendor/html-scanner/html/version.rb +0 -0
  239. metadata +135 -125
  240. data/lib/action_controller/caching/actions.rb +0 -185
  241. data/lib/action_controller/caching/pages.rb +0 -187
  242. data/lib/action_controller/caching/sweeping.rb +0 -97
  243. data/lib/action_controller/deprecated/performance_test.rb +0 -1
  244. data/lib/action_controller/metal/compatibility.rb +0 -65
  245. data/lib/action_controller/metal/session_management.rb +0 -14
  246. data/lib/action_controller/railties/paths.rb +0 -25
  247. data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
  248. data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
  249. data/lib/action_dispatch/middleware/head.rb +0 -18
  250. data/lib/action_dispatch/middleware/rescue.rb +0 -26
  251. data/lib/action_dispatch/testing/performance_test.rb +0 -10
  252. data/lib/action_view/asset_paths.rb +0 -142
  253. data/lib/action_view/helpers/asset_paths.rb +0 -7
  254. data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
  255. data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
  256. data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
  257. data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
  258. data/lib/sprockets/assets.rake +0 -99
  259. data/lib/sprockets/bootstrap.rb +0 -37
  260. data/lib/sprockets/compressors.rb +0 -83
  261. data/lib/sprockets/helpers.rb +0 -6
  262. data/lib/sprockets/helpers/isolated_helper.rb +0 -13
  263. data/lib/sprockets/helpers/rails_helper.rb +0 -182
  264. data/lib/sprockets/railtie.rb +0 -62
  265. data/lib/sprockets/static_compiler.rb +0 -56
@@ -1,20 +1,5 @@
1
- $LOAD_PATH << "#{File.dirname(__FILE__)}/html-scanner"
1
+ require 'action_view/vendor/html-scanner'
2
+ require 'active_support/deprecation'
2
3
 
3
- module HTML
4
- extend ActiveSupport::Autoload
5
-
6
- eager_autoload do
7
- autoload :CDATA, 'html/node'
8
- autoload :Document, 'html/document'
9
- autoload :FullSanitizer, 'html/sanitizer'
10
- autoload :LinkSanitizer, 'html/sanitizer'
11
- autoload :Node, 'html/node'
12
- autoload :Sanitizer, 'html/sanitizer'
13
- autoload :Selector, 'html/selector'
14
- autoload :Tag, 'html/node'
15
- autoload :Text, 'html/node'
16
- autoload :Tokenizer, 'html/tokenizer'
17
- autoload :Version, 'html/version'
18
- autoload :WhiteListSanitizer, 'html/sanitizer'
19
- end
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'
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2004-2011 David Heinemeier Hansson
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/dependencies/autoload'
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
- autoload_under 'http' do
45
- autoload :Request
46
- autoload :Response
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, 'action_dispatch/middleware/session/abstract_store'
86
- autoload :CookieStore, 'action_dispatch/middleware/session/cookie_store'
87
- autoload :MemCacheStore, 'action_dispatch/middleware/session/mem_cache_store'
88
- autoload :CacheStore, 'action_dispatch/middleware/session/cache_store'
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
- if_none_match && if_none_match == etag
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 prepare_cache_control!
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(/,\s*/).each do |segment|
80
- first, last = segment.split("=")
81
- @cache_control[first.to_sym] = last || true
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
- return if self[CACHE_CONTROL].present?
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 = @cache_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
- extend ActiveSupport::Concern
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(@env["action_dispatch.parameter_filter"])
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
- parameter_filter_for(Array.wrap(@env["action_dispatch.parameter_filter"]) << /RAW_POST_DATA/)
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 < ::Hash
4
- @@env_cache = Hash.new { |h,k| h[k] = "HTTP_#{k.upcase.gsub(/-/, '_')}" }
3
+ class Headers
4
+ include Enumerable
5
5
 
6
- def initialize(*args)
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
- if include?(header_name)
18
- super
19
- else
20
- super(env_name(header_name))
21
- end
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
- # Converts a HTTP header name to an environment variable name.
26
- def env_name(header_name)
27
- @@env_cache[header_name]
28
- end
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
- # before_filter :adjust_format_for_iphone
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.present? || content_mime_type)) ||
124
+ (xhr? && (accept || content_mime_type)) ||
102
125
  (accept.present? && accept !~ BROWSER_LIKE_ACCEPTS)
103
126
  end
104
127