diff options
author | Thomas Grindinger <thomas@linux-ei28.site> | 2016-04-23 18:27:27 -0500 |
---|---|---|
committer | Jeremy Daer <jeremydaer@gmail.com> | 2016-04-28 14:12:20 -0500 |
commit | a893d50ce83e616f06ce24fcac8b902edbee3e31 (patch) | |
tree | 3f05fdb4702ade117645ef59d8732eb15cd025d3 | |
parent | 4b8378b8d40b4529420ac0e8e00d1c14f88e77f7 (diff) | |
download | rack-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.rb | 8 | ||||
-rw-r--r-- | test/spec_file.rb | 6 |
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 |