From 21a3c6ad3cd1a61c01e1ba5209c7022f52e54955 Mon Sep 17 00:00:00 2001 From: Sdogruyol Date: Thu, 10 Dec 2015 20:40:39 +0200 Subject: [PATCH] Add static file handler --- src/kemal.cr | 2 +- src/kemal/handler.cr | 41 +------------------------------------ src/kemal/static_handler.cr | 32 +++++++++++++++++++++++++++++ src/kemal/view.cr | 40 ++++++++++++++++++++++++++++++++++++ 4 files changed, 74 insertions(+), 41 deletions(-) create mode 100644 src/kemal/static_handler.cr diff --git a/src/kemal.cr b/src/kemal.cr index 82f086c..8495dd3 100644 --- a/src/kemal.cr +++ b/src/kemal.cr @@ -17,8 +17,8 @@ at_exit do config = Kemal.config logger = Kemal::Logger.new config.add_handler logger + config.add_handler Kemal::StaticHandler.new("./public") config.add_handler Kemal::Handler::INSTANCE - config.add_handler HTTP::StaticFileHandler.new("./public") server = HTTP::Server.new(config.port, config.handlers) server.ssl = config.ssl diff --git a/src/kemal/handler.cr b/src/kemal/handler.cr index 2d30080..2855a70 100644 --- a/src/kemal/handler.cr +++ b/src/kemal/handler.cr @@ -1,6 +1,7 @@ require "http/server" require "uri" +# Handles the routes class Kemal::Handler < HTTP::Handler INSTANCE = new @@ -37,44 +38,4 @@ class Kemal::Handler < HTTP::Handler # Render 404 unless a route matches return render_404 end - - def render_404 - template = <<-HTML - - - - - - -

Kemal doesn't know this way.

- - - - HTML - HTTP::Response.new(404, template) - end - - def render_500(ex) - template = <<-HTML - - - - - - -

Kemal has encountered an error. (500)

-

#{ex}

- - - HTML - HTTP::Response.error("text/html", template) - end end diff --git a/src/kemal/static_handler.cr b/src/kemal/static_handler.cr new file mode 100644 index 0000000..f5d433b --- /dev/null +++ b/src/kemal/static_handler.cr @@ -0,0 +1,32 @@ +require "http/server" +require "ecr/macros" + +class Kemal::StaticHandler < HTTP::Handler + + def initialize(@publicdir) + end + + def call(request) + request_path = request.path.not_nil! + + # Call next handler for processing + return call_next(request) unless request_path.starts_with? "/public" + file = request_path.split("/public/")[1] if request_path.starts_with?("/public") + file_path = File.expand_path("public/#{file}", Dir.working_directory) + if File.exists?(file_path) + HTTP::Response.new(200, File.read(file_path), HTTP::Headers{"Content-Type": mime_type(file_path)}) + else + call_next(request) + end + end + + private def mime_type(path) + case File.extname(path) + when ".txt" then "text/plain" + when ".htm", ".html" then "text/html" + when ".css" then "text/css" + when ".js" then "application/javascript" + else "application/octet-stream" + end + end +end diff --git a/src/kemal/view.cr b/src/kemal/view.cr index 4402f12..8b3ee2e 100644 --- a/src/kemal/view.cr +++ b/src/kemal/view.cr @@ -17,3 +17,43 @@ macro render(filename, layout) content = render {{filename}} render {{layout}} end + +def render_404 + template = <<-HTML + + + + + + +

Kemal doesn't know this way.

+ + + + HTML + HTTP::Response.new(404, template) +end + +def render_500(ex) + template = <<-HTML + + + + + + +

Kemal has encountered an error. (500)

+

#{ex}

+ + + HTML + HTTP::Response.error("text/html", template) +end