lib/sinatra/show_exceptions.rb in sinatra-2.0.0 vs lib/sinatra/show_exceptions.rb in sinatra-2.0.1.rc1

- old
+ new

@@ -23,32 +23,67 @@ rescue Exception => e errors, env["rack.errors"] = env["rack.errors"], @@eats_errors if prefers_plain_text?(env) content_type = "text/plain" - exception = dump_exception(e) + body = dump_exception(e) else content_type = "text/html" - exception = pretty(env, e) + body = pretty(env, e) end env["rack.errors"] = errors - # Post 893a2c50 in rack/rack, the #pretty method above, implemented in - # Rack::ShowExceptions, returns a String instead of an array. - body = Array(exception) - [ 500, { "Content-Type" => content_type, - "Content-Length" => body.join.bytesize.to_s + "Content-Length" => body.bytesize.to_s }, - body + [body] ] end + # Pulled from Rack::ShowExceptions in order to override TEMPLATE. + # If Rack provides another way to override, this could be removed + # in the future. + def pretty(env, exception) + req = Rack::Request.new(env) + + # This double assignment is to prevent an "unused variable" warning on + # Ruby 1.9.3. Yes, it is dumb, but I don't like Ruby yelling at me. + path = path = (req.script_name + req.path_info).squeeze("/") + + # This double assignment is to prevent an "unused variable" warning on + # Ruby 1.9.3. Yes, it is dumb, but I don't like Ruby yelling at me. + frames = frames = exception.backtrace.map { |line| + frame = OpenStruct.new + if line =~ /(.*?):(\d+)(:in `(.*)')?/ + frame.filename = $1 + frame.lineno = $2.to_i + frame.function = $4 + + begin + lineno = frame.lineno-1 + lines = ::File.readlines(frame.filename) + frame.pre_context_lineno = [lineno-CONTEXT, 0].max + frame.pre_context = lines[frame.pre_context_lineno...lineno] + frame.context_line = lines[lineno].chomp + frame.post_context_lineno = [lineno+CONTEXT, lines.size].min + frame.post_context = lines[lineno+1..frame.post_context_lineno] + rescue + end + + frame + else + nil + end + }.compact + + TEMPLATE.result(binding) + end + private def bad_request?(e) Sinatra::BadRequest === e end @@ -358,8 +393,5 @@ </body> </html> HTML end end - -Rack::ShowExceptions.send :remove_const, "TEMPLATE" -Rack::ShowExceptions.const_set "TEMPLATE", Sinatra::ShowExceptions::TEMPLATE