Class Rack::File
In: lib/rack/file.rb
Parent: 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.

Methods

_call   call   each   new  

Constants

F = ::File

Attributes

path  [RW] 
root  [RW] 

Public Class methods

[Source]

    # File lib/rack/file.rb, line 12
12:     def initialize(root)
13:       @root = root
14:     end

Public Instance methods

[Source]

    # File lib/rack/file.rb, line 22
22:     def _call(env)
23:       if env["PATH_INFO"].include? ".."
24:         return [403, {"Content-Type" => "text/plain"}, ["Forbidden\n"]]
25:       end
26: 
27:       @path = F.join(@root, env["PATH_INFO"])
28:       ext = F.extname(@path)[1..-1]
29: 
30:       if F.file?(@path) && F.readable?(@path)
31:         [200, {
32:            "Content-Type"   => MIME_TYPES[ext] || "text/plain",
33:            "Content-Length" => F.size(@path).to_s
34:          }, self]
35:       else
36:         return [404, {"Content-Type" => "text/plain"},
37:                 ["File not found: #{env["PATH_INFO"]}\n"]]
38:       end
39:     end

[Source]

    # File lib/rack/file.rb, line 16
16:     def call(env)
17:       dup._call(env)
18:     end

[Source]

    # File lib/rack/file.rb, line 41
41:     def each
42:       F.open(@path, "rb") { |file|
43:         while part = file.read(8192)
44:           yield part
45:         end
46:       }
47:     end

[Validate]