From b398520c1406824efd12df6bb57996aa9781f876 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jos=C3=A9=20Valim?= <jose.valim@gmail.com>
Date: Tue, 19 Apr 2011 12:25:01 +0200
Subject: Output a redirect to the 500 page if something happens when
 streaming. Currently, we output:

  "><script type="text/javascript">window.location = "/500.html"</script></html>
---
 actionpack/lib/action_view/base.rb                            |  6 ++++++
 .../lib/action_view/renderer/streaming_template_renderer.rb   | 11 ++++++-----
 2 files changed, 12 insertions(+), 5 deletions(-)

(limited to 'actionpack/lib')

diff --git a/actionpack/lib/action_view/base.rb b/actionpack/lib/action_view/base.rb
index 9e8a3c51a3..87501d5b88 100644
--- a/actionpack/lib/action_view/base.rb
+++ b/actionpack/lib/action_view/base.rb
@@ -137,6 +137,12 @@ module ActionView #:nodoc:
     cattr_accessor :field_error_proc
     @@field_error_proc = Proc.new{ |html_tag, instance| "<div class=\"field_with_errors\">#{html_tag}</div>".html_safe }
 
+    # How to complete the streaming when an exception occurs.
+    # This is our best guess: first try to close the attribute, then the tag.
+    # Currently this is private API and may be changed at *any* time.
+    cattr_accessor :streaming_completion_on_exception
+    @@streaming_completion_on_exception = %("><script type="text/javascript">window.location = "/500.html"</script></html>)
+
     class_attribute :helpers
     class_attribute :_routes
 
diff --git a/actionpack/lib/action_view/renderer/streaming_template_renderer.rb b/actionpack/lib/action_view/renderer/streaming_template_renderer.rb
index 52f0e9f5bd..03aab444f8 100644
--- a/actionpack/lib/action_view/renderer/streaming_template_renderer.rb
+++ b/actionpack/lib/action_view/renderer/streaming_template_renderer.rb
@@ -46,11 +46,8 @@ module ActionView
   #
   # == TODO
   #
-  # * Add streaming support in the controllers with no-cache settings
-  # * What should happen when an error happens?
   # * Support streaming from child templates, partials and so on.
-  # * Support on sprockets async JS load?
-  #
+  # * Integrate exceptions with exceptron
   class StreamingTemplateRenderer < TemplateRenderer #:nodoc:
     # A valid Rack::Body (i.e. it responds to each).
     # It is initialized with a block that, when called, starts
@@ -61,7 +58,11 @@ module ActionView
       end
 
       def each(&block)
-        @start.call(block)
+        begin
+          @start.call(block)
+        rescue
+          block.call ActionView::Base.streaming_completion_on_exception
+        end
         self
       end
     end
-- 
cgit v1.2.3