2015-10-23 18:33:26 +00:00
|
|
|
module Kemal
|
2018-07-16 02:55:53 +00:00
|
|
|
VERSION = {{ `shards version #{__DIR__}`.chomp.stringify }}
|
|
|
|
|
2017-10-06 11:53:53 +00:00
|
|
|
# Stores all the configuration options for a Kemal application.
|
2016-07-17 11:26:22 +00:00
|
|
|
# It's a singleton and you can access it like.
|
|
|
|
#
|
2017-10-06 11:53:53 +00:00
|
|
|
# ```
|
|
|
|
# Kemal.config
|
|
|
|
# ```
|
2014-07-30 22:17:53 +00:00
|
|
|
class Config
|
2017-10-06 11:59:53 +00:00
|
|
|
INSTANCE = Config.new
|
|
|
|
HANDLERS = [] of HTTP::Handler
|
|
|
|
CUSTOM_HANDLERS = [] of Tuple(Nil | Int32, HTTP::Handler)
|
|
|
|
FILTER_HANDLERS = [] of HTTP::Handler
|
|
|
|
ERROR_HANDLERS = {} of Int32 => HTTP::Server::Context, Exception -> String
|
2017-09-06 20:58:55 +00:00
|
|
|
|
2016-09-16 14:30:36 +00:00
|
|
|
{% if flag?(:without_openssl) %}
|
2017-10-06 11:53:53 +00:00
|
|
|
@ssl : Bool?
|
2016-09-16 14:30:36 +00:00
|
|
|
{% else %}
|
2017-10-06 11:53:53 +00:00
|
|
|
@ssl : OpenSSL::SSL::Context::Server?
|
2016-09-16 14:30:36 +00:00
|
|
|
{% end %}
|
2016-04-09 14:20:39 +00:00
|
|
|
|
2017-09-06 20:58:55 +00:00
|
|
|
property host_binding, ssl, port, env, public_folder, logging, running
|
2017-10-04 16:42:41 +00:00
|
|
|
property always_rescue, server : HTTP::Server?, extra_options, shutdown_message
|
2017-09-06 20:58:55 +00:00
|
|
|
property serve_static : (Bool | Hash(String, Bool))
|
2018-06-16 15:03:00 +00:00
|
|
|
property static_headers : (HTTP::Server::Response, String, File::Info -> Void)?
|
2018-05-09 07:19:59 +00:00
|
|
|
property powered_by_header : Bool = true
|
2014-07-30 22:17:53 +00:00
|
|
|
|
|
|
|
def initialize
|
2016-02-15 07:01:41 +00:00
|
|
|
@host_binding = "0.0.0.0"
|
2014-07-30 22:17:53 +00:00
|
|
|
@port = 3000
|
2016-02-15 07:01:41 +00:00
|
|
|
@env = "development"
|
2016-09-15 20:45:54 +00:00
|
|
|
@serve_static = {"dir_listing" => false, "gzip" => true}
|
2015-12-12 18:27:46 +00:00
|
|
|
@public_folder = "./public"
|
2016-01-17 11:08:12 +00:00
|
|
|
@logging = true
|
2016-02-12 12:11:21 +00:00
|
|
|
@logger = nil
|
2016-02-14 10:43:25 +00:00
|
|
|
@error_handler = nil
|
|
|
|
@always_rescue = true
|
2016-10-28 08:35:34 +00:00
|
|
|
@router_included = false
|
|
|
|
@default_handlers_setup = false
|
2016-12-08 10:50:54 +00:00
|
|
|
@running = false
|
2017-01-18 12:55:33 +00:00
|
|
|
@shutdown_message = true
|
2017-07-11 08:22:35 +00:00
|
|
|
@handler_position = 0
|
2014-07-30 22:17:53 +00:00
|
|
|
end
|
|
|
|
|
2016-02-12 12:11:21 +00:00
|
|
|
def logger
|
|
|
|
@logger.not_nil!
|
2014-07-30 22:17:53 +00:00
|
|
|
end
|
2015-11-12 20:48:22 +00:00
|
|
|
|
2016-02-12 12:11:21 +00:00
|
|
|
def logger=(logger : Kemal::BaseLogHandler)
|
|
|
|
@logger = logger
|
2015-11-12 20:48:22 +00:00
|
|
|
end
|
|
|
|
|
2016-02-12 12:11:21 +00:00
|
|
|
def scheme
|
|
|
|
ssl ? "https" : "http"
|
2016-01-17 12:17:27 +00:00
|
|
|
end
|
|
|
|
|
2016-10-28 08:35:34 +00:00
|
|
|
def clear
|
2018-06-18 12:07:54 +00:00
|
|
|
@powered_by_header = true
|
2016-10-28 08:35:34 +00:00
|
|
|
@router_included = false
|
2017-07-11 08:22:35 +00:00
|
|
|
@handler_position = 0
|
2016-10-28 08:35:34 +00:00
|
|
|
@default_handlers_setup = false
|
|
|
|
HANDLERS.clear
|
2017-07-11 08:22:35 +00:00
|
|
|
CUSTOM_HANDLERS.clear
|
|
|
|
FILTER_HANDLERS.clear
|
|
|
|
ERROR_HANDLERS.clear
|
2016-10-28 08:35:34 +00:00
|
|
|
end
|
|
|
|
|
2016-02-12 12:11:21 +00:00
|
|
|
def handlers
|
|
|
|
HANDLERS
|
2016-01-17 12:17:27 +00:00
|
|
|
end
|
|
|
|
|
2017-05-12 23:18:50 +00:00
|
|
|
def handlers=(handlers : Array(HTTP::Handler))
|
|
|
|
clear
|
2017-05-13 16:16:59 +00:00
|
|
|
HANDLERS.replace(handlers)
|
2017-05-12 23:18:50 +00:00
|
|
|
end
|
|
|
|
|
2017-07-11 08:22:35 +00:00
|
|
|
def add_handler(handler : HTTP::Handler)
|
|
|
|
CUSTOM_HANDLERS << {nil, handler}
|
|
|
|
end
|
|
|
|
|
|
|
|
def add_handler(handler : HTTP::Handler, position : Int32)
|
|
|
|
CUSTOM_HANDLERS << {position, handler}
|
|
|
|
end
|
|
|
|
|
2016-10-28 08:35:34 +00:00
|
|
|
def add_filter_handler(handler : HTTP::Handler)
|
2017-07-11 08:22:35 +00:00
|
|
|
FILTER_HANDLERS << handler
|
2015-11-12 20:48:22 +00:00
|
|
|
end
|
2015-12-12 18:27:46 +00:00
|
|
|
|
2016-05-05 19:35:36 +00:00
|
|
|
def error_handlers
|
|
|
|
ERROR_HANDLERS
|
|
|
|
end
|
|
|
|
|
2017-08-24 20:32:43 +00:00
|
|
|
def add_error_handler(status_code : Int32, &handler : HTTP::Server::Context, Exception -> _)
|
2016-11-16 17:27:01 +00:00
|
|
|
ERROR_HANDLERS[status_code] = ->(context : HTTP::Server::Context, error : Exception) { handler.call(context, error).to_s }
|
2016-05-05 19:35:36 +00:00
|
|
|
end
|
|
|
|
|
2016-07-17 15:11:26 +00:00
|
|
|
def extra_options(&@extra_options : OptionParser ->)
|
|
|
|
end
|
|
|
|
|
2016-02-15 07:01:41 +00:00
|
|
|
def setup
|
2016-10-28 08:35:34 +00:00
|
|
|
unless @default_handlers_setup && @router_included
|
|
|
|
setup_init_handler
|
|
|
|
setup_log_handler
|
|
|
|
setup_error_handler
|
|
|
|
setup_static_file_handler
|
2017-07-11 08:22:35 +00:00
|
|
|
setup_custom_handlers
|
|
|
|
setup_filter_handlers
|
2016-10-28 08:35:34 +00:00
|
|
|
@default_handlers_setup = true
|
|
|
|
@router_included = true
|
2017-09-10 11:41:07 +00:00
|
|
|
HANDLERS.insert(HANDLERS.size, Kemal::WebSocketHandler::INSTANCE)
|
2016-10-28 08:35:34 +00:00
|
|
|
HANDLERS.insert(HANDLERS.size, Kemal::RouteHandler::INSTANCE)
|
|
|
|
end
|
2016-02-15 07:01:41 +00:00
|
|
|
end
|
|
|
|
|
2016-07-17 15:11:26 +00:00
|
|
|
private def setup_init_handler
|
2017-07-11 08:22:35 +00:00
|
|
|
HANDLERS.insert(@handler_position, Kemal::InitHandler::INSTANCE)
|
|
|
|
@handler_position += 1
|
2016-07-17 15:11:26 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
private def setup_log_handler
|
2016-04-11 14:54:59 +00:00
|
|
|
@logger ||= if @logging
|
2017-10-06 17:34:18 +00:00
|
|
|
Kemal::LogHandler.new
|
2016-04-16 21:04:53 +00:00
|
|
|
else
|
2016-07-05 19:14:00 +00:00
|
|
|
Kemal::NullLogHandler.new
|
2016-04-16 21:04:53 +00:00
|
|
|
end
|
2017-07-11 08:22:35 +00:00
|
|
|
HANDLERS.insert(@handler_position, @logger.not_nil!)
|
|
|
|
@handler_position += 1
|
2016-07-04 17:23:16 +00:00
|
|
|
end
|
|
|
|
|
2016-02-15 07:01:41 +00:00
|
|
|
private def setup_error_handler
|
2016-02-14 10:43:25 +00:00
|
|
|
if @always_rescue
|
2017-10-06 17:34:18 +00:00
|
|
|
@error_handler ||= Kemal::ExceptionHandler.new
|
2017-07-11 08:22:35 +00:00
|
|
|
HANDLERS.insert(@handler_position, @error_handler.not_nil!)
|
|
|
|
@handler_position += 1
|
2016-02-14 10:43:25 +00:00
|
|
|
end
|
|
|
|
end
|
2016-02-15 07:01:41 +00:00
|
|
|
|
2016-05-03 18:11:35 +00:00
|
|
|
private def setup_static_file_handler
|
2017-07-11 08:22:35 +00:00
|
|
|
if @serve_static.is_a?(Hash)
|
|
|
|
HANDLERS.insert(@handler_position, Kemal::StaticFileHandler.new(@public_folder))
|
|
|
|
@handler_position += 1
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
private def setup_custom_handlers
|
2018-11-01 11:29:05 +00:00
|
|
|
CUSTOM_HANDLERS.each do |ch0, ch1|
|
|
|
|
position = ch0
|
|
|
|
HANDLERS.insert (position || @handler_position), ch1
|
|
|
|
@handler_position += 1
|
2017-07-11 08:22:35 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
private def setup_filter_handlers
|
|
|
|
FILTER_HANDLERS.each do |h|
|
|
|
|
HANDLERS.insert(@handler_position, h)
|
|
|
|
end
|
2016-02-15 07:01:41 +00:00
|
|
|
end
|
2014-07-30 22:17:53 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def self.config
|
|
|
|
yield Config::INSTANCE
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.config
|
|
|
|
Config::INSTANCE
|
|
|
|
end
|
|
|
|
end
|