itsi-server 0.1.1 → 0.2.2
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 +4 -4
- data/Cargo.lock +4487 -0
- data/Cargo.toml +7 -0
- data/README.md +6 -0
- data/Rakefile +7 -4
- data/exe/itsi +152 -46
- 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.toml +3 -0
- data/ext/itsi_error/src/lib.rs +98 -24
- data/ext/itsi_error/target/debug/build/clang-sys-da71b0344e568175/out/common.rs +355 -0
- data/ext/itsi_error/target/debug/build/clang-sys-da71b0344e568175/out/dynamic.rs +276 -0
- data/ext/itsi_error/target/debug/build/clang-sys-da71b0344e568175/out/macros.rs +49 -0
- data/ext/itsi_error/target/debug/build/rb-sys-49f554618693db24/out/bindings-0.9.110-mri-arm64-darwin23-3.4.2.rs +8865 -0
- data/ext/itsi_error/target/debug/incremental/itsi_error-1mmt5sux7jb0i/s-h510z7m8v9-0bxu7yd.lock +0 -0
- data/ext/itsi_error/target/debug/incremental/itsi_error-2vn3jey74oiw0/s-h5113n0e7e-1v5qzs6.lock +0 -0
- data/ext/itsi_error/target/debug/incremental/itsi_error-37uv9dicz7awp/s-h510ykifhe-0tbnep2.lock +0 -0
- data/ext/itsi_error/target/debug/incremental/itsi_error-37uv9dicz7awp/s-h510yyocpj-0tz7ug7.lock +0 -0
- data/ext/itsi_error/target/debug/incremental/itsi_error-37uv9dicz7awp/s-h510z0xc8g-14ol18k.lock +0 -0
- data/ext/itsi_error/target/debug/incremental/itsi_error-3g5qf4y7d54uj/s-h5113n0e7d-1trk8on.lock +0 -0
- data/ext/itsi_error/target/debug/incremental/itsi_error-3lpfftm45d3e2/s-h510z7m8r3-1pxp20o.lock +0 -0
- data/ext/itsi_error/target/debug/incremental/itsi_error-3o4qownhl3d7n/s-h510ykifek-1uxasnk.lock +0 -0
- data/ext/itsi_error/target/debug/incremental/itsi_error-3o4qownhl3d7n/s-h510yyocki-11u37qm.lock +0 -0
- data/ext/itsi_error/target/debug/incremental/itsi_error-3o4qownhl3d7n/s-h510z0xc93-0pmy0zm.lock +0 -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.toml +3 -0
- data/ext/itsi_rb_helpers/src/heap_value.rs +139 -0
- data/ext/itsi_rb_helpers/src/lib.rs +141 -10
- data/ext/itsi_rb_helpers/target/debug/build/clang-sys-da71b0344e568175/out/common.rs +355 -0
- data/ext/itsi_rb_helpers/target/debug/build/clang-sys-da71b0344e568175/out/dynamic.rs +276 -0
- data/ext/itsi_rb_helpers/target/debug/build/clang-sys-da71b0344e568175/out/macros.rs +49 -0
- data/ext/itsi_rb_helpers/target/debug/build/rb-sys-eb9ed4ff3a60f995/out/bindings-0.9.110-mri-arm64-darwin23-3.4.2.rs +8865 -0
- data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-040pxg6yhb3g3/s-h5113n7a1b-03bwlt4.lock +0 -0
- data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-131g1u4dzkt1a/s-h51113xnh3-1eik1ip.lock +0 -0
- data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-131g1u4dzkt1a/s-h5111704jj-0g4rj8x.lock +0 -0
- data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-1q2d3drtxrzs5/s-h5113n79yl-0bxcqc5.lock +0 -0
- data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-374a9h7ovycj0/s-h51113xoox-10de2hp.lock +0 -0
- data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-374a9h7ovycj0/s-h5111704w7-0vdq7gq.lock +0 -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 +314 -0
- data/ext/itsi_scheduler/src/lib.rs +39 -0
- data/ext/itsi_server/Cargo.lock +2956 -0
- data/ext/itsi_server/Cargo.toml +75 -14
- data/ext/itsi_server/extconf.rb +1 -1
- 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 +11 -0
- data/ext/itsi_server/src/env.rs +43 -0
- data/ext/itsi_server/src/lib.rs +133 -40
- data/ext/itsi_server/src/prelude.rs +2 -0
- data/ext/itsi_server/src/ruby_types/itsi_body_proxy/big_bytes.rs +109 -0
- data/ext/itsi_server/src/ruby_types/itsi_body_proxy/mod.rs +143 -0
- data/ext/itsi_server/src/ruby_types/itsi_grpc_call.rs +344 -0
- data/ext/itsi_server/src/ruby_types/itsi_grpc_response_stream/mod.rs +264 -0
- data/ext/itsi_server/src/ruby_types/itsi_http_request.rs +362 -0
- data/ext/itsi_server/src/ruby_types/itsi_http_response.rs +391 -0
- data/ext/itsi_server/src/ruby_types/itsi_server/file_watcher.rs +233 -0
- data/ext/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +565 -0
- data/ext/itsi_server/src/ruby_types/itsi_server.rs +86 -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 +444 -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/http_message_types.rs +97 -0
- data/ext/itsi_server/src/server/io_stream.rs +105 -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 +94 -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 +316 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/cors.rs +301 -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 +192 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/error_response.rs +171 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/etag.rs +198 -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 +82 -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 +116 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/proxy.rs +411 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/rate_limit.rs +142 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/redirect.rs +55 -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 +126 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs +187 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/static_response.rs +55 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/string_rewrite.rs +173 -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 +13 -5
- 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/cluster_mode.rs +354 -0
- data/ext/itsi_server/src/server/serve_strategy/mod.rs +30 -0
- data/ext/itsi_server/src/server/serve_strategy/single_mode.rs +481 -0
- data/ext/itsi_server/src/server/signal.rs +77 -0
- data/ext/itsi_server/src/server/size_limited_incoming.rs +107 -0
- data/ext/itsi_server/src/server/thread_worker.rs +479 -0
- data/ext/itsi_server/src/services/cache_store.rs +74 -0
- data/ext/itsi_server/src/services/itsi_http_service.rs +257 -0
- data/ext/itsi_server/src/services/mime_types.rs +1416 -0
- data/ext/itsi_server/src/services/mod.rs +6 -0
- data/ext/itsi_server/src/services/password_hasher.rs +83 -0
- data/ext/itsi_server/src/services/rate_limiter.rs +580 -0
- data/ext/itsi_server/src/services/static_file_server.rs +1340 -0
- data/ext/itsi_tracing/Cargo.toml +5 -0
- data/ext/itsi_tracing/src/lib.rs +366 -7
- data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-0994n8rpvvt9m/s-h510hfz1f6-1kbycmq.lock +0 -0
- data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-0bob7bf4yq34i/s-h5113125h5-0lh4rag.lock +0 -0
- data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2fcodulrxbbxo/s-h510h2infk-0hp5kjw.lock +0 -0
- data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2iak63r1woi1l/s-h510h2in4q-0kxfzw1.lock +0 -0
- data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2kk4qj9gn5dg2/s-h5113124kv-0enwon2.lock +0 -0
- data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2mwo0yas7dtw4/s-h510hfz1ha-1udgpei.lock +0 -0
- data/lib/itsi/http_request/response_status_shortcodes.rb +76 -0
- data/lib/itsi/http_request.rb +218 -0
- data/lib/itsi/http_response.rb +42 -0
- data/lib/itsi/passfile.rb +108 -0
- data/lib/itsi/server/config/config_helpers.rb +105 -0
- data/lib/itsi/server/config/dsl.rb +211 -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 +20 -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 +44 -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 +159 -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 +42 -0
- data/lib/itsi/server/config/middleware/endpoint/endpoint.rb +99 -0
- data/lib/itsi/server/config/middleware/endpoint/get.md +12 -0
- data/lib/itsi/server/config/middleware/endpoint/get.rb +42 -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 +42 -0
- data/lib/itsi/server/config/middleware/endpoint/post.md +12 -0
- data/lib/itsi/server/config/middleware/endpoint/post.rb +42 -0
- data/lib/itsi/server/config/middleware/endpoint/put.md +12 -0
- data/lib/itsi/server/config/middleware/endpoint/put.rb +42 -0
- data/lib/itsi/server/config/middleware/endpoint/schemas.md +122 -0
- data/lib/itsi/server/config/middleware/error_response.md +61 -0
- data/lib/itsi/server/config/middleware/error_response.rb +36 -0
- data/lib/itsi/server/config/middleware/etag.md +59 -0
- data/lib/itsi/server/config/middleware/etag.rb +27 -0
- data/lib/itsi/server/config/middleware/grpc.md +172 -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 +99 -0
- data/lib/itsi/server/config/middleware/log_requests.md +65 -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 +41 -0
- data/lib/itsi/server/config/middleware/rackup_file.md +54 -0
- data/lib/itsi/server/config/middleware/rackup_file.rb +44 -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 +60 -0
- data/lib/itsi/server/config/middleware/run.rb +43 -0
- data/lib/itsi/server/config/middleware/static_assets.md +73 -0
- data/lib/itsi/server/config/middleware/static_assets.rb +87 -0
- data/lib/itsi/server/config/middleware/static_response.md +44 -0
- data/lib/itsi/server/config/middleware/static_response.rb +29 -0
- data/lib/itsi/server/config/middleware/string_rewrite.md +67 -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 +14 -0
- data/lib/itsi/server/config/options/_index.md +37 -0
- data/lib/itsi/server/config/options/auto_reload_config.md +13 -0
- data/lib/itsi/server/config/options/auto_reload_config.rb +41 -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 +20 -0
- data/lib/itsi/server/config/options/include.rb +36 -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/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 +16 -0
- data/lib/itsi/server/config/options/reuse_address.rb +19 -0
- data/lib/itsi/server/config/options/reuse_port.md +16 -0
- data/lib/itsi/server/config/options/reuse_port.rb +19 -0
- data/lib/itsi/server/config/options/scheduler_threads.md +34 -0
- data/lib/itsi/server/config/options/scheduler_threads.rb +17 -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/typed_struct.rb +242 -0
- data/lib/itsi/server/config.rb +289 -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 +107 -0
- data/lib/itsi/server/grpc/grpc_call.rb +246 -0
- data/lib/itsi/server/grpc/grpc_interface.rb +107 -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/rack/handler/itsi.rb +27 -0
- data/lib/itsi/server/rack_interface.rb +94 -0
- data/lib/itsi/server/route_tester.rb +157 -0
- data/lib/itsi/server/scheduler_interface.rb +21 -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 +196 -0
- data/lib/itsi/server/typed_handlers/source_parser.rb +56 -0
- data/lib/itsi/server/typed_handlers.rb +25 -0
- data/lib/itsi/server/version.rb +1 -1
- data/lib/itsi/server.rb +265 -9
- data/lib/itsi/standard_headers.rb +86 -0
- data/lib/ruby_lsp/itsi/addon.rb +129 -0
- data/lib/shell_completions/completions.rb +26 -0
- metadata +454 -28
- data/CHANGELOG.md +0 -5
- data/CODE_OF_CONDUCT.md +0 -132
- data/LICENSE.txt +0 -21
- data/ext/itsi_server/src/request/itsi_request.rs +0 -143
- data/ext/itsi_server/src/request/mod.rs +0 -1
- data/ext/itsi_server/src/server/bind.rs +0 -138
- data/ext/itsi_server/src/server/itsi_ca/itsi_ca.crt +0 -32
- data/ext/itsi_server/src/server/itsi_ca/itsi_ca.key +0 -52
- data/ext/itsi_server/src/server/itsi_server.rs +0 -182
- data/ext/itsi_server/src/server/listener.rs +0 -218
- data/ext/itsi_server/src/server/tls.rs +0 -138
- data/ext/itsi_server/src/server/transfer_protocol.rs +0 -23
- data/ext/itsi_server/src/stream_writer/mod.rs +0 -21
- data/lib/itsi/request.rb +0 -39
@@ -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,29 @@
|
|
1
|
+
module Itsi
|
2
|
+
class Server
|
3
|
+
module Config
|
4
|
+
class StaticResponse < Middleware
|
5
|
+
insert_text <<~SNIPPET
|
6
|
+
static_response \\
|
7
|
+
code: ${1|200,404,500|}, \\
|
8
|
+
headers: [${2|["Content-Type","text/plain"],["Cache-Control","max-age=60"]|}], \\
|
9
|
+
body: ${3|"OK".bytes, "Not Found".bytes|}
|
10
|
+
SNIPPET
|
11
|
+
|
12
|
+
detail "Immediately return a fixed HTTP response with code, headers, and body."
|
13
|
+
|
14
|
+
schema do
|
15
|
+
{
|
16
|
+
code: (Type(Integer) & Required()),
|
17
|
+
headers: Array(Array(Type(String), Type(String))).default([]),
|
18
|
+
body: Type(String).default("")
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialize(location, params)
|
23
|
+
super
|
24
|
+
@params[:body] = @params[:body].bytes
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,67 @@
|
|
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
|
+
### Rewriting a Request
|
17
|
+
|
18
|
+
The following placeholders are supported:
|
19
|
+
|
20
|
+
- **`request_id`**: A short unique identifier for the request.
|
21
|
+
- **`request_id_full`**: The full request identifier.
|
22
|
+
- **`method`**: The HTTP request method (e.g., GET, POST).
|
23
|
+
- **`path`**: The URL path of the request.
|
24
|
+
- **`addr`**: The client IP address.
|
25
|
+
- **`host`**: The host portion of the URL (defaults to `localhost` if unspecified).
|
26
|
+
- **`path_and_query`**: The combination of the URL path and query string.
|
27
|
+
- **`query`**: The query string (prepended with a `?` if non-empty).
|
28
|
+
- **`port`**: The port number (defaulting to `80` if not available).
|
29
|
+
- **`start_time`**: The formatted start time of the request.
|
30
|
+
- **`<Header-Name>`**: Any existing response header. For example `{Content-Type}` or `{Set-Cookie}` will be replaced with its current value.
|
31
|
+
|
32
|
+
The mechanism also allows any available matching regex capture from routes defined in the [location](/middleware/location) block.
|
33
|
+
If no match is found, otherwise, the placeholder remains unchanged (i.e. it is rendered as `{placeholder_name}`).
|
34
|
+
|
35
|
+
## Rewriting a Response
|
36
|
+
|
37
|
+
When you use String Rewrite in `response_headers`, you can refer to built‑in response fields **and** any header in the outgoing response:
|
38
|
+
|
39
|
+
- **`status`**: The HTTP status code (e.g., `200`, `404`).
|
40
|
+
- **`response_time`**: The computed response time, formatted (e.g., `12.345ms`).
|
41
|
+
- **`<Header-Name>`**: Any existing response header. For example `{Content-Type}` or `{Set-Cookie}` will be replaced with its current value.
|
42
|
+
|
43
|
+
If a header placeholder does not exist on the response, it will render as `{Header-Name}`.
|
44
|
+
|
45
|
+
## Example Templates
|
46
|
+
|
47
|
+
### Reverse Proxying
|
48
|
+
|
49
|
+
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:
|
50
|
+
|
51
|
+
```ruby
|
52
|
+
"https://backend.example.com/api{path}{query}"
|
53
|
+
```
|
54
|
+
|
55
|
+
For an incoming request to `/v1/resource?x=1`, this template rewrites the target URL to:
|
56
|
+
`https://backend.example.com/api/v1/resource?x=1`
|
57
|
+
|
58
|
+
### Redirects
|
59
|
+
|
60
|
+
For redirect middleware, a common use case is to guide clients from an old URL to a new one. For instance:
|
61
|
+
|
62
|
+
```ruby
|
63
|
+
"https://new.example.com{path}?source=redirect"
|
64
|
+
```
|
65
|
+
|
66
|
+
If a request comes in to `/old-section?foo=bar`, the rewrite produces:
|
67
|
+
`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,37 @@
|
|
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
|
+
threads 2
|
22
|
+
scheduler_threads 3
|
23
|
+
|
24
|
+
fiber_scheduler true
|
25
|
+
|
26
|
+
rate_limiter requests: 100, seconds: 10
|
27
|
+
|
28
|
+
auth_basic realm: "Restricted Area", credentials_file: "credentials.txt"
|
29
|
+
|
30
|
+
location "/app" do
|
31
|
+
get "/" do |req|
|
32
|
+
req.ok "Hello, World!"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
```
|
37
|
+
{{< /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,41 @@
|
|
1
|
+
module Itsi
|
2
|
+
class Server
|
3
|
+
module Config
|
4
|
+
class AutoReloadConfig < Option
|
5
|
+
|
6
|
+
insert_text <<~SNIPPET
|
7
|
+
auto_reload_config! # Auto-reload the server configuration each time it changes.
|
8
|
+
SNIPPET
|
9
|
+
|
10
|
+
detail "Auto-reload the server configuration each time it changes."
|
11
|
+
|
12
|
+
def self.option_name
|
13
|
+
:auto_reload_config!
|
14
|
+
end
|
15
|
+
|
16
|
+
def build!
|
17
|
+
location.instance_eval do
|
18
|
+
return if @auto_reloading
|
19
|
+
|
20
|
+
if @included
|
21
|
+
@included.each do |file|
|
22
|
+
if ENV["BUNDLE_BIN_PATH"]
|
23
|
+
watch "#{file}.rb", [%w[bundle exec itsi restart]]
|
24
|
+
else
|
25
|
+
watch "#{file}.rb", [%w[itsi restart]]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
@auto_reloading = true
|
30
|
+
|
31
|
+
if ENV["BUNDLE_BIN_PATH"]
|
32
|
+
watch "Itsi.rb", [%w[bundle exec itsi restart]]
|
33
|
+
else
|
34
|
+
watch "Itsi.rb", [%w[itsi restart]]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
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
|
@@ -0,0 +1,65 @@
|
|
1
|
+
---
|
2
|
+
title: TLS Certificates
|
3
|
+
url: /options/certificates
|
4
|
+
---
|
5
|
+
|
6
|
+
Itsi can automatically generate TLS certificates for you, both in development and production environments.
|
7
|
+
|
8
|
+
## Development / Self-signed
|
9
|
+
To automatically generate a TLS certificate in development, just bind using the `https` scheme.
|
10
|
+
E.g.
|
11
|
+
```ruby {filename=Itsi.rb}
|
12
|
+
bind "https://localhost"
|
13
|
+
|
14
|
+
or
|
15
|
+
|
16
|
+
bind "https://localhost:8443"
|
17
|
+
```
|
18
|
+
Itsi will generate a local development CA for you if it does not yet exist, then use this to
|
19
|
+
sign a just-in-time certificate for your server.
|
20
|
+
The local CA will by default live inside a `.itsi` directory inside your home directory.
|
21
|
+
This directory can be overwritten using the `ITSI_LOCAL_CA_DIR` environment variable.
|
22
|
+
|
23
|
+
You can add this CA to your system's trusted certificate store to avoid browser warnings in development.
|
24
|
+
|
25
|
+
If you want the generated certificate to be valid for specific domains, you can add these to your bind string, and they will be added as subject alternative names (SANs). For example:
|
26
|
+
|
27
|
+
```ruby {filename=Itsi.rb}
|
28
|
+
bind "https://example.com?domains=development.example.com,development.example.org"
|
29
|
+
```
|
30
|
+
## Existing Certificates
|
31
|
+
If you already have a certificate and key, you can use them by passing the path to the certificate and key files to the `bind` method.
|
32
|
+
E.g.
|
33
|
+
```ruby {filename=Itsi.rb}
|
34
|
+
bind "https://example.com?cert=/path/to/cert.pem&key=/path/to/key.pem"
|
35
|
+
```
|
36
|
+
|
37
|
+
## Production Certificates (Let's Encrypt)
|
38
|
+
If you want to use Let's Encrypt to automatically generate a production TLS certificate, you can add `cert=acme` to the bind string.
|
39
|
+
|
40
|
+
E.g.
|
41
|
+
```ruby {filename=Itsi.rb}
|
42
|
+
bind "https://0.0.0.0?cert=acme&domains=example.com,example.org&acme_email=you@example.com"
|
43
|
+
```
|
44
|
+
|
45
|
+
You can provide several ENV variables to configure further configure the Let's Encrypt integration:
|
46
|
+
- `ITSI_ACME_CACHE_DIR`: The directory to use to cache Let's encrypt certificates (so that these are not regenerated each time the server is restarted).
|
47
|
+
- `ITSI_ACME_CONTACT_EMAIL`: The email address to use for Let's Encrypt account registration (overridden by the `acme_email` parameter).
|
48
|
+
- `ITSI_ACME_CA_PEM_PATH`: Optional CA Pem path, used for testing with non-trusted CAs for certifcate generation (e.g. pebble)
|
49
|
+
- `ITSI_ACME_DIRECTORY_URL`: Override the ACME directory URL (e.g. https://acme-staging-v02.api.letsencrypt.org/directory).
|
50
|
+
|
51
|
+
{{< callout type="info" >}}
|
52
|
+
Let's Encrypt enforces strict rate limits on production certificate generation. To verify that your configuration is correct, it's recommended to test it first using the staging directory URL. E.g.
|
53
|
+
`ITSI_ACME_DIRECTORY_URL=https://acme-staging-v02.api.letsencrypt.org/directory`
|
54
|
+
{{< /callout >}}
|
55
|
+
|
56
|
+
|
57
|
+
{{< callout type="warn" >}}
|
58
|
+
Currently only the TLS-ALPN-01 challenge type is supported for automated certificates.
|
59
|
+
The HTTP-01 challenge is not *yet* supported. This means that, for e.g. if your server is sitting behind a CDN or reverse proxy that performs HTTPS termination, you will not be able to rely on the *automated* certificate generation for fully automated, verified e2e encryption.
|
60
|
+
|
61
|
+
Instead you may wish to use:
|
62
|
+
* [Self-signed](#development--self-signed) certificates
|
63
|
+
* [Manually](#existing-certificates) install certificates
|
64
|
+
* Use HTTP between the CDN and the server
|
65
|
+
{{< /callout >}}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
---
|
2
|
+
title: Daemonize
|
3
|
+
url: /options/daemonize
|
4
|
+
---
|
5
|
+
|
6
|
+
If you set `daemonize` to true, the server will run in the background.
|
7
|
+
(Setting `daemonize` back to false, while auto-reloading config will not return the service to the foreground).
|
8
|
+
|
9
|
+
## Configuration
|
10
|
+
```ruby {filename=Itsi.rb}
|
11
|
+
daemonize true
|
12
|
+
```
|
13
|
+
|
14
|
+
Use `status`, `start` and `stop` to inspect server state.
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Itsi
|
2
|
+
class Server
|
3
|
+
module Config
|
4
|
+
class Daemonize < Option
|
5
|
+
|
6
|
+
insert_text <<~SNIPPET
|
7
|
+
daemonize ${1|true,false|}
|
8
|
+
SNIPPET
|
9
|
+
|
10
|
+
detail "Configures whether the server should run in the background."
|
11
|
+
|
12
|
+
schema do
|
13
|
+
(Bool() & Required())
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
---
|
2
|
+
title: Fiber Scheduler
|
3
|
+
url: /options/fiber_scheduler
|
4
|
+
---
|
5
|
+
Itsi supports processing requests in threads that are managed by a fiber scheduler.
|
6
|
+
This allows Itsi to process a very large number of IO heavy requests concurrently without the memory and context switching overhead of managing multiple threads.
|
7
|
+
|
8
|
+
Enabling Fiber Scheduler mode can drastically improve application performance if you perform large amounts of blocking IO operations.
|
9
|
+
|
10
|
+
|
11
|
+
## Configuration File
|
12
|
+
```ruby {filename="Itsi.rb"}
|
13
|
+
# Enable Itsi's fiber scheduler mode
|
14
|
+
# (This will use an instance of `Itsi::Scheduler`
|
15
|
+
# This is Itsi's built in Fiber scheduler.)
|
16
|
+
fiber_scheduler true
|
17
|
+
```
|
18
|
+
|
19
|
+
```ruby {filename="Itsi.rb"}
|
20
|
+
# In the spirit of the Fiber::Scheduler interface,
|
21
|
+
# you can bring your own scheduler!.
|
22
|
+
# E.g. using the scheduler from the popular Async library.
|
23
|
+
fiber_scheduler "Async::Scheduler"
|
24
|
+
```
|
25
|
+
|
26
|
+
{{< callout type="warning" >}}
|
27
|
+
Running in Fiber scheduler mode can be a huge performance boon, but it's not without tradeoffs. Because it enables drastically more in-flight requests,
|
28
|
+
it can have a substantial impact on memory usage. Similarly, it can increase the amount of simultaneous demand on pooled resources (like database connections or network sockets)
|
29
|
+
and can cause increased contention on shared locks.
|
30
|
+
|
31
|
+
While well-tuned Fiber based servers can drastically outperform their blocking counterparts in some scenarios, the above compromises can make it an unsafe blanket choice, particularly for some large applications with dependencies not specifically designed for a cooperative multitasking environment.
|
32
|
+
|
33
|
+
To see Itsi's recommended approach to enjoying the benefits of a Fiber scheduler while managing these risks, consider using Itsi's [hybrid mode](/options/scheduler_threads).
|
34
|
+
{{< /callout >}}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Itsi
|
2
|
+
class Server
|
3
|
+
module Config
|
4
|
+
class FiberScheduler < Option
|
5
|
+
|
6
|
+
insert_text "fiber_scheduler ${1|true,'Itsi::Scheduler'|} # Enable Fiber Scheduler mode"
|
7
|
+
|
8
|
+
detail "Enable Fiber Scheduler mode"
|
9
|
+
|
10
|
+
schema do
|
11
|
+
Or(Bool(), (Type(String) & Required()))
|
12
|
+
end
|
13
|
+
|
14
|
+
def build!
|
15
|
+
@params = "Itsi::Scheduler" if @params == true
|
16
|
+
location.options[:scheduler_class] = @params if @params
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
---
|
2
|
+
title: Header Read Timeout
|
3
|
+
url: /options/header_read_timeout
|
4
|
+
---
|
5
|
+
|
6
|
+
Sets the maximum time (in seconds) allowed to receive the request headers. This protects against slowloris-style attacks.
|
7
|
+
|
8
|
+
### Default
|
9
|
+
|
10
|
+
```ruby {filename=Itsi.rb}
|
11
|
+
header_read_timeout 2.0
|
12
|
+
```
|
13
|
+
### Example
|
14
|
+
|
15
|
+
```ruby {filename=Itsi.rb}
|
16
|
+
header_read_timeout 5.0
|
17
|
+
```
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Itsi
|
2
|
+
class Server
|
3
|
+
module Config
|
4
|
+
class HeaderReadTimeout < Option
|
5
|
+
|
6
|
+
insert_text <<~SNIPPET
|
7
|
+
header_read_timeout 2.0 # Request Timeout in Seconds
|
8
|
+
SNIPPET
|
9
|
+
|
10
|
+
detail "Header read timeout."
|
11
|
+
|
12
|
+
schema do
|
13
|
+
(Type(Float) & Required()).default(2.0) # Default 1 second
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
---
|
2
|
+
title: Hooks
|
3
|
+
url: /options/hooks
|
4
|
+
---
|
5
|
+
|
6
|
+
* [after_fork](/options/after_fork)
|
7
|
+
* [after_memory_limit_reached](/options/after_memory_limit_reached)
|
8
|
+
* [after_start](/options/after_start)
|
9
|
+
* [before_fork](/options/before_fork)
|
10
|
+
* [before_restart](/options/before_restart)
|
11
|
+
* [before_shutdown](/options/before_shutdown)
|
@@ -0,0 +1,13 @@
|
|
1
|
+
---
|
2
|
+
title: After Fork
|
3
|
+
url: /options/after_fork
|
4
|
+
parent: /options/after_fork
|
5
|
+
---
|
6
|
+
|
7
|
+
The **after_fork** hook runs once **in each worker process** immediately after it is forked. Use it to reinitialize connections (DB, cache) that shouldn't be shared across forks.
|
8
|
+
|
9
|
+
```ruby {filename=Itsi.rb}
|
10
|
+
after_fork do
|
11
|
+
DB.reconnect!
|
12
|
+
end
|
13
|
+
```
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Itsi
|
2
|
+
class Server
|
3
|
+
module Config
|
4
|
+
class AfterFork < Option
|
5
|
+
insert_text <<~SNIPPET
|
6
|
+
after_fork do
|
7
|
+
${1:# code to run after worker forks}
|
8
|
+
end
|
9
|
+
SNIPPET
|
10
|
+
|
11
|
+
detail "Run code after worker forks"
|
12
|
+
|
13
|
+
schema do
|
14
|
+
(Type(Proc) & Required())
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize(location, ¶ms)
|
18
|
+
super(location, params)
|
19
|
+
end
|
20
|
+
|
21
|
+
def build!
|
22
|
+
location.options[:hooks] ||= {}
|
23
|
+
location.options[:hooks][:after_fork] = @params
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
---
|
2
|
+
title: After Memory Limit Reached
|
3
|
+
url: /options/after_memory_limit_reached
|
4
|
+
---
|
5
|
+
|
6
|
+
The **after_memory_limit_reached** hook fires whenever a worker’s RSS memory usage exceeds a configured limit. It passes the PID of the process so you can log, alert, or take corrective action.
|
7
|
+
|
8
|
+
This option works in conjunction with the [worker_memory_limit](/options/worker_memory_limit).
|
9
|
+
|
10
|
+
```ruby {filename=Itsi.rb}
|
11
|
+
after_memory_limit_reached do |pid|
|
12
|
+
AlertService.notify("Worker #{pid} memory exceeded limit")
|
13
|
+
end
|
14
|
+
```
|