From 0421be4464f31cb1878a1df9b4ea968346cacc7c Mon Sep 17 00:00:00 2001 From: Erik Berlin Date: Thu, 5 Mar 2026 10:33:08 -0800 Subject: [PATCH 1/2] Add existing RBS file and manifest from ruby/rbs repo --- sig/manifest.yaml | 3 + sig/net-http.rbs | 5580 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 5583 insertions(+) create mode 100644 sig/manifest.yaml create mode 100644 sig/net-http.rbs diff --git a/sig/manifest.yaml b/sig/manifest.yaml new file mode 100644 index 0000000..ff82a25 --- /dev/null +++ b/sig/manifest.yaml @@ -0,0 +1,3 @@ +dependencies: + - name: net-protocol + - name: uri diff --git a/sig/net-http.rbs b/sig/net-http.rbs new file mode 100644 index 0000000..b54eb93 --- /dev/null +++ b/sig/net-http.rbs @@ -0,0 +1,5580 @@ +module Net + type headers = Hash[String | Symbol, untyped] + + class HTTPBadResponse < StandardError + end + + class HTTPHeaderSyntaxError < StandardError + end + + # + # Class Net::HTTP provides a rich library that implements the client in a + # client-server model that uses the HTTP request-response protocol. For + # information about HTTP, see: + # + # * [Hypertext Transfer + # Protocol](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol). + # * [Technical + # overview](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Techni + # cal_overview). + # + # ## About the Examples + # + # Examples here assume that net/http has been required (which also + # requires `uri`): + # + # require 'net/http' + # + # Many code examples here use these example websites: + # + # * https://jsonplaceholder.typicode.com. + # * http://example.com. + # + # Some examples also assume these variables: + # + # uri = URI('https://jsonplaceholder.typicode.com/') + # uri.freeze # Examples may not modify. + # hostname = uri.hostname # => "jsonplaceholder.typicode.com" + # path = uri.path # => "/" + # port = uri.port # => 443 + # + # So that example requests may be written as: + # + # Net::HTTP.get(uri) + # Net::HTTP.get(hostname, '/index.html') + # Net::HTTP.start(hostname) do |http| + # http.get('/todos/1') + # http.get('/todos/2') + # end + # + # An example that needs a modified URI first duplicates `uri`, then modifies the + # duplicate: + # + # _uri = uri.dup + # _uri.path = '/todos/1' + # + # ## Strategies + # + # * If you will make only a few GET requests, consider using + # [OpenURI](rdoc-ref:OpenURI). + # * If you will make only a few requests of all kinds, consider using the + # various singleton convenience methods in this class. Each of the following + # methods automatically starts and finishes a + # [session](rdoc-ref:Net::HTTP@Sessions) that sends a single request: + # + # # Return string response body. + # Net::HTTP.get(hostname, path) + # Net::HTTP.get(uri) + # + # # Write string response body to $stdout. + # Net::HTTP.get_print(hostname, path) + # Net::HTTP.get_print(uri) + # + # # Return response as Net::HTTPResponse object. + # Net::HTTP.get_response(hostname, path) + # Net::HTTP.get_response(uri) + # data = '{"title": "foo", "body": "bar", "userId": 1}' + # Net::HTTP.post(uri, data) + # params = {title: 'foo', body: 'bar', userId: 1} + # Net::HTTP.post_form(uri, params) + # data = '{"title": "foo", "body": "bar", "userId": 1}' + # Net::HTTP.put(uri, data) + # + # * If performance is important, consider using sessions, which lower request + # overhead. This [session](rdoc-ref:Net::HTTP@Sessions) has multiple + # requests for [HTTP + # methods](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request + # _methods) and [WebDAV + # methods](https://en.wikipedia.org/wiki/WebDAV#Implementation): + # + # Net::HTTP.start(hostname) do |http| + # # Session started automatically before block execution. + # http.get(path) + # http.head(path) + # body = 'Some text' + # http.post(path, body) # Can also have a block. + # http.put(path, body) + # http.delete(path) + # http.options(path) + # http.trace(path) + # http.patch(path, body) # Can also have a block. + # http.copy(path) + # http.lock(path, body) + # http.mkcol(path, body) + # http.move(path) + # http.propfind(path, body) + # http.proppatch(path, body) + # http.unlock(path, body) + # # Session finished automatically at block exit. + # end + # + # The methods cited above are convenience methods that, via their few arguments, + # allow minimal control over the requests. For greater control, consider using + # [request objects](rdoc-ref:Net::HTTPRequest). + # + # ## URIs + # + # On the internet, a URI ([Universal Resource + # Identifier](https://en.wikipedia.org/wiki/Uniform_Resource_Identifier)) is a + # string that identifies a particular resource. It consists of some or all of: + # scheme, hostname, path, query, and fragment; see [URI + # syntax](https://en.wikipedia.org/wiki/Uniform_Resource_Identifier#Syntax). + # + # A Ruby [URI::Generic](rdoc-ref:URI::Generic) object represents an internet + # URI. It provides, among others, methods `scheme`, `hostname`, `path`, `query`, + # and `fragment`. + # + # ### Schemes + # + # An internet URI has a + # [scheme](https://en.wikipedia.org/wiki/List_of_URI_schemes). + # + # The two schemes supported in Net::HTTP are 'https' and + # 'http': + # + # uri.scheme # => "https" + # URI('http://example.com').scheme # => "http" + # + # ### Hostnames + # + # A hostname identifies a server (host) to which requests may be sent: + # + # hostname = uri.hostname # => "jsonplaceholder.typicode.com" + # Net::HTTP.start(hostname) do |http| + # # Some HTTP stuff. + # end + # + # ### Paths + # + # A host-specific path identifies a resource on the host: + # + # _uri = uri.dup + # _uri.path = '/todos/1' + # hostname = _uri.hostname + # path = _uri.path + # Net::HTTP.get(hostname, path) + # + # ### Queries + # + # A host-specific query adds name/value pairs to the URI: + # + # _uri = uri.dup + # params = {userId: 1, completed: false} + # _uri.query = URI.encode_www_form(params) + # _uri # => # + # Net::HTTP.get(_uri) + # + # ### Fragments + # + # A [URI fragment](https://en.wikipedia.org/wiki/URI_fragment) has no effect in + # Net::HTTP; the same data is returned, regardless of whether a fragment is + # included. + # + # ## Request Headers + # + # Request headers may be used to pass additional information to the host, + # similar to arguments passed in a method call; each header is a name/value + # pair. + # + # Each of the Net::HTTP methods that sends a request to the host has optional + # argument `headers`, where the headers are expressed as a hash of + # field-name/value pairs: + # + # headers = {Accept: 'application/json', Connection: 'Keep-Alive'} + # Net::HTTP.get(uri, headers) + # + # See lists of both standard request fields and common request fields at + # [Request + # Fields](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Request_field + # s). A host may also accept other custom fields. + # + # ## HTTP Sessions + # + # A *session* is a connection between a server (host) and a client that: + # + # * Is begun by instance method Net::HTTP#start. + # * May contain any number of requests. + # * Is ended by instance method Net::HTTP#finish. + # + # See example sessions at [Strategies](rdoc-ref:Net::HTTP@Strategies). + # + # ### Session Using Net::HTTP.start + # + # If you have many requests to make to a single host (and port), consider using + # singleton method Net::HTTP.start with a block; the method handles the session + # automatically by: + # + # * Calling #start before block execution. + # * Executing the block. + # * Calling #finish after block execution. + # + # In the block, you can use these instance methods, each of which that sends a + # single request: + # + # * [HTTP + # methods](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request + # _methods): + # + # * #get, #request_get: GET. + # * #head, #request_head: HEAD. + # * #post, #request_post: POST. + # * #delete: DELETE. + # * #options: OPTIONS. + # * #trace: TRACE. + # * #patch: PATCH. + # + # * [WebDAV methods](https://en.wikipedia.org/wiki/WebDAV#Implementation): + # + # * #copy: COPY. + # * #lock: LOCK. + # * #mkcol: MKCOL. + # * #move: MOVE. + # * #propfind: PROPFIND. + # * #proppatch: PROPPATCH. + # * #unlock: UNLOCK. + # + # ### Session Using Net::HTTP.start and Net::HTTP.finish + # + # You can manage a session manually using methods #start and #finish: + # + # http = Net::HTTP.new(hostname) + # http.start + # http.get('/todos/1') + # http.get('/todos/2') + # http.delete('/posts/1') + # http.finish # Needed to free resources. + # + # ### Single-Request Session + # + # Certain convenience methods automatically handle a session by: + # + # * Creating an HTTP object + # * Starting a session. + # * Sending a single request. + # * Finishing the session. + # * Destroying the object. + # + # Such methods that send GET requests: + # + # * ::get: Returns the string response body. + # * ::get_print: Writes the string response body to $stdout. + # * ::get_response: Returns a Net::HTTPResponse object. + # + # Such methods that send POST requests: + # + # * ::post: Posts data to the host. + # * ::post_form: Posts form data to the host. + # + # ## HTTP Requests and Responses + # + # Many of the methods above are convenience methods, each of which sends a + # request and returns a string without directly using Net::HTTPRequest and + # Net::HTTPResponse objects. + # + # You can, however, directly create a request object, send the request, and + # retrieve the response object; see: + # + # * Net::HTTPRequest. + # * Net::HTTPResponse. + # + # ## Following Redirection + # + # Each returned response is an instance of a subclass of Net::HTTPResponse. See + # the [response class + # hierarchy](rdoc-ref:Net::HTTPResponse@Response+Subclasses). + # + # In particular, class Net::HTTPRedirection is the parent of all redirection + # classes. This allows you to craft a case statement to handle redirections + # properly: + # + # def fetch(uri, limit = 10) + # # You should choose a better exception. + # raise ArgumentError, 'Too many HTTP redirects' if limit == 0 + # + # res = Net::HTTP.get_response(URI(uri)) + # case res + # when Net::HTTPSuccess # Any success class. + # res + # when Net::HTTPRedirection # Any redirection class. + # location = res['Location'] + # warn "Redirected to #{location}" + # fetch(location, limit - 1) + # else # Any other class. + # res.value + # end + # end + # + # fetch(uri) + # + # ## Basic Authentication + # + # Basic authentication is performed according to + # [RFC2617](http://www.ietf.org/rfc/rfc2617.txt): + # + # req = Net::HTTP::Get.new(uri) + # req.basic_auth('user', 'pass') + # res = Net::HTTP.start(hostname) do |http| + # http.request(req) + # end + # + # ## 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. + # + # Net::HTTP.start(hostname) do |http| + # req = Net::HTTP::Get.new(uri) + # http.request(req) do |res| + # open('t.tmp', 'w') do |f| + # res.read_body do |chunk| + # f.write chunk + # end + # end + # end + # end + # + # ## HTTPS + # + # HTTPS is enabled for an HTTP connection by Net::HTTP#use_ssl=: + # + # Net::HTTP.start(hostname, :use_ssl => true) do |http| + # req = Net::HTTP::Get.new(uri) + # res = http.request(req) + # end + # + # Or if you simply want to make a GET request, you may pass in a URI object that + # has an HTTPS URL. Net::HTTP automatically turns on TLS verification if the URI + # object has a 'https' URI scheme: + # + # uri # => # + # Net::HTTP.get(uri) + # + # ## Proxy Server + # + # An HTTP object can have a [proxy + # server](https://en.wikipedia.org/wiki/Proxy_server). + # + # You can create an HTTP object with a proxy server using method Net::HTTP.new + # or method Net::HTTP.start. + # + # The proxy may be defined either by argument `p_addr` or by environment + # variable 'http_proxy'. + # + # ### Proxy Using Argument `p_addr` as a String + # + # When argument `p_addr` is a string hostname, the returned `http` has the given + # host as its proxy: + # + # http = Net::HTTP.new(hostname, nil, 'proxy.example') + # http.proxy? # => true + # http.proxy_from_env? # => false + # http.proxy_address # => "proxy.example" + # # These use default values. + # http.proxy_port # => 80 + # http.proxy_user # => nil + # http.proxy_pass # => nil + # + # The port, username, and password for the proxy may also be given: + # + # http = Net::HTTP.new(hostname, nil, 'proxy.example', 8000, 'pname', 'ppass') + # # => # + # http.proxy? # => true + # http.proxy_from_env? # => false + # http.proxy_address # => "proxy.example" + # http.proxy_port # => 8000 + # http.proxy_user # => "pname" + # http.proxy_pass # => "ppass" + # + # ### Proxy Using 'ENV['http_proxy']' + # + # When environment variable 'http_proxy' is set to a URI string, + # the returned `http` will have the server at that URI as its proxy; note that + # the URI string must have a protocol such as 'http' or + # 'https': + # + # ENV['http_proxy'] = 'http://example.com' + # http = Net::HTTP.new(hostname) + # http.proxy? # => true + # http.proxy_from_env? # => true + # http.proxy_address # => "example.com" + # # These use default values. + # http.proxy_port # => 80 + # http.proxy_user # => nil + # http.proxy_pass # => nil + # + # The URI string may include proxy username, password, and port number: + # + # ENV['http_proxy'] = 'http://pname:ppass@example.com:8000' + # http = Net::HTTP.new(hostname) + # http.proxy? # => true + # http.proxy_from_env? # => true + # http.proxy_address # => "example.com" + # http.proxy_port # => 8000 + # http.proxy_user # => "pname" + # http.proxy_pass # => "ppass" + # + # ### Filtering Proxies + # + # With method Net::HTTP.new (but not Net::HTTP.start), you can use argument + # `p_no_proxy` to filter proxies: + # + # * Reject a certain address: + # + # http = Net::HTTP.new('example.com', nil, 'proxy.example', 8000, 'pname', 'ppass', 'proxy.example') + # http.proxy_address # => nil + # + # * Reject certain domains or subdomains: + # + # http = Net::HTTP.new('example.com', nil, 'my.proxy.example', 8000, 'pname', 'ppass', 'proxy.example') + # http.proxy_address # => nil + # + # * Reject certain addresses and port combinations: + # + # http = Net::HTTP.new('example.com', nil, 'proxy.example', 8000, 'pname', 'ppass', 'proxy.example:1234') + # http.proxy_address # => "proxy.example" + # + # http = Net::HTTP.new('example.com', nil, 'proxy.example', 8000, 'pname', 'ppass', 'proxy.example:8000') + # http.proxy_address # => nil + # + # * Reject a list of the types above delimited using a comma: + # + # http = Net::HTTP.new('example.com', nil, 'proxy.example', 8000, 'pname', 'ppass', 'my.proxy,proxy.example:8000') + # http.proxy_address # => nil + # + # http = Net::HTTP.new('example.com', nil, 'my.proxy', 8000, 'pname', 'ppass', 'my.proxy,proxy.example:8000') + # http.proxy_address # => nil + # + # ## Compression and Decompression + # + # Net::HTTP does not compress the body of a request before sending. + # + # By default, Net::HTTP adds header 'Accept-Encoding' to a new + # [request object](rdoc-ref:Net::HTTPRequest): + # + # Net::HTTP::Get.new(uri)['Accept-Encoding'] + # # => "gzip;q=1.0,deflate;q=0.6,identity;q=0.3" + # + # This requests the server to zip-encode the response body if there is one; the + # server is not required to do so. + # + # Net::HTTP does not automatically decompress a response body if the response + # has header 'Content-Range'. + # + # Otherwise decompression (or not) depends on the value of header + # [Content-Encoding](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#co + # ntent-encoding-response-header): + # + # * 'deflate', 'gzip', or 'x-gzip': + # decompresses the body and deletes the header. + # * 'none' or 'identity': does not decompress the + # body, but deletes the header. + # * Any other value: leaves the body and header unchanged. + # + # ## What's Here + # + # First, what's elsewhere. Class Net::HTTP: + # + # * Inherits from [class Object](rdoc-ref:Object@What-27s+Here). + # + # This is a categorized summary of methods and attributes. + # + # ### Net::HTTP Objects + # + # * [::new](rdoc-ref:Net::HTTP.new): Creates a new instance. + # * [#inspect](rdoc-ref:Net::HTTP#inspect): Returns a string representation of + # `self`. + # + # ### Sessions + # + # * [::start](rdoc-ref:Net::HTTP.start): Begins a new session in a new + # Net::HTTP object. + # * [#started?](rdoc-ref:Net::HTTP#started?): Returns whether in a session. + # * [#finish](rdoc-ref:Net::HTTP#finish): Ends an active session. + # * [#start](rdoc-ref:Net::HTTP#start): Begins a new session in an existing + # Net::HTTP object (`self`). + # + # ### Connections + # + # * [:continue_timeout](rdoc-ref:Net::HTTP#continue_timeout): Returns the + # continue timeout. + # * [#continue_timeout=](rdoc-ref:Net::HTTP#continue_timeout=): Sets the + # continue timeout seconds. + # * [:keep_alive_timeout](rdoc-ref:Net::HTTP#keep_alive_timeout): Returns the + # keep-alive timeout. + # * [:keep_alive_timeout=](rdoc-ref:Net::HTTP#keep_alive_timeout=): Sets the + # keep-alive timeout. + # * [:max_retries](rdoc-ref:Net::HTTP#max_retries): Returns the maximum + # retries. + # * [#max_retries=](rdoc-ref:Net::HTTP#max_retries=): Sets the maximum + # retries. + # * [:open_timeout](rdoc-ref:Net::HTTP#open_timeout): Returns the open + # timeout. + # * [:open_timeout=](rdoc-ref:Net::HTTP#open_timeout=): Sets the open timeout. + # * [:read_timeout](rdoc-ref:Net::HTTP#read_timeout): Returns the open + # timeout. + # * [:read_timeout=](rdoc-ref:Net::HTTP#read_timeout=): Sets the read timeout. + # * [:ssl_timeout](rdoc-ref:Net::HTTP#ssl_timeout): Returns the ssl timeout. + # * [:ssl_timeout=](rdoc-ref:Net::HTTP#ssl_timeout=): Sets the ssl timeout. + # * [:write_timeout](rdoc-ref:Net::HTTP#write_timeout): Returns the write + # timeout. + # * [write_timeout=](rdoc-ref:Net::HTTP#write_timeout=): Sets the write + # timeout. + # + # ### Requests + # + # * [::get](rdoc-ref:Net::HTTP.get): Sends a GET request and returns the + # string response body. + # * [::get_print](rdoc-ref:Net::HTTP.get_print): Sends a GET request and write + # the string response body to $stdout. + # * [::get_response](rdoc-ref:Net::HTTP.get_response): Sends a GET request and + # returns a response object. + # * [::post_form](rdoc-ref:Net::HTTP.post_form): Sends a POST request with + # form data and returns a response object. + # * [::post](rdoc-ref:Net::HTTP.post): Sends a POST request with data and + # returns a response object. + # * [::put](rdoc-ref:Net::HTTP.put): Sends a PUT request with data and returns + # a response object. + # * [#copy](rdoc-ref:Net::HTTP#copy): Sends a COPY request and returns a + # response object. + # * [#delete](rdoc-ref:Net::HTTP#delete): Sends a DELETE request and returns a + # response object. + # * [#get](rdoc-ref:Net::HTTP#get): Sends a GET request and returns a response + # object. + # * [#head](rdoc-ref:Net::HTTP#head): Sends a HEAD request and returns a + # response object. + # * [#lock](rdoc-ref:Net::HTTP#lock): Sends a LOCK request and returns a + # response object. + # * [#mkcol](rdoc-ref:Net::HTTP#mkcol): Sends a MKCOL request and returns a + # response object. + # * [#move](rdoc-ref:Net::HTTP#move): Sends a MOVE request and returns a + # response object. + # * [#options](rdoc-ref:Net::HTTP#options): Sends a OPTIONS request and + # returns a response object. + # * [#patch](rdoc-ref:Net::HTTP#patch): Sends a PATCH request and returns a + # response object. + # * [#post](rdoc-ref:Net::HTTP#post): Sends a POST request and returns a + # response object. + # * [#propfind](rdoc-ref:Net::HTTP#propfind): Sends a PROPFIND request and + # returns a response object. + # * [#proppatch](rdoc-ref:Net::HTTP#proppatch): Sends a PROPPATCH request and + # returns a response object. + # * [#put](rdoc-ref:Net::HTTP#put): Sends a PUT request and returns a response + # object. + # * [#request](rdoc-ref:Net::HTTP#request): Sends a request and returns a + # response object. + # * [#request_get](rdoc-ref:Net::HTTP#request_get): Sends a GET request and + # forms a response object; if a block given, calls the block with the + # object, otherwise returns the object. + # * [#request_head](rdoc-ref:Net::HTTP#request_head): Sends a HEAD request and + # forms a response object; if a block given, calls the block with the + # object, otherwise returns the object. + # * [#request_post](rdoc-ref:Net::HTTP#request_post): Sends a POST request and + # forms a response object; if a block given, calls the block with the + # object, otherwise returns the object. + # * [#send_request](rdoc-ref:Net::HTTP#send_request): Sends a request and + # returns a response object. + # * [#trace](rdoc-ref:Net::HTTP#trace): Sends a TRACE request and returns a + # response object. + # * [#unlock](rdoc-ref:Net::HTTP#unlock): Sends an UNLOCK request and returns + # a response object. + # + # ### Responses + # + # * [:close_on_empty_response](rdoc-ref:Net::HTTP#close_on_empty_response): + # Returns whether to close connection on empty response. + # * [:close_on_empty_response=](rdoc-ref:Net::HTTP#close_on_empty_response=): + # Sets whether to close connection on empty response. + # * [:ignore_eof](rdoc-ref:Net::HTTP#ignore_eof): Returns whether to ignore + # end-of-file when reading a response body with Content-Length + # headers. + # * [:ignore_eof=](rdoc-ref:Net::HTTP#ignore_eof=): Sets whether to ignore + # end-of-file when reading a response body with Content-Length + # headers. + # * [:response_body_encoding](rdoc-ref:Net::HTTP#response_body_encoding): + # Returns the encoding to use for the response body. + # * [#response_body_encoding=](rdoc-ref:Net::HTTP#response_body_encoding=): + # Sets the response body encoding. + # + # ### Proxies + # + # * [:proxy_address](rdoc-ref:Net::HTTP#proxy_address): Returns the proxy + # address. + # * [:proxy_address=](rdoc-ref:Net::HTTP#proxy_address=): Sets the proxy + # address. + # * [::proxy_class?](rdoc-ref:Net::HTTP.proxy_class?): Returns whether `self` + # is a proxy class. + # * [#proxy?](rdoc-ref:Net::HTTP#proxy?): Returns whether `self` has a proxy. + # * [#proxy_address](rdoc-ref:Net::HTTP#proxy_address): Returns the proxy + # address. + # * [#proxy_from_env?](rdoc-ref:Net::HTTP#proxy_from_env?): Returns whether + # the proxy is taken from an environment variable. + # * [:proxy_from_env=](rdoc-ref:Net::HTTP#proxy_from_env=): Sets whether the + # proxy is to be taken from an environment variable. + # * [:proxy_pass](rdoc-ref:Net::HTTP#proxy_pass): Returns the proxy password. + # * [:proxy_pass=](rdoc-ref:Net::HTTP#proxy_pass=): Sets the proxy password. + # * [:proxy_port](rdoc-ref:Net::HTTP#proxy_port): Returns the proxy port. + # * [:proxy_port=](rdoc-ref:Net::HTTP#proxy_port=): Sets the proxy port. + # * [#proxy_user](rdoc-ref:Net::HTTP#proxy_user): Returns the proxy user name. + # * [:proxy_user=](rdoc-ref:Net::HTTP#proxy_user=): Sets the proxy user. + # + # ### Security + # + # * [:ca_file](rdoc-ref:Net::HTTP#ca_file): Returns the path to a CA + # certification file. + # * [:ca_file=](rdoc-ref:Net::HTTP#ca_file=): Sets the path to a CA + # certification file. + # * [:ca_path](rdoc-ref:Net::HTTP#ca_path): Returns the path of to CA + # directory containing certification files. + # * [:ca_path=](rdoc-ref:Net::HTTP#ca_path=): Sets the path of to CA directory + # containing certification files. + # * [:cert](rdoc-ref:Net::HTTP#cert): Returns the OpenSSL::X509::Certificate + # object to be used for client certification. + # * [:cert=](rdoc-ref:Net::HTTP#cert=): Sets the OpenSSL::X509::Certificate + # object to be used for client certification. + # * [:cert_store](rdoc-ref:Net::HTTP#cert_store): Returns the X509::Store to + # be used for verifying peer certificate. + # * [:cert_store=](rdoc-ref:Net::HTTP#cert_store=): Sets the X509::Store to be + # used for verifying peer certificate. + # * [:ciphers](rdoc-ref:Net::HTTP#ciphers): Returns the available SSL ciphers. + # * [:ciphers=](rdoc-ref:Net::HTTP#ciphers=): Sets the available SSL ciphers. + # * [:extra_chain_cert](rdoc-ref:Net::HTTP#extra_chain_cert): Returns the + # extra X509 certificates to be added to the certificate chain. + # * [:extra_chain_cert=](rdoc-ref:Net::HTTP#extra_chain_cert=): Sets the extra + # X509 certificates to be added to the certificate chain. + # * [:key](rdoc-ref:Net::HTTP#key): Returns the OpenSSL::PKey::RSA or + # OpenSSL::PKey::DSA object. + # * [:key=](rdoc-ref:Net::HTTP#key=): Sets the OpenSSL::PKey::RSA or + # OpenSSL::PKey::DSA object. + # * [:max_version](rdoc-ref:Net::HTTP#max_version): Returns the maximum SSL + # version. + # * [:max_version=](rdoc-ref:Net::HTTP#max_version=): Sets the maximum SSL + # version. + # * [:min_version](rdoc-ref:Net::HTTP#min_version): Returns the minimum SSL + # version. + # * [:min_version=](rdoc-ref:Net::HTTP#min_version=): Sets the minimum SSL + # version. + # * [#peer_cert](rdoc-ref:Net::HTTP#peer_cert): Returns the X509 certificate + # chain for the session's socket peer. + # * [:ssl_version](rdoc-ref:Net::HTTP#ssl_version): Returns the SSL version. + # * [:ssl_version=](rdoc-ref:Net::HTTP#ssl_version=): Sets the SSL version. + # * [#use_ssl=](rdoc-ref:Net::HTTP#use_ssl=): Sets whether a new session is to + # use Transport Layer Security. + # * [#use_ssl?](rdoc-ref:Net::HTTP#use_ssl?): Returns whether `self` uses SSL. + # * [:verify_callback](rdoc-ref:Net::HTTP#verify_callback): Returns the + # callback for the server certification verification. + # * [:verify_callback=](rdoc-ref:Net::HTTP#verify_callback=): Sets the + # callback for the server certification verification. + # * [:verify_depth](rdoc-ref:Net::HTTP#verify_depth): Returns the maximum + # depth for the certificate chain verification. + # * [:verify_depth=](rdoc-ref:Net::HTTP#verify_depth=): Sets the maximum depth + # for the certificate chain verification. + # * [:verify_hostname](rdoc-ref:Net::HTTP#verify_hostname): Returns the flags + # for server the certification verification at the beginning of the SSL/TLS + # session. + # * [:verify_hostname=](rdoc-ref:Net::HTTP#verify_hostname=): Sets he flags + # for server the certification verification at the beginning of the SSL/TLS + # session. + # * [:verify_mode](rdoc-ref:Net::HTTP#verify_mode): Returns the flags for + # server the certification verification at the beginning of the SSL/TLS + # session. + # * [:verify_mode=](rdoc-ref:Net::HTTP#verify_mode=): Sets the flags for + # server the certification verification at the beginning of the SSL/TLS + # session. + # + # ### Addresses and Ports + # + # * [:address](rdoc-ref:Net::HTTP#address): Returns the string host name or + # host IP. + # * [::default_port](rdoc-ref:Net::HTTP.default_port): Returns integer 80, the + # default port to use for HTTP requests. + # * [::http_default_port](rdoc-ref:Net::HTTP.http_default_port): Returns + # integer 80, the default port to use for HTTP requests. + # * [::https_default_port](rdoc-ref:Net::HTTP.https_default_port): Returns + # integer 443, the default port to use for HTTPS requests. + # * [#ipaddr](rdoc-ref:Net::HTTP#ipaddr): Returns the IP address for the + # connection. + # * [#ipaddr=](rdoc-ref:Net::HTTP#ipaddr=): Sets the IP address for the + # connection. + # * [:local_host](rdoc-ref:Net::HTTP#local_host): Returns the string local + # host used to establish the connection. + # * [:local_host=](rdoc-ref:Net::HTTP#local_host=): Sets the string local host + # used to establish the connection. + # * [:local_port](rdoc-ref:Net::HTTP#local_port): Returns the integer local + # port used to establish the connection. + # * [:local_port=](rdoc-ref:Net::HTTP#local_port=): Sets the integer local + # port used to establish the connection. + # * [:port](rdoc-ref:Net::HTTP#port): Returns the integer port number. + # + # ### HTTP Version + # + # * [::version_1_2?](rdoc-ref:Net::HTTP.version_1_2?) (aliased as + # [::version_1_2](rdoc-ref:Net::HTTP.version_1_2)): Returns true; retained + # for compatibility. + # + # ### Debugging + # + # * [#set_debug_output](rdoc-ref:Net::HTTP#set_debug_output): Sets the output + # stream for debugging. + # + class HTTP < Protocol + # :stopdoc: + VERSION: String + + Revision: untyped + + HTTPVersion: String + + HAVE_ZLIB: bool + + # + # Returns `true`; retained for compatibility. + # + def self.version_1_2: () -> ::TrueClass + + # + # Returns `true`; retained for compatibility. + # + def self.version_1_2?: () -> ::TrueClass + + def self.version_1_1?: () -> ::FalseClass + + alias self.is_version_1_1? self.version_1_1? + + # + # + alias self.is_version_1_2? self.version_1_2? + + # + # Like Net::HTTP.get, but writes the returned body to $stdout; returns `nil`. + # + def self.get_print: (URI::Generic uri, ?headers header) -> void + | (String host, String path, ?Integer port) -> void + + # + # Sends a GET request and returns the HTTP response body as a string. + # + # With string arguments `hostname` and `path`: + # + # hostname = 'jsonplaceholder.typicode.com' + # path = '/todos/1' + # puts Net::HTTP.get(hostname, path) + # + # Output: + # + # { + # "userId": 1, + # "id": 1, + # "title": "delectus aut autem", + # "completed": false + # } + # + # With URI object `uri` and optional hash argument `headers`: + # + # uri = URI('https://jsonplaceholder.typicode.com/todos/1') + # headers = {'Content-type' => 'application/json; charset=UTF-8'} + # Net::HTTP.get(uri, headers) + # + # Related: + # + # * Net::HTTP::Get: request class for HTTP method `GET`. + # * Net::HTTP#get: convenience method for HTTP method `GET`. + # + def self.get: (URI::Generic uri, ?headers header) -> String + | (String host, String path, ?Integer port) -> String + + # + # Like Net::HTTP.get, but returns a Net::HTTPResponse object instead of the body + # string. + # + def self.get_response: (URI::Generic uri, ?headers header) ?{ (Net::HTTPResponse) -> void } -> Net::HTTPResponse + | (String host, String path, ?Integer port) -> Net::HTTPResponse + + # + # Posts data to a host; returns a Net::HTTPResponse object. + # + # Argument `url` must be a URL; argument `data` must be a string: + # + # _uri = uri.dup + # _uri.path = '/posts' + # data = '{"title": "foo", "body": "bar", "userId": 1}' + # headers = {'content-type': 'application/json'} + # res = Net::HTTP.post(_uri, data, headers) # => # + # puts res.body + # + # Output: + # + # { + # "title": "foo", + # "body": "bar", + # "userId": 1, + # "id": 101 + # } + # + # Related: + # + # * Net::HTTP::Post: request class for HTTP method `POST`. + # * Net::HTTP#post: convenience method for HTTP method `POST`. + # + def self.post: (URI::Generic url, String data, ?headers header) -> Net::HTTPResponse + + # + # Posts data to a host; returns a Net::HTTPResponse object. + # + # Argument `url` must be a URI; argument `data` must be a hash: + # + # _uri = uri.dup + # _uri.path = '/posts' + # data = {title: 'foo', body: 'bar', userId: 1} + # res = Net::HTTP.post_form(_uri, data) # => # + # puts res.body + # + # Output: + # + # { + # "title": "foo", + # "body": "bar", + # "userId": "1", + # "id": 101 + # } + # + def self.post_form: (URI::Generic url, Hash[String, untyped] params) -> Net::HTTPResponse + + # + # Returns integer `80`, the default port to use for HTTP requests: + # + # Net::HTTP.default_port # => 80 + # + def self.default_port: () -> Integer + + # + # Returns integer `80`, the default port to use for HTTP requests: + # + # Net::HTTP.http_default_port # => 80 + # + def self.http_default_port: () -> Integer + + # + # Returns integer `443`, the default port to use for HTTPS requests: + # + # Net::HTTP.https_default_port # => 443 + # + def self.https_default_port: () -> Integer + + # + # Creates a new Net::HTTP object, `http`, via Net::HTTP.new: + # + # * For arguments `address` and `port`, see Net::HTTP.new. + # * For proxy-defining arguments `p_addr` through `p_pass`, see [Proxy + # Server](rdoc-ref:Net::HTTP@Proxy+Server). + # * For argument `opts`, see below. + # + # With no block given: + # + # * Calls http.start with no block (see #start), which opens a + # TCP connection and HTTP session. + # * Returns `http`. + # * The caller should call #finish to close the session: + # + # http = Net::HTTP.start(hostname) + # http.started? # => true + # http.finish + # http.started? # => false + # + # With a block given: + # + # * Calls http.start with the block (see #start), which: + # + # * Opens a TCP connection and HTTP session. + # * Calls the block, which may make any number of requests to the host. + # * Closes the HTTP session and TCP connection on block exit. + # * Returns the block's value `object`. + # + # * Returns `object`. + # + # Example: + # + # hostname = 'jsonplaceholder.typicode.com' + # Net::HTTP.start(hostname) do |http| + # puts http.get('/todos/1').body + # puts http.get('/todos/2').body + # end + # + # Output: + # + # { + # "userId": 1, + # "id": 1, + # "title": "delectus aut autem", + # "completed": false + # } + # { + # "userId": 1, + # "id": 2, + # "title": "quis ut nam facilis et officia qui", + # "completed": false + # } + # + # If the last argument given is a hash, it is the `opts` hash, where each key is + # a method or accessor to be called, and its value is the value to be set. + # + # The keys may include: + # + # * #ca_file + # * #ca_path + # * #cert + # * #cert_store + # * #ciphers + # * #close_on_empty_response + # * `ipaddr` (calls #ipaddr=) + # * #keep_alive_timeout + # * #key + # * #open_timeout + # * #read_timeout + # * #ssl_timeout + # * #ssl_version + # * `use_ssl` (calls #use_ssl=) + # * #verify_callback + # * #verify_depth + # * #verify_mode + # * #write_timeout + # + # Note: If `port` is `nil` and opts[:use_ssl] is a truthy value, + # the value passed to `new` is Net::HTTP.https_default_port, not `port`. + # + def self.start: (String address, ?Integer? port, ?String | :ENV | nil p_addr, ?Integer? p_port, ?String? p_user, ?String? p_pass, ?Hash[Symbol, untyped]?, **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]?, **untyped opt) { (Net::HTTP) -> T } -> T + + # + # + alias self.newobj self.new + + # + # Returns a new Net::HTTP object `http` (but does not open a TCP connection or + # HTTP session). + # + # With only string argument `address` given (and ENV['http_proxy'] + # undefined or `nil`), the returned `http`: + # + # * Has the given address. + # * Has the default port number, Net::HTTP.default_port (80). + # * Has no proxy. + # + # Example: + # + # http = Net::HTTP.new(hostname) + # # => # + # http.address # => "jsonplaceholder.typicode.com" + # http.port # => 80 + # http.proxy? # => false + # + # With integer argument `port` also given, the returned `http` has the given + # port: + # + # http = Net::HTTP.new(hostname, 8000) + # # => # + # http.port # => 8000 + # + # For proxy-defining arguments `p_addr` through `p_no_proxy`, see [Proxy + # Server](rdoc-ref:Net::HTTP@Proxy+Server). + # + 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 + + # + # Returns a string representation of `self`: + # + # Net::HTTP.new(hostname).inspect + # # => "#" + # + def inspect: () -> String + + # + # **WARNING** This method opens a serious security hole. Never use this method + # in production code. + # + # Sets the output stream for debugging: + # + # http = Net::HTTP.new(hostname) + # File.open('t.tmp', 'w') do |file| + # http.set_debug_output(file) + # http.start + # http.get('/nosuch/1') + # http.finish + # end + # puts File.read('t.tmp') + # + # Output: + # + # opening connection to jsonplaceholder.typicode.com:80... + # opened + # <- "GET /nosuch/1 HTTP/1.1\r\nAccept-Encoding: gzip;q=1.0,deflate;q=0.6,identity;q=0.3\r\nAccept: */*\r\nUser-Agent: Ruby\r\nHost: jsonplaceholder.typicode.com\r\n\r\n" + # -> "HTTP/1.1 404 Not Found\r\n" + # -> "Date: Mon, 12 Dec 2022 21:14:11 GMT\r\n" + # -> "Content-Type: application/json; charset=utf-8\r\n" + # -> "Content-Length: 2\r\n" + # -> "Connection: keep-alive\r\n" + # -> "X-Powered-By: Express\r\n" + # -> "X-Ratelimit-Limit: 1000\r\n" + # -> "X-Ratelimit-Remaining: 999\r\n" + # -> "X-Ratelimit-Reset: 1670879660\r\n" + # -> "Vary: Origin, Accept-Encoding\r\n" + # -> "Access-Control-Allow-Credentials: true\r\n" + # -> "Cache-Control: max-age=43200\r\n" + # -> "Pragma: no-cache\r\n" + # -> "Expires: -1\r\n" + # -> "X-Content-Type-Options: nosniff\r\n" + # -> "Etag: W/\"2-vyGp6PvFo4RvsFtPoIWeCReyIC8\"\r\n" + # -> "Via: 1.1 vegur\r\n" + # -> "CF-Cache-Status: MISS\r\n" + # -> "Server-Timing: cf-q-config;dur=1.3000000762986e-05\r\n" + # -> "Report-To: {\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=yOr40jo%2BwS1KHzhTlVpl54beJ5Wx2FcG4gGV0XVrh3X9OlR5q4drUn2dkt5DGO4GDcE%2BVXT7CNgJvGs%2BZleIyMu8CLieFiDIvOviOY3EhHg94m0ZNZgrEdpKD0S85S507l1vsEwEHkoTm%2Ff19SiO\"}],\"group\":\"cf-nel\",\"max_age\":604800}\r\n" + # -> "NEL: {\"success_fraction\":0,\"report_to\":\"cf-nel\",\"max_age\":604800}\r\n" + # -> "Server: cloudflare\r\n" + # -> "CF-RAY: 778977dc484ce591-DFW\r\n" + # -> "alt-svc: h3=\":443\"; ma=86400, h3-29=\":443\"; ma=86400\r\n" + # -> "\r\n" + # reading 2 bytes... + # -> "{}" + # read 2 bytes + # Conn keep-alive + # + def set_debug_output: (IO output) -> void + + # + # Returns the string host name or host IP given as argument `address` in ::new. + # + attr_reader address: String + + # + # Returns the integer port number given as argument `port` in ::new. + # + attr_reader port: Integer + + # + # Sets or returns the string local host used to establish the connection; + # initially `nil`. + # + attr_accessor local_host: String + + # + # Sets or returns the integer local port used to establish the connection; + # initially `nil`. + # + attr_accessor local_port: Integer + + # + # Sets whether to determine the proxy from environment variable + # 'ENV['http_proxy']'; see {Proxy Using + # [ENV]('http_proxy')}[Net::HTTP@Proxy+Using+-27ENV-5B-27http_proxy-27-5D-27]. + # + attr_writer proxy_from_env: untyped + + # + # Sets the proxy address; see [Proxy Server](rdoc-ref:Net::HTTP@Proxy+Server). + # + attr_accessor proxy_address: String? + + # + # Sets the proxy port; see [Proxy Server](rdoc-ref:Net::HTTP@Proxy+Server). + # + attr_accessor proxy_port: Integer? + + # + # Sets the proxy user; see [Proxy Server](rdoc-ref:Net::HTTP@Proxy+Server). + # + attr_accessor proxy_user: String? + + # + # Sets the proxy password; see [Proxy Server](rdoc-ref:Net::HTTP@Proxy+Server). + # + attr_accessor proxy_pass: String? + + # + # Returns the IP address for the connection. + # + # If the session has not been started, returns the value set by #ipaddr=, or + # `nil` if it has not been set: + # + # http = Net::HTTP.new(hostname) + # http.ipaddr # => nil + # http.ipaddr = '172.67.155.76' + # http.ipaddr # => "172.67.155.76" + # + # If the session has been started, returns the IP address from the socket: + # + # http = Net::HTTP.new(hostname) + # http.start + # http.ipaddr # => "172.67.155.76" + # http.finish + # ---- + # + # Sets the IP address for the connection: + # + # http = Net::HTTP.new(hostname) + # http.ipaddr # => nil + # http.ipaddr = '172.67.155.76' + # http.ipaddr # => "172.67.155.76" + # + # The IP address may not be set if the session has been started. + # + attr_accessor ipaddr: String? + + # + # Sets or returns the numeric (Integer or Float) number of seconds to wait for a + # connection to open; initially 60. If the connection is not made in the given + # interval, an exception is raised. + # + attr_accessor open_timeout: Float | Integer + + # + # Returns the numeric (Integer or Float) number of seconds to wait for one block + # to be read (via one read(2) call); see #read_timeout=. + # ---- + # + # Sets the read timeout, in seconds, for `self` to integer `sec`; the initial + # value is 60. + # + # Argument `sec` must be a non-negative numeric value: + # + # http = Net::HTTP.new(hostname) + # http.read_timeout # => 60 + # http.get('/todos/1') # => # + # http.read_timeout = 0 + # http.get('/todos/1') # Raises Net::ReadTimeout. + # + attr_accessor read_timeout: Float | Integer + + # + # Returns the numeric (Integer or Float) number of seconds to wait for one block + # to be written (via one write(2) call); see #write_timeout=. + # ---- + # + # Sets the write timeout, in seconds, for `self` to integer `sec`; the initial + # value is 60. + # + # Argument `sec` must be a non-negative numeric value: + # + # _uri = uri.dup + # _uri.path = '/posts' + # body = 'bar' * 200000 + # data = < 60 + # http.post(_uri.path, data, headers) + # # => # + # http.write_timeout = 0 + # http.post(_uri.path, data, headers) # Raises Net::WriteTimeout. + # + attr_accessor write_timeout: Float | Integer + + # + # Returns the maximum number of times to retry an idempotent request; see + # #max_retries=. + # ---- + # + # Sets the 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. The initial value is 1. + # + # Argument `retries` must be a non-negative numeric value: + # + # http = Net::HTTP.new(hostname) + # http.max_retries = 2 # => 2 + # http.max_retries # => 2 + # + attr_accessor max_retries: Integer + + # + # Returns the continue timeout value; see continue_timeout=. + # ---- + # + # Sets the continue timeout value, which is the number of seconds to wait for an + # expected 100 Continue response. If the HTTP object does not receive a response + # in this many seconds it sends the request body. + # + attr_accessor continue_timeout: Float | Integer | nil + + # + # Sets or returns the numeric (Integer or Float) number of seconds to keep the + # connection open after a request is sent; initially 2. If a new request is made + # during the given interval, the still-open connection is used; otherwise the + # connection will have been closed and a new connection is opened. + # + attr_accessor keep_alive_timeout: Float | Integer + + # + # Returns `true` if the HTTP session has been started: + # + # http = Net::HTTP.new(hostname) + # http.started? # => false + # http.start + # http.started? # => true + # http.finish # => nil + # http.started? # => false + # + # Net::HTTP.start(hostname) do |http| + # http.started? + # end # => true + # http.started? # => false + # + def started?: () -> bool + + # + # + alias active? started? + + # + # Sets or returns whether to close the connection when the response is empty; + # initially `false`. + # + attr_accessor close_on_empty_response: untyped + + # + # Returns `true` if `self` uses SSL, `false` otherwise. See Net::HTTP#use_ssl=. + # + def use_ssl?: () -> bool + + # + # Sets whether a new session is to use [Transport Layer + # Security](https://en.wikipedia.org/wiki/Transport_Layer_Security): + # + # Raises IOError if attempting to change during a session. + # + # Raises OpenSSL::SSL::SSLError if the port is not an HTTPS port. + # + def use_ssl=: (boolish flag) -> void + + SSL_IVNAMES: Array[untyped] + + SSL_ATTRIBUTES: Array[Symbol] + + # + # Sets or returns the path to a CA certification file in PEM format. + # + attr_accessor ca_file: untyped + + # + # Sets or returns the path of to CA directory containing certification files in + # PEM format. + # + attr_accessor ca_path: untyped + + # + # Sets or returns the OpenSSL::X509::Certificate object to be used for client + # certification. + # + attr_accessor cert: untyped + + # + # Sets or returns the X509::Store to be used for verifying peer certificate. + # + attr_accessor cert_store: untyped + + # + # Sets or returns the available SSL ciphers. See + # [OpenSSL::SSL::SSLContext#ciphers=](OpenSSL::SSL::SSL::Context#ciphers=). + # + attr_accessor ciphers: untyped + + # + # Sets or returns the extra X509 certificates to be added to the certificate + # chain. See + # [OpenSSL::SSL::SSLContext#add_certificate](OpenSSL::SSL::SSL::Context#add_cert + # ificate). + # + attr_accessor extra_chain_cert: untyped + + # + # Sets or returns the OpenSSL::PKey::RSA or OpenSSL::PKey::DSA object. + # + attr_accessor key: untyped + + # + # Sets or returns the SSL timeout seconds. + # + attr_accessor ssl_timeout: untyped + + # + # Sets or returns the SSL version. See + # [OpenSSL::SSL::SSLContext#ssl_version=](OpenSSL::SSL::SSL::Context#ssl_version + # =). + # + attr_accessor ssl_version: untyped + + # + # Sets or returns the minimum SSL version. See + # [OpenSSL::SSL::SSLContext#min_version=](OpenSSL::SSL::SSL::Context#min_version + # =). + # + attr_accessor min_version: untyped + + # + # Sets or returns the maximum SSL version. See + # [OpenSSL::SSL::SSLContext#max_version=](OpenSSL::SSL::SSL::Context#max_version + # =). + # + attr_accessor max_version: untyped + + # + # Sets or returns the callback for the server certification verification. + # + attr_accessor verify_callback: untyped + + # + # Sets or returns the maximum depth for the certificate chain verification. + # + attr_accessor verify_depth: untyped + + # + # Sets or returns the flags for server the certification verification at the + # beginning of the SSL/TLS session. OpenSSL::SSL::VERIFY_NONE or + # OpenSSL::SSL::VERIFY_PEER are acceptable. + # + attr_accessor verify_mode: untyped + + # + # Sets or returns whether to verify that the server certificate is valid for the + # hostname. See + # [OpenSSL::SSL::SSLContext#verify_hostname=](OpenSSL::SSL::SSL::Context#verify_ + # hostname=). + # + attr_accessor verify_hostname: untyped + + # + # Returns the X509 certificate chain (an array of strings) for the session's + # socket peer, or `nil` if none. + # + def peer_cert: () -> (nil | untyped) + + # + # Starts an HTTP session. + # + # Without a block, returns `self`: + # + # http = Net::HTTP.new(hostname) + # # => # + # http.start + # # => # + # http.started? # => true + # http.finish + # + # With a block, calls the block with `self`, finishes the session when the block + # exits, and returns the block's value: + # + # http.start do |http| + # http + # end + # # => # + # http.started? # => false + # + def start: [T] () { (Net::HTTP) -> T } -> T + | () -> Net::HTTP + + # + # Finishes the HTTP session: + # + # http = Net::HTTP.new(hostname) + # http.start + # http.started? # => true + # http.finish # => nil + # http.started? # => false + # + # Raises IOError if not in a session. + # + def finish: () -> void + + # + # 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: (?interned p_addr, ?Integer? p_port, ?String? p_user, ?String? p_pass) -> untyped + + # + # Returns true if self is a class which was created by HTTP::Proxy. + # + def self.proxy_class?: () -> bool + + # + # Returns the address of the proxy host, or `nil` if none; see + # Net::HTTP@Proxy+Server. + # + attr_reader self.proxy_address: String? + + # + # Returns the port number of the proxy host, or `nil` if none; see + # Net::HTTP@Proxy+Server. + # + attr_reader self.proxy_port: Integer? + + # + # Returns the user name for accessing the proxy, or `nil` if none; see + # Net::HTTP@Proxy+Server. + # + attr_reader self.proxy_user: String? + + # + # Returns the password for accessing the proxy, or `nil` if none; see + # Net::HTTP@Proxy+Server. + # + attr_reader self.proxy_pass: String? + + # + # Returns `true` if a proxy server is defined, `false` otherwise; see [Proxy + # Server](rdoc-ref:Net::HTTP@Proxy+Server). + # + def proxy?: () -> bool + + # + # Returns `true` if the proxy server is defined in the environment, `false` + # otherwise; see [Proxy Server](rdoc-ref:Net::HTTP@Proxy+Server). + # + def proxy_from_env?: () -> bool + + def proxy_uri: () -> (nil | URI::Generic) + + # + # + alias proxyaddr proxy_address + + # + # + alias proxyport proxy_port + + # + # Sends a GET request to the server; returns an instance of a subclass of + # Net::HTTPResponse. + # + # The request is based on the Net::HTTP::Get object created from string `path` + # and initial headers hash `initheader`. + # + # With a block given, calls the block with the response body: + # + # http = Net::HTTP.new(hostname) + # http.get('/todos/1') do |res| + # p res + # end # => # + # + # Output: + # + # "{\n \"userId\": 1,\n \"id\": 1,\n \"title\": \"delectus aut autem\",\n \"completed\": false\n}" + # + # With no block given, simply returns the response object: + # + # http.get('/') # => # + # + # Related: + # + # * Net::HTTP::Get: request class for HTTP method GET. + # * Net::HTTP.get: sends GET request, returns response body. + # + def get: (String path, ?headers initheader, ?bot dest) ?{ (String body_segment) -> void } -> Net::HTTPResponse + + # + # Sends a HEAD request to the server; returns an instance of a subclass of + # Net::HTTPResponse. + # + # The request is based on the Net::HTTP::Head object created from string `path` + # and initial headers hash `initheader`: + # + # res = http.head('/todos/1') # => # + # res.body # => nil + # res.to_hash.take(3) + # # => + # [["date", ["Wed, 15 Feb 2023 15:25:42 GMT"]], + # ["content-type", ["application/json; charset=utf-8"]], + # ["connection", ["close"]]] + # + def head: (String path, ?headers initheader) -> Net::HTTPResponse + + # + # Sends a POST request to the server; returns an instance of a subclass of + # Net::HTTPResponse. + # + # The request is based on the Net::HTTP::Post object created from string `path`, + # string `data`, and initial headers hash `initheader`. + # + # With a block given, calls the block with the response body: + # + # data = '{"userId": 1, "id": 1, "title": "delectus aut autem", "completed": false}' + # http = Net::HTTP.new(hostname) + # http.post('/todos', data) do |res| + # p res + # end # => # + # + # Output: + # + # "{\n \"{\\\"userId\\\": 1, \\\"id\\\": 1, \\\"title\\\": \\\"delectus aut autem\\\", \\\"completed\\\": false}\": \"\",\n \"id\": 201\n}" + # + # With no block given, simply returns the response object: + # + # http.post('/todos', data) # => # + # + # Related: + # + # * Net::HTTP::Post: request class for HTTP method POST. + # * Net::HTTP.post: sends POST request, returns response body. + # + def post: (String path, String data, ?headers initheader, ?bot dest) ?{ (String body_segment) -> void } -> Net::HTTPResponse + + # + # Sends a PATCH request to the server; returns an instance of a subclass of + # Net::HTTPResponse. + # + # The request is based on the Net::HTTP::Patch object created from string + # `path`, string `data`, and initial headers hash `initheader`. + # + # With a block given, calls the block with the response body: + # + # data = '{"userId": 1, "id": 1, "title": "delectus aut autem", "completed": false}' + # http = Net::HTTP.new(hostname) + # http.patch('/todos/1', data) do |res| + # p res + # end # => # + # + # Output: + # + # "{\n \"userId\": 1,\n \"id\": 1,\n \"title\": \"delectus aut autem\",\n \"completed\": false,\n \"{\\\"userId\\\": 1, \\\"id\\\": 1, \\\"title\\\": \\\"delectus aut autem\\\", \\\"completed\\\": false}\": \"\"\n}" + # + # With no block given, simply returns the response object: + # + # http.patch('/todos/1', data) # => # + # + def patch: (String path, String data, ?headers initheader, ?bot dest) ?{ (String body_segment) -> void } -> Net::HTTPResponse + + # + # Sends a PUT request to the server; returns an instance of a subclass of + # Net::HTTPResponse. + # + # The request is based on the Net::HTTP::Put object created from string `path`, + # string `data`, and initial headers hash `initheader`. + # + # data = '{"userId": 1, "id": 1, "title": "delectus aut autem", "completed": false}' + # http = Net::HTTP.new(hostname) + # http.put('/todos/1', data) # => # + # + # Related: + # + # * Net::HTTP::Put: request class for HTTP method PUT. + # * Net::HTTP.put: sends PUT request, returns response body. + # + def put: (String path, String data, ?headers initheader) -> Net::HTTPResponse + + # + # Sends a PROPPATCH request to the server; returns an instance of a subclass of + # Net::HTTPResponse. + # + # The request is based on the Net::HTTP::Proppatch object created from string + # `path`, string `body`, and initial headers hash `initheader`. + # + # data = '{"userId": 1, "id": 1, "title": "delectus aut autem", "completed": false}' + # http = Net::HTTP.new(hostname) + # http.proppatch('/todos/1', data) + # + def proppatch: (String path, String body, ?headers initheader) -> Net::HTTPResponse + + # + # Sends a LOCK request to the server; returns an instance of a subclass of + # Net::HTTPResponse. + # + # The request is based on the Net::HTTP::Lock object created from string `path`, + # string `body`, and initial headers hash `initheader`. + # + # data = '{"userId": 1, "id": 1, "title": "delectus aut autem", "completed": false}' + # http = Net::HTTP.new(hostname) + # http.lock('/todos/1', data) + # + def lock: (String path, String body, ?headers initheader) -> Net::HTTPResponse + + # + # Sends an UNLOCK request to the server; returns an instance of a subclass of + # Net::HTTPResponse. + # + # The request is based on the Net::HTTP::Unlock object created from string + # `path`, string `body`, and initial headers hash `initheader`. + # + # data = '{"userId": 1, "id": 1, "title": "delectus aut autem", "completed": false}' + # http = Net::HTTP.new(hostname) + # http.unlock('/todos/1', data) + # + def unlock: (String path, String body, ?headers initheader) -> Net::HTTPResponse + + # + # Sends an Options request to the server; returns an instance of a subclass of + # Net::HTTPResponse. + # + # The request is based on the Net::HTTP::Options object created from string + # `path` and initial headers hash `initheader`. + # + # http = Net::HTTP.new(hostname) + # http.options('/') + # + def options: (String path, ?headers initheader) -> Net::HTTPResponse + + # + # Sends a PROPFIND request to the server; returns an instance of a subclass of + # Net::HTTPResponse. + # + # The request is based on the Net::HTTP::Propfind object created from string + # `path`, string `body`, and initial headers hash `initheader`. + # + # data = '{"userId": 1, "id": 1, "title": "delectus aut autem", "completed": false}' + # http = Net::HTTP.new(hostname) + # http.propfind('/todos/1', data) + # + def propfind: (String path, ?untyped? body, ?headers initheader) -> Net::HTTPResponse + + # + # Sends a DELETE request to the server; returns an instance of a subclass of + # Net::HTTPResponse. + # + # The request is based on the Net::HTTP::Delete object created from string + # `path` and initial headers hash `initheader`. + # + # http = Net::HTTP.new(hostname) + # http.delete('/todos/1') + # + def delete: (String path, ?headers initheader) -> Net::HTTPResponse + + # + # Sends a MOVE request to the server; returns an instance of a subclass of + # Net::HTTPResponse. + # + # The request is based on the Net::HTTP::Move object created from string `path` + # and initial headers hash `initheader`. + # + # http = Net::HTTP.new(hostname) + # http.move('/todos/1') + # + def move: (String path, ?headers initheader) -> Net::HTTPResponse + + # + # Sends a COPY request to the server; returns an instance of a subclass of + # Net::HTTPResponse. + # + # The request is based on the Net::HTTP::Copy object created from string `path` + # and initial headers hash `initheader`. + # + # http = Net::HTTP.new(hostname) + # http.copy('/todos/1') + # + def copy: (String path, ?headers initheader) -> Net::HTTPResponse + + # + # Sends a MKCOL request to the server; returns an instance of a subclass of + # Net::HTTPResponse. + # + # The request is based on the Net::HTTP::Mkcol object created from string + # `path`, string `body`, and initial headers hash `initheader`. + # + # data = '{"userId": 1, "id": 1, "title": "delectus aut autem", "completed": false}' + # http.mkcol('/todos/1', data) + # http = Net::HTTP.new(hostname) + # + def mkcol: (String path, ?untyped? body, ?headers initheader) -> Net::HTTPResponse + + # + # Sends a TRACE request to the server; returns an instance of a subclass of + # Net::HTTPResponse. + # + # The request is based on the Net::HTTP::Trace object created from string `path` + # and initial headers hash `initheader`. + # + # http = Net::HTTP.new(hostname) + # http.trace('/todos/1') + # + def trace: (String path, ?headers initheader) -> Net::HTTPResponse + + # + # Sends a GET request to the server; forms the response into a Net::HTTPResponse + # object. + # + # The request is based on the Net::HTTP::Get object created from string `path` + # and initial headers hash `initheader`. + # + # With no block given, returns the response object: + # + # http = Net::HTTP.new(hostname) + # http.request_get('/todos') # => # + # + # With a block given, calls the block with the response object and returns the + # response object: + # + # http.request_get('/todos') do |res| + # p res + # end # => # + # + # Output: + # + # # + # + def request_get: (String path, ?headers initheader) ?{ (Net::HTTPResponse response) -> void } -> Net::HTTPResponse + + # + # Sends a HEAD request to the server; returns an instance of a subclass of + # Net::HTTPResponse. + # + # The request is based on the Net::HTTP::Head object created from string `path` + # and initial headers hash `initheader`. + # + # http = Net::HTTP.new(hostname) + # http.head('/todos/1') # => # + # + def request_head: (String path, ?headers initheader) ?{ (Net::HTTPResponse response) -> void } -> Net::HTTPResponse + + # + # Sends a POST request to the server; forms the response into a + # Net::HTTPResponse object. + # + # The request is based on the Net::HTTP::Post object created from string `path`, + # string `data`, and initial headers hash `initheader`. + # + # With no block given, returns the response object: + # + # http = Net::HTTP.new(hostname) + # http.post('/todos', 'xyzzy') + # # => # + # + # With a block given, calls the block with the response body and returns the + # response object: + # + # http.post('/todos', 'xyzzy') do |res| + # p res + # end # => # + # + # Output: + # + # "{\n \"xyzzy\": \"\",\n \"id\": 201\n}" + # + def request_post: (String path, String data, ?headers initheader) ?{ (Net::HTTPResponse response) -> void } -> Net::HTTPResponse + + def request_put: (String path, String data, ?headers initheader) ?{ (Net::HTTPResponse response) -> void } -> Net::HTTPResponse + + # + # + alias get2 request_get + + # + # + alias head2 request_head + + # + # + alias post2 request_post + + alias put2 request_put + + # + # Sends an HTTP request to the server; returns an instance of a subclass of + # Net::HTTPResponse. + # + # The request is based on the Net::HTTPRequest object created from string + # `path`, string `data`, and initial headers hash `header`. That object is an + # instance of the [subclass of + # Net::HTTPRequest](rdoc-ref:Net::HTTPRequest@Request+Subclasses), that + # corresponds to the given uppercase string `name`, which must be an [HTTP + # request method](https://en.wikipedia.org/wiki/HTTP#Request_methods) or a + # [WebDAV request method](https://en.wikipedia.org/wiki/WebDAV#Implementation). + # + # Examples: + # + # http = Net::HTTP.new(hostname) + # http.send_request('GET', '/todos/1') + # # => # + # http.send_request('POST', '/todos', 'xyzzy') + # # => # + # + def send_request: (String name, String path, ?String? data, ?headers? header) -> Net::HTTPResponse + + # + # Sends the given request `req` to the server; forms the response into a + # Net::HTTPResponse object. + # + # The given `req` must be an instance of a [subclass of + # Net::HTTPRequest](rdoc-ref:Net::HTTPRequest@Request+Subclasses). Argument + # `body` should be given only if needed for the request. + # + # With no block given, returns the response object: + # + # http = Net::HTTP.new(hostname) + # + # req = Net::HTTP::Get.new('/todos/1') + # http.request(req) + # # => # + # + # req = Net::HTTP::Post.new('/todos') + # http.request(req, 'xyzzy') + # # => # + # + # With a block given, calls the block with the response and returns the + # response: + # + # req = Net::HTTP::Get.new('/todos/1') + # http.request(req) do |res| + # p res + # end # => # + # + # Output: + # + # # + # + def request: (Net::HTTPRequest req, ?String? body) ?{ (Net::HTTPResponse response) -> void } -> Net::HTTPResponse + end + + # + # HTTPGenericRequest is the parent of the Net::HTTPRequest class. + # + # Do not use this directly; instead, use a subclass of Net::HTTPRequest. + # + # ## About the Examples + # + # Examples here assume that net/http has been required (which also + # requires `uri`): + # + # require 'net/http' + # + # Many code examples here use these example websites: + # + # * https://jsonplaceholder.typicode.com. + # * http://example.com. + # + # Some examples also assume these variables: + # + # uri = URI('https://jsonplaceholder.typicode.com/') + # uri.freeze # Examples may not modify. + # hostname = uri.hostname # => "jsonplaceholder.typicode.com" + # path = uri.path # => "/" + # port = uri.port # => 443 + # + # So that example requests may be written as: + # + # Net::HTTP.get(uri) + # Net::HTTP.get(hostname, '/index.html') + # Net::HTTP.start(hostname) do |http| + # http.get('/todos/1') + # http.get('/todos/2') + # end + # + # An example that needs a modified URI first duplicates `uri`, then modifies the + # duplicate: + # + # _uri = uri.dup + # _uri.path = '/todos/1' + # + class HTTPGenericRequest + include Net::HTTPHeader + + # + # + def initialize: (String m, boolish reqbody, boolish resbody, URI::Generic | String uri_or_path, ?headers initheader) -> void + + # + # Returns the string method name for the request: + # + # Net::HTTP::Get.new(uri).method # => "GET" + # Net::HTTP::Post.new(uri).method # => "POST" + # + attr_reader method: String + + # + # Returns the string path for the request: + # + # Net::HTTP::Get.new(uri).path # => "/" + # Net::HTTP::Post.new('example.com').path # => "example.com" + # + attr_reader path: String + + # + # Returns the URI object for the request, or `nil` if none: + # + # Net::HTTP::Get.new(uri).uri + # # => # + # Net::HTTP::Get.new('example.com').uri # => nil + # + attr_reader uri: URI::Generic + + # + # Returns `false` if the request's header 'Accept-Encoding' has + # been set manually or deleted (indicating that the user intends to handle + # encoding in the response), `true` otherwise: + # + # req = Net::HTTP::Get.new(uri) # => # + # req['Accept-Encoding'] # => "gzip;q=1.0,deflate;q=0.6,identity;q=0.3" + # req.decode_content # => true + # req['Accept-Encoding'] = 'foo' + # req.decode_content # => false + # req.delete('Accept-Encoding') + # req.decode_content # => false + # + attr_reader decode_content: bool + + # + # Returns a string representation of the request: + # + # Net::HTTP::Post.new(uri).inspect # => "#" + # + def inspect: () -> String + + def []=: (untyped key, untyped val) -> void + + # + # Returns whether the request may have a body: + # + # Net::HTTP::Post.new(uri).request_body_permitted? # => true + # Net::HTTP::Get.new(uri).request_body_permitted? # => false + # + def request_body_permitted?: () -> bool + + # + # Returns whether the response may have a body: + # + # Net::HTTP::Post.new(uri).response_body_permitted? # => true + # Net::HTTP::Head.new(uri).response_body_permitted? # => false + # + def response_body_permitted?: () -> bool + + # + # + def body_exist?: () -> bool + + # + # Returns the string body for the request, or `nil` if there is none: + # + # req = Net::HTTP::Post.new(uri) + # req.body # => nil + # req.body = '{"title": "foo","body": "bar","userId": 1}' + # req.body # => "{\"title\": \"foo\",\"body\": \"bar\",\"userId\": 1}" + # ---- + # + # Sets the body for the request: + # + # req = Net::HTTP::Post.new(uri) + # req.body # => nil + # req.body = '{"title": "foo","body": "bar","userId": 1}' + # req.body # => "{\"title\": \"foo\",\"body\": \"bar\",\"userId\": 1}" + # + attr_accessor body: String? + + # + # Returns the body stream object for the request, or `nil` if there is none: + # + # req = Net::HTTP::Post.new(uri) # => # + # req.body_stream # => nil + # require 'stringio' + # req.body_stream = StringIO.new('xyzzy') # => # + # req.body_stream # => # + # ---- + # + # Sets the body stream for the request: + # + # req = Net::HTTP::Post.new(uri) # => # + # req.body_stream # => nil + # require 'stringio' + # req.body_stream = StringIO.new('xyzzy') # => # + # req.body_stream # => # + # + attr_accessor body_stream: untyped + end + + # + # The HTTPHeader module provides access to HTTP headers. + # + # The module is included in: + # + # * Net::HTTPGenericRequest (and therefore Net::HTTPRequest). + # * Net::HTTPResponse. + # + # The headers are a hash-like collection of key/value pairs called *fields*. + # + # ## Request and Response Fields + # + # Headers may be included in: + # + # * A Net::HTTPRequest object: the object's headers will be sent with the + # request. Any fields may be defined in the request; see + # [Setters](rdoc-ref:Net::HTTPHeader@Setters). + # * A Net::HTTPResponse object: the objects headers are usually those returned + # from the host. Fields may be retrieved from the object; see + # [Getters](rdoc-ref:Net::HTTPHeader@Getters) and + # [Iterators](rdoc-ref:Net::HTTPHeader@Iterators). + # + # Exactly which fields should be sent or expected depends on the host; see: + # + # * [Request + # fields](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Request_f + # ields). + # * [Response + # fields](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Response_ + # fields). + # + # ## About the Examples + # + # Examples here assume that net/http has been required (which also + # requires `uri`): + # + # require 'net/http' + # + # Many code examples here use these example websites: + # + # * https://jsonplaceholder.typicode.com. + # * http://example.com. + # + # Some examples also assume these variables: + # + # uri = URI('https://jsonplaceholder.typicode.com/') + # uri.freeze # Examples may not modify. + # hostname = uri.hostname # => "jsonplaceholder.typicode.com" + # path = uri.path # => "/" + # port = uri.port # => 443 + # + # So that example requests may be written as: + # + # Net::HTTP.get(uri) + # Net::HTTP.get(hostname, '/index.html') + # Net::HTTP.start(hostname) do |http| + # http.get('/todos/1') + # http.get('/todos/2') + # end + # + # An example that needs a modified URI first duplicates `uri`, then modifies the + # duplicate: + # + # _uri = uri.dup + # _uri.path = '/todos/1' + # + # ## Fields + # + # A header field is a key/value pair. + # + # ### Field Keys + # + # A field key may be: + # + # * A string: Key 'Accept' is treated as if it were + # 'Accept'.downcase; i.e., 'accept'. + # * A symbol: Key :Accept is treated as if it were + # :Accept.to_s.downcase; i.e., 'accept'. + # + # Examples: + # + # req = Net::HTTP::Get.new(uri) + # req[:accept] # => "*/*" + # req['Accept'] # => "*/*" + # req['ACCEPT'] # => "*/*" + # + # req['accept'] = 'text/html' + # req[:accept] = 'text/html' + # req['ACCEPT'] = 'text/html' + # + # ### Field Values + # + # A field value may be returned as an array of strings or as a string: + # + # * These methods return field values as arrays: + # + # * #get_fields: Returns the array value for the given key, or `nil` if it + # does not exist. + # * #to_hash: Returns a hash of all header fields: each key is a field + # name; its value is the array value for the field. + # + # * These methods return field values as string; the string value for a field + # is equivalent to self[key.downcase.to_s].join(', ')): + # + # * #[]: Returns the string value for the given key, or `nil` if it does + # not exist. + # * #fetch: Like #[], but accepts a default value to be returned if the + # key does not exist. + # + # The field value may be set: + # + # * #[]=: Sets the value for the given key; the given value may be a string, a + # symbol, an array, or a hash. + # * #add_field: Adds a given value to a value for the given key (not + # overwriting the existing value). + # * #delete: Deletes the field for the given key. + # + # Example field values: + # + # * String: + # + # req['Accept'] = 'text/html' # => "text/html" + # req['Accept'] # => "text/html" + # req.get_fields('Accept') # => ["text/html"] + # + # * Symbol: + # + # req['Accept'] = :text # => :text + # req['Accept'] # => "text" + # req.get_fields('Accept') # => ["text"] + # + # * Simple array: + # + # req[:foo] = %w[bar baz bat] + # req[:foo] # => "bar, baz, bat" + # req.get_fields(:foo) # => ["bar", "baz", "bat"] + # + # * Simple hash: + # + # req[:foo] = {bar: 0, baz: 1, bat: 2} + # req[:foo] # => "bar, 0, baz, 1, bat, 2" + # req.get_fields(:foo) # => ["bar", "0", "baz", "1", "bat", "2"] + # + # * Nested: + # + # req[:foo] = [%w[bar baz], {bat: 0, bam: 1}] + # req[:foo] # => "bar, baz, bat, 0, bam, 1" + # req.get_fields(:foo) # => ["bar", "baz", "bat", "0", "bam", "1"] + # + # req[:foo] = {bar: %w[baz bat], bam: {bah: 0, bad: 1}} + # req[:foo] # => "bar, baz, bat, bam, bah, 0, bad, 1" + # req.get_fields(:foo) # => ["bar", "baz", "bat", "bam", "bah", "0", "bad", "1"] + # + # ## Convenience Methods + # + # Various convenience methods retrieve values, set values, query values, set + # form values, or iterate over fields. + # + # ### Setters + # + # Method #[]= can set any field, but does little to validate the new value; some + # of the other setter methods provide some validation: + # + # * #[]=: Sets the string or array value for the given key. + # * #add_field: Creates or adds to the array value for the given key. + # * #basic_auth: Sets the string authorization header for + # 'Authorization'. + # * #content_length=: Sets the integer length for field + # 'Content-Length. + # * #content_type=: Sets the string value for field + # 'Content-Type'. + # * #proxy_basic_auth: Sets the string authorization header for + # 'Proxy-Authorization'. + # * #set_range: Sets the value for field 'Range'. + # + # ### Form Setters + # + # * #set_form: Sets an HTML form data set. + # * #set_form_data: Sets header fields and a body from HTML form data. + # + # ### Getters + # + # Method #[] can retrieve the value of any field that exists, but always as a + # string; some of the other getter methods return something different from the + # simple string value: + # + # * #[]: Returns the string field value for the given key. + # * #content_length: Returns the integer value of field + # 'Content-Length'. + # * #content_range: Returns the Range value of field + # 'Content-Range'. + # * #content_type: Returns the string value of field + # 'Content-Type'. + # * #fetch: Returns the string field value for the given key. + # * #get_fields: Returns the array field value for the given `key`. + # * #main_type: Returns first part of the string value of field + # 'Content-Type'. + # * #sub_type: Returns second part of the string value of field + # 'Content-Type'. + # * #range: Returns an array of Range objects of field 'Range', + # or `nil`. + # * #range_length: Returns the integer length of the range given in field + # 'Content-Range'. + # * #type_params: Returns the string parameters for + # 'Content-Type'. + # + # ### Queries + # + # * #chunked?: Returns whether field 'Transfer-Encoding' is set + # to 'chunked'. + # * #connection_close?: Returns whether field 'Connection' is set + # to 'close'. + # * #connection_keep_alive?: Returns whether field 'Connection' + # is set to 'keep-alive'. + # * #key?: Returns whether a given key exists. + # + # ### Iterators + # + # * #each_capitalized: Passes each field capitalized-name/value pair to the + # block. + # * #each_capitalized_name: Passes each capitalized field name to the block. + # * #each_header: Passes each field name/value pair to the block. + # * #each_name: Passes each field name to the block. + # * #each_value: Passes each string field value to the block. + # + module HTTPHeader : BasicObject + # + # + def initialize_http_header: (Hash[untyped, untyped] initheader) -> void + + def size: () -> Integer + + alias length size + + # A previous incarnation of `interned` for backward-compatibility (see #1499) + %a{deprecated: Use `interned` instead} + type key = interned + + # + # Returns the string field value for the case-insensitive field `key`, or `nil` + # if there is no such key; see [Fields](rdoc-ref:Net::HTTPHeader@Fields): + # + # res = Net::HTTP.get_response(hostname, '/todos/1') + # res['Connection'] # => "keep-alive" + # res['Nosuch'] # => nil + # + # Note that some field values may be retrieved via convenience methods; see + # [Getters](rdoc-ref:Net::HTTPHeader@Getters). + # + def []: (interned key) -> (nil | String) + + # + # Sets the value for the case-insensitive `key` to `val`, overwriting the + # previous value if the field exists; see + # [Fields](rdoc-ref:Net::HTTPHeader@Fields): + # + # req = Net::HTTP::Get.new(uri) + # req['Accept'] # => "*/*" + # req['Accept'] = 'text/html' + # req['Accept'] # => "text/html" + # + # Note that some field values may be set via convenience methods; see + # [Setters](rdoc-ref:Net::HTTPHeader@Setters). + # + def []=: (interned key, untyped val) -> void + + # + # Adds value `val` to the value array for field `key` if the field exists; + # creates the field with the given `key` and `val` if it does not exist. see + # [Fields](rdoc-ref:Net::HTTPHeader@Fields): + # + # req = Net::HTTP::Get.new(uri) + # req.add_field('Foo', 'bar') + # req['Foo'] # => "bar" + # req.add_field('Foo', 'baz') + # req['Foo'] # => "bar, baz" + # req.add_field('Foo', %w[baz bam]) + # req['Foo'] # => "bar, baz, baz, bam" + # req.get_fields('Foo') # => ["bar", "baz", "baz", "bam"] + # + def add_field: (interned key, untyped val) -> void + + private + + # + # + def set_field: (interned key, untyped val) -> void + + # + # + def append_field_value: (untyped ary, untyped val) -> void + + public + + # + # Returns the array field value for the given `key`, or `nil` if there is no + # such field; see [Fields](rdoc-ref:Net::HTTPHeader@Fields): + # + # res = Net::HTTP.get_response(hostname, '/todos/1') + # res.get_fields('Connection') # => ["keep-alive"] + # res.get_fields('Nosuch') # => nil + # + def get_fields: (interned key) -> (nil | Array[String]) + + # + # With a block, returns the string value for `key` if it exists; otherwise + # returns the value of the block; ignores the `default_val`; see + # [Fields](rdoc-ref:Net::HTTPHeader@Fields): + # + # res = Net::HTTP.get_response(hostname, '/todos/1') + # + # # Field exists; block not called. + # res.fetch('Connection') do |value| + # fail 'Cannot happen' + # end # => "keep-alive" + # + # # Field does not exist; block called. + # res.fetch('Nosuch') do |value| + # value.downcase + # end # => "nosuch" + # + # With no block, returns the string value for `key` if it exists; otherwise, + # returns `default_val` if it was given; otherwise raises an exception: + # + # res.fetch('Connection', 'Foo') # => "keep-alive" + # res.fetch('Nosuch', 'Foo') # => "Foo" + # res.fetch('Nosuch') # Raises KeyError. + # + def fetch: (interned key) -> String + | (interned key, untyped) -> untyped + | (interned key) { (String) -> untyped } -> untyped + + # + # Calls the block with each key/value pair: + # + # res = Net::HTTP.get_response(hostname, '/todos/1') + # res.each_header do |key, value| + # p [key, value] if key.start_with?('c') + # end + # + # Output: + # + # ["content-type", "application/json; charset=utf-8"] + # ["connection", "keep-alive"] + # ["cache-control", "max-age=43200"] + # ["cf-cache-status", "HIT"] + # ["cf-ray", "771d17e9bc542cf5-ORD"] + # + # Returns an enumerator if no block is given. + # + # Net::HTTPHeader#each is an alias for Net::HTTPHeader#each_header. + # + def each_header: () { (String, String) -> untyped } -> Hash[String, Array[String]] + | () -> Enumerator[[ String, String ], Hash[String, Array[String]]] + + # + # + alias each each_header + + # + # Calls the block with each field key: + # + # res = Net::HTTP.get_response(hostname, '/todos/1') + # res.each_key do |key| + # p key if key.start_with?('c') + # end + # + # Output: + # + # "content-type" + # "connection" + # "cache-control" + # "cf-cache-status" + # "cf-ray" + # + # Returns an enumerator if no block is given. + # + # Net::HTTPHeader#each_name is an alias for Net::HTTPHeader#each_key. + # + def each_name: () { (String) -> untyped } -> Hash[String, Array[String]] + | () -> Enumerator[String, Hash[String, Array[String]]] + + # + # + alias each_key each_name + + # + # Calls the block with each capitalized field name: + # + # res = Net::HTTP.get_response(hostname, '/todos/1') + # res.each_capitalized_name do |key| + # p key if key.start_with?('C') + # end + # + # Output: + # + # "Content-Type" + # "Connection" + # "Cache-Control" + # "Cf-Cache-Status" + # "Cf-Ray" + # + # The capitalization is system-dependent; see [Case + # Mapping](rdoc-ref:case_mapping.rdoc). + # + # Returns an enumerator if no block is given. + # + def each_capitalized_name: () { (String) -> untyped } -> Hash[String, Array[String]] + | () -> Enumerator[String, Hash[String, Array[String]]] + + # + # Calls the block with each string field value: + # + # res = Net::HTTP.get_response(hostname, '/todos/1') + # res.each_value do |value| + # p value if value.start_with?('c') + # end + # + # Output: + # + # "chunked" + # "cf-q-config;dur=6.0000002122251e-06" + # "cloudflare" + # + # Returns an enumerator if no block is given. + # + def each_value: () { (String) -> untyped } -> Hash[String, Array[String]] + | () -> Enumerator[String, Hash[String, Array[String]]] + + # + # Removes the header for the given case-insensitive `key` (see + # [Fields](rdoc-ref:Net::HTTPHeader@Fields)); returns the deleted value, or + # `nil` if no such field exists: + # + # req = Net::HTTP::Get.new(uri) + # req.delete('Accept') # => ["*/*"] + # req.delete('Nosuch') # => nil + # + def delete: (interned key) -> (Array[String] | nil) + + # + # Returns `true` if the field for the case-insensitive `key` exists, `false` + # otherwise: + # + # req = Net::HTTP::Get.new(uri) + # req.key?('Accept') # => true + # req.key?('Nosuch') # => false + # + def key?: (interned key) -> bool + + # + # Returns a hash of the key/value pairs: + # + # req = Net::HTTP::Get.new(uri) + # req.to_hash + # # => + # {"accept-encoding"=>["gzip;q=1.0,deflate;q=0.6,identity;q=0.3"], + # "accept"=>["*/*"], + # "user-agent"=>["Ruby"], + # "host"=>["jsonplaceholder.typicode.com"]} + # + def to_hash: () -> Hash[String, Array[String]] + + # + # Like #each_header, but the keys are returned in capitalized form. + # + # Net::HTTPHeader#canonical_each is an alias for + # Net::HTTPHeader#each_capitalized. + # + def each_capitalized: () { (String, String) -> untyped } -> Hash[String, Array[String]] + | () -> Enumerator[[ String, String ], Hash[String, Array[String]]] + + # + # + alias canonical_each each_capitalized + + private + + # + # + def capitalize: (interned name) -> String + + public + + # + # Returns an array of Range objects that represent the value of field + # 'Range', or `nil` if there is no such field; see [Range request + # header](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#range-request + # -header): + # + # req = Net::HTTP::Get.new(uri) + # req['Range'] = 'bytes=0-99,200-299,400-499' + # req.range # => [0..99, 200..299, 400..499] + # req.delete('Range') + # req.range # # => nil + # + def range: () -> (nil | Array[Range[Integer]]) + + # + # Sets the value for field 'Range'; see [Range request + # header](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#range-request + # -header): + # + # With argument `length`: + # + # req = Net::HTTP::Get.new(uri) + # req.set_range(100) # => 100 + # req['Range'] # => "bytes=0-99" + # + # With arguments `offset` and `length`: + # + # req.set_range(100, 100) # => 100...200 + # req['Range'] # => "bytes=100-199" + # + # With argument `range`: + # + # req.set_range(100..199) # => 100..199 + # req['Range'] # => "bytes=100-199" + # + # Net::HTTPHeader#range= is an alias for Net::HTTPHeader#set_range. + # + def set_range: (Range[Integer] | Numeric r, ?Integer? e) -> Range[Integer] + + # + # + alias range= set_range + + # + # Returns the value of field 'Content-Length' as an integer, or + # `nil` if there is no such field; see [Content-Length request + # header](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#content-lengt + # h-request-header): + # + # res = Net::HTTP.get_response(hostname, '/nosuch/1') + # res.content_length # => 2 + # res = Net::HTTP.get_response(hostname, '/todos/1') + # res.content_length # => nil + # + def content_length: () -> (nil | Integer) + + # + # Sets the value of field 'Content-Length' to the given numeric; + # see [Content-Length response + # header](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#content-lengt + # h-response-header): + # + # _uri = uri.dup + # hostname = _uri.hostname # => "jsonplaceholder.typicode.com" + # _uri.path = '/posts' # => "/posts" + # req = Net::HTTP::Post.new(_uri) # => # + # req.body = '{"title": "foo","body": "bar","userId": 1}' + # req.content_length = req.body.size # => 42 + # req.content_type = 'application/json' + # res = Net::HTTP.start(hostname) do |http| + # http.request(req) + # end # => # + # + def content_length=: (Integer len) -> void + + # + # Returns `true` if field 'Transfer-Encoding' exists and has value + # 'chunked', `false` otherwise; see [Transfer-Encoding response + # header](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#transfer-enco + # ding-response-header): + # + # res = Net::HTTP.get_response(hostname, '/todos/1') + # res['Transfer-Encoding'] # => "chunked" + # res.chunked? # => true + # + def chunked?: () -> bool + + # + # Returns a Range object representing the value of field + # 'Content-Range', or `nil` if no such field exists; see + # [Content-Range response + # header](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#content-range + # -response-header): + # + # res = Net::HTTP.get_response(hostname, '/todos/1') + # res['Content-Range'] # => nil + # res['Content-Range'] = 'bytes 0-499/1000' + # res['Content-Range'] # => "bytes 0-499/1000" + # res.content_range # => 0..499 + # + def content_range: () -> (Range[Integer] | nil) + + # + # Returns the integer representing length of the value of field + # 'Content-Range', or `nil` if no such field exists; see + # [Content-Range response + # header](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#content-range + # -response-header): + # + # res = Net::HTTP.get_response(hostname, '/todos/1') + # res['Content-Range'] # => nil + # res['Content-Range'] = 'bytes 0-499/1000' + # res.range_length # => 500 + # + def range_length: () -> (nil | Integer) + + # + # Returns the [media type](https://en.wikipedia.org/wiki/Media_type) from the + # value of field 'Content-Type', or `nil` if no such field exists; + # see [Content-Type response + # header](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#content-type- + # response-header): + # + # res = Net::HTTP.get_response(hostname, '/todos/1') + # res['content-type'] # => "application/json; charset=utf-8" + # res.content_type # => "application/json" + # + def content_type: () -> (nil | String) + + # + # Returns the leading ('type') part of the [media + # type](https://en.wikipedia.org/wiki/Media_type) from the value of field + # 'Content-Type', or `nil` if no such field exists; see + # [Content-Type response + # header](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#content-type- + # response-header): + # + # res = Net::HTTP.get_response(hostname, '/todos/1') + # res['content-type'] # => "application/json; charset=utf-8" + # res.main_type # => "application" + # + def main_type: () -> (nil | String) + + # + # Returns the trailing ('subtype') part of the [media + # type](https://en.wikipedia.org/wiki/Media_type) from the value of field + # 'Content-Type', or `nil` if no such field exists; see + # [Content-Type response + # header](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#content-type- + # response-header): + # + # res = Net::HTTP.get_response(hostname, '/todos/1') + # res['content-type'] # => "application/json; charset=utf-8" + # res.sub_type # => "json" + # + def sub_type: () -> (nil | String) + + # + # Returns the trailing ('parameters') part of the value of field + # 'Content-Type', or `nil` if no such field exists; see + # [Content-Type response + # header](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#content-type- + # response-header): + # + # res = Net::HTTP.get_response(hostname, '/todos/1') + # res['content-type'] # => "application/json; charset=utf-8" + # res.type_params # => {"charset"=>"utf-8"} + # + def type_params: () -> Hash[untyped, untyped] + + # + # Sets the value of field 'Content-Type'; returns the new value; + # see [Content-Type request + # header](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#content-type- + # request-header): + # + # req = Net::HTTP::Get.new(uri) + # req.set_content_type('application/json') # => ["application/json"] + # + # Net::HTTPHeader#content_type= is an alias for + # Net::HTTPHeader#set_content_type. + # + def set_content_type: (interned `type`, ?Hash[untyped, untyped] params) -> void + + # + # + alias content_type= set_content_type + + # + # Sets the request body to a URL-encoded string derived from argument `params`, + # and sets request header field 'Content-Type' to + # 'application/x-www-form-urlencoded'. + # + # The resulting request is suitable for HTTP request `POST` or `PUT`. + # + # Argument `params` must be suitable for use as argument `enum` to + # [URI.encode_www_form](rdoc-ref:URI.encode_www_form). + # + # With only argument `params` given, sets the body to a URL-encoded string with + # the default separator '&': + # + # req = Net::HTTP::Post.new('example.com') + # + # req.set_form_data(q: 'ruby', lang: 'en') + # req.body # => "q=ruby&lang=en" + # req['Content-Type'] # => "application/x-www-form-urlencoded" + # + # req.set_form_data([['q', 'ruby'], ['lang', 'en']]) + # req.body # => "q=ruby&lang=en" + # + # req.set_form_data(q: ['ruby', 'perl'], lang: 'en') + # req.body # => "q=ruby&q=perl&lang=en" + # + # req.set_form_data([['q', 'ruby'], ['q', 'perl'], ['lang', 'en']]) + # req.body # => "q=ruby&q=perl&lang=en" + # + # With string argument `sep` also given, uses that string as the separator: + # + # req.set_form_data({q: 'ruby', lang: 'en'}, '|') + # req.body # => "q=ruby|lang=en" + # + # Net::HTTPHeader#form_data= is an alias for Net::HTTPHeader#set_form_data. + # + def set_form_data: (Hash[untyped, untyped] params, ?String sep) -> void + + # + # + alias form_data= set_form_data + + # + # Stores form data to be used in a `POST` or `PUT` request. + # + # The form data given in `params` consists of zero or more fields; each field + # is: + # + # * A scalar value. + # * A name/value pair. + # * An IO stream opened for reading. + # + # Argument `params` should be an + # [Enumerable](rdoc-ref:Enumerable@Enumerable+in+Ruby+Classes) (method + # params.map will be called), and is often an array or hash. + # + # First, we set up a request: + # + # _uri = uri.dup + # _uri.path ='/posts' + # req = Net::HTTP::Post.new(_uri) + # + # Argument `params` As an Array + # + # When `params` is an array, each of its elements is a subarray that defines a + # field; the subarray may contain: + # + # * One string: + # + # req.set_form([['foo'], ['bar'], ['baz']]) + # + # * Two strings: + # + # req.set_form([%w[foo 0], %w[bar 1], %w[baz 2]]) + # + # * When argument `enctype` (see below) is given as + # 'multipart/form-data': + # + # * A string name and an IO stream opened for reading: + # + # require 'stringio' + # req.set_form([['file', StringIO.new('Ruby is cool.')]]) + # + # * A string name, an IO stream opened for reading, and an options hash, + # which may contain these entries: + # + # * :filename: The name of the file to use. + # * :content_type: The content type of the uploaded file. + # + # Example: + # + # req.set_form([['file', file, {filename: "other-filename.foo"}]] + # + # The various forms may be mixed: + # + # req.set_form(['foo', %w[bar 1], ['file', file]]) + # + # Argument `params` As a Hash + # + # When `params` is a hash, each of its entries is a name/value pair that defines + # a field: + # + # * The name is a string. + # * The value may be: + # + # * `nil`. + # * Another string. + # * An IO stream opened for reading (only when argument `enctype` -- see + # below -- is given as 'multipart/form-data'). + # + # Examples: + # + # # Nil-valued fields. + # req.set_form({'foo' => nil, 'bar' => nil, 'baz' => nil}) + # + # # String-valued fields. + # req.set_form({'foo' => 0, 'bar' => 1, 'baz' => 2}) + # + # # IO-valued field. + # require 'stringio' + # req.set_form({'file' => StringIO.new('Ruby is cool.')}) + # + # # Mixture of fields. + # req.set_form({'foo' => nil, 'bar' => 1, 'file' => file}) + # + # Optional argument `enctype` specifies the value to be given to field + # 'Content-Type', and must be one of: + # + # * 'application/x-www-form-urlencoded' (the default). + # * 'multipart/form-data'; see [RFC + # 7578](https://www.rfc-editor.org/rfc/rfc7578). + # + # Optional argument `formopt` is a hash of options (applicable only when + # argument `enctype` is 'multipart/form-data') that may include the + # following entries: + # + # * :boundary: The value is the boundary string for the multipart + # message. If not given, the boundary is a random string. See + # [Boundary](https://www.rfc-editor.org/rfc/rfc7578#section-4.1). + # * :charset: Value is the character set for the form submission. + # Field names and values of non-file fields should be encoded with this + # charset. + # + def set_form: (Hash[untyped, untyped] params, ?String enctype, ?Hash[untyped, untyped] formopt) -> void + + # + # Sets header 'Authorization' using the given `account` and + # `password` strings: + # + # req.basic_auth('my_account', 'my_password') + # req['Authorization'] + # # => "Basic bXlfYWNjb3VudDpteV9wYXNzd29yZA==" + # + def basic_auth: (String account, String password) -> void + + # + # Sets header 'Proxy-Authorization' using the given `account` and + # `password` strings: + # + # req.proxy_basic_auth('my_account', 'my_password') + # req['Proxy-Authorization'] + # # => "Basic bXlfYWNjb3VudDpteV9wYXNzd29yZA==" + # + def proxy_basic_auth: (String account, String password) -> void + + private + + # + # + def basic_encode: (String account, String password) -> String + + public + + # + # Returns whether the HTTP session is to be closed. + # + def connection_close?: () -> bool + + # + # Returns whether the HTTP session is to be kept alive. + # + def connection_keep_alive?: () -> bool + end + + # + # This class is the base class for Net::HTTP request classes. The class should + # not be used directly; instead you should use its subclasses, listed below. + # + # ## Creating a Request + # + # An request object may be created with either a URI or a string hostname: + # + # require 'net/http' + # uri = URI('https://jsonplaceholder.typicode.com/') + # req = Net::HTTP::Get.new(uri) # => # + # req = Net::HTTP::Get.new(uri.hostname) # => # + # + # And with any of the subclasses: + # + # req = Net::HTTP::Head.new(uri) # => # + # req = Net::HTTP::Post.new(uri) # => # + # req = Net::HTTP::Put.new(uri) # => # + # # ... + # + # The new instance is suitable for use as the argument to Net::HTTP#request. + # + # ## Request Headers + # + # A new request object has these header fields by default: + # + # req.to_hash + # # => + # {"accept-encoding"=>["gzip;q=1.0,deflate;q=0.6,identity;q=0.3"], + # "accept"=>["*/*"], + # "user-agent"=>["Ruby"], + # "host"=>["jsonplaceholder.typicode.com"]} + # + # See: + # + # * [Request header + # Accept-Encoding](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields# + # Accept-Encoding) and [Compression and + # Decompression](rdoc-ref:Net::HTTP@Compression+and+Decompression). + # * [Request header + # Accept](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#accept-re + # quest-header). + # * [Request header + # User-Agent](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#user- + # agent-request-header). + # * [Request header + # Host](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#host-reques + # t-header). + # + # You can add headers or override default headers: + # + # # res = Net::HTTP::Get.new(uri, {'foo' => '0', 'bar' => '1'}) + # + # This class (and therefore its subclasses) also includes (indirectly) module + # Net::HTTPHeader, which gives access to its [methods for setting + # headers](rdoc-ref:Net::HTTPHeader@Setters). + # + # ## Request Subclasses + # + # Subclasses for HTTP requests: + # + # * Net::HTTP::Get + # * Net::HTTP::Head + # * Net::HTTP::Post + # * Net::HTTP::Put + # * Net::HTTP::Delete + # * Net::HTTP::Options + # * Net::HTTP::Trace + # * Net::HTTP::Patch + # + # Subclasses for WebDAV requests: + # + # * Net::HTTP::Propfind + # * Net::HTTP::Proppatch + # * Net::HTTP::Mkcol + # * Net::HTTP::Copy + # * Net::HTTP::Move + # * Net::HTTP::Lock + # * Net::HTTP::Unlock + # + class HTTPRequest < HTTPGenericRequest + # + # 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, ?headers initheader) -> void + | (URI::Generic uri, ?headers initheader) -> void + end + + # + # Class for representing [HTTP method + # GET](https://en.wikipedia.org/w/index.php?title=Hypertext_Transfer_Protocol#GE + # T_method): + # + # require 'net/http' + # uri = URI('http://example.com') + # hostname = uri.hostname # => "example.com" + # req = Net::HTTP::Get.new(uri) # => # + # res = Net::HTTP.start(hostname) do |http| + # http.request(req) + # end + # + # See [Request Headers](rdoc-ref:Net::HTTPRequest@Request+Headers). + # + # Properties: + # + # * Request body: optional. + # * Response body: yes. + # * [Safe](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Safe_meth + # ods): yes. + # * [Idempotent](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Ide + # mpotent_methods): yes. + # * [Cacheable](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Cach + # eable_methods): yes. + # + # Related: + # + # * Net::HTTP.get: sends `GET` request, returns response body. + # * Net::HTTP#get: sends `GET` request, returns response object. + # + class HTTP::Get < HTTPRequest + METHOD: String + + REQUEST_HAS_BODY: bool + + RESPONSE_HAS_BODY: bool + end + + # + # Class for representing [HTTP method + # HEAD](https://en.wikipedia.org/w/index.php?title=Hypertext_Transfer_Protocol#H + # EAD_method): + # + # require 'net/http' + # uri = URI('http://example.com') + # hostname = uri.hostname # => "example.com" + # req = Net::HTTP::Head.new(uri) # => # + # res = Net::HTTP.start(hostname) do |http| + # http.request(req) + # end + # + # See [Request Headers](rdoc-ref:Net::HTTPRequest@Request+Headers). + # + # Properties: + # + # * Request body: optional. + # * Response body: no. + # * [Safe](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Safe_meth + # ods): yes. + # * [Idempotent](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Ide + # mpotent_methods): yes. + # * [Cacheable](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Cach + # eable_methods): yes. + # + # Related: + # + # * Net::HTTP#head: sends `HEAD` request, returns response object. + # + class HTTP::Head < HTTPRequest + METHOD: String + + REQUEST_HAS_BODY: bool + + RESPONSE_HAS_BODY: bool + end + + # + # Class for representing [HTTP method + # POST](https://en.wikipedia.org/w/index.php?title=Hypertext_Transfer_Protocol#P + # OST_method): + # + # require 'net/http' + # uri = URI('http://example.com') + # hostname = uri.hostname # => "example.com" + # uri.path = '/posts' + # req = Net::HTTP::Post.new(uri) # => # + # req.body = '{"title": "foo","body": "bar","userId": 1}' + # req.content_type = 'application/json' + # res = Net::HTTP.start(hostname) do |http| + # http.request(req) + # end + # + # See [Request Headers](rdoc-ref:Net::HTTPRequest@Request+Headers). + # + # Properties: + # + # * Request body: yes. + # * Response body: yes. + # * [Safe](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Safe_meth + # ods): no. + # * [Idempotent](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Ide + # mpotent_methods): no. + # * [Cacheable](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Cach + # eable_methods): yes. + # + # Related: + # + # * Net::HTTP.post: sends `POST` request, returns response object. + # * Net::HTTP#post: sends `POST` request, returns response object. + # + class HTTP::Post < HTTPRequest + METHOD: String + + REQUEST_HAS_BODY: bool + + RESPONSE_HAS_BODY: bool + end + + # + # Class for representing [HTTP method + # PUT](https://en.wikipedia.org/w/index.php?title=Hypertext_Transfer_Protocol#PU + # T_method): + # + # require 'net/http' + # uri = URI('http://example.com') + # hostname = uri.hostname # => "example.com" + # uri.path = '/posts' + # req = Net::HTTP::Put.new(uri) # => # + # req.body = '{"title": "foo","body": "bar","userId": 1}' + # req.content_type = 'application/json' + # res = Net::HTTP.start(hostname) do |http| + # http.request(req) + # end + # + # See [Request Headers](rdoc-ref:Net::HTTPRequest@Request+Headers). + # + # Properties: + # + # * Request body: yes. + # * Response body: yes. + # * [Safe](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Safe_meth + # ods): no. + # * [Idempotent](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Ide + # mpotent_methods): yes. + # * [Cacheable](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Cach + # eable_methods): no. + # + # Related: + # + # * Net::HTTP.put: sends `PUT` request, returns response object. + # * Net::HTTP#put: sends `PUT` request, returns response object. + # + class HTTP::Put < HTTPRequest + METHOD: String + + REQUEST_HAS_BODY: bool + + RESPONSE_HAS_BODY: bool + end + + # + # Class for representing [HTTP method + # DELETE](https://en.wikipedia.org/w/index.php?title=Hypertext_Transfer_Protocol + # #DELETE_method): + # + # require 'net/http' + # uri = URI('http://example.com') + # hostname = uri.hostname # => "example.com" + # uri.path = '/posts/1' + # req = Net::HTTP::Delete.new(uri) # => # + # res = Net::HTTP.start(hostname) do |http| + # http.request(req) + # end + # + # See [Request Headers](rdoc-ref:Net::HTTPRequest@Request+Headers). + # + # Properties: + # + # * Request body: optional. + # * Response body: yes. + # * [Safe](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Safe_meth + # ods): no. + # * [Idempotent](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Ide + # mpotent_methods): yes. + # * [Cacheable](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Cach + # eable_methods): no. + # + # Related: + # + # * Net::HTTP#delete: sends `DELETE` request, returns response object. + # + class HTTP::Delete < HTTPRequest + METHOD: String + + REQUEST_HAS_BODY: bool + + RESPONSE_HAS_BODY: bool + end + + # + # Class for representing [HTTP method + # OPTIONS](https://en.wikipedia.org/w/index.php?title=Hypertext_Transfer_Protoco + # l#OPTIONS_method): + # + # require 'net/http' + # uri = URI('http://example.com') + # hostname = uri.hostname # => "example.com" + # req = Net::HTTP::Options.new(uri) # => # + # res = Net::HTTP.start(hostname) do |http| + # http.request(req) + # end + # + # See [Request Headers](rdoc-ref:Net::HTTPRequest@Request+Headers). + # + # Properties: + # + # * Request body: optional. + # * Response body: yes. + # * [Safe](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Safe_meth + # ods): yes. + # * [Idempotent](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Ide + # mpotent_methods): yes. + # * [Cacheable](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Cach + # eable_methods): no. + # + # Related: + # + # * Net::HTTP#options: sends `OPTIONS` request, returns response object. + # + class HTTP::Options < HTTPRequest + METHOD: String + + REQUEST_HAS_BODY: bool + + RESPONSE_HAS_BODY: bool + end + + # + # Class for representing [HTTP method + # TRACE](https://en.wikipedia.org/w/index.php?title=Hypertext_Transfer_Protocol# + # TRACE_method): + # + # require 'net/http' + # uri = URI('http://example.com') + # hostname = uri.hostname # => "example.com" + # req = Net::HTTP::Trace.new(uri) # => # + # res = Net::HTTP.start(hostname) do |http| + # http.request(req) + # end + # + # See [Request Headers](rdoc-ref:Net::HTTPRequest@Request+Headers). + # + # Properties: + # + # * Request body: no. + # * Response body: yes. + # * [Safe](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Safe_meth + # ods): yes. + # * [Idempotent](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Ide + # mpotent_methods): yes. + # * [Cacheable](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Cach + # eable_methods): no. + # + # Related: + # + # * Net::HTTP#trace: sends `TRACE` request, returns response object. + # + class HTTP::Trace < HTTPRequest + METHOD: String + + REQUEST_HAS_BODY: bool + + RESPONSE_HAS_BODY: bool + end + + # + # Class for representing [HTTP method + # PATCH](https://en.wikipedia.org/w/index.php?title=Hypertext_Transfer_Protocol# + # PATCH_method): + # + # require 'net/http' + # uri = URI('http://example.com') + # hostname = uri.hostname # => "example.com" + # uri.path = '/posts' + # req = Net::HTTP::Patch.new(uri) # => # + # req.body = '{"title": "foo","body": "bar","userId": 1}' + # req.content_type = 'application/json' + # res = Net::HTTP.start(hostname) do |http| + # http.request(req) + # end + # + # See [Request Headers](rdoc-ref:Net::HTTPRequest@Request+Headers). + # + # Properties: + # + # * Request body: yes. + # * Response body: yes. + # * [Safe](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Safe_meth + # ods): no. + # * [Idempotent](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Ide + # mpotent_methods): no. + # * [Cacheable](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Cach + # eable_methods): no. + # + # Related: + # + # * Net::HTTP#patch: sends `PATCH` request, returns response object. + # + class HTTP::Patch < HTTPRequest + METHOD: String + + REQUEST_HAS_BODY: bool + + RESPONSE_HAS_BODY: bool + end + + # + # Class for representing [WebDAV method + # PROPFIND](http://www.webdav.org/specs/rfc4918.html#METHOD_PROPFIND): + # + # require 'net/http' + # uri = URI('http://example.com') + # hostname = uri.hostname # => "example.com" + # req = Net::HTTP::Propfind.new(uri) # => # + # res = Net::HTTP.start(hostname) do |http| + # http.request(req) + # end + # + # See [Request Headers](rdoc-ref:Net::HTTPRequest@Request+Headers). + # + # Related: + # + # * Net::HTTP#propfind: sends `PROPFIND` request, returns response object. + # + class HTTP::Propfind < HTTPRequest + METHOD: String + + REQUEST_HAS_BODY: bool + + RESPONSE_HAS_BODY: bool + end + + # + # Class for representing [WebDAV method + # PROPPATCH](http://www.webdav.org/specs/rfc4918.html#METHOD_PROPPATCH): + # + # require 'net/http' + # uri = URI('http://example.com') + # hostname = uri.hostname # => "example.com" + # req = Net::HTTP::Proppatch.new(uri) # => # + # res = Net::HTTP.start(hostname) do |http| + # http.request(req) + # end + # + # See [Request Headers](rdoc-ref:Net::HTTPRequest@Request+Headers). + # + # Related: + # + # * Net::HTTP#proppatch: sends `PROPPATCH` request, returns response object. + # + class HTTP::Proppatch < HTTPRequest + METHOD: String + + REQUEST_HAS_BODY: bool + + RESPONSE_HAS_BODY: bool + end + + # + # Class for representing [WebDAV method + # MKCOL](http://www.webdav.org/specs/rfc4918.html#METHOD_MKCOL): + # + # require 'net/http' + # uri = URI('http://example.com') + # hostname = uri.hostname # => "example.com" + # req = Net::HTTP::Mkcol.new(uri) # => # + # res = Net::HTTP.start(hostname) do |http| + # http.request(req) + # end + # + # See [Request Headers](rdoc-ref:Net::HTTPRequest@Request+Headers). + # + # Related: + # + # * Net::HTTP#mkcol: sends `MKCOL` request, returns response object. + # + class HTTP::Mkcol < HTTPRequest + METHOD: String + + REQUEST_HAS_BODY: bool + + RESPONSE_HAS_BODY: bool + end + + # + # Class for representing [WebDAV method + # COPY](http://www.webdav.org/specs/rfc4918.html#METHOD_COPY): + # + # require 'net/http' + # uri = URI('http://example.com') + # hostname = uri.hostname # => "example.com" + # req = Net::HTTP::Copy.new(uri) # => # + # res = Net::HTTP.start(hostname) do |http| + # http.request(req) + # end + # + # See [Request Headers](rdoc-ref:Net::HTTPRequest@Request+Headers). + # + # Related: + # + # * Net::HTTP#copy: sends `COPY` request, returns response object. + # + class HTTP::Copy < HTTPRequest + METHOD: String + + REQUEST_HAS_BODY: bool + + RESPONSE_HAS_BODY: bool + end + + # + # Class for representing [WebDAV method + # MOVE](http://www.webdav.org/specs/rfc4918.html#METHOD_MOVE): + # + # require 'net/http' + # uri = URI('http://example.com') + # hostname = uri.hostname # => "example.com" + # req = Net::HTTP::Move.new(uri) # => # + # res = Net::HTTP.start(hostname) do |http| + # http.request(req) + # end + # + # See [Request Headers](rdoc-ref:Net::HTTPRequest@Request+Headers). + # + # Related: + # + # * Net::HTTP#move: sends `MOVE` request, returns response object. + # + class HTTP::Move < HTTPRequest + METHOD: String + + REQUEST_HAS_BODY: bool + + RESPONSE_HAS_BODY: bool + end + + # + # Class for representing [WebDAV method + # LOCK](http://www.webdav.org/specs/rfc4918.html#METHOD_LOCK): + # + # require 'net/http' + # uri = URI('http://example.com') + # hostname = uri.hostname # => "example.com" + # req = Net::HTTP::Lock.new(uri) # => # + # res = Net::HTTP.start(hostname) do |http| + # http.request(req) + # end + # + # See [Request Headers](rdoc-ref:Net::HTTPRequest@Request+Headers). + # + # Related: + # + # * Net::HTTP#lock: sends `LOCK` request, returns response object. + # + class HTTP::Lock < HTTPRequest + METHOD: String + + REQUEST_HAS_BODY: bool + + RESPONSE_HAS_BODY: bool + end + + # + # Class for representing [WebDAV method + # UNLOCK](http://www.webdav.org/specs/rfc4918.html#METHOD_UNLOCK): + # + # require 'net/http' + # uri = URI('http://example.com') + # hostname = uri.hostname # => "example.com" + # req = Net::HTTP::Unlock.new(uri) # => # + # res = Net::HTTP.start(hostname) do |http| + # http.request(req) + # end + # + # See [Request Headers](rdoc-ref:Net::HTTPRequest@Request+Headers). + # + # Related: + # + # * Net::HTTP#unlock: sends `UNLOCK` request, returns response object. + # + class HTTP::Unlock < HTTPRequest + METHOD: String + + REQUEST_HAS_BODY: bool + + RESPONSE_HAS_BODY: bool + end + + # + # This class is the base class for Net::HTTP response classes. + # + # ## About the Examples + # + # Examples here assume that net/http has been required (which also + # requires `uri`): + # + # require 'net/http' + # + # Many code examples here use these example websites: + # + # * https://jsonplaceholder.typicode.com. + # * http://example.com. + # + # Some examples also assume these variables: + # + # uri = URI('https://jsonplaceholder.typicode.com/') + # uri.freeze # Examples may not modify. + # hostname = uri.hostname # => "jsonplaceholder.typicode.com" + # path = uri.path # => "/" + # port = uri.port # => 443 + # + # So that example requests may be written as: + # + # Net::HTTP.get(uri) + # Net::HTTP.get(hostname, '/index.html') + # Net::HTTP.start(hostname) do |http| + # http.get('/todos/1') + # http.get('/todos/2') + # end + # + # An example that needs a modified URI first duplicates `uri`, then modifies the + # duplicate: + # + # _uri = uri.dup + # _uri.path = '/todos/1' + # + # ## Returned Responses + # + # Method Net::HTTP.get_response returns an instance of one of the subclasses of + # Net::HTTPResponse: + # + # Net::HTTP.get_response(uri) + # # => # + # Net::HTTP.get_response(hostname, '/nosuch') + # # => # + # + # As does method Net::HTTP#request: + # + # req = Net::HTTP::Get.new(uri) + # Net::HTTP.start(hostname) do |http| + # http.request(req) + # end # => # + # + # Class Net::HTTPResponse includes module Net::HTTPHeader, which provides access + # to response header values via (among others): + # + # * Hash-like method []. + # * Specific reader methods, such as `content_type`. + # + # Examples: + # + # res = Net::HTTP.get_response(uri) # => # + # res['Content-Type'] # => "text/html; charset=UTF-8" + # res.content_type # => "text/html" + # + # ## Response Subclasses + # + # Class Net::HTTPResponse has a subclass for each [HTTP status + # code](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes). You can look + # up the response class for a given code: + # + # Net::HTTPResponse::CODE_TO_OBJ['200'] # => Net::HTTPOK + # Net::HTTPResponse::CODE_TO_OBJ['400'] # => Net::HTTPBadRequest + # Net::HTTPResponse::CODE_TO_OBJ['404'] # => Net::HTTPNotFound + # + # And you can retrieve the status code for a response object: + # + # Net::HTTP.get_response(uri).code # => "200" + # Net::HTTP.get_response(hostname, '/nosuch').code # => "404" + # + # The response subclasses (indentation shows class hierarchy): + # + # * Net::HTTPUnknownResponse (for unhandled HTTP extensions). + # + # * Net::HTTPInformation: + # + # * Net::HTTPContinue (100) + # * Net::HTTPSwitchProtocol (101) + # * Net::HTTPProcessing (102) + # * Net::HTTPEarlyHints (103) + # + # * Net::HTTPSuccess: + # + # * Net::HTTPOK (200) + # * Net::HTTPCreated (201) + # * Net::HTTPAccepted (202) + # * Net::HTTPNonAuthoritativeInformation (203) + # * Net::HTTPNoContent (204) + # * Net::HTTPResetContent (205) + # * Net::HTTPPartialContent (206) + # * Net::HTTPMultiStatus (207) + # * Net::HTTPAlreadyReported (208) + # * Net::HTTPIMUsed (226) + # + # * Net::HTTPRedirection: + # + # * Net::HTTPMultipleChoices (300) + # * Net::HTTPMovedPermanently (301) + # * Net::HTTPFound (302) + # * Net::HTTPSeeOther (303) + # * Net::HTTPNotModified (304) + # * Net::HTTPUseProxy (305) + # * Net::HTTPTemporaryRedirect (307) + # * Net::HTTPPermanentRedirect (308) + # + # * Net::HTTPClientError: + # + # * Net::HTTPBadRequest (400) + # * Net::HTTPUnauthorized (401) + # * Net::HTTPPaymentRequired (402) + # * Net::HTTPForbidden (403) + # * Net::HTTPNotFound (404) + # * Net::HTTPMethodNotAllowed (405) + # * Net::HTTPNotAcceptable (406) + # * Net::HTTPProxyAuthenticationRequired (407) + # * Net::HTTPRequestTimeOut (408) + # * Net::HTTPConflict (409) + # * Net::HTTPGone (410) + # * Net::HTTPLengthRequired (411) + # * Net::HTTPPreconditionFailed (412) + # * Net::HTTPRequestEntityTooLarge (413) + # * Net::HTTPRequestURITooLong (414) + # * Net::HTTPUnsupportedMediaType (415) + # * Net::HTTPRequestedRangeNotSatisfiable (416) + # * Net::HTTPExpectationFailed (417) + # * Net::HTTPMisdirectedRequest (421) + # * Net::HTTPUnprocessableEntity (422) + # * Net::HTTPLocked (423) + # * Net::HTTPFailedDependency (424) + # * Net::HTTPUpgradeRequired (426) + # * Net::HTTPPreconditionRequired (428) + # * Net::HTTPTooManyRequests (429) + # * Net::HTTPRequestHeaderFieldsTooLarge (431) + # * Net::HTTPUnavailableForLegalReasons (451) + # + # * Net::HTTPServerError: + # + # * Net::HTTPInternalServerError (500) + # * Net::HTTPNotImplemented (501) + # * Net::HTTPBadGateway (502) + # * Net::HTTPServiceUnavailable (503) + # * Net::HTTPGatewayTimeOut (504) + # * Net::HTTPVersionNotSupported (505) + # * Net::HTTPVariantAlsoNegotiates (506) + # * Net::HTTPInsufficientStorage (507) + # * Net::HTTPLoopDetected (508) + # * Net::HTTPNotExtended (510) + # * Net::HTTPNetworkAuthenticationRequired (511) + # + # There is also the Net::HTTPBadResponse exception which is raised when there is + # a protocol error. + # + class HTTPResponse + # + # true if the response has a body. + # + def self.body_permitted?: () -> bool + + include Net::HTTPHeader + + # + # The HTTP version supported by the server. + # + attr_reader http_version: String + + # + # 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 + + # + # The HTTP result message sent by the server. For example, 'Not Found'. + # + attr_reader message: String + + # + # The HTTP result message sent by the server. For example, 'Not Found'. + # + alias msg message + + # + # 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 + + # + # Set to true automatically when the request did not contain an Accept-Encoding + # header from the user. + # + attr_accessor decode_content: bool + + # + # + def inspect: () -> String + + def code_type: () -> untyped + + def error!: () -> untyped + + def error_type: () -> (Net::HTTPError | Net::HTTPServerException | Net::HTTPRetriableError | Net::HTTPFatalError) + + # + # 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 + + # + # 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 + + # + # Returns the string response body; note that repeated calls for the unmodified + # body return a cached string: + # + # path = '/todos/1' + # Net::HTTP.start(hostname) do |http| + # res = http.get(path) + # p res.body + # p http.head(path).body # No body. + # end + # + # Output: + # + # "{\n \"userId\": 1,\n \"id\": 1,\n \"title\": \"delectus aut autem\",\n \"completed\": false\n}" + # nil + # + def body: () -> String + + # + # Sets the body of the response to the given value. + # + def body=: (untyped value) -> void + + # + # + alias entity body + end + + # + # Unknown HTTP response + # + class HTTPUnknownResponse < HTTPResponse + HAS_BODY: bool + + EXCEPTION_TYPE: Net::HTTPError + end + + # + # Parent class for informational (1xx) HTTP response classes. + # + # An informational response indicates that the request was received and + # understood. + # + # References: + # + # * [RFC 9110](https://www.rfc-editor.org/rfc/rfc9110.html#status.1xx). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#1xx_in + # formational_response). + # + class HTTPInformation < HTTPResponse + HAS_BODY: bool + + EXCEPTION_TYPE: Net::HTTPError + end + + # + # Parent class for success (2xx) HTTP response classes. + # + # A success response indicates the action requested by the client was received, + # understood, and accepted. + # + # References: + # + # * [RFC 9110](https://www.rfc-editor.org/rfc/rfc9110.html#status.2xx). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#2xx_su + # ccess). + # + class HTTPSuccess < HTTPResponse + HAS_BODY: bool + + EXCEPTION_TYPE: Net::HTTPError + end + + # + # Parent class for redirection (3xx) HTTP response classes. + # + # A redirection response indicates the client must take additional action to + # complete the request. + # + # References: + # + # * [RFC 9110](https://www.rfc-editor.org/rfc/rfc9110.html#status.3xx). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#3xx_re + # direction). + # + class HTTPRedirection < HTTPResponse + HAS_BODY: bool + + EXCEPTION_TYPE: Net::HTTPRetriableError + end + + # + # Parent class for client error (4xx) HTTP response classes. + # + # A client error response indicates that the client may have caused an error. + # + # References: + # + # * [RFC 9110](https://www.rfc-editor.org/rfc/rfc9110.html#status.4xx). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#4xx_cl + # ient_errors). + # + class HTTPClientError < HTTPResponse + HAS_BODY: bool + + EXCEPTION_TYPE: untyped + end + + # + # Parent class for server error (5xx) HTTP response classes. + # + # A server error response indicates that the server failed to fulfill a request. + # + # References: + # + # * [RFC 9110](https://www.rfc-editor.org/rfc/rfc9110.html#status.5xx). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#5xx_se + # rver_errors). + # + class HTTPServerError < HTTPResponse + HAS_BODY: bool + + EXCEPTION_TYPE: Net::HTTPFatalError + end + + # + # Response class for `Continue` responses (status code 100). + # + # A `Continue` response indicates that the server has received the request + # headers. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/100). + # * [RFC 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-100-continue). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#100). + # + class HTTPContinue < HTTPInformation + HAS_BODY: bool + end + + # + # Response class for `Switching Protocol` responses (status code 101). + # + # The Switching Protocol response indicates that the server has received + # a request to switch protocols, and has agreed to do so. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/101). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-101-switching-proto + # cols). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#101). + # + class HTTPSwitchProtocol < HTTPInformation + HAS_BODY: bool + end + + # + # Response class for `Processing` responses (status code 102). + # + # The `Processing` response indicates that the server has received and is + # processing the request, but no response is available yet. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [RFC 2518](https://www.rfc-editor.org/rfc/rfc2518#section-10.1). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#102). + # + class HTTPProcessing < HTTPInformation + HAS_BODY: bool + end + + # + # Response class for `Early Hints` responses (status code 103). + # + # The `Early Hints` indicates that the server has received and is processing the + # request, and contains certain headers; the final response is not available + # yet. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/103). + # * [RFC 8297](https://www.rfc-editor.org/rfc/rfc8297.html#section-2). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#103). + # + class HTTPEarlyHints < HTTPInformation + HAS_BODY: bool + end + + # + # Response class for `OK` responses (status code 200). + # + # The `OK` response indicates that the server has received a request and has + # responded successfully. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200). + # * [RFC 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-200-ok). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#200). + # + class HTTPOK < HTTPSuccess + HAS_BODY: bool + end + + # + # Response class for `Created` responses (status code 201). + # + # The `Created` response indicates that the server has received and has + # fulfilled a request to create a new resource. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201). + # * [RFC 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-201-created). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#201). + # + class HTTPCreated < HTTPSuccess + HAS_BODY: bool + end + + # + # Response class for `Accepted` responses (status code 202). + # + # The `Accepted` response indicates that the server has received and is + # processing a request, but the processing has not yet been completed. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202). + # * [RFC 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-202-accepted). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#202). + # + class HTTPAccepted < HTTPSuccess + HAS_BODY: bool + end + + # + # Response class for Non-Authoritative Information responses + # (status code 203). + # + # The Non-Authoritative Information response indicates that the + # server is a transforming proxy (such as a Web accelerator) that received a 200 + # OK response from its origin, and is returning a modified version of the + # origin's response. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/203). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-203-non-authoritati + # ve-infor). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#203). + # + class HTTPNonAuthoritativeInformation < HTTPSuccess + HAS_BODY: bool + end + + # + # Response class for `No Content` responses (status code 204). + # + # The `No Content` response indicates that the server successfully processed the + # request, and is not returning any content. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-204-no-content). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#204). + # + class HTTPNoContent < HTTPSuccess + HAS_BODY: bool + end + + # + # Response class for `Reset Content` responses (status code 205). + # + # The `Reset Content` response indicates that the server successfully processed + # the request, asks that the client reset its document view, and is not + # returning any content. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/205). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-205-reset-content). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#205). + # + class HTTPResetContent < HTTPSuccess + HAS_BODY: bool + end + + # + # Response class for `Partial Content` responses (status code 206). + # + # The `Partial Content` response indicates that the server is delivering only + # part of the resource (byte serving) due to a Range header in the request. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/206). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-206-partial-content + # ). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#206). + # + class HTTPPartialContent < HTTPSuccess + HAS_BODY: bool + end + + # + # Response class for Multi-Status (WebDAV) responses (status code + # 207). + # + # The Multi-Status (WebDAV) response indicates that the server has + # received the request, and that the message body can contain a number of + # separate response codes. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [RFC 4818](https://www.rfc-editor.org/rfc/rfc4918#section-11.1). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#207). + # + class HTTPMultiStatus < HTTPSuccess + HAS_BODY: bool + end + + # + # Response class for Already Reported (WebDAV) responses (status + # code 208). + # + # The Already Reported (WebDAV) response indicates that the server + # has received the request, and that the members of a DAV binding have already + # been enumerated in a preceding part of the (multi-status) response, and are + # not being included again. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [RFC 5842](https://www.rfc-editor.org/rfc/rfc5842.html#section-7.1). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#208). + # + class HTTPAlreadyReported < HTTPSuccess + HAS_BODY: bool + end + + # + # Response class for `IM Used` responses (status code 226). + # + # The `IM Used` response indicates that the server has fulfilled a request for + # the resource, and the response is a representation of the result of one or + # more instance-manipulations applied to the current instance. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [RFC 3229](https://www.rfc-editor.org/rfc/rfc3229.html#section-10.4.1). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#226). + # + class HTTPIMUsed < HTTPSuccess + HAS_BODY: bool + end + + # + # Response class for `Multiple Choices` responses (status code 300). + # + # The `Multiple Choices` response indicates that the server offers multiple + # options for the resource from which the client may choose. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/300). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-300-multiple-choice + # s). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#300). + # + class HTTPMultipleChoices < HTTPRedirection + HAS_BODY: bool + end + + # + # Response class for `Multiple Choices` responses (status code 300). + # + # The `Multiple Choices` response indicates that the server offers multiple + # options for the resource from which the client may choose. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/300). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-300-multiple-choice + # s). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#300). + # + HTTPMultipleChoice: HTTPMultipleChoices + + # + # Response class for `Moved Permanently` responses (status code 301). + # + # The `Moved Permanently` response indicates that links or records returning + # this response should be updated to use the given URL. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/301). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-301-moved-permanent + # ly). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#301). + # + class HTTPMovedPermanently < HTTPRedirection + HAS_BODY: bool + end + + # + # Response class for `Found` responses (status code 302). + # + # The `Found` response indicates that the client should look at (browse to) + # another URL. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/302). + # * [RFC 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-302-found). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#302). + # + class HTTPFound < HTTPRedirection + HAS_BODY: bool + end + + # + # Response class for `See Other` responses (status code 303). + # + # The response to the request can be found under another URI using the GET + # method. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/303). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-303-see-other). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#303). + # + class HTTPSeeOther < HTTPRedirection + HAS_BODY: bool + end + + # + # Response class for `Not Modified` responses (status code 304). + # + # Indicates that the resource has not been modified since the version specified + # by the request headers. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/304). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-304-not-modified). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#304). + # + class HTTPNotModified < HTTPRedirection + HAS_BODY: bool + end + + # + # Response class for `Use Proxy` responses (status code 305). + # + # The requested resource is available only through a proxy, whose address is + # provided in the response. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-305-use-proxy). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#305). + # + class HTTPUseProxy < HTTPRedirection + HAS_BODY: bool + end + + # + # Response class for `Temporary Redirect` responses (status code 307). + # + # The request should be repeated with another URI; however, future requests + # should still use the original URI. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/307). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-307-temporary-redir + # ect). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#307). + # + class HTTPTemporaryRedirect < HTTPRedirection + HAS_BODY: bool + end + + # + # Response class for `Permanent Redirect` responses (status code 308). + # + # This and all future requests should be directed to the given URI. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/308). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-308-permanent-redir + # ect). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#308). + # + class HTTPPermanentRedirect < HTTPRedirection + HAS_BODY: bool + end + + # + # Response class for `Bad Request` responses (status code 400). + # + # The server cannot or will not process the request due to an apparent client + # error. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-400-bad-request). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#400). + # + class HTTPBadRequest < HTTPClientError + HAS_BODY: bool + end + + # + # Response class for `Unauthorized` responses (status code 401). + # + # Authentication is required, but either was not provided or failed. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-401-unauthorized). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#401). + # + class HTTPUnauthorized < HTTPClientError + HAS_BODY: bool + end + + # + # Response class for `Payment Required` responses (status code 402). + # + # Reserved for future use. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/402). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-402-payment-require + # d). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#402). + # + class HTTPPaymentRequired < HTTPClientError + HAS_BODY: bool + end + + # + # Response class for `Forbidden` responses (status code 403). + # + # The request contained valid data and was understood by the server, but the + # server is refusing action. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-403-forbidden). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#403). + # + class HTTPForbidden < HTTPClientError + HAS_BODY: bool + end + + # + # Response class for `Not Found` responses (status code 404). + # + # The requested resource could not be found but may be available in the future. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-404-not-found). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#404). + # + class HTTPNotFound < HTTPClientError + HAS_BODY: bool + end + + # + # Response class for `Method Not Allowed` responses (status code 405). + # + # The request method is not supported for the requested resource. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/405). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-405-method-not-allo + # wed). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#405). + # + class HTTPMethodNotAllowed < HTTPClientError + HAS_BODY: bool + end + + # + # Response class for `Not Acceptable` responses (status code 406). + # + # The requested resource is capable of generating only content that not + # acceptable according to the Accept headers sent in the request. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/406). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-406-not-acceptable) + # . + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#406). + # + class HTTPNotAcceptable < HTTPClientError + HAS_BODY: bool + end + + # + # Response class for `Proxy Authentication Required` responses (status code + # 407). + # + # The client must first authenticate itself with the proxy. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/407). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-407-proxy-authentic + # ation-re). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#407). + # + class HTTPProxyAuthenticationRequired < HTTPClientError + HAS_BODY: bool + end + + # + # Response class for `Request Timeout` responses (status code 408). + # + # The server timed out waiting for the request. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/408). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-408-request-timeout + # ). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#408). + # + class HTTPRequestTimeout < HTTPClientError + HAS_BODY: bool + end + + # + # Response class for `Conflict` responses (status code 409). + # + # The request could not be processed because of conflict in the current state of + # the resource. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409). + # * [RFC 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-409-conflict). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#409). + # + class HTTPConflict < HTTPClientError + HAS_BODY: bool + end + + # + # Response class for `Gone` responses (status code 410). + # + # The resource requested was previously in use but is no longer available and + # will not be available again. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/410). + # * [RFC 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-410-gone). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#410). + # + class HTTPGone < HTTPClientError + HAS_BODY: bool + end + + # + # Response class for `Length Required` responses (status code 411). + # + # The request did not specify the length of its content, which is required by + # the requested resource. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/411). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-411-length-required + # ). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#411). + # + class HTTPLengthRequired < HTTPClientError + HAS_BODY: bool + end + + # + # Response class for `Precondition Failed` responses (status code 412). + # + # The server does not meet one of the preconditions specified in the request + # headers. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-412-precondition-fa + # iled). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#412). + # + class HTTPPreconditionFailed < HTTPClientError + HAS_BODY: bool + end + + # + # Response class for `Payload Too Large` responses (status code 413). + # + # The request is larger than the server is willing or able to process. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/413). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-413-content-too-lar + # ge). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#413). + # + class HTTPPayloadTooLarge < HTTPClientError + HAS_BODY: bool + end + + # + # Response class for `URI Too Long` responses (status code 414). + # + # The URI provided was too long for the server to process. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/414). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-414-uri-too-long). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#414). + # + class HTTPURITooLong < HTTPClientError + HAS_BODY: bool + end + + # + # Response class for `Unsupported Media Type` responses (status code 415). + # + # The request entity has a media type which the server or resource does not + # support. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/415). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-415-unsupported-med + # ia-type). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#415). + # + class HTTPUnsupportedMediaType < HTTPClientError + HAS_BODY: bool + end + + # + # Response class for `Range Not Satisfiable` responses (status code 416). + # + # The request entity has a media type which the server or resource does not + # support. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/416). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-416-range-not-satis + # fiable). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#416). + # + class HTTPRangeNotSatisfiable < HTTPClientError + HAS_BODY: bool + end + + # + # Response class for `Expectation Failed` responses (status code 417). + # + # The server cannot meet the requirements of the Expect request-header field. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/417). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-417-expectation-fai + # led). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#417). + # + class HTTPExpectationFailed < HTTPClientError + HAS_BODY: bool + end + + # + # Response class for `Misdirected Request` responses (status code 421). + # + # The request was directed at a server that is not able to produce a response. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-421-misdirected-req + # uest). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#421). + # + class HTTPMisdirectedRequest < HTTPClientError + HAS_BODY: bool + end + + # + # Response class for `Unprocessable Entity` responses (status code 422). + # + # The request was well-formed but had semantic errors. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-422-unprocessable-c + # ontent). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#422). + # + class HTTPUnprocessableEntity < HTTPClientError + HAS_BODY: bool + end + + # + # Response class for Locked (WebDAV) responses (status code 423). + # + # The requested resource is locked. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [RFC 4918](https://www.rfc-editor.org/rfc/rfc4918#section-11.3). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#423). + # + class HTTPLocked < HTTPClientError + HAS_BODY: bool + end + + # + # Response class for Failed Dependency (WebDAV) responses (status + # code 424). + # + # The request failed because it depended on another request and that request + # failed. See [424 Failed Dependency + # (WebDAV)](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#424). + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [RFC 4918](https://www.rfc-editor.org/rfc/rfc4918#section-11.4). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#424). + # + class HTTPFailedDependency < HTTPClientError + HAS_BODY: bool + end + + # + # Response class for `Upgrade Required` responses (status code 426). + # + # The client should switch to the protocol given in the Upgrade header field. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/426). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-426-upgrade-require + # d). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#426). + # + class HTTPUpgradeRequired < HTTPClientError + HAS_BODY: bool + end + + # + # Response class for `Precondition Required` responses (status code 428). + # + # The origin server requires the request to be conditional. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/428). + # * [RFC 6585](https://www.rfc-editor.org/rfc/rfc6585#section-3). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#428). + # + class HTTPPreconditionRequired < HTTPClientError + HAS_BODY: bool + end + + # + # Response class for `Too Many Requests` responses (status code 429). + # + # The user has sent too many requests in a given amount of time. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429). + # * [RFC 6585](https://www.rfc-editor.org/rfc/rfc6585#section-4). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#429). + # + class HTTPTooManyRequests < HTTPClientError + HAS_BODY: bool + end + + # + # Response class for `Request Header Fields Too Large` responses (status code + # 431). + # + # An individual header field is too large, or all the header fields + # collectively, are too large. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/431). + # * [RFC 6585](https://www.rfc-editor.org/rfc/rfc6585#section-5). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#431). + # + class HTTPRequestHeaderFieldsTooLarge < HTTPClientError + HAS_BODY: bool + end + + # + # Response class for `Unavailable For Legal Reasons` responses (status code + # 451). + # + # A server operator has received a legal demand to deny access to a resource or + # to a set of resources that includes the requested resource. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/451). + # * [RFC 7725](https://www.rfc-editor.org/rfc/rfc7725.html#section-3). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#451). + # + class HTTPUnavailableForLegalReasons < HTTPClientError + HAS_BODY: bool + end + + # + # Response class for `Internal Server Error` responses (status code 500). + # + # An unexpected condition was encountered and no more specific message is + # suitable. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-500-internal-server + # -error). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#500). + # + class HTTPInternalServerError < HTTPServerError + HAS_BODY: bool + end + + # + # Response class for `Not Implemented` responses (status code 501). + # + # The server either does not recognize the request method, or it lacks the + # ability to fulfil the request. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/501). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-501-not-implemented + # ). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#501). + # + class HTTPNotImplemented < HTTPServerError + HAS_BODY: bool + end + + # + # Response class for `Bad Gateway` responses (status code 502). + # + # The server was acting as a gateway or proxy and received an invalid response + # from the upstream server. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/502). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-502-bad-gateway). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#502). + # + class HTTPBadGateway < HTTPServerError + HAS_BODY: bool + end + + # + # Response class for `Service Unavailable` responses (status code 503). + # + # The server cannot handle the request (because it is overloaded or down for + # maintenance). + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/503). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-503-service-unavail + # able). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#503). + # + class HTTPServiceUnavailable < HTTPServerError + HAS_BODY: bool + end + + # + # Response class for `Gateway Timeout` responses (status code 504). + # + # The server was acting as a gateway or proxy and did not receive a timely + # response from the upstream server. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-504-gateway-timeout + # ). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#504). + # + class HTTPGatewayTimeout < HTTPServerError + HAS_BODY: bool + end + + # + # Response class for `HTTP Version Not Supported` responses (status code 505). + # + # The server does not support the HTTP version used in the request. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/505). + # * [RFC + # 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-505-http-version-no + # t-suppor). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#505). + # + class HTTPVersionNotSupported < HTTPServerError + HAS_BODY: bool + end + + # + # Response class for `Variant Also Negotiates` responses (status code 506). + # + # Transparent content negotiation for the request results in a circular + # reference. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/506). + # * [RFC 2295](https://www.rfc-editor.org/rfc/rfc2295#section-8.1). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#506). + # + class HTTPVariantAlsoNegotiates < HTTPServerError + HAS_BODY: bool + end + + # + # Response class for Insufficient Storage (WebDAV) responses + # (status code 507). + # + # The server is unable to store the representation needed to complete the + # request. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/507). + # * [RFC 4918](https://www.rfc-editor.org/rfc/rfc4918#section-11.5). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#507). + # + class HTTPInsufficientStorage < HTTPServerError + HAS_BODY: bool + end + + # + # Response class for Loop Detected (WebDAV) responses (status code + # 508). + # + # The server detected an infinite loop while processing the request. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/508). + # * [RFC 5942](https://www.rfc-editor.org/rfc/rfc5842.html#section-7.2). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#508). + # + class HTTPLoopDetected < HTTPServerError + HAS_BODY: bool + end + + # + # Response class for `Not Extended` responses (status code 510). + # + # Further extensions to the request are required for the server to fulfill it. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/510). + # * [RFC 2774](https://www.rfc-editor.org/rfc/rfc2774.html#section-7). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#510). + # + class HTTPNotExtended < HTTPServerError + HAS_BODY: bool + end + + # + # Response class for `Network Authentication Required` responses (status code + # 511). + # + # The client needs to authenticate to gain network access. + # + # This class also includes (indirectly) module Net::HTTPHeader, which gives + # access to its [methods for getting headers](rdoc-ref:Net::HTTPHeader@Getters). + # + # References: + # + # * [Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/511). + # * [RFC 6585](https://www.rfc-editor.org/rfc/rfc6585#section-6). + # * [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#511). + # + class HTTPNetworkAuthenticationRequired < HTTPServerError + HAS_BODY: bool + end + + # + # This class is the base class for Net::HTTP response classes. + # + # ## About the Examples + # + # Examples here assume that net/http has been required (which also + # requires `uri`): + # + # require 'net/http' + # + # Many code examples here use these example websites: + # + # * https://jsonplaceholder.typicode.com. + # * http://example.com. + # + # Some examples also assume these variables: + # + # uri = URI('https://jsonplaceholder.typicode.com/') + # uri.freeze # Examples may not modify. + # hostname = uri.hostname # => "jsonplaceholder.typicode.com" + # path = uri.path # => "/" + # port = uri.port # => 443 + # + # So that example requests may be written as: + # + # Net::HTTP.get(uri) + # Net::HTTP.get(hostname, '/index.html') + # Net::HTTP.start(hostname) do |http| + # http.get('/todos/1') + # http.get('/todos/2') + # end + # + # An example that needs a modified URI first duplicates `uri`, then modifies the + # duplicate: + # + # _uri = uri.dup + # _uri.path = '/todos/1' + # + # ## Returned Responses + # + # Method Net::HTTP.get_response returns an instance of one of the subclasses of + # Net::HTTPResponse: + # + # Net::HTTP.get_response(uri) + # # => # + # Net::HTTP.get_response(hostname, '/nosuch') + # # => # + # + # As does method Net::HTTP#request: + # + # req = Net::HTTP::Get.new(uri) + # Net::HTTP.start(hostname) do |http| + # http.request(req) + # end # => # + # + # Class Net::HTTPResponse includes module Net::HTTPHeader, which provides access + # to response header values via (among others): + # + # * Hash-like method []. + # * Specific reader methods, such as `content_type`. + # + # Examples: + # + # res = Net::HTTP.get_response(uri) # => # + # res['Content-Type'] # => "text/html; charset=UTF-8" + # res.content_type # => "text/html" + # + # ## Response Subclasses + # + # Class Net::HTTPResponse has a subclass for each [HTTP status + # code](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes). You can look + # up the response class for a given code: + # + # Net::HTTPResponse::CODE_TO_OBJ['200'] # => Net::HTTPOK + # Net::HTTPResponse::CODE_TO_OBJ['400'] # => Net::HTTPBadRequest + # Net::HTTPResponse::CODE_TO_OBJ['404'] # => Net::HTTPNotFound + # + # And you can retrieve the status code for a response object: + # + # Net::HTTP.get_response(uri).code # => "200" + # Net::HTTP.get_response(hostname, '/nosuch').code # => "404" + # + # The response subclasses (indentation shows class hierarchy): + # + # * Net::HTTPUnknownResponse (for unhandled HTTP extensions). + # + # * Net::HTTPInformation: + # + # * Net::HTTPContinue (100) + # * Net::HTTPSwitchProtocol (101) + # * Net::HTTPProcessing (102) + # * Net::HTTPEarlyHints (103) + # + # * Net::HTTPSuccess: + # + # * Net::HTTPOK (200) + # * Net::HTTPCreated (201) + # * Net::HTTPAccepted (202) + # * Net::HTTPNonAuthoritativeInformation (203) + # * Net::HTTPNoContent (204) + # * Net::HTTPResetContent (205) + # * Net::HTTPPartialContent (206) + # * Net::HTTPMultiStatus (207) + # * Net::HTTPAlreadyReported (208) + # * Net::HTTPIMUsed (226) + # + # * Net::HTTPRedirection: + # + # * Net::HTTPMultipleChoices (300) + # * Net::HTTPMovedPermanently (301) + # * Net::HTTPFound (302) + # * Net::HTTPSeeOther (303) + # * Net::HTTPNotModified (304) + # * Net::HTTPUseProxy (305) + # * Net::HTTPTemporaryRedirect (307) + # * Net::HTTPPermanentRedirect (308) + # + # * Net::HTTPClientError: + # + # * Net::HTTPBadRequest (400) + # * Net::HTTPUnauthorized (401) + # * Net::HTTPPaymentRequired (402) + # * Net::HTTPForbidden (403) + # * Net::HTTPNotFound (404) + # * Net::HTTPMethodNotAllowed (405) + # * Net::HTTPNotAcceptable (406) + # * Net::HTTPProxyAuthenticationRequired (407) + # * Net::HTTPRequestTimeOut (408) + # * Net::HTTPConflict (409) + # * Net::HTTPGone (410) + # * Net::HTTPLengthRequired (411) + # * Net::HTTPPreconditionFailed (412) + # * Net::HTTPRequestEntityTooLarge (413) + # * Net::HTTPRequestURITooLong (414) + # * Net::HTTPUnsupportedMediaType (415) + # * Net::HTTPRequestedRangeNotSatisfiable (416) + # * Net::HTTPExpectationFailed (417) + # * Net::HTTPMisdirectedRequest (421) + # * Net::HTTPUnprocessableEntity (422) + # * Net::HTTPLocked (423) + # * Net::HTTPFailedDependency (424) + # * Net::HTTPUpgradeRequired (426) + # * Net::HTTPPreconditionRequired (428) + # * Net::HTTPTooManyRequests (429) + # * Net::HTTPRequestHeaderFieldsTooLarge (431) + # * Net::HTTPUnavailableForLegalReasons (451) + # + # * Net::HTTPServerError: + # + # * Net::HTTPInternalServerError (500) + # * Net::HTTPNotImplemented (501) + # * Net::HTTPBadGateway (502) + # * Net::HTTPServiceUnavailable (503) + # * Net::HTTPGatewayTimeOut (504) + # * Net::HTTPVersionNotSupported (505) + # * Net::HTTPVariantAlsoNegotiates (506) + # * Net::HTTPInsufficientStorage (507) + # * Net::HTTPLoopDetected (508) + # * Net::HTTPNotExtended (510) + # * Net::HTTPNetworkAuthenticationRequired (511) + # + # There is also the Net::HTTPBadResponse exception which is raised when there is + # a protocol error. + # + class HTTPResponse + CODE_CLASS_TO_OBJ: Hash[untyped, untyped] + + CODE_TO_OBJ: Hash[untyped, untyped] + end + + HTTP::STATUS_CODES: Hash[Integer, String] + + # + # 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 From 9c60307617dc8bace1f911aef7a6a032aae3c556 Mon Sep 17 00:00:00 2001 From: Erik Berlin Date: Thu, 5 Mar 2026 13:12:25 -0800 Subject: [PATCH 2/2] Add local RBS interface tests --- .github/workflows/sig.yml | 18 +++ Gemfile | 5 + Rakefile | 8 ++ test_sig/test_helper.rb | 48 +++++++ test_sig/test_net_http.rb | 265 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 344 insertions(+) create mode 100644 .github/workflows/sig.yml create mode 100644 test_sig/test_helper.rb create mode 100644 test_sig/test_net_http.rb diff --git a/.github/workflows/sig.yml b/.github/workflows/sig.yml new file mode 100644 index 0000000..cb54ba8 --- /dev/null +++ b/.github/workflows/sig.yml @@ -0,0 +1,18 @@ +name: sig + +on: [push, pull_request] + +jobs: + sig: + runs-on: ubuntu-latest + env: + BUNDLE_WITH: sig + steps: + - uses: actions/checkout@v6 + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: "4.0" + bundler-cache: true + - name: Run RBS test + run: bundle exec rake rbs:test diff --git a/Gemfile b/Gemfile index 39549fe..4c533f3 100644 --- a/Gemfile +++ b/Gemfile @@ -5,3 +5,8 @@ gemspec gem "rake" gem "test-unit" gem "test-unit-ruby-core" + +group :sig do + gem "rbs" + gem "rdoc" +end diff --git a/Rakefile b/Rakefile index 5d512c8..5d9c5f3 100644 --- a/Rakefile +++ b/Rakefile @@ -7,4 +7,12 @@ Rake::TestTask.new(:test) do |t| t.test_files = FileList["test/**/test_*.rb"] end +namespace :rbs do + Rake::TestTask.new(:test) do |t| + t.libs << "test_sig" + t.ruby_opts << "-rtest_helper" + t.test_files = FileList["test_sig/test_*.rb"] + end +end + task :default => :test diff --git a/test_sig/test_helper.rb b/test_sig/test_helper.rb new file mode 100644 index 0000000..ba6de32 --- /dev/null +++ b/test_sig/test_helper.rb @@ -0,0 +1,48 @@ +require "pathname" +require "test/unit" +require "rbs" +require "rbs/test" +require "rbs/unit_test" + +module NetHTTPTestSigHelper + extend self + + LOCAL_SIG_DIR = Pathname(__dir__).join("..", "sig").expand_path + SUPPORT_LIBRARIES = %w[ + cgi + net-protocol + open-uri + openssl + resolv + securerandom + socket + strscan + tempfile + timeout + uri + zlib + ].freeze + + def env + @env ||= begin + loader = RBS::EnvironmentLoader.new + loader.add(path: LOCAL_SIG_DIR) + SUPPORT_LIBRARIES.each do |library| + loader.add(library: library, version: nil) + end + RBS::Environment.from_loader(loader).resolve_type_names + end + end +end + +class NetHTTPRBSTestCase < Test::Unit::TestCase + include RBS::UnitTest::TypeAssertions + + def self.env + NetHTTPTestSigHelper.env + end + + def self.builder + @builder ||= RBS::DefinitionBuilder.new(env: env) + end +end diff --git a/test_sig/test_net_http.rb b/test_sig/test_net_http.rb new file mode 100644 index 0000000..e64bd6b --- /dev/null +++ b/test_sig/test_net_http.rb @@ -0,0 +1,265 @@ +require "net/http" +require "socket" +require "stringio" +require "uri" +require "test_helper" + +module NetHTTPTypeTestSupport + class Server + attr_reader :uri + + def initialize(host = "127.0.0.1") + @server = TCPServer.open(host, 0) + @uri = URI("http://#{host}:#{@server.local_address.ip_port}/") + @thread = Thread.new do + loop do + handle_session(@server.accept) + end + rescue IOError, Errno::EBADF + end + end + + def finish + @thread.kill + @thread.join + @server.close + rescue IOError, Errno::EBADF + end + + private + + def handle_session(socket) + content_length = nil + + while (line = socket.gets) + content_length = line.split(":", 2)[1].strip.to_i if line.start_with?("Content-Length:") + break if line == "\r\n" + end + + socket.read(content_length) if content_length + + body = "ok" + socket.write( + "HTTP/1.1 200 OK\r\n" \ + "Connection: close\r\n" \ + "Content-Type: text/plain\r\n" \ + "Set-Cookie: session=1\r\n" \ + "Content-Length: #{body.bytesize}\r\n" \ + "\r\n" \ + "#{body}" + ) + ensure + socket.close + end + end + + def with_server(host = "127.0.0.1") + server = Server.new(host) + yield server.uri + ensure + server&.finish + end +end + +class NetHTTPSingletonRBSTest < NetHTTPRBSTestCase + include NetHTTPTypeTestSupport + + testing "singleton(::Net::HTTP)" + + def test_singleton_api + previous_stdout = $stdout + $stdout = StringIO.new + + with_server do |uri| + assert_send_type "(URI::Generic) -> nil", + Net::HTTP, :get_print, uri + assert_send_type "(String, String, Integer) -> nil", + Net::HTTP, :get_print, uri.host, "/", uri.port + assert_send_type "(URI::Generic, Hash[String, String]) -> String", + Net::HTTP, :get, uri, { "Accept" => "text/plain" } + assert_send_type "(URI::Generic, Hash[Symbol, String]) -> Net::HTTPResponse", + Net::HTTP, :get_response, uri, { Accept: "text/plain" } + assert_send_type "(URI, String, Hash[String, String]) -> Net::HTTPResponse", + Net::HTTP, :post, uri, "payload", "Content-Type" => "text/plain" + assert_send_type "(URI, Hash[String, Symbol]) -> Net::HTTPResponse", + Net::HTTP, :post_form, uri, { "q" => :ruby } + + http = assert_send_type "(String, Integer) -> Net::HTTP", + Net::HTTP, :start, uri.host, uri.port + http.finish if http.started? + + assert_send_type "(String, Integer) { (Net::HTTP) -> Class } -> Class", + Net::HTTP, :start, uri.host, uri.port do |net_http| + net_http.class + end + end + + assert_send_type "(String, Integer, nil, nil, nil, nil, nil) -> Net::HTTP", + Net::HTTP, :new, "127.0.0.1", 80, nil, nil, nil, nil, nil + ensure + $stdout = previous_stdout + end +end + +class NetHTTPInstanceRBSTest < NetHTTPRBSTestCase + include NetHTTPTypeTestSupport + + testing "::Net::HTTP" + + def test_attribute_api + http = Net::HTTP.new("127.0.0.1", 80) + + assert_send_type "() -> String", http, :inspect + assert_send_type "() -> String", http, :address + assert_send_type "() -> Integer", http, :port + assert_send_type "() -> nil", http, :ipaddr + assert_send_type "(String) -> void", http, :ipaddr=, "127.0.0.1" + assert_send_type "() -> Integer", http, :open_timeout + assert_send_type "() -> Integer", http, :read_timeout + assert_send_type "(Integer) -> void", http, :read_timeout=, 10 + assert_send_type "() -> Integer", http, :write_timeout + assert_send_type "(Integer) -> void", http, :write_timeout=, 10 + assert_send_type "() -> nil", http, :continue_timeout + assert_send_type "(Integer) -> void", http, :continue_timeout=, 10 + assert_send_type "() -> Integer", http, :max_retries + assert_send_type "(Integer) -> void", http, :max_retries=, 10 + assert_send_type "() -> Integer", http, :keep_alive_timeout + assert_send_type "() -> bool", http, :started? + assert_send_type "() -> bool", http, :active? + assert_send_type "() -> bool", http, :use_ssl? + assert_send_type "(bool) -> void", http, :use_ssl=, true + assert_send_type "() -> bool", http, :proxy? + assert_send_type "() -> bool", http, :proxy_from_env? + assert_send_type "() -> nil", http, :proxy_uri + assert_send_type "() -> nil", http, :proxy_address + assert_send_type "() -> nil", http, :proxy_port + assert_send_type "() -> nil", http, :proxy_user + assert_send_type "() -> nil", http, :proxy_pass + assert_send_type "(IO) -> void", http, :set_debug_output, $stderr + end + + def test_request_api + with_server do |uri| + http = Net::HTTP.start(uri.host, uri.port) + + assert_send_type "(String) -> Net::HTTPResponse", http, :get, "/" + assert_send_type "(String, Hash[String, String]) -> Net::HTTPResponse", + http, :get, "/", { "Accept" => "text/plain" } + assert_send_type "(String) { (String) -> String } -> Net::HTTPResponse", + http, :get, "/" do |body| + body + end + assert_send_type "(String) -> Net::HTTPResponse", http, :head, "/" + assert_send_type "(String, String) -> Net::HTTPResponse", http, :post, "/", "payload" + assert_send_type "(String, String, Hash[String, String]) -> Net::HTTPResponse", + http, :request_post, "/", "payload", { "Content-Type" => "text/plain" } + assert_send_type "(String) { (Net::HTTPResponse) -> String? } -> Net::HTTPResponse", + http, :request_get, "/" do |response| + response.body + end + assert_send_type "(String, String) -> Net::HTTPResponse", + http, :send_request, "GET", "/" + assert_send_type "(Net::HTTPRequest) -> Net::HTTPResponse", + http, :request, Net::HTTP::Get.new(uri) + ensure + http.finish if http&.started? + end + end +end + +class NetHTTPRequestRBSTest < NetHTTPRBSTestCase + include NetHTTPTypeTestSupport + + testing "::Net::HTTPRequest" + + def test_request_attributes_and_headers + uri = URI("http://127.0.0.1/") + request = Net::HTTP::Get.new(uri) + + assert_send_type "() -> String", request, :inspect + assert_send_type "() -> String", request, :method + assert_send_type "() -> String", request, :path + assert_send_type "() -> URI::Generic", request, :uri + assert_send_type "() -> bool", request, :decode_content + assert_send_type "() -> bool", request, :request_body_permitted? + assert_send_type "() -> bool", request, :response_body_permitted? + assert_send_type "() -> nil", request, :body + assert_send_type "(String) -> void", request, :body=, "payload" + assert_send_type "() -> nil", request, :body_stream + assert_send_type "(untyped) -> untyped", request, :body_stream=, StringIO.new + assert_send_type "(String) -> nil", request, :[], "Content-Type" + assert_send_type "(String, untyped) -> void", request, :[]=, "Content-Type", "text/plain" + assert_send_type "(String, untyped) -> void", request, :add_field, "X-Test", "1" + assert_send_type "(String) -> bool", request, :key?, "X-Test" + assert_send_type "() -> nil", request, :range + assert_send_type "(Range[Integer]) -> Range[Integer]", request, :set_range, 0..10 + assert_send_type "(Integer) -> void", request, :content_length=, 10 + assert_send_type "(String) -> void", request, :set_content_type, "text/plain" + assert_send_type "(Hash[untyped, untyped]) -> void", request, :set_form_data, { "q" => "ruby" } + assert_send_type "(Hash[untyped, untyped]) -> void", request, :set_form, { "q" => "ruby" } + assert_send_type "(String account, String password) -> void", + request, :basic_auth, "username", "password" + assert_send_type "(String account, String password) -> void", + request, :proxy_basic_auth, "username", "password" + assert_send_type "() -> bool", request, :connection_close? + assert_send_type "() -> bool", request, :connection_keep_alive? + assert_send_type "() { (String, String) -> String } -> Hash[String, Array[String]]", + request, :each_header do |key, value| + "#{key}:#{value}" + end + assert_send_type "() -> Enumerator[[String, String], Hash[String, Array[String]]]", + request, :each_header + assert_send_type "() -> Hash[String, Array[String]]", request, :to_hash + end + + def test_response_header_helpers + with_server do |uri| + response = Net::HTTP.start(uri.host, uri.port) { |http| http.request_get("/") } + + assert_send_type "(String) -> Array[String]", + response, :get_fields, "Set-Cookie" + assert_send_type "(String) { (String) -> String } -> String", + response, :fetch, "Set-Cookie" do |value| + value + end + assert_send_type "(String) -> Array[String]", + response, :delete, "Set-Cookie" + end + end +end + +class NetHTTPResponseRBSTest < NetHTTPRBSTestCase + include NetHTTPTypeTestSupport + + testing "::Net::HTTPResponse" + + class SingletonTest < NetHTTPRBSTestCase + testing "singleton(::Net::HTTPResponse)" + + def test_singleton_api + assert_send_type "() -> bool", Net::HTTPSuccess, :body_permitted? + end + end + + def response + with_server do |uri| + Net::HTTP.get_response(uri) + end + end + + def test_response_api + assert_send_type "() -> String", response, :http_version + assert_send_type "() -> String", response, :code + assert_send_type "() -> String", response, :message + assert_send_type "() -> String", response, :msg + assert_send_type "() -> URI::Generic", response, :uri + assert_send_type "() -> bool", response, :decode_content + assert_send_type "() -> String", response, :inspect + assert_send_type "() -> untyped", response, :code_type + assert_send_type "() -> nil", response, :value + assert_send_type "(URI::Generic) -> void", response, :uri=, URI("http://127.0.0.1/next") + assert_send_type "() -> String", response, :body + assert_send_type "(String) -> void", response, :body=, "payload" + assert_send_type "() -> String", response, :entity + end +end