diff options
-rw-r--r-- | actionpack/CHANGELOG.md | 7 | ||||
-rw-r--r-- | actionpack/lib/action_controller/metal/live.rb | 2 | ||||
-rw-r--r-- | actionpack/test/controller/live_stream_test.rb | 18 |
3 files changed, 27 insertions, 0 deletions
diff --git a/actionpack/CHANGELOG.md b/actionpack/CHANGELOG.md index 342f670e78..35b0a419d3 100644 --- a/actionpack/CHANGELOG.md +++ b/actionpack/CHANGELOG.md @@ -1,3 +1,10 @@ +* Set stream status to 500 (or 400 on BadRequest) when an error is thrown + before commiting. + + Fixes #12552. + + *Kevin Casey* + * Add new config option `config.action_dispatch.cookies_serializer` for specifying a serializer for the signed and encrypted cookie jars. diff --git a/actionpack/lib/action_controller/metal/live.rb b/actionpack/lib/action_controller/metal/live.rb index 33014b97ca..fdf4ef293d 100644 --- a/actionpack/lib/action_controller/metal/live.rb +++ b/actionpack/lib/action_controller/metal/live.rb @@ -205,6 +205,8 @@ module ActionController begin super(name) rescue => e + @_response.status = 500 unless @_response.committed? + @_response.status = 400 if e.class == ActionController::BadRequest begin @_response.stream.write(ActionView::Base.streaming_completion_on_exception) if request.format == :html @_response.stream.call_on_error diff --git a/actionpack/test/controller/live_stream_test.rb b/actionpack/test/controller/live_stream_test.rb index 0a431270b5..fb6a750089 100644 --- a/actionpack/test/controller/live_stream_test.rb +++ b/actionpack/test/controller/live_stream_test.rb @@ -156,6 +156,14 @@ module ActionController raise 'An exception occurred...' end + def exception_in_controller + raise 'Exception in controller' + end + + def bad_request_error + raise ActionController::BadRequest + end + def exception_in_exception_callback response.headers['Content-Type'] = 'text/event-stream' response.stream.on_error do @@ -275,6 +283,16 @@ module ActionController end end + def test_exception_in_controller_before_streaming + response = get :exception_in_controller, format: 'text/event-stream' + assert_equal 500, response.status + end + + def test_bad_request_in_controller_before_streaming + response = get :bad_request_error, format: 'text/event-stream' + assert_equal 400, response.status + end + def test_exceptions_raised_handling_exceptions capture_log_output do |output| get :exception_in_exception_callback, format: 'text/event-stream' |