Object
Rack::File serves files below the root given, according to the path info of the Rack request.
Handlers can detect if bodies are a Rack::File, and use mechanisms like sendfile on the path.
(Not documented)
# File lib/rack/file.rb, line 28 28: def _call(env) 29: @path_info = Utils.unescape(env["PATH_INFO"]) 30: return forbidden if @path_info.include? ".." 31: 32: @path = F.join(@root, @path_info) 33: 34: begin 35: if F.file?(@path) && F.readable?(@path) 36: serving 37: else 38: raise Errno::EPERM 39: end 40: rescue SystemCallError 41: not_found 42: end 43: end
(Not documented)
# File lib/rack/file.rb, line 22 22: def call(env) 23: dup._call(env) 24: end
(Not documented)
# File lib/rack/file.rb, line 80 80: def each 81: F.open(@path, "rb") { |file| 82: while part = file.read(8192) 83: yield part 84: end 85: } 86: end
(Not documented)
# File lib/rack/file.rb, line 45 45: def forbidden 46: body = "Forbidden\n" 47: [403, {"Content-Type" => "text/plain", 48: "Content-Length" => body.size.to_s}, 49: [body]] 50: end
(Not documented)
# File lib/rack/file.rb, line 73 73: def not_found 74: body = "File not found: #{@path_info}\n" 75: [404, {"Content-Type" => "text/plain", 76: "Content-Length" => body.size.to_s}, 77: [body]] 78: end
NOTE:
We check via File::size? whether this file provides size info via stat (e.g. /proc files often don't), otherwise we have to figure it out by reading the whole file into memory. And while we're at it we also use this as body then.
# File lib/rack/file.rb, line 58 58: def serving 59: if size = F.size?(@path) 60: body = self 61: else 62: body = [F.read(@path)] 63: size = Utils.bytesize(body.first) 64: end 65: 66: [200, { 67: "Last-Modified" => F.mtime(@path).httpdate, 68: "Content-Type" => Mime.mime_type(F.extname(@path), 'text/plain'), 69: "Content-Length" => size.to_s 70: }, body] 71: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.