From c2511f936e0129cde898e059391aeaca5a3f238b Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Tue, 14 Apr 2009 16:21:06 -0500 Subject: [PATCH] Make dispatcher instances immutable --- .../action_controller/dispatch/dispatcher.rb | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/actionpack/lib/action_controller/dispatch/dispatcher.rb b/actionpack/lib/action_controller/dispatch/dispatcher.rb index 091cc49412f5..bb9d8bd06351 100644 --- a/actionpack/lib/action_controller/dispatch/dispatcher.rb +++ b/actionpack/lib/action_controller/dispatch/dispatcher.rb @@ -66,7 +66,8 @@ def cleanup_application define_callbacks :prepare_dispatch, :before_dispatch, :after_dispatch def initialize - @app = @@middleware.build(lambda { |env| self.dup._call(env) }) + @app = @@middleware.build(lambda { |env| self._call(env) }) + freeze end def call(env) @@ -74,8 +75,18 @@ def call(env) end def _call(env) - @env = env - dispatch + begin + run_callbacks :before_dispatch + Routing::Routes.call(env) + rescue Exception => exception + if controller ||= (::ApplicationController rescue Base) + controller.call_with_exception(env, exception).to_a + else + raise exception + end + ensure + run_callbacks :after_dispatch, :enumerator => :reverse_each + end end def flush_logger