Parent

Class Index [+]

Quicksearch

Rack::Directory

Rack::Directory serves entries below the root given, according to the path info of the Rack request. If a directory is found, the file’s contents will be presented in an html based index. If a file is found, the env will be passed to the specified app.

If app is not specified, a Rack::File of the same root will be used.

Constants

DIR_FILE
(Not documented)
DIR_PAGE
(Not documented)
F
(Not documented)
FILESIZE_FORMAT

Stolen from Ramaze

Attributes

files[R]

(Not documented)

root[RW]

(Not documented)

path[RW]

(Not documented)

Public Class Methods

new(root, app=nil) click to toggle source

(Not documented)

    # File lib/rack/directory.rb, line 46
46:     def initialize(root, app=nil)
47:       @root = F.expand_path(root)
48:       @app = app || Rack::File.new(@root)
49:     end

Public Instance Methods

_call(env) click to toggle source

(Not documented)

    # File lib/rack/directory.rb, line 57
57:     def _call(env)
58:       @env = env
59:       @script_name = env['SCRIPT_NAME']
60:       @path_info = Utils.unescape(env['PATH_INFO'])
61: 
62:       if forbidden = check_forbidden
63:         forbidden
64:       else
65:         @path = F.join(@root, @path_info)
66:         list_path
67:       end
68:     end
call(env) click to toggle source

(Not documented)

    # File lib/rack/directory.rb, line 51
51:     def call(env)
52:       dup._call(env)
53:     end
check_forbidden() click to toggle source

(Not documented)

    # File lib/rack/directory.rb, line 70
70:     def check_forbidden
71:       return unless @path_info.include? ".."
72: 
73:       body = "Forbidden\n"
74:       size = Rack::Utils.bytesize(body)
75:       return [403, {"Content-Type" => "text/plain",
76:         "Content-Length" => size.to_s,
77:         "X-Cascade" => "pass"}, [body]]
78:     end
each() click to toggle source

(Not documented)

     # File lib/rack/directory.rb, line 134
134:     def each
135:       show_path = @path.sub(/^#{@root}/,'')
136:       files = @files.map{|f| DIR_FILE % f }*"\n"
137:       page  = DIR_PAGE % [ show_path, show_path , files ]
138:       page.each_line{|l| yield l }
139:     end
entity_not_found() click to toggle source

(Not documented)

     # File lib/rack/directory.rb, line 126
126:     def entity_not_found
127:       body = "Entity not found: #{@path_info}\n"
128:       size = Rack::Utils.bytesize(body)
129:       return [404, {"Content-Type" => "text/plain",
130:         "Content-Length" => size.to_s,
131:         "X-Cascade" => "pass"}, [body]]
132:     end
filesize_format(int) click to toggle source

(Not documented)

     # File lib/rack/directory.rb, line 150
150:     def filesize_format(int)
151:       FILESIZE_FORMAT.each do |format, size|
152:         return format % (int.to_f / size) if int >= size
153:       end
154: 
155:       int.to_s + 'B'
156:     end
list_directory() click to toggle source

(Not documented)

     # File lib/rack/directory.rb, line 80
 80:     def list_directory
 81:       @files = [['../','Parent Directory','','','']]
 82:       glob = F.join(@path, '*')
 83: 
 84:       Dir[glob].sort.each do |node|
 85:         stat = stat(node)
 86:         next  unless stat
 87:         basename = F.basename(node)
 88:         ext = F.extname(node)
 89: 
 90:         url = F.join(@script_name, @path_info, basename)
 91:         size = stat.size
 92:         type = stat.directory? ? 'directory' : Mime.mime_type(ext)
 93:         size = stat.directory? ? '-' : filesize_format(size)
 94:         mtime = stat.mtime.httpdate
 95:         url << '/'  if stat.directory?
 96:         basename << '/'  if stat.directory?
 97: 
 98:         @files << [ url, basename, size, type, mtime ]
 99:       end
100: 
101:       return [ 200, {'Content-Type'=>'text/html; charset=utf-8'}, self ]
102:     end
list_path() click to toggle source

TODO: add correct response if not readable, not sure if 404 is the best

      option
     # File lib/rack/directory.rb, line 112
112:     def list_path
113:       @stat = F.stat(@path)
114: 
115:       if @stat.readable?
116:         return @app.call(@env) if @stat.file?
117:         return list_directory if @stat.directory?
118:       else
119:         raise Errno::ENOENT, 'No such file or directory'
120:       end
121: 
122:     rescue Errno::ENOENT, Errno::ELOOP
123:       return entity_not_found
124:     end
stat(node, max = 10) click to toggle source

(Not documented)

     # File lib/rack/directory.rb, line 104
104:     def stat(node, max = 10)
105:       F.stat(node)
106:     rescue Errno::ENOENT, Errno::ELOOP
107:       return nil
108:     end

Disabled; run with --debug to generate this.

[Validate]

Generated with the Darkfish Rdoc Generator 1.1.6.