diff options
Diffstat (limited to 'lib/rack/file.rb')
-rw-r--r-- | lib/rack/file.rb | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/lib/rack/file.rb b/lib/rack/file.rb index 5b755f56..0a257b3d 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,17 +23,24 @@ 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}) end path_info = Utils.unescape_path request.path_info - clean_path_info = Utils.clean_path_info(path_info) + return fail(400, "Bad Request") unless Utils.valid_path?(path_info) + clean_path_info = Utils.clean_path_info(path_info) path = ::File.join(@root, clean_path_info) available = begin @@ -131,6 +139,7 @@ module Rack def fail(status, body, headers = {}) body += "\n" + [ status, { |