mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Use rackmounts recognize api and don't piggyback recognize_path on
top of rack call
This commit is contained in:
parent
588225f885
commit
61e9f2023b
2 changed files with 30 additions and 21 deletions
|
@ -2,7 +2,7 @@ module ActionDispatch
|
|||
module Routing
|
||||
class Mapper
|
||||
class Constraints
|
||||
def new(app, constraints = [])
|
||||
def self.new(app, constraints = [])
|
||||
if constraints.any?
|
||||
super(app, constraints)
|
||||
else
|
||||
|
|
|
@ -18,27 +18,27 @@ module ActionDispatch
|
|||
|
||||
def call(env)
|
||||
params = env[PARAMETERS_KEY]
|
||||
prepare_params!(params)
|
||||
|
||||
unless controller = controller(params)
|
||||
return [417, {}, []]
|
||||
end
|
||||
|
||||
controller.action(params[:action]).call(env)
|
||||
end
|
||||
|
||||
def prepare_params!(params)
|
||||
merge_default_action!(params)
|
||||
split_glob_param!(params) if @glob_param
|
||||
|
||||
params.each do |key, value|
|
||||
if value.is_a?(String)
|
||||
value = value.dup.force_encoding(Encoding::BINARY) if value.respond_to?(:force_encoding)
|
||||
params[key] = URI.unescape(value)
|
||||
end
|
||||
end
|
||||
|
||||
unless controller = controller(params)
|
||||
return [417, {}, []]
|
||||
end
|
||||
|
||||
if env['action_controller.recognize']
|
||||
[200, {}, params]
|
||||
else
|
||||
controller.action(params[:action]).call(env)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
def controller(params)
|
||||
if params && params.has_key?(:controller)
|
||||
controller = "#{params[:controller].camelize}Controller"
|
||||
|
@ -48,6 +48,7 @@ module ActionDispatch
|
|||
nil
|
||||
end
|
||||
|
||||
private
|
||||
def merge_default_action!(params)
|
||||
params[:action] ||= 'index'
|
||||
end
|
||||
|
@ -460,6 +461,7 @@ module ActionDispatch
|
|||
|
||||
def recognize_path(path, environment = {})
|
||||
method = (environment[:method] || "GET").to_s.upcase
|
||||
path = Rack::Mount::Utils.normalize_path(path)
|
||||
|
||||
begin
|
||||
env = Rack::MockRequest.env_for(path, {:method => method})
|
||||
|
@ -467,9 +469,16 @@ module ActionDispatch
|
|||
raise ActionController::RoutingError, e.message
|
||||
end
|
||||
|
||||
env['action_controller.recognize'] = true
|
||||
status, headers, body = call(env)
|
||||
body
|
||||
req = Rack::Request.new(env)
|
||||
@set.recognize(req) do |route, params|
|
||||
dispatcher = route.app
|
||||
if dispatcher.is_a?(Dispatcher) && dispatcher.controller(params)
|
||||
dispatcher.prepare_params!(params)
|
||||
return params
|
||||
end
|
||||
end
|
||||
|
||||
raise ActionController::RoutingError, "No route matches #{path.inspect} with #{environment.inspect}"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue