summary refs log tree commit
diff options
context:
space:
mode:
authorThomas Grindinger <thomas@linux-ei28.site>2016-04-23 18:27:27 -0500
committerJeremy Daer <jeremydaer@gmail.com>2016-04-28 14:12:20 -0500
commita893d50ce83e616f06ce24fcac8b902edbee3e31 (patch)
tree3f05fdb4702ade117645ef59d8732eb15cd025d3
parent4b8378b8d40b4529420ac0e8e00d1c14f88e77f7 (diff)
downloadrack-a893d50ce83e616f06ce24fcac8b902edbee3e31.tar.gz
HEAD requests to Rack::File now omit the response body.
Fixes #945.

Signed-off-by: Jeremy Daer <jeremydaer@gmail.com>
-rw-r--r--lib/rack/file.rb8
-rw-r--r--test/spec_file.rb6
2 files changed, 14 insertions, 0 deletions
diff --git a/lib/rack/file.rb b/lib/rack/file.rb
index 5b755f56..227a7284 100644
--- a/lib/rack/file.rb
+++ b/lib/rack/file.rb
@@ -2,6 +2,7 @@ require 'time'
 require 'rack/utils'
 require 'rack/mime'
 require 'rack/request'
+require 'rack/head'
 
 module Rack
   # Rack::File serves files below the +root+ directory given, according to the
@@ -22,9 +23,15 @@ module Rack
       @root = root
       @headers = headers
       @default_mime = default_mime
+      @head = Rack::Head.new(lambda { |env| get env })
     end
 
     def call(env)
+      # HEAD requests drop the response body, including 4xx error messages.
+      @head.call env
+    end
+
+    def get(env)
       request = Rack::Request.new env
       unless ALLOWED_VERBS.include? request.request_method
         return fail(405, "Method Not Allowed", {'Allow' => ALLOW_HEADER})
@@ -131,6 +138,7 @@ module Rack
 
     def fail(status, body, headers = {})
       body += "\n"
+
       [
         status,
         {
diff --git a/test/spec_file.rb b/test/spec_file.rb
index 2d0919a9..353dcdfe 100644
--- a/test/spec_file.rb
+++ b/test/spec_file.rb
@@ -237,4 +237,10 @@ describe Rack::File do
     res['Content-Type'].must_equal nil
   end
 
+  it "return error when file not found for head request" do
+    res = Rack::MockRequest.new(file(DOCROOT)).head("/cgi/missing")
+    res.must_be :not_found?
+    res.body.must_be :empty?
+  end
+
 end