aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_dispatch/middleware
diff options
context:
space:
mode:
authorSantiago Pastorino <santiago@wyeworks.com>2015-04-16 15:56:07 -0300
committerSantiago Pastorino <santiago@wyeworks.com>2015-06-11 16:54:10 -0300
commit3adb5eac3b6d81a0943bebd8dffa25a3b63681eb (patch)
tree5343cc59c6765d1a0b83a74710a347d376e3d666 /actionpack/lib/action_dispatch/middleware
parent212a099ab022fe617d94f195423432dad5cdb21a (diff)
downloadrails-3adb5eac3b6d81a0943bebd8dffa25a3b63681eb.tar.gz
rails-3adb5eac3b6d81a0943bebd8dffa25a3b63681eb.tar.bz2
rails-3adb5eac3b6d81a0943bebd8dffa25a3b63681eb.zip
Add ApiPublicException middleware
Diffstat (limited to 'actionpack/lib/action_dispatch/middleware')
-rw-r--r--actionpack/lib/action_dispatch/middleware/api_public_exceptions.rb47
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