itsi 0.1.19 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (645) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/Cargo.lock +942 -242
  4. data/LICENSE.txt +698 -0
  5. data/README.md +77 -54
  6. data/Rakefile +9 -5
  7. data/crates/itsi_acme/.gitignore +4 -0
  8. data/crates/itsi_acme/Cargo.toml +86 -0
  9. data/crates/itsi_acme/LICENSE-APACHE +201 -0
  10. data/crates/itsi_acme/LICENSE-MIT +23 -0
  11. data/crates/itsi_acme/README.md +9 -0
  12. data/crates/itsi_acme/examples/high_level.rs +63 -0
  13. data/crates/itsi_acme/examples/high_level_warp.rs +52 -0
  14. data/crates/itsi_acme/examples/low_level.rs +87 -0
  15. data/crates/itsi_acme/examples/low_level_axum.rs +66 -0
  16. data/crates/itsi_acme/src/acceptor.rs +81 -0
  17. data/crates/itsi_acme/src/acme.rs +354 -0
  18. data/crates/itsi_acme/src/axum.rs +86 -0
  19. data/crates/itsi_acme/src/cache.rs +39 -0
  20. data/crates/itsi_acme/src/caches/boxed.rs +80 -0
  21. data/crates/itsi_acme/src/caches/composite.rs +69 -0
  22. data/crates/itsi_acme/src/caches/dir.rs +106 -0
  23. data/crates/itsi_acme/src/caches/mod.rs +11 -0
  24. data/crates/itsi_acme/src/caches/no.rs +78 -0
  25. data/crates/itsi_acme/src/caches/test.rs +136 -0
  26. data/crates/itsi_acme/src/config.rs +172 -0
  27. data/crates/itsi_acme/src/https_helper.rs +69 -0
  28. data/crates/itsi_acme/src/incoming.rs +142 -0
  29. data/crates/itsi_acme/src/jose.rs +161 -0
  30. data/crates/itsi_acme/src/lib.rs +142 -0
  31. data/crates/itsi_acme/src/resolver.rs +59 -0
  32. data/crates/itsi_acme/src/state.rs +424 -0
  33. data/crates/itsi_rb_helpers/src/lib.rs +4 -3
  34. data/crates/itsi_scheduler/Cargo.toml +1 -1
  35. data/crates/itsi_scheduler/src/itsi_scheduler.rs +8 -2
  36. data/crates/itsi_scheduler/src/lib.rs +1 -0
  37. data/crates/itsi_server/Cargo.toml +3 -3
  38. data/crates/itsi_server/src/lib.rs +2 -1
  39. data/crates/itsi_server/src/ruby_types/itsi_http_request.rs +20 -3
  40. data/crates/itsi_server/src/ruby_types/itsi_server/file_watcher.rs +11 -3
  41. data/crates/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +255 -65
  42. data/crates/itsi_server/src/ruby_types/itsi_server.rs +3 -0
  43. data/crates/itsi_server/src/server/binds/bind.rs +3 -0
  44. data/crates/itsi_server/src/server/binds/listener.rs +44 -32
  45. data/crates/itsi_server/src/server/binds/tls/locked_dir_cache.rs +2 -2
  46. data/crates/itsi_server/src/server/binds/tls.rs +14 -6
  47. data/crates/itsi_server/src/server/middleware_stack/middleware.rs +33 -28
  48. data/crates/itsi_server/src/server/middleware_stack/middlewares/allow_list.rs +12 -5
  49. data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_api_key.rs +8 -1
  50. data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_basic.rs +9 -1
  51. data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_jwt.rs +95 -37
  52. data/crates/itsi_server/src/server/middleware_stack/middlewares/cache_control.rs +11 -2
  53. data/crates/itsi_server/src/server/middleware_stack/middlewares/compression.rs +39 -12
  54. data/crates/itsi_server/src/server/middleware_stack/middlewares/cors.rs +36 -27
  55. data/crates/itsi_server/src/server/middleware_stack/middlewares/csp.rs +193 -0
  56. data/crates/itsi_server/src/server/middleware_stack/middlewares/deny_list.rs +12 -3
  57. data/crates/itsi_server/src/server/middleware_stack/middlewares/error_response/default_responses.rs +74 -72
  58. data/crates/itsi_server/src/server/middleware_stack/middlewares/error_response.rs +15 -1
  59. data/crates/itsi_server/src/server/middleware_stack/middlewares/etag.rs +11 -8
  60. data/crates/itsi_server/src/server/middleware_stack/middlewares/intrusion_protection.rs +19 -11
  61. data/crates/itsi_server/src/server/middleware_stack/middlewares/log_requests.rs +5 -5
  62. data/crates/itsi_server/src/server/middleware_stack/middlewares/max_body.rs +2 -2
  63. data/crates/itsi_server/src/server/middleware_stack/middlewares/mod.rs +31 -2
  64. data/crates/itsi_server/src/server/middleware_stack/middlewares/proxy.rs +17 -20
  65. data/crates/itsi_server/src/server/middleware_stack/middlewares/rate_limit.rs +19 -8
  66. data/crates/itsi_server/src/server/middleware_stack/middlewares/redirect.rs +16 -37
  67. data/crates/itsi_server/src/server/middleware_stack/middlewares/request_headers.rs +22 -12
  68. data/crates/itsi_server/src/server/middleware_stack/middlewares/response_headers.rs +26 -11
  69. data/crates/itsi_server/src/server/middleware_stack/middlewares/ruby_app.rs +3 -3
  70. data/crates/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs +9 -2
  71. data/crates/itsi_server/src/server/middleware_stack/middlewares/string_rewrite.rs +14 -4
  72. data/crates/itsi_server/src/server/middleware_stack/middlewares/token_source.rs +19 -0
  73. data/crates/itsi_server/src/server/middleware_stack/mod.rs +69 -35
  74. data/crates/itsi_server/src/server/mod.rs +1 -0
  75. data/crates/itsi_server/src/server/redirect_type.rs +26 -0
  76. data/crates/itsi_server/src/server/serve_strategy/cluster_mode.rs +30 -18
  77. data/crates/itsi_server/src/server/serve_strategy/single_mode.rs +77 -17
  78. data/crates/itsi_server/src/server/signal.rs +1 -0
  79. data/crates/itsi_server/src/server/size_limited_incoming.rs +6 -0
  80. data/crates/itsi_server/src/server/thread_worker.rs +6 -2
  81. data/crates/itsi_server/src/services/itsi_http_service.rs +20 -2
  82. data/crates/itsi_server/src/services/rate_limiter.rs +15 -4
  83. data/crates/itsi_server/src/services/static_file_server.rs +63 -47
  84. data/crates/itsi_tracing/src/lib.rs +80 -29
  85. data/docker/Dockerfile +12 -0
  86. data/docs/content/_index.md +17 -10
  87. data/docs/content/acknowledgements/_index.md +46 -0
  88. data/docs/content/configuration/_index.md +101 -0
  89. data/docs/content/contact/_index.md +14 -0
  90. data/docs/content/faqs/_index.md +29 -0
  91. data/docs/content/features/_index.md +291 -0
  92. data/docs/content/getting_started/_index.md +73 -0
  93. data/docs/content/getting_started/local_development.md +100 -0
  94. data/docs/content/getting_started/logging.md +23 -0
  95. data/docs/content/getting_started/running_itsi_in_production.md +26 -0
  96. data/docs/content/getting_started/signals.md +38 -0
  97. data/docs/content/itsi-server-100.png +0 -0
  98. data/docs/content/itsi_scheduler/_index.md +106 -0
  99. data/docs/content/itsi_scheduler/itsi-scheduler-100.png +0 -0
  100. data/docs/content/ruby-lsp.png +0 -0
  101. data/docs/content/ruby.svg +948 -0
  102. data/docs/content/utilities/_index.md +13 -0
  103. data/docs/content/utilities/config_file_testing.md +17 -0
  104. data/docs/content/utilities/passfile_generator.md +41 -0
  105. data/docs/content/utilities/route_testing.md +27 -0
  106. data/docs/content/utilities/secrets_management.md +30 -0
  107. data/docs/data/icons.yaml +949 -0
  108. data/docs/hugo.yaml +27 -28
  109. data/fairytale.txt +33 -0
  110. data/gems/scheduler/Cargo.lock +47 -47
  111. data/gems/scheduler/README.md +52 -24
  112. data/gems/scheduler/Rakefile +0 -4
  113. data/gems/scheduler/itsi-scheduler-100.png +0 -0
  114. data/gems/scheduler/lib/itsi/scheduler/version.rb +1 -1
  115. data/gems/scheduler/lib/itsi/scheduler.rb +9 -4
  116. data/gems/scheduler/test/test_active_record.rb +12 -7
  117. data/gems/server/Cargo.lock +950 -239
  118. data/gems/server/README.md +2 -0
  119. data/gems/server/Rakefile +0 -4
  120. data/gems/server/exe/itsi +16 -5
  121. data/gems/server/lib/itsi/http_request/response_status_shortcodes.rb +2 -0
  122. data/gems/server/lib/itsi/http_request.rb +40 -9
  123. data/gems/server/lib/itsi/http_response.rb +2 -1
  124. data/gems/server/lib/itsi/passfile.rb +0 -1
  125. data/gems/server/lib/itsi/server/config/config_helpers.rb +105 -0
  126. data/gems/server/lib/itsi/server/config/dsl.rb +44 -411
  127. data/gems/server/lib/itsi/server/config/known_paths/KitchensinkDirectories.txt +2346 -0
  128. data/gems/server/lib/itsi/server/config/known_paths/Randomfiles.txt +24 -0
  129. data/gems/server/lib/itsi/server/config/known_paths/UnixDotfiles.txt +52 -0
  130. data/gems/server/lib/itsi/server/config/known_paths/backdoors/ASP_CommonBackdoors.txt +29 -0
  131. data/gems/server/lib/itsi/server/config/known_paths/backdoors/bot_control_panels.txt +1668 -0
  132. data/gems/server/lib/itsi/server/config/known_paths/backdoors/shells.txt +1167 -0
  133. data/gems/server/lib/itsi/server/config/known_paths/cgi/CGI_HTTP_POST.txt +7 -0
  134. data/gems/server/lib/itsi/server/config/known_paths/cgi/CGI_HTTP_POST_Windows.txt +6 -0
  135. data/gems/server/lib/itsi/server/config/known_paths/cgi/CGI_Microsoft.txt +79 -0
  136. data/gems/server/lib/itsi/server/config/known_paths/cgi/CGI_XPlatform.txt +3948 -0
  137. data/gems/server/lib/itsi/server/config/known_paths/cms/README.md +5 -0
  138. data/gems/server/lib/itsi/server/config/known_paths/cms/drupal_plugins.txt +6320 -0
  139. data/gems/server/lib/itsi/server/config/known_paths/cms/drupal_themes.txt +828 -0
  140. data/gems/server/lib/itsi/server/config/known_paths/cms/joomla_plugins.txt +224 -0
  141. data/gems/server/lib/itsi/server/config/known_paths/cms/joomla_themes.txt +30 -0
  142. data/gems/server/lib/itsi/server/config/known_paths/cms/php-nuke.txt +2142 -0
  143. data/gems/server/lib/itsi/server/config/known_paths/cms/wordpress.txt +1566 -0
  144. data/gems/server/lib/itsi/server/config/known_paths/cms/wp_common_theme_files.txt +46 -0
  145. data/gems/server/lib/itsi/server/config/known_paths/cms/wp_plugins.txt +13366 -0
  146. data/gems/server/lib/itsi/server/config/known_paths/cms/wp_plugins_full.txt +68662 -0
  147. data/gems/server/lib/itsi/server/config/known_paths/cms/wp_plugins_top225.txt +225 -0
  148. data/gems/server/lib/itsi/server/config/known_paths/cms/wp_themes.readme +12 -0
  149. data/gems/server/lib/itsi/server/config/known_paths/cms/wp_themes.txt +7336 -0
  150. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/3CharExtBrute.txt +17576 -0
  151. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/CommonWebExtensions.txt +80 -0
  152. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Backup.txt +14 -0
  153. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Common.txt +865 -0
  154. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Compressed.txt +186 -0
  155. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Mostcommon.txt +30 -0
  156. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Skipfish.txt +93 -0
  157. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/WordlistSkipfish.txt +1918 -0
  158. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/copy_of.txt +8 -0
  159. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-directories-lowercase.txt +56180 -0
  160. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-directories.txt +62290 -0
  161. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-extensions-lowercase.txt +2367 -0
  162. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-extensions.txt +2450 -0
  163. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-files-lowercase.txt +35323 -0
  164. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-files.txt +37037 -0
  165. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-words-lowercase.txt +107982 -0
  166. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-words.txt +119600 -0
  167. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-directories-lowercase.txt +26593 -0
  168. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-directories.txt +30009 -0
  169. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-extensions-lowercase.txt +1233 -0
  170. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-extensions.txt +1289 -0
  171. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-files-lowercase.txt +16243 -0
  172. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-files.txt +17128 -0
  173. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-words-lowercase.txt +56293 -0
  174. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-words.txt +63087 -0
  175. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-directories-lowercase.txt +17776 -0
  176. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-directories.txt +20122 -0
  177. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-extensions-lowercase.txt +914 -0
  178. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-extensions.txt +963 -0
  179. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-files-lowercase.txt +10848 -0
  180. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-files.txt +11424 -0
  181. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-words-lowercase.txt +38267 -0
  182. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-words.txt +43003 -0
  183. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/spanish.txt +445 -0
  184. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/test_demo.txt +36 -0
  185. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/upload_variants.txt +44 -0
  186. data/gems/server/lib/itsi/server/config/known_paths/login-file-locations/Logins.txt +71 -0
  187. data/gems/server/lib/itsi/server/config/known_paths/login-file-locations/cfm.txt +294 -0
  188. data/gems/server/lib/itsi/server/config/known_paths/login-file-locations/html.txt +295 -0
  189. data/gems/server/lib/itsi/server/config/known_paths/login-file-locations/jsp.txt +294 -0
  190. data/gems/server/lib/itsi/server/config/known_paths/login-file-locations/php.txt +294 -0
  191. data/gems/server/lib/itsi/server/config/known_paths/login-file-locations/windows-asp.txt +294 -0
  192. data/gems/server/lib/itsi/server/config/known_paths/login-file-locations/windows-aspx.txt +294 -0
  193. data/gems/server/lib/itsi/server/config/known_paths/password-file-locations/Passwords.txt +47 -0
  194. data/gems/server/lib/itsi/server/config/known_paths/php/PHP.txt +30 -0
  195. data/gems/server/lib/itsi/server/config/known_paths/php/PHP_CommonBackdoors.txt +5 -0
  196. data/gems/server/lib/itsi/server/config/known_paths/proxy-conf.txt +31 -0
  197. data/gems/server/lib/itsi/server/config/known_paths/tftp.txt +79 -0
  198. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/ADFS.txt +86 -0
  199. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/AdobeXML.txt +16 -0
  200. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/Apache.txt +101 -0
  201. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/ApacheTomcat.txt +47 -0
  202. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/Apache_Axis.txt +16 -0
  203. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/ColdFusion.txt +111 -0
  204. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/FatwireCMS.txt +390 -0
  205. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/Frontpage.txt +38 -0
  206. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/HP_System_Mgmt_Homepage.txt +239 -0
  207. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/HTTP_POST_Microsoft.txt +2 -0
  208. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/Hyperion.txt +578 -0
  209. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/IIS.txt +187 -0
  210. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/JBoss.txt +5 -0
  211. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/JRun.txt +13 -0
  212. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/JavaServlets_Common.txt +3 -0
  213. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/Joomla_exploitable.txt +1937 -0
  214. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/LotusNotes.txt +206 -0
  215. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/Netware.txt +18 -0
  216. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/Oracle9i.txt +60 -0
  217. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/OracleAppServer.txt +192 -0
  218. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/README.md +6 -0
  219. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/Ruby_Rails.txt +121 -0
  220. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/SAP.txt +463 -0
  221. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/Sharepoint.txt +1707 -0
  222. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/SiteMinder.txt +19 -0
  223. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/SunAppServerGlassfish.txt +51 -0
  224. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/SuniPlanet.txt +35 -0
  225. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/Vignette.txt +73 -0
  226. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/Weblogic.txt +160 -0
  227. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/Websphere.txt +366 -0
  228. data/gems/server/lib/itsi/server/config/known_paths/wellknown-rfc5785.txt +30 -0
  229. data/gems/server/lib/itsi/server/config/known_paths.rb +20 -0
  230. data/gems/server/lib/itsi/server/config/middleware/_index.md +56 -0
  231. data/gems/server/lib/itsi/server/config/middleware/allow_list.md +46 -0
  232. data/gems/server/lib/itsi/server/config/middleware/allow_list.rb +42 -0
  233. data/gems/server/lib/itsi/server/config/middleware/auth_api_key.md +90 -0
  234. data/gems/server/lib/itsi/server/config/middleware/auth_api_key.rb +51 -0
  235. data/gems/server/lib/itsi/server/config/middleware/auth_basic.md +45 -0
  236. data/gems/server/lib/itsi/server/config/middleware/auth_basic.rb +44 -0
  237. data/gems/server/lib/itsi/server/config/middleware/auth_jwt.md +82 -0
  238. data/gems/server/lib/itsi/server/config/middleware/auth_jwt.rb +38 -0
  239. data/gems/server/lib/itsi/server/config/middleware/cache_control.md +78 -0
  240. data/gems/server/lib/itsi/server/config/middleware/cache_control.rb +45 -0
  241. data/gems/server/lib/itsi/server/config/middleware/cidr_to_regex.rb +50 -0
  242. data/gems/server/lib/itsi/server/config/middleware/compression.md +50 -0
  243. data/gems/server/lib/itsi/server/config/middleware/compression.rb +37 -0
  244. data/gems/server/lib/itsi/server/config/middleware/cors.md +93 -0
  245. data/gems/server/lib/itsi/server/config/middleware/cors.rb +32 -0
  246. data/gems/server/lib/itsi/server/config/middleware/csp.md +37 -0
  247. data/gems/server/lib/itsi/server/config/middleware/csp.rb +44 -0
  248. data/gems/server/lib/itsi/server/config/middleware/deny_list.md +45 -0
  249. data/gems/server/lib/itsi/server/config/middleware/deny_list.rb +42 -0
  250. data/gems/server/lib/itsi/server/config/middleware/endpoint/_index.md +159 -0
  251. data/gems/server/lib/itsi/server/config/middleware/endpoint/controller.md +186 -0
  252. data/gems/server/lib/itsi/server/config/middleware/endpoint/controller.rb +33 -0
  253. data/gems/server/lib/itsi/server/config/middleware/endpoint/delete.md +12 -0
  254. data/gems/server/lib/itsi/server/config/middleware/endpoint/delete.rb +42 -0
  255. data/gems/server/lib/itsi/server/config/middleware/endpoint/endpoint.rb +99 -0
  256. data/gems/server/lib/itsi/server/config/middleware/endpoint/get.md +12 -0
  257. data/gems/server/lib/itsi/server/config/middleware/endpoint/get.rb +42 -0
  258. data/gems/server/lib/itsi/server/config/middleware/endpoint/http_request.md +44 -0
  259. data/gems/server/lib/itsi/server/config/middleware/endpoint/http_response.md +39 -0
  260. data/gems/server/lib/itsi/server/config/middleware/endpoint/patch.md +12 -0
  261. data/gems/server/lib/itsi/server/config/middleware/endpoint/patch.rb +42 -0
  262. data/gems/server/lib/itsi/server/config/middleware/endpoint/post.md +12 -0
  263. data/gems/server/lib/itsi/server/config/middleware/endpoint/post.rb +42 -0
  264. data/gems/server/lib/itsi/server/config/middleware/endpoint/put.md +12 -0
  265. data/gems/server/lib/itsi/server/config/middleware/endpoint/put.rb +42 -0
  266. data/gems/server/lib/itsi/server/config/middleware/endpoint/schemas.md +122 -0
  267. data/gems/server/lib/itsi/server/config/middleware/error_response.md +61 -0
  268. data/gems/server/lib/itsi/server/config/middleware/error_response.rb +36 -0
  269. data/gems/server/lib/itsi/server/config/middleware/etag.md +59 -0
  270. data/gems/server/lib/itsi/server/config/middleware/etag.rb +27 -0
  271. data/gems/server/lib/itsi/server/config/middleware/grpc.md +172 -0
  272. data/gems/server/lib/itsi/server/config/middleware/grpc.rb +54 -0
  273. data/gems/server/lib/itsi/server/config/middleware/intrusion_protection.md +124 -0
  274. data/gems/server/lib/itsi/server/config/middleware/intrusion_protection.rb +61 -0
  275. data/gems/server/lib/itsi/server/config/middleware/location.md +107 -0
  276. data/gems/server/lib/itsi/server/config/middleware/location.rb +99 -0
  277. data/gems/server/lib/itsi/server/config/middleware/log_requests.md +65 -0
  278. data/gems/server/lib/itsi/server/config/middleware/log_requests.rb +31 -0
  279. data/gems/server/lib/itsi/server/config/middleware/max_body.md +18 -0
  280. data/gems/server/lib/itsi/server/config/middleware/max_body.rb +21 -0
  281. data/gems/server/lib/itsi/server/config/middleware/proxy.md +62 -0
  282. data/gems/server/lib/itsi/server/config/middleware/proxy.rb +41 -0
  283. data/gems/server/lib/itsi/server/config/middleware/rackup_file.md +54 -0
  284. data/gems/server/lib/itsi/server/config/middleware/rackup_file.rb +44 -0
  285. data/gems/server/lib/itsi/server/config/middleware/rate_limit.md +126 -0
  286. data/gems/server/lib/itsi/server/config/middleware/rate_limit.rb +34 -0
  287. data/gems/server/lib/itsi/server/config/middleware/rate_limit_store.rb +25 -0
  288. data/gems/server/lib/itsi/server/config/middleware/redirect.md +55 -0
  289. data/gems/server/lib/itsi/server/config/middleware/redirect.rb +25 -0
  290. data/gems/server/lib/itsi/server/config/middleware/request_headers.md +34 -0
  291. data/gems/server/lib/itsi/server/config/middleware/request_headers.rb +24 -0
  292. data/gems/server/lib/itsi/server/config/middleware/response_headers.md +33 -0
  293. data/gems/server/lib/itsi/server/config/middleware/response_headers.rb +25 -0
  294. data/gems/server/lib/itsi/server/config/middleware/run.md +60 -0
  295. data/gems/server/lib/itsi/server/config/middleware/run.rb +43 -0
  296. data/gems/server/lib/itsi/server/config/middleware/static_assets.md +73 -0
  297. data/gems/server/lib/itsi/server/config/middleware/static_assets.rb +87 -0
  298. data/gems/server/lib/itsi/server/config/middleware/static_response.md +44 -0
  299. data/gems/server/lib/itsi/server/config/middleware/static_response.rb +29 -0
  300. data/gems/server/lib/itsi/server/config/middleware/string_rewrite.md +67 -0
  301. data/gems/server/lib/itsi/server/config/middleware/token_source.rb +32 -0
  302. data/gems/server/lib/itsi/server/config/middleware.rb +13 -0
  303. data/gems/server/lib/itsi/server/config/option.rb +14 -0
  304. data/gems/server/lib/itsi/server/config/options/_index.md +37 -0
  305. data/gems/server/lib/itsi/server/config/options/auto_reload_config.md +13 -0
  306. data/gems/server/lib/itsi/server/config/options/auto_reload_config.rb +41 -0
  307. data/gems/server/lib/itsi/server/config/options/bind.md +71 -0
  308. data/gems/server/lib/itsi/server/config/options/bind.rb +26 -0
  309. data/gems/server/lib/itsi/server/config/options/certificates.md +65 -0
  310. data/gems/server/lib/itsi/server/config/options/daemonize.md +14 -0
  311. data/gems/server/lib/itsi/server/config/options/daemonize.rb +19 -0
  312. data/gems/server/lib/itsi/server/config/options/fiber_scheduler.md +34 -0
  313. data/gems/server/lib/itsi/server/config/options/fiber_scheduler.rb +21 -0
  314. data/gems/server/lib/itsi/server/config/options/header_read_timeout.md +17 -0
  315. data/gems/server/lib/itsi/server/config/options/header_read_timeout.rb +19 -0
  316. data/gems/server/lib/itsi/server/config/options/hooks/_index.md +11 -0
  317. data/gems/server/lib/itsi/server/config/options/hooks/after_fork.md +13 -0
  318. data/gems/server/lib/itsi/server/config/options/hooks/after_fork.rb +28 -0
  319. data/gems/server/lib/itsi/server/config/options/hooks/after_memory_limit_reached.md +14 -0
  320. data/gems/server/lib/itsi/server/config/options/hooks/after_memory_limit_reached.rb +28 -0
  321. data/gems/server/lib/itsi/server/config/options/hooks/after_start.md +12 -0
  322. data/gems/server/lib/itsi/server/config/options/hooks/after_start.rb +28 -0
  323. data/gems/server/lib/itsi/server/config/options/hooks/before_fork.md +13 -0
  324. data/gems/server/lib/itsi/server/config/options/hooks/before_fork.rb +28 -0
  325. data/gems/server/lib/itsi/server/config/options/hooks/before_restart.md +12 -0
  326. data/gems/server/lib/itsi/server/config/options/hooks/before_restart.rb +28 -0
  327. data/gems/server/lib/itsi/server/config/options/hooks/before_shutdown.md +12 -0
  328. data/gems/server/lib/itsi/server/config/options/hooks/before_shutdown.rb +28 -0
  329. data/gems/server/lib/itsi/server/config/options/include.md +20 -0
  330. data/gems/server/lib/itsi/server/config/options/include.rb +36 -0
  331. data/gems/server/lib/itsi/server/config/options/listen_backlog.md +11 -0
  332. data/gems/server/lib/itsi/server/config/options/listen_backlog.rb +19 -0
  333. data/gems/server/lib/itsi/server/config/options/log_format.md +18 -0
  334. data/gems/server/lib/itsi/server/config/options/log_format.rb +19 -0
  335. data/gems/server/lib/itsi/server/config/options/log_level.md +34 -0
  336. data/gems/server/lib/itsi/server/config/options/log_level.rb +20 -0
  337. data/gems/server/lib/itsi/server/config/options/log_target.md +38 -0
  338. data/gems/server/lib/itsi/server/config/options/log_target.rb +19 -0
  339. data/gems/server/lib/itsi/server/config/options/log_target_filters.md +17 -0
  340. data/gems/server/lib/itsi/server/config/options/log_target_filters.rb +19 -0
  341. data/gems/server/lib/itsi/server/config/options/multithreaded_reactor.md +27 -0
  342. data/gems/server/lib/itsi/server/config/options/multithreaded_reactor.rb +24 -0
  343. data/gems/server/lib/itsi/server/config/options/nodelay.md +16 -0
  344. data/gems/server/lib/itsi/server/config/options/nodelay.rb +19 -0
  345. data/gems/server/lib/itsi/server/config/options/oob_gc_responses_threshold.md +19 -0
  346. data/gems/server/lib/itsi/server/config/options/oob_gc_responses_threshold.rb +18 -0
  347. data/gems/server/lib/itsi/server/config/options/pin_worker_cores.md +17 -0
  348. data/gems/server/lib/itsi/server/config/options/pin_worker_cores.rb +19 -0
  349. data/gems/server/lib/itsi/server/config/options/preload.md +21 -0
  350. data/gems/server/lib/itsi/server/config/options/preload.rb +18 -0
  351. data/gems/server/lib/itsi/server/config/options/recv_buffer_size.md +15 -0
  352. data/gems/server/lib/itsi/server/config/options/recv_buffer_size.rb +19 -0
  353. data/gems/server/lib/itsi/server/config/options/redirect_http_to_https.md +21 -0
  354. data/gems/server/lib/itsi/server/config/options/redirect_http_to_https.rb +30 -0
  355. data/gems/server/lib/itsi/server/config/options/request_timeout.md +23 -0
  356. data/gems/server/lib/itsi/server/config/options/request_timeout.rb +19 -0
  357. data/gems/server/lib/itsi/server/config/options/reuse_address.md +16 -0
  358. data/gems/server/lib/itsi/server/config/options/reuse_address.rb +19 -0
  359. data/gems/server/lib/itsi/server/config/options/reuse_port.md +16 -0
  360. data/gems/server/lib/itsi/server/config/options/reuse_port.rb +19 -0
  361. data/gems/server/lib/itsi/server/config/options/scheduler_threads.md +34 -0
  362. data/gems/server/lib/itsi/server/config/options/scheduler_threads.rb +17 -0
  363. data/gems/server/lib/itsi/server/config/options/shutdown_timeout.md +17 -0
  364. data/gems/server/lib/itsi/server/config/options/shutdown_timeout.rb +19 -0
  365. data/gems/server/lib/itsi/server/config/options/stream_body.md +32 -0
  366. data/gems/server/lib/itsi/server/config/options/stream_body.rb +18 -0
  367. data/gems/server/lib/itsi/server/config/options/threads.md +44 -0
  368. data/gems/server/lib/itsi/server/config/options/threads.rb +17 -0
  369. data/gems/server/lib/itsi/server/config/options/watch.md +16 -0
  370. data/gems/server/lib/itsi/server/config/options/watch.rb +28 -0
  371. data/gems/server/lib/itsi/server/config/options/worker_memory_limit.md +22 -0
  372. data/gems/server/lib/itsi/server/config/options/worker_memory_limit.rb +18 -0
  373. data/gems/server/lib/itsi/server/config/options/workers.md +42 -0
  374. data/gems/server/lib/itsi/server/config/options/workers.rb +17 -0
  375. data/gems/server/lib/itsi/server/config/typed_struct.rb +242 -0
  376. data/gems/server/lib/itsi/server/config.rb +134 -11
  377. data/gems/server/lib/itsi/server/default_config/Itsi.rb +3 -3
  378. data/gems/server/lib/itsi/server/grpc/grpc_call.rb +1 -1
  379. data/gems/server/lib/itsi/server/grpc/grpc_interface.rb +11 -4
  380. data/gems/server/lib/itsi/server/rack/handler/itsi.rb +3 -3
  381. data/gems/server/lib/itsi/server/route_tester.rb +58 -8
  382. data/gems/server/lib/itsi/server/signal_trap.rb +5 -1
  383. data/gems/server/lib/itsi/server/typed_handlers/param_parser.rb +14 -18
  384. data/gems/server/lib/itsi/server/typed_handlers/source_parser.rb +6 -5
  385. data/gems/server/lib/itsi/server/typed_handlers.rb +12 -4
  386. data/gems/server/lib/itsi/server/version.rb +1 -1
  387. data/gems/server/lib/itsi/server.rb +122 -17
  388. data/gems/server/lib/ruby_lsp/itsi/addon.rb +66 -48
  389. data/gems/server/test/helpers/test_helper.rb +130 -11
  390. data/gems/server/test/middleware/allow_list.rb +128 -0
  391. data/gems/server/test/middleware/auth_api_key.rb +141 -0
  392. data/gems/server/test/middleware/auth_basic.rb +91 -0
  393. data/gems/server/test/middleware/auth_jwt.rb +214 -0
  394. data/gems/server/test/middleware/cache_control.rb +82 -0
  395. data/gems/server/test/middleware/cidr_to_regex.rb +46 -0
  396. data/gems/server/test/middleware/compression.rb +89 -0
  397. data/gems/server/test/middleware/cors.rb +113 -0
  398. data/gems/server/test/middleware/csp.rb +62 -0
  399. data/gems/server/test/middleware/deny_list.rb +131 -0
  400. data/gems/server/test/middleware/endpoint.rb +300 -0
  401. data/gems/server/test/middleware/etag.rb +75 -0
  402. data/gems/server/test/middleware/grpc/grpc.rb +158 -0
  403. data/gems/server/test/middleware/grpc/test_service.proto +32 -0
  404. data/gems/server/test/middleware/grpc/test_service_impl.rb +28 -0
  405. data/gems/server/test/middleware/grpc/test_service_pb.rb +18 -0
  406. data/gems/server/test/middleware/grpc/test_service_services_pb.rb +30 -0
  407. data/gems/server/test/middleware/header_interpolation.rb +35 -0
  408. data/gems/server/test/middleware/intrusion_protection.rb +259 -0
  409. data/gems/server/test/middleware/location.rb +220 -0
  410. data/gems/server/test/middleware/max_body.rb +20 -0
  411. data/gems/server/test/middleware/proxy.rb +415 -0
  412. data/gems/server/test/middleware/rate_limit.rb +211 -0
  413. data/gems/server/test/middleware/redirect.rb +85 -0
  414. data/gems/server/test/middleware/request_headers.rb +50 -0
  415. data/gems/server/test/middleware/response_headers.rb +50 -0
  416. data/gems/server/test/middleware/static_assets.rb +374 -0
  417. data/gems/server/test/middleware/static_response.rb +56 -0
  418. data/gems/server/test/middleware/string_rewrite.rb +112 -0
  419. data/gems/server/test/middleware/test_log_requests.rb +17 -0
  420. data/gems/server/test/options/bind.rb +47 -0
  421. data/gems/server/test/options/header_read_timeout.rb +23 -0
  422. data/gems/server/test/options/test_request_timeout.rb +16 -0
  423. data/gems/server/test/options/test_threads.rb +15 -0
  424. data/gems/server/test/options/test_workers.rb +16 -0
  425. data/gems/server/test/{test_itsi_server.rb → rack/test_rack_server.rb} +82 -95
  426. data/grpc_test/Itsi.rb +11 -0
  427. data/grpc_test/echo.proto +14 -0
  428. data/grpc_test/echo_pb.rb +16 -0
  429. data/grpc_test/echo_service_impl.rb +8 -0
  430. data/{sandbox/itsi_file/echo_service_nonitsi → grpc_test}/echo_services_pb.rb +0 -7
  431. data/itsi-scheduler-100.png +0 -0
  432. data/itsi-server-100.png +0 -0
  433. data/lib/itsi/version.rb +1 -1
  434. data/tasks.txt +17 -66
  435. metadata +352 -217
  436. data/crates/_index.md +0 -0
  437. data/crates/itsi_server/src/ruby_types/README.md +0 -21
  438. data/crates/itsi_server/test.md +0 -14
  439. data/docs/Itsi.rb +0 -17
  440. data/docs/content/about.md +0 -6
  441. data/docs/content/docs/_index.md +0 -18
  442. data/docs/content/docs/first-page.md +0 -9
  443. data/docs/content/docs/folder/_index.md +0 -10
  444. data/docs/content/docs/folder/leaf.md +0 -7
  445. data/foo/Itsi.rb +0 -122
  446. data/gems/_index.md +0 -18
  447. data/gems/scheduler/CHANGELOG.md +0 -5
  448. data/gems/scheduler/CODE_OF_CONDUCT.md +0 -139
  449. data/gems/scheduler/LICENSE.txt +0 -21
  450. data/gems/scheduler/_index.md +0 -7
  451. data/gems/server/CHANGELOG.md +0 -10
  452. data/gems/server/CODE_OF_CONDUCT.md +0 -139
  453. data/gems/server/LICENSE.txt +0 -21
  454. data/gems/server/_index.md +0 -6
  455. data/gems/server/lib/itsi/server/default_config/Itsi-rackup.rb +0 -119
  456. data/sandbox/README.md +0 -5
  457. data/sandbox/deploy/main.tf +0 -238
  458. data/sandbox/deploy/outputs.tf +0 -4
  459. data/sandbox/deploy/vars.tf +0 -11
  460. data/sandbox/falcon_benchmark/Gemfile +0 -10
  461. data/sandbox/falcon_benchmark/Gemfile.lock +0 -140
  462. data/sandbox/falcon_benchmark/config.ru +0 -54
  463. data/sandbox/itsi_file/Gemfile +0 -13
  464. data/sandbox/itsi_file/Gemfile.lock +0 -111
  465. data/sandbox/itsi_file/Itsi.rb +0 -474
  466. data/sandbox/itsi_file/call.json +0 -1
  467. data/sandbox/itsi_file/echo_client/Gemfile +0 -10
  468. data/sandbox/itsi_file/echo_client/Gemfile.lock +0 -27
  469. data/sandbox/itsi_file/echo_client/README.md +0 -95
  470. data/sandbox/itsi_file/echo_client/echo_client.rb +0 -164
  471. data/sandbox/itsi_file/echo_client/gen_proto.sh +0 -17
  472. data/sandbox/itsi_file/echo_client/lib/echo_pb.rb +0 -16
  473. data/sandbox/itsi_file/echo_client/lib/echo_services_pb.rb +0 -29
  474. data/sandbox/itsi_file/echo_client/run_client.rb +0 -64
  475. data/sandbox/itsi_file/echo_client/test_compressions.sh +0 -20
  476. data/sandbox/itsi_file/echo_service_nonitsi/Gemfile +0 -10
  477. data/sandbox/itsi_file/echo_service_nonitsi/Gemfile.lock +0 -79
  478. data/sandbox/itsi_file/echo_service_nonitsi/echo.proto +0 -26
  479. data/sandbox/itsi_file/echo_service_nonitsi/echo_pb.rb +0 -16
  480. data/sandbox/itsi_file/echo_service_nonitsi/server.rb +0 -52
  481. data/sandbox/itsi_file/error.html +0 -2
  482. data/sandbox/itsi_file/organisations_controller.rb +0 -20
  483. data/sandbox/itsi_file/public/assets/image.png +0 -0
  484. data/sandbox/itsi_sandbox_async/Gemfile +0 -10
  485. data/sandbox/itsi_sandbox_async/Gemfile.lock +0 -69
  486. data/sandbox/itsi_sandbox_async/config.ru +0 -9
  487. data/sandbox/itsi_sandbox_hanami/.env +0 -2
  488. data/sandbox/itsi_sandbox_hanami/.gitignore +0 -6
  489. data/sandbox/itsi_sandbox_hanami/.rspec +0 -1
  490. data/sandbox/itsi_sandbox_hanami/Gemfile +0 -49
  491. data/sandbox/itsi_sandbox_hanami/Gemfile.lock +0 -440
  492. data/sandbox/itsi_sandbox_hanami/Guardfile +0 -9
  493. data/sandbox/itsi_sandbox_hanami/Procfile.dev +0 -2
  494. data/sandbox/itsi_sandbox_hanami/README.md +0 -1
  495. data/sandbox/itsi_sandbox_hanami/Rakefile +0 -3
  496. data/sandbox/itsi_sandbox_hanami/app/action.rb +0 -12
  497. data/sandbox/itsi_sandbox_hanami/app/actions/.keep +0 -0
  498. data/sandbox/itsi_sandbox_hanami/app/assets/css/app.css +0 -5
  499. data/sandbox/itsi_sandbox_hanami/app/assets/images/favicon.ico +0 -0
  500. data/sandbox/itsi_sandbox_hanami/app/assets/js/app.js +0 -1
  501. data/sandbox/itsi_sandbox_hanami/app/db/relation.rb +0 -10
  502. data/sandbox/itsi_sandbox_hanami/app/db/repo.rb +0 -10
  503. data/sandbox/itsi_sandbox_hanami/app/db/struct.rb +0 -10
  504. data/sandbox/itsi_sandbox_hanami/app/operation.rb +0 -9
  505. data/sandbox/itsi_sandbox_hanami/app/relations/.keep +0 -0
  506. data/sandbox/itsi_sandbox_hanami/app/repos/.keep +0 -0
  507. data/sandbox/itsi_sandbox_hanami/app/structs/.keep +0 -0
  508. data/sandbox/itsi_sandbox_hanami/app/templates/layouts/app.html.erb +0 -14
  509. data/sandbox/itsi_sandbox_hanami/app/view.rb +0 -9
  510. data/sandbox/itsi_sandbox_hanami/app/views/helpers.rb +0 -10
  511. data/sandbox/itsi_sandbox_hanami/bin/dev +0 -8
  512. data/sandbox/itsi_sandbox_hanami/config/app.rb +0 -8
  513. data/sandbox/itsi_sandbox_hanami/config/assets.js +0 -16
  514. data/sandbox/itsi_sandbox_hanami/config/db/migrate/.keep +0 -0
  515. data/sandbox/itsi_sandbox_hanami/config/db/seeds.rb +0 -15
  516. data/sandbox/itsi_sandbox_hanami/config/puma.rb +0 -47
  517. data/sandbox/itsi_sandbox_hanami/config/routes.rb +0 -7
  518. data/sandbox/itsi_sandbox_hanami/config/settings.rb +0 -9
  519. data/sandbox/itsi_sandbox_hanami/config.ru +0 -5
  520. data/sandbox/itsi_sandbox_hanami/db/.keep +0 -0
  521. data/sandbox/itsi_sandbox_hanami/lib/itsi_hanami/types.rb +0 -11
  522. data/sandbox/itsi_sandbox_hanami/lib/tasks/.keep +0 -0
  523. data/sandbox/itsi_sandbox_hanami/package-lock.json +0 -946
  524. data/sandbox/itsi_sandbox_hanami/package.json +0 -8
  525. data/sandbox/itsi_sandbox_hanami/spec/requests/root_spec.rb +0 -11
  526. data/sandbox/itsi_sandbox_hanami/spec/spec_helper.rb +0 -9
  527. data/sandbox/itsi_sandbox_hanami/spec/support/db/cleaning.rb +0 -42
  528. data/sandbox/itsi_sandbox_hanami/spec/support/db.rb +0 -10
  529. data/sandbox/itsi_sandbox_hanami/spec/support/features.rb +0 -5
  530. data/sandbox/itsi_sandbox_hanami/spec/support/operations.rb +0 -8
  531. data/sandbox/itsi_sandbox_hanami/spec/support/requests.rb +0 -13
  532. data/sandbox/itsi_sandbox_hanami/spec/support/rspec.rb +0 -61
  533. data/sandbox/itsi_sandbox_rack/Gemfile +0 -17
  534. data/sandbox/itsi_sandbox_rack/Gemfile.lock +0 -153
  535. data/sandbox/itsi_sandbox_rack/config.ru +0 -5
  536. data/sandbox/itsi_sandbox_rack_lint/Gemfile +0 -7
  537. data/sandbox/itsi_sandbox_rack_lint/Gemfile.lock +0 -27
  538. data/sandbox/itsi_sandbox_rack_lint/config.ru +0 -3
  539. data/sandbox/itsi_sandbox_rails/.dockerignore +0 -48
  540. data/sandbox/itsi_sandbox_rails/.gitattributes +0 -9
  541. data/sandbox/itsi_sandbox_rails/.github/dependabot.yml +0 -12
  542. data/sandbox/itsi_sandbox_rails/.github/workflows/ci.yml +0 -90
  543. data/sandbox/itsi_sandbox_rails/.gitignore +0 -35
  544. data/sandbox/itsi_sandbox_rails/.rubocop.yml +0 -8
  545. data/sandbox/itsi_sandbox_rails/.ruby-version +0 -1
  546. data/sandbox/itsi_sandbox_rails/Dockerfile +0 -69
  547. data/sandbox/itsi_sandbox_rails/Gemfile +0 -66
  548. data/sandbox/itsi_sandbox_rails/Gemfile.lock +0 -429
  549. data/sandbox/itsi_sandbox_rails/README.md +0 -24
  550. data/sandbox/itsi_sandbox_rails/Rakefile +0 -6
  551. data/sandbox/itsi_sandbox_rails/app/assets/config/manifest.js +0 -4
  552. data/sandbox/itsi_sandbox_rails/app/assets/images/.keep +0 -0
  553. data/sandbox/itsi_sandbox_rails/app/assets/stylesheets/application.css +0 -15
  554. data/sandbox/itsi_sandbox_rails/app/channels/application_cable/channel.rb +0 -4
  555. data/sandbox/itsi_sandbox_rails/app/channels/application_cable/connection.rb +0 -4
  556. data/sandbox/itsi_sandbox_rails/app/controllers/application_controller.rb +0 -4
  557. data/sandbox/itsi_sandbox_rails/app/controllers/concerns/.keep +0 -0
  558. data/sandbox/itsi_sandbox_rails/app/controllers/home_controller.rb +0 -66
  559. data/sandbox/itsi_sandbox_rails/app/controllers/live_controller.rb +0 -40
  560. data/sandbox/itsi_sandbox_rails/app/controllers/uploads_controller.rb +0 -29
  561. data/sandbox/itsi_sandbox_rails/app/helpers/application_helper.rb +0 -2
  562. data/sandbox/itsi_sandbox_rails/app/javascript/application.js +0 -3
  563. data/sandbox/itsi_sandbox_rails/app/javascript/controllers/application.js +0 -9
  564. data/sandbox/itsi_sandbox_rails/app/javascript/controllers/hello_controller.js +0 -7
  565. data/sandbox/itsi_sandbox_rails/app/javascript/controllers/index.js +0 -4
  566. data/sandbox/itsi_sandbox_rails/app/jobs/application_job.rb +0 -7
  567. data/sandbox/itsi_sandbox_rails/app/mailers/application_mailer.rb +0 -4
  568. data/sandbox/itsi_sandbox_rails/app/models/application_record.rb +0 -3
  569. data/sandbox/itsi_sandbox_rails/app/models/concerns/.keep +0 -0
  570. data/sandbox/itsi_sandbox_rails/app/models/post.rb +0 -2
  571. data/sandbox/itsi_sandbox_rails/app/views/layouts/application.html.erb +0 -23
  572. data/sandbox/itsi_sandbox_rails/app/views/layouts/mailer.html.erb +0 -13
  573. data/sandbox/itsi_sandbox_rails/app/views/layouts/mailer.text.erb +0 -1
  574. data/sandbox/itsi_sandbox_rails/app/views/pwa/manifest.json.erb +0 -22
  575. data/sandbox/itsi_sandbox_rails/app/views/pwa/service-worker.js +0 -26
  576. data/sandbox/itsi_sandbox_rails/bin/brakeman +0 -7
  577. data/sandbox/itsi_sandbox_rails/bin/bundle +0 -109
  578. data/sandbox/itsi_sandbox_rails/bin/docker-entrypoint +0 -13
  579. data/sandbox/itsi_sandbox_rails/bin/importmap +0 -4
  580. data/sandbox/itsi_sandbox_rails/bin/rails +0 -4
  581. data/sandbox/itsi_sandbox_rails/bin/rake +0 -4
  582. data/sandbox/itsi_sandbox_rails/bin/rubocop +0 -8
  583. data/sandbox/itsi_sandbox_rails/bin/setup +0 -37
  584. data/sandbox/itsi_sandbox_rails/config/application.rb +0 -27
  585. data/sandbox/itsi_sandbox_rails/config/boot.rb +0 -4
  586. data/sandbox/itsi_sandbox_rails/config/cable.yml +0 -10
  587. data/sandbox/itsi_sandbox_rails/config/credentials.yml.enc +0 -1
  588. data/sandbox/itsi_sandbox_rails/config/database.yml +0 -30
  589. data/sandbox/itsi_sandbox_rails/config/environment.rb +0 -5
  590. data/sandbox/itsi_sandbox_rails/config/environments/development.rb +0 -82
  591. data/sandbox/itsi_sandbox_rails/config/environments/production.rb +0 -106
  592. data/sandbox/itsi_sandbox_rails/config/environments/test.rb +0 -67
  593. data/sandbox/itsi_sandbox_rails/config/importmap.rb +0 -7
  594. data/sandbox/itsi_sandbox_rails/config/initializers/assets.rb +0 -12
  595. data/sandbox/itsi_sandbox_rails/config/initializers/content_security_policy.rb +0 -25
  596. data/sandbox/itsi_sandbox_rails/config/initializers/filter_parameter_logging.rb +0 -8
  597. data/sandbox/itsi_sandbox_rails/config/initializers/inflections.rb +0 -16
  598. data/sandbox/itsi_sandbox_rails/config/initializers/permissions_policy.rb +0 -13
  599. data/sandbox/itsi_sandbox_rails/config/locales/en.yml +0 -31
  600. data/sandbox/itsi_sandbox_rails/config/puma.rb +0 -34
  601. data/sandbox/itsi_sandbox_rails/config/routes.rb +0 -23
  602. data/sandbox/itsi_sandbox_rails/config/storage.yml +0 -34
  603. data/sandbox/itsi_sandbox_rails/config.ru +0 -6
  604. data/sandbox/itsi_sandbox_rails/db/migrate/20250301041554_create_posts.rb +0 -10
  605. data/sandbox/itsi_sandbox_rails/db/schema.rb +0 -23
  606. data/sandbox/itsi_sandbox_rails/db/seeds.rb +0 -9
  607. data/sandbox/itsi_sandbox_rails/lib/assets/.keep +0 -0
  608. data/sandbox/itsi_sandbox_rails/lib/tasks/.keep +0 -0
  609. data/sandbox/itsi_sandbox_rails/log/.keep +0 -0
  610. data/sandbox/itsi_sandbox_rails/public/404.html +0 -67
  611. data/sandbox/itsi_sandbox_rails/public/406-unsupported-browser.html +0 -66
  612. data/sandbox/itsi_sandbox_rails/public/422.html +0 -67
  613. data/sandbox/itsi_sandbox_rails/public/500.html +0 -66
  614. data/sandbox/itsi_sandbox_rails/public/icon.png +0 -0
  615. data/sandbox/itsi_sandbox_rails/public/icon.svg +0 -3
  616. data/sandbox/itsi_sandbox_rails/public/robots.txt +0 -1
  617. data/sandbox/itsi_sandbox_rails/storage/.keep +0 -0
  618. data/sandbox/itsi_sandbox_rails/test/application_system_test_case.rb +0 -5
  619. data/sandbox/itsi_sandbox_rails/test/channels/application_cable/connection_test.rb +0 -13
  620. data/sandbox/itsi_sandbox_rails/test/controllers/.keep +0 -0
  621. data/sandbox/itsi_sandbox_rails/test/fixtures/files/.keep +0 -0
  622. data/sandbox/itsi_sandbox_rails/test/helpers/.keep +0 -0
  623. data/sandbox/itsi_sandbox_rails/test/integration/.keep +0 -0
  624. data/sandbox/itsi_sandbox_rails/test/mailers/.keep +0 -0
  625. data/sandbox/itsi_sandbox_rails/test/models/.keep +0 -0
  626. data/sandbox/itsi_sandbox_rails/test/system/.keep +0 -0
  627. data/sandbox/itsi_sandbox_rails/test/test_helper.rb +0 -15
  628. data/sandbox/itsi_sandbox_rails/tmp/.keep +0 -0
  629. data/sandbox/itsi_sandbox_rails/tmp/pids/.keep +0 -0
  630. data/sandbox/itsi_sandbox_rails/tmp/storage/.keep +0 -0
  631. data/sandbox/itsi_sandbox_rails/vendor/.keep +0 -0
  632. data/sandbox/itsi_sandbox_rails/vendor/javascript/.keep +0 -0
  633. data/sandbox/itsi_sandbox_roda/Gemfile +0 -5
  634. data/sandbox/itsi_sandbox_roda/Gemfile.lock +0 -37
  635. data/sandbox/itsi_sandbox_roda/config.ru +0 -39
  636. data/sandbox/itsi_sinatra/Gemfile +0 -9
  637. data/sandbox/itsi_sinatra/Gemfile.lock +0 -81
  638. data/sandbox/itsi_sinatra/app.rb +0 -8
  639. data/sandbox/pebble/docker-compose.yml +0 -11
  640. data/sandbox/static_files/.env +0 -1
  641. data/sandbox/static_files/404.html +0 -25
  642. data/sandbox/static_files/_DSC0102.NEF.jpg +0 -0
  643. data/sandbox/static_files/about.html +0 -68
  644. data/sandbox/static_files/tiny.html +0 -1
  645. data/sandbox/static_files/writebook.zip +0 -0
@@ -1,9 +1,10 @@
1
1
  use crate::{
2
- default_responses::{INTERNAL_SERVER_ERROR_RESPONSE, NOT_FOUND_RESPONSE},
2
+ default_responses::NOT_FOUND_RESPONSE,
3
3
  prelude::*,
4
4
  server::{
5
5
  http_message_types::{HttpRequest, HttpResponse, RequestExt, ResponseFormat},
6
6
  middleware_stack::ErrorResponse,
7
+ redirect_type::RedirectType,
7
8
  },
8
9
  };
9
10
  use base64::{engine::general_purpose, Engine};
@@ -46,15 +47,18 @@ pub static ROOT_STATIC_FILE_SERVER: LazyLock<StaticFileServer> = LazyLock::new(|
46
47
  recheck_interval: Duration::from_secs(1),
47
48
  try_html_extension: true,
48
49
  auto_index: true,
50
+ headers: None,
49
51
  not_found_behavior: NotFoundBehavior::Error(ErrorResponse::not_found()),
50
52
  serve_hidden_files: false,
51
53
  allowed_extensions: vec!["html".to_string(), "css".to_string(), "js".to_string()],
52
54
  })
55
+ .unwrap()
53
56
  });
54
57
 
55
58
  #[derive(Debug, Clone, Deserialize)]
56
59
  pub struct Redirect {
57
60
  pub to: String,
61
+ pub r#type: RedirectType,
58
62
  }
59
63
 
60
64
  #[derive(Debug, Clone, Deserialize)]
@@ -67,8 +71,6 @@ pub enum NotFoundBehavior {
67
71
  IndexFile(PathBuf),
68
72
  #[serde(rename = "redirect")]
69
73
  Redirect(Redirect),
70
- #[serde(rename = "internal_server_error")]
71
- InternalServerError,
72
74
  }
73
75
 
74
76
  #[derive(Debug, Clone)]
@@ -80,6 +82,7 @@ pub struct StaticFileServerConfig {
80
82
  pub try_html_extension: bool,
81
83
  pub auto_index: bool,
82
84
  pub not_found_behavior: NotFoundBehavior,
85
+ pub headers: Option<HashMap<String, String>>,
83
86
  pub serve_hidden_files: bool,
84
87
  pub allowed_extensions: Vec<String>,
85
88
  }
@@ -112,23 +115,26 @@ struct CacheEntry {
112
115
  }
113
116
 
114
117
  impl CacheEntry {
115
- pub fn suggest_content_for(&self, supported_encodings: &[HeaderValue]) -> (Arc<Bytes>, &str) {
118
+ pub fn suggest_content_for(
119
+ &self,
120
+ supported_encodings: &[HeaderValue],
121
+ ) -> (Arc<Bytes>, Option<&str>) {
116
122
  for encoding_header in supported_encodings {
117
123
  if let Ok(header_value) = encoding_header.to_str() {
118
124
  for header_value in header_value.split(",").map(|hv| hv.trim()) {
119
125
  for algo in header_value.split(";").map(|hv| hv.trim()) {
120
126
  match algo {
121
127
  "zstd" if self.zstd_encoded.is_some() => {
122
- return (self.zstd_encoded.clone().unwrap(), "zstd")
128
+ return (self.zstd_encoded.clone().unwrap(), Some("zstd"))
123
129
  }
124
130
  "gzip" if self.gzip_encoded.is_some() => {
125
- return (self.gzip_encoded.clone().unwrap(), "gzip")
131
+ return (self.gzip_encoded.clone().unwrap(), Some("gzip"))
126
132
  }
127
133
  "br" if self.br_encoded.is_some() => {
128
- return (self.br_encoded.clone().unwrap(), "br")
134
+ return (self.br_encoded.clone().unwrap(), Some("br"))
129
135
  }
130
136
  "deflate" if self.deflate_encoded.is_some() => {
131
- return (self.deflate_encoded.clone().unwrap(), "deflate")
137
+ return (self.deflate_encoded.clone().unwrap(), Some("deflate"))
132
138
  }
133
139
  _ => {}
134
140
  }
@@ -136,7 +142,7 @@ impl CacheEntry {
136
142
  }
137
143
  }
138
144
  }
139
- (self.content.clone(), "identity")
145
+ (self.content.clone(), None)
140
146
  }
141
147
  }
142
148
 
@@ -209,14 +215,27 @@ struct ServeCacheArgs<'a>(
209
215
  );
210
216
 
211
217
  impl StaticFileServer {
212
- pub fn new(config: StaticFileServerConfig) -> Self {
218
+ pub fn new(config: StaticFileServerConfig) -> Result<Self> {
213
219
  let cache = Cache::builder().max_capacity(config.max_entries).build();
220
+ if !config.root_dir.exists() {
221
+ return Err(ItsiError::InternalError(format!(
222
+ "Root directory {} for static file server doesn't exist",
223
+ config.root_dir.display()
224
+ )));
225
+ }
226
+
227
+ if std::fs::read_dir(&config.root_dir).is_err() {
228
+ return Err(ItsiError::InternalError(format!(
229
+ "Root directory {} for static file server is not readable",
230
+ config.root_dir.display()
231
+ )));
232
+ }
214
233
 
215
- StaticFileServer {
234
+ Ok(StaticFileServer {
216
235
  config: Arc::new(config),
217
236
  cache,
218
237
  key_to_path: Arc::new(Mutex::new(HashMap::new())),
219
- }
238
+ })
220
239
  }
221
240
 
222
241
  #[allow(clippy::too_many_arguments)]
@@ -290,15 +309,10 @@ impl StaticFileServer {
290
309
  .await
291
310
  }
292
311
  NotFoundBehavior::Redirect(redirect) => Response::builder()
293
- .status(StatusCode::MOVED_PERMANENTLY)
312
+ .status(redirect.r#type.status_code())
294
313
  .header(header::LOCATION, redirect.to)
295
314
  .body(BoxBody::new(Full::new(Bytes::new())))
296
315
  .unwrap(),
297
- NotFoundBehavior::InternalServerError => {
298
- INTERNAL_SERVER_ERROR_RESPONSE
299
- .to_http_response(request.accept().into())
300
- .await
301
- }
302
316
  },
303
317
  })
304
318
  }
@@ -420,8 +434,8 @@ impl StaticFileServer {
420
434
 
421
435
  // No valid cached entry, resolve the key to a file path
422
436
  let decoded_key = percent_decode_str(key).decode_utf8_lossy();
423
- let normalized_path =
424
- normalize_path(decoded_key).ok_or(NotFoundBehavior::InternalServerError)?;
437
+ let normalized_path = normalize_path(decoded_key)
438
+ .ok_or(NotFoundBehavior::Error(NOT_FOUND_RESPONSE.clone()))?;
425
439
 
426
440
  if !self.config.serve_hidden_files
427
441
  && normalized_path
@@ -435,6 +449,7 @@ impl StaticFileServer {
435
449
 
436
450
  let mut full_path = self.config.root_dir.clone();
437
451
  full_path.push(normalized_path);
452
+ debug!("Resolving path {:?}", full_path);
438
453
  // Check if path exists and is a file
439
454
  match tokio::fs::metadata(&full_path).await {
440
455
  Ok(metadata) => {
@@ -478,19 +493,26 @@ impl StaticFileServer {
478
493
  // Check for case insensitive index.html
479
494
  let entries = match tokio::fs::read_dir(&full_path).await {
480
495
  Ok(entries) => entries,
481
- Err(_) => return Err(NotFoundBehavior::InternalServerError),
496
+ Err(_) => {
497
+ return Err(NotFoundBehavior::Error(NOT_FOUND_RESPONSE.clone()))
498
+ }
482
499
  };
483
500
 
484
501
  tokio::pin!(entries);
485
502
  while let Some(entry) = entries.next_entry().await.unwrap_or(None) {
486
- if entry
487
- .file_name()
488
- .to_str()
489
- .is_some_and(|name| name.eq_ignore_ascii_case("index.html"))
490
- && entry.metadata().await.unwrap().is_file()
491
- {
492
- index_file = Some(entry.path());
493
- break;
503
+ if let Ok(metadata) = entry.metadata().await {
504
+ if entry
505
+ .file_name()
506
+ .to_str()
507
+ .is_some_and(|name| name.eq_ignore_ascii_case("index.html"))
508
+ && metadata.is_file()
509
+ {
510
+ index_file = Some(entry.path());
511
+ break;
512
+ }
513
+ } else {
514
+ error!("Failed to retrieve metadata for entry: {:?}", entry.path());
515
+ return Err(self.config.not_found_behavior.clone());
494
516
  }
495
517
  }
496
518
  }
@@ -539,6 +561,7 @@ impl StaticFileServer {
539
561
  }
540
562
  Err(_) => {
541
563
  // Path doesn't exist, try with .html extension if configured
564
+ debug!("Path doesn't exist");
542
565
  if self.config.try_html_extension {
543
566
  let mut html_path = full_path.clone();
544
567
  html_path.set_extension("html");
@@ -735,6 +758,7 @@ impl StaticFileServer {
735
758
  (end_idx - start) as usize,
736
759
  last_modified,
737
760
  content_range,
761
+ &self.headers,
738
762
  self.stream_file_range(file, start, end_idx).await.unwrap(),
739
763
  )
740
764
  } else {
@@ -746,6 +770,7 @@ impl StaticFileServer {
746
770
  content_length as usize,
747
771
  last_modified,
748
772
  content_range,
773
+ &self.headers,
749
774
  self.stream_file(file).await.unwrap(),
750
775
  )
751
776
  }
@@ -844,6 +869,7 @@ impl StaticFileServer {
844
869
  range_bytes.len(),
845
870
  cache_entry.last_modified,
846
871
  content_range,
872
+ &self.headers,
847
873
  BoxBody::new(Full::new(range_bytes)),
848
874
  )
849
875
  } else {
@@ -852,12 +878,13 @@ impl StaticFileServer {
852
878
  let body = build_ok_body(content);
853
879
  build_file_response(
854
880
  status,
855
- Some(encoding),
881
+ encoding,
856
882
  Some(&cache_entry.etag),
857
883
  get_mime_type(path),
858
884
  content_length as usize,
859
885
  cache_entry.last_modified,
860
886
  content_range,
887
+ &self.headers,
861
888
  body,
862
889
  )
863
890
  }
@@ -928,6 +955,7 @@ fn build_file_response(
928
955
  content_length: usize,
929
956
  last_modified: SystemTime,
930
957
  range_header: Option<String>,
958
+ headers: &Option<HashMap<String, String>>,
931
959
  body: BoxBody<Bytes, Infallible>,
932
960
  ) -> http::Response<BoxBody<Bytes, Infallible>> {
933
961
  let mut builder = Response::builder()
@@ -947,6 +975,11 @@ fn build_file_response(
947
975
  if let Some(range) = range_header {
948
976
  builder = builder.header(CONTENT_RANGE, range);
949
977
  }
978
+ if let Some(headers) = headers {
979
+ for (key, value) in headers {
980
+ builder = builder.header(key, value);
981
+ }
982
+ }
950
983
 
951
984
  builder.body(body).unwrap()
952
985
  }
@@ -999,23 +1032,6 @@ impl std::fmt::Display for StaticFileServer {
999
1032
  }
1000
1033
  }
1001
1034
 
1002
- impl Default for StaticFileServer {
1003
- fn default() -> Self {
1004
- let config = StaticFileServerConfig {
1005
- root_dir: "public".into(),
1006
- max_file_size: 10 * 1024 * 1024,
1007
- max_entries: 100,
1008
- recheck_interval: Duration::from_secs(60),
1009
- try_html_extension: true,
1010
- auto_index: true,
1011
- not_found_behavior: NotFoundBehavior::Error(ErrorResponse::not_found()),
1012
- serve_hidden_files: false,
1013
- allowed_extensions: vec!["html".to_string(), "css".to_string(), "js".to_string()],
1014
- };
1015
- Self::new(config)
1016
- }
1017
- }
1018
-
1019
1035
  async fn generate_directory_listing(
1020
1036
  dir_path: &Path,
1021
1037
  config: &StaticFileServerConfig,
@@ -3,9 +3,13 @@ use std::{
3
3
  env,
4
4
  sync::{Mutex, OnceLock},
5
5
  };
6
+ use tracing::Level;
6
7
  pub use tracing::{debug, error, info, trace, warn};
7
8
  use tracing_appender::rolling;
8
- use tracing_subscriber::fmt::writer::BoxMakeWriter;
9
+ use tracing_subscriber::fmt::{
10
+ format::{FmtSpan, JsonFields},
11
+ writer::BoxMakeWriter,
12
+ };
9
13
  use tracing_subscriber::{EnvFilter, fmt, prelude::*, reload};
10
14
  use tracing_subscriber::{Layer, Registry, layer::Layered};
11
15
 
@@ -61,6 +65,10 @@ pub struct LogConfig {
61
65
  pub use_ansi: bool,
62
66
  }
63
67
 
68
+ fn default_log_file() -> String {
69
+ env::var("ITSI_LOG_FILE").unwrap_or_else(|_| "itsi-app.log".into())
70
+ }
71
+
64
72
  impl Default for LogConfig {
65
73
  fn default() -> Self {
66
74
  let level = env::var("ITSI_LOG").unwrap_or_else(|_| "info".into());
@@ -69,14 +77,8 @@ impl Default for LogConfig {
69
77
  _ => LogFormat::Plain,
70
78
  };
71
79
  let target = match env::var("ITSI_LOG_TARGET").as_deref() {
72
- Ok("file") => {
73
- let file = env::var("ITSI_LOG_FILE").unwrap_or_else(|_| "app.log".into());
74
- LogTarget::File(file)
75
- }
76
- Ok("both") => {
77
- let file = env::var("ITSI_LOG_FILE").unwrap_or_else(|_| "app.log".into());
78
- LogTarget::Both(file)
79
- }
80
+ Ok("file") => LogTarget::File(default_log_file()),
81
+ Ok("both") => LogTarget::Both(default_log_file()),
80
82
  _ => LogTarget::Stdout,
81
83
  };
82
84
  // If ITSI_LOG_ANSI is set, use that; otherwise, use ANSI if stdout is a TTY.
@@ -110,21 +112,27 @@ fn build_fmt_layer(
110
112
  .compact()
111
113
  .with_file(false)
112
114
  .with_line_number(false)
113
- .with_target(false)
114
- .with_thread_ids(false)
115
- .with_writer(BoxMakeWriter::new(std::io::stdout))
116
- .with_ansi(config.use_ansi)
117
- .boxed(),
118
- LogFormat::Json => fmt::layer()
119
- .compact()
120
- .with_file(false)
121
- .with_line_number(false)
122
- .with_target(false)
115
+ .with_target(true)
123
116
  .with_thread_ids(false)
124
117
  .with_writer(BoxMakeWriter::new(std::io::stdout))
125
118
  .with_ansi(config.use_ansi)
126
- .json()
119
+ .with_span_events(FmtSpan::NONE)
120
+ .fmt_fields(JsonFields::new())
127
121
  .boxed(),
122
+ LogFormat::Json => {
123
+ fmt::layer()
124
+ .compact()
125
+ .with_file(false)
126
+ .with_line_number(false)
127
+ .with_target(true)
128
+ .with_thread_ids(false)
129
+ .with_writer(BoxMakeWriter::new(std::io::stdout))
130
+ .with_ansi(config.use_ansi)
131
+ .event_format(fmt::format().json()) // set the JSON event formatter
132
+ .with_span_events(FmtSpan::NONE)
133
+ .fmt_fields(JsonFields::new())
134
+ .boxed()
135
+ }
128
136
  },
129
137
  LogTarget::File(file) => {
130
138
  let file_clone = file.clone();
@@ -133,12 +141,14 @@ fn build_fmt_layer(
133
141
  .compact()
134
142
  .with_file(false)
135
143
  .with_line_number(false)
136
- .with_target(false)
144
+ .with_target(true)
137
145
  .with_thread_ids(false)
138
146
  .with_writer(BoxMakeWriter::new(move || {
139
147
  rolling::daily(".", file_clone.clone())
140
148
  }))
141
149
  .with_ansi(false)
150
+ .with_span_events(FmtSpan::NONE)
151
+ .fmt_fields(JsonFields::new())
142
152
  .boxed(),
143
153
  LogFormat::Json => {
144
154
  let file_clone = file.clone();
@@ -146,13 +156,15 @@ fn build_fmt_layer(
146
156
  .compact()
147
157
  .with_file(false)
148
158
  .with_line_number(false)
149
- .with_target(false)
159
+ .with_target(true)
150
160
  .with_thread_ids(false)
151
161
  .with_writer(BoxMakeWriter::new(move || {
152
162
  rolling::daily(".", file_clone.clone())
153
163
  }))
154
164
  .with_ansi(false)
155
- .json()
165
+ .event_format(fmt::format().json()) // set the JSON event formatter
166
+ .with_span_events(FmtSpan::NONE)
167
+ .fmt_fields(JsonFields::new())
156
168
  .boxed()
157
169
  }
158
170
  }
@@ -165,19 +177,23 @@ fn build_fmt_layer(
165
177
  .compact()
166
178
  .with_file(false)
167
179
  .with_line_number(false)
168
- .with_target(false)
180
+ .with_target(true)
169
181
  .with_thread_ids(false)
170
182
  .with_writer(BoxMakeWriter::new(std::io::stdout))
183
+ .with_span_events(FmtSpan::NONE)
184
+ .fmt_fields(JsonFields::new())
171
185
  .with_ansi(config.use_ansi);
172
186
  let file_layer = fmt::layer()
173
187
  .compact()
174
188
  .with_file(false)
175
189
  .with_line_number(false)
176
- .with_target(false)
190
+ .with_target(true)
177
191
  .with_thread_ids(false)
178
192
  .with_writer(BoxMakeWriter::new(move || {
179
193
  rolling::daily(".", file_clone.clone())
180
194
  }))
195
+ .with_span_events(FmtSpan::NONE)
196
+ .fmt_fields(JsonFields::new())
181
197
  .with_ansi(false);
182
198
  stdout_layer.and_then(file_layer).boxed()
183
199
  }
@@ -186,22 +202,26 @@ fn build_fmt_layer(
186
202
  .compact()
187
203
  .with_file(false)
188
204
  .with_line_number(false)
189
- .with_target(false)
205
+ .with_target(true)
190
206
  .with_thread_ids(false)
191
207
  .with_writer(BoxMakeWriter::new(std::io::stdout))
192
208
  .with_ansi(config.use_ansi)
193
- .json();
209
+ .event_format(fmt::format().json()) // set the JSON event formatter
210
+ .with_span_events(FmtSpan::NONE)
211
+ .fmt_fields(JsonFields::new());
194
212
  let file_layer = fmt::layer()
195
213
  .compact()
196
214
  .with_file(false)
197
215
  .with_line_number(false)
198
- .with_target(false)
216
+ .with_target(true)
199
217
  .with_thread_ids(false)
200
218
  .with_writer(BoxMakeWriter::new(move || {
201
219
  rolling::daily(".", file_clone.clone())
202
220
  }))
203
221
  .with_ansi(false)
204
- .json();
222
+ .event_format(fmt::format().json()) // set the JSON event formatter
223
+ .with_span_events(FmtSpan::NONE)
224
+ .fmt_fields(JsonFields::new());
205
225
  stdout_layer.and_then(file_layer).boxed()
206
226
  }
207
227
  }
@@ -278,6 +298,7 @@ pub fn set_level(new_level: &str) {
278
298
  pub fn set_target(new_target: &str) {
279
299
  let target: LogTarget = match new_target {
280
300
  "stdout" => LogTarget::Stdout,
301
+ "both" => LogTarget::Both(default_log_file()),
281
302
  path => LogTarget::File(path.to_string()),
282
303
  };
283
304
  if let Some(config_mutex) = CURRENT_CONFIG.get() {
@@ -304,6 +325,36 @@ pub fn set_format(new_format: &str) {
304
325
  eprintln!("Current configuration not initialized; call init() first.");
305
326
  }
306
327
  }
328
+ pub fn set_target_filters(targets: Vec<(&str, Level)>) {
329
+ if let Some(reload_handle_mutex) = RELOAD_HANDLE.get() {
330
+ if let Ok(handle_guard) = reload_handle_mutex.lock() {
331
+ if let Some(handle) = handle_guard.as_ref() {
332
+ let mut new_filter = EnvFilter::new("");
333
+
334
+ if let Some(config_mutex) = CURRENT_CONFIG.get() {
335
+ if let Ok(config) = config_mutex.lock() {
336
+ if let Ok(directive) = config.level.parse() {
337
+ new_filter = new_filter.add_directive(directive);
338
+ }
339
+ }
340
+ }
341
+
342
+ for (target, level) in targets {
343
+ let directive_str = format!("{}={}", target, level);
344
+ if let Ok(directive) = directive_str.parse() {
345
+ new_filter = new_filter.add_directive(directive);
346
+ }
347
+ }
348
+
349
+ if let Err(e) = handle.modify(|filter| *filter = new_filter) {
350
+ eprintln!("Failed to update filter with target directives: {}", e);
351
+ }
352
+ }
353
+ }
354
+ } else {
355
+ eprintln!("Reload handle for filter not initialized; call init() first.");
356
+ }
357
+ }
307
358
 
308
359
  /// Run a function silently by temporarily setting a no-op subscriber.
309
360
  pub fn run_silently<F, R>(f: F) -> R
data/docker/Dockerfile ADDED
@@ -0,0 +1,12 @@
1
+ FROM ruby:3.4.2-slim
2
+
3
+ WORKDIR /app
4
+
5
+ # Install only what's needed to install the gem, then clean up in the same layer
6
+ RUN apt-get update && \
7
+ apt-get install -y --no-install-recommends libclang-dev build-essential curl && \
8
+ gem install itsi --no-document && \
9
+ apt-get purge -y --auto-remove build-essential && \
10
+ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
11
+
12
+ ENTRYPOINT ["itsi"]
@@ -1,17 +1,24 @@
1
1
  ---
2
- title: My Site
3
- toc: false
2
+ type: docs
4
3
  ---
4
+ # Itsi
5
+ <img src="itsi-server-100.png" alt="asd" width="80px" style="display: block; margin-left: auto; margin-right: auto;">
5
6
 
6
- This is the landing page.
7
+ > The Serious Web Server, for Serious People
7
8
 
8
- ## Explore
9
9
 
10
- {{< cards >}}
11
- {{< card link="docs" title="Docs" icon="book-open" >}}
12
- {{< card link="about" title="About" icon="user" >}}
13
- {{< /cards >}}
10
+ Itsi is a feature-packed, high performance web and application server, with first-class support for Ruby applications.
11
+ It's a compliant Rack server. It’s also a well-equipped reverse-proxy, API gateway, and static file server, controlled by an intuitive and elegant configuration API and DSL.
12
+
14
13
 
15
- ## Documentation
14
+ Itsi is motivated by the belief that:
15
+ >*It should be **easy** to share your application on the internet with confidence, without a need for complex configuration or multiple layers of tools.*
16
16
 
17
- For more information, visit [Hextra](https://imfing.github.io/hextra).
17
+ With *just* your application code and *Itsi* working within a single process, you can proudly serve your best work, directly to the world wide web.
18
+
19
+ {{< cards >}}
20
+ {{< card link="../features" title="Features" icon="star" >}}
21
+ {{< card link="../getting_started" title="Getting Started" icon="academic-cap" >}}
22
+ {{< card link="../configuration" title="Configuration" icon="adjustments" >}}
23
+ {{< card link="https://github.com/wouterken/itsi" title="Source Code" icon="github" >}}
24
+ {{< /cards >}}
@@ -0,0 +1,46 @@
1
+ ---
2
+ title: Acknowledgements
3
+ type: docs
4
+ prev: itsi_scheduler/
5
+ sidebar:
6
+ exclude: true
7
+ ---
8
+
9
+ Itsi has a long list of **critical** dependencies and **strong** influences.
10
+
11
+
12
+ ## Key Dependencies
13
+ * [hyper](https://hyper.rs/)
14
+ Hyper is a fast, correct and memory-safe HTTP1 & 2 Implementation in Rust.
15
+ It is an absolutely essential component of Itsi.
16
+
17
+ * [tokio](https://tokio.rs/)
18
+ Tokio is a fast and featureful asynchronous runtime for Rust.
19
+ It is the backbone of *all* asynchronous IO in Itsi.
20
+
21
+ * [rb-sys](https://github.com/oxidize-rb/rb-sys) and [magnus](https://github.com/matsadler/magnus), two essential libraries for building Ruby extensions in Rust.
22
+
23
+ * and many more [essential](https://github.com/wouterken/itsi/blob/main/crates/itsi_server/Cargo.toml) Rust crates!
24
+
25
+ * [hugo](https://gohugo.io/) and [hextra](https://imfing.github.io/hextra/) - generating *this very page* and allowing me to put together
26
+ this website with minimal effort.
27
+
28
+
29
+ ## Inspiration
30
+ * [Puma](https://puma.io/) is a long-standing industry heavyweight and the current leading choice of web server in the Ruby ecosystem.
31
+ It's mature, stable and rock solid. Many features and interfaces of Itsi have been inspired by Puma.
32
+
33
+ * [NGINX](https://nginx.org/) is a popular open-source web server and reverse proxy server.
34
+ It's highly scalable and a great choice for high-traffic websites.
35
+ Many of Itsi's proxy and static file server design decisions and features have been inspired by their NGINX equivalents.
36
+
37
+ * The [Async](https://github.com/socketry/async) ecosystem and [Falcon](https://github.com/socketry/falcon), championed by [@ioaquatix](https://github.com/ioquatix) - a fellow Kiwi.
38
+ These tools and efforts in driving forward Ruby's cooperative multitasking have been a great inspiration and source of learning for Itsi's async IO design.
39
+
40
+ * [Iodine](https://github.com/boazsegev/iodine), [Agoo](https://github.com/ohler55/agoo). Two class-leading options when it comes to blazing fast Ruby servers written in native code.
41
+
42
+ * [Caddy](https://caddyserver.com/)
43
+ An open-source web server and reverse proxy server, with a huge feature set, great performance, and arguably the first tool to popularize automated ACME certificate management.
44
+
45
+ * [RubyLSP](https://shopify.github.io/ruby-lsp/)
46
+ An open-source language server for Ruby, built by engineers at Shopify making it *easy* to significantly enhance the Itsi developer experience.