aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib
diff options
context:
space:
mode:
Diffstat (limited to 'actionpack/lib')
-rw-r--r--actionpack/lib/action_controller/metal/responder.rb2
-rw-r--r--actionpack/lib/action_controller/metal/verification.rb2
-rwxr-xr-xactionpack/lib/action_dispatch/http/request.rb60
-rw-r--r--actionpack/lib/action_dispatch/routing/mapper.rb13
-rw-r--r--actionpack/lib/action_dispatch/routing/route_set.rb10
-rw-r--r--actionpack/lib/action_dispatch/testing/integration.rb3
-rw-r--r--actionpack/lib/action_view/helpers/url_helper.rb7
7 files changed, 63 insertions, 34 deletions
diff --git a/actionpack/lib/action_controller/metal/responder.rb b/actionpack/lib/action_controller/metal/responder.rb
index 0b2cee6868..d97c10a293 100644
--- a/actionpack/lib/action_controller/metal/responder.rb
+++ b/actionpack/lib/action_controller/metal/responder.rb
@@ -216,7 +216,7 @@ module ActionController #:nodoc:
# the verb is POST.
#
def default_action
- @action ||= ACTIONS_FOR_VERBS[request.method]
+ @action ||= ACTIONS_FOR_VERBS[request.method_symbol]
end
end
end
diff --git a/actionpack/lib/action_controller/metal/verification.rb b/actionpack/lib/action_controller/metal/verification.rb
index bce942b588..b7fc2b7421 100644
--- a/actionpack/lib/action_controller/metal/verification.rb
+++ b/actionpack/lib/action_controller/metal/verification.rb
@@ -108,7 +108,7 @@ module ActionController #:nodoc:
end
def verify_method(options) # :nodoc:
- [*options[:method]].all? { |v| request.method != v.to_sym } if options[:method]
+ [*options[:method]].all? { |v| request.method_symbol != v.to_sym } if options[:method]
end
def verify_request_xhr_status(options) # :nodoc:
diff --git a/actionpack/lib/action_dispatch/http/request.rb b/actionpack/lib/action_dispatch/http/request.rb
index 8b8426b5aa..8560a6fc9c 100755
--- a/actionpack/lib/action_dispatch/http/request.rb
+++ b/actionpack/lib/action_dispatch/http/request.rb
@@ -45,47 +45,65 @@ module ActionDispatch
HTTP_METHODS = %w(get head put post delete options)
HTTP_METHOD_LOOKUP = HTTP_METHODS.inject({}) { |h, m| h[m] = h[m.upcase] = m.to_sym; h }
- # Returns the true HTTP request \method as a lowercase symbol, such as
- # <tt>:get</tt>. If the request \method is not listed in the HTTP_METHODS
- # constant above, an UnknownHttpMethod exception is raised.
+ # Returns the HTTP \method that the application should see.
+ # In the case where the \method was overridden by a middleware
+ # (for instance, if a HEAD request was converted to a GET,
+ # or if a _method parameter was used to determine the \method
+ # the application should use), this \method returns the overridden
+ # value, not the original.
def request_method
- method = env["rack.methodoverride.original_method"] || env["REQUEST_METHOD"]
+ method = env["REQUEST_METHOD"]
HTTP_METHOD_LOOKUP[method] || raise(ActionController::UnknownHttpMethod, "#{method}, accepted HTTP methods are #{HTTP_METHODS.to_sentence(:locale => :en)}")
+ method
+ end
+
+ # Returns a symbol form of the #request_method
+ def request_method_symbol
+ HTTP_METHOD_LOOKUP[request_method]
end
- # Returns the HTTP request \method used for action processing as a
- # lowercase symbol, such as <tt>:post</tt>. (Unlike #request_method, this
- # method returns <tt>:get</tt> for a HEAD request because the two are
- # functionally equivalent from the application's perspective.)
+ # Returns the original value of the environment's REQUEST_METHOD,
+ # even if it was overridden by middleware. See #request_method for
+ # more information.
def method
- method = env["REQUEST_METHOD"]
+ method = env["rack.methodoverride.original_method"] || env['REQUEST_METHOD']
HTTP_METHOD_LOOKUP[method] || raise(ActionController::UnknownHttpMethod, "#{method}, accepted HTTP methods are #{HTTP_METHODS.to_sentence(:locale => :en)}")
+ method
+ end
+
+ # Returns a symbol form of the #method
+ def method_symbol
+ HTTP_METHOD_LOOKUP[method]
end
- # Is this a GET (or HEAD) request? Equivalent to <tt>request.method == :get</tt>.
+ # Is this a GET (or HEAD) request?
+ # Equivalent to <tt>request.request_method == :get</tt>.
def get?
- method == :get
+ HTTP_METHOD_LOOKUP[request_method] == :get
end
- # Is this a POST request? Equivalent to <tt>request.method == :post</tt>.
+ # Is this a POST request?
+ # Equivalent to <tt>request.request_method == :post</tt>.
def post?
- method == :post
+ HTTP_METHOD_LOOKUP[request_method] == :post
end
- # Is this a PUT request? Equivalent to <tt>request.method == :put</tt>.
+ # Is this a PUT request?
+ # Equivalent to <tt>request.request_method == :put</tt>.
def put?
- method == :put
+ HTTP_METHOD_LOOKUP[request_method] == :put
end
- # Is this a DELETE request? Equivalent to <tt>request.method == :delete</tt>.
+ # Is this a DELETE request?
+ # Equivalent to <tt>request.request_method == :delete</tt>.
def delete?
- method == :delete
+ HTTP_METHOD_LOOKUP[request_method] == :delete
end
- # Is this a HEAD request? Since <tt>request.method</tt> sees HEAD as <tt>:get</tt>,
- # this \method checks the actual HTTP \method directly.
+ # Is this a HEAD request?
+ # Equivalent to <tt>request.method == :head</tt>.
def head?
- request_method == :head
+ HTTP_METHOD_LOOKUP[method] == :head
end
# Provides access to the request's HTTP headers, for example:
@@ -96,7 +114,7 @@ module ActionDispatch
end
def forgery_whitelisted?
- method == :get || xhr? || content_mime_type.nil? || !content_mime_type.verify_request?
+ get? || xhr? || content_mime_type.nil? || !content_mime_type.verify_request?
end
def media_type
diff --git a/actionpack/lib/action_dispatch/routing/mapper.rb b/actionpack/lib/action_dispatch/routing/mapper.rb
index 2c7ee7dad0..ffa178345b 100644
--- a/actionpack/lib/action_dispatch/routing/mapper.rb
+++ b/actionpack/lib/action_dispatch/routing/mapper.rb
@@ -5,20 +5,20 @@ module ActionDispatch
module Routing
class Mapper
class Constraints #:nodoc:
- def self.new(app, constraints = [])
+ def self.new(app, constraints, request = Rack::Request)
if constraints.any?
- super(app, constraints)
+ super(app, constraints, request)
else
app
end
end
- def initialize(app, constraints = [])
- @app, @constraints = app, constraints
+ def initialize(app, constraints, request)
+ @app, @constraints, @request = app, constraints, request
end
def call(env)
- req = Rack::Request.new(env)
+ req = @request.new(env)
@constraints.each { |constraint|
if constraint.respond_to?(:matches?) && !constraint.matches?(req)
@@ -83,7 +83,8 @@ module ActionDispatch
def app
Constraints.new(
to.respond_to?(:call) ? to : Routing::RouteSet::Dispatcher.new(:defaults => defaults),
- blocks
+ blocks,
+ @set.request_class
)
end
diff --git a/actionpack/lib/action_dispatch/routing/route_set.rb b/actionpack/lib/action_dispatch/routing/route_set.rb
index c8e4371bb7..f1965f38b9 100644
--- a/actionpack/lib/action_dispatch/routing/route_set.rb
+++ b/actionpack/lib/action_dispatch/routing/route_set.rb
@@ -187,18 +187,19 @@ module ActionDispatch
attr_accessor :routes, :named_routes
attr_accessor :disable_clear_and_finalize, :resources_path_names
- attr_accessor :default_url_options
+ attr_accessor :default_url_options, :request_class
def self.default_resources_path_names
{ :new => 'new', :edit => 'edit' }
end
- def initialize
+ def initialize(request_class = ActionDispatch::Request)
self.routes = []
self.named_routes = NamedRouteCollection.new
self.resources_path_names = self.class.default_resources_path_names.dup
self.controller_namespaces = Set.new
self.default_url_options = {}
+ self.request_class = request_class
@disable_clear_and_finalize = false
clear!
@@ -232,7 +233,10 @@ module ActionDispatch
@finalized = false
routes.clear
named_routes.clear
- @set = ::Rack::Mount::RouteSet.new(:parameters_key => PARAMETERS_KEY)
+ @set = ::Rack::Mount::RouteSet.new(
+ :parameters_key => PARAMETERS_KEY,
+ :request_class => request_class
+ )
end
def install_helpers(destinations = [ActionController::Base, ActionView::Base], regenerate_code = false)
diff --git a/actionpack/lib/action_dispatch/testing/integration.rb b/actionpack/lib/action_dispatch/testing/integration.rb
index 031fa1dfb4..8d107d9aa5 100644
--- a/actionpack/lib/action_dispatch/testing/integration.rb
+++ b/actionpack/lib/action_dispatch/testing/integration.rb
@@ -266,11 +266,12 @@ module ActionDispatch
"HTTP_ACCEPT" => accept
}
+ session = Rack::Test::Session.new(@mock_session)
+
(rack_environment || {}).each do |key, value|
env[key] = value
end
- session = Rack::Test::Session.new(@mock_session)
session.request(path, env)
@request_count += 1
diff --git a/actionpack/lib/action_view/helpers/url_helper.rb b/actionpack/lib/action_view/helpers/url_helper.rb
index 1415966869..5925faf810 100644
--- a/actionpack/lib/action_view/helpers/url_helper.rb
+++ b/actionpack/lib/action_view/helpers/url_helper.rb
@@ -10,6 +10,12 @@ module ActionView
# This allows you to use the same format for links in views
# and controllers.
module UrlHelper
+ # This helper may be included in any class that includes the
+ # URL helpers of a router (router.url_helpers). Some methods
+ # provided here will only work in the context of a request
+ # (link_to_unless_current, for instance), which must be provided
+ # as a method called #request on the context.
+
extend ActiveSupport::Concern
include ActionDispatch::Routing::UrlFor
@@ -307,7 +313,6 @@ module ActionView
# # </div>
# # </form>"
# #
-
def button_to(name, options = {}, html_options = {})
html_options = html_options.stringify_keys
convert_boolean_attributes!(html_options, %w( disabled ))