From 402c2af55053c2f29319091ad21fd6fa6b90ee89 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Tue, 27 May 2014 12:10:24 -0700 Subject: give all endpoints a superclass --- actionpack/lib/action_dispatch/routing/endpoint.rb | 10 ++++++++ actionpack/lib/action_dispatch/routing/mapper.rb | 30 ++++++++++------------ .../lib/action_dispatch/routing/redirection.rb | 9 +++++-- .../lib/action_dispatch/routing/route_set.rb | 13 +++++++--- 4 files changed, 40 insertions(+), 22 deletions(-) create mode 100644 actionpack/lib/action_dispatch/routing/endpoint.rb (limited to 'actionpack/lib/action_dispatch') diff --git a/actionpack/lib/action_dispatch/routing/endpoint.rb b/actionpack/lib/action_dispatch/routing/endpoint.rb new file mode 100644 index 0000000000..88aa13c3e8 --- /dev/null +++ b/actionpack/lib/action_dispatch/routing/endpoint.rb @@ -0,0 +1,10 @@ +module ActionDispatch + module Routing + class Endpoint # :nodoc: + def dispatcher?; false; end + def redirect?; false; end + def matches?(req); true; end + def app; self; end + end + end +end diff --git a/actionpack/lib/action_dispatch/routing/mapper.rb b/actionpack/lib/action_dispatch/routing/mapper.rb index 86357ded4f..0c3581db32 100644 --- a/actionpack/lib/action_dispatch/routing/mapper.rb +++ b/actionpack/lib/action_dispatch/routing/mapper.rb @@ -6,6 +6,7 @@ require 'active_support/core_ext/array/extract_options' require 'active_support/core_ext/module/remove_method' require 'active_support/inflector' require 'action_dispatch/routing/redirection' +require 'action_dispatch/routing/endpoint' module ActionDispatch module Routing @@ -15,10 +16,10 @@ module ActionDispatch :controller, :action, :path_names, :constraints, :shallow, :blocks, :defaults, :options] - class Constraints #:nodoc: + class Constraints < Endpoint #:nodoc: attr_reader :app, :constraints - def initialize(app, constraints, request, dispatcher_p, redirect_p) + def initialize(app, constraints, request, dispatcher_p) # Unwrap Constraints objects. I don't actually think it's possible # to pass a Constraints object to this constructor, but there were # multiple places that kept testing children of this object. I @@ -29,13 +30,11 @@ module ActionDispatch end @dispatcher = dispatcher_p - @redirect = redirect_p @app, @constraints, @request = app, constraints, request end def dispatcher?; @dispatcher; end - def redirect?; @redirect; end def matches?(req) @constraints.all? do |constraint| @@ -220,24 +219,21 @@ module ActionDispatch end def app - dispatcher_p = false - redirect = false - # Unwrap any constraints so we can see what's inside for route generation. # This allows the formatter to skip over any mounted applications or redirects # that shouldn't be matched when using a url_for without a route name. if to.respond_to?(:call) - endpoint = to - redirect = Redirect === endpoint - else - dispatcher_p = true - endpoint = dispatcher - end - - if blocks.any? - Constraints.new(endpoint, blocks, @set.request_class, dispatcher_p, redirect) + if Redirect === to + to + else + Constraints.new(to, blocks, @set.request_class, false) + end else - Constraints.new(endpoint, blocks, @set.request_class, dispatcher_p, redirect) + if blocks.any? + Constraints.new(dispatcher, blocks, @set.request_class, true) + else + dispatcher + end end end diff --git a/actionpack/lib/action_dispatch/routing/redirection.rb b/actionpack/lib/action_dispatch/routing/redirection.rb index f8ed0cbe6a..c9639bca84 100644 --- a/actionpack/lib/action_dispatch/routing/redirection.rb +++ b/actionpack/lib/action_dispatch/routing/redirection.rb @@ -3,10 +3,11 @@ require 'active_support/core_ext/uri' require 'active_support/core_ext/array/extract_options' require 'rack/utils' require 'action_controller/metal/exceptions' +require 'action_dispatch/routing/endpoint' module ActionDispatch module Routing - class Redirect # :nodoc: + class Redirect < Endpoint # :nodoc: attr_reader :status, :block def initialize(status, block) @@ -14,9 +15,13 @@ module ActionDispatch @block = block end + def redirect?; true; end + def call(env) - req = Request.new(env) + serve Request.new env + end + def serve(req) # If any of the path parameters has an invalid encoding then # raise since it's likely to trigger errors further on. req.path_parameters.each do |key, value| diff --git a/actionpack/lib/action_dispatch/routing/route_set.rb b/actionpack/lib/action_dispatch/routing/route_set.rb index 7a565635f5..942a32087c 100644 --- a/actionpack/lib/action_dispatch/routing/route_set.rb +++ b/actionpack/lib/action_dispatch/routing/route_set.rb @@ -8,6 +8,7 @@ require 'active_support/core_ext/module/remove_method' require 'active_support/core_ext/array/extract_options' require 'action_controller/metal/exceptions' require 'action_dispatch/http/request' +require 'action_dispatch/routing/endpoint' module ActionDispatch module Routing @@ -20,14 +21,20 @@ module ActionDispatch PARAMETERS_KEY = 'action_dispatch.request.path_parameters' - class Dispatcher #:nodoc: + class Dispatcher < Routing::Endpoint #:nodoc: def initialize(defaults) @defaults = defaults @controller_class_names = ThreadSafe::Cache.new end + def dispatcher?; true; end + def call(env) - params = env[PARAMETERS_KEY] + serve Request.new env + end + + def serve(req) + params = req.path_parameters # If any of the path parameters has an invalid encoding then # raise since it's likely to trigger errors further on. @@ -46,7 +53,7 @@ module ActionDispatch return [404, {'X-Cascade' => 'pass'}, []] end - dispatch(controller, params[:action], env) + dispatch(controller, params[:action], req.env) end def prepare_params!(params) -- cgit v1.2.3