module WEBrick

class HTTPServerError < ServerError
end

class HTTPServer < ::WEBrick::GenericServer
  @http_version: HTTPVersion

  @mount_tab: MountTable

  @virtual_hosts: Array[untyped]

  def initialize: (?Hash[Symbol, untyped] config, ?Hash[Symbol, untyped] default) -> void

  def run: (TCPSocket sock) -> void

  def service: (HTTPRequest req, HTTPResponse res) -> void

  def do_OPTIONS: (HTTPRequest req, HTTPResponse res) -> void

  def mount: (String dir, singleton(HTTPServlet::AbstractServlet) servlet, *untyped options) -> void

  def mount_proc: (String dir, ?HTTPServlet::ProcHandler::_Callable proc) -> void
                | (String dir, ?nil proc) { (HTTPRequest, HTTPResponse) -> void } -> void

  def unmount: (String dir) -> MountTable::value_type

  alias umount unmount

  def search_servlet: (String path) -> [singleton(HTTPServlet::AbstractServlet), Array[untyped], String, String]?

  def virtual_host: (instance server) -> void

  def lookup_server: (HTTPRequest req) -> instance?

  def access_log: (Hash[Symbol, untyped] config, HTTPRequest req, HTTPResponse res) -> void

  #
  # Creates the HTTPRequest used when handling the HTTP
  # request. Can be overridden by subclasses.
  def create_request: (Hash[Symbol, untyped] with_webrick_config) -> HTTPRequest

  #
  # Creates the HTTPResponse used when handling the HTTP
  # request. Can be overridden by subclasses.
  def create_response: (Hash[Symbol, untyped] with_webrick_config) -> HTTPResponse

  class MountTable
    type value_type = [singleton(HTTPServlet::AbstractServlet), Array[untyped]]

    @tab: Hash[String, value_type]

    @scanner: Regexp

    def initialize: () -> void

    def []: (String dir) -> value_type

    def []=: (String dir, value_type val) -> value_type

    def delete: (String dir) -> value_type

    def scan: (String path) -> [String, String]

    private

    def compile: () -> void

    def normalize: (String dir) -> String
  end
end

end