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,12 +1,16 @@
1
- require 'tempfile'
2
1
  require 'stringio'
3
- require 'strscan'
4
2
 
5
- require 'active_support/core_ext/hash/indifferent_access'
6
- require 'active_support/core_ext/string/access'
7
3
  require 'active_support/inflector'
8
4
  require 'action_dispatch/http/headers'
9
5
  require 'action_controller/metal/exceptions'
6
+ require 'rack/request'
7
+ require 'action_dispatch/http/cache'
8
+ require 'action_dispatch/http/mime_negotiation'
9
+ require 'action_dispatch/http/parameters'
10
+ require 'action_dispatch/http/filter_parameters'
11
+ require 'action_dispatch/http/upload'
12
+ require 'action_dispatch/http/url'
13
+ require 'active_support/core_ext/array/conversions'
10
14
 
11
15
  module ActionDispatch
12
16
  class Request < Rack::Request
@@ -14,10 +18,13 @@ module ActionDispatch
14
18
  include ActionDispatch::Http::MimeNegotiation
15
19
  include ActionDispatch::Http::Parameters
16
20
  include ActionDispatch::Http::FilterParameters
17
- include ActionDispatch::Http::Upload
18
21
  include ActionDispatch::Http::URL
19
22
 
20
- LOCALHOST = [/^127\.0\.0\.\d{1,3}$/, "::1", /^0:0:0:0:0:0:0:1(%.*)?$/].freeze
23
+ autoload :Session, 'action_dispatch/request/session'
24
+ autoload :Utils, 'action_dispatch/request/utils'
25
+
26
+ LOCALHOST = Regexp.union [/^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/, /^::1$/, /^0:0:0:0:0:0:0:1(%.*)?$/]
27
+
21
28
  ENV_METHODS = %w[ AUTH_TYPE GATEWAY_INTERFACE
22
29
  PATH_TRANSLATED REMOTE_HOST
23
30
  REMOTE_IDENT REMOTE_USER REMOTE_ADDR
@@ -35,6 +42,28 @@ module ActionDispatch
35
42
  METHOD
36
43
  end
37
44
 
45
+ def initialize(env)
46
+ super
47
+ @method = nil
48
+ @request_method = nil
49
+ @remote_ip = nil
50
+ @original_fullpath = nil
51
+ @fullpath = nil
52
+ @ip = nil
53
+ @uuid = nil
54
+ end
55
+
56
+ def check_path_parameters!
57
+ # If any of the path parameters has an invalid encoding then
58
+ # raise since it's likely to trigger errors further on.
59
+ path_parameters.each do |key, value|
60
+ next unless value.respond_to?(:valid_encoding?)
61
+ unless value.valid_encoding?
62
+ raise ActionController::BadRequest, "Invalid parameter: #{key} => #{value}"
63
+ end
64
+ end
65
+ end
66
+
38
67
  def key?(key)
39
68
  @env.key?(key)
40
69
  end
@@ -46,6 +75,7 @@ module ActionDispatch
46
75
  # Ordered Collections Protocol (WebDAV) (http://www.ietf.org/rfc/rfc3648.txt)
47
76
  # Web Distributed Authoring and Versioning (WebDAV) Access Control Protocol (http://www.ietf.org/rfc/rfc3744.txt)
48
77
  # Web Distributed Authoring and Versioning (WebDAV) SEARCH (http://www.ietf.org/rfc/rfc5323.txt)
78
+ # Calendar Extensions to WebDAV (http://www.ietf.org/rfc/rfc4791.txt)
49
79
  # PATCH Method for HTTP (http://www.ietf.org/rfc/rfc5789.txt)
50
80
  RFC2616 = %w(OPTIONS GET HEAD POST PUT DELETE TRACE CONNECT)
51
81
  RFC2518 = %w(PROPFIND PROPPATCH MKCOL COPY MOVE LOCK UNLOCK)
@@ -53,15 +83,17 @@ module ActionDispatch
53
83
  RFC3648 = %w(ORDERPATCH)
54
84
  RFC3744 = %w(ACL)
55
85
  RFC5323 = %w(SEARCH)
86
+ RFC4791 = %w(MKCALENDAR)
56
87
  RFC5789 = %w(PATCH)
57
88
 
58
- HTTP_METHODS = RFC2616 + RFC2518 + RFC3253 + RFC3648 + RFC3744 + RFC5323 + RFC5789
89
+ HTTP_METHODS = RFC2616 + RFC2518 + RFC3253 + RFC3648 + RFC3744 + RFC5323 + RFC4791 + RFC5789
90
+
59
91
  HTTP_METHOD_LOOKUP = {}
60
92
 
61
93
  # Populate the HTTP method lookup cache
62
- HTTP_METHODS.each do |method|
94
+ HTTP_METHODS.each { |method|
63
95
  HTTP_METHOD_LOOKUP[method] = method.underscore.to_sym
64
- end
96
+ }
65
97
 
66
98
  # Returns the HTTP \method that the application should see.
67
99
  # In the case where the \method was overridden by a middleware
@@ -73,6 +105,12 @@ module ActionDispatch
73
105
  @request_method ||= check_method(env["REQUEST_METHOD"])
74
106
  end
75
107
 
108
+ def request_method=(request_method) #:nodoc:
109
+ if check_method(request_method)
110
+ @request_method = env["REQUEST_METHOD"] = request_method
111
+ end
112
+ end
113
+
76
114
  # Returns a symbol form of the #request_method
77
115
  def request_method_symbol
78
116
  HTTP_METHOD_LOOKUP[request_method]
@@ -102,6 +140,12 @@ module ActionDispatch
102
140
  HTTP_METHOD_LOOKUP[request_method] == :post
103
141
  end
104
142
 
143
+ # Is this a PATCH request?
144
+ # Equivalent to <tt>request.request_method == :patch</tt>.
145
+ def patch?
146
+ HTTP_METHOD_LOOKUP[request_method] == :patch
147
+ end
148
+
105
149
  # Is this a PUT request?
106
150
  # Equivalent to <tt>request.request_method_symbol == :put</tt>.
107
151
  def put?
@@ -115,9 +159,9 @@ module ActionDispatch
115
159
  end
116
160
 
117
161
  # Is this a HEAD request?
118
- # Equivalent to <tt>request.method_symbol == :head</tt>.
162
+ # Equivalent to <tt>request.request_method_symbol == :head</tt>.
119
163
  def head?
120
- HTTP_METHOD_LOOKUP[method] == :head
164
+ HTTP_METHOD_LOOKUP[request_method] == :head
121
165
  end
122
166
 
123
167
  # Provides access to the request's HTTP headers, for example:
@@ -127,18 +171,40 @@ module ActionDispatch
127
171
  Http::Headers.new(@env)
128
172
  end
129
173
 
174
+ # Returns a +String+ with the last requested path including their params.
175
+ #
176
+ # # get '/foo'
177
+ # request.original_fullpath # => '/foo'
178
+ #
179
+ # # get '/foo?bar'
180
+ # request.original_fullpath # => '/foo?bar'
130
181
  def original_fullpath
131
182
  @original_fullpath ||= (env["ORIGINAL_FULLPATH"] || fullpath)
132
183
  end
133
184
 
185
+ # Returns the +String+ full path including params of the last URL requested.
186
+ #
187
+ # # get "/articles"
188
+ # request.fullpath # => "/articles"
189
+ #
190
+ # # get "/articles?page=2"
191
+ # request.fullpath # => "/articles?page=2"
134
192
  def fullpath
135
193
  @fullpath ||= super
136
194
  end
137
195
 
196
+ # Returns the original request URL as a +String+.
197
+ #
198
+ # # get "/articles?page=2"
199
+ # request.original_url # => "http://www.example.com/articles?page=2"
138
200
  def original_url
139
201
  base_url + original_fullpath
140
202
  end
141
203
 
204
+ # The +String+ MIME type of the request.
205
+ #
206
+ # # get "/articles"
207
+ # request.media_type # => "application/x-www-form-urlencoded"
142
208
  def media_type
143
209
  content_mime_type.to_s
144
210
  end
@@ -149,8 +215,8 @@ module ActionDispatch
149
215
  end
150
216
 
151
217
  # Returns true if the "X-Requested-With" header contains "XMLHttpRequest"
152
- # (case-insensitive). All major JavaScript libraries send this header with
153
- # every Ajax request.
218
+ # (case-insensitive), which may need to be manually added depending on the
219
+ # choice of JavaScript libraries and frameworks.
154
220
  def xml_http_request?
155
221
  @env['HTTP_X_REQUESTED_WITH'] =~ /XMLHttpRequest/i
156
222
  end
@@ -165,7 +231,7 @@ module ActionDispatch
165
231
  @remote_ip ||= (@env["action_dispatch.remote_ip"] || ip).to_s
166
232
  end
167
233
 
168
- # Returns the unique request id, which is based off either the X-Request-Id header that can
234
+ # Returns the unique request id, which is based on either the X-Request-Id header that can
169
235
  # be generated by a firewall, load balancer, or web server or by the RequestId middleware
170
236
  # (which sets the action_dispatch.request_id environment variable).
171
237
  #
@@ -185,7 +251,7 @@ module ActionDispatch
185
251
  def raw_post
186
252
  unless @env.include? 'RAW_POST_DATA'
187
253
  raw_post_body = body
188
- @env['RAW_POST_DATA'] = raw_post_body.read(@env['CONTENT_LENGTH'].to_i)
254
+ @env['RAW_POST_DATA'] = raw_post_body.read(content_length)
189
255
  raw_post_body.rewind if raw_post_body.respond_to?(:rewind)
190
256
  end
191
257
  @env['RAW_POST_DATA']
@@ -195,7 +261,7 @@ module ActionDispatch
195
261
  # variable is already set, wrap it in a StringIO.
196
262
  def body
197
263
  if raw_post = @env['RAW_POST_DATA']
198
- raw_post.force_encoding(Encoding::BINARY) if raw_post.respond_to?(:force_encoding)
264
+ raw_post.force_encoding(Encoding::BINARY)
199
265
  StringIO.new(raw_post)
200
266
  else
201
267
  @env['rack.input']
@@ -213,32 +279,38 @@ module ActionDispatch
213
279
  # TODO This should be broken apart into AD::Request::Session and probably
214
280
  # be included by the session middleware.
215
281
  def reset_session
216
- session.destroy if session && session.respond_to?(:destroy)
217
- self.session = {}
282
+ if session && session.respond_to?(:destroy)
283
+ session.destroy
284
+ else
285
+ self.session = {}
286
+ end
218
287
  @env['action_dispatch.request.flash_hash'] = nil
219
288
  end
220
289
 
221
290
  def session=(session) #:nodoc:
222
- @env['rack.session'] = session
291
+ Session.set @env, session
223
292
  end
224
293
 
225
294
  def session_options=(options)
226
- @env['rack.session.options'] = options
295
+ Session::Options.set @env, options
227
296
  end
228
297
 
229
298
  # Override Rack's GET method to support indifferent access
230
299
  def GET
231
- @env["action_dispatch.request.query_parameters"] ||= deep_munge(normalize_parameters(super) || {})
300
+ @env["action_dispatch.request.query_parameters"] ||= Utils.deep_munge(normalize_encode_params(super || {}))
301
+ rescue Rack::Utils::ParameterTypeError, Rack::Utils::InvalidParameterError => e
302
+ raise ActionController::BadRequest.new(:query, e)
232
303
  end
233
304
  alias :query_parameters :GET
234
305
 
235
306
  # Override Rack's POST method to support indifferent access
236
307
  def POST
237
- @env["action_dispatch.request.request_parameters"] ||= deep_munge(normalize_parameters(super) || {})
308
+ @env["action_dispatch.request.request_parameters"] ||= Utils.deep_munge(normalize_encode_params(super || {}))
309
+ rescue Rack::Utils::ParameterTypeError, Rack::Utils::InvalidParameterError => e
310
+ raise ActionController::BadRequest.new(:request, e)
238
311
  end
239
312
  alias :request_parameters :POST
240
313
 
241
-
242
314
  # Returns the authorization header regardless of whether it was specified directly or through one of the
243
315
  # proxy alternatives.
244
316
  def authorization
@@ -250,36 +322,27 @@ module ActionDispatch
250
322
 
251
323
  # True if the request came from localhost, 127.0.0.1.
252
324
  def local?
253
- LOCALHOST.any? { |local_ip| local_ip === remote_addr && local_ip === remote_ip }
325
+ LOCALHOST =~ remote_addr && LOCALHOST =~ remote_ip
254
326
  end
255
327
 
256
- # Remove nils from the params hash
328
+ # Extracted into ActionDispatch::Request::Utils.deep_munge, but kept here for backwards compatibility.
257
329
  def deep_munge(hash)
258
- hash.each do |k, v|
259
- case v
260
- when Array
261
- v.grep(Hash) { |x| deep_munge(x) }
262
- v.compact!
263
- hash[k] = nil if v.empty?
264
- when Hash
265
- deep_munge(v)
266
- end
267
- end
330
+ ActiveSupport::Deprecation.warn(
331
+ 'This method has been extracted into `ActionDispatch::Request::Utils.deep_munge`. Please start using that instead.'
332
+ )
268
333
 
269
- hash
334
+ Utils.deep_munge(hash)
270
335
  end
271
336
 
272
337
  protected
273
-
274
- def parse_query(qs)
275
- deep_munge(super)
276
- end
338
+ def parse_query(qs)
339
+ Utils.deep_munge(super)
340
+ end
277
341
 
278
342
  private
279
-
280
- def check_method(name)
281
- HTTP_METHOD_LOOKUP[name] || raise(ActionController::UnknownHttpMethod, "#{name}, accepted HTTP methods are #{HTTP_METHODS.to_sentence(:locale => :en)}")
282
- name
283
- end
343
+ def check_method(name)
344
+ HTTP_METHOD_LOOKUP[name] || raise(ActionController::UnknownHttpMethod, "#{name}, accepted HTTP methods are #{HTTP_METHODS[0...-1].join(', ')}, and #{HTTP_METHODS[-1]}")
345
+ name
346
+ end
284
347
  end
285
348
  end