aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_dispatch
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2014-05-27 12:10:24 -0700
committerAaron Patterson <aaron.patterson@gmail.com>2014-05-27 12:10:24 -0700
commit402c2af55053c2f29319091ad21fd6fa6b90ee89 (patch)
tree4d365fa98f86a16d3325cec19a9547d626184e6a /actionpack/lib/action_dispatch
parent40514aa23a6e74b576f6d2e4983bb71e0cc893b0 (diff)
downloadrails-402c2af55053c2f29319091ad21fd6fa6b90ee89.tar.gz
rails-402c2af55053c2f29319091ad21fd6fa6b90ee89.tar.bz2
rails-402c2af55053c2f29319091ad21fd6fa6b90ee89.zip
give all endpoints a superclass
Diffstat (limited to 'actionpack/lib/action_dispatch')
-rw-r--r--actionpack/lib/action_dispatch/routing/endpoint.rb10
-rw-r--r--actionpack/lib/action_dispatch/routing/mapper.rb30
-rw-r--r--actionpack/lib/action_dispatch/routing/redirection.rb9
-rw-r--r--actionpack/lib/action_dispatch/routing/route_set.rb13
4 files changed, 40 insertions, 22 deletions
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)