diff options
author | Santiago Pastorino <santiago@wyeworks.com> | 2015-04-16 15:56:07 -0300 |
---|---|---|
committer | Santiago Pastorino <santiago@wyeworks.com> | 2015-06-11 16:54:10 -0300 |
commit | 3adb5eac3b6d81a0943bebd8dffa25a3b63681eb (patch) | |
tree | 5343cc59c6765d1a0b83a74710a347d376e3d666 /actionpack/lib/action_dispatch | |
parent | 212a099ab022fe617d94f195423432dad5cdb21a (diff) | |
download | rails-3adb5eac3b6d81a0943bebd8dffa25a3b63681eb.tar.gz rails-3adb5eac3b6d81a0943bebd8dffa25a3b63681eb.tar.bz2 rails-3adb5eac3b6d81a0943bebd8dffa25a3b63681eb.zip |
Add ApiPublicException middleware
Diffstat (limited to 'actionpack/lib/action_dispatch')
-rw-r--r-- | actionpack/lib/action_dispatch/middleware/api_public_exceptions.rb | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/actionpack/lib/action_dispatch/middleware/api_public_exceptions.rb b/actionpack/lib/action_dispatch/middleware/api_public_exceptions.rb new file mode 100644 index 0000000000..126842672d --- /dev/null +++ b/actionpack/lib/action_dispatch/middleware/api_public_exceptions.rb @@ -0,0 +1,47 @@ +module ActionDispatch + class ApiPublicExceptions + attr_accessor :public_path + + def initialize(public_path) + @public_path = public_path + end + + def call(env) + exception = env["action_dispatch.exception"] + status = env["PATH_INFO"][1..-1] + request = ActionDispatch::Request.new(env) + content_type = request.formats.first + body = { :status => status, :error => exception.message } + + render(status, content_type, body) + end + + private + + def render(status, content_type, body) + format = content_type && "to_#{content_type.to_sym}" + if format && body.respond_to?(format) + render_format(status, content_type, body.public_send(format)) + else + render_html(status) + end + end + + def render_format(status, content_type, body) + [status, {'Content-Type' => "#{content_type}; charset=#{ActionDispatch::Response.default_charset}", + 'Content-Length' => body.bytesize.to_s}, [body]] + end + + def render_html(status) + found = false + path = "#{public_path}/#{status}.#{I18n.locale}.html" if I18n.locale + path = "#{public_path}/#{status}.html" unless path && (found = File.exist?(path)) + + if found || File.exist?(path) + render_format(status, 'text/html', File.read(path)) + else + [404, { "X-Cascade" => "pass" }, []] + end + end + end +end |