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.
Files changed (451) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +8 -0
  3. data/Cargo.lock +4452 -0
  4. data/Cargo.toml +11 -0
  5. data/Rakefile +57 -0
  6. data/exe/itsi +193 -0
  7. data/ext/itsi_acme/Cargo.toml +86 -0
  8. data/ext/itsi_acme/examples/high_level.rs +63 -0
  9. data/ext/itsi_acme/examples/high_level_warp.rs +52 -0
  10. data/ext/itsi_acme/examples/low_level.rs +87 -0
  11. data/ext/itsi_acme/examples/low_level_axum.rs +66 -0
  12. data/ext/itsi_acme/src/acceptor.rs +81 -0
  13. data/ext/itsi_acme/src/acme.rs +354 -0
  14. data/ext/itsi_acme/src/axum.rs +86 -0
  15. data/ext/itsi_acme/src/cache.rs +39 -0
  16. data/ext/itsi_acme/src/caches/boxed.rs +80 -0
  17. data/ext/itsi_acme/src/caches/composite.rs +69 -0
  18. data/ext/itsi_acme/src/caches/dir.rs +106 -0
  19. data/ext/itsi_acme/src/caches/mod.rs +11 -0
  20. data/ext/itsi_acme/src/caches/no.rs +78 -0
  21. data/ext/itsi_acme/src/caches/test.rs +136 -0
  22. data/ext/itsi_acme/src/config.rs +172 -0
  23. data/ext/itsi_acme/src/https_helper.rs +69 -0
  24. data/ext/itsi_acme/src/incoming.rs +142 -0
  25. data/ext/itsi_acme/src/jose.rs +161 -0
  26. data/ext/itsi_acme/src/lib.rs +142 -0
  27. data/ext/itsi_acme/src/resolver.rs +59 -0
  28. data/ext/itsi_acme/src/state.rs +424 -0
  29. data/ext/itsi_error/Cargo.lock +368 -0
  30. data/ext/itsi_error/Cargo.toml +12 -0
  31. data/ext/itsi_error/src/lib.rs +140 -0
  32. data/ext/itsi_instrument_entry/Cargo.toml +15 -0
  33. data/ext/itsi_instrument_entry/src/lib.rs +31 -0
  34. data/ext/itsi_rb_helpers/Cargo.lock +355 -0
  35. data/ext/itsi_rb_helpers/Cargo.toml +11 -0
  36. data/ext/itsi_rb_helpers/src/heap_value.rs +139 -0
  37. data/ext/itsi_rb_helpers/src/lib.rs +232 -0
  38. data/ext/itsi_scheduler/Cargo.toml +24 -0
  39. data/ext/itsi_scheduler/src/itsi_scheduler/io_helpers.rs +56 -0
  40. data/ext/itsi_scheduler/src/itsi_scheduler/io_waiter.rs +44 -0
  41. data/ext/itsi_scheduler/src/itsi_scheduler/timer.rs +44 -0
  42. data/ext/itsi_scheduler/src/itsi_scheduler.rs +320 -0
  43. data/ext/itsi_scheduler/src/lib.rs +39 -0
  44. data/ext/itsi_server/Cargo.lock +2956 -0
  45. data/ext/itsi_server/Cargo.toml +94 -0
  46. data/ext/itsi_server/extconf.rb +11 -0
  47. data/ext/itsi_server/src/default_responses/html/401.html +68 -0
  48. data/ext/itsi_server/src/default_responses/html/403.html +68 -0
  49. data/ext/itsi_server/src/default_responses/html/404.html +68 -0
  50. data/ext/itsi_server/src/default_responses/html/413.html +71 -0
  51. data/ext/itsi_server/src/default_responses/html/429.html +68 -0
  52. data/ext/itsi_server/src/default_responses/html/500.html +71 -0
  53. data/ext/itsi_server/src/default_responses/html/502.html +71 -0
  54. data/ext/itsi_server/src/default_responses/html/503.html +68 -0
  55. data/ext/itsi_server/src/default_responses/html/504.html +69 -0
  56. data/ext/itsi_server/src/default_responses/html/index.html +238 -0
  57. data/ext/itsi_server/src/default_responses/json/401.json +6 -0
  58. data/ext/itsi_server/src/default_responses/json/403.json +6 -0
  59. data/ext/itsi_server/src/default_responses/json/404.json +6 -0
  60. data/ext/itsi_server/src/default_responses/json/413.json +6 -0
  61. data/ext/itsi_server/src/default_responses/json/429.json +6 -0
  62. data/ext/itsi_server/src/default_responses/json/500.json +6 -0
  63. data/ext/itsi_server/src/default_responses/json/502.json +6 -0
  64. data/ext/itsi_server/src/default_responses/json/503.json +6 -0
  65. data/ext/itsi_server/src/default_responses/json/504.json +6 -0
  66. data/ext/itsi_server/src/default_responses/mod.rs +14 -0
  67. data/ext/itsi_server/src/env.rs +43 -0
  68. data/ext/itsi_server/src/lib.rs +154 -0
  69. data/ext/itsi_server/src/prelude.rs +2 -0
  70. data/ext/itsi_server/src/ruby_types/itsi_body_proxy/big_bytes.rs +116 -0
  71. data/ext/itsi_server/src/ruby_types/itsi_body_proxy/mod.rs +149 -0
  72. data/ext/itsi_server/src/ruby_types/itsi_grpc_call.rs +346 -0
  73. data/ext/itsi_server/src/ruby_types/itsi_grpc_response_stream/mod.rs +265 -0
  74. data/ext/itsi_server/src/ruby_types/itsi_http_request.rs +399 -0
  75. data/ext/itsi_server/src/ruby_types/itsi_http_response.rs +447 -0
  76. data/ext/itsi_server/src/ruby_types/itsi_server/file_watcher.rs +545 -0
  77. data/ext/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +650 -0
  78. data/ext/itsi_server/src/ruby_types/itsi_server.rs +102 -0
  79. data/ext/itsi_server/src/ruby_types/mod.rs +48 -0
  80. data/ext/itsi_server/src/server/binds/bind.rs +204 -0
  81. data/ext/itsi_server/src/server/binds/bind_protocol.rs +37 -0
  82. data/ext/itsi_server/src/server/binds/listener.rs +485 -0
  83. data/ext/itsi_server/src/server/binds/mod.rs +4 -0
  84. data/ext/itsi_server/src/server/binds/tls/locked_dir_cache.rs +132 -0
  85. data/ext/itsi_server/src/server/binds/tls.rs +278 -0
  86. data/ext/itsi_server/src/server/byte_frame.rs +32 -0
  87. data/ext/itsi_server/src/server/frame_stream.rs +143 -0
  88. data/ext/itsi_server/src/server/http_message_types.rs +230 -0
  89. data/ext/itsi_server/src/server/io_stream.rs +128 -0
  90. data/ext/itsi_server/src/server/lifecycle_event.rs +12 -0
  91. data/ext/itsi_server/src/server/middleware_stack/middleware.rs +170 -0
  92. data/ext/itsi_server/src/server/middleware_stack/middlewares/allow_list.rs +63 -0
  93. data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_api_key.rs +94 -0
  94. data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_basic.rs +93 -0
  95. data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_jwt.rs +343 -0
  96. data/ext/itsi_server/src/server/middleware_stack/middlewares/cache_control.rs +151 -0
  97. data/ext/itsi_server/src/server/middleware_stack/middlewares/compression.rs +329 -0
  98. data/ext/itsi_server/src/server/middleware_stack/middlewares/cors.rs +300 -0
  99. data/ext/itsi_server/src/server/middleware_stack/middlewares/csp.rs +193 -0
  100. data/ext/itsi_server/src/server/middleware_stack/middlewares/deny_list.rs +64 -0
  101. data/ext/itsi_server/src/server/middleware_stack/middlewares/error_response/default_responses.rs +188 -0
  102. data/ext/itsi_server/src/server/middleware_stack/middlewares/error_response.rs +168 -0
  103. data/ext/itsi_server/src/server/middleware_stack/middlewares/etag.rs +183 -0
  104. data/ext/itsi_server/src/server/middleware_stack/middlewares/header_interpretation.rs +82 -0
  105. data/ext/itsi_server/src/server/middleware_stack/middlewares/intrusion_protection.rs +209 -0
  106. data/ext/itsi_server/src/server/middleware_stack/middlewares/log_requests.rs +133 -0
  107. data/ext/itsi_server/src/server/middleware_stack/middlewares/max_body.rs +47 -0
  108. data/ext/itsi_server/src/server/middleware_stack/middlewares/mod.rs +122 -0
  109. data/ext/itsi_server/src/server/middleware_stack/middlewares/proxy.rs +407 -0
  110. data/ext/itsi_server/src/server/middleware_stack/middlewares/rate_limit.rs +155 -0
  111. data/ext/itsi_server/src/server/middleware_stack/middlewares/redirect.rs +54 -0
  112. data/ext/itsi_server/src/server/middleware_stack/middlewares/request_headers.rs +54 -0
  113. data/ext/itsi_server/src/server/middleware_stack/middlewares/response_headers.rs +51 -0
  114. data/ext/itsi_server/src/server/middleware_stack/middlewares/ruby_app.rs +138 -0
  115. data/ext/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs +269 -0
  116. data/ext/itsi_server/src/server/middleware_stack/middlewares/static_response.rs +62 -0
  117. data/ext/itsi_server/src/server/middleware_stack/middlewares/string_rewrite.rs +218 -0
  118. data/ext/itsi_server/src/server/middleware_stack/middlewares/token_source.rs +31 -0
  119. data/ext/itsi_server/src/server/middleware_stack/mod.rs +381 -0
  120. data/ext/itsi_server/src/server/mod.rs +14 -0
  121. data/ext/itsi_server/src/server/process_worker.rs +247 -0
  122. data/ext/itsi_server/src/server/redirect_type.rs +26 -0
  123. data/ext/itsi_server/src/server/request_job.rs +11 -0
  124. data/ext/itsi_server/src/server/serve_strategy/acceptor.rs +100 -0
  125. data/ext/itsi_server/src/server/serve_strategy/cluster_mode.rs +411 -0
  126. data/ext/itsi_server/src/server/serve_strategy/mod.rs +31 -0
  127. data/ext/itsi_server/src/server/serve_strategy/single_mode.rs +449 -0
  128. data/ext/itsi_server/src/server/signal.rs +129 -0
  129. data/ext/itsi_server/src/server/size_limited_incoming.rs +107 -0
  130. data/ext/itsi_server/src/server/thread_worker.rs +504 -0
  131. data/ext/itsi_server/src/services/cache_store.rs +74 -0
  132. data/ext/itsi_server/src/services/itsi_http_service.rs +270 -0
  133. data/ext/itsi_server/src/services/mime_types.rs +2896 -0
  134. data/ext/itsi_server/src/services/mod.rs +6 -0
  135. data/ext/itsi_server/src/services/password_hasher.rs +89 -0
  136. data/ext/itsi_server/src/services/rate_limiter.rs +609 -0
  137. data/ext/itsi_server/src/services/static_file_server.rs +1400 -0
  138. data/ext/itsi_tracing/Cargo.lock +274 -0
  139. data/ext/itsi_tracing/Cargo.toml +17 -0
  140. data/ext/itsi_tracing/src/lib.rs +370 -0
  141. data/lib/itsi/http_request/response_status_shortcodes.rb +76 -0
  142. data/lib/itsi/http_request.rb +228 -0
  143. data/lib/itsi/http_response.rb +49 -0
  144. data/lib/itsi/passfile.rb +108 -0
  145. data/lib/itsi/rack_env_pool.rb +49 -0
  146. data/lib/itsi/server/3.1/itsi_server.so +0 -0
  147. data/lib/itsi/server/3.2/itsi_server.so +0 -0
  148. data/lib/itsi/server/3.3/itsi_server.so +0 -0
  149. data/lib/itsi/server/3.4/itsi_server.so +0 -0
  150. data/lib/itsi/server/4.0/itsi_server.so +0 -0
  151. data/lib/itsi/server/config/config_helpers.rb +116 -0
  152. data/lib/itsi/server/config/dsl.rb +208 -0
  153. data/lib/itsi/server/config/known_paths/KitchensinkDirectories.txt +2346 -0
  154. data/lib/itsi/server/config/known_paths/Randomfiles.txt +24 -0
  155. data/lib/itsi/server/config/known_paths/UnixDotfiles.txt +52 -0
  156. data/lib/itsi/server/config/known_paths/backdoors/ASP_CommonBackdoors.txt +29 -0
  157. data/lib/itsi/server/config/known_paths/backdoors/bot_control_panels.txt +1668 -0
  158. data/lib/itsi/server/config/known_paths/backdoors/shells.txt +1167 -0
  159. data/lib/itsi/server/config/known_paths/cgi/CGI_HTTP_POST.txt +7 -0
  160. data/lib/itsi/server/config/known_paths/cgi/CGI_HTTP_POST_Windows.txt +6 -0
  161. data/lib/itsi/server/config/known_paths/cgi/CGI_Microsoft.txt +79 -0
  162. data/lib/itsi/server/config/known_paths/cgi/CGI_XPlatform.txt +3948 -0
  163. data/lib/itsi/server/config/known_paths/cms/README.md +5 -0
  164. data/lib/itsi/server/config/known_paths/cms/drupal_plugins.txt +6320 -0
  165. data/lib/itsi/server/config/known_paths/cms/drupal_themes.txt +828 -0
  166. data/lib/itsi/server/config/known_paths/cms/joomla_plugins.txt +224 -0
  167. data/lib/itsi/server/config/known_paths/cms/joomla_themes.txt +30 -0
  168. data/lib/itsi/server/config/known_paths/cms/php-nuke.txt +2142 -0
  169. data/lib/itsi/server/config/known_paths/cms/wordpress.txt +1566 -0
  170. data/lib/itsi/server/config/known_paths/cms/wp_common_theme_files.txt +46 -0
  171. data/lib/itsi/server/config/known_paths/cms/wp_plugins.txt +13366 -0
  172. data/lib/itsi/server/config/known_paths/cms/wp_plugins_full.txt +68662 -0
  173. data/lib/itsi/server/config/known_paths/cms/wp_plugins_top225.txt +225 -0
  174. data/lib/itsi/server/config/known_paths/cms/wp_themes.readme +12 -0
  175. data/lib/itsi/server/config/known_paths/cms/wp_themes.txt +7336 -0
  176. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/3CharExtBrute.txt +17576 -0
  177. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/CommonWebExtensions.txt +80 -0
  178. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Backup.txt +14 -0
  179. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Common.txt +865 -0
  180. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Compressed.txt +186 -0
  181. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Mostcommon.txt +30 -0
  182. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Skipfish.txt +93 -0
  183. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/WordlistSkipfish.txt +1918 -0
  184. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/copy_of.txt +8 -0
  185. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-directories-lowercase.txt +56180 -0
  186. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-directories.txt +62290 -0
  187. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-extensions-lowercase.txt +2367 -0
  188. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-extensions.txt +2450 -0
  189. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-files-lowercase.txt +35323 -0
  190. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-files.txt +37037 -0
  191. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-words-lowercase.txt +107982 -0
  192. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-words.txt +119600 -0
  193. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-directories-lowercase.txt +26593 -0
  194. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-directories.txt +30009 -0
  195. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-extensions-lowercase.txt +1233 -0
  196. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-extensions.txt +1289 -0
  197. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-files-lowercase.txt +16243 -0
  198. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-files.txt +17128 -0
  199. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-words-lowercase.txt +56293 -0
  200. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-words.txt +63087 -0
  201. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-directories-lowercase.txt +17776 -0
  202. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-directories.txt +20122 -0
  203. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-extensions-lowercase.txt +914 -0
  204. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-extensions.txt +963 -0
  205. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-files-lowercase.txt +10848 -0
  206. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-files.txt +11424 -0
  207. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-words-lowercase.txt +38267 -0
  208. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-words.txt +43003 -0
  209. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/spanish.txt +445 -0
  210. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/test_demo.txt +36 -0
  211. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/upload_variants.txt +44 -0
  212. data/lib/itsi/server/config/known_paths/login-file-locations/Logins.txt +71 -0
  213. data/lib/itsi/server/config/known_paths/login-file-locations/cfm.txt +294 -0
  214. data/lib/itsi/server/config/known_paths/login-file-locations/html.txt +295 -0
  215. data/lib/itsi/server/config/known_paths/login-file-locations/jsp.txt +294 -0
  216. data/lib/itsi/server/config/known_paths/login-file-locations/php.txt +294 -0
  217. data/lib/itsi/server/config/known_paths/login-file-locations/windows-asp.txt +294 -0
  218. data/lib/itsi/server/config/known_paths/login-file-locations/windows-aspx.txt +294 -0
  219. data/lib/itsi/server/config/known_paths/password-file-locations/Passwords.txt +47 -0
  220. data/lib/itsi/server/config/known_paths/php/PHP.txt +30 -0
  221. data/lib/itsi/server/config/known_paths/php/PHP_CommonBackdoors.txt +5 -0
  222. data/lib/itsi/server/config/known_paths/proxy-conf.txt +31 -0
  223. data/lib/itsi/server/config/known_paths/tftp.txt +79 -0
  224. data/lib/itsi/server/config/known_paths/webservers-appservers/ADFS.txt +86 -0
  225. data/lib/itsi/server/config/known_paths/webservers-appservers/AdobeXML.txt +16 -0
  226. data/lib/itsi/server/config/known_paths/webservers-appservers/Apache.txt +101 -0
  227. data/lib/itsi/server/config/known_paths/webservers-appservers/ApacheTomcat.txt +47 -0
  228. data/lib/itsi/server/config/known_paths/webservers-appservers/Apache_Axis.txt +16 -0
  229. data/lib/itsi/server/config/known_paths/webservers-appservers/ColdFusion.txt +111 -0
  230. data/lib/itsi/server/config/known_paths/webservers-appservers/FatwireCMS.txt +390 -0
  231. data/lib/itsi/server/config/known_paths/webservers-appservers/Frontpage.txt +38 -0
  232. data/lib/itsi/server/config/known_paths/webservers-appservers/HP_System_Mgmt_Homepage.txt +239 -0
  233. data/lib/itsi/server/config/known_paths/webservers-appservers/HTTP_POST_Microsoft.txt +2 -0
  234. data/lib/itsi/server/config/known_paths/webservers-appservers/Hyperion.txt +578 -0
  235. data/lib/itsi/server/config/known_paths/webservers-appservers/IIS.txt +187 -0
  236. data/lib/itsi/server/config/known_paths/webservers-appservers/JBoss.txt +5 -0
  237. data/lib/itsi/server/config/known_paths/webservers-appservers/JRun.txt +13 -0
  238. data/lib/itsi/server/config/known_paths/webservers-appservers/JavaServlets_Common.txt +3 -0
  239. data/lib/itsi/server/config/known_paths/webservers-appservers/Joomla_exploitable.txt +1937 -0
  240. data/lib/itsi/server/config/known_paths/webservers-appservers/LotusNotes.txt +206 -0
  241. data/lib/itsi/server/config/known_paths/webservers-appservers/Netware.txt +18 -0
  242. data/lib/itsi/server/config/known_paths/webservers-appservers/Oracle9i.txt +60 -0
  243. data/lib/itsi/server/config/known_paths/webservers-appservers/OracleAppServer.txt +192 -0
  244. data/lib/itsi/server/config/known_paths/webservers-appservers/README.md +6 -0
  245. data/lib/itsi/server/config/known_paths/webservers-appservers/Ruby_Rails.txt +121 -0
  246. data/lib/itsi/server/config/known_paths/webservers-appservers/SAP.txt +463 -0
  247. data/lib/itsi/server/config/known_paths/webservers-appservers/Sharepoint.txt +1707 -0
  248. data/lib/itsi/server/config/known_paths/webservers-appservers/SiteMinder.txt +19 -0
  249. data/lib/itsi/server/config/known_paths/webservers-appservers/SunAppServerGlassfish.txt +51 -0
  250. data/lib/itsi/server/config/known_paths/webservers-appservers/SuniPlanet.txt +35 -0
  251. data/lib/itsi/server/config/known_paths/webservers-appservers/Vignette.txt +73 -0
  252. data/lib/itsi/server/config/known_paths/webservers-appservers/Weblogic.txt +160 -0
  253. data/lib/itsi/server/config/known_paths/webservers-appservers/Websphere.txt +366 -0
  254. data/lib/itsi/server/config/known_paths/wellknown-rfc5785.txt +30 -0
  255. data/lib/itsi/server/config/known_paths.rb +24 -0
  256. data/lib/itsi/server/config/middleware/_index.md +56 -0
  257. data/lib/itsi/server/config/middleware/allow_list.md +46 -0
  258. data/lib/itsi/server/config/middleware/allow_list.rb +42 -0
  259. data/lib/itsi/server/config/middleware/auth_api_key.md +90 -0
  260. data/lib/itsi/server/config/middleware/auth_api_key.rb +51 -0
  261. data/lib/itsi/server/config/middleware/auth_basic.md +45 -0
  262. data/lib/itsi/server/config/middleware/auth_basic.rb +46 -0
  263. data/lib/itsi/server/config/middleware/auth_jwt.md +82 -0
  264. data/lib/itsi/server/config/middleware/auth_jwt.rb +38 -0
  265. data/lib/itsi/server/config/middleware/cache_control.md +78 -0
  266. data/lib/itsi/server/config/middleware/cache_control.rb +45 -0
  267. data/lib/itsi/server/config/middleware/cidr_to_regex.rb +50 -0
  268. data/lib/itsi/server/config/middleware/compression.md +50 -0
  269. data/lib/itsi/server/config/middleware/compression.rb +37 -0
  270. data/lib/itsi/server/config/middleware/cors.md +93 -0
  271. data/lib/itsi/server/config/middleware/cors.rb +32 -0
  272. data/lib/itsi/server/config/middleware/csp.md +37 -0
  273. data/lib/itsi/server/config/middleware/csp.rb +44 -0
  274. data/lib/itsi/server/config/middleware/deny_list.md +45 -0
  275. data/lib/itsi/server/config/middleware/deny_list.rb +42 -0
  276. data/lib/itsi/server/config/middleware/endpoint/_index.md +160 -0
  277. data/lib/itsi/server/config/middleware/endpoint/controller.md +186 -0
  278. data/lib/itsi/server/config/middleware/endpoint/controller.rb +33 -0
  279. data/lib/itsi/server/config/middleware/endpoint/delete.md +12 -0
  280. data/lib/itsi/server/config/middleware/endpoint/delete.rb +43 -0
  281. data/lib/itsi/server/config/middleware/endpoint/endpoint.rb +106 -0
  282. data/lib/itsi/server/config/middleware/endpoint/get.md +12 -0
  283. data/lib/itsi/server/config/middleware/endpoint/get.rb +43 -0
  284. data/lib/itsi/server/config/middleware/endpoint/http_request.md +44 -0
  285. data/lib/itsi/server/config/middleware/endpoint/http_response.md +39 -0
  286. data/lib/itsi/server/config/middleware/endpoint/patch.md +12 -0
  287. data/lib/itsi/server/config/middleware/endpoint/patch.rb +43 -0
  288. data/lib/itsi/server/config/middleware/endpoint/post.md +12 -0
  289. data/lib/itsi/server/config/middleware/endpoint/post.rb +43 -0
  290. data/lib/itsi/server/config/middleware/endpoint/put.md +12 -0
  291. data/lib/itsi/server/config/middleware/endpoint/put.rb +43 -0
  292. data/lib/itsi/server/config/middleware/endpoint/schemas.md +122 -0
  293. data/lib/itsi/server/config/middleware/error_response.md +74 -0
  294. data/lib/itsi/server/config/middleware/error_response.rb +36 -0
  295. data/lib/itsi/server/config/middleware/etag.md +55 -0
  296. data/lib/itsi/server/config/middleware/etag.rb +25 -0
  297. data/lib/itsi/server/config/middleware/grpc.md +170 -0
  298. data/lib/itsi/server/config/middleware/grpc.rb +54 -0
  299. data/lib/itsi/server/config/middleware/intrusion_protection.md +124 -0
  300. data/lib/itsi/server/config/middleware/intrusion_protection.rb +61 -0
  301. data/lib/itsi/server/config/middleware/location.md +107 -0
  302. data/lib/itsi/server/config/middleware/location.rb +103 -0
  303. data/lib/itsi/server/config/middleware/log_requests.md +67 -0
  304. data/lib/itsi/server/config/middleware/log_requests.rb +31 -0
  305. data/lib/itsi/server/config/middleware/max_body.md +18 -0
  306. data/lib/itsi/server/config/middleware/max_body.rb +21 -0
  307. data/lib/itsi/server/config/middleware/proxy.md +62 -0
  308. data/lib/itsi/server/config/middleware/proxy.rb +42 -0
  309. data/lib/itsi/server/config/middleware/rackup_file.md +72 -0
  310. data/lib/itsi/server/config/middleware/rackup_file.rb +43 -0
  311. data/lib/itsi/server/config/middleware/rate_limit.md +126 -0
  312. data/lib/itsi/server/config/middleware/rate_limit.rb +34 -0
  313. data/lib/itsi/server/config/middleware/rate_limit_store.rb +25 -0
  314. data/lib/itsi/server/config/middleware/redirect.md +55 -0
  315. data/lib/itsi/server/config/middleware/redirect.rb +25 -0
  316. data/lib/itsi/server/config/middleware/request_headers.md +34 -0
  317. data/lib/itsi/server/config/middleware/request_headers.rb +24 -0
  318. data/lib/itsi/server/config/middleware/response_headers.md +33 -0
  319. data/lib/itsi/server/config/middleware/response_headers.rb +25 -0
  320. data/lib/itsi/server/config/middleware/run.md +79 -0
  321. data/lib/itsi/server/config/middleware/run.rb +45 -0
  322. data/lib/itsi/server/config/middleware/static_assets.md +113 -0
  323. data/lib/itsi/server/config/middleware/static_assets.rb +99 -0
  324. data/lib/itsi/server/config/middleware/static_response.md +44 -0
  325. data/lib/itsi/server/config/middleware/static_response.rb +30 -0
  326. data/lib/itsi/server/config/middleware/string_rewrite.md +81 -0
  327. data/lib/itsi/server/config/middleware/token_source.rb +32 -0
  328. data/lib/itsi/server/config/middleware.rb +13 -0
  329. data/lib/itsi/server/config/option.rb +13 -0
  330. data/lib/itsi/server/config/options/_index.md +41 -0
  331. data/lib/itsi/server/config/options/auto_reload_config.md +13 -0
  332. data/lib/itsi/server/config/options/auto_reload_config.rb +46 -0
  333. data/lib/itsi/server/config/options/bind.md +71 -0
  334. data/lib/itsi/server/config/options/bind.rb +26 -0
  335. data/lib/itsi/server/config/options/certificates.md +65 -0
  336. data/lib/itsi/server/config/options/daemonize.md +14 -0
  337. data/lib/itsi/server/config/options/daemonize.rb +19 -0
  338. data/lib/itsi/server/config/options/fiber_scheduler.md +34 -0
  339. data/lib/itsi/server/config/options/fiber_scheduler.rb +21 -0
  340. data/lib/itsi/server/config/options/header_read_timeout.md +17 -0
  341. data/lib/itsi/server/config/options/header_read_timeout.rb +19 -0
  342. data/lib/itsi/server/config/options/hooks/_index.md +11 -0
  343. data/lib/itsi/server/config/options/hooks/after_fork.md +13 -0
  344. data/lib/itsi/server/config/options/hooks/after_fork.rb +28 -0
  345. data/lib/itsi/server/config/options/hooks/after_memory_limit_reached.md +14 -0
  346. data/lib/itsi/server/config/options/hooks/after_memory_limit_reached.rb +28 -0
  347. data/lib/itsi/server/config/options/hooks/after_start.md +12 -0
  348. data/lib/itsi/server/config/options/hooks/after_start.rb +28 -0
  349. data/lib/itsi/server/config/options/hooks/before_fork.md +13 -0
  350. data/lib/itsi/server/config/options/hooks/before_fork.rb +28 -0
  351. data/lib/itsi/server/config/options/hooks/before_restart.md +12 -0
  352. data/lib/itsi/server/config/options/hooks/before_restart.rb +28 -0
  353. data/lib/itsi/server/config/options/hooks/before_shutdown.md +12 -0
  354. data/lib/itsi/server/config/options/hooks/before_shutdown.rb +28 -0
  355. data/lib/itsi/server/config/options/include.md +21 -0
  356. data/lib/itsi/server/config/options/include.rb +41 -0
  357. data/lib/itsi/server/config/options/listen_backlog.md +11 -0
  358. data/lib/itsi/server/config/options/listen_backlog.rb +19 -0
  359. data/lib/itsi/server/config/options/log_format.md +18 -0
  360. data/lib/itsi/server/config/options/log_format.rb +19 -0
  361. data/lib/itsi/server/config/options/log_level.md +34 -0
  362. data/lib/itsi/server/config/options/log_level.rb +20 -0
  363. data/lib/itsi/server/config/options/log_target.md +38 -0
  364. data/lib/itsi/server/config/options/log_target.rb +19 -0
  365. data/lib/itsi/server/config/options/log_target_filters.md +17 -0
  366. data/lib/itsi/server/config/options/log_target_filters.rb +19 -0
  367. data/lib/itsi/server/config/options/multithreaded_reactor.md +27 -0
  368. data/lib/itsi/server/config/options/multithreaded_reactor.rb +24 -0
  369. data/lib/itsi/server/config/options/nodelay.md +16 -0
  370. data/lib/itsi/server/config/options/nodelay.rb +19 -0
  371. data/lib/itsi/server/config/options/oob_gc_responses_threshold.md +19 -0
  372. data/lib/itsi/server/config/options/oob_gc_responses_threshold.rb +18 -0
  373. data/lib/itsi/server/config/options/pin_worker_cores.md +17 -0
  374. data/lib/itsi/server/config/options/pin_worker_cores.rb +19 -0
  375. data/lib/itsi/server/config/options/pipeline_flush.md +16 -0
  376. data/lib/itsi/server/config/options/pipeline_flush.rb +19 -0
  377. data/lib/itsi/server/config/options/preload.md +21 -0
  378. data/lib/itsi/server/config/options/preload.rb +18 -0
  379. data/lib/itsi/server/config/options/recv_buffer_size.md +15 -0
  380. data/lib/itsi/server/config/options/recv_buffer_size.rb +19 -0
  381. data/lib/itsi/server/config/options/redirect_http_to_https.md +21 -0
  382. data/lib/itsi/server/config/options/redirect_http_to_https.rb +30 -0
  383. data/lib/itsi/server/config/options/request_timeout.md +23 -0
  384. data/lib/itsi/server/config/options/request_timeout.rb +19 -0
  385. data/lib/itsi/server/config/options/reuse_address.md +18 -0
  386. data/lib/itsi/server/config/options/reuse_address.rb +19 -0
  387. data/lib/itsi/server/config/options/reuse_port.md +18 -0
  388. data/lib/itsi/server/config/options/reuse_port.rb +17 -0
  389. data/lib/itsi/server/config/options/ruby_thread_request_backlog_size.md +18 -0
  390. data/lib/itsi/server/config/options/ruby_thread_request_backlog_size.rb +19 -0
  391. data/lib/itsi/server/config/options/scheduler_threads.md +41 -0
  392. data/lib/itsi/server/config/options/scheduler_threads.rb +17 -0
  393. data/lib/itsi/server/config/options/send_buffer_size.md +15 -0
  394. data/lib/itsi/server/config/options/send_buffer_size.rb +19 -0
  395. data/lib/itsi/server/config/options/shutdown_timeout.md +17 -0
  396. data/lib/itsi/server/config/options/shutdown_timeout.rb +19 -0
  397. data/lib/itsi/server/config/options/stream_body.md +32 -0
  398. data/lib/itsi/server/config/options/stream_body.rb +18 -0
  399. data/lib/itsi/server/config/options/threads.md +44 -0
  400. data/lib/itsi/server/config/options/threads.rb +17 -0
  401. data/lib/itsi/server/config/options/watch.md +16 -0
  402. data/lib/itsi/server/config/options/watch.rb +28 -0
  403. data/lib/itsi/server/config/options/worker_memory_limit.md +22 -0
  404. data/lib/itsi/server/config/options/worker_memory_limit.rb +18 -0
  405. data/lib/itsi/server/config/options/workers.md +42 -0
  406. data/lib/itsi/server/config/options/workers.rb +17 -0
  407. data/lib/itsi/server/config/options/writev.md +25 -0
  408. data/lib/itsi/server/config/options/writev.rb +19 -0
  409. data/lib/itsi/server/config/typed_struct.rb +239 -0
  410. data/lib/itsi/server/config.rb +321 -0
  411. data/lib/itsi/server/default_app/default_app.rb +34 -0
  412. data/lib/itsi/server/default_app/index.html +115 -0
  413. data/lib/itsi/server/default_config/Itsi.rb +108 -0
  414. data/lib/itsi/server/grpc/grpc_call.rb +247 -0
  415. data/lib/itsi/server/grpc/grpc_interface.rb +106 -0
  416. data/lib/itsi/server/grpc/reflection/v1/reflection_pb.rb +26 -0
  417. data/lib/itsi/server/grpc/reflection/v1/reflection_services_pb.rb +122 -0
  418. data/lib/itsi/server/native_extension.rb +34 -0
  419. data/lib/itsi/server/rack/handler/itsi.rb +29 -0
  420. data/lib/itsi/server/rack_interface.rb +109 -0
  421. data/lib/itsi/server/route_tester.rb +159 -0
  422. data/lib/itsi/server/scheduler_interface.rb +23 -0
  423. data/lib/itsi/server/scheduler_mode.rb +10 -0
  424. data/lib/itsi/server/signal_trap.rb +33 -0
  425. data/lib/itsi/server/typed_handlers/param_parser.rb +221 -0
  426. data/lib/itsi/server/typed_handlers/source_parser.rb +58 -0
  427. data/lib/itsi/server/typed_handlers.rb +25 -0
  428. data/lib/itsi/server/version.rb +7 -0
  429. data/lib/itsi/server.rb +288 -0
  430. data/lib/itsi/standard_headers.rb +86 -0
  431. data/lib/ruby_lsp/itsi/addon.rb +128 -0
  432. data/lib/shell_completions/completions.rb +26 -0
  433. data/vendor/rb-sys-build/.cargo-ok +1 -0
  434. data/vendor/rb-sys-build/.cargo_vcs_info.json +6 -0
  435. data/vendor/rb-sys-build/Cargo.lock +294 -0
  436. data/vendor/rb-sys-build/Cargo.toml +71 -0
  437. data/vendor/rb-sys-build/Cargo.toml.orig +32 -0
  438. data/vendor/rb-sys-build/LICENSE-APACHE +190 -0
  439. data/vendor/rb-sys-build/LICENSE-MIT +21 -0
  440. data/vendor/rb-sys-build/src/bindings/sanitizer.rs +185 -0
  441. data/vendor/rb-sys-build/src/bindings/stable_api.rs +247 -0
  442. data/vendor/rb-sys-build/src/bindings/wrapper.h +71 -0
  443. data/vendor/rb-sys-build/src/bindings.rs +280 -0
  444. data/vendor/rb-sys-build/src/cc.rs +421 -0
  445. data/vendor/rb-sys-build/src/lib.rs +12 -0
  446. data/vendor/rb-sys-build/src/rb_config/flags.rs +101 -0
  447. data/vendor/rb-sys-build/src/rb_config/library.rs +132 -0
  448. data/vendor/rb-sys-build/src/rb_config/search_path.rs +57 -0
  449. data/vendor/rb-sys-build/src/rb_config.rs +906 -0
  450. data/vendor/rb-sys-build/src/utils.rs +53 -0
  451. metadata +569 -0
@@ -0,0 +1,113 @@
1
+ ---
2
+ title: Static Assets
3
+ url: /middleware/static_assets
4
+ ---
5
+
6
+ The Static Assets middleware serves files from a specified root directory. It is capable of optimized delivery of static content such as HTML, CSS, JavaScript, images, as well as large assets, such as video files using streaming bodies and range requests.
7
+ It can auto-index directories for simple directory listings.
8
+
9
+ ## Key Features
10
+ - **Auto Indexing**: Optionally generate directory listings when an index file is missing.
11
+ - **HTML Fallback**: When enabled, the middleware attempts to serve a file with a `.html` extension if the requested file is not found.
12
+ - **In-Memory Caching**: Files under a certain size (and up to a configurable count) are cached in memory for performance.
13
+ - **Custom Headers**: User-supplied headers (e.g., for caching) can be added to responses.
14
+ - **Relative Path Processing**: When enabled, the middleware rewrites request paths relative to a configured base path.
15
+ - **Partial Content**: Supports Range requests for serving partial file content.
16
+
17
+ ## Example
18
+
19
+ ```ruby {filename=Itsi.rb}
20
+ static_assets root_dir: "./"
21
+ ```
22
+
23
+ ### Directory Index
24
+ #### HTML
25
+
26
+ {{< card link="/" title="Static File Server" image="/directory_listing.jpg" subtitle="Static File Listing, Powered by Itsi." method="Resize" options="500x q80 webp" >}}
27
+
28
+ #### JSON
29
+ Directory indexes also support responding in JSON format. E.g.
30
+
31
+ `curl -H "Accept: application/json" http://0.0.0.0`
32
+
33
+ ```json
34
+ {
35
+ "directory": ".",
36
+ "items": [
37
+ {
38
+ "is_dir": false,
39
+ "modified": "2025-04-22 04:21:43",
40
+ "name": "Gemfile",
41
+ "path": "Gemfile",
42
+ "size": "42 B"
43
+ },
44
+ {
45
+ "is_dir": false,
46
+ "modified": "2025-04-22 04:21:48",
47
+ "name": "Gemfile.lock",
48
+ "path": "Gemfile%2Elock",
49
+ "size": "463 B"
50
+ },
51
+ {
52
+ "is_dir": false,
53
+ "modified": "2025-04-22 02:46:45",
54
+ "name": "Itsi.rb",
55
+ "path": "Itsi%2Erb",
56
+ "size": "80 B"
57
+ }
58
+ ],
59
+ "title": "Directory listing for ."
60
+ }
61
+ ```
62
+
63
+ ## Configuration Options
64
+
65
+
66
+ | Option | Description |
67
+ |--------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
68
+ | **`root_dir`** (Default ".") | The relative or absolute disk path where static files reside. |
69
+ | **`not_found_behavior`** (Default `{error: "not_found"}`) | Determines what to do when a file isn’t found. See [Not Found Behavior](#not-found-behavior) below. |
70
+ | **`auto_index`** (Default `false`) | If <code>true</code>, directory listings are automatically generated when no index file is found. Defaults to <code>false</code>. |
71
+ | **`try_html_extension`** (Default `true`) | If <code>true</code>, when the requested file isn’t found, the middleware attempts to serve the same path with a <code>.html</code> extension. Defaults to <code>true</code>. |
72
+ | **`max_file_size_in_memory`** (Default `1048576`) | Maximum file size (in bytes) for caching files in memory. Files larger than this will be served from disk. Defaults to <code>1048576</code> (1 MB). |
73
+ | **`max_files_in_memory`** (Default `100`) | Maximum number of files to cache in memory. Defaults to <code>100</code>. |
74
+ | **`file_check_interval`** (Default `1`) | Max time (in seconds) a file stays in cache before the file-system is checked for modifications. Defaults to <code>1</code>. |
75
+ | **`headers`** (Default `nil`) | A hash of additional headers to include in responses (e.g. <code>{"Cache-Control" => "max-age=3600"}</code>). |
76
+ | **`allowed_extensions`** (Default `[]`) | An array of permitted file extensions (e.g. <code>["html", "css", "js", "png", "jpg"]</code>). If a requested file’s extension isn’t in this list, it won’t be served. An empty list (default) means all extensions are allowed. |
77
+ | **`relative_path`** (Default `true`) | If <code>true</code>, the effective file lookup path is computed relative to the base path at which the middleware is mounted (See [location](/middleware/location) to understand mounting options). Defaults to <code>true</code>. |
78
+ | **`serve_hidden_files`** (Default `false`) | If <code>false</code>, files whose names start with a dot (".") are not served. Defaults to <code>false</code>. |
79
+
80
+
81
+ ## Not Found Behavior
82
+ The static assets middleware supports many configuration options when a file is not found.
83
+ * **`fallthrough`**: The request is *not* handled by this middleware and is instead served by the next middleware in the chain. The option is given as a string. E.g.
84
+ ```ruby
85
+ error_response: "fallthrough"
86
+ ```
87
+ * **`index`**: Unsatisfiable requests instead result in serving an index file. (Useful for SPAs with client-side routing).
88
+ ```ruby
89
+ error_response: {index: "./path/to/index.html" }
90
+ ```
91
+ * **`redirect`**: Unsatisfiable requests are redirected. Options for type are the same as defined for the [redirect](/middleware/redirect) middleware.
92
+ ```ruby
93
+ error_response: {redirect: { to: "http://example.com/redirect_path", type: "permanent" }}
94
+ ```
95
+ * **`error`**: Provide an overridden error response. See [`error_response`](/middleware/error_response) for details.
96
+ e.g.
97
+ ```ruby
98
+ error_response: {error: "not_found"}
99
+ ```
100
+
101
+ ```ruby
102
+ error_response: \
103
+ {
104
+ error:
105
+ {
106
+ code: 404,
107
+ plaintext: {inline: "File not found"},
108
+ json: {inline: "{\"message\": \"File not found\"}"},
109
+ html: {file: "./path/to/not_found.html"},
110
+ default: "plaintext"
111
+ }
112
+ }
113
+ ```
@@ -0,0 +1,99 @@
1
+ module Itsi
2
+ class Server
3
+ module Config
4
+ class StaticAssets < Middleware
5
+
6
+ insert_text <<~SNIPPET
7
+ static_assets \\
8
+ root_dir: "${1|./,/var/www,|}",
9
+ not_found_behavior: ${2|"fallthrough",{index: "index.html"},{error: "not_found"}|},
10
+ auto_index: ${3|true,false|},
11
+ try_html_extension: ${4|true,false|},
12
+ max_file_size_in_memory: ${5|1048576,2097152|},
13
+ max_files_in_memory: ${6|100,500,1000|},
14
+ file_check_interval: ${7|1,60,120|},
15
+ headers: { ${8|,"Cache-Control" => "max-age=3600",|} },
16
+ allowed_extensions: ${9|%w[html css js png jpg],[]|},
17
+ relative_path: ${10|true,false|},
18
+ serve_hidden_files: ${11|true,false|}
19
+ SNIPPET
20
+
21
+ detail "Serves static files from a designated directory with options for auto indexing, in-memory caching, "\
22
+ "and custom header support. Supports relative path rewriting and file range requests."
23
+
24
+ ErrorResponse = TypedStruct.new do
25
+ {
26
+ error: Type(ErrorResponseDef) & Required()
27
+ }
28
+ end
29
+
30
+ IndexResponse = TypedStruct.new do
31
+ {
32
+ index: Type(String) & Required()
33
+ }
34
+ end
35
+
36
+ RedirectTarget = TypedStruct.new do
37
+ {
38
+ to: (Required() & Type(String)),
39
+ type: Enum(["permanent", "temporary", "found", "moved_permanently"]).default("moved_permanently")
40
+ }
41
+ end
42
+
43
+ RedirectResponse = TypedStruct.new do
44
+ {
45
+ redirect: Type(RedirectTarget) & Required()
46
+ }
47
+ end
48
+
49
+ schema do
50
+ {
51
+ root_dir: (Type(String) & Required()).default("./"),
52
+ not_found_behavior: Or(
53
+ Enum(%w[fallthrough index redirect internal_server_error]),
54
+ Type(IndexResponse),
55
+ Type(RedirectResponse),
56
+ Type(ErrorResponse)
57
+ ).default({error: "not_found"}),
58
+ allowed_extensions: (Array(Type(String)) & Required()).default([]),
59
+ auto_index: Bool().default(false),
60
+ try_html_extension: Bool().default(true),
61
+ max_file_size_in_memory: Type(Integer).default(1048576),
62
+ max_files_in_memory: Type(Integer).default(100),
63
+ file_check_interval: Type(Integer).default(1),
64
+ headers: Hash(Type(String), Type(String)).default({}),
65
+ relative_path: Bool().default(true),
66
+ serve_hidden_files: Bool().default(false)
67
+ }
68
+ end
69
+
70
+ def build!
71
+ root_dir = @params[:root_dir] || "."
72
+
73
+ if !File.exist?(root_dir)
74
+ raise "Warning: static_assets root_dir '#{root_dir}' does not exist!"
75
+ elsif !File.directory?(root_dir)
76
+ raise "Warning: static_assets root_dir '#{root_dir}' is not a directory!"
77
+ end
78
+
79
+ @params[:relative_path] = true unless @params.key?(:relative_path)
80
+ @params[:allowed_extensions] ||= []
81
+
82
+ if @params[:try_html_extension] && @params[:allowed_extensions].include?("html")
83
+ @params[:allowed_extensions] << ""
84
+ end
85
+
86
+ if @params[:allowed_extensions].any? && @params[:auto_index]
87
+ @params[:allowed_extensions] |= ["html"]
88
+ @params[:allowed_extensions] |= [""]
89
+ end
90
+
91
+ @params[:base_path] = "^(?<base_path>#{location.paths_from_parent.gsub(/\.\*\)$/,")")}).*$"
92
+ params = @params
93
+
94
+ location.middleware[:static_assets] = params
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,44 @@
1
+ ---
2
+ title: Static Response
3
+ url: /middleware/static_response
4
+ ---
5
+
6
+ The **Static Response** middleware returns a fixed HTTP response immediately, without invoking any downstream handlers. You configure the status code, headers, and body content once, and every request is answered identically.
7
+
8
+ ## Key Features
9
+ - **Fixed Status Code**: Return any valid HTTP status (200–599).
10
+ - **Custom Headers**: Pre‑set arbitrary headers (e.g. Content‑Type, Cache‑Control).
11
+ - **Arbitrary Body**: Supply text or binary data as the response payload.
12
+ - **Zero Routing**: Always handles the request; bypasses your application logic entirely.
13
+
14
+ ## Example Usage
15
+ ```ruby {filename=Itsi.rb}
16
+ static_response \
17
+ code: 200,
18
+ headers: [
19
+ ["Content-Type", "application/json"],
20
+ ["Cache-Control", "max-age=60"]
21
+ ],
22
+ body: "{\"message\":\"OK\"}"
23
+ ```
24
+
25
+ Every request now returns HTTP 200 with JSON body `{"message":"OK"}` and the prescribed headers.
26
+
27
+ ## Configuration Options
28
+
29
+ | Option | Type | Description |
30
+ |-----------|-----------------------------|-------------------------------------------------------------------------------------------------|
31
+ | **code** | Integer | HTTP status code to return (e.g. 200, 404, 500). |
32
+ | **headers**| Array of [String,String] | List of header name/value pairs to include. |
33
+ | **body** | Array<UInt8> | Raw response body bytes. For text, use `string.bytes`. |
34
+
35
+ ```ruby
36
+ # Example in Itsi.rb
37
+ static_response \
38
+ code: 404,
39
+ headers: [
40
+ ["Content-Type", "text/plain"],
41
+ ["X-Error", "NotFound"]
42
+ ],
43
+ body: "Page not found"
44
+ ```
@@ -0,0 +1,30 @@
1
+ module Itsi
2
+ class Server
3
+ module Config
4
+ class StaticResponse < Middleware
5
+
6
+ insert_text <<~SNIPPET
7
+ static_response \\
8
+ code: ${1|200,404,500|},
9
+ headers: [${2|%w[content-type text/plain],%w[cache-control max-age=60]|}],
10
+ body: ${3|"OK", "Not Found"|}
11
+ SNIPPET
12
+
13
+ detail "Immediately return a fixed HTTP response with code, headers, and body."
14
+
15
+ schema do
16
+ {
17
+ code: (Type(Integer) & Required()),
18
+ headers: Array(Array(Type(String), Type(String))).default([]),
19
+ body: Type(String).default("")
20
+ }
21
+ end
22
+
23
+ def initialize(location, params)
24
+ super
25
+ @params[:body] = @params[:body].bytes
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,81 @@
1
+ ---
2
+ title: String Rewrites
3
+ url: /middleware/string_rewrites
4
+ next: faqs/
5
+ ---
6
+
7
+ The String Rewrite mechanism is used when configuring Itsi for
8
+ * [Reverse Proxying](/middleware/proxy)
9
+ * [Redirects](/middleware/redirect)
10
+ * [Logging](/middleware/log_requests)
11
+ * [Request Headers](/middleware/request_headers)
12
+ * [Response Headers](/middleware/response_headers)
13
+
14
+ It allows you to create dynamic strings from a template by combining literal text with placeholders. Placeholders (denoted using curly braces: `{}`) are replaced at runtime with data derived from the HTTP request, response, or context.
15
+
16
+ Modifiers can be appended after a pipe | to transform the substituted value.
17
+
18
+ ## Modifiers
19
+
20
+ After a placeholder name, add |<modifier>:<arg> (or for replace, |replace:<from>,<to>). Available modifiers:
21
+
22
+ `strip_prefix:<text>` If the substituted value starts with <text>, remove that prefix.
23
+
24
+ `strip_suffix:<text>` If the substituted value ends with <text>, remove that suffix.
25
+
26
+ `replace:<from>,<to>` Replace all occurrences of <from> in the substituted value with <to>.
27
+
28
+ Modifiers are applied in the order they appear. You can chain multiple modifiers by repeating the |<modifier>:<arg> syntax (e.g. `{path|strip_prefix:/rails|replace:old,new}`).
29
+
30
+ ### Rewriting a Request
31
+
32
+ The following placeholders are supported:
33
+
34
+ - **`request_id`**: A short unique identifier for the request.
35
+ - **`request_id_full`**: The full request identifier.
36
+ - **`method`**: The HTTP request method (e.g., GET, POST).
37
+ - **`path`**: The URL path of the request.
38
+ - **`addr`**: The client IP address.
39
+ - **`host`**: The host portion of the URL (defaults to `localhost` if unspecified).
40
+ - **`path_and_query`**: The combination of the URL path and query string.
41
+ - **`query`**: The query string (prepended with a `?` if non-empty).
42
+ - **`port`**: The port number (defaulting to `80` if not available).
43
+ - **`start_time`**: The formatted start time of the request.
44
+ - **`<Header-Name>`**: Any existing response header. For example `{Content-Type}` or `{Set-Cookie}` will be replaced with its current value.
45
+
46
+ The mechanism also allows any available matching regex capture from routes defined in the [location](/middleware/location) block.
47
+ If no match is found, otherwise, the placeholder remains unchanged (i.e. it is rendered as `{placeholder_name}`).
48
+
49
+ ## Rewriting a Response
50
+
51
+ When you use String Rewrite in `response_headers`, you can refer to built‑in response fields **and** any header in the outgoing response:
52
+
53
+ - **`status`**: The HTTP status code (e.g., `200`, `404`).
54
+ - **`response_time`**: The computed response time, formatted (e.g., `12.345ms`).
55
+ - **`<Header-Name>`**: Any existing response header. For example `{Content-Type}` or `{Set-Cookie}` will be replaced with its current value.
56
+
57
+ If a header placeholder does not exist on the response, it will render as `{Header-Name}`.
58
+
59
+ ## Example Templates
60
+
61
+ ### Reverse Proxying
62
+
63
+ When acting as a reverse proxy, you might want to forward the request to a backend service. For example, if your backend service expects the complete path and query string appended to its URL, you could use:
64
+
65
+ ```ruby
66
+ "https://backend.example.com/api{path}{query}"
67
+ ```
68
+
69
+ For an incoming request to `/v1/resource?x=1`, this template rewrites the target URL to:
70
+ `https://backend.example.com/api/v1/resource?x=1`
71
+
72
+ ### Redirects
73
+
74
+ For redirect middleware, a common use case is to guide clients from an old URL to a new one. For instance:
75
+
76
+ ```ruby
77
+ "https://new.example.com{path}?source=redirect"
78
+ ```
79
+
80
+ If a request comes in to `/old-section?foo=bar`, the rewrite produces:
81
+ `https://new.example.com/old-section?source=redirect`
@@ -0,0 +1,32 @@
1
+ module Itsi
2
+ class Server
3
+ module Config
4
+
5
+ HeaderSource = TypedStruct.new do
6
+ {
7
+ name: Type(String) & Required(),
8
+ prefix: Type(String)
9
+ }
10
+ end
11
+
12
+ HeaderSourceOuter = TypedStruct.new do
13
+ {
14
+ header: Type(HeaderSource)
15
+ }
16
+ end
17
+
18
+ QuerySource = TypedStruct.new do
19
+ {
20
+ query: Type(String) & Required()
21
+ }
22
+ end
23
+
24
+ TokenSource = TypedStruct.new do
25
+ Or(
26
+ Type(HeaderSourceOuter),
27
+ Type(QuerySource)
28
+ )
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,13 @@
1
+ module Itsi
2
+ class Server
3
+ module Config
4
+ class Middleware
5
+ include ConfigHelpers
6
+
7
+ def build!
8
+ location.middleware[self.class.middleware_name] = @params
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Itsi
2
+ class Server
3
+ module Config
4
+ class Option
5
+ include ConfigHelpers
6
+
7
+ def build!
8
+ location.options[self.class.option_name] = @params
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,41 @@
1
+ ---
2
+ title: Options
3
+ type: docs
4
+ next: auto_reload_config/
5
+ url: /options
6
+ prev: configuration/
7
+ cascade:
8
+ type: docs
9
+ weight: 1
10
+ ---
11
+
12
+ Most of Itsi's capabilities are unlocked via the Itsi.rb config file.
13
+ The config file uses a simple DSL, where you can write plain Ruby to define your application's configuration.
14
+ For the best development experience, be sure to use [RubyLSP](https://shopify.github.io/ruby-lsp/) for snippets, autocomplete and documentation, right in your editor.
15
+
16
+ {{< details title="An example Itsi.rb file:" >}}
17
+
18
+
19
+ ```ruby {filename="Itsi.rb"}
20
+ workers 2
21
+
22
+ threads 2
23
+
24
+ fiber_scheduler true
25
+
26
+ auth_basic realm: "Restricted Area", credentials_file: "./credentials.txt"
27
+
28
+ auto_reload_config! # Auto-reload the server configuration each time it changes.
29
+
30
+ location "/app*" do
31
+ rate_limit requests: 3, seconds: 5
32
+ rackup_file "config.ru"
33
+ end
34
+
35
+ location "/inline*" do
36
+ get "/" do |req|
37
+ req.ok "Hello, World!"
38
+ end
39
+ end
40
+ ```
41
+ {{< /details >}}
@@ -0,0 +1,13 @@
1
+ ---
2
+ title: Auto Reload Config
3
+ url: /options/auto_reload_config
4
+ prev: options/
5
+ ---
6
+
7
+ Auto reload config is a feature that allows the server to automatically reload the configuration file when it is modified. This feature is useful when you want to make changes to the configuration file without having to restart the server.
8
+
9
+ To opt in to config auto reloading, add the following line to your configuration file:
10
+
11
+ ```ruby {filename=Itsi.rb}
12
+ auto_reload_config!
13
+ ```
@@ -0,0 +1,46 @@
1
+ module Itsi
2
+ class Server
3
+ module Config
4
+ class AutoReloadConfig < Option
5
+ insert_text <<~SNIPPET
6
+ auto_reload_config! # Auto-reload the server configuration each time it changes.
7
+ SNIPPET
8
+
9
+ detail "Auto-reload the server configuration each time it changes."
10
+
11
+ def self.option_name
12
+ :auto_reload_config!
13
+ end
14
+
15
+ def build!
16
+ return if @auto_reloading
17
+
18
+ src = caller.find { |l| !(l =~ %r{lib/itsi/server/config}) }.split(":").first
19
+
20
+ location.instance_eval do
21
+ return if @auto_reloading
22
+
23
+ if @included
24
+ @included.each do |file|
25
+ next if "#{file}" == src
26
+
27
+ if ENV["BUNDLE_BIN_PATH"]
28
+ watch "#{file}", [%w[bundle exec itsi restart]]
29
+ else
30
+ watch "#{file}", [%w[itsi restart]]
31
+ end
32
+ end
33
+ end
34
+ @auto_reloading = true
35
+
36
+ if ENV["BUNDLE_BIN_PATH"]
37
+ watch src, [%w[bundle exec itsi restart]]
38
+ else
39
+ watch src, [%w[itsi restart]]
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,71 @@
1
+ ---
2
+ title: Bind
3
+ url: /options/bind
4
+ ---
5
+
6
+ The **Bind** option instructs Itsi on which network interfaces to listen on.
7
+ It supports various protocols and formats to allow flexible binding to TCP/IP addresses or Unix sockets, with optional TLS configuration.
8
+ You can bind to multiple interfaces at once.
9
+
10
+ ## Bind Formats
11
+
12
+ You can specify the bind address as a URI. Common formats include:
13
+
14
+ - **TCP/HTTP:**
15
+ ```ruby
16
+ bind "http://0.0.0.0:3000"
17
+ ```
18
+ Listens on all interfaces on port 3000 using plain HTTP.
19
+
20
+ - **TCP/HTTPS:**
21
+ ```ruby
22
+ bind "https://0.0.0.0:3000?cert=/path/to/cert.pem&key=/path/to/key.pem"
23
+ ```
24
+ Listens on all interfaces on port 3000 using HTTPS.
25
+ TLS options (e.g. certificates) can be provided via query parameters. You can also use `cert=acme` with additional ACME parameters to enable automatic certificate retrieval.
26
+ E.g.
27
+
28
+ ```ruby
29
+ bind "https://0.0.0.0:3000?cert=acme&acme_email=example@example.com&domains=domain1.com,domain2.com"
30
+ ```
31
+
32
+ - **Unix Socket:**
33
+ ```ruby
34
+ bind "unix:///tmp/itsi.sock"
35
+ ```
36
+ Listens using a Unix domain socket.
37
+
38
+ - **TLS over Unix Socket:**
39
+ ```ruby
40
+ bind "tls:///tmp/itsi.sock"
41
+ ```
42
+ Listens using a Unix socket while enabling TLS.
43
+
44
+ ## Configuration File
45
+
46
+ In your configuration file (typically `Itsi.rb`), specify the bind option using the `bind` function.
47
+
48
+ ## Examples
49
+
50
+ ```ruby {filename="Itsi.rb"}
51
+ # Bind to all interfaces on port 3000 with HTTP:
52
+ bind "http://0.0.0.0:3000"
53
+ ```
54
+
55
+ ```ruby {filename="Itsi.rb"}
56
+ # Bind to all interfaces on port 3000 with HTTPS using certificate files:
57
+ bind "https://0.0.0.0:3000?cert=/path/to/cert.pem&key=/path/to/key.pem"
58
+ ```
59
+
60
+ ```ruby {filename="Itsi.rb"}
61
+ # Bind to a Unix socket:
62
+ bind "unix:///tmp/itsi.sock"
63
+ ```
64
+
65
+ ## Command Line
66
+
67
+ Bind addresses can also be specified from the command line via the `-b` or `--bind` option:
68
+
69
+ ```bash
70
+ itsi -b "http://0.0.0.0:3000" -b "https://0.0.0.0:3001"
71
+ ```
@@ -0,0 +1,26 @@
1
+ module Itsi
2
+ class Server
3
+ module Config
4
+ class Bind < Option
5
+
6
+ insert_text <<~SNIPPET
7
+ bind "${1|http://0.0.0.0:3000,https://0.0.0.0:3000,http://0.0.0.0,https://0.0.0.0,unix:///tmp/itsi.sock,tls:///tmp/itsi.sock,https://0.0.0.0?cert=/path/to/cert.pem&key=/path/to/key.pem,https://0.0.0.0?cert=acme&domains=domain.com&acme_email=user@example.com,https://0.0.0.0:3001?domains=devdomain.com,http://0.0.0.0:9292,http://0.0.0.0:8080,https://0.0.0.0:8443|}"
8
+ SNIPPET
9
+
10
+ detail "Bind the server to a specific address and port."
11
+
12
+ schema do
13
+ Type(String) & Required()
14
+ end
15
+
16
+ def initialize(location, params={})
17
+ super
18
+ end
19
+
20
+ def build!
21
+ (@location.options[:binds] ||= []) << @params
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end