From ebab4fa09b79c0672f4751b6752d97431959a3ba Mon Sep 17 00:00:00 2001 From: "Rico Sta. Cruz" Date: Fri, 18 Jan 2013 07:25:06 +0800 Subject: [PATCH] Serve the text-only page for non-graphical browsers. See #79. --- lib/better_errors/middleware.rb | 24 ++++++++++++++++++------ spec/better_errors/middleware_spec.rb | 15 ++++++++++++++- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/lib/better_errors/middleware.rb b/lib/better_errors/middleware.rb index f84f7015..1bba6402 100644 --- a/lib/better_errors/middleware.rb +++ b/lib/better_errors/middleware.rb @@ -74,18 +74,25 @@ def protected_app_call(env) log_exception show_error_page(env) end - + def show_error_page(env) - content = if @error_page - @error_page.render + type, content = if @error_page + if text?(env) + [ 'plain', @error_page.render('text') ] + else + [ 'html', @error_page.render ] + end else - "

No errors

No errors have been recorded yet.


" + - "Better Errors v#{BetterErrors::VERSION}" + [ 'html', no_errors_page ] end - [500, { "Content-Type" => "text/html; charset=utf-8" }, [content]] + [500, { "Content-Type" => "text/#{type}; charset=utf-8" }, [content]] end + def text?(env) + env["HTTP_X_REQUESTED_WITH"] == "XMLHttpRequest" || + !env["HTTP_ACCEPT"].to_s.include?('html') + end def log_exception return unless BetterErrors.logger @@ -106,5 +113,10 @@ def internal_call(env, opts) response = @error_page.send("do_#{opts[:method]}", JSON.parse(env["rack.input"].read)) [200, { "Content-Type" => "text/plain; charset=utf-8" }, [JSON.dump(response)]] end + + def no_errors_page + "

No errors

No errors have been recorded yet.


" + + "Better Errors v#{BetterErrors::VERSION}" + end end end diff --git a/spec/better_errors/middleware_spec.rb b/spec/better_errors/middleware_spec.rb index e538442f..c8106fdb 100644 --- a/spec/better_errors/middleware_spec.rb +++ b/spec/better_errors/middleware_spec.rb @@ -44,7 +44,20 @@ module BetterErrors it "should return UTF-8 error pages" do status, headers, body = app.call({}) - headers["Content-Type"].should == "text/html; charset=utf-8" + headers["Content-Type"].should match /charset=utf-8/ + end + + it "should return text pages by default" do + status, headers, body = app.call({}) + + headers["Content-Type"].should match /text\/plain/ + end + + it "should return HTML pages by default" do + # Chrome's 'Accept' header looks similar this. + status, headers, body = app.call("HTTP_ACCEPT" => "text/html,application/xhtml+xml;q=0.9,*/*") + + headers["Content-Type"].should match /text\/html/ end it "should log the exception" do