class Rack::ShowStatus

Rack::ShowStatus catches all empty responses and replaces them with a site explaining the error.

Additional details can be put into rack.showstatus.detail and will be shown as HTML. If such details exist, the error page is always rendered, even if the reply was not empty.

Public Class Methods

new(app) click to toggle source
# File lib/rack/show_status.rb, line 13
def initialize(app)
  @app = app
  @template = ERB.new(TEMPLATE)
end

Public Instance Methods

call(env) click to toggle source
# File lib/rack/show_status.rb, line 18
def call(env)
  status, headers, body = @app.call(env)
  headers = Utils::HeaderHash[headers]
  empty = headers[CONTENT_LENGTH].to_i <= 0

  # client or server error, or explicit message
  if (status.to_i >= 400 && empty) || env[RACK_SHOWSTATUS_DETAIL]
    # This double assignment is to prevent an "unused variable" warning.
    # Yes, it is dumb, but I don't like Ruby yelling at me.
    req = req = Rack::Request.new(env)

    message = Rack::Utils::HTTP_STATUS_CODES[status.to_i] || status.to_s

    # This double assignment is to prevent an "unused variable" warning.
    # Yes, it is dumb, but I don't like Ruby yelling at me.
    detail = detail = env[RACK_SHOWSTATUS_DETAIL] || message

    body = @template.result(binding)
    size = body.bytesize
    [status, headers.merge(CONTENT_TYPE => "text/html", CONTENT_LENGTH => size.to_s), [body]]
  else
    [status, headers, body]
  end
end