File tree Expand file tree Collapse file tree 3 files changed +34
-2
lines changed
lib/action_dispatch/middleware Expand file tree Collapse file tree 3 files changed +34
-2
lines changed Original file line number Diff line number Diff line change @@ -14,6 +14,9 @@ def call(env)
14
14
state = @executor . run! ( reset : true )
15
15
begin
16
16
response = @app . call ( env )
17
+ if rendered_error = env [ "action_dispatch.exception" ]
18
+ @executor . error_reporter . report ( rendered_error , handled : false , source : "application.action_dispatch" )
19
+ end
17
20
returned = response << ::Rack ::BodyProxy . new ( response . pop ) { state . complete! }
18
21
rescue => error
19
22
@executor . error_reporter . report ( error , handled : false , source : "application.action_dispatch" )
Original file line number Diff line number Diff line change @@ -34,8 +34,10 @@ def call(env)
34
34
request = ActionDispatch ::Request . new env
35
35
backtrace_cleaner = request . get_header ( "action_dispatch.backtrace_cleaner" )
36
36
wrapper = ExceptionWrapper . new ( backtrace_cleaner , exception )
37
+ request . set_header "action_dispatch.exception" , wrapper . unwrapped_exception
38
+
37
39
if wrapper . show? ( request )
38
- render_exception ( request , wrapper )
40
+ render_exception ( request . dup , wrapper )
39
41
else
40
42
raise exception
41
43
end
@@ -44,7 +46,6 @@ def call(env)
44
46
private
45
47
def render_exception ( request , wrapper )
46
48
status = wrapper . status_code
47
- request . set_header "action_dispatch.exception" , wrapper . unwrapped_exception
48
49
request . set_header "action_dispatch.original_path" , request . path_info
49
50
request . set_header "action_dispatch.original_request_method" , request . raw_request_method
50
51
fallback_to_html_format_if_invalid_mime_type ( request )
Original file line number Diff line number Diff line change @@ -119,6 +119,34 @@ def test_body_abandoned
119
119
assert_equal requests_count - 1 , completed
120
120
end
121
121
122
+ def test_error_reporting
123
+ raised_error = nil
124
+ error_report = assert_error_reported do
125
+ raised_error = assert_raises TypeError do
126
+ call_and_return_body { 1 + "1" }
127
+ end
128
+ end
129
+ assert_same raised_error , error_report . error
130
+ end
131
+
132
+ def test_error_reporting_with_show_exception
133
+ middleware = Rack ::Lint . new (
134
+ ActionDispatch ::Executor . new (
135
+ ActionDispatch ::ShowExceptions . new (
136
+ Rack ::Lint . new ( -> ( _env ) { 1 + "1" } ) ,
137
+ -> ( _env ) { [ 500 , { } , [ "Oops" ] ] } ,
138
+ ) ,
139
+ executor ,
140
+ )
141
+ )
142
+
143
+ env = Rack ::MockRequest . env_for ( "" , { } )
144
+ error_report = assert_error_reported do
145
+ middleware . call ( env )
146
+ end
147
+ assert_instance_of TypeError , error_report . error
148
+ end
149
+
122
150
private
123
151
def call_and_return_body ( &block )
124
152
app = block || proc { [ 200 , { } , [ ] ] }
You can’t perform that action at this time.
0 commit comments