mirror of
https://gitea.invidious.io/iv-org/shard-kemal.git
synced 2024-08-15 00:53:36 +00:00
Introduce Kemal::InitHandler to initialize HTTP::Server::Context with defaults
This commit is contained in:
parent
725e051723
commit
09d9e708f1
10 changed files with 48 additions and 40 deletions
|
@ -26,7 +26,7 @@ describe "Config" do
|
||||||
it "adds a custom handler" do
|
it "adds a custom handler" do
|
||||||
config = Kemal.config
|
config = Kemal.config
|
||||||
config.add_handler CustomTestHandler.new
|
config.add_handler CustomTestHandler.new
|
||||||
config.handlers.size.should eq(5)
|
config.handlers.size.should eq(6)
|
||||||
end
|
end
|
||||||
|
|
||||||
it "adds custom options" do
|
it "adds custom options" do
|
||||||
|
|
|
@ -1,15 +1,6 @@
|
||||||
require "./spec_helper"
|
require "./spec_helper"
|
||||||
|
|
||||||
describe "Context" do
|
describe "Context" do
|
||||||
it "has a default content type" do
|
|
||||||
get "/" do |env|
|
|
||||||
"Hello"
|
|
||||||
end
|
|
||||||
request = HTTP::Request.new("GET", "/")
|
|
||||||
client_response = call_request_on_app(request)
|
|
||||||
client_response.headers["Content-Type"].should eq("text/html")
|
|
||||||
end
|
|
||||||
|
|
||||||
it "sets content type" do
|
it "sets content type" do
|
||||||
get "/" do |env|
|
get "/" do |env|
|
||||||
env.response.content_type = "application/json"
|
env.response.content_type = "application/json"
|
||||||
|
|
|
@ -4,7 +4,7 @@ describe "Macros" do
|
||||||
describe "#basic_auth" do
|
describe "#basic_auth" do
|
||||||
it "adds HTTPBasicAuthHandler" do
|
it "adds HTTPBasicAuthHandler" do
|
||||||
basic_auth "serdar", "123"
|
basic_auth "serdar", "123"
|
||||||
Kemal.config.handlers.size.should eq 5
|
Kemal.config.handlers.size.should eq 6
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ describe "Macros" do
|
||||||
describe "#add_handler" do
|
describe "#add_handler" do
|
||||||
it "adds a custom handler" do
|
it "adds a custom handler" do
|
||||||
add_handler CustomTestHandler.new
|
add_handler CustomTestHandler.new
|
||||||
Kemal.config.handlers.size.should eq 5
|
Kemal.config.handlers.size.should eq 6
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
21
spec/init_handler_spec.cr
Normal file
21
spec/init_handler_spec.cr
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
require "./spec_helper"
|
||||||
|
|
||||||
|
describe "Kemal::InitHandler" do
|
||||||
|
it "initializes context with Content-Type: text/html" do
|
||||||
|
request = HTTP::Request.new("GET", "/")
|
||||||
|
io = MemoryIO.new
|
||||||
|
response = HTTP::Server::Response.new(io)
|
||||||
|
context = HTTP::Server::Context.new(request, response)
|
||||||
|
Kemal::InitHandler::INSTANCE.call(context)
|
||||||
|
context.response.headers["Content-Type"].should eq "text/html"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "initializes context with X-Powered-By: Kemal" do
|
||||||
|
request = HTTP::Request.new("GET", "/")
|
||||||
|
io = MemoryIO.new
|
||||||
|
response = HTTP::Server::Response.new(io)
|
||||||
|
context = HTTP::Server::Context.new(request, response)
|
||||||
|
Kemal::InitHandler::INSTANCE.call(context)
|
||||||
|
context.response.headers["X-Powered-By"].should eq "Kemal"
|
||||||
|
end
|
||||||
|
end
|
|
@ -155,20 +155,4 @@ describe "Kemal::RouteHandler" do
|
||||||
client_response.status_code.should eq(302)
|
client_response.status_code.should eq(302)
|
||||||
client_response.headers.has_key?("Location").should eq(true)
|
client_response.headers.has_key?("Location").should eq(true)
|
||||||
end
|
end
|
||||||
|
|
||||||
it "sets default Content-Type to context html" do
|
|
||||||
get "/" do |env|
|
|
||||||
"Hello World from GET"
|
|
||||||
end
|
|
||||||
request = HTTP::Request.new("GET", "/")
|
|
||||||
client_response = call_request_on_app(request)
|
|
||||||
client_response.content_type.should eq("text/html")
|
|
||||||
end
|
|
||||||
|
|
||||||
it "sets X-Powered-By to Kemal" do
|
|
||||||
get "/" { }
|
|
||||||
request = HTTP::Request.new("GET", "/")
|
|
||||||
client_response = call_request_on_app(request)
|
|
||||||
client_response.headers["X-Powered-By"].should eq("Kemal")
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -7,12 +7,10 @@ module Kemal
|
||||||
begin
|
begin
|
||||||
call_next(context)
|
call_next(context)
|
||||||
rescue Kemal::Exceptions::RouteNotFound
|
rescue Kemal::Exceptions::RouteNotFound
|
||||||
context.response.content_type = "text/html"
|
|
||||||
call_exception_with_status_code(context, 404)
|
call_exception_with_status_code(context, 404)
|
||||||
rescue Kemal::Exceptions::CustomException
|
rescue Kemal::Exceptions::CustomException
|
||||||
call_exception_with_status_code(context, context.response.status_code)
|
call_exception_with_status_code(context, context.response.status_code)
|
||||||
rescue ex : Exception
|
rescue ex : Exception
|
||||||
context.response.content_type = "text/html"
|
|
||||||
Kemal.config.logger.write("Exception: #{ex.inspect_with_backtrace}\n")
|
Kemal.config.logger.write("Exception: #{ex.inspect_with_backtrace}\n")
|
||||||
return call_exception_with_status_code(context, 500) if Kemal.config.error_handlers.has_key?(500)
|
return call_exception_with_status_code(context, 500) if Kemal.config.error_handlers.has_key?(500)
|
||||||
verbosity = Kemal.config.env == "production" ? false : true
|
verbosity = Kemal.config.env == "production" ? false : true
|
||||||
|
|
|
@ -58,33 +58,38 @@ module Kemal
|
||||||
ERROR_HANDLERS[status_code] = ->(context : HTTP::Server::Context) { handler.call(context).to_s }
|
ERROR_HANDLERS[status_code] = ->(context : HTTP::Server::Context) { handler.call(context).to_s }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def extra_options(&@extra_options : OptionParser ->)
|
||||||
|
end
|
||||||
|
|
||||||
def setup
|
def setup
|
||||||
|
setup_init_handler
|
||||||
setup_log_handler
|
setup_log_handler
|
||||||
setup_error_handler
|
setup_error_handler
|
||||||
setup_static_file_handler
|
setup_static_file_handler
|
||||||
end
|
end
|
||||||
|
|
||||||
def setup_log_handler
|
private def setup_init_handler
|
||||||
|
HANDLERS.insert(0, Kemal::InitHandler::INSTANCE)
|
||||||
|
end
|
||||||
|
|
||||||
|
private def setup_log_handler
|
||||||
@logger ||= if @logging
|
@logger ||= if @logging
|
||||||
Kemal::CommonLogHandler.new
|
Kemal::CommonLogHandler.new
|
||||||
else
|
else
|
||||||
Kemal::NullLogHandler.new
|
Kemal::NullLogHandler.new
|
||||||
end
|
end
|
||||||
HANDLERS.insert(0, @logger.not_nil!)
|
HANDLERS.insert(1, @logger.not_nil!)
|
||||||
end
|
|
||||||
|
|
||||||
def extra_options(&@extra_options : OptionParser ->)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
private def setup_error_handler
|
private def setup_error_handler
|
||||||
if @always_rescue
|
if @always_rescue
|
||||||
@error_handler ||= Kemal::CommonExceptionHandler.new
|
@error_handler ||= Kemal::CommonExceptionHandler.new
|
||||||
HANDLERS.insert(1, @error_handler.not_nil!)
|
HANDLERS.insert(2, @error_handler.not_nil!)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
private def setup_static_file_handler
|
private def setup_static_file_handler
|
||||||
HANDLERS.insert(2, Kemal::StaticFileHandler.new(@public_folder)) if @serve_static
|
HANDLERS.insert(3, Kemal::StaticFileHandler.new(@public_folder)) if @serve_static
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
12
src/kemal/init_handler.cr
Normal file
12
src/kemal/init_handler.cr
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
module Kemal
|
||||||
|
# Kemal::InitHandler is the first handler thus initializes the context with default values such as
|
||||||
|
# Content-Type, X-Powered-By.
|
||||||
|
class InitHandler < HTTP::Handler
|
||||||
|
INSTANCE = new
|
||||||
|
|
||||||
|
def call(context)
|
||||||
|
context.response.content_type = "text/html"
|
||||||
|
context.response.headers.add "X-Powered-By", "Kemal"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -13,8 +13,6 @@ module Kemal
|
||||||
end
|
end
|
||||||
|
|
||||||
def call(context)
|
def call(context)
|
||||||
context.response.headers.add "X-Powered-By", "Kemal"
|
|
||||||
context.response.content_type = "text/html" unless context.response.headers.has_key?("Content-Type")
|
|
||||||
process_request(context)
|
process_request(context)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,6 @@ def render_500(context, backtrace, verbosity)
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
HTML
|
HTML
|
||||||
context.response.content_type = "text/html"
|
|
||||||
context.response.status_code = 500
|
context.response.status_code = 500
|
||||||
context.response.print template
|
context.response.print template
|
||||||
context
|
context
|
||||||
|
|
Loading…
Reference in a new issue