Class: WEBrick::HTTPServlet::FileHandler
- Inherits:
-
AbstractServlet
- Object
- AbstractServlet
- WEBrick::HTTPServlet::FileHandler
- Defined in:
- lib/webrick/httpservlet/filehandler.rb
Overview
Serves a directory including fancy indexing and a variety of other options.
Example:
server.mount('/assets', WEBrick::HTTPServlet::FileHandler,
'/path/to/assets')
Constant Summary collapse
- HandlerTable =
:nodoc:
Hash.new
Class Method Summary collapse
-
.add_handler(suffix, handler) ⇒ Object
Allow custom handling of requests for files with
suffix
by classhandler
. -
.remove_handler(suffix) ⇒ Object
Remove custom handling of requests for files with
suffix
.
Instance Method Summary collapse
- #do_GET(req, res) ⇒ Object
- #do_OPTIONS(req, res) ⇒ Object
- #do_POST(req, res) ⇒ Object
-
#initialize(server, root, options = {}, default = Config::FileHandler) ⇒ FileHandler
constructor
Creates a FileHandler servlet on
server
that serves files starting at directoryroot
. - #service(req, res) ⇒ Object
-
#set_filesystem_encoding(str) ⇒ Object
:stopdoc:.
Methods inherited from AbstractServlet
Constructor Details
#initialize(server, root, options = {}, default = Config::FileHandler) ⇒ FileHandler
Creates a FileHandler servlet on server
that serves files starting at directory root
options
may be a Hash containing keys from WEBrick::Config::FileHandler or true
or false
.
If options
is true or false then :FancyIndexing
is enabled or disabled respectively.
203 204 205 206 207 208 209 210 211 |
# File 'lib/webrick/httpservlet/filehandler.rb', line 203 def initialize(server, root, ={}, default=Config::FileHandler) @config = server.config @logger = @config[:Logger] @root = File.(root) if == true || == false = { :FancyIndexing => } end @options = default.dup.update() end |
Class Method Details
.add_handler(suffix, handler) ⇒ Object
Allow custom handling of requests for files with suffix
by class handler
182 183 184 |
# File 'lib/webrick/httpservlet/filehandler.rb', line 182 def self.add_handler(suffix, handler) HandlerTable[suffix] = handler end |
.remove_handler(suffix) ⇒ Object
Remove custom handling of requests for files with suffix
189 190 191 |
# File 'lib/webrick/httpservlet/filehandler.rb', line 189 def self.remove_handler(suffix) HandlerTable.delete(suffix) end |
Instance Method Details
#do_GET(req, res) ⇒ Object
245 246 247 248 249 |
# File 'lib/webrick/httpservlet/filehandler.rb', line 245 def do_GET(req, res) unless exec_handler(req, res) set_dir_list(req, res) end end |
#do_OPTIONS(req, res) ⇒ Object
257 258 259 260 261 |
# File 'lib/webrick/httpservlet/filehandler.rb', line 257 def do_OPTIONS(req, res) unless exec_handler(req, res) super(req, res) end end |
#do_POST(req, res) ⇒ Object
251 252 253 254 255 |
# File 'lib/webrick/httpservlet/filehandler.rb', line 251 def do_POST(req, res) unless exec_handler(req, res) raise HTTPStatus::NotFound, "'#{req.path}' not found." end end |
#service(req, res) ⇒ Object
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 |
# File 'lib/webrick/httpservlet/filehandler.rb', line 224 def service(req, res) # if this class is mounted on "/" and /~username is requested. # we're going to override path information 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 |
#set_filesystem_encoding(str) ⇒ Object
:stopdoc:
215 216 217 218 219 220 221 222 |
# File 'lib/webrick/httpservlet/filehandler.rb', line 215 def set_filesystem_encoding(str) enc = Encoding.find('filesystem') if enc == Encoding::US_ASCII str.b else str.dup.force_encoding(enc) end end |