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,321 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Itsi
|
|
4
|
+
class Server
|
|
5
|
+
module Config
|
|
6
|
+
require_relative "config/typed_struct"
|
|
7
|
+
require_relative "config/dsl"
|
|
8
|
+
require_relative "config/known_paths"
|
|
9
|
+
require_relative "default_app/default_app"
|
|
10
|
+
|
|
11
|
+
ITSI_DEFAULT_CONFIG_FILE = "Itsi.rb"
|
|
12
|
+
ITSI_SERVER_PID_DIR = ENV.fetch("ITSI_SERVER_PID_DIR", "tmp")
|
|
13
|
+
|
|
14
|
+
def self.prep_reexec!
|
|
15
|
+
@argv ||= ARGV[0...ARGV.index("--listeners")]
|
|
16
|
+
|
|
17
|
+
auto_suppress_fork_darwin_fork_safety_warnings = [
|
|
18
|
+
ENV["OBJC_DISABLE_INITIALIZE_FORK_SAFETY"].nil? || ENV["PGGSSENCMODE"].nil?,
|
|
19
|
+
RUBY_PLATFORM =~ /darwin/,
|
|
20
|
+
!ENV.key?("ITSI_DISABLE_AUTO_DISABLE_DARWIN_FORK_SAFETY_WARNINGS"),
|
|
21
|
+
$PROGRAM_NAME =~ /itsi$/
|
|
22
|
+
].all?
|
|
23
|
+
return unless auto_suppress_fork_darwin_fork_safety_warnings
|
|
24
|
+
|
|
25
|
+
env = ENV.to_h.merge("OBJC_DISABLE_INITIALIZE_FORK_SAFETY" => "YES", "PGGSSENCMODE" => "disable")
|
|
26
|
+
if ENV["BUNDLE_BIN_PATH"]
|
|
27
|
+
exec env, "bundle", "exec", $PROGRAM_NAME, *@argv
|
|
28
|
+
else
|
|
29
|
+
exec env, $PROGRAM_NAME, *@argv
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# The configuration used when launching the Itsi server are evaluated in the following precedence:
|
|
34
|
+
# 1. CLI Args.
|
|
35
|
+
# 2. Itsi.rb file.
|
|
36
|
+
# 3. Default values.
|
|
37
|
+
def self.build_config(args, config_file_path, builder_proc = nil)
|
|
38
|
+
args.transform_keys!(&:to_sym)
|
|
39
|
+
|
|
40
|
+
itsifile_config, errors = \
|
|
41
|
+
if builder_proc
|
|
42
|
+
DSL.evaluate(&builder_proc)
|
|
43
|
+
elsif args[:static]
|
|
44
|
+
DSL.evaluate do
|
|
45
|
+
rate_limit key: "address", store_config: "in_memory", requests: 5, seconds: 10
|
|
46
|
+
etag type: "strong", algorithm: "md5", min_body_size: 1024 * 1024
|
|
47
|
+
compress min_size: 1024 * 1024, level: "fastest", algorithms: %w[zstd gzip br deflate],
|
|
48
|
+
mime_types: %w[all], compress_streams: true
|
|
49
|
+
log_requests before: { level: "DEBUG", format: "[{request_id}] {method} {path_and_query} - {addr} " },
|
|
50
|
+
after: { level: "DEBUG",
|
|
51
|
+
format: "[{request_id}] └─ {status} in {response_time}" }
|
|
52
|
+
nodelay false
|
|
53
|
+
static_assets \
|
|
54
|
+
relative_path: true,
|
|
55
|
+
allowed_extensions: [],
|
|
56
|
+
root_dir: ".",
|
|
57
|
+
not_found_behavior: { error: "not_found" },
|
|
58
|
+
auto_index: true,
|
|
59
|
+
try_html_extension: true,
|
|
60
|
+
max_file_size_in_memory: 1024 * 1024, # 1MB
|
|
61
|
+
max_files_in_memory: 1000,
|
|
62
|
+
file_check_interval: 1,
|
|
63
|
+
serve_hidden_files: false,
|
|
64
|
+
headers: {
|
|
65
|
+
"X-Content-Type-Options" => "nosniff"
|
|
66
|
+
}
|
|
67
|
+
end
|
|
68
|
+
elsif File.exist?(config_file_path.to_s)
|
|
69
|
+
DSL.evaluate do
|
|
70
|
+
include config_file_path.gsub(".rb", "")
|
|
71
|
+
rackup_file args[:rackup_file], script_name: "/" if args.key?(:rackup_file)
|
|
72
|
+
end
|
|
73
|
+
elsif File.exist?("./config.ru")
|
|
74
|
+
DSL.evaluate do
|
|
75
|
+
preload true
|
|
76
|
+
rackup_file args.fetch(:rackup_file, "./config.ru"), script_name: "/"
|
|
77
|
+
end
|
|
78
|
+
else
|
|
79
|
+
DSL.evaluate do
|
|
80
|
+
rackup_file args[:rackup_file], script_name: "/" if args.key?(:rackup_file)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
itsifile_config.transform_keys!(&:to_sym)
|
|
85
|
+
|
|
86
|
+
# We'll preload while we load config, if enabled.
|
|
87
|
+
middleware_loader = itsifile_config.fetch(:middleware_loader, -> {})
|
|
88
|
+
preload = args.fetch(:preload) { itsifile_config.fetch(:preload, false) }
|
|
89
|
+
|
|
90
|
+
case preload
|
|
91
|
+
# If we preload everything, then we'll load middleware and default rack app ahead of time
|
|
92
|
+
when true
|
|
93
|
+
begin
|
|
94
|
+
Itsi.log_debug("Preloading middleware and default rack app")
|
|
95
|
+
preloaded_middleware = middleware_loader.call
|
|
96
|
+
middleware_loader = -> { preloaded_middleware }
|
|
97
|
+
rescue Exception => e # rubocop:disable Lint/RescueException
|
|
98
|
+
errors << [e, e.backtrace[0]]
|
|
99
|
+
end
|
|
100
|
+
# If we're just preloading a specific gem group, we'll do that here too
|
|
101
|
+
when Symbol, String
|
|
102
|
+
Itsi.log_debug("Preloading gem group #{preload}")
|
|
103
|
+
Bundler.require(preload)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
if itsifile_config[:daemonize] && !@daemonized
|
|
107
|
+
@daemonized = true
|
|
108
|
+
Itsi.log_info("Itsi is running in the background. Writing pid to #{Itsi::Server::Config.pid_file_path}")
|
|
109
|
+
Itsi.log_info("To stop Itsi, run 'itsi stop' from this directory.")
|
|
110
|
+
Process.daemon(true, false)
|
|
111
|
+
Server.write_pid
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
srv_config = {
|
|
115
|
+
workers: args.fetch(:workers) { itsifile_config.fetch(:workers, nil) },
|
|
116
|
+
worker_memory_limit: args.fetch(:worker_memory_limit) { itsifile_config.fetch(:worker_memory_limit, nil) },
|
|
117
|
+
silence: args.fetch(:silence) { itsifile_config.fetch(:silence, false) },
|
|
118
|
+
shutdown_timeout: args.fetch(:shutdown_timeout) { itsifile_config.fetch(:shutdown_timeout, 5) },
|
|
119
|
+
hooks: if args[:hooks] && itsifile_config[:hooks]
|
|
120
|
+
args[:hooks].merge(itsifile_config[:hooks])
|
|
121
|
+
else
|
|
122
|
+
itsifile_config.fetch(
|
|
123
|
+
:hooks, args[:hooks]
|
|
124
|
+
)
|
|
125
|
+
end,
|
|
126
|
+
preload: !!preload,
|
|
127
|
+
request_timeout: itsifile_config.fetch(:request_timeout, nil),
|
|
128
|
+
header_read_timeout: args.fetch(:header_read_timeout) { itsifile_config.fetch(:header_read_timeout, nil) },
|
|
129
|
+
notify_watchers: itsifile_config.fetch(:notify_watchers, nil),
|
|
130
|
+
threads: args.fetch(:threads) { itsifile_config.fetch(:threads, 1) },
|
|
131
|
+
scheduler_threads: args.fetch(:scheduler_threads) { itsifile_config.fetch(:scheduler_threads, nil) },
|
|
132
|
+
streamable_body: args.fetch(:streamable_body) { itsifile_config.fetch(:streamable_body, false) },
|
|
133
|
+
multithreaded_reactor: args.fetch(:multithreaded_reactor) do
|
|
134
|
+
itsifile_config.fetch(:multithreaded_reactor, nil)
|
|
135
|
+
end,
|
|
136
|
+
pin_worker_cores: args.fetch(:pin_worker_cores) { itsifile_config.fetch(:pin_worker_cores, false) },
|
|
137
|
+
scheduler_class: args.fetch(:scheduler_class) { itsifile_config.fetch(:scheduler_class, nil) },
|
|
138
|
+
oob_gc_responses_threshold: args.fetch(:oob_gc_responses_threshold) do
|
|
139
|
+
itsifile_config.fetch(:oob_gc_responses_threshold, nil)
|
|
140
|
+
end,
|
|
141
|
+
ruby_thread_request_backlog_size: args.fetch(:ruby_thread_request_backlog_size) do
|
|
142
|
+
itsifile_config.fetch(:ruby_thread_request_backlog_size, nil)
|
|
143
|
+
end,
|
|
144
|
+
log_level: args.fetch(:log_level) { itsifile_config.fetch(:log_level, nil) },
|
|
145
|
+
log_format: args.fetch(:log_format) { itsifile_config.fetch(:log_format, nil) },
|
|
146
|
+
log_target: args.fetch(:log_target) { itsifile_config.fetch(:log_target, nil) },
|
|
147
|
+
log_target_filters: args.fetch(:log_target_filters) { itsifile_config.fetch(:log_target_filters, nil) },
|
|
148
|
+
pipeline_flush: itsifile_config.fetch(:pipeline_flush, true),
|
|
149
|
+
writev: itsifile_config.fetch(:writev, false),
|
|
150
|
+
max_concurrent_streams: itsifile_config.fetch(:max_concurrent_streams, nil),
|
|
151
|
+
max_local_error_reset_streams: itsifile_config.fetch(:max_local_error_reset_streams, nil),
|
|
152
|
+
max_header_list_size: itsifile_config.fetch(:max_header_list_size, 2 * 1024 * 1024),
|
|
153
|
+
max_send_buf_size: itsifile_config.fetch(:max_send_buf_size, 64 * 1024),
|
|
154
|
+
binds: args.fetch(:binds) { itsifile_config.fetch(:binds, ["http://0.0.0.0:3000"]) },
|
|
155
|
+
middleware_loader: middleware_loader,
|
|
156
|
+
listeners: args.fetch(:listeners, nil),
|
|
157
|
+
reuse_address: itsifile_config.fetch(:reuse_address, true),
|
|
158
|
+
reuse_port: itsifile_config.fetch(:reuse_port, true),
|
|
159
|
+
listen_backlog: itsifile_config.fetch(:listen_backlog, 1024),
|
|
160
|
+
nodelay: itsifile_config.fetch(:nodelay, true),
|
|
161
|
+
recv_buffer_size: itsifile_config.fetch(:recv_buffer_size, 262_144),
|
|
162
|
+
send_buffer_size: itsifile_config.fetch(:send_buffer_size, 262_144)
|
|
163
|
+
}.transform_keys(&:to_s)
|
|
164
|
+
|
|
165
|
+
[srv_config, errors_to_error_lines(errors)]
|
|
166
|
+
rescue StandardError => e
|
|
167
|
+
[{}, errors_to_error_lines([[e, e.backtrace[0]]])]
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def self.test!(cli_params)
|
|
171
|
+
config, errors = build_config(cli_params, Itsi::Server::Config.config_file_path(cli_params[:config_file]))
|
|
172
|
+
unless errors.any?
|
|
173
|
+
begin
|
|
174
|
+
config["middleware_loader"][]
|
|
175
|
+
rescue Exception => e # rubocop:disable Lint/RescueException
|
|
176
|
+
errors = [e]
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
if errors.any?
|
|
181
|
+
Itsi.log_error("Config file is invalid")
|
|
182
|
+
puts errors
|
|
183
|
+
else
|
|
184
|
+
Itsi.log_info("Config file is valid")
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def self.errors_to_error_lines(errors)
|
|
189
|
+
return unless errors
|
|
190
|
+
|
|
191
|
+
errors.flat_map do |(error, message)|
|
|
192
|
+
location = message[/(.*?):in/, 1]
|
|
193
|
+
file, lineno = location.split(":")
|
|
194
|
+
lineno = lineno.to_i
|
|
195
|
+
err_message = error.is_a?(NoMethodError) && error.respond_to?(:detailed_message) ? error.detailed_message : error.message
|
|
196
|
+
file_lines = IO.readlines(file)
|
|
197
|
+
info_lines = \
|
|
198
|
+
if error.is_a?(SyntaxError)
|
|
199
|
+
[]
|
|
200
|
+
else
|
|
201
|
+
|
|
202
|
+
([lineno - 2, 0].max...[file_lines.length, lineno.succ.succ].min).map do |currline|
|
|
203
|
+
if currline == lineno - 1
|
|
204
|
+
line = file_lines[currline][0...-1]
|
|
205
|
+
padding = line[/^\s+/]&.length || 0
|
|
206
|
+
|
|
207
|
+
[
|
|
208
|
+
" \e[31m#{currline.succ.to_s.rjust(3)} | #{line}\e[0m",
|
|
209
|
+
" | #{" " * padding}\e[33m^^^\e[0m "
|
|
210
|
+
]
|
|
211
|
+
else
|
|
212
|
+
" #{currline.succ.to_s.rjust(3)} | #{file_lines[currline][0...-1]}"
|
|
213
|
+
end
|
|
214
|
+
end.flatten
|
|
215
|
+
end
|
|
216
|
+
[
|
|
217
|
+
err_message,
|
|
218
|
+
" --> #{File.expand_path(file)}:#{lineno}",
|
|
219
|
+
*info_lines
|
|
220
|
+
]
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
# Reloads the entire process
|
|
225
|
+
# using exec, passing in any active file descriptors
|
|
226
|
+
# and previous invocation arguments
|
|
227
|
+
def self.reload_exec(listener_info)
|
|
228
|
+
if ENV["BUNDLE_BIN_PATH"]
|
|
229
|
+
exec "bundle", "exec", $PROGRAM_NAME, *@argv, "--listeners", listener_info
|
|
230
|
+
else
|
|
231
|
+
exec $PROGRAM_NAME, *@argv, "--listeners", listener_info
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
# Find config file path, if it exists.
|
|
236
|
+
def self.config_file_path(config_file_path = nil)
|
|
237
|
+
raise "Config file #{config_file_path} does not exist" if config_file_path && !File.exist?(config_file_path)
|
|
238
|
+
|
|
239
|
+
config_file_path ||= \
|
|
240
|
+
if File.exist?(ITSI_DEFAULT_CONFIG_FILE)
|
|
241
|
+
ITSI_DEFAULT_CONFIG_FILE
|
|
242
|
+
elsif File.exist?("config/#{ITSI_DEFAULT_CONFIG_FILE}")
|
|
243
|
+
"config/#{ITSI_DEFAULT_CONFIG_FILE}"
|
|
244
|
+
end
|
|
245
|
+
# Options pass through unless we've specified a config file
|
|
246
|
+
return unless File.exist?(config_file_path.to_s)
|
|
247
|
+
|
|
248
|
+
config_file_path
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
def self.pid_file_path
|
|
252
|
+
if Dir.exist?(ITSI_SERVER_PID_DIR)
|
|
253
|
+
File.join(ITSI_SERVER_PID_DIR, "itsi.pid")
|
|
254
|
+
else
|
|
255
|
+
".itsi.pid"
|
|
256
|
+
end
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
# Write a default config file, if one doesn't exist.
|
|
260
|
+
def self.write_default
|
|
261
|
+
if File.exist?(ITSI_DEFAULT_CONFIG_FILE)
|
|
262
|
+
puts "#{ITSI_DEFAULT_CONFIG_FILE} already exists."
|
|
263
|
+
return
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
default_config = IO.read("#{__dir__}/default_config/Itsi.rb")
|
|
267
|
+
|
|
268
|
+
default_config << \
|
|
269
|
+
if File.exist?("./config.ru")
|
|
270
|
+
<<~RUBY
|
|
271
|
+
# You can mount several Ruby apps as either
|
|
272
|
+
# 1. rackup files
|
|
273
|
+
# 2. inline rack apps
|
|
274
|
+
# 3. inline Ruby endpoints
|
|
275
|
+
#
|
|
276
|
+
# 1. rackup_file
|
|
277
|
+
rackup_file "./config.ru"
|
|
278
|
+
#
|
|
279
|
+
# 2. inline rack app
|
|
280
|
+
# require 'rack'
|
|
281
|
+
# run(Rack::Builder.app do
|
|
282
|
+
# use Rack::CommonLogger
|
|
283
|
+
# run ->(env) { [200, { 'content-type' => 'text/plain' }, ['OK']] }
|
|
284
|
+
# end)
|
|
285
|
+
#
|
|
286
|
+
# 3. Endpoints
|
|
287
|
+
# endpoint "/" do |req|
|
|
288
|
+
# req.ok "Hello from Itsi"
|
|
289
|
+
# end
|
|
290
|
+
RUBY
|
|
291
|
+
else
|
|
292
|
+
<<~RUBY
|
|
293
|
+
# You can mount several Ruby apps as either
|
|
294
|
+
# 1. rackup files
|
|
295
|
+
# 2. inline rack apps
|
|
296
|
+
# 3. inline Ruby endpoints
|
|
297
|
+
#
|
|
298
|
+
# 1. rackup_file
|
|
299
|
+
# Use `rackup_file` to specify the Rack app file name.
|
|
300
|
+
#
|
|
301
|
+
# 2. inline rack app
|
|
302
|
+
# require 'rack'
|
|
303
|
+
# run(Rack::Builder.app do
|
|
304
|
+
# use Rack::CommonLogger
|
|
305
|
+
# run ->(env) { [200, { 'content-type' => 'text/plain' }, ['OK']] }
|
|
306
|
+
# end)
|
|
307
|
+
#
|
|
308
|
+
# 3. Endpoint
|
|
309
|
+
endpoint "/" do |req|
|
|
310
|
+
req.ok "Hello from Itsi"
|
|
311
|
+
end
|
|
312
|
+
RUBY
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
File.open(ITSI_DEFAULT_CONFIG_FILE, "w") do |file|
|
|
316
|
+
file.write(default_config)
|
|
317
|
+
end
|
|
318
|
+
end
|
|
319
|
+
end
|
|
320
|
+
end
|
|
321
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# When you Run Itsi without a Rack app,
|
|
2
|
+
# we start a tiny little echo server, just so you can see it in action.
|
|
3
|
+
DEFAULT_INDEX = IO.read("#{__dir__}/index.html").freeze
|
|
4
|
+
DEFAULT_BINDS = ["http://0.0.0.0:3000"].freeze
|
|
5
|
+
DEFAULT_APP = lambda {
|
|
6
|
+
require "json"
|
|
7
|
+
|
|
8
|
+
Itsi::Server::RackInterface.for(lambda do |env|
|
|
9
|
+
headers, body = \
|
|
10
|
+
if env["itsi.response"].json?
|
|
11
|
+
[
|
|
12
|
+
{ "Content-Type" => "application/json" },
|
|
13
|
+
[{ "message" => "You're running on Itsi!", "rack_env" => env,
|
|
14
|
+
"version" => Itsi::Server::VERSION }.to_json]
|
|
15
|
+
]
|
|
16
|
+
else
|
|
17
|
+
[
|
|
18
|
+
{ "Content-Type" => "text/html" },
|
|
19
|
+
[
|
|
20
|
+
format(
|
|
21
|
+
DEFAULT_INDEX,
|
|
22
|
+
REQUEST_METHOD: env["REQUEST_METHOD"],
|
|
23
|
+
PATH_INFO: env["PATH_INFO"],
|
|
24
|
+
SERVER_NAME: env["SERVER_NAME"],
|
|
25
|
+
SERVER_PORT: env["SERVER_PORT"],
|
|
26
|
+
REMOTE_ADDR: env["REMOTE_ADDR"],
|
|
27
|
+
HTTP_USER_AGENT: env["HTTP_USER_AGENT"]
|
|
28
|
+
)
|
|
29
|
+
]
|
|
30
|
+
]
|
|
31
|
+
end
|
|
32
|
+
[200, headers, body]
|
|
33
|
+
end)
|
|
34
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<title>Itsi - Default</title>
|
|
7
|
+
<style>
|
|
8
|
+
:root {
|
|
9
|
+
--bg-color: #f0f2f5;
|
|
10
|
+
--text-color: #333;
|
|
11
|
+
--link-color: #0052cc;
|
|
12
|
+
}
|
|
13
|
+
*,
|
|
14
|
+
*::before,
|
|
15
|
+
*::after {
|
|
16
|
+
box-sizing: border-box;
|
|
17
|
+
}
|
|
18
|
+
body {
|
|
19
|
+
margin: 0;
|
|
20
|
+
font-family: "Helvetica Neue", Arial, sans-serif;
|
|
21
|
+
background: var(--bg-color);
|
|
22
|
+
color: var(--text-color);
|
|
23
|
+
line-height: 1.6;
|
|
24
|
+
display: flex;
|
|
25
|
+
flex-direction: column;
|
|
26
|
+
align-items: center;
|
|
27
|
+
padding: 3rem 1rem;
|
|
28
|
+
}
|
|
29
|
+
header {
|
|
30
|
+
text-align: center;
|
|
31
|
+
margin-bottom: 2rem;
|
|
32
|
+
}
|
|
33
|
+
h1 {
|
|
34
|
+
font-size: 2.5rem;
|
|
35
|
+
margin-bottom: 0.5rem;
|
|
36
|
+
}
|
|
37
|
+
p {
|
|
38
|
+
font-size: 1.5rem;
|
|
39
|
+
margin-bottom: 2rem;
|
|
40
|
+
color: #555;
|
|
41
|
+
}
|
|
42
|
+
ul.fields {
|
|
43
|
+
list-style: none;
|
|
44
|
+
padding: 0;
|
|
45
|
+
margin: 0;
|
|
46
|
+
max-width: 100%%;
|
|
47
|
+
width: 100%%;
|
|
48
|
+
}
|
|
49
|
+
ul.fields li {
|
|
50
|
+
display: flex;
|
|
51
|
+
justify-content: space-between;
|
|
52
|
+
padding: 1rem;
|
|
53
|
+
border-bottom: 1px solid #ddd;
|
|
54
|
+
}
|
|
55
|
+
ul.fields li:last-child {
|
|
56
|
+
border-bottom: none;
|
|
57
|
+
}
|
|
58
|
+
.label {
|
|
59
|
+
font-weight: bold;
|
|
60
|
+
margin-right: 1rem;
|
|
61
|
+
}
|
|
62
|
+
/* Make it expansive: let content use more horizontal space on larger screens */
|
|
63
|
+
main {
|
|
64
|
+
max-width: 1200px;
|
|
65
|
+
width: 100%%;
|
|
66
|
+
}
|
|
67
|
+
/* Responsive adjustments for small devices */
|
|
68
|
+
@media (max-width: 480px) {
|
|
69
|
+
h1 {
|
|
70
|
+
font-size: 2.5rem;
|
|
71
|
+
}
|
|
72
|
+
p {
|
|
73
|
+
font-size: 1.2rem;
|
|
74
|
+
}
|
|
75
|
+
ul.fields li {
|
|
76
|
+
padding: 0.75rem;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
</style>
|
|
80
|
+
</head>
|
|
81
|
+
<body>
|
|
82
|
+
<main>
|
|
83
|
+
<header>
|
|
84
|
+
<h1>You're running on Itsi!</h1>
|
|
85
|
+
<p>RACK environment:</p>
|
|
86
|
+
</header>
|
|
87
|
+
<ul class="fields">
|
|
88
|
+
<li>
|
|
89
|
+
<span class="label">REQUEST_METHOD:</span>
|
|
90
|
+
<span>%{REQUEST_METHOD}</span>
|
|
91
|
+
</li>
|
|
92
|
+
<li>
|
|
93
|
+
<span class="label">PATH_INFO:</span>
|
|
94
|
+
<span>%{PATH_INFO}</span>
|
|
95
|
+
</li>
|
|
96
|
+
<li>
|
|
97
|
+
<span class="label">SERVER_NAME:</span>
|
|
98
|
+
<span>%{SERVER_NAME}</span>
|
|
99
|
+
</li>
|
|
100
|
+
<li>
|
|
101
|
+
<span class="label">SERVER_PORT:</span>
|
|
102
|
+
<span>%{SERVER_PORT}</span>
|
|
103
|
+
</li>
|
|
104
|
+
<li>
|
|
105
|
+
<span class="label">REMOTE_ADDR:</span>
|
|
106
|
+
<span>%{REMOTE_ADDR}</span>
|
|
107
|
+
</li>
|
|
108
|
+
<li>
|
|
109
|
+
<span class="label">HTTP_USER_AGENT:</span>
|
|
110
|
+
<span>%{HTTP_USER_AGENT}</span>
|
|
111
|
+
</li>
|
|
112
|
+
</ul>
|
|
113
|
+
</main>
|
|
114
|
+
</body>
|
|
115
|
+
</html>
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# This is the default Itsi configuration file, installed when you run `itsi init`
|
|
4
|
+
# It contains a sane starting point for configuring your Itsi server.
|
|
5
|
+
# You can use this file in both development and production environments.
|
|
6
|
+
# Most of the options in this file can be overridden by command line options.
|
|
7
|
+
# Check out itsi -h to learn more about the command line options available to you.
|
|
8
|
+
|
|
9
|
+
env = ENV.fetch("APP_ENV") { ENV.fetch("RACK_ENV", "development") }
|
|
10
|
+
|
|
11
|
+
# Number of worker processes to spawn
|
|
12
|
+
# If more than 1, Itsi will be booted in Cluster mode
|
|
13
|
+
workers ENV["ITSI_WORKERS"]&.to_i || (env == "development" ? 1 : nil)
|
|
14
|
+
|
|
15
|
+
# Number of threads to spawn per worker process
|
|
16
|
+
# For pure CPU bound applicationss, you'll get the best results keeping this number low
|
|
17
|
+
# Setting a value of 1 is great for superficial benchmarks, but in reality
|
|
18
|
+
# it's better to set this a bit higher to allow expensive requests to get overtaken and minimize head-of-line blocking
|
|
19
|
+
threads ENV.fetch("ITSI_THREADS", 3)
|
|
20
|
+
|
|
21
|
+
# If your application is IO bound (e.g. performing a lot of proxied HTTP requests, or heavy queries etc)
|
|
22
|
+
# you can see *substantial* benefits from enabling this option.
|
|
23
|
+
# To set this option, pass a string, not a class (as we will not have loaded the class yet)
|
|
24
|
+
# E.g.
|
|
25
|
+
# `fiber_scheduler "Itsi::Scheduler"` - The default fast and light-weight scheduler that comes with Itsi
|
|
26
|
+
# `fiber_scheduler "Async::Scheduler"` - Bring your own scheduler!
|
|
27
|
+
fiber_scheduler nil
|
|
28
|
+
|
|
29
|
+
# If you bind to https, without specifying a certificate, Itsi will use a self-signed certificate.
|
|
30
|
+
# The self-signed certificate will use a CA generated for your
|
|
31
|
+
# host and stored inside `ITSI_LOCAL_CA_DIR` (Defaults to ~/.itsi)
|
|
32
|
+
# bind "https://0.0.0.0:3000"
|
|
33
|
+
# bind "https://0.0.0.0:3000?domains=dev.itsi.fyi"
|
|
34
|
+
#
|
|
35
|
+
# If you want to use let's encrypt to generate you a real certificate you
|
|
36
|
+
# and pass cert=acme and an acme_email address to generate one.
|
|
37
|
+
# bind "https://itsi.fyi?cert=acme&acme_email=admin@itsi.fyi"
|
|
38
|
+
# You can generate certificates for multiple domains at once, by passing a comma-separated list of domains
|
|
39
|
+
# bind "https://0.0.0.0?domains=foo.itsi.fyi,bar.itsi.fyi&cert=acme&acme_email=admin@itsi.fyi"
|
|
40
|
+
#
|
|
41
|
+
# If you already have a certificate you can specify it using the cert and key parameters
|
|
42
|
+
# bind "https://itsi.fyi?cert=/path/to/cert.pem&key=/path/to/key.pem"
|
|
43
|
+
#
|
|
44
|
+
# You can also bind to a unix socket or a tls unix socket. E.g.
|
|
45
|
+
# bind "unix:///tmp/itsi.sock"
|
|
46
|
+
# bind "tls:///tmp/itsi.secure.sock"
|
|
47
|
+
|
|
48
|
+
if env == "development"
|
|
49
|
+
bind "http://localhost:3000"
|
|
50
|
+
else
|
|
51
|
+
bind "https://0.0.0.0?domains=#{ENV["PRODUCTION_DOMAINS"]}&cert=acme&acme_email=admin@itsi.fyi"
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# If you want to preload the application, set preload to true
|
|
55
|
+
# to load the entire rack-app defined in rack_file_name before forking.
|
|
56
|
+
# Alternatively, you can preload just a specific set of gems in a group in your gemfile,
|
|
57
|
+
# by providing the group name here.
|
|
58
|
+
# E.g.
|
|
59
|
+
#
|
|
60
|
+
# preload :preload # Load gems inside the preload group
|
|
61
|
+
# preload false # Don't preload.
|
|
62
|
+
#
|
|
63
|
+
# If you want to be able to perform zero-downtime deploys using a single itsi process,
|
|
64
|
+
# you should disable preloads, so that the application is loaded fresh each time a new worker boots
|
|
65
|
+
preload true
|
|
66
|
+
|
|
67
|
+
# Set the maximum memory limit for each worker process in bytes
|
|
68
|
+
# When this limit is reached, the worker will be gracefully restarted.
|
|
69
|
+
# Only one worker is restarted at a time to ensure we don't take down
|
|
70
|
+
# all of them at once, if they reach the threshold simultaneously.
|
|
71
|
+
worker_memory_limit 1024 * 1024 * 1024
|
|
72
|
+
|
|
73
|
+
# You can provide an optional block of code to run, when a worker hits its memory threshold
|
|
74
|
+
# (Use this to send yourself an alert,
|
|
75
|
+
# write metrics to disk etc. etc.)
|
|
76
|
+
after_memory_limit_reached do |pid|
|
|
77
|
+
puts "Worker #{pid} has reached its memory threshold and will restart"
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Do clean up of any non-threadsafe resources before forking a new worker here.
|
|
81
|
+
before_fork {}
|
|
82
|
+
|
|
83
|
+
# Reinitialize any non-threadsafe resources after forking a new worker here.
|
|
84
|
+
after_fork {}
|
|
85
|
+
|
|
86
|
+
# Shutdown timeout
|
|
87
|
+
# Number of seconds to wait for workers to gracefully shutdown before killing them.
|
|
88
|
+
shutdown_timeout 5
|
|
89
|
+
|
|
90
|
+
# Set this to false for application environments that require rack.input to be a rewindable body
|
|
91
|
+
# (like Rails). For rack applications that can stream inputs, you can set this to true for a more
|
|
92
|
+
# memory-efficient approach.
|
|
93
|
+
stream_body false
|
|
94
|
+
|
|
95
|
+
# OOB GC responses threshold
|
|
96
|
+
# Specifies how frequently OOB gc should be triggered during periods where there is a gap in queued requests.
|
|
97
|
+
# Setting this too low can substantially worsen performance
|
|
98
|
+
oob_gc_responses_threshold 512
|
|
99
|
+
|
|
100
|
+
# Log level
|
|
101
|
+
# Set this to one of the following values: debug, info, warn, error, fatal
|
|
102
|
+
# Can also be set using the ITSI_LOG environment variable
|
|
103
|
+
log_level :info
|
|
104
|
+
|
|
105
|
+
# Log Format
|
|
106
|
+
# Set this to be either :plain or :json. If you leave it blank Itsi will try
|
|
107
|
+
# and auto-detect the format based on the TTY environment.
|
|
108
|
+
log_format :plain
|