Add bin and edit workflow
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 9s

This commit is contained in:
2026-09-16 13:11:16 -06:00
parent c8ac4fcae5
commit 4cee170d66
17576 changed files with 895740 additions and 2 deletions
+24
View File
@@ -0,0 +1,24 @@
module WEBrick
module AccessLog
class AccessLogError < StandardError
end
CLF_TIME_FORMAT: String
COMMON_LOG_FORMAT: String
CLF: String
REFERER_LOG_FORMAT: String
AGENT_LOG_FORMAT: String
COMBINED_LOG_FORMAT: String
def self?.setup_params: (Hash[Symbol, untyped] config, HTTPRequest req, HTTPResponse res) -> Hash[String, untyped]
def self?.format: (String format_string, Hash[String, untyped] params) -> String
def self?.escape: (String data) -> String
end
end
+92
View File
@@ -0,0 +1,92 @@
module WEBrick
class CGI
@options: Array[untyped]
class CGIError < StandardError
end
attr_reader config: Hash[Symbol, untyped]
attr_reader logger: BasicLog
def initialize: (*untyped args) -> void
def []: (Symbol key) -> untyped
interface _Env
def []: (String) -> String?
end
def start: (?_Env env, ?IO stdin, ?IO stdout) -> void
def self.setup_header: () -> untyped
def self.status_line: () -> ""
def service: (HTTPRequest req, HTTPResponse res) -> void
class Socket
@config: Hash[Symbol, untyped]
@env: _Env
@header_part: StringIO
@body_part: IO
@out_port: IO
@server_addr: String
@server_name: String?
@server_port: String?
@remote_addr: String?
@remote_host: String?
@remote_port: (String | 0)
include Enumerable[String]
private
def initialize: (Hash[Symbol, untyped] config, _Env env, IO stdin, IO stdout) -> void
def request_line: () -> String
def setup_header: () -> void
def add_header: (String hdrname, String value) -> void
def input: () -> (IO | StringIO)
public
def peeraddr: () -> [nil, (String | 0), String?, String?]
def addr: () -> [nil, String?, String?, String]
def gets: (?String eol, ?Integer? size) -> String?
def read: (?Integer? size) -> String?
def each: () { (String) -> void } -> void
def eof?: () -> bool
def <<: (_ToS data) -> IO
def write: (_ToS data) -> Integer
def cert: () -> OpenSSL::X509::Certificate?
def peer_cert: () -> OpenSSL::X509::Certificate?
def peer_cert_chain: () -> Array[OpenSSL::X509::Certificate]?
def cipher: () -> [String?, String?, String?, String?]?
end
end
end
+18
View File
@@ -0,0 +1,18 @@
#
# System call error module used by webrick for cross platform compatibility.
#
# EPROTO:: protocol error
# ECONNRESET:: remote host reset the connection request
# ECONNABORTED:: Client sent TCP reset (RST) before server has accepted the
# connection requested by client.
#
module Errno
class EPROTO < SystemCallError
end
class ECONNRESET < SystemCallError
end
class ECONNABORTED < SystemCallError
end
end
+17
View File
@@ -0,0 +1,17 @@
module WEBrick
module Config
LIBDIR: String
# for GenericServer
General: Hash[Symbol, untyped]
# for HTTPServer, HTTPRequest, HTTPResponse ...
HTTP: Hash[Symbol, untyped]
FileHandler: Hash[Symbol, untyped]
BasicAuth: Hash[Symbol, untyped]
DigestAuth: Hash[Symbol, untyped]
end
end
+37
View File
@@ -0,0 +1,37 @@
module WEBrick
class Cookie
@expires: String?
attr_reader name: String?
attr_accessor value: String?
attr_accessor version: Integer
#
# The cookie domain
attr_accessor domain: String?
attr_accessor path: String?
attr_accessor secure: true?
attr_accessor comment: String?
attr_accessor max_age: Integer?
def initialize: (untyped name, untyped value) -> void
def expires=: ((Time | _ToS)? t) -> untyped
def expires: () -> Time?
def to_s: () -> String
def self.parse: (String? str) -> Array[instance]?
def self.parse_set_cookie: (String str) -> instance
def self.parse_set_cookies: (String str) -> Array[instance]
end
end
+5
View File
@@ -0,0 +1,5 @@
module WEBrick
module HTMLUtils
def self?.escape: (String? string) -> String
end
end
+13
View File
@@ -0,0 +1,13 @@
module WEBrick
module HTTPAuth
interface _Callable
def call: (String user, String pass) -> bool
end
def self?._basic_auth: (HTTPRequest req, HTTPResponse res, String realm, String req_field, String res_field, HTTPStatus::Error err_type, _Callable block) -> void
def self?.basic_auth: (HTTPRequest req, HTTPResponse res, String realm) { (String user, String pass) -> bool } -> void
def self?.proxy_basic_auth: (HTTPRequest req, HTTPResponse res, String realm) { (String user, String pass) -> bool } -> void
end
end
@@ -0,0 +1,55 @@
module WEBrick
module HTTPAuth
module Authenticator
@reload_db: bool?
@request_field: String
@response_field: String
@resp_info_field: String
@auth_exception: singleton(HTTPStatus::ClientError)
@auth_scheme: String
RequestField: String
ResponseField: String
ResponseInfoField: String
AuthException: singleton(HTTPStatus::ClientError)
AuthScheme: String?
attr_reader realm: String?
attr_reader userdb: UserDB
attr_reader logger: Log
private
def check_init: (Hash[Symbol, untyped] config) -> void
def check_scheme: (HTTPRequest req) -> String?
def log: (interned meth, String fmt, *untyped args) -> void
def error: (String fmt, *untyped args) -> void
def info: (String fmt, *untyped args) -> void
end
module ProxyAuthenticator
RequestField: String
ResponseField: String
ResponseInfoField: String
AuthException: singleton(HTTPStatus::ClientError)
end
end
end
@@ -0,0 +1,29 @@
module WEBrick
module HTTPAuth
class BasicAuth
@config: Hash[Symbol, untyped]
include Authenticator
AuthScheme: String
def self.make_passwd: (String? realm, String? user, String? pass) -> String
attr_reader realm: String?
attr_reader userdb: UserDB
attr_reader logger: Log
def initialize: (Hash[Symbol, untyped] config, ?Hash[Symbol, untyped] default) -> void
def authenticate: (HTTPRequest req, HTTPResponse res) -> void
def challenge: (HTTPRequest req, HTTPResponse res) -> bot
end
class ProxyBasicAuth < BasicAuth
include ProxyAuthenticator
end
end
end
@@ -0,0 +1,85 @@
module WEBrick
module HTTPAuth
class DigestAuth
@config: Hash[Symbol, untyped]
@domain: Array[String]?
@use_opaque: bool
@use_next_nonce: bool
@check_nc: bool
@use_auth_info_header: bool
@nonce_expire_period: Integer
@nonce_expire_delta: Integer
@internet_explorer_hack: bool
@h: singleton(Digest::Base)
@instance_key: String
@opaques: Hash[String, OpaqueInfo]
@last_nonce_expire: Time
@mutex: Thread::Mutex
include Authenticator
AuthScheme: String
class OpaqueInfo < Struct[untyped]
attr_accessor time(): Time
attr_accessor nonce(): String?
attr_accessor nc(): String
end
attr_reader algorithm: String?
attr_reader qop: Array[String]
def self.make_passwd: (String realm, String user, String pass) -> untyped
def initialize: (Hash[Symbol, untyped] config, ?Hash[Symbol, untyped] default) -> void
def authenticate: (HTTPRequest req, HTTPResponse res) -> void
def challenge: (HTTPRequest req, HTTPResponse res, ?bool stale) -> bot
private
MustParams: Array[String]
MustParamsAuth: Array[String]
def _authenticate: (HTTPRequest req, HTTPResponse res) -> (:nonce_is_stale | bool)
def split_param_value: (String string) -> Hash[String, String]
def generate_next_nonce: (HTTPRequest req) -> String
def check_nonce: (HTTPRequest req, Hash[String, String] auth_req) -> bool
def generate_opaque: (HTTPRequest req) -> String
def check_opaque: (OpaqueInfo opaque_struct, untyped req, Hash[String, String] auth_req) -> bool
def check_uri: (HTTPRequest req, Hash[String, String] auth_req) -> bool
def hexdigest: (*_ToS? args) -> String
end
class ProxyDigestAuth < DigestAuth
include ProxyAuthenticator
private
def check_uri: (HTTPRequest req, Hash[String, String] auth_req) -> true
end
end
end
@@ -0,0 +1,31 @@
module WEBrick
module HTTPAuth
class Htdigest
@path: String
@mtime: Time
@digest: Hash[String, Hash[String, String]]
@mutex: Thread::Mutex
@auth_type: String
include UserDB
def initialize: (String path) -> void
def reload: () -> void
def flush: (?String? output) -> void
def get_passwd: (String realm, String user, bool reload_db) -> String?
def set_passwd: (String realm, String user, String pass) -> String
def delete_passwd: (String realm, String user) -> String?
def each: () { (String user, String realm, String password_hash) -> void } -> void
end
end
end
@@ -0,0 +1,21 @@
module WEBrick
module HTTPAuth
class Htgroup
@path: String
@mtime: Time
@group: Hash[String, Array[String]]
def initialize: (String path) -> void
def reload: () -> void
def flush: (?String? output) -> void
def members: (String group) -> Array[String]
def add: (String group, Array[String] members) -> void
end
end
end
@@ -0,0 +1,31 @@
module WEBrick
module HTTPAuth
class Htpasswd
@path: String
@mtime: Time
@passwd: Hash[String, String]
@auth_type: String
@password_hash: (:crypt | :bcrypt)
include UserDB
def initialize: (String path, ?password_hash: (:crypt | :bcrypt)?) -> void
def reload: () -> void
def flush: (?String? output) -> void
def get_passwd: (String realm, String user, bool reload_db) -> String?
def set_passwd: (String realm, String user, String pass) -> void
def delete_passwd: (String realm, String user) -> String
def each: () { ([String, String]) -> void } -> void
end
end
end
@@ -0,0 +1,13 @@
module WEBrick
module HTTPAuth
module UserDB
attr_accessor auth_type: String
def make_passwd: (String realm, String user, String pass) -> String
def set_passwd: (String realm, String user, String pass) -> void
def get_passwd: (String realm, String user, ?bool reload_db) -> String
end
end
end
+61
View File
@@ -0,0 +1,61 @@
module WEBrick
NullReader: untyped
def self.read: (*untyped args) -> nil
alias self.gets self.read
FakeProxyURI: untyped
def self.method_missing: (untyped meth, *untyped args) -> (nil | untyped)
class HTTPProxyServer < HTTPServer
@via: untyped
def initialize: (?::Hash[untyped, untyped] config, ?untyped default) -> void
# :stopdoc:
def service: (HTTPRequest req, HTTPResponse res) -> untyped
def proxy_auth: (HTTPRequest req, HTTPResponse res) -> untyped
def proxy_uri: (HTTPRequest req, HTTPResponse res) -> untyped
def proxy_service: (HTTPRequest req, HTTPResponse res) -> untyped
def do_CONNECT: (HTTPRequest req, HTTPResponse res) -> untyped
def do_GET: (HTTPRequest req, HTTPResponse res) -> untyped
def do_HEAD: (HTTPRequest req, HTTPResponse res) -> untyped
def do_POST: (HTTPRequest req, HTTPResponse res) -> untyped
def do_OPTIONS: (HTTPRequest req, HTTPResponse res) -> untyped
private
# Some header fields should not be transferred.
HopByHop: ::Array["connection" | "keep-alive" | "proxy-authenticate" | "upgrade" | "proxy-authorization" | "te" | "trailers" | "transfer-encoding"]
ShouldNotTransfer: ::Array["set-cookie" | "proxy-connection"]
def split_field: (untyped f) -> (untyped | ::Array[untyped])
def choose_header: (untyped src, untyped dst) -> untyped
# Net::HTTP is stupid about the multiple header fields.
# Here is workaround:
def set_cookie: (untyped src, untyped dst) -> (untyped | nil)
def set_via: (untyped h) -> (untyped | nil)
def setup_proxy_header: (HTTPRequest req, HTTPResponse res) -> untyped
def setup_upstream_proxy_authentication: (HTTPRequest req, HTTPResponse res, untyped header) -> untyped
def create_net_http: (untyped uri, untyped upstream) -> untyped
def perform_proxy_request: (HTTPRequest req, HTTPResponse res, untyped req_class, ?untyped? body_stream) -> untyped
end
end
+167
View File
@@ -0,0 +1,167 @@
module WEBrick
class HTTPRequest
@config: Hash[Symbol, untyped]
@buffer_size: Integer
@logger: Log
@query: Hash[String, HTTPUtils::FormData]?
@body: String
@remaining_size: Integer?
@socket: TCPSocket?
@forwarded_proto: String?
@host: String?
@port: Integer?
@body_tmp: Array[String]
@body_rd: Fiber
@request_bytes: Integer
@forwarded_server: String?
@forwarded_host: String?
@forwarded_port: Integer?
@forwarded_for: String?
BODY_CONTAINABLE_METHODS: Array[String]
attr_reader request_line: String?
attr_reader request_method: String?
attr_reader unparsed_uri: String?
attr_reader http_version: HTTPVersion?
attr_reader request_uri: URI::Generic?
attr_reader path: String?
attr_accessor script_name: String?
attr_accessor path_info: String?
attr_accessor query_string: String?
attr_reader raw_header: Array[String]
attr_reader header: Hash[String, Array[String]]?
attr_reader cookies: Array[Cookie]
attr_reader accept: Array[String]
attr_reader accept_charset: Array[String]
attr_reader accept_encoding: Array[String]
attr_reader accept_language: Array[String]
attr_accessor user: String?
attr_reader addr: ([String, Integer, String, String] | [])
attr_reader peeraddr: ([String, Integer, String, String] | [])
attr_reader attributes: Hash[untyped, untyped]
attr_reader keep_alive: bool
attr_reader request_time: Time?
def initialize: (Hash[Symbol, untyped] config) -> void
def parse: (?TCPSocket? socket) -> void
def continue: () -> void
type body_chunk_block = ^(String body_chunk) -> void
def body: () ?{ (String body_chunk) -> void } -> String
def body_reader: () -> self
# for IO.copy_stream.
def readpartial: (Integer size, ?String buf) -> String
def query: () -> Hash[String, HTTPUtils::FormData]
def content_length: () -> Integer
def content_type: () -> String?
def []: (String header_name) -> String?
def each: [T] () { (String, String) -> T } -> T?
def host: () -> String?
def port: () -> Integer?
def server_name: () -> String?
def remote_ip: () -> String?
def ssl?: () -> bool
def keep_alive?: () -> bool
def to_s: () -> String
def fixup: () -> void
def meta_vars: () -> Hash[String, String]
private
MAX_URI_LENGTH: Integer
# same as Mongrel, Thin and Puma
MAX_HEADER_LENGTH: Integer
def read_request_line: (IO socket) -> void
def read_header: (IO socket) -> void
def parse_uri: (String str, ?String scheme) -> URI::Generic
HOST_PATTERN: Regexp
def parse_host_request_line: (String host) -> [String, String]
def read_body: (IO socket, body_chunk_block block) -> String
| (nil socket, top block) -> nil
def read_chunk_size: (IO socket) -> [Integer, String?]
def read_chunked: (IO socket, body_chunk_block block) -> void
def _read_data: (IO io, Symbol method, *untyped arg) -> String?
def read_line: (IO io, ?Integer size) -> String?
def read_data: (IO io, Integer size) -> String?
def parse_query: () -> void
PrivateNetworkRegexp: Regexp
# It's said that all X-Forwarded-* headers will contain more than one
# (comma-separated) value if the original request already contained one of
# these headers. Since we could use these values as Host header, we choose
# the initial(first) value. (apr_table_mergen() adds new value after the
# existing value with ", " prefix)
def setup_forwarded_info: () -> void
end
end
+117
View File
@@ -0,0 +1,117 @@
module WEBrick
class HTTPResponse
@buffer_size: Integer
@logger: Log
@chunked: bool
@bodytempfile: File | Tempfile | nil
class InvalidHeader < StandardError
end
attr_reader http_version: HTTPVersion
attr_reader status: Integer
attr_reader header: Hash[String, String]
attr_reader cookies: Array[Cookie]
attr_accessor reason_phrase: String
interface _CallableBody
def call: (_Writer) -> void
end
attr_accessor body: String | _ReaderPartial | _CallableBody
attr_accessor request_method: String?
attr_accessor request_uri: URI::Generic?
attr_accessor request_http_version: HTTPVersion?
attr_accessor filename: String?
attr_accessor keep_alive: bool
attr_reader config: Hash[Symbol, untyped]
attr_reader sent_size: Integer
attr_accessor upgrade: String?
def initialize: (Hash[Symbol, untyped] config) -> void
def status_line: () -> String
def status=: (Integer status) -> Integer
def []: (String field) -> String?
def []=: (String field, _ToS value) -> _ToS
def content_length: () -> Integer?
def content_length=: (Integer len) -> Integer
def content_type: () -> String?
def content_type=: (String type) -> String
def each: () { (String, String) -> void } -> void
def chunked?: () -> bool
def chunked=: (boolish val) -> boolish
def keep_alive?: () -> bool
def upgrade!: (String protocol) -> void
def send_response: (_Writer socket) -> void
def setup_header: () -> void
def make_body_tempfile: () -> void
def remove_body_tempfile: () -> void
def send_header: (_Writer socket) -> void
def send_body: (_Writer socket) -> void
def set_redirect: (singleton(WEBrick::HTTPStatus::Redirect) status, URI::Generic | String url) -> bot
def set_error: (singleton(Exception) ex, ?bool backtrace) -> void
private
def check_header: (_ToS header_value) -> String
def error_body: (bool backtrace, singleton(Exception) ex, String? host, Integer? port) -> void
def send_body_io: (_Writer socket) -> void
def send_body_string: (_Writer socket) -> void
def send_body_proc: (_Writer socket) -> void
class ChunkedWrapper
@socket: _Writer
@resp: HTTPResponse
def initialize: (_Writer socket, HTTPResponse resp) -> void
def write: (_ToS buf) -> Integer
def <<: (*_ToS buf) -> self
end
# preserved for compatibility with some 3rd-party handlers
def _write_data: [T] (T socket, _ToS data) -> T
end
end
+49
View File
@@ -0,0 +1,49 @@
module WEBrick
class HTTPRequest
@client_cert_chain: Array[OpenSSL::X509::Certificate]
attr_reader cipher: [String, String, Integer, Integer]?
attr_reader server_cert: OpenSSL::X509::Certificate
attr_reader client_cert: OpenSSL::X509::Certificate?
alias orig_parse parse
def parse: (?(TCPSocket | OpenSSL::SSL::SSLSocket)? socket) -> void
| ...
alias orig_parse_uri parse_uri
private
def parse_uri: (String str, ?::String scheme) -> URI::Generic
| ...
public
alias orig_meta_vars meta_vars
def meta_vars: () -> Hash[String, String]
| ...
end
class SNIRequest
attr_reader host: String?
attr_reader addr: [String, Integer, String, String]
attr_reader port: Integer
def initialize: (OpenSSL::SSL::SSLSocket sslsocket, ?String? hostname) -> void
end
class HTTPServer < ::WEBrick::GenericServer
def ssl_servername_callback: (OpenSSL::SSL::SSLSocket sslsocket, ?String? hostname) -> OpenSSL::SSL::SSLContext?
alias orig_virtual_host virtual_host
def virtual_host: (instance server) -> void
| ...
end
end
+71
View File
@@ -0,0 +1,71 @@
module WEBrick
class HTTPServerError < ServerError
end
class HTTPServer < ::WEBrick::GenericServer
@http_version: HTTPVersion
@mount_tab: MountTable
@virtual_hosts: Array[untyped]
def initialize: (?Hash[Symbol, untyped] config, ?Hash[Symbol, untyped] default) -> void
def run: (TCPSocket sock) -> void
def service: (HTTPRequest req, HTTPResponse res) -> void
def do_OPTIONS: (HTTPRequest req, HTTPResponse res) -> void
def mount: (String dir, singleton(HTTPServlet::AbstractServlet) servlet, *untyped options) -> void
def mount_proc: (String dir, ?HTTPServlet::ProcHandler::_Callable proc) -> void
| (String dir, ?nil proc) { (HTTPRequest, HTTPResponse) -> void } -> void
def unmount: (String dir) -> MountTable::value_type
alias umount unmount
def search_servlet: (String path) -> [singleton(HTTPServlet::AbstractServlet), Array[untyped], String, String]?
def virtual_host: (instance server) -> void
def lookup_server: (HTTPRequest req) -> instance?
def access_log: (Hash[Symbol, untyped] config, HTTPRequest req, HTTPResponse res) -> void
#
# Creates the HTTPRequest used when handling the HTTP
# request. Can be overridden by subclasses.
def create_request: (Hash[Symbol, untyped] with_webrick_config) -> HTTPRequest
#
# Creates the HTTPResponse used when handling the HTTP
# request. Can be overridden by subclasses.
def create_response: (Hash[Symbol, untyped] with_webrick_config) -> HTTPResponse
class MountTable
type value_type = [singleton(HTTPServlet::AbstractServlet), Array[untyped]]
@tab: Hash[String, value_type]
@scanner: Regexp
def initialize: () -> void
def []: (String dir) -> value_type
def []=: (String dir, value_type val) -> value_type
def delete: (String dir) -> value_type
def scan: (String path) -> [String, String]
private
def compile: () -> void
def normalize: (String dir) -> String
end
end
end
@@ -0,0 +1,4 @@
module WEBrick
module HTTPServlet
end
end
@@ -0,0 +1,36 @@
module WEBrick
module HTTPServlet
class HTTPServletError < StandardError
end
class AbstractServlet
@server: HTTPServer
interface _Config
def []: (Symbol) -> untyped
end
@config: _Config
@logger: Log
@options: untyped # Array[untyped] causes RBS::InstanceVariableTypeError
def self.get_instance: (HTTPServer server, *untyped options) -> instance
def initialize: (HTTPServer server, *untyped options) -> void
def service: (HTTPRequest req, HTTPResponse res) -> void
def do_GET: (HTTPRequest req, HTTPResponse res) -> bot
def do_HEAD: (HTTPRequest req, HTTPResponse res) -> bot
def do_OPTIONS: (HTTPRequest req, HTTPResponse res) -> void
private
def redirect_to_directory_uri: (HTTPRequest req, HTTPResponse res) -> void
end
end
end
@@ -0,0 +1,3 @@
class Object
def sysread: (IO io, Integer size) -> String
end
@@ -0,0 +1,23 @@
module WEBrick
module HTTPServlet
class CGIHandler < AbstractServlet
@script_filename: String
@tempdir: String?
@cgicmd: Array[String] | String
Ruby: String
CGIRunner: String
CGIRunnerArray: [String, String]
def initialize: (HTTPServer server, String name) -> void
def do_GET: (HTTPRequest req, HTTPResponse res) -> void
alias do_POST do_GET
end
end
end
@@ -0,0 +1,17 @@
module WEBrick
module HTTPServlet
class ERBHandler < AbstractServlet
@script_filename: String
def initialize: (HTTPServer server, String name) -> void
def do_GET: (HTTPRequest req, HTTPResponse res) -> void
alias do_POST do_GET
private
def evaluate: (ERB erb, HTTPRequest servlet_request, HTTPResponse servlet_response) -> String
end
end
end
@@ -0,0 +1,76 @@
module WEBrick
module HTTPServlet
class DefaultFileHandler < AbstractServlet
@local_path: String
def initialize: (HTTPServer server, String local_path) -> void
def do_GET: (HTTPRequest req, HTTPResponse res) -> void
def not_modified?: (HTTPRequest req, HTTPResponse res, Time mtime, String etag) -> bool
# returns a lambda for webrick/httpresponse.rb send_body_proc
def multipart_body: (File body, Array[[Numeric, Numeric]] parts, String boundary, String mtype, Integer filesize) -> HTTPResponse::_CallableBody
def make_partial_content: (HTTPRequest req, HTTPResponse res, String filename, Integer filesize) -> void
def prepare_range: (Range[Integer] range, Integer filesize) -> [Numeric, Numeric]
end
class FileHandler < AbstractServlet
@config: AbstractServlet::_Config
@logger: Log
@root: String
@options: Hash[Symbol, untyped]
HandlerTable: Hash[String, singleton(AbstractServlet)]
def self.add_handler: (String suffix, singleton(AbstractServlet) handler) -> singleton(AbstractServlet)
def self.remove_handler: (String suffix) -> singleton(AbstractServlet)
def initialize: (HTTPServer server, String root, ?Hash[Symbol, untyped] options, ?Hash[Symbol, untyped] default) -> void
def set_filesystem_encoding: (String str) -> String
def service: (HTTPRequest req, HTTPResponse res) -> void
def do_GET: (HTTPRequest req, HTTPResponse res) -> void
def do_POST: (HTTPRequest req, HTTPResponse res) -> void
def do_OPTIONS: (HTTPRequest req, HTTPResponse res) -> void
private
def trailing_pathsep?: (String path) -> bool
def prevent_directory_traversal: (HTTPRequest req, HTTPResponse res) -> void
def exec_handler: (HTTPRequest req, HTTPResponse res) -> bool
def get_handler: (HTTPRequest req, HTTPResponse res) -> singleton(AbstractServlet)
def set_filename: (HTTPRequest req, HTTPResponse res) -> bool
def check_filename: (HTTPRequest req, HTTPResponse res, String name) -> void
def shift_path_info: (HTTPRequest req, HTTPResponse res, String path_info, ?String? base) -> void
def search_index_file: (HTTPRequest req, HTTPResponse res) -> String?
def search_file: (HTTPRequest req, HTTPResponse res, String basename) -> String?
def call_callback: (Symbol callback_name, HTTPRequest req, HTTPResponse res) -> void
def windows_ambiguous_name?: (String name) -> bool
def nondisclosure_name?: (String name) -> bool
def set_dir_list: (HTTPRequest req, HTTPResponse res) -> void
end
end
end
@@ -0,0 +1,21 @@
module WEBrick
module HTTPServlet
class ProcHandler < AbstractServlet
interface _Callable
def call: (WEBrick::HTTPRequest, WEBrick::HTTPResponse) -> void
end
@proc: _Callable
def get_instance: (HTTPServer server, *untyped options) -> self
def initialize: (_Callable proc) -> void
def do_GET: (HTTPRequest request, HTTPResponse response) -> void
alias do_POST do_GET
alias do_PUT do_GET
end
end
end
+255
View File
@@ -0,0 +1,255 @@
module WEBrick
#
# This module is used to manager HTTP status codes.
#
# See http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html for more
# information.
module HTTPStatus
#
# Root of the HTTP status class hierarchy
class Status < StandardError
attr_reader self.code: Integer
attr_reader self.reason_phrase: String
# Returns the HTTP status code
def code: () -> Integer
# Returns the HTTP status description
def reason_phrase: () -> String
alias to_i code
end
# Root of the HTTP info statuses
class Info < Status
end
# Root of the HTTP success statuses
class Success < Status
end
# Root of the HTTP redirect statuses
class Redirect < Status
end
# Root of the HTTP error statuses
class Error < Status
end
# Root of the HTTP client error statuses
class ClientError < Error
end
# Root of the HTTP server error statuses
class ServerError < Error
end
class EOFError < StandardError
end
# HTTP status codes and descriptions
StatusMessage: Hash[Integer, String]
# Maps a status code to the corresponding Status class
CodeToError: Hash[Integer, singleton(Status)]
# WEBrick::HTTPStatus::constants.grep(/\ARC_/).map{"#{_1}: #{WEBrick::HTTPStatus.const_get(_1)}"}
RC_CONTINUE: 100
RC_SWITCHING_PROTOCOLS: 101
RC_OK: 200
RC_CREATED: 201
RC_ACCEPTED: 202
RC_NON_AUTHORITATIVE_INFORMATION: 203
RC_NO_CONTENT: 204
RC_RESET_CONTENT: 205
RC_PARTIAL_CONTENT: 206
RC_MULTI_STATUS: 207
RC_MULTIPLE_CHOICES: 300
RC_MOVED_PERMANENTLY: 301
RC_FOUND: 302
RC_SEE_OTHER: 303
RC_NOT_MODIFIED: 304
RC_USE_PROXY: 305
RC_TEMPORARY_REDIRECT: 307
RC_BAD_REQUEST: 400
RC_UNAUTHORIZED: 401
RC_PAYMENT_REQUIRED: 402
RC_FORBIDDEN: 403
RC_NOT_FOUND: 404
RC_METHOD_NOT_ALLOWED: 405
RC_NOT_ACCEPTABLE: 406
RC_PROXY_AUTHENTICATION_REQUIRED: 407
RC_REQUEST_TIMEOUT: 408
RC_CONFLICT: 409
RC_GONE: 410
RC_PRECONDITION_FAILED: 412
RC_LENGTH_REQUIRED: 411
RC_REQUEST_ENTITY_TOO_LARGE: 413
RC_REQUEST_URI_TOO_LARGE: 414
RC_UNSUPPORTED_MEDIA_TYPE: 415
RC_EXPECTATION_FAILED: 417
RC_UNPROCESSABLE_ENTITY: 422
RC_LOCKED: 423
RC_FAILED_DEPENDENCY: 424
RC_REQUEST_RANGE_NOT_SATISFIABLE: 416
RC_UPGRADE_REQUIRED: 426
RC_PRECONDITION_REQUIRED: 428
RC_TOO_MANY_REQUESTS: 429
RC_REQUEST_HEADER_FIELDS_TOO_LARGE: 431
RC_UNAVAILABLE_FOR_LEGAL_REASONS: 451
RC_INTERNAL_SERVER_ERROR: 500
RC_NOT_IMPLEMENTED: 501
RC_BAD_GATEWAY: 502
RC_SERVICE_UNAVAILABLE: 503
RC_GATEWAY_TIMEOUT: 504
RC_HTTP_VERSION_NOT_SUPPORTED: 505
RC_INSUFFICIENT_STORAGE: 507
RC_NETWORK_AUTHENTICATION_REQUIRED: 511
# WEBrick::HTTPStatus::CodeToError.each_value.map{"class #{_1.name.split(/::/).last} < #{_1.superclass.name.split(/::/).last}\nend"}
class Continue < Info
end
class SwitchingProtocols < Info
end
class OK < Success
end
class Created < Success
end
class Accepted < Success
end
class NonAuthoritativeInformation < Success
end
class NoContent < Success
end
class ResetContent < Success
end
class PartialContent < Success
end
class MultiStatus < Success
end
class MultipleChoices < Redirect
end
class MovedPermanently < Redirect
end
class Found < Redirect
end
class SeeOther < Redirect
end
class NotModified < Redirect
end
class UseProxy < Redirect
end
class TemporaryRedirect < Redirect
end
class BadRequest < ClientError
end
class Unauthorized < ClientError
end
class PaymentRequired < ClientError
end
class Forbidden < ClientError
end
class NotFound < ClientError
end
class MethodNotAllowed < ClientError
end
class NotAcceptable < ClientError
end
class ProxyAuthenticationRequired < ClientError
end
class RequestTimeout < ClientError
end
class Conflict < ClientError
end
class Gone < ClientError
end
class LengthRequired < ClientError
end
class PreconditionFailed < ClientError
end
class RequestEntityTooLarge < ClientError
end
class RequestURITooLarge < ClientError
end
class UnsupportedMediaType < ClientError
end
class RequestRangeNotSatisfiable < ClientError
end
class ExpectationFailed < ClientError
end
class UnprocessableEntity < ClientError
end
class Locked < ClientError
end
class FailedDependency < ClientError
end
class UpgradeRequired < ClientError
end
class PreconditionRequired < ClientError
end
class TooManyRequests < ClientError
end
class RequestHeaderFieldsTooLarge < ClientError
end
class UnavailableForLegalReasons < ClientError
end
class InternalServerError < ServerError
end
class NotImplemented < ServerError
end
class BadGateway < ServerError
end
class ServiceUnavailable < ServerError
end
class GatewayTimeout < ServerError
end
class HTTPVersionNotSupported < ServerError
end
class InsufficientStorage < ServerError
end
class NetworkAuthenticationRequired < ServerError
end
#
# Returns the description corresponding to the HTTP status +code+
#
# WEBrick::HTTPStatus.reason_phrase 404
# => "Not Found"
def self?.reason_phrase: (Integer code) -> String
#
# Is +code+ an informational status?
def self?.info?: (Integer code) -> bool
#
# Is +code+ a successful status?
def self?.success?: (Integer code) -> bool
#
# Is +code+ a redirection status?
def self?.redirect?: (Integer code) -> bool
#
# Is +code+ an error status?
def self?.error?: (Integer code) -> bool
#
# Is +code+ a client error status?
def self?.client_error?: (Integer code) -> bool
#
# Is +code+ a server error status?
def self?.server_error?: (Integer code) -> bool
#
# Returns the status class corresponding to +code+
#
# WEBrick::HTTPStatus[302]
# => WEBrick::HTTPStatus::NotFound
#
def self.[]: (Integer code) -> singleton(Status)
end
end
+116
View File
@@ -0,0 +1,116 @@
module WEBrick
CR: String
LF: String
CRLF: String
module HTTPUtils
def self?.normalize_path: (String path) -> String
type mime_types = Hash[String, String]
DefaultMimeTypes: mime_types
def self?.load_mime_types: (string | _ToPath file) -> mime_types
def self?.mime_type: (String filename, mime_types mime_tab) -> String
class SplitHeader < Array[String]
def join: (?String separator) -> String
end
class CookieHeader < Array[String]
def join: (?String separator) -> String
end
HEADER_CLASSES: Hash[String, untyped]
def self?.parse_header: (String raw) -> Hash[String, Array[String]]
def self?.split_header_value: (String str) -> Array[String]
def self?.parse_range_header: (String? ranges_specifier) -> Array[Range[Integer]]?
def self?.parse_qvalues: (String? value) -> Array[String]
def self?.dequote: (String str) -> String
def self?.quote: (String str) -> String
class FormData < String
@raw_header: Array[String]
@header: Hash[String, Array[String]]
EmptyRawHeader: Array[String]
EmptyHeader: Hash[String, Array[String]]
attr_accessor name: String?
attr_accessor filename: String?
attr_accessor next_data: instance?
def initialize: (*String args) -> void
def []: (*String key) -> String
# following is as same as String#[]
| (int start, ?int length) -> String?
| (range[int?] range) -> String?
| (Regexp regexp, ?MatchData::capture backref) -> String?
| (String substring) -> String?
def <<: (String str) -> self
def append_data: (instance data) -> self
def each_data: () { (instance) -> void } -> void
def list: () -> Array[String]
alias to_ary list
def to_s: () -> String
end
def self?.parse_query: (String? str) -> Hash[String, FormData]
interface _EachLine
def each_line: () { (String) -> void } -> void
end
def self?.parse_form_data: (_EachLine? io, interned boundary) -> Hash[String, FormData]
def self?._make_regex: (String str) -> Regexp
def self?._make_regex!: (String str) -> Regexp
def self?._escape: (String str, Regexp regex) -> String
def self?._unescape: (String str, Regexp regex) -> String
UNESCAPED: Regexp
UNESCAPED_FORM: Regexp
NONASCII: Regexp
ESCAPED: Regexp
UNESCAPED_PCHAR: Regexp
def self?.escape: (String str) -> String
def self?.unescape: (String str) -> String
def self?.escape_form: (String str) -> String
def self?.unescape_form: (String str) -> String
def self?.escape_path: (String str) -> String
def self?.escape8bit: (String str) -> String
end
end
@@ -0,0 +1,17 @@
module WEBrick
class HTTPVersion
include Comparable
attr_accessor major: Integer
attr_accessor minor: Integer
def self.convert: (HTTPVersion | String version) -> instance
def initialize: (HTTPVersion | String version) -> void
def <=>: (HTTPVersion | String other) -> Integer?
def to_s: () -> String
end
end
+93
View File
@@ -0,0 +1,93 @@
module WEBrick
class BasicLog
@log: IO?
@opened: TrueClass?
FATAL: 1
ERROR: 2
WARN: 3
INFO: 4
DEBUG: 5
# log-level, messages above this level will be logged
attr_accessor level: Integer
type log_file = (IO | String)?
def initialize: (?log_file log_file, ?Integer? level) -> void
#
# Closes the logger (also closes the log device associated to the logger)
def close: () -> void
def log: (Integer level, String data) -> IO?
#
# Synonym for log(INFO, obj.to_s)
def <<: (_ToS obj) -> IO?
type message = Exception | _ToStr | Object
# Shortcut for logging a FATAL message
def fatal: (message msg) -> IO?
# Shortcut for logging an ERROR message
def error: (message msg) -> IO?
# Shortcut for logging a WARN message
def warn: (message msg) -> IO?
# Shortcut for logging an INFO message
def info: (message msg) -> IO?
# Shortcut for logging a DEBUG message
def debug: (message msg) -> IO?
# Will the logger output FATAL messages?
def fatal?: () -> bool
# Will the logger output ERROR messages?
def error?: () -> bool
# Will the logger output WARN messages?
def warn?: () -> bool
# Will the logger output INFO messages?
def info?: () -> bool
# Will the logger output DEBUG messages?
def debug?: () -> bool
private
#
# Formats +arg+ for the logger
#
# * If +arg+ is an Exception, it will format the error message and
# the back trace.
# * If +arg+ responds to #to_str, it will return it.
# * Otherwise it will return +arg+.inspect.
def format: (message arg) -> String
end
class Log < BasicLog
# Format of the timestamp which is applied to each logged line. The
# default is <tt>"[%Y-%m-%d %H:%M:%S]"</tt>
attr_accessor time_format: String
#
# Same as BasicLog#initialize
#
# You can set the timestamp format through #time_format
def initialize: (?BasicLog::log_file log_file, ?Integer? level) -> void
#
# Same as BasicLog#log
def log: (Integer level, String data) -> IO?
end
end
+8
View File
@@ -0,0 +1,8 @@
dependencies:
- name: digest
- name: erb
- name: openssl
- name: singleton
- name: socket
- name: tempfile
- name: uri
+57
View File
@@ -0,0 +1,57 @@
module WEBrick
class ServerError < StandardError
end
class SimpleServer
def self.start: [T] () { () -> T } -> T
end
class Daemon
def self.start: () -> void
| [T] () { () -> T } -> T
end
class GenericServer
@shutdown_pipe: [IO, IO]?
attr_reader status: :Stop | :Running | :Shutdown
attr_reader config: Hash[Symbol, untyped]
attr_reader logger: BasicLog
attr_reader tokens: Thread::SizedQueue
attr_reader listeners: Array[TCPServer| OpenSSL::SSL::SSLServer]
def initialize: (?Hash[Symbol, untyped] config, ?Hash[Symbol, untyped] default) -> void
def []: (Symbol key) -> untyped
def listen: (String address, Integer port) -> void
def start: () ?{ (TCPSocket) -> void } -> void
def stop: () -> void
def shutdown: () -> void
def run: (TCPSocket sock) -> void
private
def accept_client: (TCPServer svr) -> TCPSocket?
def start_thread: (TCPSocket sock) ?{ (TCPSocket) -> void } -> Thread
def call_callback: (Symbol callback_name, *untyped args) -> untyped
def setup_shutdown_pipe: () -> [IO, IO]
def cleanup_shutdown_pipe: ([IO, IO]? shutdown_pipe) -> void
def alarm_shutdown_pipe: [T] () { (IO) -> T } -> T?
def cleanup_listener: () -> void
end
end
+19
View File
@@ -0,0 +1,19 @@
module WEBrick
module Config
SSL: Hash[Symbol, untyped]
end
module Utils
def self?.create_self_signed_cert: (untyped bits, untyped cn, untyped comment) -> ::Array[untyped]
end
class GenericServer
@ssl_context: OpenSSL::SSL::SSLContext?
def ssl_context: () -> OpenSSL::SSL::SSLContext?
def setup_ssl_context: (Hash[Symbol, untyped] config) -> OpenSSL::SSL::SSLContext
def ssl_servername_callback: (untyped sslsocket, ?untyped? hostname) -> untyped
end
end
+122
View File
@@ -0,0 +1,122 @@
module WEBrick
module Utils
#
# Sets IO operations on +io+ to be non-blocking
def self?.set_non_blocking: (IO io) -> void
#
# Sets the close on exec flag for +io+
def self?.set_close_on_exec: (IO io) -> void
#
# Changes the process's uid and gid to the ones of +user+
def self?.su: (String user) -> void
#
# The server hostname
def self?.getservername: () -> String
#
# Creates TCP server sockets bound to +address+:+port+ and returns them.
#
# It will create IPV4 and IPV6 sockets on all interfaces.
def self?.create_listeners: (String host, Integer port) -> Array[TCPServer]
#
# Characters used to generate random strings
RAND_CHARS: String
#
# Generates a random string of length +len+
def self?.random_string: (Integer len) -> String
#
# Class used to manage timeout handlers across multiple threads.
#
# Timeout handlers should be managed by using the class methods which are
# synchronized.
#
# id = TimeoutHandler.register(10, Timeout::Error)
# begin
# sleep 20
# puts 'foo'
# ensure
# TimeoutHandler.cancel(id)
# end
#
# will raise Timeout::Error
#
# id = TimeoutHandler.register(10, Timeout::Error)
# begin
# sleep 5
# puts 'foo'
# ensure
# TimeoutHandler.cancel(id)
# end
#
# will print 'foo'
#
class TimeoutHandler
@queue: Thread::Queue
@watcher: Thread?
include Singleton
#
# Mutex used to synchronize access across threads
TimeoutMutex: Thread::Mutex
#
# Registers a new timeout handler
#
# +time+:: Timeout in seconds
# +exception+:: Exception to raise when timeout elapsed
def self.register: (Numeric seconds, singleton(Exception) exception) -> Integer
#
# Cancels the timeout handler +id+
def self.cancel: (Integer id) -> bool
def self.terminate: () -> Thread?
#
# Creates a new TimeoutHandler. You should use ::register and ::cancel
# instead of creating the timeout handler directly.
def initialize: () -> void
private
def watch: () -> bot
def watcher: () -> Thread
public
#
# Interrupts the timeout handler +id+ and raises +exception+
def interrupt: (Thread thread, Integer id, singleton(Exception) exception) -> nil
#
# Registers a new timeout handler
#
# +time+:: Timeout in seconds
# +exception+:: Exception to raise when timeout elapsed
def register: (Thread thread, Numeric time, singleton(Exception) exception) -> Integer
#
# Cancels the timeout handler +id+
def cancel: (Thread thread, Integer id) -> bool
#
def terminate: () -> Thread?
end
#
# Executes the passed block and raises +exception+ if execution takes more
# than +seconds+.
#
# If +seconds+ is zero or nil, simply executes the block
def self?.timeout: [T] (Numeric? seconds, ?singleton(Exception) exception) { (?Numeric) -> T } -> T
end
end
+3
View File
@@ -0,0 +1,3 @@
module WEBrick
VERSION: String
end