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