Repository URL to install this package:
Version:
4.0.0.pre.4 ▾
|
# frozen_string_literal: true
require 'net/http'
# Top-level module documentation comment goes here...
module Sinatra
# Module to contain rescuable HTTP status exceptions
module HTTPStatus
class AnyStatus < StandardError
end
# Helpers for HTTP status exceptions
module Helpers
def http_status(code, message = nil)
Sinatra::HTTPStatus[code.to_i].new message
end
end
# Top-level functions
module Functions
def error_handler(klass, template)
error klass do |e|
erb template, locals: { error: e } unless request.xhr? || content_type == mime_type(:json)
end
end
end
module_function
def [](code)
BY_CODE.fetch(code)
end
def constant_definition(name)
return Sinatra::HTTPStatus.const_get(name) if Sinatra::HTTPStatus.const_defined?(name)
Sinatra::HTTPStatus.const_set(name, yield)
end
def status_range_class(name)
constant_definition(name) { Class.new(AnyStatus) }
end
def status_class(name, range_name, code)
range_class = status_range_class(range_name)
constant_definition(name) do
Class.new(range_class) do
define_method(:code) do
warn '[DEPRECATION] `code` is deprecated. Please use `http_status` instead.'
http_status
end
define_method(:http_status) { code.to_i }
end
end
end
mapping = {}
Net::HTTPResponse::CODE_TO_OBJ.each do |code, response|
range = response.superclass
name = response.name.gsub(/^Net::HTTP/, '')
range_name = range.name.gsub(/^Net::HTTP/, '')
mapping[code.to_i] = status_class(name, range_name, code)
end
Sinatra::HTTPStatus.const_set(:BY_CODE, mapping)
end
helpers HTTPStatus::Helpers
register HTTPStatus::Functions
end