diff options
Diffstat (limited to 'lib/webrick/httpserver.rb')
| -rw-r--r-- | lib/webrick/httpserver.rb | 75 |
1 files changed, 6 insertions, 69 deletions
diff --git a/lib/webrick/httpserver.rb b/lib/webrick/httpserver.rb index e46b3bd1ad..929d856a4a 100644 --- a/lib/webrick/httpserver.rb +++ b/lib/webrick/httpserver.rb @@ -1,4 +1,3 @@ -# frozen_string_literal: false # # httpserver.rb -- HTTPServer Class # @@ -9,7 +8,6 @@ # # $IPR: httpserver.rb,v 1.63 2002/10/01 17:16:32 gotoyuzo Exp $ -require 'io/wait' require 'webrick/server' require 'webrick/httputils' require 'webrick/httpstatus' @@ -21,28 +19,7 @@ require 'webrick/accesslog' module WEBrick class HTTPServerError < ServerError; end - ## - # An HTTP Server - class HTTPServer < ::WEBrick::GenericServer - ## - # Creates a new HTTP server according to +config+ - # - # An HTTP server uses the following attributes: - # - # :AccessLog:: An array of access logs. See WEBrick::AccessLog - # :BindAddress:: Local address for the server to bind to - # :DocumentRoot:: Root path to serve files from - # :DocumentRootOptions:: Options for the default HTTPServlet::FileHandler - # :HTTPVersion:: The HTTP version of this server - # :Port:: Port to listen on - # :RequestCallback:: Called with a request and response before each - # request is serviced. - # :RequestTimeout:: Maximum time to wait between requests - # :ServerAlias:: Array of alternate names for this server for virtual - # hosting - # :ServerName:: Name for this server for virtual hosting - def initialize(config={}, default=Config::HTTP) super(config, default) @http_version = HTTPVersion::convert(@config[:HTTPVersion]) @@ -63,9 +40,6 @@ module WEBrick @virtual_hosts = Array.new end - ## - # Processes requests on +sock+ - def run(sock) while true res = HTTPResponse.new(@config) @@ -74,11 +48,11 @@ module WEBrick begin timeout = @config[:RequestTimeout] while timeout > 0 - break if sock.to_io.wait_readable(0.5) - break if @status != :Running + break if IO.select([sock], nil, nil, 0.5) + timeout = 0 if @status != :Running timeout -= 0.5 end - raise HTTPStatus::EOFError if timeout <= 0 || @status != :Running + raise HTTPStatus::EOFError if timeout <= 0 raise HTTPStatus::EOFError if sock.eof? req.parse(sock) res.request_method = req.request_method @@ -119,9 +93,6 @@ module WEBrick end end - ## - # Services +req+ and fills in +res+ - def service(req, res) if req.unparsed_uri == "*" if req.request_method == "OPTIONS" @@ -140,45 +111,27 @@ module WEBrick si.service(req, res) end - ## - # The default OPTIONS request handler says GET, HEAD, POST and OPTIONS - # requests are allowed. - def do_OPTIONS(req, res) res["allow"] = "GET,HEAD,POST,OPTIONS" end - ## - # Mounts +servlet+ on +dir+ passing +options+ to the servlet at creation - # time - def mount(dir, servlet, *options) @logger.debug(sprintf("%s is mounted on %s.", servlet.inspect, dir)) @mount_tab[dir] = [ servlet, options ] end - ## - # Mounts +proc+ or +block+ on +dir+ and calls it with a - # WEBrick::HTTPRequest and WEBrick::HTTPResponse - def mount_proc(dir, proc=nil, &block) proc ||= block raise HTTPServerError, "must pass a proc or block" unless proc mount(dir, HTTPServlet::ProcHandler.new(proc)) end - ## - # Unmounts +dir+ - def unmount(dir) @logger.debug(sprintf("unmount %s.", dir)) @mount_tab.delete(dir) end alias umount unmount - ## - # Finds a servlet for +path+ - def search_servlet(path) script_name, path_info = @mount_tab.scan(path) servlet, options = @mount_tab[script_name] @@ -187,9 +140,6 @@ module WEBrick end end - ## - # Adds +server+ as a virtual host. - def virtual_host(server) @virtual_hosts << server @virtual_hosts = @virtual_hosts.sort_by{|s| @@ -201,9 +151,6 @@ module WEBrick } end - ## - # Finds the appropriate virtual host to handle +req+ - def lookup_server(req) @virtual_hosts.find{|s| (s[:BindAddress].nil? || req.addr[3] == s[:BindAddress]) && @@ -213,10 +160,6 @@ module WEBrick } end - ## - # Logs +req+ and +res+ in the access logs. +config+ is used for the - # server name. - def access_log(config, req, res) param = AccessLog::setup_params(config, req, res) @config[:AccessLog].each{|logger, fmt| @@ -224,13 +167,7 @@ module WEBrick } end - ## - # Mount table for the path a servlet is mounted on in the directory space - # of the server. Users of WEBrick can only access this indirectly via - # WEBrick::HTTPServer#mount, WEBrick::HTTPServer#unmount and - # WEBrick::HTTPServer#search_servlet - - class MountTable # :nodoc: + class MountTable def initialize @tab = Hash.new compile @@ -267,12 +204,12 @@ module WEBrick k.sort! k.reverse! k.collect!{|path| Regexp.escape(path) } - @scanner = Regexp.new("\\A(" + k.join("|") +")(?=/|\\z)") + @scanner = Regexp.new("^(" + k.join("|") +")(?=/|$)") end def normalize(dir) ret = dir ? dir.dup : "" - ret.sub!(%r|/+\z|, "") + ret.sub!(%r|/+$|, "") ret end end |
