kemal/src/kemal/config.cr

134 lines
3.4 KiB
Crystal
Raw Normal View History

2015-10-23 18:33:26 +00:00
module Kemal
2016-07-17 11:26:22 +00:00
# Kemal::Config stores all the configuration options for a Kemal application.
# It's a singleton and you can access it like.
#
# Kemal.config
#
2014-07-30 22:17:53 +00:00
class Config
2016-05-05 19:35:36 +00:00
INSTANCE = Config.new
HANDLERS = [] of HTTP::Handler
2016-11-16 17:27:01 +00:00
ERROR_HANDLERS = {} of Int32 => HTTP::Server::Context, Exception -> String
{% if flag?(:without_openssl) %}
@ssl : Bool?
{% else %}
2016-06-14 21:18:00 +00:00
@ssl : OpenSSL::SSL::Context::Server?
{% end %}
2016-04-09 14:20:39 +00:00
2016-12-08 10:50:54 +00:00
property host_binding, ssl, port, env, public_folder, logging, running,
always_rescue, serve_static : (Bool | Hash(String, Bool)), server, extra_options,
shutdown_message
2017-05-12 23:18:50 +00:00
getter custom_handler_position
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"
@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
@server = uninitialized HTTP::Server
@router_included = false
@custom_handler_position = 4
@default_handlers_setup = false
2016-12-08 10:50:54 +00:00
@running = false
@shutdown_message = true
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
def clear
@router_included = false
@custom_handler_position = 4
@default_handlers_setup = false
HANDLERS.clear
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
HANDLERS.replace(handlers)
2017-05-12 23:18:50 +00:00
end
def add_handler(handler : HTTP::Handler | HTTP::WebSocketHandler, position = Kemal.config.custom_handler_position)
setup
2017-05-12 23:18:50 +00:00
HANDLERS.insert position, handler
@custom_handler_position = @custom_handler_position + 1
end
def add_filter_handler(handler : HTTP::Handler)
HANDLERS.insert HANDLERS.size - 1, 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
2016-11-16 17:27:01 +00:00
def add_error_handler(status_code, &handler : HTTP::Server::Context, Exception -> _)
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
def extra_options(&@extra_options : OptionParser ->)
end
2016-02-15 07:01:41 +00:00
def setup
unless @default_handlers_setup && @router_included
setup_init_handler
setup_log_handler
setup_error_handler
setup_static_file_handler
@default_handlers_setup = true
@router_included = true
HANDLERS.insert(HANDLERS.size, Kemal::RouteHandler::INSTANCE)
end
2016-02-15 07:01:41 +00:00
end
private def setup_init_handler
HANDLERS.insert(0, Kemal::InitHandler::INSTANCE)
end
private def setup_log_handler
@logger ||= if @logging
Kemal::CommonLogHandler.new
2016-04-16 21:04:53 +00:00
else
Kemal::NullLogHandler.new
2016-04-16 21:04:53 +00:00
end
HANDLERS.insert(1, @logger.not_nil!)
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
2016-04-12 17:00:37 +00:00
@error_handler ||= Kemal::CommonExceptionHandler.new
HANDLERS.insert(2, @error_handler.not_nil!)
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
HANDLERS.insert(3, Kemal::StaticFileHandler.new(@public_folder)) if @serve_static.is_a?(Hash)
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