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,113 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Static Assets
|
|
3
|
+
url: /middleware/static_assets
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
The Static Assets middleware serves files from a specified root directory. It is capable of optimized delivery of static content such as HTML, CSS, JavaScript, images, as well as large assets, such as video files using streaming bodies and range requests.
|
|
7
|
+
It can auto-index directories for simple directory listings.
|
|
8
|
+
|
|
9
|
+
## Key Features
|
|
10
|
+
- **Auto Indexing**: Optionally generate directory listings when an index file is missing.
|
|
11
|
+
- **HTML Fallback**: When enabled, the middleware attempts to serve a file with a `.html` extension if the requested file is not found.
|
|
12
|
+
- **In-Memory Caching**: Files under a certain size (and up to a configurable count) are cached in memory for performance.
|
|
13
|
+
- **Custom Headers**: User-supplied headers (e.g., for caching) can be added to responses.
|
|
14
|
+
- **Relative Path Processing**: When enabled, the middleware rewrites request paths relative to a configured base path.
|
|
15
|
+
- **Partial Content**: Supports Range requests for serving partial file content.
|
|
16
|
+
|
|
17
|
+
## Example
|
|
18
|
+
|
|
19
|
+
```ruby {filename=Itsi.rb}
|
|
20
|
+
static_assets root_dir: "./"
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Directory Index
|
|
24
|
+
#### HTML
|
|
25
|
+
|
|
26
|
+
{{< card link="/" title="Static File Server" image="/directory_listing.jpg" subtitle="Static File Listing, Powered by Itsi." method="Resize" options="500x q80 webp" >}}
|
|
27
|
+
|
|
28
|
+
#### JSON
|
|
29
|
+
Directory indexes also support responding in JSON format. E.g.
|
|
30
|
+
|
|
31
|
+
`curl -H "Accept: application/json" http://0.0.0.0`
|
|
32
|
+
|
|
33
|
+
```json
|
|
34
|
+
{
|
|
35
|
+
"directory": ".",
|
|
36
|
+
"items": [
|
|
37
|
+
{
|
|
38
|
+
"is_dir": false,
|
|
39
|
+
"modified": "2025-04-22 04:21:43",
|
|
40
|
+
"name": "Gemfile",
|
|
41
|
+
"path": "Gemfile",
|
|
42
|
+
"size": "42 B"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"is_dir": false,
|
|
46
|
+
"modified": "2025-04-22 04:21:48",
|
|
47
|
+
"name": "Gemfile.lock",
|
|
48
|
+
"path": "Gemfile%2Elock",
|
|
49
|
+
"size": "463 B"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"is_dir": false,
|
|
53
|
+
"modified": "2025-04-22 02:46:45",
|
|
54
|
+
"name": "Itsi.rb",
|
|
55
|
+
"path": "Itsi%2Erb",
|
|
56
|
+
"size": "80 B"
|
|
57
|
+
}
|
|
58
|
+
],
|
|
59
|
+
"title": "Directory listing for ."
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Configuration Options
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
| Option | Description |
|
|
67
|
+
|--------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|
68
|
+
| **`root_dir`** (Default ".") | The relative or absolute disk path where static files reside. |
|
|
69
|
+
| **`not_found_behavior`** (Default `{error: "not_found"}`) | Determines what to do when a file isn’t found. See [Not Found Behavior](#not-found-behavior) below. |
|
|
70
|
+
| **`auto_index`** (Default `false`) | If <code>true</code>, directory listings are automatically generated when no index file is found. Defaults to <code>false</code>. |
|
|
71
|
+
| **`try_html_extension`** (Default `true`) | If <code>true</code>, when the requested file isn’t found, the middleware attempts to serve the same path with a <code>.html</code> extension. Defaults to <code>true</code>. |
|
|
72
|
+
| **`max_file_size_in_memory`** (Default `1048576`) | Maximum file size (in bytes) for caching files in memory. Files larger than this will be served from disk. Defaults to <code>1048576</code> (1 MB). |
|
|
73
|
+
| **`max_files_in_memory`** (Default `100`) | Maximum number of files to cache in memory. Defaults to <code>100</code>. |
|
|
74
|
+
| **`file_check_interval`** (Default `1`) | Max time (in seconds) a file stays in cache before the file-system is checked for modifications. Defaults to <code>1</code>. |
|
|
75
|
+
| **`headers`** (Default `nil`) | A hash of additional headers to include in responses (e.g. <code>{"Cache-Control" => "max-age=3600"}</code>). |
|
|
76
|
+
| **`allowed_extensions`** (Default `[]`) | An array of permitted file extensions (e.g. <code>["html", "css", "js", "png", "jpg"]</code>). If a requested file’s extension isn’t in this list, it won’t be served. An empty list (default) means all extensions are allowed. |
|
|
77
|
+
| **`relative_path`** (Default `true`) | If <code>true</code>, the effective file lookup path is computed relative to the base path at which the middleware is mounted (See [location](/middleware/location) to understand mounting options). Defaults to <code>true</code>. |
|
|
78
|
+
| **`serve_hidden_files`** (Default `false`) | If <code>false</code>, files whose names start with a dot (".") are not served. Defaults to <code>false</code>. |
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
## Not Found Behavior
|
|
82
|
+
The static assets middleware supports many configuration options when a file is not found.
|
|
83
|
+
* **`fallthrough`**: The request is *not* handled by this middleware and is instead served by the next middleware in the chain. The option is given as a string. E.g.
|
|
84
|
+
```ruby
|
|
85
|
+
error_response: "fallthrough"
|
|
86
|
+
```
|
|
87
|
+
* **`index`**: Unsatisfiable requests instead result in serving an index file. (Useful for SPAs with client-side routing).
|
|
88
|
+
```ruby
|
|
89
|
+
error_response: {index: "./path/to/index.html" }
|
|
90
|
+
```
|
|
91
|
+
* **`redirect`**: Unsatisfiable requests are redirected. Options for type are the same as defined for the [redirect](/middleware/redirect) middleware.
|
|
92
|
+
```ruby
|
|
93
|
+
error_response: {redirect: { to: "http://example.com/redirect_path", type: "permanent" }}
|
|
94
|
+
```
|
|
95
|
+
* **`error`**: Provide an overridden error response. See [`error_response`](/middleware/error_response) for details.
|
|
96
|
+
e.g.
|
|
97
|
+
```ruby
|
|
98
|
+
error_response: {error: "not_found"}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
```ruby
|
|
102
|
+
error_response: \
|
|
103
|
+
{
|
|
104
|
+
error:
|
|
105
|
+
{
|
|
106
|
+
code: 404,
|
|
107
|
+
plaintext: {inline: "File not found"},
|
|
108
|
+
json: {inline: "{\"message\": \"File not found\"}"},
|
|
109
|
+
html: {file: "./path/to/not_found.html"},
|
|
110
|
+
default: "plaintext"
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
```
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
module Itsi
|
|
2
|
+
class Server
|
|
3
|
+
module Config
|
|
4
|
+
class StaticAssets < Middleware
|
|
5
|
+
|
|
6
|
+
insert_text <<~SNIPPET
|
|
7
|
+
static_assets \\
|
|
8
|
+
root_dir: "${1|./,/var/www,|}",
|
|
9
|
+
not_found_behavior: ${2|"fallthrough",{index: "index.html"},{error: "not_found"}|},
|
|
10
|
+
auto_index: ${3|true,false|},
|
|
11
|
+
try_html_extension: ${4|true,false|},
|
|
12
|
+
max_file_size_in_memory: ${5|1048576,2097152|},
|
|
13
|
+
max_files_in_memory: ${6|100,500,1000|},
|
|
14
|
+
file_check_interval: ${7|1,60,120|},
|
|
15
|
+
headers: { ${8|,"Cache-Control" => "max-age=3600",|} },
|
|
16
|
+
allowed_extensions: ${9|%w[html css js png jpg],[]|},
|
|
17
|
+
relative_path: ${10|true,false|},
|
|
18
|
+
serve_hidden_files: ${11|true,false|}
|
|
19
|
+
SNIPPET
|
|
20
|
+
|
|
21
|
+
detail "Serves static files from a designated directory with options for auto indexing, in-memory caching, "\
|
|
22
|
+
"and custom header support. Supports relative path rewriting and file range requests."
|
|
23
|
+
|
|
24
|
+
ErrorResponse = TypedStruct.new do
|
|
25
|
+
{
|
|
26
|
+
error: Type(ErrorResponseDef) & Required()
|
|
27
|
+
}
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
IndexResponse = TypedStruct.new do
|
|
31
|
+
{
|
|
32
|
+
index: Type(String) & Required()
|
|
33
|
+
}
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
RedirectTarget = TypedStruct.new do
|
|
37
|
+
{
|
|
38
|
+
to: (Required() & Type(String)),
|
|
39
|
+
type: Enum(["permanent", "temporary", "found", "moved_permanently"]).default("moved_permanently")
|
|
40
|
+
}
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
RedirectResponse = TypedStruct.new do
|
|
44
|
+
{
|
|
45
|
+
redirect: Type(RedirectTarget) & Required()
|
|
46
|
+
}
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
schema do
|
|
50
|
+
{
|
|
51
|
+
root_dir: (Type(String) & Required()).default("./"),
|
|
52
|
+
not_found_behavior: Or(
|
|
53
|
+
Enum(%w[fallthrough index redirect internal_server_error]),
|
|
54
|
+
Type(IndexResponse),
|
|
55
|
+
Type(RedirectResponse),
|
|
56
|
+
Type(ErrorResponse)
|
|
57
|
+
).default({error: "not_found"}),
|
|
58
|
+
allowed_extensions: (Array(Type(String)) & Required()).default([]),
|
|
59
|
+
auto_index: Bool().default(false),
|
|
60
|
+
try_html_extension: Bool().default(true),
|
|
61
|
+
max_file_size_in_memory: Type(Integer).default(1048576),
|
|
62
|
+
max_files_in_memory: Type(Integer).default(100),
|
|
63
|
+
file_check_interval: Type(Integer).default(1),
|
|
64
|
+
headers: Hash(Type(String), Type(String)).default({}),
|
|
65
|
+
relative_path: Bool().default(true),
|
|
66
|
+
serve_hidden_files: Bool().default(false)
|
|
67
|
+
}
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def build!
|
|
71
|
+
root_dir = @params[:root_dir] || "."
|
|
72
|
+
|
|
73
|
+
if !File.exist?(root_dir)
|
|
74
|
+
raise "Warning: static_assets root_dir '#{root_dir}' does not exist!"
|
|
75
|
+
elsif !File.directory?(root_dir)
|
|
76
|
+
raise "Warning: static_assets root_dir '#{root_dir}' is not a directory!"
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
@params[:relative_path] = true unless @params.key?(:relative_path)
|
|
80
|
+
@params[:allowed_extensions] ||= []
|
|
81
|
+
|
|
82
|
+
if @params[:try_html_extension] && @params[:allowed_extensions].include?("html")
|
|
83
|
+
@params[:allowed_extensions] << ""
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
if @params[:allowed_extensions].any? && @params[:auto_index]
|
|
87
|
+
@params[:allowed_extensions] |= ["html"]
|
|
88
|
+
@params[:allowed_extensions] |= [""]
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
@params[:base_path] = "^(?<base_path>#{location.paths_from_parent.gsub(/\.\*\)$/,")")}).*$"
|
|
92
|
+
params = @params
|
|
93
|
+
|
|
94
|
+
location.middleware[:static_assets] = params
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Static Response
|
|
3
|
+
url: /middleware/static_response
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
The **Static Response** middleware returns a fixed HTTP response immediately, without invoking any downstream handlers. You configure the status code, headers, and body content once, and every request is answered identically.
|
|
7
|
+
|
|
8
|
+
## Key Features
|
|
9
|
+
- **Fixed Status Code**: Return any valid HTTP status (200–599).
|
|
10
|
+
- **Custom Headers**: Pre‑set arbitrary headers (e.g. Content‑Type, Cache‑Control).
|
|
11
|
+
- **Arbitrary Body**: Supply text or binary data as the response payload.
|
|
12
|
+
- **Zero Routing**: Always handles the request; bypasses your application logic entirely.
|
|
13
|
+
|
|
14
|
+
## Example Usage
|
|
15
|
+
```ruby {filename=Itsi.rb}
|
|
16
|
+
static_response \
|
|
17
|
+
code: 200,
|
|
18
|
+
headers: [
|
|
19
|
+
["Content-Type", "application/json"],
|
|
20
|
+
["Cache-Control", "max-age=60"]
|
|
21
|
+
],
|
|
22
|
+
body: "{\"message\":\"OK\"}"
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Every request now returns HTTP 200 with JSON body `{"message":"OK"}` and the prescribed headers.
|
|
26
|
+
|
|
27
|
+
## Configuration Options
|
|
28
|
+
|
|
29
|
+
| Option | Type | Description |
|
|
30
|
+
|-----------|-----------------------------|-------------------------------------------------------------------------------------------------|
|
|
31
|
+
| **code** | Integer | HTTP status code to return (e.g. 200, 404, 500). |
|
|
32
|
+
| **headers**| Array of [String,String] | List of header name/value pairs to include. |
|
|
33
|
+
| **body** | Array<UInt8> | Raw response body bytes. For text, use `string.bytes`. |
|
|
34
|
+
|
|
35
|
+
```ruby
|
|
36
|
+
# Example in Itsi.rb
|
|
37
|
+
static_response \
|
|
38
|
+
code: 404,
|
|
39
|
+
headers: [
|
|
40
|
+
["Content-Type", "text/plain"],
|
|
41
|
+
["X-Error", "NotFound"]
|
|
42
|
+
],
|
|
43
|
+
body: "Page not found"
|
|
44
|
+
```
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module Itsi
|
|
2
|
+
class Server
|
|
3
|
+
module Config
|
|
4
|
+
class StaticResponse < Middleware
|
|
5
|
+
|
|
6
|
+
insert_text <<~SNIPPET
|
|
7
|
+
static_response \\
|
|
8
|
+
code: ${1|200,404,500|},
|
|
9
|
+
headers: [${2|%w[content-type text/plain],%w[cache-control max-age=60]|}],
|
|
10
|
+
body: ${3|"OK", "Not Found"|}
|
|
11
|
+
SNIPPET
|
|
12
|
+
|
|
13
|
+
detail "Immediately return a fixed HTTP response with code, headers, and body."
|
|
14
|
+
|
|
15
|
+
schema do
|
|
16
|
+
{
|
|
17
|
+
code: (Type(Integer) & Required()),
|
|
18
|
+
headers: Array(Array(Type(String), Type(String))).default([]),
|
|
19
|
+
body: Type(String).default("")
|
|
20
|
+
}
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def initialize(location, params)
|
|
24
|
+
super
|
|
25
|
+
@params[:body] = @params[:body].bytes
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: String Rewrites
|
|
3
|
+
url: /middleware/string_rewrites
|
|
4
|
+
next: faqs/
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
The String Rewrite mechanism is used when configuring Itsi for
|
|
8
|
+
* [Reverse Proxying](/middleware/proxy)
|
|
9
|
+
* [Redirects](/middleware/redirect)
|
|
10
|
+
* [Logging](/middleware/log_requests)
|
|
11
|
+
* [Request Headers](/middleware/request_headers)
|
|
12
|
+
* [Response Headers](/middleware/response_headers)
|
|
13
|
+
|
|
14
|
+
It allows you to create dynamic strings from a template by combining literal text with placeholders. Placeholders (denoted using curly braces: `{}`) are replaced at runtime with data derived from the HTTP request, response, or context.
|
|
15
|
+
|
|
16
|
+
Modifiers can be appended after a pipe | to transform the substituted value.
|
|
17
|
+
|
|
18
|
+
## Modifiers
|
|
19
|
+
|
|
20
|
+
After a placeholder name, add |<modifier>:<arg> (or for replace, |replace:<from>,<to>). Available modifiers:
|
|
21
|
+
|
|
22
|
+
`strip_prefix:<text>` If the substituted value starts with <text>, remove that prefix.
|
|
23
|
+
|
|
24
|
+
`strip_suffix:<text>` If the substituted value ends with <text>, remove that suffix.
|
|
25
|
+
|
|
26
|
+
`replace:<from>,<to>` Replace all occurrences of <from> in the substituted value with <to>.
|
|
27
|
+
|
|
28
|
+
Modifiers are applied in the order they appear. You can chain multiple modifiers by repeating the |<modifier>:<arg> syntax (e.g. `{path|strip_prefix:/rails|replace:old,new}`).
|
|
29
|
+
|
|
30
|
+
### Rewriting a Request
|
|
31
|
+
|
|
32
|
+
The following placeholders are supported:
|
|
33
|
+
|
|
34
|
+
- **`request_id`**: A short unique identifier for the request.
|
|
35
|
+
- **`request_id_full`**: The full request identifier.
|
|
36
|
+
- **`method`**: The HTTP request method (e.g., GET, POST).
|
|
37
|
+
- **`path`**: The URL path of the request.
|
|
38
|
+
- **`addr`**: The client IP address.
|
|
39
|
+
- **`host`**: The host portion of the URL (defaults to `localhost` if unspecified).
|
|
40
|
+
- **`path_and_query`**: The combination of the URL path and query string.
|
|
41
|
+
- **`query`**: The query string (prepended with a `?` if non-empty).
|
|
42
|
+
- **`port`**: The port number (defaulting to `80` if not available).
|
|
43
|
+
- **`start_time`**: The formatted start time of the request.
|
|
44
|
+
- **`<Header-Name>`**: Any existing response header. For example `{Content-Type}` or `{Set-Cookie}` will be replaced with its current value.
|
|
45
|
+
|
|
46
|
+
The mechanism also allows any available matching regex capture from routes defined in the [location](/middleware/location) block.
|
|
47
|
+
If no match is found, otherwise, the placeholder remains unchanged (i.e. it is rendered as `{placeholder_name}`).
|
|
48
|
+
|
|
49
|
+
## Rewriting a Response
|
|
50
|
+
|
|
51
|
+
When you use String Rewrite in `response_headers`, you can refer to built‑in response fields **and** any header in the outgoing response:
|
|
52
|
+
|
|
53
|
+
- **`status`**: The HTTP status code (e.g., `200`, `404`).
|
|
54
|
+
- **`response_time`**: The computed response time, formatted (e.g., `12.345ms`).
|
|
55
|
+
- **`<Header-Name>`**: Any existing response header. For example `{Content-Type}` or `{Set-Cookie}` will be replaced with its current value.
|
|
56
|
+
|
|
57
|
+
If a header placeholder does not exist on the response, it will render as `{Header-Name}`.
|
|
58
|
+
|
|
59
|
+
## Example Templates
|
|
60
|
+
|
|
61
|
+
### Reverse Proxying
|
|
62
|
+
|
|
63
|
+
When acting as a reverse proxy, you might want to forward the request to a backend service. For example, if your backend service expects the complete path and query string appended to its URL, you could use:
|
|
64
|
+
|
|
65
|
+
```ruby
|
|
66
|
+
"https://backend.example.com/api{path}{query}"
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
For an incoming request to `/v1/resource?x=1`, this template rewrites the target URL to:
|
|
70
|
+
`https://backend.example.com/api/v1/resource?x=1`
|
|
71
|
+
|
|
72
|
+
### Redirects
|
|
73
|
+
|
|
74
|
+
For redirect middleware, a common use case is to guide clients from an old URL to a new one. For instance:
|
|
75
|
+
|
|
76
|
+
```ruby
|
|
77
|
+
"https://new.example.com{path}?source=redirect"
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
If a request comes in to `/old-section?foo=bar`, the rewrite produces:
|
|
81
|
+
`https://new.example.com/old-section?source=redirect`
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
module Itsi
|
|
2
|
+
class Server
|
|
3
|
+
module Config
|
|
4
|
+
|
|
5
|
+
HeaderSource = TypedStruct.new do
|
|
6
|
+
{
|
|
7
|
+
name: Type(String) & Required(),
|
|
8
|
+
prefix: Type(String)
|
|
9
|
+
}
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
HeaderSourceOuter = TypedStruct.new do
|
|
13
|
+
{
|
|
14
|
+
header: Type(HeaderSource)
|
|
15
|
+
}
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
QuerySource = TypedStruct.new do
|
|
19
|
+
{
|
|
20
|
+
query: Type(String) & Required()
|
|
21
|
+
}
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
TokenSource = TypedStruct.new do
|
|
25
|
+
Or(
|
|
26
|
+
Type(HeaderSourceOuter),
|
|
27
|
+
Type(QuerySource)
|
|
28
|
+
)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Options
|
|
3
|
+
type: docs
|
|
4
|
+
next: auto_reload_config/
|
|
5
|
+
url: /options
|
|
6
|
+
prev: configuration/
|
|
7
|
+
cascade:
|
|
8
|
+
type: docs
|
|
9
|
+
weight: 1
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
Most of Itsi's capabilities are unlocked via the Itsi.rb config file.
|
|
13
|
+
The config file uses a simple DSL, where you can write plain Ruby to define your application's configuration.
|
|
14
|
+
For the best development experience, be sure to use [RubyLSP](https://shopify.github.io/ruby-lsp/) for snippets, autocomplete and documentation, right in your editor.
|
|
15
|
+
|
|
16
|
+
{{< details title="An example Itsi.rb file:" >}}
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
```ruby {filename="Itsi.rb"}
|
|
20
|
+
workers 2
|
|
21
|
+
|
|
22
|
+
threads 2
|
|
23
|
+
|
|
24
|
+
fiber_scheduler true
|
|
25
|
+
|
|
26
|
+
auth_basic realm: "Restricted Area", credentials_file: "./credentials.txt"
|
|
27
|
+
|
|
28
|
+
auto_reload_config! # Auto-reload the server configuration each time it changes.
|
|
29
|
+
|
|
30
|
+
location "/app*" do
|
|
31
|
+
rate_limit requests: 3, seconds: 5
|
|
32
|
+
rackup_file "config.ru"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
location "/inline*" do
|
|
36
|
+
get "/" do |req|
|
|
37
|
+
req.ok "Hello, World!"
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
```
|
|
41
|
+
{{< /details >}}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Auto Reload Config
|
|
3
|
+
url: /options/auto_reload_config
|
|
4
|
+
prev: options/
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Auto reload config is a feature that allows the server to automatically reload the configuration file when it is modified. This feature is useful when you want to make changes to the configuration file without having to restart the server.
|
|
8
|
+
|
|
9
|
+
To opt in to config auto reloading, add the following line to your configuration file:
|
|
10
|
+
|
|
11
|
+
```ruby {filename=Itsi.rb}
|
|
12
|
+
auto_reload_config!
|
|
13
|
+
```
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
module Itsi
|
|
2
|
+
class Server
|
|
3
|
+
module Config
|
|
4
|
+
class AutoReloadConfig < Option
|
|
5
|
+
insert_text <<~SNIPPET
|
|
6
|
+
auto_reload_config! # Auto-reload the server configuration each time it changes.
|
|
7
|
+
SNIPPET
|
|
8
|
+
|
|
9
|
+
detail "Auto-reload the server configuration each time it changes."
|
|
10
|
+
|
|
11
|
+
def self.option_name
|
|
12
|
+
:auto_reload_config!
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def build!
|
|
16
|
+
return if @auto_reloading
|
|
17
|
+
|
|
18
|
+
src = caller.find { |l| !(l =~ %r{lib/itsi/server/config}) }.split(":").first
|
|
19
|
+
|
|
20
|
+
location.instance_eval do
|
|
21
|
+
return if @auto_reloading
|
|
22
|
+
|
|
23
|
+
if @included
|
|
24
|
+
@included.each do |file|
|
|
25
|
+
next if "#{file}" == src
|
|
26
|
+
|
|
27
|
+
if ENV["BUNDLE_BIN_PATH"]
|
|
28
|
+
watch "#{file}", [%w[bundle exec itsi restart]]
|
|
29
|
+
else
|
|
30
|
+
watch "#{file}", [%w[itsi restart]]
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
@auto_reloading = true
|
|
35
|
+
|
|
36
|
+
if ENV["BUNDLE_BIN_PATH"]
|
|
37
|
+
watch src, [%w[bundle exec itsi restart]]
|
|
38
|
+
else
|
|
39
|
+
watch src, [%w[itsi restart]]
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Bind
|
|
3
|
+
url: /options/bind
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
The **Bind** option instructs Itsi on which network interfaces to listen on.
|
|
7
|
+
It supports various protocols and formats to allow flexible binding to TCP/IP addresses or Unix sockets, with optional TLS configuration.
|
|
8
|
+
You can bind to multiple interfaces at once.
|
|
9
|
+
|
|
10
|
+
## Bind Formats
|
|
11
|
+
|
|
12
|
+
You can specify the bind address as a URI. Common formats include:
|
|
13
|
+
|
|
14
|
+
- **TCP/HTTP:**
|
|
15
|
+
```ruby
|
|
16
|
+
bind "http://0.0.0.0:3000"
|
|
17
|
+
```
|
|
18
|
+
Listens on all interfaces on port 3000 using plain HTTP.
|
|
19
|
+
|
|
20
|
+
- **TCP/HTTPS:**
|
|
21
|
+
```ruby
|
|
22
|
+
bind "https://0.0.0.0:3000?cert=/path/to/cert.pem&key=/path/to/key.pem"
|
|
23
|
+
```
|
|
24
|
+
Listens on all interfaces on port 3000 using HTTPS.
|
|
25
|
+
TLS options (e.g. certificates) can be provided via query parameters. You can also use `cert=acme` with additional ACME parameters to enable automatic certificate retrieval.
|
|
26
|
+
E.g.
|
|
27
|
+
|
|
28
|
+
```ruby
|
|
29
|
+
bind "https://0.0.0.0:3000?cert=acme&acme_email=example@example.com&domains=domain1.com,domain2.com"
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
- **Unix Socket:**
|
|
33
|
+
```ruby
|
|
34
|
+
bind "unix:///tmp/itsi.sock"
|
|
35
|
+
```
|
|
36
|
+
Listens using a Unix domain socket.
|
|
37
|
+
|
|
38
|
+
- **TLS over Unix Socket:**
|
|
39
|
+
```ruby
|
|
40
|
+
bind "tls:///tmp/itsi.sock"
|
|
41
|
+
```
|
|
42
|
+
Listens using a Unix socket while enabling TLS.
|
|
43
|
+
|
|
44
|
+
## Configuration File
|
|
45
|
+
|
|
46
|
+
In your configuration file (typically `Itsi.rb`), specify the bind option using the `bind` function.
|
|
47
|
+
|
|
48
|
+
## Examples
|
|
49
|
+
|
|
50
|
+
```ruby {filename="Itsi.rb"}
|
|
51
|
+
# Bind to all interfaces on port 3000 with HTTP:
|
|
52
|
+
bind "http://0.0.0.0:3000"
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
```ruby {filename="Itsi.rb"}
|
|
56
|
+
# Bind to all interfaces on port 3000 with HTTPS using certificate files:
|
|
57
|
+
bind "https://0.0.0.0:3000?cert=/path/to/cert.pem&key=/path/to/key.pem"
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
```ruby {filename="Itsi.rb"}
|
|
61
|
+
# Bind to a Unix socket:
|
|
62
|
+
bind "unix:///tmp/itsi.sock"
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Command Line
|
|
66
|
+
|
|
67
|
+
Bind addresses can also be specified from the command line via the `-b` or `--bind` option:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
itsi -b "http://0.0.0.0:3000" -b "https://0.0.0.0:3001"
|
|
71
|
+
```
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module Itsi
|
|
2
|
+
class Server
|
|
3
|
+
module Config
|
|
4
|
+
class Bind < Option
|
|
5
|
+
|
|
6
|
+
insert_text <<~SNIPPET
|
|
7
|
+
bind "${1|http://0.0.0.0:3000,https://0.0.0.0:3000,http://0.0.0.0,https://0.0.0.0,unix:///tmp/itsi.sock,tls:///tmp/itsi.sock,https://0.0.0.0?cert=/path/to/cert.pem&key=/path/to/key.pem,https://0.0.0.0?cert=acme&domains=domain.com&acme_email=user@example.com,https://0.0.0.0:3001?domains=devdomain.com,http://0.0.0.0:9292,http://0.0.0.0:8080,https://0.0.0.0:8443|}"
|
|
8
|
+
SNIPPET
|
|
9
|
+
|
|
10
|
+
detail "Bind the server to a specific address and port."
|
|
11
|
+
|
|
12
|
+
schema do
|
|
13
|
+
Type(String) & Required()
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def initialize(location, params={})
|
|
17
|
+
super
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def build!
|
|
21
|
+
(@location.options[:binds] ||= []) << @params
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|