aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib
diff options
context:
space:
mode:
authorJorge Bejar <jorge@wyeworks.com>2015-07-07 12:43:49 -0300
committerJorge Bejar <jorge@wyeworks.com>2015-12-09 10:53:44 -0300
commit05d89410bf97d0778e78558db3c9fed275f8a614 (patch)
tree4b05cd946830dea9aed72f4afb8bb610b69e048b /actionpack/lib
parentf43c05bff74df90f6b8ff90f92ad9f6d7652bd09 (diff)
downloadrails-05d89410bf97d0778e78558db3c9fed275f8a614.tar.gz
rails-05d89410bf97d0778e78558db3c9fed275f8a614.tar.bz2
rails-05d89410bf97d0778e78558db3c9fed275f8a614.zip
Fix some edge cases in AD::DebugExceptions in rails api apps
Diffstat (limited to 'actionpack/lib')
-rw-r--r--actionpack/lib/action_dispatch/middleware/debug_exceptions.rb105
1 files changed, 64 insertions, 41 deletions
diff --git a/actionpack/lib/action_dispatch/middleware/debug_exceptions.rb b/actionpack/lib/action_dispatch/middleware/debug_exceptions.rb
index 972410d806..c81f52ec88 100644
--- a/actionpack/lib/action_dispatch/middleware/debug_exceptions.rb
+++ b/actionpack/lib/action_dispatch/middleware/debug_exceptions.rb
@@ -67,55 +67,78 @@ module ActionDispatch
log_error(request, wrapper)
if request.get_header('action_dispatch.show_detailed_exceptions')
- traces = wrapper.traces
-
- trace_to_show = 'Application Trace'
- if traces[trace_to_show].empty? && wrapper.rescue_template != 'routing_error'
- trace_to_show = 'Full Trace'
- end
-
- if source_to_show = traces[trace_to_show].first
- source_to_show_id = source_to_show[:id]
- end
-
- template = DebugView.new([RESCUES_TEMPLATE_PATH],
- request: request,
- exception: wrapper.exception,
- traces: traces,
- show_source_idx: source_to_show_id,
- trace_to_show: trace_to_show,
- routes_inspector: routes_inspector(exception),
- source_extracts: wrapper.source_extracts,
- line_number: wrapper.line_number,
- file: wrapper.file
- )
- file = "rescues/#{wrapper.rescue_template}"
-
if @api_only
- body = {
- :status => wrapper.status_code,
- :error => Rack::Utils::HTTP_STATUS_CODES.fetch(wrapper.status_code, Rack::Utils::HTTP_STATUS_CODES[500]),
- :exception => wrapper.exception.inspect,
- :traces => traces
- }
- if content_type = request.formats.first
- to_format = "to_#{content_type.to_sym}"
- body = body.public_send(to_format)
- end
- format = "application/json"
- elsif request.xhr?
- body = template.render(template: file, layout: false, formats: [:text])
- format = "text/plain"
+ render_for_api_application(request, wrapper)
else
- body = template.render(template: file, layout: 'rescues/layout')
- format = "text/html"
+ render_for_non_api_application(request, wrapper)
end
- render(wrapper.status_code, body, format)
else
raise exception
end
end
+ def render_for_non_api_application(request, wrapper)
+ template = create_template(request, wrapper)
+
+ file = "rescues/#{wrapper.rescue_template}"
+
+ if request.xhr?
+ body = template.render(template: file, layout: false, formats: [:text])
+ format = "text/plain"
+ else
+ body = template.render(template: file, layout: 'rescues/layout')
+ format = "text/html"
+ end
+ render(wrapper.status_code, body, format)
+ end
+
+ def render_for_api_application(request, wrapper)
+ body = {
+ :status => wrapper.status_code,
+ :error => Rack::Utils::HTTP_STATUS_CODES.fetch(wrapper.status_code, Rack::Utils::HTTP_STATUS_CODES[500]),
+ :exception => wrapper.exception.inspect,
+ :traces => wrapper.traces
+ }
+
+ content_type = request.formats.first
+ to_format = "to_#{content_type.to_sym}"
+
+ if content_type && body.respond_to?(to_format)
+ body = body.public_send(to_format)
+ format = content_type
+ else
+ body = body.to_json
+ format = Mime::JSON
+ end
+
+ render(wrapper.status_code, body, format)
+ end
+
+ def create_template(request, wrapper)
+ traces = wrapper.traces
+
+ trace_to_show = 'Application Trace'
+ if traces[trace_to_show].empty? && wrapper.rescue_template != 'routing_error'
+ trace_to_show = 'Full Trace'
+ end
+
+ if source_to_show = traces[trace_to_show].first
+ source_to_show_id = source_to_show[:id]
+ end
+
+ DebugView.new([RESCUES_TEMPLATE_PATH],
+ request: request,
+ exception: wrapper.exception,
+ traces: traces,
+ show_source_idx: source_to_show_id,
+ trace_to_show: trace_to_show,
+ routes_inspector: routes_inspector(wrapper.exception),
+ source_extracts: wrapper.source_extracts,
+ line_number: wrapper.line_number,
+ file: wrapper.file
+ )
+ end
+
def render(status, body, format)
[status, {'Content-Type' => "#{format}; charset=#{Response.default_charset}", 'Content-Length' => body.bytesize.to_s}, [body]]
end