In Files

  • webrick/httpservlet/filehandler.rb

Class/Module Index [+]

Quicksearch

WEBrick::HTTPServlet::FileHandler

Serves files from a directory

Constants

HandlerTable

Public Class Methods

add_handler(suffix, handler) click to toggle source

Allow custom handling of requests for files with suffix by class handler

 
               # File webrick/httpservlet/filehandler.rb, line 138
def self.add_handler(suffix, handler)
  HandlerTable[suffix] = handler
end
            
new(server, root, options={}, default=Config::FileHandler) click to toggle source

Creates a FileHandler servlet on server that serves files starting at directory root

If options is a Hash the following keys are allowed:

:AcceptableLanguages

Array of languages allowed for accept-language

:DirectoryCallback

Allows preprocessing of directory requests

:FancyIndexing

If true, show an index for directories

:FileCallback

Allows preprocessing of file requests

:HandlerCallback

Allows preprocessing of requests

:HandlerTable

Maps file suffixes to file handlers. DefaultFileHandler is used by default but any servlet can be used.

:NondisclosureName

Do not show files matching this array of globs

:UserDir

Directory inside ~user to serve content from for /~user requests. Only works if mounted on /

If options is true or false then :FancyIndexing is enabled or disabled respectively.

 
               # File webrick/httpservlet/filehandler.rb, line 170
def initialize(server, root, options={}, default=Config::FileHandler)
  @config = server.config
  @logger = @config[:Logger]
  @root = File.expand_path(root)
  if options == true || options == false
    options = { :FancyIndexing => options }
  end
  @options = default.dup.update(options)
end
            
remove_handler(suffix) click to toggle source

Remove custom handling of requests for files with suffix

 
               # File webrick/httpservlet/filehandler.rb, line 145
def self.remove_handler(suffix)
  HandlerTable.delete(suffix)
end
            

Public Instance Methods

do_GET(req, res) click to toggle source
 
               # File webrick/httpservlet/filehandler.rb, line 201
def do_GET(req, res)
  unless exec_handler(req, res)
    set_dir_list(req, res)
  end
end
            
do_OPTIONS(req, res) click to toggle source
 
               # File webrick/httpservlet/filehandler.rb, line 213
def do_OPTIONS(req, res)
  unless exec_handler(req, res)
    super(req, res)
  end
end
            
do_POST(req, res) click to toggle source
 
               # File webrick/httpservlet/filehandler.rb, line 207
def do_POST(req, res)
  unless exec_handler(req, res)
    raise HTTPStatus::NotFound, "`#{req.path}' not found."
  end
end
            
service(req, res) click to toggle source
 
               # File webrick/httpservlet/filehandler.rb, line 180
def service(req, res)
  # if this class is mounted on "/" and /~username is requested.
  # we're going to override path informations before invoking service.
  if defined?(Etc) && @options[:UserDir] && req.script_name.empty?
    if %r^(/~([^/]+))| =~ req.path_info
      script_name, user = $1, $2
      path_info = $'
      begin
        passwd = Etc::getpwnam(user)
        @root = File::join(passwd.dir, @options[:UserDir])
        req.script_name = script_name
        req.path_info = path_info
      rescue
        @logger.debug "#{self.class}#do_GET: getpwnam(#{user}) failed"
      end
    end
  end
  prevent_directory_traversal(req, res)
  super(req, res)
end