module Net
  class Protocol
    VERSION: String
  end

  class ProtocolError < StandardError
  end

  class ProtoSyntaxError < ProtocolError
  end

  class ProtoFatalError < ProtocolError
  end

  class ProtoUnknownError < ProtocolError
  end

  class ProtoServerError < ProtocolError
  end

  class ProtoAuthError < ProtocolError
  end

  class ProtoCommandError < ProtocolError
  end

  class ProtoRetriableError < ProtocolError
  end

  class HTTPBadResponse < StandardError
  end

  class HTTPHeaderSyntaxError < StandardError
  end

  # <!-- rdoc-file=lib/net/protocol.rb -->
  # OpenTimeout, a subclass of Timeout::Error, is raised if a connection cannot be
  # created within the open_timeout.
  #
  class OpenTimeout < Timeout::Error
  end

  # <!-- rdoc-file=lib/net/protocol.rb -->
  # ReadTimeout, a subclass of Timeout::Error, is raised if a chunk of the
  # response cannot be read within the read_timeout.
  #
  class ReadTimeout < Timeout::Error
  end

  # <!-- rdoc-file=lib/net/protocol.rb -->
  # WriteTimeout, a subclass of Timeout::Error, is raised if a chunk of the
  # response cannot be written within the write_timeout.  Not raised on Windows.
  #
  class WriteTimeout < Timeout::Error
  end

  # <!-- rdoc-file=lib/net/http.rb -->
  # ## An HTTP client API for Ruby.
  #
  # Net::HTTP provides a rich library which can be used to build HTTP user-agents.
  #  For more details about HTTP see
  # [RFC2616](http://www.ietf.org/rfc/rfc2616.txt).
  #
  # Net::HTTP is designed to work closely with URI.  URI::HTTP#host,
  # URI::HTTP#port and URI::HTTP#request_uri are designed to work with Net::HTTP.
  #
  # If you are only performing a few GET requests you should try OpenURI.
  #
  # ## Simple Examples
  #
  # All examples assume you have loaded Net::HTTP with:
  #
  #     require 'net/http'
  #
  # This will also require 'uri' so you don't need to require it separately.
  #
  # The Net::HTTP methods in the following section do not persist connections.
  # They are not recommended if you are performing many HTTP requests.
  #
  # ### GET
  #
  #     Net::HTTP.get('example.com', '/index.html') # => String
  #
  # ### GET by URI
  #
  #     uri = URI('http://example.com/index.html?count=10')
  #     Net::HTTP.get(uri) # => String
  #
  # ### GET with Dynamic Parameters
  #
  #     uri = URI('http://example.com/index.html')
  #     params = { :limit => 10, :page => 3 }
  #     uri.query = URI.encode_www_form(params)
  #
  #     res = Net::HTTP.get_response(uri)
  #     puts res.body if res.is_a?(Net::HTTPSuccess)
  #
  # ### POST
  #
  #     uri = URI('http://www.example.com/search.cgi')
  #     res = Net::HTTP.post_form(uri, 'q' => 'ruby', 'max' => '50')
  #     puts res.body
  #
  # ### POST with Multiple Values
  #
  #     uri = URI('http://www.example.com/search.cgi')
  #     res = Net::HTTP.post_form(uri, 'q' => ['ruby', 'perl'], 'max' => '50')
  #     puts res.body
  #
  # ## How to use Net::HTTP
  #
  # The following example code can be used as the basis of an HTTP user-agent
  # which can perform a variety of request types using persistent connections.
  #
  #     uri = URI('http://example.com/some_path?query=string')
  #
  #     Net::HTTP.start(uri.host, uri.port) do |http|
  #       request = Net::HTTP::Get.new uri
  #
  #       response = http.request request # Net::HTTPResponse object
  #     end
  #
  # Net::HTTP::start immediately creates a connection to an HTTP server which is
  # kept open for the duration of the block.  The connection will remain open for
  # multiple requests in the block if the server indicates it supports persistent
  # connections.
  #
  # If you wish to re-use a connection across multiple HTTP requests without
  # automatically closing it you can use ::new and then call #start and #finish
  # manually.
  #
  # The request types Net::HTTP supports are listed below in the section "HTTP
  # Request Classes".
  #
  # For all the Net::HTTP request objects and shortcut request methods you may
  # supply either a String for the request path or a URI from which Net::HTTP will
  # extract the request path.
  #
  # ### Response Data
  #
  #     uri = URI('http://example.com/index.html')
  #     res = Net::HTTP.get_response(uri)
  #
  #     # Headers
  #     res['Set-Cookie']            # => String
  #     res.get_fields('set-cookie') # => Array
  #     res.to_hash['set-cookie']    # => Array
  #     puts "Headers: #{res.to_hash.inspect}"
  #
  #     # Status
  #     puts res.code       # => '200'
  #     puts res.message    # => 'OK'
  #     puts res.class.name # => 'HTTPOK'
  #
  #     # Body
  #     puts res.body
  #
  # ### Following Redirection
  #
  # Each Net::HTTPResponse object belongs to a class for its response code.
  #
  # For example, all 2XX responses are instances of a Net::HTTPSuccess subclass, a
  # 3XX response is an instance of a Net::HTTPRedirection subclass and a 200
  # response is an instance of the Net::HTTPOK class.  For details of response
  # classes, see the section "HTTP Response Classes" below.
  #
  # Using a case statement you can handle various types of responses properly:
  #
  #     def fetch(uri_str, limit = 10)
  #       # You should choose a better exception.
  #       raise ArgumentError, 'too many HTTP redirects' if limit == 0
  #
  #       response = Net::HTTP.get_response(URI(uri_str))
  #
  #       case response
  #       when Net::HTTPSuccess then
  #         response
  #       when Net::HTTPRedirection then
  #         location = response['location']
  #         warn "redirected to #{location}"
  #         fetch(location, limit - 1)
  #       else
  #         response.value
  #       end
  #     end
  #
  #     print fetch('http://www.ruby-lang.org')
  #
  # ### POST
  #
  # A POST can be made using the Net::HTTP::Post request class.  This example
  # creates a URL encoded POST body:
  #
  #     uri = URI('http://www.example.com/todo.cgi')
  #     req = Net::HTTP::Post.new(uri)
  #     req.set_form_data('from' => '2005-01-01', 'to' => '2005-03-31')
  #
  #     res = Net::HTTP.start(uri.hostname, uri.port) do |http|
  #       http.request(req)
  #     end
  #
  #     case res
  #     when Net::HTTPSuccess, Net::HTTPRedirection
  #       # OK
  #     else
  #       res.value
  #     end
  #
  # To send multipart/form-data use Net::HTTPHeader#set_form:
  #
  #     req = Net::HTTP::Post.new(uri)
  #     req.set_form([['upload', File.open('foo.bar')]], 'multipart/form-data')
  #
  # Other requests that can contain a body such as PUT can be created in the same
  # way using the corresponding request class (Net::HTTP::Put).
  #
  # ### Setting Headers
  #
  # The following example performs a conditional GET using the If-Modified-Since
  # header.  If the files has not been modified since the time in the header a Not
  # Modified response will be returned.  See RFC 2616 section 9.3 for further
  # details.
  #
  #     uri = URI('http://example.com/cached_response')
  #     file = File.stat 'cached_response'
  #
  #     req = Net::HTTP::Get.new(uri)
  #     req['If-Modified-Since'] = file.mtime.rfc2822
  #
  #     res = Net::HTTP.start(uri.hostname, uri.port) {|http|
  #       http.request(req)
  #     }
  #
  #     open 'cached_response', 'w' do |io|
  #       io.write res.body
  #     end if res.is_a?(Net::HTTPSuccess)
  #
  # ### Basic Authentication
  #
  # Basic authentication is performed according to
  # [RFC2617](http://www.ietf.org/rfc/rfc2617.txt).
  #
  #     uri = URI('http://example.com/index.html?key=value')
  #
  #     req = Net::HTTP::Get.new(uri)
  #     req.basic_auth 'user', 'pass'
  #
  #     res = Net::HTTP.start(uri.hostname, uri.port) {|http|
  #       http.request(req)
  #     }
  #     puts res.body
  #
  # ### Streaming Response Bodies
  #
  # By default Net::HTTP reads an entire response into memory.  If you are
  # handling large files or wish to implement a progress bar you can instead
  # stream the body directly to an IO.
  #
  #     uri = URI('http://example.com/large_file')
  #
  #     Net::HTTP.start(uri.host, uri.port) do |http|
  #       request = Net::HTTP::Get.new uri
  #
  #       http.request request do |response|
  #         open 'large_file', 'w' do |io|
  #           response.read_body do |chunk|
  #             io.write chunk
  #           end
  #         end
  #       end
  #     end
  #
  # ### HTTPS
  #
  # HTTPS is enabled for an HTTP connection by Net::HTTP#use_ssl=.
  #
  #     uri = URI('https://secure.example.com/some_path?query=string')
  #
  #     Net::HTTP.start(uri.host, uri.port, :use_ssl => true) do |http|
  #       request = Net::HTTP::Get.new uri
  #       response = http.request request # Net::HTTPResponse object
  #     end
  #
  # Or if you simply want to make a GET request, you may pass in an URI object
  # that has an HTTPS URL. Net::HTTP automatically turns on TLS verification if
  # the URI object has a 'https' URI scheme.
  #
  #     uri = URI('https://example.com/')
  #     Net::HTTP.get(uri) # => String
  #
  # In previous versions of Ruby you would need to require 'net/https' to use
  # HTTPS. This is no longer true.
  #
  # ### Proxies
  #
  # Net::HTTP will automatically create a proxy from the `http_proxy` environment
  # variable if it is present.  To disable use of `http_proxy`, pass `nil` for the
  # proxy address.
  #
  # You may also create a custom proxy:
  #
  #     proxy_addr = 'your.proxy.host'
  #     proxy_port = 8080
  #
  #     Net::HTTP.new('example.com', nil, proxy_addr, proxy_port).start { |http|
  #       # always proxy via your.proxy.addr:8080
  #     }
  #
  # See Net::HTTP.new for further details and examples such as proxies that
  # require a username and password.
  #
  # ### Compression
  #
  # Net::HTTP automatically adds Accept-Encoding for compression of response
  # bodies and automatically decompresses gzip and deflate responses unless a
  # Range header was sent.
  #
  # Compression can be disabled through the Accept-Encoding: identity header.
  #
  # ## HTTP Request Classes
  #
  # Here is the HTTP request class hierarchy.
  #
  # *   Net::HTTPRequest
  #     *   Net::HTTP::Get
  #     *   Net::HTTP::Head
  #     *   Net::HTTP::Post
  #     *   Net::HTTP::Patch
  #     *   Net::HTTP::Put
  #     *   Net::HTTP::Proppatch
  #     *   Net::HTTP::Lock
  #     *   Net::HTTP::Unlock
  #     *   Net::HTTP::Options
  #     *   Net::HTTP::Propfind
  #     *   Net::HTTP::Delete
  #     *   Net::HTTP::Move
  #     *   Net::HTTP::Copy
  #     *   Net::HTTP::Mkcol
  #     *   Net::HTTP::Trace
  #
  #
  #
  # ## HTTP Response Classes
  #
  # Here is HTTP response class hierarchy.  All classes are defined in Net module
  # and are subclasses of Net::HTTPResponse.
  #
  # HTTPUnknownResponse
  # :   For unhandled HTTP extensions
  # HTTPInformation
  # :   1xx
  # HTTPContinue
  # :   100
  # HTTPSwitchProtocol
  # :   101
  # HTTPProcessing
  # :   102
  # HTTPEarlyHints
  # :   103
  # HTTPSuccess
  # :   2xx
  # HTTPOK
  # :   200
  # HTTPCreated
  # :   201
  # HTTPAccepted
  # :   202
  # HTTPNonAuthoritativeInformation
  # :   203
  # HTTPNoContent
  # :   204
  # HTTPResetContent
  # :   205
  # HTTPPartialContent
  # :   206
  # HTTPMultiStatus
  # :   207
  # HTTPAlreadyReported
  # :   208
  # HTTPIMUsed
  # :   226
  # HTTPRedirection
  # :   3xx
  # HTTPMultipleChoices
  # :   300
  # HTTPMovedPermanently
  # :   301
  # HTTPFound
  # :   302
  # HTTPSeeOther
  # :   303
  # HTTPNotModified
  # :   304
  # HTTPUseProxy
  # :   305
  # HTTPTemporaryRedirect
  # :   307
  # HTTPPermanentRedirect
  # :   308
  # HTTPClientError
  # :   4xx
  # HTTPBadRequest
  # :   400
  # HTTPUnauthorized
  # :   401
  # HTTPPaymentRequired
  # :   402
  # HTTPForbidden
  # :   403
  # HTTPNotFound
  # :   404
  # HTTPMethodNotAllowed
  # :   405
  # HTTPNotAcceptable
  # :   406
  # HTTPProxyAuthenticationRequired
  # :   407
  # HTTPRequestTimeOut
  # :   408
  # HTTPConflict
  # :   409
  # HTTPGone
  # :   410
  # HTTPLengthRequired
  # :   411
  # HTTPPreconditionFailed
  # :   412
  # HTTPRequestEntityTooLarge
  # :   413
  # HTTPRequestURITooLong
  # :   414
  # HTTPUnsupportedMediaType
  # :   415
  # HTTPRequestedRangeNotSatisfiable
  # :   416
  # HTTPExpectationFailed
  # :   417
  # HTTPMisdirectedRequest
  # :   421
  # HTTPUnprocessableEntity
  # :   422
  # HTTPLocked
  # :   423
  # HTTPFailedDependency
  # :   424
  # HTTPUpgradeRequired
  # :   426
  # HTTPPreconditionRequired
  # :   428
  # HTTPTooManyRequests
  # :   429
  # HTTPRequestHeaderFieldsTooLarge
  # :   431
  # HTTPUnavailableForLegalReasons
  # :   451
  # HTTPServerError
  # :   5xx
  # HTTPInternalServerError
  # :   500
  # HTTPNotImplemented
  # :   501
  # HTTPBadGateway
  # :   502
  # HTTPServiceUnavailable
  # :   503
  # HTTPGatewayTimeOut
  # :   504
  # HTTPVersionNotSupported
  # :   505
  # HTTPVariantAlsoNegotiates
  # :   506
  # HTTPInsufficientStorage
  # :   507
  # HTTPLoopDetected
  # :   508
  # HTTPNotExtended
  # :   510
  # HTTPNetworkAuthenticationRequired
  # :   511
  #
  #
  # There is also the Net::HTTPBadResponse exception which is raised when there is
  # a protocol error.
  #
  class HTTP < Protocol
    # :stopdoc:
    VERSION: String

    Revision: untyped

    HTTPVersion: String

    HAVE_ZLIB: bool

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - version_1_2()
    # -->
    # Turns on net/http 1.2 (Ruby 1.8) features. Defaults to ON in Ruby 1.8 or
    # later.
    #
    def self.version_1_2: () -> ::TrueClass

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - version_1_2?()
    # -->
    # Returns true if net/http is in version 1.2 mode. Defaults to true.
    #
    def self.version_1_2?: () -> ::TrueClass

    def self.version_1_1?: () -> ::FalseClass

    alias self.is_version_1_1? self.version_1_1?

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - is_version_1_2?()
    # -->
    #
    alias self.is_version_1_2? self.version_1_2?

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - get_print(uri_or_host, path_or_headers = nil, port = nil)
    # -->
    # Gets the body text from the target and outputs it to $stdout.  The target can
    # either be specified as (`uri`, `headers`), or as (`host`, `path`, `port` =
    # 80); so:
    #
    #     Net::HTTP.get_print URI('http://www.example.com/index.html')
    #
    # or:
    #
    #     Net::HTTP.get_print 'www.example.com', '/index.html'
    #
    # you can also specify request headers:
    #
    #     Net::HTTP.get_print URI('http://www.example.com/index.html'), { 'Accept' => 'text/html' }
    #
    def self.get_print: (URI::Generic uri, ?Hash[String, untyped] header) -> void
                      | (String host, String path, ?Integer port) -> void

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - get(uri_or_host, path_or_headers = nil, port = nil)
    # -->
    # Sends a GET request to the target and returns the HTTP response as a string.
    # The target can either be specified as (`uri`, `headers`), or as (`host`,
    # `path`, `port` = 80); so:
    #
    #     print Net::HTTP.get(URI('http://www.example.com/index.html'))
    #
    # or:
    #
    #     print Net::HTTP.get('www.example.com', '/index.html')
    #
    # you can also specify request headers:
    #
    #     Net::HTTP.get(URI('http://www.example.com/index.html'), { 'Accept' => 'text/html' })
    #
    def self.get: (URI::Generic uri, ?Hash[String, untyped] header) -> String
                | (String host, String path, ?Integer port) -> String

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - get_response(uri_or_host, path_or_headers = nil, port = nil, &block)
    # -->
    # Sends a GET request to the target and returns the HTTP response as a
    # Net::HTTPResponse object.  The target can either be specified as (`uri`,
    # `headers`), or as (`host`, `path`, `port` = 80); so:
    #
    #     res = Net::HTTP.get_response(URI('http://www.example.com/index.html'))
    #     print res.body
    #
    # or:
    #
    #     res = Net::HTTP.get_response('www.example.com', '/index.html')
    #     print res.body
    #
    # you can also specify request headers:
    #
    #     Net::HTTP.get_response(URI('http://www.example.com/index.html'), { 'Accept' => 'text/html' })
    #
    def self.get_response: (URI::Generic uri, ?Hash[String, untyped] header) ?{ (Net::HTTPResponse) -> void } -> Net::HTTPResponse
                         | (String host, String path, ?Integer port) -> Net::HTTPResponse

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - post(url, data, header = nil)
    # -->
    # Posts data to the specified URI object.
    #
    # Example:
    #
    #     require 'net/http'
    #     require 'uri'
    #
    #     Net::HTTP.post URI('http://www.example.com/api/search'),
    #                    { "q" => "ruby", "max" => "50" }.to_json,
    #                    "Content-Type" => "application/json"
    #
    def self.post: (URI::Generic url, String data, ?Hash[String, untyped] header) -> Net::HTTPResponse

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - post_form(url, params)
    # -->
    # Posts HTML form data to the specified URI object. The form data must be
    # provided as a Hash mapping from String to String. Example:
    #
    #     { "cmd" => "search", "q" => "ruby", "max" => "50" }
    #
    # This method also does Basic Authentication if and only if `url`.user exists.
    # But userinfo for authentication is deprecated (RFC3986). So this feature will
    # be removed.
    #
    # Example:
    #
    #     require 'net/http'
    #
    #     Net::HTTP.post_form URI('http://www.example.com/search.cgi'),
    #                         { "q" => "ruby", "max" => "50" }
    #
    def self.post_form: (URI::Generic url, Hash[String, untyped] params) -> Net::HTTPResponse

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - default_port()
    # -->
    # The default port to use for HTTP requests; defaults to 80.
    #
    def self.default_port: () -> Integer

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - http_default_port()
    # -->
    # The default port to use for HTTP requests; defaults to 80.
    #
    def self.http_default_port: () -> Integer

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - https_default_port()
    # -->
    # The default port to use for HTTPS requests; defaults to 443.
    #
    def self.https_default_port: () -> Integer

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - HTTP.start(address, port, p_addr, p_port, p_user, p_pass, &block)
    #   - HTTP.start(address, port=nil, p_addr=:ENV, p_port=nil, p_user=nil, p_pass=nil, opt, &block)
    # -->
    # Creates a new Net::HTTP object, then additionally opens the TCP connection and
    # HTTP session.
    #
    # Arguments are the following:
    # *address*
    # :   hostname or IP address of the server
    # *port*
    # :   port of the server
    # *p_addr*
    # :   address of proxy
    # *p_port*
    # :   port of proxy
    # *p_user*
    # :   user of proxy
    # *p_pass*
    # :   pass of proxy
    # *opt*
    # :   optional hash
    #
    #
    # *opt* sets following values by its accessor. The keys are ipaddr, ca_file,
    # ca_path, cert, cert_store, ciphers, keep_alive_timeout,
    # close_on_empty_response, key, open_timeout, read_timeout, write_timeout,
    # ssl_timeout, ssl_version, use_ssl, verify_callback, verify_depth and
    # verify_mode. If you set :use_ssl as true, you can use https and default value
    # of verify_mode is set as OpenSSL::SSL::VERIFY_PEER.
    #
    # If the optional block is given, the newly created Net::HTTP object is passed
    # to it and closed when the block finishes.  In this case, the return value of
    # this method is the return value of the block.  If no block is given, the
    # return value of this method is the newly created Net::HTTP object itself, and
    # the caller is responsible for closing it upon completion using the finish()
    # method.
    #
    def self.start: (String address, ?Integer? port, ?String | :ENV | nil p_addr, ?Integer? p_port, ?String? p_user, ?String? p_pass, ?Hash[Symbol, untyped]? opt) -> Net::HTTP
                  | [T] (String address, ?Integer? port, ?String | :ENV | nil p_addr, ?Integer? p_port, ?String? p_user, ?String? p_pass, ?Hash[Symbol, untyped]? opt) { (Net::HTTP) -> T } -> T

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - newobj(address, port = nil, p_addr = :ENV, p_port = nil, p_user = nil, p_pass = nil, p_no_proxy = nil)
    # -->
    #
    alias self.newobj self.new

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - new(address, port = nil)
    # -->
    # Creates a new Net::HTTP object for the specified server address, without
    # opening the TCP connection or initializing the HTTP session. The `address`
    # should be a DNS hostname or IP address.
    #
    def self.new: (String address, ?Integer? port, ?String | :ENV | nil p_addr, ?Integer? p_port, ?String? p_user, ?String? p_pass, ?untyped? p_no_proxy) -> Net::HTTP

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - inspect()
    # -->
    #
    def inspect: () -> String

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - set_debug_output(output)
    # -->
    # **WARNING** This method opens a serious security hole. Never use this method
    # in production code.
    #
    # Sets an output stream for debugging.
    #
    #     http = Net::HTTP.new(hostname)
    #     http.set_debug_output $stderr
    #     http.start { .... }
    #
    def set_debug_output: (IO output) -> void

    # <!-- rdoc-file=lib/net/http.rb -->
    # The DNS host name or IP address to connect to.
    #
    attr_reader address: String

    # <!-- rdoc-file=lib/net/http.rb -->
    # The port number to connect to.
    #
    attr_reader port: Integer

    # <!-- rdoc-file=lib/net/http.rb -->
    # The local host used to establish the connection.
    #
    attr_accessor local_host: String

    # <!-- rdoc-file=lib/net/http.rb -->
    # The local port used to establish the connection.
    #
    attr_accessor local_port: Integer

    attr_writer proxy_from_env: untyped

    # <!-- rdoc-file=lib/net/http.rb -->
    #
    attr_accessor proxy_address: String?

    # <!-- rdoc-file=lib/net/http.rb -->
    #
    attr_accessor proxy_port: Integer?

    # <!-- rdoc-file=lib/net/http.rb -->
    #
    attr_accessor proxy_user: String?

    # <!-- rdoc-file=lib/net/http.rb -->
    #
    attr_accessor proxy_pass: String?

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - ipaddr()
    # -->
    # The IP address to connect to/used to connect to
    # ----
    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - ipaddr=(addr)
    # -->
    # Set the IP address to connect to
    #
    attr_accessor ipaddr: String?

    # <!-- rdoc-file=lib/net/http.rb -->
    # Number of seconds to wait for the connection to open. Any number may be used,
    # including Floats for fractional seconds. If the HTTP object cannot open a
    # connection in this many seconds, it raises a Net::OpenTimeout exception. The
    # default value is 60 seconds.
    #
    attr_accessor open_timeout: Float | Integer

    # <!-- rdoc-file=lib/net/http.rb -->
    # Number of seconds to wait for one block to be read (via one read(2) call). Any
    # number may be used, including Floats for fractional seconds. If the HTTP
    # object cannot read data in this many seconds, it raises a Net::ReadTimeout
    # exception. The default value is 60 seconds.
    # ----
    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - read_timeout=(sec)
    # -->
    # Setter for the read_timeout attribute.
    #
    attr_accessor read_timeout: Float | Integer

    # <!-- rdoc-file=lib/net/http.rb -->
    # Number of seconds to wait for one block to be written (via one write(2) call).
    # Any number may be used, including Floats for fractional seconds. If the HTTP
    # object cannot write data in this many seconds, it raises a Net::WriteTimeout
    # exception. The default value is 60 seconds. Net::WriteTimeout is not raised on
    # Windows.
    # ----
    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - write_timeout=(sec)
    # -->
    # Setter for the write_timeout attribute.
    #
    attr_accessor write_timeout: Float | Integer

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - max_retries=(retries)
    # -->
    # Maximum number of times to retry an idempotent request in case of
    # Net::ReadTimeout, IOError, EOFError, Errno::ECONNRESET, Errno::ECONNABORTED,
    # Errno::EPIPE, OpenSSL::SSL::SSLError, Timeout::Error. Should be a non-negative
    # integer number. Zero means no retries. The default value is 1.
    #
    attr_accessor max_retries: Integer

    # <!-- rdoc-file=lib/net/http.rb -->
    # Seconds to wait for 100 Continue response. If the HTTP object does not receive
    # a response in this many seconds it sends the request body. The default value
    # is `nil`.
    # ----
    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - continue_timeout=(sec)
    # -->
    # Setter for the continue_timeout attribute.
    #
    attr_accessor continue_timeout: Float | Integer | nil

    # <!-- rdoc-file=lib/net/http.rb -->
    # Seconds to reuse the connection of the previous request. If the idle time is
    # less than this Keep-Alive Timeout, Net::HTTP reuses the TCP/IP socket used by
    # the previous communication. The default value is 2 seconds.
    #
    attr_accessor keep_alive_timeout: Float | Integer

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - started?()
    # -->
    # Returns true if the HTTP session has been started.
    #
    def started?: () -> bool

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - active?()
    # -->
    #
    alias active? started?

    attr_accessor close_on_empty_response: untyped

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - use_ssl?()
    # -->
    # Returns true if SSL/TLS is being used with HTTP.
    #
    def use_ssl?: () -> bool

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - use_ssl=(flag)
    # -->
    # Turn on/off SSL. This flag must be set before starting session. If you change
    # use_ssl value after session started, a Net::HTTP object raises IOError.
    #
    def use_ssl=: (boolish flag) -> void

    SSL_IVNAMES: Array[untyped]

    SSL_ATTRIBUTES: Array[Symbol]

    # <!-- rdoc-file=lib/net/http.rb -->
    # Sets path of a CA certification file in PEM format.
    #
    # The file can contain several CA certificates.
    #
    attr_accessor ca_file: untyped

    # <!-- rdoc-file=lib/net/http.rb -->
    # Sets path of a CA certification directory containing certifications in PEM
    # format.
    #
    attr_accessor ca_path: untyped

    # <!-- rdoc-file=lib/net/http.rb -->
    # Sets an OpenSSL::X509::Certificate object as client certificate. (This method
    # is appeared in Michal Rokos's OpenSSL extension).
    #
    attr_accessor cert: untyped

    # <!-- rdoc-file=lib/net/http.rb -->
    # Sets the X509::Store to verify peer certificate.
    #
    attr_accessor cert_store: untyped

    # <!-- rdoc-file=lib/net/http.rb -->
    # Sets the available ciphers.  See OpenSSL::SSL::SSLContext#ciphers=
    #
    attr_accessor ciphers: untyped

    # <!-- rdoc-file=lib/net/http.rb -->
    # Sets the extra X509 certificates to be added to the certificate chain. See
    # OpenSSL::SSL::SSLContext#extra_chain_cert=
    #
    attr_accessor extra_chain_cert: untyped

    # <!-- rdoc-file=lib/net/http.rb -->
    # Sets an OpenSSL::PKey::RSA or OpenSSL::PKey::DSA object. (This method is
    # appeared in Michal Rokos's OpenSSL extension.)
    #
    attr_accessor key: untyped

    # <!-- rdoc-file=lib/net/http.rb -->
    # Sets the SSL timeout seconds.
    #
    attr_accessor ssl_timeout: untyped

    # <!-- rdoc-file=lib/net/http.rb -->
    # Sets the SSL version.  See OpenSSL::SSL::SSLContext#ssl_version=
    #
    attr_accessor ssl_version: untyped

    # <!-- rdoc-file=lib/net/http.rb -->
    # Sets the minimum SSL version.  See OpenSSL::SSL::SSLContext#min_version=
    #
    attr_accessor min_version: untyped

    # <!-- rdoc-file=lib/net/http.rb -->
    # Sets the maximum SSL version.  See OpenSSL::SSL::SSLContext#max_version=
    #
    attr_accessor max_version: untyped

    # <!-- rdoc-file=lib/net/http.rb -->
    # Sets the verify callback for the server certification verification.
    #
    attr_accessor verify_callback: untyped

    # <!-- rdoc-file=lib/net/http.rb -->
    # Sets the maximum depth for the certificate chain verification.
    #
    attr_accessor verify_depth: untyped

    # <!-- rdoc-file=lib/net/http.rb -->
    # Sets the flags for server the certification verification at beginning of
    # SSL/TLS session.
    #
    # OpenSSL::SSL::VERIFY_NONE or OpenSSL::SSL::VERIFY_PEER are acceptable.
    #
    attr_accessor verify_mode: untyped

    # <!-- rdoc-file=lib/net/http.rb -->
    # Sets to check the server certificate is valid for the hostname. See
    # OpenSSL::SSL::SSLContext#verify_hostname=
    #
    attr_accessor verify_hostname: untyped

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - peer_cert()
    # -->
    # Returns the X.509 certificates the server presented.
    #
    def peer_cert: () -> (nil | untyped)

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - start() { |http| ... }
    # -->
    # Opens a TCP connection and HTTP session.
    #
    # When this method is called with a block, it passes the Net::HTTP object to the
    # block, and closes the TCP connection and HTTP session after the block has been
    # executed.
    #
    # When called with a block, it returns the return value of the block; otherwise,
    # it returns self.
    #
    def start: [T] () { (Net::HTTP) -> T } -> T
             | () -> Net::HTTP

    public

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - finish()
    # -->
    # Finishes the HTTP session and closes the TCP connection. Raises IOError if the
    # session has not been started.
    #
    def finish: () -> void

    public

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - Proxy(p_addr = :ENV, p_port = nil, p_user = nil, p_pass = nil)
    # -->
    # Creates an HTTP proxy class which behaves like Net::HTTP, but performs all
    # access via the specified proxy.
    #
    # This class is obsolete.  You may pass these same parameters directly to
    # Net::HTTP.new.  See Net::HTTP.new for details of the arguments.
    #
    def self.Proxy: (?Symbol | String p_addr, ?Integer? p_port, ?String? p_user, ?String? p_pass) -> untyped

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - proxy_class?()
    # -->
    # returns true if self is a class which was created by HTTP::Proxy.
    #
    def self.proxy_class?: () -> bool

    # <!-- rdoc-file=lib/net/http.rb -->
    # Address of proxy host. If Net::HTTP does not use a proxy, nil.
    #
    attr_reader self.proxy_address: String?

    # <!-- rdoc-file=lib/net/http.rb -->
    # Port number of proxy host. If Net::HTTP does not use a proxy, nil.
    #
    attr_reader self.proxy_port: Integer?

    # <!-- rdoc-file=lib/net/http.rb -->
    # User name for accessing proxy. If Net::HTTP does not use a proxy, nil.
    #
    attr_reader self.proxy_user: String?

    # <!-- rdoc-file=lib/net/http.rb -->
    # User password for accessing proxy. If Net::HTTP does not use a proxy, nil.
    #
    attr_reader self.proxy_pass: String?

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - proxy?()
    # -->
    # True if requests for this connection will be proxied
    #
    def proxy?: () -> bool

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - proxy_from_env?()
    # -->
    # True if the proxy for this connection is determined from the environment
    #
    def proxy_from_env?: () -> bool

    def proxy_uri: () -> (nil | URI::Generic)

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - proxyaddr()
    # -->
    #
    alias proxyaddr proxy_address

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - proxyport()
    # -->
    #
    alias proxyport proxy_port

    public

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - get(path, initheader = nil, dest = nil) { |body_segment| ... }
    # -->
    # Retrieves data from `path` on the connected-to host which may be an absolute
    # path String or a URI to extract the path from.
    #
    # `initheader` must be a Hash like { 'Accept' => '**/**', ... }, and it defaults
    # to an empty hash. If `initheader` doesn't have the key 'accept-encoding', then
    # a value of "gzip;q=1.0,deflate;q=0.6,identity;q=0.3" is used, so that gzip
    # compression is used in preference to deflate compression, which is used in
    # preference to no compression. Ruby doesn't have libraries to support the
    # compress (Lempel-Ziv) compression, so that is not supported.  The intent of
    # this is to reduce bandwidth by default.   If this routine sets up compression,
    # then it does the decompression also, removing the header as well to prevent
    # confusion.  Otherwise it leaves the body as it found it.
    #
    # This method returns a Net::HTTPResponse object.
    #
    # If called with a block, yields each fragment of the entity body in turn as a
    # string as it is read from the socket.  Note that in this case, the returned
    # response object will **not** contain a (meaningful) body.
    #
    # `dest` argument is obsolete. It still works but you must not use it.
    #
    # This method never raises an exception.
    #
    #     response = http.get('/index.html')
    #
    #     # using block
    #     File.open('result.txt', 'w') {|f|
    #       http.get('/~foo/') do |str|
    #         f.write str
    #       end
    #     }
    #
    def get: (String path, ?Hash[String, untyped] initheader, ?bot dest) ?{ (String body_segment) -> void } -> Net::HTTPResponse

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - head(path, initheader = nil)
    # -->
    # Gets only the header from `path` on the connected-to host. `header` is a Hash
    # like { 'Accept' => '**/**', ... }.
    #
    # This method returns a Net::HTTPResponse object.
    #
    # This method never raises an exception.
    #
    #     response = nil
    #     Net::HTTP.start('some.www.server', 80) {|http|
    #       response = http.head('/index.html')
    #     }
    #     p response['content-type']
    #
    def head: (String path, ?Hash[String, untyped] initheader) -> Net::HTTPResponse

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - post(path, data, initheader = nil, dest = nil) { |body_segment| ... }
    # -->
    # Posts `data` (must be a String) to `path`. `header` must be a Hash like {
    # 'Accept' => '**/**', ... }.
    #
    # This method returns a Net::HTTPResponse object.
    #
    # If called with a block, yields each fragment of the entity body in turn as a
    # string as it is read from the socket.  Note that in this case, the returned
    # response object will **not** contain a (meaningful) body.
    #
    # `dest` argument is obsolete. It still works but you must not use it.
    #
    # This method never raises exception.
    #
    #     response = http.post('/cgi-bin/search.rb', 'query=foo')
    #
    #     # using block
    #     File.open('result.txt', 'w') {|f|
    #       http.post('/cgi-bin/search.rb', 'query=foo') do |str|
    #         f.write str
    #       end
    #     }
    #
    # You should set Content-Type: header field for POST. If no Content-Type: field
    # given, this method uses "application/x-www-form-urlencoded" by default.
    #
    def post: (String path, String data, ?Hash[String, untyped] initheader, ?bot dest) ?{ (String body_segment) -> void } -> Net::HTTPResponse

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - patch(path, data, initheader = nil, dest = nil) { |body_segment| ... }
    # -->
    # Sends a PATCH request to the `path` and gets a response, as an HTTPResponse
    # object.
    #
    def patch: (String path, String data, ?Hash[String, untyped] initheader, ?bot dest) ?{ (String body_segment) -> void } -> Net::HTTPResponse

    def put: (String path, String data, ?Hash[String, untyped] initheader) -> Net::HTTPResponse

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - proppatch(path, body, initheader = nil)
    # -->
    # Sends a PROPPATCH request to the `path` and gets a response, as an
    # HTTPResponse object.
    #
    def proppatch: (String path, String body, ?Hash[String, untyped] initheader) -> Net::HTTPResponse

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - lock(path, body, initheader = nil)
    # -->
    # Sends a LOCK request to the `path` and gets a response, as an HTTPResponse
    # object.
    #
    def lock: (String path, String body, ?Hash[String, untyped] initheader) -> Net::HTTPResponse

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - unlock(path, body, initheader = nil)
    # -->
    # Sends a UNLOCK request to the `path` and gets a response, as an HTTPResponse
    # object.
    #
    def unlock: (String path, String body, ?Hash[String, untyped] initheader) -> Net::HTTPResponse

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - options(path, initheader = nil)
    # -->
    # Sends a OPTIONS request to the `path` and gets a response, as an HTTPResponse
    # object.
    #
    def options: (String path, ?Hash[String, untyped] initheader) -> Net::HTTPResponse

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - propfind(path, body = nil, initheader = {'Depth' => '0'})
    # -->
    # Sends a PROPFIND request to the `path` and gets a response, as an HTTPResponse
    # object.
    #
    def propfind: (String path, ?untyped? body, ?Hash[String, untyped] initheader) -> Net::HTTPResponse

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - delete(path, initheader = {'Depth' => 'Infinity'})
    # -->
    # Sends a DELETE request to the `path` and gets a response, as an HTTPResponse
    # object.
    #
    def delete: (String path, ?Hash[String, untyped] initheader) -> Net::HTTPResponse

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - move(path, initheader = nil)
    # -->
    # Sends a MOVE request to the `path` and gets a response, as an HTTPResponse
    # object.
    #
    def move: (String path, ?Hash[String, untyped] initheader) -> Net::HTTPResponse

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - copy(path, initheader = nil)
    # -->
    # Sends a COPY request to the `path` and gets a response, as an HTTPResponse
    # object.
    #
    def copy: (String path, ?Hash[String, untyped] initheader) -> Net::HTTPResponse

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - mkcol(path, body = nil, initheader = nil)
    # -->
    # Sends a MKCOL request to the `path` and gets a response, as an HTTPResponse
    # object.
    #
    def mkcol: (String path, ?untyped? body, ?Hash[String, untyped] initheader) -> Net::HTTPResponse

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - trace(path, initheader = nil)
    # -->
    # Sends a TRACE request to the `path` and gets a response, as an HTTPResponse
    # object.
    #
    def trace: (String path, ?Hash[String, untyped] initheader) -> Net::HTTPResponse

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - request_get(path, initheader = nil) { |response| ... }
    # -->
    # Sends a GET request to the `path`. Returns the response as a Net::HTTPResponse
    # object.
    #
    # When called with a block, passes an HTTPResponse object to the block. The body
    # of the response will not have been read yet; the block can process it using
    # HTTPResponse#read_body, if desired.
    #
    # Returns the response.
    #
    # This method never raises Net::* exceptions.
    #
    #     response = http.request_get('/index.html')
    #     # The entity body is already read in this case.
    #     p response['content-type']
    #     puts response.body
    #
    #     # Using a block
    #     http.request_get('/index.html') {|response|
    #       p response['content-type']
    #       response.read_body do |str|   # read body now
    #         print str
    #       end
    #     }
    #
    def request_get: (String path, ?Hash[String, untyped] initheader) ?{ (Net::HTTPResponse response) -> void } -> Net::HTTPResponse

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - request_head(path, initheader = nil, &block)
    # -->
    # Sends a HEAD request to the `path` and returns the response as a
    # Net::HTTPResponse object.
    #
    # Returns the response.
    #
    # This method never raises Net::* exceptions.
    #
    #     response = http.request_head('/index.html')
    #     p response['content-type']
    #
    def request_head: (String path, ?Hash[String, untyped] initheader) ?{ (Net::HTTPResponse response) -> void } -> Net::HTTPResponse

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - request_post(path, data, initheader = nil) { |response| ... }
    # -->
    # Sends a POST request to the `path`.
    #
    # Returns the response as a Net::HTTPResponse object.
    #
    # When called with a block, the block is passed an HTTPResponse object.  The
    # body of that response will not have been read yet; the block can process it
    # using HTTPResponse#read_body, if desired.
    #
    # Returns the response.
    #
    # This method never raises Net::* exceptions.
    #
    #     # example
    #     response = http.request_post('/cgi-bin/nice.rb', 'datadatadata...')
    #     p response.status
    #     puts response.body          # body is already read in this case
    #
    #     # using block
    #     http.request_post('/cgi-bin/nice.rb', 'datadatadata...') {|response|
    #       p response.status
    #       p response['content-type']
    #       response.read_body do |str|   # read body now
    #         print str
    #       end
    #     }
    #
    def request_post: (String path, String data, ?Hash[String, untyped] initheader) ?{ (Net::HTTPResponse response) -> void } -> Net::HTTPResponse

    def request_put: (String path, String data, ?Hash[String, untyped] initheader) ?{ (Net::HTTPResponse response) -> void } -> Net::HTTPResponse

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - get2(path, initheader = nil)
    # -->
    #
    alias get2 request_get

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - head2(path, initheader = nil, &block)
    # -->
    #
    alias head2 request_head

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - post2(path, data, initheader = nil)
    # -->
    #
    alias post2 request_post

    alias put2 request_put

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - send_request(name, path, data = nil, header = nil)
    # -->
    # Sends an HTTP request to the HTTP server. Also sends a DATA string if `data`
    # is given.
    #
    # Returns a Net::HTTPResponse object.
    #
    # This method never raises Net::* exceptions.
    #
    #     response = http.send_request('GET', '/index.html')
    #     puts response.body
    #
    def send_request: (String name, String path, ?String? data, ?Hash[String, untyped]? header) -> Net::HTTPResponse

    # <!--
    #   rdoc-file=lib/net/http.rb
    #   - request(req, body = nil) { |response| ... }
    # -->
    # Sends an HTTPRequest object `req` to the HTTP server.
    #
    # If `req` is a Net::HTTP::Post or Net::HTTP::Put request containing data, the
    # data is also sent. Providing data for a Net::HTTP::Head or Net::HTTP::Get
    # request results in an ArgumentError.
    #
    # Returns an HTTPResponse object.
    #
    # When called with a block, passes an HTTPResponse object to the block. The body
    # of the response will not have been read yet; the block can process it using
    # HTTPResponse#read_body, if desired.
    #
    # This method never raises Net::* exceptions.
    #
    def request: (Net::HTTPRequest req, ?String? body) ?{ (Net::HTTPResponse response) -> void } -> Net::HTTPResponse
  end

  # <!-- rdoc-file=lib/net/http/generic_request.rb -->
  # HTTPGenericRequest is the parent of the Net::HTTPRequest class. Do not use
  # this directly; use a subclass of Net::HTTPRequest.
  #
  # Mixes in the Net::HTTPHeader module to provide easier access to HTTP headers.
  #
  class HTTPGenericRequest
    include Net::HTTPHeader

    # <!--
    #   rdoc-file=lib/net/http/generic_request.rb
    #   - new(m, reqbody, resbody, uri_or_path, initheader = nil)
    # -->
    #
    def initialize: (String m, boolish reqbody, boolish resbody, URI::Generic | String uri_or_path, ?Hash[String, untyped] initheader) -> Net::HTTP

    attr_reader method: String

    attr_reader path: String

    attr_reader uri: URI::Generic

    # <!-- rdoc-file=lib/net/http/generic_request.rb -->
    # Automatically set to false if the user sets the Accept-Encoding header. This
    # indicates they wish to handle Content-encoding in responses themselves.
    #
    attr_reader decode_content: bool

    # <!--
    #   rdoc-file=lib/net/http/generic_request.rb
    #   - inspect()
    # -->
    #
    def inspect: () -> String

    def []=: (untyped key, untyped val) -> void

    # <!--
    #   rdoc-file=lib/net/http/generic_request.rb
    #   - request_body_permitted?()
    # -->
    #
    def request_body_permitted?: () -> bool

    # <!--
    #   rdoc-file=lib/net/http/generic_request.rb
    #   - response_body_permitted?()
    # -->
    #
    def response_body_permitted?: () -> bool

    # <!--
    #   rdoc-file=lib/net/http/generic_request.rb
    #   - body_exist?()
    # -->
    #
    def body_exist?: () -> bool

    # <!--
    #   rdoc-file=lib/net/http/generic_request.rb
    #   - body=(str)
    # -->
    #
    attr_accessor body: String?

    # <!--
    #   rdoc-file=lib/net/http/generic_request.rb
    #   - body_stream=(input)
    # -->
    #
    attr_accessor body_stream: untyped
  end

  # <!-- rdoc-file=lib/net/http/header.rb -->
  # The HTTPHeader module defines methods for reading and writing HTTP headers.
  #
  # It is used as a mixin by other classes, to provide hash-like access to HTTP
  # header values. Unlike raw hash access, HTTPHeader provides access via
  # case-insensitive keys. It also provides methods for accessing commonly-used
  # HTTP header values in more convenient formats.
  #
  module HTTPHeader
    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - initialize_http_header(initheader)
    # -->
    #
    def initialize_http_header: (Hash[untyped, untyped] initheader) -> void

    def size: () -> Integer

    alias length size

    type key = String | Symbol

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - [](key)
    # -->
    # Returns the header field corresponding to the case-insensitive key. For
    # example, a key of "Content-Type" might return "text/html"
    #
    def []: (key key) -> (nil | String)

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - []=(key, val)
    # -->
    # Sets the header field corresponding to the case-insensitive key.
    #
    def []=: (key key, untyped val) -> void

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - add_field(key, val)
    # -->
    # Ruby 1.8.3
    # :   Adds a value to a named header field, instead of replacing its value.
    #     Second argument `val` must be a String. See also #[]=, #[] and
    #     #get_fields.
    #
    #         request.add_field 'X-My-Header', 'a'
    #         p request['X-My-Header']              #=> "a"
    #         p request.get_fields('X-My-Header')   #=> ["a"]
    #         request.add_field 'X-My-Header', 'b'
    #         p request['X-My-Header']              #=> "a, b"
    #         p request.get_fields('X-My-Header')   #=> ["a", "b"]
    #         request.add_field 'X-My-Header', 'c'
    #         p request['X-My-Header']              #=> "a, b, c"
    #         p request.get_fields('X-My-Header')   #=> ["a", "b", "c"]
    #
    def add_field: (key key, untyped val) -> void

    private

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - set_field(key, val)
    # -->
    #
    def set_field: (key key, untyped val) -> void

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - append_field_value(ary, val)
    # -->
    #
    def append_field_value: (untyped ary, untyped val) -> void

    public

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - get_fields(key)
    # -->
    # Ruby 1.8.3
    # :   Returns an array of header field strings corresponding to the
    #     case-insensitive `key`.  This method allows you to get duplicated header
    #     fields without any processing.  See also #[].
    #
    #         p response.get_fields('Set-Cookie')
    #           #=> ["session=al98axx; expires=Fri, 31-Dec-1999 23:58:23",
    #                "query=rubyscript; expires=Fri, 31-Dec-1999 23:58:23"]
    #         p response['Set-Cookie']
    #           #=> "session=al98axx; expires=Fri, 31-Dec-1999 23:58:23, query=rubyscript; expires=Fri, 31-Dec-1999 23:58:23"
    #
    def get_fields: (key key) -> (nil | Array[String])

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - fetch(key, *args) { |key| ... }
    # -->
    # Returns the header field corresponding to the case-insensitive key. Returns
    # the default value `args`, or the result of the block, or raises an IndexError
    # if there's no header field named `key` See Hash#fetch
    #
    def fetch: (key key) -> String
             | (key key, untyped) -> untyped
             | (key key) { (String) -> untyped } -> untyped

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - each_header() { |key| ... }
    # -->
    # Iterates through the header names and values, passing in the name and value to
    # the code block supplied.
    #
    # Returns an enumerator if no block is given.
    #
    # Example:
    #
    #     response.header.each_header {|key,value| puts "#{key} = #{value}" }
    #
    def each_header: () { (String, String) -> untyped } -> Hash[String, Array[String]]
                   | () -> Enumerator[[ String, String ], Hash[String, Array[String]]]

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - each()
    # -->
    #
    alias each each_header

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - each_name() { |key| ... }
    # -->
    # Iterates through the header names in the header, passing each header name to
    # the code block.
    #
    # Returns an enumerator if no block is given.
    #
    def each_name: () { (String) -> untyped } -> Hash[String, Array[String]]
                 | () -> Enumerator[String, Hash[String, Array[String]]]

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - each_key()
    # -->
    #
    alias each_key each_name

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - each_capitalized_name() { |key| ... }
    # -->
    # Iterates through the header names in the header, passing capitalized header
    # names to the code block.
    #
    # Note that header names are capitalized systematically; capitalization may not
    # match that used by the remote HTTP server in its response.
    #
    # Returns an enumerator if no block is given.
    #
    def each_capitalized_name: () { (String) -> untyped } -> Hash[String, Array[String]]
                             | () -> Enumerator[String, Hash[String, Array[String]]]

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - each_value() { |value| ... }
    # -->
    # Iterates through header values, passing each value to the code block.
    #
    # Returns an enumerator if no block is given.
    #
    def each_value: () { (String) -> untyped } -> Hash[String, Array[String]]
                  | () -> Enumerator[String, Hash[String, Array[String]]]

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - delete(key)
    # -->
    # Removes a header field, specified by case-insensitive key.
    #
    def delete: (key key) -> (Array[String] | nil)

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - key?(key)
    # -->
    # true if `key` header exists.
    #
    def key?: (key key) -> bool

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - to_hash()
    # -->
    # Returns a Hash consisting of header names and array of values. e.g.
    # {"cache-control" => ["private"],
    #     "content-type" => ["text/html"],
    #     "date" => ["Wed, 22 Jun 2005 22:11:50 GMT"]}
    #
    def to_hash: () -> Hash[String, Array[String]]

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - each_capitalized() { |capitalize(k), join(', ')| ... }
    # -->
    # As for #each_header, except the keys are provided in capitalized form.
    #
    # Note that header names are capitalized systematically; capitalization may not
    # match that used by the remote HTTP server in its response.
    #
    # Returns an enumerator if no block is given.
    #
    def each_capitalized: () { (String, String) -> untyped } -> Hash[String, Array[String]]
                        | () -> Enumerator[[ String, String ], Hash[String, Array[String]]]

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - canonical_each()
    # -->
    #
    alias canonical_each each_capitalized

    private

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - capitalize(name)
    # -->
    #
    def capitalize: (key name) -> String

    public

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - range()
    # -->
    # Returns an Array of Range objects which represent the Range: HTTP header
    # field, or `nil` if there is no such header.
    #
    def range: () -> (nil | Array[Range[Integer]])

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - set_range(r, e = nil)
    # -->
    # Sets the HTTP Range: header. Accepts either a Range object as a single
    # argument, or a beginning index and a length from that index. Example:
    #
    #     req.range = (0..1023)
    #     req.set_range 0, 1023
    #
    def set_range: (Range[Integer] | Numeric r, ?Integer? e) -> Range[Integer]

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - range=(r, e = nil)
    # -->
    #
    alias range= set_range

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - content_length()
    # -->
    # Returns an Integer object which represents the HTTP Content-Length: header
    # field, or `nil` if that field was not provided.
    #
    def content_length: () -> (nil | Integer)

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - content_length=(len)
    # -->
    #
    def content_length=: (Integer len) -> void

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - chunked?()
    # -->
    # Returns "true" if the "transfer-encoding" header is present and set to
    # "chunked".  This is an HTTP/1.1 feature, allowing the content to be sent in
    # "chunks" without at the outset stating the entire content length.
    #
    def chunked?: () -> bool

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - content_range()
    # -->
    # Returns a Range object which represents the value of the Content-Range: header
    # field. For a partial entity body, this indicates where this fragment fits
    # inside the full entity body, as range of byte offsets.
    #
    def content_range: () -> (Range[Integer] | nil)

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - range_length()
    # -->
    # The length of the range represented in Content-Range: header.
    #
    def range_length: () -> (nil | Integer)

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - content_type()
    # -->
    # Returns a content type string such as "text/html". This method returns nil if
    # Content-Type: header field does not exist.
    #
    def content_type: () -> (nil | String)

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - main_type()
    # -->
    # Returns a content type string such as "text". This method returns nil if
    # Content-Type: header field does not exist.
    #
    def main_type: () -> (nil | String)

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - sub_type()
    # -->
    # Returns a content type string such as "html". This method returns nil if
    # Content-Type: header field does not exist or sub-type is not given (e.g.
    # "Content-Type: text").
    #
    def sub_type: () -> (nil | String)

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - type_params()
    # -->
    # Any parameters specified for the content type, returned as a Hash. For
    # example, a header of Content-Type: text/html; charset=EUC-JP would result in
    # type_params returning {'charset' => 'EUC-JP'}
    #
    def type_params: () -> Hash[untyped, untyped]

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - set_content_type(type, params = {})
    # -->
    # Sets the content type in an HTTP header. The `type` should be a full HTTP
    # content type, e.g. "text/html". The `params` are an optional Hash of
    # parameters to add after the content type, e.g. {'charset' => 'iso-8859-1'}
    #
    def set_content_type: (key `type`, ?Hash[untyped, untyped] params) -> void

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - content_type=(type, params = {})
    # -->
    #
    alias content_type= set_content_type

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - set_form_data(params, sep = '&')
    # -->
    # Set header fields and a body from HTML form data. `params` should be an Array
    # of Arrays or a Hash containing HTML form data. Optional argument `sep` means
    # data record separator.
    #
    # Values are URL encoded as necessary and the content-type is set to
    # application/x-www-form-urlencoded
    #
    # Example:
    #     http.form_data = {"q" => "ruby", "lang" => "en"}
    #     http.form_data = {"q" => ["ruby", "perl"], "lang" => "en"}
    #     http.set_form_data({"q" => "ruby", "lang" => "en"}, ';')
    #
    def set_form_data: (Hash[untyped, untyped] params, ?String sep) -> void

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - form_data=(params, sep = '&')
    # -->
    #
    alias form_data= set_form_data

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - set_form(params, enctype='application/x-www-form-urlencoded', formopt={})
    # -->
    # Set an HTML form data set.
    # `params`
    # :   The form data to set, which should be an enumerable. See below for more
    #     details.
    # `enctype`
    # :   The content type to use to encode the form submission, which should be
    #     application/x-www-form-urlencoded or multipart/form-data.
    # `formopt`
    # :   An options hash, supporting the following options:
    #     :boundary
    # :       The boundary of the multipart message. If not given, a random boundary
    #         will be used.
    #     :charset
    # :       The charset of the form submission. All field names and values of
    #         non-file fields should be encoded with this charset.
    #
    #
    #
    # Each item of params should respond to `each` and yield 2-3 arguments, or an
    # array of 2-3 elements. The arguments yielded should be:
    #     * The name of the field.
    #     * The value of the field, it should be a String or a File or IO-like.
    #     * An options hash, supporting the following options, only
    #       used for file uploads:
    #       :filename :: The name of the file to use.
    #       :content_type :: The content type of the uploaded file.
    #
    # Each item is a file field or a normal field. If `value` is a File object or
    # the `opt` hash has a :filename key, the item is treated as a file field.
    #
    # If Transfer-Encoding is set as chunked, this sends the request using chunked
    # encoding. Because chunked encoding is HTTP/1.1 feature, you should confirm
    # that the server supports HTTP/1.1 before using chunked encoding.
    #
    # Example:
    #     req.set_form([["q", "ruby"], ["lang", "en"]])
    #
    #     req.set_form({"f"=>File.open('/path/to/filename')},
    #                  "multipart/form-data",
    #                  charset: "UTF-8",
    #     )
    #
    #     req.set_form([["f",
    #                    File.open('/path/to/filename.bar'),
    #                    {filename: "other-filename.foo"}
    #                  ]],
    #                  "multipart/form-data",
    #     )
    #
    # See also RFC 2388, RFC 2616, HTML 4.01, and HTML5
    #
    def set_form: (Hash[untyped, untyped] params, ?String enctype, ?Hash[untyped, untyped] formopt) -> void

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - basic_auth(account, password)
    # -->
    # Set the Authorization: header for "Basic" authorization.
    #
    def basic_auth: (String account, String password) -> void

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - proxy_basic_auth(account, password)
    # -->
    # Set Proxy-Authorization: header for "Basic" authorization.
    #
    def proxy_basic_auth: (String account, String password) -> void

    private

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - basic_encode(account, password)
    # -->
    #
    def basic_encode: (String account, String password) -> String

    public

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - connection_close?()
    # -->
    #
    def connection_close?: () -> bool

    # <!--
    #   rdoc-file=lib/net/http/header.rb
    #   - connection_keep_alive?()
    # -->
    #
    def connection_keep_alive?: () -> bool
  end

  # <!-- rdoc-file=lib/net/http/request.rb -->
  # HTTP request class. This class wraps together the request header and the
  # request path. You cannot use this class directly. Instead, you should use one
  # of its subclasses: Net::HTTP::Get, Net::HTTP::Post, Net::HTTP::Head.
  #
  class HTTPRequest < HTTPGenericRequest
    # <!--
    #   rdoc-file=lib/net/http/request.rb
    #   - new(path, initheader = nil)
    # -->
    # Creates an HTTP request object for `path`.
    #
    # `initheader` are the default headers to use.  Net::HTTP adds Accept-Encoding
    # to enable compression of the response body unless Accept-Encoding or Range are
    # supplied in `initheader`.
    #
    def initialize: (String path, ?Hash[String, untyped] initheader) -> void
                  | (URI::Generic uri, ?Hash[String, untyped] initheader) -> void
  end

  # <!-- rdoc-file=lib/net/http/requests.rb -->
  # See Net::HTTPGenericRequest for attributes and methods. See Net::HTTP for
  # usage examples.
  #
  class HTTP::Get < HTTPRequest
    METHOD: String

    REQUEST_HAS_BODY: bool

    RESPONSE_HAS_BODY: bool
  end

  # <!-- rdoc-file=lib/net/http/requests.rb -->
  # See Net::HTTPGenericRequest for attributes and methods. See Net::HTTP for
  # usage examples.
  #
  class HTTP::Head < HTTPRequest
    METHOD: String

    REQUEST_HAS_BODY: bool

    RESPONSE_HAS_BODY: bool
  end

  # <!-- rdoc-file=lib/net/http/requests.rb -->
  # See Net::HTTPGenericRequest for attributes and methods. See Net::HTTP for
  # usage examples.
  #
  class HTTP::Post < HTTPRequest
    METHOD: String

    REQUEST_HAS_BODY: bool

    RESPONSE_HAS_BODY: bool
  end

  # <!-- rdoc-file=lib/net/http/requests.rb -->
  # See Net::HTTPGenericRequest for attributes and methods. See Net::HTTP for
  # usage examples.
  #
  class HTTP::Put < HTTPRequest
    METHOD: String

    REQUEST_HAS_BODY: bool

    RESPONSE_HAS_BODY: bool
  end

  # <!-- rdoc-file=lib/net/http/requests.rb -->
  # See Net::HTTPGenericRequest for attributes and methods. See Net::HTTP for
  # usage examples.
  #
  class HTTP::Delete < HTTPRequest
    METHOD: String

    REQUEST_HAS_BODY: bool

    RESPONSE_HAS_BODY: bool
  end

  # <!-- rdoc-file=lib/net/http/requests.rb -->
  # See Net::HTTPGenericRequest for attributes and methods.
  #
  class HTTP::Options < HTTPRequest
    METHOD: String

    REQUEST_HAS_BODY: bool

    RESPONSE_HAS_BODY: bool
  end

  # <!-- rdoc-file=lib/net/http/requests.rb -->
  # See Net::HTTPGenericRequest for attributes and methods.
  #
  class HTTP::Trace < HTTPRequest
    METHOD: String

    REQUEST_HAS_BODY: bool

    RESPONSE_HAS_BODY: bool
  end

  # <!-- rdoc-file=lib/net/http/requests.rb -->
  # See Net::HTTPGenericRequest for attributes and methods.
  #
  class HTTP::Patch < HTTPRequest
    METHOD: String

    REQUEST_HAS_BODY: bool

    RESPONSE_HAS_BODY: bool
  end

  # <!-- rdoc-file=lib/net/http/requests.rb -->
  # See Net::HTTPGenericRequest for attributes and methods.
  #
  class HTTP::Propfind < HTTPRequest
    METHOD: String

    REQUEST_HAS_BODY: bool

    RESPONSE_HAS_BODY: bool
  end

  # <!-- rdoc-file=lib/net/http/requests.rb -->
  # See Net::HTTPGenericRequest for attributes and methods.
  #
  class HTTP::Proppatch < HTTPRequest
    METHOD: String

    REQUEST_HAS_BODY: bool

    RESPONSE_HAS_BODY: bool
  end

  # <!-- rdoc-file=lib/net/http/requests.rb -->
  # See Net::HTTPGenericRequest for attributes and methods.
  #
  class HTTP::Mkcol < HTTPRequest
    METHOD: String

    REQUEST_HAS_BODY: bool

    RESPONSE_HAS_BODY: bool
  end

  # <!-- rdoc-file=lib/net/http/requests.rb -->
  # See Net::HTTPGenericRequest for attributes and methods.
  #
  class HTTP::Copy < HTTPRequest
    METHOD: String

    REQUEST_HAS_BODY: bool

    RESPONSE_HAS_BODY: bool
  end

  # <!-- rdoc-file=lib/net/http/requests.rb -->
  # See Net::HTTPGenericRequest for attributes and methods.
  #
  class HTTP::Move < HTTPRequest
    METHOD: String

    REQUEST_HAS_BODY: bool

    RESPONSE_HAS_BODY: bool
  end

  # <!-- rdoc-file=lib/net/http/requests.rb -->
  # See Net::HTTPGenericRequest for attributes and methods.
  #
  class HTTP::Lock < HTTPRequest
    METHOD: String

    REQUEST_HAS_BODY: bool

    RESPONSE_HAS_BODY: bool
  end

  # <!-- rdoc-file=lib/net/http/requests.rb -->
  # See Net::HTTPGenericRequest for attributes and methods.
  #
  class HTTP::Unlock < HTTPRequest
    METHOD: String

    REQUEST_HAS_BODY: bool

    RESPONSE_HAS_BODY: bool
  end

  # <!-- rdoc-file=lib/net/http/response.rb -->
  # HTTP response class.
  #
  # This class wraps together the response header and the response body (the
  # entity requested).
  #
  # It mixes in the HTTPHeader module, which provides access to response header
  # values both via hash-like methods and via individual readers.
  #
  # Note that each possible HTTP response code defines its own HTTPResponse
  # subclass. All classes are defined under the Net module. Indentation indicates
  # inheritance.  For a list of the classes see Net::HTTP.
  #
  # Correspondence `HTTP code => class` is stored in CODE_TO_OBJ constant:
  #
  #     Net::HTTPResponse::CODE_TO_OBJ['404'] #=> Net::HTTPNotFound
  #
  class HTTPResponse
    # <!--
    #   rdoc-file=lib/net/http/response.rb
    #   - body_permitted?()
    # -->
    # true if the response has a body.
    #
    def self.body_permitted?: () -> bool

    public

    include Net::HTTPHeader

    # <!-- rdoc-file=lib/net/http/response.rb -->
    # The HTTP version supported by the server.
    #
    attr_reader http_version: String

    # <!-- rdoc-file=lib/net/http/response.rb -->
    # The HTTP result code string. For example, '302'.  You can also determine the
    # response type by examining which response subclass the response object is an
    # instance of.
    #
    attr_reader code: String

    # <!-- rdoc-file=lib/net/http/response.rb -->
    # The HTTP result message sent by the server. For example, 'Not Found'.
    #
    attr_reader message: String

    # <!-- rdoc-file=lib/net/http/response.rb -->
    # The HTTP result message sent by the server. For example, 'Not Found'.
    #
    alias msg message

    # <!-- rdoc-file=lib/net/http/response.rb -->
    # The URI used to fetch this response.  The response URI is only available if a
    # URI was used to create the request.
    #
    attr_reader uri: URI::Generic | nil

    # <!-- rdoc-file=lib/net/http/response.rb -->
    # Set to true automatically when the request did not contain an Accept-Encoding
    # header from the user.
    #
    attr_accessor decode_content: bool

    # <!--
    #   rdoc-file=lib/net/http/response.rb
    #   - inspect()
    # -->
    #
    def inspect: () -> String

    def code_type: () -> untyped

    def error!: () -> untyped

    def error_type: () -> (Net::HTTPError | Net::HTTPServerException | Net::HTTPRetriableError | Net::HTTPFatalError)

    # <!--
    #   rdoc-file=lib/net/http/response.rb
    #   - value()
    # -->
    # Raises an HTTP error if the response is not 2xx (success).
    #
    def value: () -> (nil | untyped)

    def uri=: (URI::Generic uri) -> void

    interface _Dest
      def <<: (String) -> void
    end

    # <!--
    #   rdoc-file=lib/net/http/response.rb
    #   - read_body(dest = nil, &block)
    # -->
    # Gets the entity body returned by the remote HTTP server.
    #
    # If a block is given, the body is passed to the block, and the body is provided
    # in fragments, as it is read in from the socket.
    #
    # If `dest` argument is given, response is read into that variable, with
    # `dest#<<` method (it could be String or IO, or any other object responding to
    # `<<`).
    #
    # Calling this method a second or subsequent time for the same HTTPResponse
    # object will return the value already read.
    #
    #     http.request_get('/index.html') {|res|
    #       puts res.read_body
    #     }
    #
    #     http.request_get('/index.html') {|res|
    #       p res.read_body.object_id   # 538149362
    #       p res.read_body.object_id   # 538149362
    #     }
    #
    #     # using iterator
    #     http.request_get('/index.html') {|res|
    #       res.read_body do |segment|
    #         print segment
    #       end
    #     }
    #
    def read_body: () -> String
                 | (_Dest dest) -> String
                 | () { (String) -> void } -> String

    # <!--
    #   rdoc-file=lib/net/http/response.rb
    #   - body()
    # -->
    # Returns the full entity body.
    #
    # Calling this method a second or subsequent time will return the string already
    # read.
    #
    #     http.request_get('/index.html') {|res|
    #       puts res.body
    #     }
    #
    #     http.request_get('/index.html') {|res|
    #       p res.body.object_id   # 538149362
    #       p res.body.object_id   # 538149362
    #     }
    #
    def body: () -> String

    # <!--
    #   rdoc-file=lib/net/http/response.rb
    #   - body=(value)
    # -->
    # Because it may be necessary to modify the body, Eg, decompression this method
    # facilitates that.
    #
    def body=: (untyped value) -> void

    # <!--
    #   rdoc-file=lib/net/http/response.rb
    #   - entity()
    # -->
    #
    alias entity body
  end

  class HTTPUnknownResponse < HTTPResponse
    HAS_BODY: bool

    EXCEPTION_TYPE: Net::HTTPError
  end

  class HTTPInformation < HTTPResponse
    HAS_BODY: bool

    EXCEPTION_TYPE: Net::HTTPError
  end

  class HTTPSuccess < HTTPResponse
    HAS_BODY: bool

    EXCEPTION_TYPE: Net::HTTPError
  end

  class HTTPRedirection < HTTPResponse
    HAS_BODY: bool

    EXCEPTION_TYPE: Net::HTTPRetriableError
  end

  class HTTPClientError < HTTPResponse
    HAS_BODY: bool

    EXCEPTION_TYPE: untyped
  end

  class HTTPServerError < HTTPResponse
    HAS_BODY: bool

    EXCEPTION_TYPE: Net::HTTPFatalError
  end

  class HTTPContinue < HTTPInformation
    HAS_BODY: bool
  end

  class HTTPSwitchProtocol < HTTPInformation
    HAS_BODY: bool
  end

  class HTTPProcessing < HTTPInformation
    HAS_BODY: bool
  end

  class HTTPEarlyHints < HTTPInformation
    HAS_BODY: bool
  end

  class HTTPOK < HTTPSuccess
    HAS_BODY: bool
  end

  class HTTPCreated < HTTPSuccess
    HAS_BODY: bool
  end

  class HTTPAccepted < HTTPSuccess
    HAS_BODY: bool
  end

  class HTTPNonAuthoritativeInformation < HTTPSuccess
    HAS_BODY: bool
  end

  class HTTPNoContent < HTTPSuccess
    HAS_BODY: bool
  end

  class HTTPResetContent < HTTPSuccess
    HAS_BODY: bool
  end

  class HTTPPartialContent < HTTPSuccess
    HAS_BODY: bool
  end

  class HTTPMultiStatus < HTTPSuccess
    HAS_BODY: bool
  end

  class HTTPAlreadyReported < HTTPSuccess
    HAS_BODY: bool
  end

  class HTTPIMUsed < HTTPSuccess
    HAS_BODY: bool
  end

  class HTTPMultipleChoices < HTTPRedirection
    HAS_BODY: bool
  end

  HTTPMultipleChoice: HTTPMultipleChoices

  class HTTPMovedPermanently < HTTPRedirection
    HAS_BODY: bool
  end

  class HTTPFound < HTTPRedirection
    HAS_BODY: bool
  end

  class HTTPSeeOther < HTTPRedirection
    HAS_BODY: bool
  end

  class HTTPNotModified < HTTPRedirection
    HAS_BODY: bool
  end

  class HTTPUseProxy < HTTPRedirection
    HAS_BODY: bool
  end

  class HTTPTemporaryRedirect < HTTPRedirection
    HAS_BODY: bool
  end

  class HTTPPermanentRedirect < HTTPRedirection
    HAS_BODY: bool
  end

  class HTTPBadRequest < HTTPClientError
    HAS_BODY: bool
  end

  class HTTPUnauthorized < HTTPClientError
    HAS_BODY: bool
  end

  class HTTPPaymentRequired < HTTPClientError
    HAS_BODY: bool
  end

  class HTTPForbidden < HTTPClientError
    HAS_BODY: bool
  end

  class HTTPNotFound < HTTPClientError
    HAS_BODY: bool
  end

  class HTTPMethodNotAllowed < HTTPClientError
    HAS_BODY: bool
  end

  class HTTPNotAcceptable < HTTPClientError
    HAS_BODY: bool
  end

  class HTTPProxyAuthenticationRequired < HTTPClientError
    HAS_BODY: bool
  end

  class HTTPRequestTimeout < HTTPClientError
    HAS_BODY: bool
  end

  class HTTPConflict < HTTPClientError
    HAS_BODY: bool
  end

  class HTTPGone < HTTPClientError
    HAS_BODY: bool
  end

  class HTTPLengthRequired < HTTPClientError
    HAS_BODY: bool
  end

  class HTTPPreconditionFailed < HTTPClientError
    HAS_BODY: bool
  end

  class HTTPPayloadTooLarge < HTTPClientError
    HAS_BODY: bool
  end

  class HTTPURITooLong < HTTPClientError
    HAS_BODY: bool
  end

  class HTTPUnsupportedMediaType < HTTPClientError
    HAS_BODY: bool
  end

  class HTTPRangeNotSatisfiable < HTTPClientError
    HAS_BODY: bool
  end

  class HTTPExpectationFailed < HTTPClientError
    HAS_BODY: bool
  end

  class HTTPMisdirectedRequest < HTTPClientError
    HAS_BODY: bool
  end

  class HTTPUnprocessableEntity < HTTPClientError
    HAS_BODY: bool
  end

  class HTTPLocked < HTTPClientError
    HAS_BODY: bool
  end

  class HTTPFailedDependency < HTTPClientError
    HAS_BODY: bool
  end

  class HTTPUpgradeRequired < HTTPClientError
    HAS_BODY: bool
  end

  class HTTPPreconditionRequired < HTTPClientError
    HAS_BODY: bool
  end

  class HTTPTooManyRequests < HTTPClientError
    HAS_BODY: bool
  end

  class HTTPRequestHeaderFieldsTooLarge < HTTPClientError
    HAS_BODY: bool
  end

  class HTTPUnavailableForLegalReasons < HTTPClientError
    HAS_BODY: bool
  end

  class HTTPInternalServerError < HTTPServerError
    HAS_BODY: bool
  end

  class HTTPNotImplemented < HTTPServerError
    HAS_BODY: bool
  end

  class HTTPBadGateway < HTTPServerError
    HAS_BODY: bool
  end

  class HTTPServiceUnavailable < HTTPServerError
    HAS_BODY: bool
  end

  class HTTPGatewayTimeout < HTTPServerError
    HAS_BODY: bool
  end

  class HTTPVersionNotSupported < HTTPServerError
    HAS_BODY: bool
  end

  class HTTPVariantAlsoNegotiates < HTTPServerError
    HAS_BODY: bool
  end

  class HTTPInsufficientStorage < HTTPServerError
    HAS_BODY: bool
  end

  class HTTPLoopDetected < HTTPServerError
    HAS_BODY: bool
  end

  class HTTPNotExtended < HTTPServerError
    HAS_BODY: bool
  end

  class HTTPNetworkAuthenticationRequired < HTTPServerError
    HAS_BODY: bool
  end

  # <!-- rdoc-file=lib/net/http/response.rb -->
  # HTTP response class.
  #
  # This class wraps together the response header and the response body (the
  # entity requested).
  #
  # It mixes in the HTTPHeader module, which provides access to response header
  # values both via hash-like methods and via individual readers.
  #
  # Note that each possible HTTP response code defines its own HTTPResponse
  # subclass. All classes are defined under the Net module. Indentation indicates
  # inheritance.  For a list of the classes see Net::HTTP.
  #
  # Correspondence `HTTP code => class` is stored in CODE_TO_OBJ constant:
  #
  #     Net::HTTPResponse::CODE_TO_OBJ['404'] #=> Net::HTTPNotFound
  #
  class HTTPResponse
    CODE_CLASS_TO_OBJ: Hash[untyped, untyped]

    CODE_TO_OBJ: Hash[untyped, untyped]
  end

  HTTP::STATUS_CODES: Hash[Integer, String]

  # <!-- rdoc-file=lib/net/http/exceptions.rb -->
  # Net::HTTP exception class. You cannot use Net::HTTPExceptions directly;
  # instead, you must use its subclasses.
  #
  module HTTPExceptions
    def initialize: (untyped msg, untyped res) -> untyped

    attr_reader response: untyped

    alias data response
  end

  class HTTPError < ProtocolError
    include Net::HTTPExceptions
  end

  class HTTPRetriableError < ProtoRetriableError
    include Net::HTTPExceptions
  end

  class HTTPServerException < ProtoServerError
    # We cannot use the name "HTTPServerError", it is the name of the response.
    include Net::HTTPExceptions
  end

  class HTTPFatalError < ProtoFatalError
    include Net::HTTPExceptions
  end
end
