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