From 607aaeffe3aa3f8678fbae0f8f3abaf31da1e30a Mon Sep 17 00:00:00 2001 From: Sdogruyol Date: Tue, 22 Aug 2017 15:20:30 +0300 Subject: [PATCH] Allow headers in built-in static file server --- spec/static/dir/index.html | 12 ++++++++++++ spec/static_file_handler_spec.cr | 20 ++++++++++++++++++++ src/kemal/config.cr | 1 + src/kemal/helpers/helpers.cr | 8 ++++++++ 4 files changed, 41 insertions(+) create mode 100644 spec/static/dir/index.html diff --git a/spec/static/dir/index.html b/spec/static/dir/index.html new file mode 100644 index 0000000..32d977f --- /dev/null +++ b/spec/static/dir/index.html @@ -0,0 +1,12 @@ + + + + + title + + + + + + + \ No newline at end of file diff --git a/spec/static_file_handler_spec.cr b/spec/static_file_handler_spec.cr index 845d40b..4ce1b73 100644 --- a/spec/static_file_handler_spec.cr +++ b/spec/static_file_handler_spec.cr @@ -130,4 +130,24 @@ describe Kemal::StaticFileHandler do end end end + + it "should handle setting custom headers" do + headers = Proc(HTTP::Server::Response, String, File::Stat, Void).new do |response, path, stat| + if path =~ /\.html$/ + response.headers.add("Access-Control-Allow-Origin", "*") + end + response.headers.add("Content-Size", stat.size.to_s) + end + + static_headers(&headers) + + response = handle HTTP::Request.new("GET", "/dir/test.txt") + response.headers.has_key?("Access-Control-Allow-Origin").should be_false + response.headers["Content-Size"].should eq( + File.stat("#{__DIR__}/static/dir/test.txt").size.to_s + ) + + response = handle HTTP::Request.new("GET", "/dir/index.html") + response.headers["Access-Control-Allow-Origin"].should eq("*") + end end diff --git a/src/kemal/config.cr b/src/kemal/config.cr index 43fa96c..d67ef44 100644 --- a/src/kemal/config.cr +++ b/src/kemal/config.cr @@ -21,6 +21,7 @@ module Kemal always_rescue, serve_static : (Bool | Hash(String, Bool)), server, extra_options, shutdown_message getter custom_handler_position + property static_headers : (HTTP::Server::Response, String, File::Stat -> Void)? def initialize @host_binding = "0.0.0.0" diff --git a/src/kemal/helpers/helpers.cr b/src/kemal/helpers/helpers.cr index 23d0a5b..204336c 100644 --- a/src/kemal/helpers/helpers.cr +++ b/src/kemal/helpers/helpers.cr @@ -102,6 +102,10 @@ def send_file(env, path : String, mime_type : String? = nil) minsize = 860 # http://webmasters.stackexchange.com/questions/31750/what-is-recommended-minimum-object-size-for-gzip-performance-benefits ?? request_headers = env.request.headers filesize = File.size(file_path) + filestat = File.stat(file_path) + + Kemal.config.static_headers.try(&.call(env.response, file_path, filestat)) + File.open(file_path) do |file| if env.request.method == "GET" && env.request.headers.has_key?("Range") next multipart(file, env) @@ -196,3 +200,7 @@ end def gzip(status : Bool = false) add_handler HTTP::CompressHandler.new if status end + +def static_headers(&headers : HTTP::Server::Response, String, File::Stat -> Void) + Kemal.config.static_headers = headers +end