itsi-server 0.2.22-aarch64-linux
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.rubocop.yml +8 -0
- data/Cargo.lock +4452 -0
- data/Cargo.toml +11 -0
- data/Rakefile +57 -0
- data/exe/itsi +193 -0
- data/ext/itsi_acme/Cargo.toml +86 -0
- data/ext/itsi_acme/examples/high_level.rs +63 -0
- data/ext/itsi_acme/examples/high_level_warp.rs +52 -0
- data/ext/itsi_acme/examples/low_level.rs +87 -0
- data/ext/itsi_acme/examples/low_level_axum.rs +66 -0
- data/ext/itsi_acme/src/acceptor.rs +81 -0
- data/ext/itsi_acme/src/acme.rs +354 -0
- data/ext/itsi_acme/src/axum.rs +86 -0
- data/ext/itsi_acme/src/cache.rs +39 -0
- data/ext/itsi_acme/src/caches/boxed.rs +80 -0
- data/ext/itsi_acme/src/caches/composite.rs +69 -0
- data/ext/itsi_acme/src/caches/dir.rs +106 -0
- data/ext/itsi_acme/src/caches/mod.rs +11 -0
- data/ext/itsi_acme/src/caches/no.rs +78 -0
- data/ext/itsi_acme/src/caches/test.rs +136 -0
- data/ext/itsi_acme/src/config.rs +172 -0
- data/ext/itsi_acme/src/https_helper.rs +69 -0
- data/ext/itsi_acme/src/incoming.rs +142 -0
- data/ext/itsi_acme/src/jose.rs +161 -0
- data/ext/itsi_acme/src/lib.rs +142 -0
- data/ext/itsi_acme/src/resolver.rs +59 -0
- data/ext/itsi_acme/src/state.rs +424 -0
- data/ext/itsi_error/Cargo.lock +368 -0
- data/ext/itsi_error/Cargo.toml +12 -0
- data/ext/itsi_error/src/lib.rs +140 -0
- data/ext/itsi_instrument_entry/Cargo.toml +15 -0
- data/ext/itsi_instrument_entry/src/lib.rs +31 -0
- data/ext/itsi_rb_helpers/Cargo.lock +355 -0
- data/ext/itsi_rb_helpers/Cargo.toml +11 -0
- data/ext/itsi_rb_helpers/src/heap_value.rs +139 -0
- data/ext/itsi_rb_helpers/src/lib.rs +232 -0
- data/ext/itsi_scheduler/Cargo.toml +24 -0
- data/ext/itsi_scheduler/src/itsi_scheduler/io_helpers.rs +56 -0
- data/ext/itsi_scheduler/src/itsi_scheduler/io_waiter.rs +44 -0
- data/ext/itsi_scheduler/src/itsi_scheduler/timer.rs +44 -0
- data/ext/itsi_scheduler/src/itsi_scheduler.rs +320 -0
- data/ext/itsi_scheduler/src/lib.rs +39 -0
- data/ext/itsi_server/Cargo.lock +2956 -0
- data/ext/itsi_server/Cargo.toml +94 -0
- data/ext/itsi_server/extconf.rb +11 -0
- data/ext/itsi_server/src/default_responses/html/401.html +68 -0
- data/ext/itsi_server/src/default_responses/html/403.html +68 -0
- data/ext/itsi_server/src/default_responses/html/404.html +68 -0
- data/ext/itsi_server/src/default_responses/html/413.html +71 -0
- data/ext/itsi_server/src/default_responses/html/429.html +68 -0
- data/ext/itsi_server/src/default_responses/html/500.html +71 -0
- data/ext/itsi_server/src/default_responses/html/502.html +71 -0
- data/ext/itsi_server/src/default_responses/html/503.html +68 -0
- data/ext/itsi_server/src/default_responses/html/504.html +69 -0
- data/ext/itsi_server/src/default_responses/html/index.html +238 -0
- data/ext/itsi_server/src/default_responses/json/401.json +6 -0
- data/ext/itsi_server/src/default_responses/json/403.json +6 -0
- data/ext/itsi_server/src/default_responses/json/404.json +6 -0
- data/ext/itsi_server/src/default_responses/json/413.json +6 -0
- data/ext/itsi_server/src/default_responses/json/429.json +6 -0
- data/ext/itsi_server/src/default_responses/json/500.json +6 -0
- data/ext/itsi_server/src/default_responses/json/502.json +6 -0
- data/ext/itsi_server/src/default_responses/json/503.json +6 -0
- data/ext/itsi_server/src/default_responses/json/504.json +6 -0
- data/ext/itsi_server/src/default_responses/mod.rs +14 -0
- data/ext/itsi_server/src/env.rs +43 -0
- data/ext/itsi_server/src/lib.rs +154 -0
- data/ext/itsi_server/src/prelude.rs +2 -0
- data/ext/itsi_server/src/ruby_types/itsi_body_proxy/big_bytes.rs +116 -0
- data/ext/itsi_server/src/ruby_types/itsi_body_proxy/mod.rs +149 -0
- data/ext/itsi_server/src/ruby_types/itsi_grpc_call.rs +346 -0
- data/ext/itsi_server/src/ruby_types/itsi_grpc_response_stream/mod.rs +265 -0
- data/ext/itsi_server/src/ruby_types/itsi_http_request.rs +399 -0
- data/ext/itsi_server/src/ruby_types/itsi_http_response.rs +447 -0
- data/ext/itsi_server/src/ruby_types/itsi_server/file_watcher.rs +545 -0
- data/ext/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +650 -0
- data/ext/itsi_server/src/ruby_types/itsi_server.rs +102 -0
- data/ext/itsi_server/src/ruby_types/mod.rs +48 -0
- data/ext/itsi_server/src/server/binds/bind.rs +204 -0
- data/ext/itsi_server/src/server/binds/bind_protocol.rs +37 -0
- data/ext/itsi_server/src/server/binds/listener.rs +485 -0
- data/ext/itsi_server/src/server/binds/mod.rs +4 -0
- data/ext/itsi_server/src/server/binds/tls/locked_dir_cache.rs +132 -0
- data/ext/itsi_server/src/server/binds/tls.rs +278 -0
- data/ext/itsi_server/src/server/byte_frame.rs +32 -0
- data/ext/itsi_server/src/server/frame_stream.rs +143 -0
- data/ext/itsi_server/src/server/http_message_types.rs +230 -0
- data/ext/itsi_server/src/server/io_stream.rs +128 -0
- data/ext/itsi_server/src/server/lifecycle_event.rs +12 -0
- data/ext/itsi_server/src/server/middleware_stack/middleware.rs +170 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/allow_list.rs +63 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_api_key.rs +94 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_basic.rs +93 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_jwt.rs +343 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/cache_control.rs +151 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/compression.rs +329 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/cors.rs +300 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/csp.rs +193 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/deny_list.rs +64 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/error_response/default_responses.rs +188 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/error_response.rs +168 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/etag.rs +183 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/header_interpretation.rs +82 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/intrusion_protection.rs +209 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/log_requests.rs +133 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/max_body.rs +47 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/mod.rs +122 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/proxy.rs +407 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/rate_limit.rs +155 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/redirect.rs +54 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/request_headers.rs +54 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/response_headers.rs +51 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/ruby_app.rs +138 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs +269 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/static_response.rs +62 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/string_rewrite.rs +218 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/token_source.rs +31 -0
- data/ext/itsi_server/src/server/middleware_stack/mod.rs +381 -0
- data/ext/itsi_server/src/server/mod.rs +14 -0
- data/ext/itsi_server/src/server/process_worker.rs +247 -0
- data/ext/itsi_server/src/server/redirect_type.rs +26 -0
- data/ext/itsi_server/src/server/request_job.rs +11 -0
- data/ext/itsi_server/src/server/serve_strategy/acceptor.rs +100 -0
- data/ext/itsi_server/src/server/serve_strategy/cluster_mode.rs +411 -0
- data/ext/itsi_server/src/server/serve_strategy/mod.rs +31 -0
- data/ext/itsi_server/src/server/serve_strategy/single_mode.rs +449 -0
- data/ext/itsi_server/src/server/signal.rs +129 -0
- data/ext/itsi_server/src/server/size_limited_incoming.rs +107 -0
- data/ext/itsi_server/src/server/thread_worker.rs +504 -0
- data/ext/itsi_server/src/services/cache_store.rs +74 -0
- data/ext/itsi_server/src/services/itsi_http_service.rs +270 -0
- data/ext/itsi_server/src/services/mime_types.rs +2896 -0
- data/ext/itsi_server/src/services/mod.rs +6 -0
- data/ext/itsi_server/src/services/password_hasher.rs +89 -0
- data/ext/itsi_server/src/services/rate_limiter.rs +609 -0
- data/ext/itsi_server/src/services/static_file_server.rs +1400 -0
- data/ext/itsi_tracing/Cargo.lock +274 -0
- data/ext/itsi_tracing/Cargo.toml +17 -0
- data/ext/itsi_tracing/src/lib.rs +370 -0
- data/lib/itsi/http_request/response_status_shortcodes.rb +76 -0
- data/lib/itsi/http_request.rb +228 -0
- data/lib/itsi/http_response.rb +49 -0
- data/lib/itsi/passfile.rb +108 -0
- data/lib/itsi/rack_env_pool.rb +49 -0
- data/lib/itsi/server/3.1/itsi_server.so +0 -0
- data/lib/itsi/server/3.2/itsi_server.so +0 -0
- data/lib/itsi/server/3.3/itsi_server.so +0 -0
- data/lib/itsi/server/3.4/itsi_server.so +0 -0
- data/lib/itsi/server/4.0/itsi_server.so +0 -0
- data/lib/itsi/server/config/config_helpers.rb +116 -0
- data/lib/itsi/server/config/dsl.rb +208 -0
- data/lib/itsi/server/config/known_paths/KitchensinkDirectories.txt +2346 -0
- data/lib/itsi/server/config/known_paths/Randomfiles.txt +24 -0
- data/lib/itsi/server/config/known_paths/UnixDotfiles.txt +52 -0
- data/lib/itsi/server/config/known_paths/backdoors/ASP_CommonBackdoors.txt +29 -0
- data/lib/itsi/server/config/known_paths/backdoors/bot_control_panels.txt +1668 -0
- data/lib/itsi/server/config/known_paths/backdoors/shells.txt +1167 -0
- data/lib/itsi/server/config/known_paths/cgi/CGI_HTTP_POST.txt +7 -0
- data/lib/itsi/server/config/known_paths/cgi/CGI_HTTP_POST_Windows.txt +6 -0
- data/lib/itsi/server/config/known_paths/cgi/CGI_Microsoft.txt +79 -0
- data/lib/itsi/server/config/known_paths/cgi/CGI_XPlatform.txt +3948 -0
- data/lib/itsi/server/config/known_paths/cms/README.md +5 -0
- data/lib/itsi/server/config/known_paths/cms/drupal_plugins.txt +6320 -0
- data/lib/itsi/server/config/known_paths/cms/drupal_themes.txt +828 -0
- data/lib/itsi/server/config/known_paths/cms/joomla_plugins.txt +224 -0
- data/lib/itsi/server/config/known_paths/cms/joomla_themes.txt +30 -0
- data/lib/itsi/server/config/known_paths/cms/php-nuke.txt +2142 -0
- data/lib/itsi/server/config/known_paths/cms/wordpress.txt +1566 -0
- data/lib/itsi/server/config/known_paths/cms/wp_common_theme_files.txt +46 -0
- data/lib/itsi/server/config/known_paths/cms/wp_plugins.txt +13366 -0
- data/lib/itsi/server/config/known_paths/cms/wp_plugins_full.txt +68662 -0
- data/lib/itsi/server/config/known_paths/cms/wp_plugins_top225.txt +225 -0
- data/lib/itsi/server/config/known_paths/cms/wp_themes.readme +12 -0
- data/lib/itsi/server/config/known_paths/cms/wp_themes.txt +7336 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/3CharExtBrute.txt +17576 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/CommonWebExtensions.txt +80 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Backup.txt +14 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Common.txt +865 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Compressed.txt +186 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Mostcommon.txt +30 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Skipfish.txt +93 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/WordlistSkipfish.txt +1918 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/copy_of.txt +8 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-directories-lowercase.txt +56180 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-directories.txt +62290 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-extensions-lowercase.txt +2367 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-extensions.txt +2450 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-files-lowercase.txt +35323 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-files.txt +37037 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-words-lowercase.txt +107982 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-words.txt +119600 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-directories-lowercase.txt +26593 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-directories.txt +30009 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-extensions-lowercase.txt +1233 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-extensions.txt +1289 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-files-lowercase.txt +16243 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-files.txt +17128 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-words-lowercase.txt +56293 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-words.txt +63087 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-directories-lowercase.txt +17776 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-directories.txt +20122 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-extensions-lowercase.txt +914 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-extensions.txt +963 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-files-lowercase.txt +10848 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-files.txt +11424 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-words-lowercase.txt +38267 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-words.txt +43003 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/spanish.txt +445 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/test_demo.txt +36 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/upload_variants.txt +44 -0
- data/lib/itsi/server/config/known_paths/login-file-locations/Logins.txt +71 -0
- data/lib/itsi/server/config/known_paths/login-file-locations/cfm.txt +294 -0
- data/lib/itsi/server/config/known_paths/login-file-locations/html.txt +295 -0
- data/lib/itsi/server/config/known_paths/login-file-locations/jsp.txt +294 -0
- data/lib/itsi/server/config/known_paths/login-file-locations/php.txt +294 -0
- data/lib/itsi/server/config/known_paths/login-file-locations/windows-asp.txt +294 -0
- data/lib/itsi/server/config/known_paths/login-file-locations/windows-aspx.txt +294 -0
- data/lib/itsi/server/config/known_paths/password-file-locations/Passwords.txt +47 -0
- data/lib/itsi/server/config/known_paths/php/PHP.txt +30 -0
- data/lib/itsi/server/config/known_paths/php/PHP_CommonBackdoors.txt +5 -0
- data/lib/itsi/server/config/known_paths/proxy-conf.txt +31 -0
- data/lib/itsi/server/config/known_paths/tftp.txt +79 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/ADFS.txt +86 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/AdobeXML.txt +16 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/Apache.txt +101 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/ApacheTomcat.txt +47 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/Apache_Axis.txt +16 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/ColdFusion.txt +111 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/FatwireCMS.txt +390 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/Frontpage.txt +38 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/HP_System_Mgmt_Homepage.txt +239 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/HTTP_POST_Microsoft.txt +2 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/Hyperion.txt +578 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/IIS.txt +187 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/JBoss.txt +5 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/JRun.txt +13 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/JavaServlets_Common.txt +3 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/Joomla_exploitable.txt +1937 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/LotusNotes.txt +206 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/Netware.txt +18 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/Oracle9i.txt +60 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/OracleAppServer.txt +192 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/README.md +6 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/Ruby_Rails.txt +121 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/SAP.txt +463 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/Sharepoint.txt +1707 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/SiteMinder.txt +19 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/SunAppServerGlassfish.txt +51 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/SuniPlanet.txt +35 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/Vignette.txt +73 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/Weblogic.txt +160 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/Websphere.txt +366 -0
- data/lib/itsi/server/config/known_paths/wellknown-rfc5785.txt +30 -0
- data/lib/itsi/server/config/known_paths.rb +24 -0
- data/lib/itsi/server/config/middleware/_index.md +56 -0
- data/lib/itsi/server/config/middleware/allow_list.md +46 -0
- data/lib/itsi/server/config/middleware/allow_list.rb +42 -0
- data/lib/itsi/server/config/middleware/auth_api_key.md +90 -0
- data/lib/itsi/server/config/middleware/auth_api_key.rb +51 -0
- data/lib/itsi/server/config/middleware/auth_basic.md +45 -0
- data/lib/itsi/server/config/middleware/auth_basic.rb +46 -0
- data/lib/itsi/server/config/middleware/auth_jwt.md +82 -0
- data/lib/itsi/server/config/middleware/auth_jwt.rb +38 -0
- data/lib/itsi/server/config/middleware/cache_control.md +78 -0
- data/lib/itsi/server/config/middleware/cache_control.rb +45 -0
- data/lib/itsi/server/config/middleware/cidr_to_regex.rb +50 -0
- data/lib/itsi/server/config/middleware/compression.md +50 -0
- data/lib/itsi/server/config/middleware/compression.rb +37 -0
- data/lib/itsi/server/config/middleware/cors.md +93 -0
- data/lib/itsi/server/config/middleware/cors.rb +32 -0
- data/lib/itsi/server/config/middleware/csp.md +37 -0
- data/lib/itsi/server/config/middleware/csp.rb +44 -0
- data/lib/itsi/server/config/middleware/deny_list.md +45 -0
- data/lib/itsi/server/config/middleware/deny_list.rb +42 -0
- data/lib/itsi/server/config/middleware/endpoint/_index.md +160 -0
- data/lib/itsi/server/config/middleware/endpoint/controller.md +186 -0
- data/lib/itsi/server/config/middleware/endpoint/controller.rb +33 -0
- data/lib/itsi/server/config/middleware/endpoint/delete.md +12 -0
- data/lib/itsi/server/config/middleware/endpoint/delete.rb +43 -0
- data/lib/itsi/server/config/middleware/endpoint/endpoint.rb +106 -0
- data/lib/itsi/server/config/middleware/endpoint/get.md +12 -0
- data/lib/itsi/server/config/middleware/endpoint/get.rb +43 -0
- data/lib/itsi/server/config/middleware/endpoint/http_request.md +44 -0
- data/lib/itsi/server/config/middleware/endpoint/http_response.md +39 -0
- data/lib/itsi/server/config/middleware/endpoint/patch.md +12 -0
- data/lib/itsi/server/config/middleware/endpoint/patch.rb +43 -0
- data/lib/itsi/server/config/middleware/endpoint/post.md +12 -0
- data/lib/itsi/server/config/middleware/endpoint/post.rb +43 -0
- data/lib/itsi/server/config/middleware/endpoint/put.md +12 -0
- data/lib/itsi/server/config/middleware/endpoint/put.rb +43 -0
- data/lib/itsi/server/config/middleware/endpoint/schemas.md +122 -0
- data/lib/itsi/server/config/middleware/error_response.md +74 -0
- data/lib/itsi/server/config/middleware/error_response.rb +36 -0
- data/lib/itsi/server/config/middleware/etag.md +55 -0
- data/lib/itsi/server/config/middleware/etag.rb +25 -0
- data/lib/itsi/server/config/middleware/grpc.md +170 -0
- data/lib/itsi/server/config/middleware/grpc.rb +54 -0
- data/lib/itsi/server/config/middleware/intrusion_protection.md +124 -0
- data/lib/itsi/server/config/middleware/intrusion_protection.rb +61 -0
- data/lib/itsi/server/config/middleware/location.md +107 -0
- data/lib/itsi/server/config/middleware/location.rb +103 -0
- data/lib/itsi/server/config/middleware/log_requests.md +67 -0
- data/lib/itsi/server/config/middleware/log_requests.rb +31 -0
- data/lib/itsi/server/config/middleware/max_body.md +18 -0
- data/lib/itsi/server/config/middleware/max_body.rb +21 -0
- data/lib/itsi/server/config/middleware/proxy.md +62 -0
- data/lib/itsi/server/config/middleware/proxy.rb +42 -0
- data/lib/itsi/server/config/middleware/rackup_file.md +72 -0
- data/lib/itsi/server/config/middleware/rackup_file.rb +43 -0
- data/lib/itsi/server/config/middleware/rate_limit.md +126 -0
- data/lib/itsi/server/config/middleware/rate_limit.rb +34 -0
- data/lib/itsi/server/config/middleware/rate_limit_store.rb +25 -0
- data/lib/itsi/server/config/middleware/redirect.md +55 -0
- data/lib/itsi/server/config/middleware/redirect.rb +25 -0
- data/lib/itsi/server/config/middleware/request_headers.md +34 -0
- data/lib/itsi/server/config/middleware/request_headers.rb +24 -0
- data/lib/itsi/server/config/middleware/response_headers.md +33 -0
- data/lib/itsi/server/config/middleware/response_headers.rb +25 -0
- data/lib/itsi/server/config/middleware/run.md +79 -0
- data/lib/itsi/server/config/middleware/run.rb +45 -0
- data/lib/itsi/server/config/middleware/static_assets.md +113 -0
- data/lib/itsi/server/config/middleware/static_assets.rb +99 -0
- data/lib/itsi/server/config/middleware/static_response.md +44 -0
- data/lib/itsi/server/config/middleware/static_response.rb +30 -0
- data/lib/itsi/server/config/middleware/string_rewrite.md +81 -0
- data/lib/itsi/server/config/middleware/token_source.rb +32 -0
- data/lib/itsi/server/config/middleware.rb +13 -0
- data/lib/itsi/server/config/option.rb +13 -0
- data/lib/itsi/server/config/options/_index.md +41 -0
- data/lib/itsi/server/config/options/auto_reload_config.md +13 -0
- data/lib/itsi/server/config/options/auto_reload_config.rb +46 -0
- data/lib/itsi/server/config/options/bind.md +71 -0
- data/lib/itsi/server/config/options/bind.rb +26 -0
- data/lib/itsi/server/config/options/certificates.md +65 -0
- data/lib/itsi/server/config/options/daemonize.md +14 -0
- data/lib/itsi/server/config/options/daemonize.rb +19 -0
- data/lib/itsi/server/config/options/fiber_scheduler.md +34 -0
- data/lib/itsi/server/config/options/fiber_scheduler.rb +21 -0
- data/lib/itsi/server/config/options/header_read_timeout.md +17 -0
- data/lib/itsi/server/config/options/header_read_timeout.rb +19 -0
- data/lib/itsi/server/config/options/hooks/_index.md +11 -0
- data/lib/itsi/server/config/options/hooks/after_fork.md +13 -0
- data/lib/itsi/server/config/options/hooks/after_fork.rb +28 -0
- data/lib/itsi/server/config/options/hooks/after_memory_limit_reached.md +14 -0
- data/lib/itsi/server/config/options/hooks/after_memory_limit_reached.rb +28 -0
- data/lib/itsi/server/config/options/hooks/after_start.md +12 -0
- data/lib/itsi/server/config/options/hooks/after_start.rb +28 -0
- data/lib/itsi/server/config/options/hooks/before_fork.md +13 -0
- data/lib/itsi/server/config/options/hooks/before_fork.rb +28 -0
- data/lib/itsi/server/config/options/hooks/before_restart.md +12 -0
- data/lib/itsi/server/config/options/hooks/before_restart.rb +28 -0
- data/lib/itsi/server/config/options/hooks/before_shutdown.md +12 -0
- data/lib/itsi/server/config/options/hooks/before_shutdown.rb +28 -0
- data/lib/itsi/server/config/options/include.md +21 -0
- data/lib/itsi/server/config/options/include.rb +41 -0
- data/lib/itsi/server/config/options/listen_backlog.md +11 -0
- data/lib/itsi/server/config/options/listen_backlog.rb +19 -0
- data/lib/itsi/server/config/options/log_format.md +18 -0
- data/lib/itsi/server/config/options/log_format.rb +19 -0
- data/lib/itsi/server/config/options/log_level.md +34 -0
- data/lib/itsi/server/config/options/log_level.rb +20 -0
- data/lib/itsi/server/config/options/log_target.md +38 -0
- data/lib/itsi/server/config/options/log_target.rb +19 -0
- data/lib/itsi/server/config/options/log_target_filters.md +17 -0
- data/lib/itsi/server/config/options/log_target_filters.rb +19 -0
- data/lib/itsi/server/config/options/multithreaded_reactor.md +27 -0
- data/lib/itsi/server/config/options/multithreaded_reactor.rb +24 -0
- data/lib/itsi/server/config/options/nodelay.md +16 -0
- data/lib/itsi/server/config/options/nodelay.rb +19 -0
- data/lib/itsi/server/config/options/oob_gc_responses_threshold.md +19 -0
- data/lib/itsi/server/config/options/oob_gc_responses_threshold.rb +18 -0
- data/lib/itsi/server/config/options/pin_worker_cores.md +17 -0
- data/lib/itsi/server/config/options/pin_worker_cores.rb +19 -0
- data/lib/itsi/server/config/options/pipeline_flush.md +16 -0
- data/lib/itsi/server/config/options/pipeline_flush.rb +19 -0
- data/lib/itsi/server/config/options/preload.md +21 -0
- data/lib/itsi/server/config/options/preload.rb +18 -0
- data/lib/itsi/server/config/options/recv_buffer_size.md +15 -0
- data/lib/itsi/server/config/options/recv_buffer_size.rb +19 -0
- data/lib/itsi/server/config/options/redirect_http_to_https.md +21 -0
- data/lib/itsi/server/config/options/redirect_http_to_https.rb +30 -0
- data/lib/itsi/server/config/options/request_timeout.md +23 -0
- data/lib/itsi/server/config/options/request_timeout.rb +19 -0
- data/lib/itsi/server/config/options/reuse_address.md +18 -0
- data/lib/itsi/server/config/options/reuse_address.rb +19 -0
- data/lib/itsi/server/config/options/reuse_port.md +18 -0
- data/lib/itsi/server/config/options/reuse_port.rb +17 -0
- data/lib/itsi/server/config/options/ruby_thread_request_backlog_size.md +18 -0
- data/lib/itsi/server/config/options/ruby_thread_request_backlog_size.rb +19 -0
- data/lib/itsi/server/config/options/scheduler_threads.md +41 -0
- data/lib/itsi/server/config/options/scheduler_threads.rb +17 -0
- data/lib/itsi/server/config/options/send_buffer_size.md +15 -0
- data/lib/itsi/server/config/options/send_buffer_size.rb +19 -0
- data/lib/itsi/server/config/options/shutdown_timeout.md +17 -0
- data/lib/itsi/server/config/options/shutdown_timeout.rb +19 -0
- data/lib/itsi/server/config/options/stream_body.md +32 -0
- data/lib/itsi/server/config/options/stream_body.rb +18 -0
- data/lib/itsi/server/config/options/threads.md +44 -0
- data/lib/itsi/server/config/options/threads.rb +17 -0
- data/lib/itsi/server/config/options/watch.md +16 -0
- data/lib/itsi/server/config/options/watch.rb +28 -0
- data/lib/itsi/server/config/options/worker_memory_limit.md +22 -0
- data/lib/itsi/server/config/options/worker_memory_limit.rb +18 -0
- data/lib/itsi/server/config/options/workers.md +42 -0
- data/lib/itsi/server/config/options/workers.rb +17 -0
- data/lib/itsi/server/config/options/writev.md +25 -0
- data/lib/itsi/server/config/options/writev.rb +19 -0
- data/lib/itsi/server/config/typed_struct.rb +239 -0
- data/lib/itsi/server/config.rb +321 -0
- data/lib/itsi/server/default_app/default_app.rb +34 -0
- data/lib/itsi/server/default_app/index.html +115 -0
- data/lib/itsi/server/default_config/Itsi.rb +108 -0
- data/lib/itsi/server/grpc/grpc_call.rb +247 -0
- data/lib/itsi/server/grpc/grpc_interface.rb +106 -0
- data/lib/itsi/server/grpc/reflection/v1/reflection_pb.rb +26 -0
- data/lib/itsi/server/grpc/reflection/v1/reflection_services_pb.rb +122 -0
- data/lib/itsi/server/native_extension.rb +34 -0
- data/lib/itsi/server/rack/handler/itsi.rb +29 -0
- data/lib/itsi/server/rack_interface.rb +109 -0
- data/lib/itsi/server/route_tester.rb +159 -0
- data/lib/itsi/server/scheduler_interface.rb +23 -0
- data/lib/itsi/server/scheduler_mode.rb +10 -0
- data/lib/itsi/server/signal_trap.rb +33 -0
- data/lib/itsi/server/typed_handlers/param_parser.rb +221 -0
- data/lib/itsi/server/typed_handlers/source_parser.rb +58 -0
- data/lib/itsi/server/typed_handlers.rb +25 -0
- data/lib/itsi/server/version.rb +7 -0
- data/lib/itsi/server.rb +288 -0
- data/lib/itsi/standard_headers.rb +86 -0
- data/lib/ruby_lsp/itsi/addon.rb +128 -0
- data/lib/shell_completions/completions.rb +26 -0
- data/vendor/rb-sys-build/.cargo-ok +1 -0
- data/vendor/rb-sys-build/.cargo_vcs_info.json +6 -0
- data/vendor/rb-sys-build/Cargo.lock +294 -0
- data/vendor/rb-sys-build/Cargo.toml +71 -0
- data/vendor/rb-sys-build/Cargo.toml.orig +32 -0
- data/vendor/rb-sys-build/LICENSE-APACHE +190 -0
- data/vendor/rb-sys-build/LICENSE-MIT +21 -0
- data/vendor/rb-sys-build/src/bindings/sanitizer.rs +185 -0
- data/vendor/rb-sys-build/src/bindings/stable_api.rs +247 -0
- data/vendor/rb-sys-build/src/bindings/wrapper.h +71 -0
- data/vendor/rb-sys-build/src/bindings.rs +280 -0
- data/vendor/rb-sys-build/src/cc.rs +421 -0
- data/vendor/rb-sys-build/src/lib.rs +12 -0
- data/vendor/rb-sys-build/src/rb_config/flags.rs +101 -0
- data/vendor/rb-sys-build/src/rb_config/library.rs +132 -0
- data/vendor/rb-sys-build/src/rb_config/search_path.rs +57 -0
- data/vendor/rb-sys-build/src/rb_config.rs +906 -0
- data/vendor/rb-sys-build/src/utils.rs +53 -0
- metadata +569 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Send Buffer Size
|
|
3
|
+
url: /options/send_buffer_size
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Configures the size of the send buffer for the socket. Larger buffer sizes can improve performance for high-throughput applications but may increase memory usage. The default value is 262,144 bytes.
|
|
7
|
+
|
|
8
|
+
## Configuration
|
|
9
|
+
```ruby {filename=Itsi.rb}
|
|
10
|
+
send_buffer_size 262_144
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
```ruby {filename=Itsi.rb}
|
|
14
|
+
send_buffer_size 1_048_576
|
|
15
|
+
```
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Itsi
|
|
2
|
+
class Server
|
|
3
|
+
module Config
|
|
4
|
+
class SendBufferSize < Option
|
|
5
|
+
|
|
6
|
+
insert_text <<~SNIPPET
|
|
7
|
+
send_buffer_size ${1|262_144,1_048_576|}
|
|
8
|
+
SNIPPET
|
|
9
|
+
|
|
10
|
+
detail "Specifies the size of the send buffer for the socket. Larger buffer sizes can improve performance for high-throughput applications but may increase memory usage. The default value is 262,144 bytes."
|
|
11
|
+
|
|
12
|
+
schema do
|
|
13
|
+
(Type(Integer) & Range(1..Float::INFINITY) & Required()).default(262_144)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Shutdown Timeout
|
|
3
|
+
url: /options/shutdown_timeout
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Sets the timeout for graceful shutdown of the server. Itsi will stop accepting new connections immediately after receiving a shutdown signal. Existing connections will be allowed to complete their requests within the specified timeout. Any connections that do not complete within the timeout will be forcefully closed.
|
|
7
|
+
|
|
8
|
+
### Default
|
|
9
|
+
|
|
10
|
+
```ruby {filename=Itsi.rb}
|
|
11
|
+
shutdown_timeout 5.0 # 5 seconds
|
|
12
|
+
```
|
|
13
|
+
### Example
|
|
14
|
+
|
|
15
|
+
```ruby {filename=Itsi.rb}
|
|
16
|
+
shutdown_timeout 20.0 # 20 seconds
|
|
17
|
+
```
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Itsi
|
|
2
|
+
class Server
|
|
3
|
+
module Config
|
|
4
|
+
class PinWorkerCores < Option
|
|
5
|
+
|
|
6
|
+
insert_text <<~SNIPPET
|
|
7
|
+
pin_worker_cores ${1|true,false|} # Configure whether worker processes should attempt to pin to a single CPU core.
|
|
8
|
+
SNIPPET
|
|
9
|
+
|
|
10
|
+
detail "Configure whether worker processes should attempt to pin to a single CPU core"
|
|
11
|
+
|
|
12
|
+
schema do
|
|
13
|
+
(Bool() & Required()).default(true) # Default 5 seconds
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Stream Body
|
|
3
|
+
url: /options/stream_body
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
The **stream_body** option controls whether Itsi buffers the request body in memory before passing it to your application code. Several Rack applications rely on this behaviour (so that the request can be rewound and/or parsed in its entirety before being processed), for this reason the default behaviour is `true`.
|
|
7
|
+
However for light-weight requests that benefit from not holding the entire request body in memory, you can set this option to `false`.
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
{{< callout >}}
|
|
11
|
+
To prevent excessive memory usage, Itsi will store any large buffered request bodies in temporary storage on the file-system when request body streaming is disabled.
|
|
12
|
+
{{< /callout >}}
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
Streaming bodies cooperate particularly well with [Fiber scheduler](/options/fiber_scheduler) mode, to allow you to process many large and long-running incoming data streams simultaneously. For this use case, be sure to adjust both [max_body](/options/max_body) and [request_timeout](/options/request_timeout) to ensure large incoming requests are not terminated prematurely.
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
## Configuration File
|
|
21
|
+
|
|
22
|
+
```ruby
|
|
23
|
+
# Disable streaming the request body
|
|
24
|
+
stream_body false
|
|
25
|
+
|
|
26
|
+
# Enable streaming the request body
|
|
27
|
+
stream_body true
|
|
28
|
+
post("/test_stream") do |req|
|
|
29
|
+
# req.body is an IO
|
|
30
|
+
first_five_bytes = req.body.read(5)
|
|
31
|
+
end
|
|
32
|
+
```
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Itsi
|
|
2
|
+
class Server
|
|
3
|
+
module Config
|
|
4
|
+
class StreamBody < Option
|
|
5
|
+
|
|
6
|
+
insert_text <<~SNIPPET
|
|
7
|
+
stream_body ${1|true,false|}
|
|
8
|
+
SNIPPET
|
|
9
|
+
|
|
10
|
+
detail "Configures whether request bodies should be completed buffered *before* they are forwarded to the application."
|
|
11
|
+
|
|
12
|
+
schema do
|
|
13
|
+
Or(Bool(), Type(Symbol)).default(false)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Threads
|
|
3
|
+
url: /options/threads
|
|
4
|
+
---
|
|
5
|
+
Itsi supports running in threaded mode. Spawning more than one thread per worker is helpful for applications that require high concurrency and low latency.
|
|
6
|
+
|
|
7
|
+
Note, that while threading allows for concurrent execution of tasks, it also introduces additional overhead due to context switching between threads.
|
|
8
|
+
This overhead can be significant, especially when dealing with a large number of concurrent tasks.
|
|
9
|
+
To minimize this overhead, it's recommended to keep the number of threads low, and tune this parameter based on your specific use case.
|
|
10
|
+
|
|
11
|
+
When running Itsi in blocking mode, the total number of concurrent requests will be equal to `workers` x `threads`
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
{{< callout >}}
|
|
15
|
+
If you enable a [fiber_scheduler](/options/fiber_scheduler), the threads will be non-blocking, unless you are using both [threads](/options/threads) and [scheduler_threads](/options/scheduler_threads) **together**.
|
|
16
|
+
{{< /callout >}}
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
## Configuration File
|
|
20
|
+
The number of threads to use can be specified inside the configuration file (usually `./Itsi.rb` at the project root)
|
|
21
|
+
using the `threads` function.
|
|
22
|
+
|
|
23
|
+
## Examples
|
|
24
|
+
```ruby {filename="Itsi.rb"}
|
|
25
|
+
# Starts each worker with a single thread
|
|
26
|
+
threads 1
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
```ruby {filename="Itsi.rb"}
|
|
30
|
+
# Each worker will start 4 threads
|
|
31
|
+
threads 4
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Threads increase concurrency at the expense of memory usage and CPU overhead.
|
|
35
|
+
For IO heavy workloads, consider using [non-blocking mode](/options/fiber_scheduler) instead, which can achieve higher concurrency with fewer threads.
|
|
36
|
+
Non-blocking mode and threads can be used simultaneously in a hybrid configuration.
|
|
37
|
+
|
|
38
|
+
## Command Line
|
|
39
|
+
You can also override the number of threads using either the `-t` or `--threads` command line option.
|
|
40
|
+
E.g.
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
itsi -t 3
|
|
44
|
+
```
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module Itsi
|
|
2
|
+
class Server
|
|
3
|
+
module Config
|
|
4
|
+
class Threads < Option
|
|
5
|
+
|
|
6
|
+
insert_text "threads ${1|1,2,Etc.nprocessors|} # Number of threads to run per worker"
|
|
7
|
+
|
|
8
|
+
detail "Number of threads to run per worker"
|
|
9
|
+
|
|
10
|
+
schema do
|
|
11
|
+
Range(1..255)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Watch
|
|
3
|
+
url: /options/watch
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
The `watch` option uses Itsi's built-in file watching mechanism to execute a list of commands each time any file matching the path glob parameter is modified.
|
|
7
|
+
|
|
8
|
+
You can have several active watches at once.
|
|
9
|
+
|
|
10
|
+
E.g.
|
|
11
|
+
|
|
12
|
+
```ruby {filename=Itsi.rb}
|
|
13
|
+
watch 'config/*.yml', [%w[npm run build], %w[bundle exec cache:mark_dirty]]
|
|
14
|
+
|
|
15
|
+
watch 'app/**/*.rb', [%w[bundle exec itsi restart]]
|
|
16
|
+
```
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module Itsi
|
|
2
|
+
class Server
|
|
3
|
+
module Config
|
|
4
|
+
class Watch < Option
|
|
5
|
+
|
|
6
|
+
insert_text <<~SNIPPET
|
|
7
|
+
watch "${1:./**/*.rb}", [${2:%w[bundle exec itsi restart]}] # Run a command each time a watched set of files changes
|
|
8
|
+
SNIPPET
|
|
9
|
+
|
|
10
|
+
detail "Run a command each time a watched set of files changes"
|
|
11
|
+
|
|
12
|
+
def initialize(location, path, commands)
|
|
13
|
+
@path = path
|
|
14
|
+
@commands = commands
|
|
15
|
+
super(location, nil)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def build!
|
|
19
|
+
path, commands = @path, @commands
|
|
20
|
+
location.instance_eval do
|
|
21
|
+
@options[:notify_watchers] ||= []
|
|
22
|
+
@options[:notify_watchers] << [path, commands]
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Worker Memory Limit
|
|
3
|
+
url: /options/worker_memory_limit
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
The **Worker Memory Limit** option sets the maximum amount of memory a worker process can use before it is terminated. If an [`after_memory_threshold_reached`](/options/after_memory_limit_reached) hook is also set, you can define custom behaviour (e.g. an alert or exception notification) that should occur before the worker is rebooted.
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
## Configuration File
|
|
10
|
+
|
|
11
|
+
### Examples
|
|
12
|
+
|
|
13
|
+
```ruby {filename="Itsi.rb"}
|
|
14
|
+
worker_memory_limit 256 * 1024 ** 2 # 256 MB
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
```ruby {filename="Itsi.rb"}
|
|
18
|
+
worker_memory_limit 256 * 1024 ** 2 # 256 MB
|
|
19
|
+
after_memory_limit_reached do |pid|
|
|
20
|
+
send_slack_alert("Worker #{pid} exceeded memory limit")
|
|
21
|
+
end
|
|
22
|
+
```
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Itsi
|
|
2
|
+
class Server
|
|
3
|
+
module Config
|
|
4
|
+
class WorkerMemoryLimit < Option
|
|
5
|
+
|
|
6
|
+
insert_text <<~SNIPPET
|
|
7
|
+
worker_memory_limit ${1|256,512,1024,2048|} * 1024 ** 2 # Worker memory limit in bytes
|
|
8
|
+
SNIPPET
|
|
9
|
+
|
|
10
|
+
detail "Set the maximum amount of memory a worker process can use before it is terminated."
|
|
11
|
+
|
|
12
|
+
schema do
|
|
13
|
+
Type(Integer) & Required()
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Workers
|
|
3
|
+
url: /options/workers
|
|
4
|
+
next: middleware/
|
|
5
|
+
---
|
|
6
|
+
Itsi is a preforking server. It can run as either a single process (`workers 1`) or in clustered mode (`workers > 1`).
|
|
7
|
+
<br/>You can switch between the two without downtime.
|
|
8
|
+
|
|
9
|
+
## Configuration File
|
|
10
|
+
The number of workers to use can be specified inside the configuration file (usually `./Itsi.rb` at the project root)
|
|
11
|
+
using the `workers` function.
|
|
12
|
+
|
|
13
|
+
## Examples
|
|
14
|
+
|
|
15
|
+
```ruby {filename="Itsi.rb"}
|
|
16
|
+
# Starts a single worker, putting Itsi in single-process mode
|
|
17
|
+
workers 1
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
```ruby {filename="Itsi.rb"}
|
|
21
|
+
# Starts 4 workers, putting Itsi in cluster-process mode
|
|
22
|
+
workers 4
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
```ruby {filename="Itsi.rb"}
|
|
26
|
+
# Sets the number of workers to the number of CPU cores available on the system
|
|
27
|
+
workers Etc.nprocessors
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
To maximize performance, it's typical to increase number of workers
|
|
31
|
+
to be at or near the number of CPU cores available on your system.
|
|
32
|
+
|
|
33
|
+
However, note hyperthreads and efficiency cores may impact this and using every available core is not
|
|
34
|
+
always the most effective choice.
|
|
35
|
+
|
|
36
|
+
## Command Line
|
|
37
|
+
You can also override the number of workers using either the `-w` or workers `--workers` command line option.
|
|
38
|
+
E.g.
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
itsi -w 4
|
|
42
|
+
```
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module Itsi
|
|
2
|
+
class Server
|
|
3
|
+
module Config
|
|
4
|
+
class Workers < Option
|
|
5
|
+
|
|
6
|
+
insert_text "workers ${1|1,2,Etc.nprocessors|} # Number of worker processes to run"
|
|
7
|
+
|
|
8
|
+
detail "Number of worker processes to run"
|
|
9
|
+
|
|
10
|
+
schema do
|
|
11
|
+
Range(1..255)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Write Vectored
|
|
3
|
+
url: /options/writev
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Set whether HTTP/1 connections should try to use vectored writes,
|
|
7
|
+
or always flatten into a single buffer.
|
|
8
|
+
|
|
9
|
+
Note that setting this to false may mean more copies of body data,
|
|
10
|
+
but may also improve performance when an IO transport doesn't
|
|
11
|
+
support vectored writes well, such as most TLS implementations.
|
|
12
|
+
|
|
13
|
+
Setting this to true will force hyper to use queued strategy
|
|
14
|
+
which may eliminate unnecessary cloning on some TLS backends
|
|
15
|
+
|
|
16
|
+
Default is `nil` in which case hyper will try to guess which mode to use
|
|
17
|
+
|
|
18
|
+
## Configuration
|
|
19
|
+
```ruby {filename=Itsi.rb}
|
|
20
|
+
writev true
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
```ruby {filename=Itsi.rb}
|
|
24
|
+
writev false
|
|
25
|
+
```
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Itsi
|
|
2
|
+
class Server
|
|
3
|
+
module Config
|
|
4
|
+
class Writev < Option
|
|
5
|
+
|
|
6
|
+
insert_text <<~SNIPPET
|
|
7
|
+
writev ${1|true,false|}
|
|
8
|
+
SNIPPET
|
|
9
|
+
|
|
10
|
+
detail "Set whether HTTP/1 connections should try to use vectored writes"
|
|
11
|
+
|
|
12
|
+
schema do
|
|
13
|
+
(Bool() & Required()).default(false)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "date"
|
|
4
|
+
require "time"
|
|
5
|
+
|
|
6
|
+
module Itsi
|
|
7
|
+
class Server
|
|
8
|
+
module Config
|
|
9
|
+
module TypedStruct
|
|
10
|
+
VALUE = 0
|
|
11
|
+
VALIDATE = 1
|
|
12
|
+
|
|
13
|
+
def self.new(defaults = nil, &defaults_blk)
|
|
14
|
+
defaults = TypedStruct.module_eval(&defaults_blk) if defaults_blk
|
|
15
|
+
return defaults unless defaults.is_a?(Hash)
|
|
16
|
+
|
|
17
|
+
defaults.transform_values! { _1.is_a?(Validation) ? _1.default(nil) : _1 }
|
|
18
|
+
Struct.new(*defaults.keys, keyword_init: true) do
|
|
19
|
+
define_method(:initialize) do |*input, validate: true, **raw_input|
|
|
20
|
+
raise "─ Invalid input to #{self}: #{input.last}" if input.last && !input.last.is_a?(Hash)
|
|
21
|
+
|
|
22
|
+
raw_input.transform_keys! { |k| k.to_s.downcase.to_sym }
|
|
23
|
+
raw_input.merge!(input.pop.transform_keys! { |k| k.to_s.downcase.to_sym }) if input.last.is_a?(Hash)
|
|
24
|
+
|
|
25
|
+
excess_keys = raw_input.keys - defaults.keys
|
|
26
|
+
|
|
27
|
+
raise "─ Unsupported keys #{excess_keys}" if excess_keys.any?
|
|
28
|
+
|
|
29
|
+
initial_values = defaults.each_with_object({}) do |(k, default_config), inputs|
|
|
30
|
+
value = raw_input.key?(k) ? raw_input[k] : default_config[VALUE].dup
|
|
31
|
+
next inputs[k] = value unless validate
|
|
32
|
+
|
|
33
|
+
begin
|
|
34
|
+
inputs[k] = default_config[VALIDATE].validate!(value)
|
|
35
|
+
rescue StandardError => e
|
|
36
|
+
raise ArgumentError, "─ #{k}: #{e.message}"
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
super(initial_values)
|
|
41
|
+
validator = self.class.instance_eval { @validators }
|
|
42
|
+
instance_eval(&validator) if validator
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
define_singleton_method(:validate) do |&blk|
|
|
46
|
+
@validators = blk
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
defaults.each do |key, (_, validation)|
|
|
50
|
+
define_method(:"#{key}?") do
|
|
51
|
+
!!self[key]
|
|
52
|
+
end
|
|
53
|
+
define_method(:"#{key}=") do |value|
|
|
54
|
+
self[key] = validation.validate!(value)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
define_method(:[]=) do |key, value|
|
|
59
|
+
super(key, defaults[key][VALIDATE].validate!(value))
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def is_typed_struct?
|
|
63
|
+
true
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def merge_config(other)
|
|
67
|
+
self.class.new(members.map do |key|
|
|
68
|
+
value = self[key]
|
|
69
|
+
has_merged_val = (other.is_a?(Hash) ? other.key?(key) : other.member?(key))
|
|
70
|
+
next [key, value] unless has_merged_val
|
|
71
|
+
|
|
72
|
+
[
|
|
73
|
+
key,
|
|
74
|
+
TypedStruct.typed_struct?(value) ? value.merge_config(other[key]) : other[key]
|
|
75
|
+
]
|
|
76
|
+
end.to_h)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def to_h
|
|
80
|
+
super.transform_values { |v| v.respond_to?(:merge_config) ? v.to_h : v }
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def self.typed_struct?(inst)
|
|
86
|
+
inst.respond_to?(:is_typed_struct?) && inst.is_typed_struct?
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
class Validation
|
|
90
|
+
attr_reader :name, :validations
|
|
91
|
+
attr_accessor :next
|
|
92
|
+
|
|
93
|
+
def initialize(name, validations)
|
|
94
|
+
@name = name.to_s
|
|
95
|
+
@validations = Array(validations)
|
|
96
|
+
@next = nil
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def inspect
|
|
100
|
+
"#{@name}"
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def &(other)
|
|
104
|
+
tail = self
|
|
105
|
+
tail = tail.next while tail.next
|
|
106
|
+
tail.next = other
|
|
107
|
+
self
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def default(value)
|
|
111
|
+
[value, self]
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def validate!(value)
|
|
115
|
+
value = value.to_s if value.is_a?(Symbol)
|
|
116
|
+
@validations.each do |validation|
|
|
117
|
+
case validation
|
|
118
|
+
when Proc
|
|
119
|
+
validation.call(value)
|
|
120
|
+
when Array
|
|
121
|
+
unless !value || validation.include?(value)
|
|
122
|
+
raise ArgumentError,
|
|
123
|
+
"─ `#{@name}` validation failed. Invalid #{validation} value: #{value.inspect}"
|
|
124
|
+
end
|
|
125
|
+
when Range
|
|
126
|
+
unless !value || validation.include?(value)
|
|
127
|
+
raise ArgumentError,
|
|
128
|
+
"─ `#{@name}` validation failed. Invalid #{validation} value: #{value.inspect}"
|
|
129
|
+
end
|
|
130
|
+
when Regexp
|
|
131
|
+
unless !value || validation.match?(value)
|
|
132
|
+
raise ArgumentError,
|
|
133
|
+
"─ `#{@name}` validation failed. Invalid #{validation} value: #{value.inspect}"
|
|
134
|
+
end
|
|
135
|
+
when Validation
|
|
136
|
+
validation.validate!(value)
|
|
137
|
+
when Class
|
|
138
|
+
if value && !value.is_a?(validation)
|
|
139
|
+
begin
|
|
140
|
+
value = \
|
|
141
|
+
if validation.eql?(Time) then Time.parse(value.to_s)
|
|
142
|
+
elsif validation.eql?(::Date) then Date.parse(value.to_s)
|
|
143
|
+
elsif validation.eql?(Float) then Float(value)
|
|
144
|
+
elsif validation.eql?(Integer) then Integer(value)
|
|
145
|
+
elsif validation.eql?(Proc)
|
|
146
|
+
raise ArgumentError, "Invalid #{validation} value: #{value.inspect}" unless value.is_a?(Proc)
|
|
147
|
+
elsif validation.eql?(String) || validation.eql?(Symbol)
|
|
148
|
+
unless value.is_a?(String) || value.is_a?(Symbol)
|
|
149
|
+
raise ArgumentError,
|
|
150
|
+
"Invalid #{validation} value: #{value.inspect}"
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
if validation.eql?(String)
|
|
154
|
+
value.to_s
|
|
155
|
+
elsif validation.eql?(Symbol)
|
|
156
|
+
value.to_s.to_sym
|
|
157
|
+
end
|
|
158
|
+
else
|
|
159
|
+
validation.new(value)
|
|
160
|
+
end
|
|
161
|
+
rescue StandardError => e
|
|
162
|
+
raise ArgumentError,
|
|
163
|
+
"─ `#{@name}` Validation Failed. Invalid #{validation.to_s.split("::").last} value: #{value.inspect}. Failure reason: \n └─ #{e.message}"
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
if self.next
|
|
169
|
+
self.next.validate!(value)
|
|
170
|
+
else
|
|
171
|
+
value
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
{
|
|
177
|
+
Bool: Validation.new(:Bool, [[true, false]]),
|
|
178
|
+
Required: Validation.new(:Required, ->(value) { !value.nil? }),
|
|
179
|
+
Or: lambda { |*validations|
|
|
180
|
+
Validation.new(:Or, lambda { |v|
|
|
181
|
+
return true if v.nil?
|
|
182
|
+
|
|
183
|
+
errs = []
|
|
184
|
+
validations.each do |validation|
|
|
185
|
+
v = validation.validate!(v)
|
|
186
|
+
return v
|
|
187
|
+
rescue StandardError => e
|
|
188
|
+
errs << e.message
|
|
189
|
+
end
|
|
190
|
+
raise StandardError.new("─ Validation failed (None match:) \n └#{errs.join("\n └")}")
|
|
191
|
+
})
|
|
192
|
+
},
|
|
193
|
+
Range: lambda { |input_range|
|
|
194
|
+
Validation.new(:Range, [input_range])
|
|
195
|
+
},
|
|
196
|
+
Length: lambda { |input_length|
|
|
197
|
+
Validation.new(:Length, ->(value) { input_length === value.length })
|
|
198
|
+
},
|
|
199
|
+
Hash: lambda { |key_type, value_type|
|
|
200
|
+
Validation.new(:Hash, lambda { |hash|
|
|
201
|
+
return true if hash.nil?
|
|
202
|
+
raise StandardError.new("Expected hash got #{hash.class}") unless hash.is_a?(Hash)
|
|
203
|
+
|
|
204
|
+
hash.map do |k, v|
|
|
205
|
+
[
|
|
206
|
+
key_type.validate!(k),
|
|
207
|
+
value_type.validate!(v)
|
|
208
|
+
]
|
|
209
|
+
end.to_h
|
|
210
|
+
})
|
|
211
|
+
},
|
|
212
|
+
Type: ->(input_type) { Validation.new(:Type, input_type) },
|
|
213
|
+
Enum: ->(allowed_values) { Validation.new(:Enum, [allowed_values.map { |v| v.is_a?(Symbol) ? v.to_s : v }]) },
|
|
214
|
+
Array: lambda { |*value_validations|
|
|
215
|
+
Validation.new(:Array, [::Array, lambda { |value|
|
|
216
|
+
return true unless value
|
|
217
|
+
|
|
218
|
+
raise StandardError.new("Expected Array got #{value.class}") unless value.is_a?(Array)
|
|
219
|
+
|
|
220
|
+
value&.map! do |v|
|
|
221
|
+
value_validations.all? { v = _1.validate!(v) }
|
|
222
|
+
v
|
|
223
|
+
end
|
|
224
|
+
}])
|
|
225
|
+
}
|
|
226
|
+
}.each do |name, factory|
|
|
227
|
+
if factory.is_a?(Proc)
|
|
228
|
+
define_singleton_method(name, &factory)
|
|
229
|
+
define_singleton_method(name.to_s.downcase, &factory)
|
|
230
|
+
else
|
|
231
|
+
const_set(name, factory)
|
|
232
|
+
define_singleton_method(name, -> { factory.dup })
|
|
233
|
+
define_singleton_method(name.to_s.downcase, -> { factory.dup })
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
end
|
|
239
|
+
end
|