mirror of
https://gitea.invidious.io/iv-org/shard-kemal.git
synced 2024-08-15 00:53:36 +00:00
Extract default app behavior from Kemal::Base to Kemal::Application
This commit is contained in:
parent
1cd329b92f
commit
f5c80c7b67
5 changed files with 87 additions and 41 deletions
|
@ -27,11 +27,18 @@ describe "Config" do
|
||||||
config.host_binding.should eq "127.0.0.1"
|
config.host_binding.should eq "127.0.0.1"
|
||||||
end
|
end
|
||||||
|
|
||||||
it "adds a custom handler" do
|
it "adds a custom handler to Base" do
|
||||||
application = Kemal::Base.new
|
application = Kemal::Base.new
|
||||||
application.add_handler CustomTestHandler.new
|
application.add_handler CustomTestHandler.new
|
||||||
application.setup
|
application.setup
|
||||||
application.handlers.size.should eq(8)
|
application.handlers.size.should eq 6
|
||||||
|
end
|
||||||
|
|
||||||
|
it "adds a custom handler to Application" do
|
||||||
|
application = Kemal::Application.new
|
||||||
|
application.add_handler CustomTestHandler.new
|
||||||
|
application.setup
|
||||||
|
application.handlers.size.should eq 9
|
||||||
end
|
end
|
||||||
|
|
||||||
it "toggles the shutdown message" do
|
it "toggles the shutdown message" do
|
||||||
|
|
37
src/kemal/application.cr
Normal file
37
src/kemal/application.cr
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
class Kemal::Application < Kemal::Base
|
||||||
|
def initialize(config = Config.default)
|
||||||
|
super config
|
||||||
|
add_filter_handler(filter_handler)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Overload of self.run with the default startup logging
|
||||||
|
def run(port = nil)
|
||||||
|
run port do
|
||||||
|
log "[#{config.env}] Kemal is ready to lead at #{config.scheme}://#{config.host_binding}:#{port || config.port}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private def prepare_for_server_start
|
||||||
|
super
|
||||||
|
|
||||||
|
unless error_handlers.has_key?(404)
|
||||||
|
error 404 do |env|
|
||||||
|
render_404
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Test environment doesn't need to have signal trap, built-in images, and logging.
|
||||||
|
unless @config.env == "test"
|
||||||
|
# This route serves the built-in images for not_found and exceptions.
|
||||||
|
get "/__kemal__/:image" do |env|
|
||||||
|
image = env.params.url["image"]
|
||||||
|
file_path = File.expand_path("lib/kemal/images/#{image}", Dir.current)
|
||||||
|
if File.exists? file_path
|
||||||
|
send_file env, file_path
|
||||||
|
else
|
||||||
|
halt env, 404
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -30,7 +30,7 @@ class Kemal::Base
|
||||||
property! server : HTTP::Server
|
property! server : HTTP::Server
|
||||||
property? running = false
|
property? running = false
|
||||||
|
|
||||||
def initialize(@config = Config.new)
|
def initialize(@config = Config.base)
|
||||||
@logger = if @config.logging?
|
@logger = if @config.logging?
|
||||||
Kemal::LogHandler.new
|
Kemal::LogHandler.new
|
||||||
else
|
else
|
||||||
|
@ -161,61 +161,47 @@ class Kemal::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
# Overload of self.run with the default startup logging
|
# Overload of self.run with the default startup logging
|
||||||
def run(port = nil)
|
def run(port : Int32? = nil)
|
||||||
run port do
|
run port do
|
||||||
log "[#{config.env}] Kemal is ready to lead at #{config.scheme}://#{config.host_binding}:#{config.port}"
|
log "[#{config.env}] Kemal is ready to lead at #{config.scheme}://#{config.host_binding}:#{config.port}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Overload of self.run to allow just a block
|
|
||||||
def run(&block)
|
|
||||||
run nil, &block
|
|
||||||
end
|
|
||||||
|
|
||||||
# The command to run a `Kemal` application.
|
# The command to run a `Kemal` application.
|
||||||
# The port can be given to `#run` but is optional.
|
# The port can be given to `#run` but is optional.
|
||||||
# If not given Kemal will use `Kemal::Config#port`
|
# If not given Kemal will use `Kemal::Config#port`
|
||||||
def run(port = nil, &block)
|
def run(port : Int32? = nil)
|
||||||
@config.port = port if port
|
|
||||||
|
|
||||||
setup
|
setup
|
||||||
|
|
||||||
@server = server = HTTP::Server.new(@config.host_binding, @config.port, @handlers)
|
prepare_for_server_start
|
||||||
|
|
||||||
|
start_server(port) do
|
||||||
|
yield self
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private def prepare_for_server_start
|
||||||
|
unless @config.env == "test"
|
||||||
|
Signal::INT.trap do
|
||||||
|
log "Kemal is going to take a rest!" if @config.shutdown_message?
|
||||||
|
stop if running?
|
||||||
|
exit
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private def start_server(port)
|
||||||
|
@server = server = HTTP::Server.new(@config.host_binding, port || @config.port, @handlers)
|
||||||
{% if !flag?(:without_openssl) %}
|
{% if !flag?(:without_openssl) %}
|
||||||
server.tls = config.ssl
|
server.tls = config.ssl
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
unless error_handlers.has_key?(404)
|
server.bind
|
||||||
error 404 do |env|
|
|
||||||
render_404
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Test environment doesn't need to have signal trap, built-in images, and logging.
|
|
||||||
unless config.env == "test"
|
|
||||||
Signal::INT.trap do
|
|
||||||
log "Kemal is going to take a rest!" if config.shutdown_message?
|
|
||||||
Kemal.stop if running?
|
|
||||||
exit
|
|
||||||
end
|
|
||||||
|
|
||||||
# This route serves the built-in images for not_found and exceptions.
|
|
||||||
get "/__kemal__/:image" do |env|
|
|
||||||
image = env.params.url["image"]
|
|
||||||
file_path = File.expand_path("lib/kemal/images/#{image}", Dir.current)
|
|
||||||
if File.exists? file_path
|
|
||||||
send_file env, file_path
|
|
||||||
else
|
|
||||||
halt env, 404
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
@running = true
|
@running = true
|
||||||
|
|
||||||
yield self
|
yield
|
||||||
|
|
||||||
server.listen if @config.env != "test"
|
server.listen unless @config.env == "test"
|
||||||
end
|
end
|
||||||
|
|
||||||
def stop
|
def stop
|
||||||
|
|
|
@ -57,5 +57,20 @@ module Kemal
|
||||||
|
|
||||||
def extra_options(&@extra_options : OptionParser ->)
|
def extra_options(&@extra_options : OptionParser ->)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Create a config with default values
|
||||||
|
def self.default
|
||||||
|
new
|
||||||
|
end
|
||||||
|
|
||||||
|
# Creates a config with basic value (disabled logging, disabled serve_static, disabled shutdown_message)
|
||||||
|
def self.base
|
||||||
|
new.tap do |config|
|
||||||
|
config.logging = false
|
||||||
|
config.serve_static = false
|
||||||
|
config.shutdown_message = false
|
||||||
|
config.always_rescue = false
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
# - WebSocket(ws)
|
# - WebSocket(ws)
|
||||||
# - before_*
|
# - before_*
|
||||||
# - error
|
# - error
|
||||||
|
require "../kemal"
|
||||||
require "./dsl/*"
|
require "./dsl/*"
|
||||||
|
|
||||||
{% for method in Kemal::Base::HTTP_METHODS %}
|
{% for method in Kemal::Base::HTTP_METHODS %}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue