Class: Rack::File
- Inherits:
-
Object
- Object
- Rack::File
- Defined in:
- lib/rack/file.rb,
lib/rack/sendfile.rb
Overview
:nodoc:
Constant Summary collapse
- F =
::File
Instance Attribute Summary collapse
-
#path ⇒ Object
(also: #to_path)
Returns the value of attribute path.
-
#root ⇒ Object
Returns the value of attribute root.
Instance Method Summary collapse
- #_call(env) ⇒ Object
- #call(env) ⇒ Object
- #each ⇒ Object
- #forbidden ⇒ Object
-
#initialize(root) ⇒ File
constructor
A new instance of File.
- #not_found ⇒ Object
-
#serving ⇒ Object
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.
Constructor Details
Instance Attribute Details
#path ⇒ Object Also known as: to_path
Returns the value of attribute path.
16 17 18 |
# File 'lib/rack/file.rb', line 16 def path @path end |
#root ⇒ Object
Returns the value of attribute root.
15 16 17 |
# File 'lib/rack/file.rb', line 15 def root @root end |
Instance Method Details
#_call(env) ⇒ Object
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# File 'lib/rack/file.rb', line 30 def _call(env) @path_info = Utils.unescape(env["PATH_INFO"]) return forbidden if @path_info.include? ".." @path = F.join(@root, @path_info) begin if F.file?(@path) && F.readable?(@path) serving else raise Errno::EPERM end rescue SystemCallError not_found end end |
#call(env) ⇒ Object
24 25 26 |
# File 'lib/rack/file.rb', line 24 def call(env) dup._call(env) end |
#each ⇒ Object
84 85 86 87 88 89 90 |
# File 'lib/rack/file.rb', line 84 def each F.open(@path, "rb") { |file| while part = file.read(8192) yield part end } end |
#forbidden ⇒ Object
47 48 49 50 51 52 53 |
# File 'lib/rack/file.rb', line 47 def forbidden body = "Forbidden\n" [403, {"Content-Type" => "text/plain", "Content-Length" => body.size.to_s, "X-Cascade" => "pass"}, [body]] end |
#not_found ⇒ Object
76 77 78 79 80 81 82 |
# File 'lib/rack/file.rb', line 76 def not_found body = "File not found: #{@path_info}\n" [404, {"Content-Type" => "text/plain", "Content-Length" => body.size.to_s, "X-Cascade" => "pass"}, [body]] end |
#serving ⇒ Object
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.
61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/rack/file.rb', line 61 def serving if size = F.size?(@path) body = self else body = [F.read(@path)] size = Utils.bytesize(body.first) end [200, { "Last-Modified" => F.mtime(@path).httpdate, "Content-Type" => Mime.mime_type(F.extname(@path), 'text/plain'), "Content-Length" => size.to_s }, body] end |