From 09d9e708f180b57428d7b79ff32514474bf8320f Mon Sep 17 00:00:00 2001 From: Sdogruyol Date: Sun, 17 Jul 2016 18:11:26 +0300 Subject: [PATCH] Introduce Kemal::InitHandler to initialize HTTP::Server::Context with defaults --- spec/config_spec.cr | 2 +- spec/context_spec.cr | 9 --------- spec/helpers_spec.cr | 4 ++-- spec/init_handler_spec.cr | 21 +++++++++++++++++++++ spec/route_handler_spec.cr | 16 ---------------- src/kemal/common_exception_handler.cr | 2 -- src/kemal/config.cr | 19 ++++++++++++------- src/kemal/init_handler.cr | 12 ++++++++++++ src/kemal/route_handler.cr | 2 -- src/kemal/view.cr | 1 - 10 files changed, 48 insertions(+), 40 deletions(-) create mode 100644 spec/init_handler_spec.cr create mode 100644 src/kemal/init_handler.cr diff --git a/spec/config_spec.cr b/spec/config_spec.cr index 2fa60a8..9ed90ee 100644 --- a/spec/config_spec.cr +++ b/spec/config_spec.cr @@ -26,7 +26,7 @@ describe "Config" do it "adds a custom handler" do config = Kemal.config config.add_handler CustomTestHandler.new - config.handlers.size.should eq(5) + config.handlers.size.should eq(6) end it "adds custom options" do diff --git a/spec/context_spec.cr b/spec/context_spec.cr index 877cef3..af8cc1d 100644 --- a/spec/context_spec.cr +++ b/spec/context_spec.cr @@ -1,15 +1,6 @@ require "./spec_helper" 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 get "/" do |env| env.response.content_type = "application/json" diff --git a/spec/helpers_spec.cr b/spec/helpers_spec.cr index 7d60c2e..1f797ea 100644 --- a/spec/helpers_spec.cr +++ b/spec/helpers_spec.cr @@ -4,7 +4,7 @@ describe "Macros" do describe "#basic_auth" do it "adds HTTPBasicAuthHandler" do basic_auth "serdar", "123" - Kemal.config.handlers.size.should eq 5 + Kemal.config.handlers.size.should eq 6 end end @@ -18,7 +18,7 @@ describe "Macros" do describe "#add_handler" do it "adds a custom handler" do add_handler CustomTestHandler.new - Kemal.config.handlers.size.should eq 5 + Kemal.config.handlers.size.should eq 6 end end diff --git a/spec/init_handler_spec.cr b/spec/init_handler_spec.cr new file mode 100644 index 0000000..5cc06f1 --- /dev/null +++ b/spec/init_handler_spec.cr @@ -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 diff --git a/spec/route_handler_spec.cr b/spec/route_handler_spec.cr index b50d721..c8831ff 100644 --- a/spec/route_handler_spec.cr +++ b/spec/route_handler_spec.cr @@ -155,20 +155,4 @@ describe "Kemal::RouteHandler" do client_response.status_code.should eq(302) client_response.headers.has_key?("Location").should eq(true) 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 diff --git a/src/kemal/common_exception_handler.cr b/src/kemal/common_exception_handler.cr index 9a968a3..1ca895c 100644 --- a/src/kemal/common_exception_handler.cr +++ b/src/kemal/common_exception_handler.cr @@ -7,12 +7,10 @@ module Kemal begin call_next(context) rescue Kemal::Exceptions::RouteNotFound - context.response.content_type = "text/html" call_exception_with_status_code(context, 404) rescue Kemal::Exceptions::CustomException call_exception_with_status_code(context, context.response.status_code) rescue ex : Exception - context.response.content_type = "text/html" 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) verbosity = Kemal.config.env == "production" ? false : true diff --git a/src/kemal/config.cr b/src/kemal/config.cr index 7f10e94..4583cf4 100644 --- a/src/kemal/config.cr +++ b/src/kemal/config.cr @@ -58,33 +58,38 @@ module Kemal ERROR_HANDLERS[status_code] = ->(context : HTTP::Server::Context) { handler.call(context).to_s } end + def extra_options(&@extra_options : OptionParser ->) + end + def setup + setup_init_handler setup_log_handler setup_error_handler setup_static_file_handler 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 Kemal::CommonLogHandler.new else Kemal::NullLogHandler.new end - HANDLERS.insert(0, @logger.not_nil!) - end - - def extra_options(&@extra_options : OptionParser ->) + HANDLERS.insert(1, @logger.not_nil!) end private def setup_error_handler if @always_rescue @error_handler ||= Kemal::CommonExceptionHandler.new - HANDLERS.insert(1, @error_handler.not_nil!) + HANDLERS.insert(2, @error_handler.not_nil!) end end 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 diff --git a/src/kemal/init_handler.cr b/src/kemal/init_handler.cr new file mode 100644 index 0000000..4b45588 --- /dev/null +++ b/src/kemal/init_handler.cr @@ -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 diff --git a/src/kemal/route_handler.cr b/src/kemal/route_handler.cr index 73665e2..3896cc5 100644 --- a/src/kemal/route_handler.cr +++ b/src/kemal/route_handler.cr @@ -13,8 +13,6 @@ module Kemal end 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) end diff --git a/src/kemal/view.cr b/src/kemal/view.cr index 95b60d4..82f2c97 100644 --- a/src/kemal/view.cr +++ b/src/kemal/view.cr @@ -48,7 +48,6 @@ def render_500(context, backtrace, verbosity) HTML - context.response.content_type = "text/html" context.response.status_code = 500 context.response.print template context