itsi-server 0.1.1 → 0.1.20

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.

Potentially problematic release.


This version of itsi-server might be problematic. Click here for more details.

Files changed (324) hide show
  1. checksums.yaml +4 -4
  2. data/Cargo.lock +4487 -0
  3. data/Cargo.toml +7 -0
  4. data/README.md +6 -0
  5. data/Rakefile +8 -1
  6. data/exe/itsi +141 -46
  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.toml +3 -0
  30. data/ext/itsi_error/src/lib.rs +98 -24
  31. data/ext/itsi_error/target/debug/build/clang-sys-da71b0344e568175/out/common.rs +355 -0
  32. data/ext/itsi_error/target/debug/build/clang-sys-da71b0344e568175/out/dynamic.rs +276 -0
  33. data/ext/itsi_error/target/debug/build/clang-sys-da71b0344e568175/out/macros.rs +49 -0
  34. data/ext/itsi_error/target/debug/build/rb-sys-49f554618693db24/out/bindings-0.9.110-mri-arm64-darwin23-3.4.2.rs +8865 -0
  35. data/ext/itsi_error/target/debug/incremental/itsi_error-1mmt5sux7jb0i/s-h510z7m8v9-0bxu7yd.lock +0 -0
  36. data/ext/itsi_error/target/debug/incremental/itsi_error-2vn3jey74oiw0/s-h5113n0e7e-1v5qzs6.lock +0 -0
  37. data/ext/itsi_error/target/debug/incremental/itsi_error-37uv9dicz7awp/s-h510ykifhe-0tbnep2.lock +0 -0
  38. data/ext/itsi_error/target/debug/incremental/itsi_error-37uv9dicz7awp/s-h510yyocpj-0tz7ug7.lock +0 -0
  39. data/ext/itsi_error/target/debug/incremental/itsi_error-37uv9dicz7awp/s-h510z0xc8g-14ol18k.lock +0 -0
  40. data/ext/itsi_error/target/debug/incremental/itsi_error-3g5qf4y7d54uj/s-h5113n0e7d-1trk8on.lock +0 -0
  41. data/ext/itsi_error/target/debug/incremental/itsi_error-3lpfftm45d3e2/s-h510z7m8r3-1pxp20o.lock +0 -0
  42. data/ext/itsi_error/target/debug/incremental/itsi_error-3o4qownhl3d7n/s-h510ykifek-1uxasnk.lock +0 -0
  43. data/ext/itsi_error/target/debug/incremental/itsi_error-3o4qownhl3d7n/s-h510yyocki-11u37qm.lock +0 -0
  44. data/ext/itsi_error/target/debug/incremental/itsi_error-3o4qownhl3d7n/s-h510z0xc93-0pmy0zm.lock +0 -0
  45. data/ext/itsi_instrument_entry/Cargo.toml +15 -0
  46. data/ext/itsi_instrument_entry/src/lib.rs +31 -0
  47. data/ext/itsi_rb_helpers/Cargo.toml +3 -0
  48. data/ext/itsi_rb_helpers/src/heap_value.rs +139 -0
  49. data/ext/itsi_rb_helpers/src/lib.rs +140 -10
  50. data/ext/itsi_rb_helpers/target/debug/build/clang-sys-da71b0344e568175/out/common.rs +355 -0
  51. data/ext/itsi_rb_helpers/target/debug/build/clang-sys-da71b0344e568175/out/dynamic.rs +276 -0
  52. data/ext/itsi_rb_helpers/target/debug/build/clang-sys-da71b0344e568175/out/macros.rs +49 -0
  53. data/ext/itsi_rb_helpers/target/debug/build/rb-sys-eb9ed4ff3a60f995/out/bindings-0.9.110-mri-arm64-darwin23-3.4.2.rs +8865 -0
  54. data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-040pxg6yhb3g3/s-h5113n7a1b-03bwlt4.lock +0 -0
  55. data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-131g1u4dzkt1a/s-h51113xnh3-1eik1ip.lock +0 -0
  56. data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-131g1u4dzkt1a/s-h5111704jj-0g4rj8x.lock +0 -0
  57. data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-1q2d3drtxrzs5/s-h5113n79yl-0bxcqc5.lock +0 -0
  58. data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-374a9h7ovycj0/s-h51113xoox-10de2hp.lock +0 -0
  59. data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-374a9h7ovycj0/s-h5111704w7-0vdq7gq.lock +0 -0
  60. data/ext/itsi_scheduler/Cargo.toml +24 -0
  61. data/ext/itsi_scheduler/src/itsi_scheduler/io_helpers.rs +56 -0
  62. data/ext/itsi_scheduler/src/itsi_scheduler/io_waiter.rs +44 -0
  63. data/ext/itsi_scheduler/src/itsi_scheduler/timer.rs +44 -0
  64. data/ext/itsi_scheduler/src/itsi_scheduler.rs +308 -0
  65. data/ext/itsi_scheduler/src/lib.rs +38 -0
  66. data/ext/itsi_server/Cargo.lock +2956 -0
  67. data/ext/itsi_server/Cargo.toml +75 -14
  68. data/ext/itsi_server/extconf.rb +1 -1
  69. data/ext/itsi_server/src/default_responses/html/401.html +68 -0
  70. data/ext/itsi_server/src/default_responses/html/403.html +68 -0
  71. data/ext/itsi_server/src/default_responses/html/404.html +68 -0
  72. data/ext/itsi_server/src/default_responses/html/413.html +71 -0
  73. data/ext/itsi_server/src/default_responses/html/429.html +68 -0
  74. data/ext/itsi_server/src/default_responses/html/500.html +71 -0
  75. data/ext/itsi_server/src/default_responses/html/502.html +71 -0
  76. data/ext/itsi_server/src/default_responses/html/503.html +68 -0
  77. data/ext/itsi_server/src/default_responses/html/504.html +69 -0
  78. data/ext/itsi_server/src/default_responses/html/index.html +238 -0
  79. data/ext/itsi_server/src/default_responses/json/401.json +6 -0
  80. data/ext/itsi_server/src/default_responses/json/403.json +6 -0
  81. data/ext/itsi_server/src/default_responses/json/404.json +6 -0
  82. data/ext/itsi_server/src/default_responses/json/413.json +6 -0
  83. data/ext/itsi_server/src/default_responses/json/429.json +6 -0
  84. data/ext/itsi_server/src/default_responses/json/500.json +6 -0
  85. data/ext/itsi_server/src/default_responses/json/502.json +6 -0
  86. data/ext/itsi_server/src/default_responses/json/503.json +6 -0
  87. data/ext/itsi_server/src/default_responses/json/504.json +6 -0
  88. data/ext/itsi_server/src/default_responses/mod.rs +11 -0
  89. data/ext/itsi_server/src/env.rs +43 -0
  90. data/ext/itsi_server/src/lib.rs +132 -40
  91. data/ext/itsi_server/src/prelude.rs +2 -0
  92. data/ext/itsi_server/src/ruby_types/itsi_body_proxy/big_bytes.rs +109 -0
  93. data/ext/itsi_server/src/ruby_types/itsi_body_proxy/mod.rs +143 -0
  94. data/ext/itsi_server/src/ruby_types/itsi_grpc_call.rs +344 -0
  95. data/ext/itsi_server/src/ruby_types/itsi_grpc_response_stream/mod.rs +264 -0
  96. data/ext/itsi_server/src/ruby_types/itsi_http_request.rs +345 -0
  97. data/ext/itsi_server/src/ruby_types/itsi_http_response.rs +391 -0
  98. data/ext/itsi_server/src/ruby_types/itsi_server/file_watcher.rs +225 -0
  99. data/ext/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +506 -0
  100. data/ext/itsi_server/src/ruby_types/itsi_server.rs +84 -0
  101. data/ext/itsi_server/src/ruby_types/mod.rs +48 -0
  102. data/ext/itsi_server/src/server/binds/bind.rs +201 -0
  103. data/ext/itsi_server/src/server/binds/bind_protocol.rs +37 -0
  104. data/ext/itsi_server/src/server/binds/listener.rs +437 -0
  105. data/ext/itsi_server/src/server/binds/mod.rs +4 -0
  106. data/ext/itsi_server/src/server/binds/tls/locked_dir_cache.rs +132 -0
  107. data/ext/itsi_server/src/server/binds/tls.rs +270 -0
  108. data/ext/itsi_server/src/server/byte_frame.rs +32 -0
  109. data/ext/itsi_server/src/server/http_message_types.rs +97 -0
  110. data/ext/itsi_server/src/server/io_stream.rs +105 -0
  111. data/ext/itsi_server/src/server/lifecycle_event.rs +12 -0
  112. data/ext/itsi_server/src/server/middleware_stack/middleware.rs +170 -0
  113. data/ext/itsi_server/src/server/middleware_stack/middlewares/allow_list.rs +56 -0
  114. data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_api_key.rs +87 -0
  115. data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_basic.rs +86 -0
  116. data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_jwt.rs +338 -0
  117. data/ext/itsi_server/src/server/middleware_stack/middlewares/cache_control.rs +142 -0
  118. data/ext/itsi_server/src/server/middleware_stack/middlewares/compression.rs +289 -0
  119. data/ext/itsi_server/src/server/middleware_stack/middlewares/cors.rs +292 -0
  120. data/ext/itsi_server/src/server/middleware_stack/middlewares/csp.rs +179 -0
  121. data/ext/itsi_server/src/server/middleware_stack/middlewares/deny_list.rs +55 -0
  122. data/ext/itsi_server/src/server/middleware_stack/middlewares/error_response/default_responses.rs +190 -0
  123. data/ext/itsi_server/src/server/middleware_stack/middlewares/error_response.rs +157 -0
  124. data/ext/itsi_server/src/server/middleware_stack/middlewares/etag.rs +195 -0
  125. data/ext/itsi_server/src/server/middleware_stack/middlewares/header_interpretation.rs +82 -0
  126. data/ext/itsi_server/src/server/middleware_stack/middlewares/intrusion_protection.rs +201 -0
  127. data/ext/itsi_server/src/server/middleware_stack/middlewares/log_requests.rs +82 -0
  128. data/ext/itsi_server/src/server/middleware_stack/middlewares/max_body.rs +47 -0
  129. data/ext/itsi_server/src/server/middleware_stack/middlewares/mod.rs +110 -0
  130. data/ext/itsi_server/src/server/middleware_stack/middlewares/proxy.rs +414 -0
  131. data/ext/itsi_server/src/server/middleware_stack/middlewares/rate_limit.rs +131 -0
  132. data/ext/itsi_server/src/server/middleware_stack/middlewares/redirect.rs +76 -0
  133. data/ext/itsi_server/src/server/middleware_stack/middlewares/request_headers.rs +44 -0
  134. data/ext/itsi_server/src/server/middleware_stack/middlewares/response_headers.rs +36 -0
  135. data/ext/itsi_server/src/server/middleware_stack/middlewares/ruby_app.rs +126 -0
  136. data/ext/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs +181 -0
  137. data/ext/itsi_server/src/server/middleware_stack/middlewares/static_response.rs +55 -0
  138. data/ext/itsi_server/src/server/middleware_stack/middlewares/string_rewrite.rs +163 -0
  139. data/ext/itsi_server/src/server/middleware_stack/middlewares/token_source.rs +12 -0
  140. data/ext/itsi_server/src/server/middleware_stack/mod.rs +345 -0
  141. data/ext/itsi_server/src/server/mod.rs +12 -5
  142. data/ext/itsi_server/src/server/process_worker.rs +247 -0
  143. data/ext/itsi_server/src/server/request_job.rs +11 -0
  144. data/ext/itsi_server/src/server/serve_strategy/cluster_mode.rs +348 -0
  145. data/ext/itsi_server/src/server/serve_strategy/mod.rs +30 -0
  146. data/ext/itsi_server/src/server/serve_strategy/single_mode.rs +444 -0
  147. data/ext/itsi_server/src/server/signal.rs +76 -0
  148. data/ext/itsi_server/src/server/size_limited_incoming.rs +101 -0
  149. data/ext/itsi_server/src/server/thread_worker.rs +475 -0
  150. data/ext/itsi_server/src/services/cache_store.rs +74 -0
  151. data/ext/itsi_server/src/services/itsi_http_service.rs +239 -0
  152. data/ext/itsi_server/src/services/mime_types.rs +1416 -0
  153. data/ext/itsi_server/src/services/mod.rs +6 -0
  154. data/ext/itsi_server/src/services/password_hasher.rs +83 -0
  155. data/ext/itsi_server/src/services/rate_limiter.rs +569 -0
  156. data/ext/itsi_server/src/services/static_file_server.rs +1326 -0
  157. data/ext/itsi_tracing/Cargo.toml +5 -0
  158. data/ext/itsi_tracing/src/lib.rs +346 -7
  159. data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-0994n8rpvvt9m/s-h510hfz1f6-1kbycmq.lock +0 -0
  160. data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-0bob7bf4yq34i/s-h5113125h5-0lh4rag.lock +0 -0
  161. data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2fcodulrxbbxo/s-h510h2infk-0hp5kjw.lock +0 -0
  162. data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2iak63r1woi1l/s-h510h2in4q-0kxfzw1.lock +0 -0
  163. data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2kk4qj9gn5dg2/s-h5113124kv-0enwon2.lock +0 -0
  164. data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2mwo0yas7dtw4/s-h510hfz1ha-1udgpei.lock +0 -0
  165. data/lib/itsi/http_request/response_status_shortcodes.rb +74 -0
  166. data/lib/itsi/http_request.rb +187 -0
  167. data/lib/itsi/http_response.rb +41 -0
  168. data/lib/itsi/passfile.rb +109 -0
  169. data/lib/itsi/server/config/config_helpers.rb +93 -0
  170. data/lib/itsi/server/config/dsl.rb +626 -0
  171. data/lib/itsi/server/config/known_paths/KitchensinkDirectories.txt +2346 -0
  172. data/lib/itsi/server/config/known_paths/Randomfiles.txt +24 -0
  173. data/lib/itsi/server/config/known_paths/UnixDotfiles.txt +52 -0
  174. data/lib/itsi/server/config/known_paths/backdoors/ASP_CommonBackdoors.txt +29 -0
  175. data/lib/itsi/server/config/known_paths/backdoors/bot_control_panels.txt +1668 -0
  176. data/lib/itsi/server/config/known_paths/backdoors/shells.txt +1167 -0
  177. data/lib/itsi/server/config/known_paths/cgi/CGI_HTTP_POST.txt +7 -0
  178. data/lib/itsi/server/config/known_paths/cgi/CGI_HTTP_POST_Windows.txt +6 -0
  179. data/lib/itsi/server/config/known_paths/cgi/CGI_Microsoft.txt +79 -0
  180. data/lib/itsi/server/config/known_paths/cgi/CGI_XPlatform.txt +3948 -0
  181. data/lib/itsi/server/config/known_paths/cms/README.md +5 -0
  182. data/lib/itsi/server/config/known_paths/cms/drupal_plugins.txt +6320 -0
  183. data/lib/itsi/server/config/known_paths/cms/drupal_themes.txt +828 -0
  184. data/lib/itsi/server/config/known_paths/cms/joomla_plugins.txt +224 -0
  185. data/lib/itsi/server/config/known_paths/cms/joomla_themes.txt +30 -0
  186. data/lib/itsi/server/config/known_paths/cms/php-nuke.txt +2142 -0
  187. data/lib/itsi/server/config/known_paths/cms/wordpress.txt +1566 -0
  188. data/lib/itsi/server/config/known_paths/cms/wp_common_theme_files.txt +46 -0
  189. data/lib/itsi/server/config/known_paths/cms/wp_plugins.txt +13366 -0
  190. data/lib/itsi/server/config/known_paths/cms/wp_plugins_full.txt +68662 -0
  191. data/lib/itsi/server/config/known_paths/cms/wp_plugins_top225.txt +225 -0
  192. data/lib/itsi/server/config/known_paths/cms/wp_themes.readme +12 -0
  193. data/lib/itsi/server/config/known_paths/cms/wp_themes.txt +7336 -0
  194. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/3CharExtBrute.txt +17576 -0
  195. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/CommonWebExtensions.txt +80 -0
  196. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Backup.txt +14 -0
  197. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Common.txt +865 -0
  198. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Compressed.txt +186 -0
  199. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Mostcommon.txt +30 -0
  200. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Skipfish.txt +93 -0
  201. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/WordlistSkipfish.txt +1918 -0
  202. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/copy_of.txt +8 -0
  203. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-directories-lowercase.txt +56180 -0
  204. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-directories.txt +62290 -0
  205. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-extensions-lowercase.txt +2367 -0
  206. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-extensions.txt +2450 -0
  207. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-files-lowercase.txt +35323 -0
  208. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-files.txt +37037 -0
  209. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-words-lowercase.txt +107982 -0
  210. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-words.txt +119600 -0
  211. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-directories-lowercase.txt +26593 -0
  212. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-directories.txt +30009 -0
  213. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-extensions-lowercase.txt +1233 -0
  214. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-extensions.txt +1289 -0
  215. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-files-lowercase.txt +16243 -0
  216. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-files.txt +17128 -0
  217. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-words-lowercase.txt +56293 -0
  218. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-words.txt +63087 -0
  219. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-directories-lowercase.txt +17776 -0
  220. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-directories.txt +20122 -0
  221. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-extensions-lowercase.txt +914 -0
  222. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-extensions.txt +963 -0
  223. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-files-lowercase.txt +10848 -0
  224. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-files.txt +11424 -0
  225. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-words-lowercase.txt +38267 -0
  226. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-words.txt +43003 -0
  227. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/spanish.txt +445 -0
  228. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/test_demo.txt +36 -0
  229. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/upload_variants.txt +44 -0
  230. data/lib/itsi/server/config/known_paths/login-file-locations/Logins.txt +71 -0
  231. data/lib/itsi/server/config/known_paths/login-file-locations/cfm.txt +294 -0
  232. data/lib/itsi/server/config/known_paths/login-file-locations/html.txt +295 -0
  233. data/lib/itsi/server/config/known_paths/login-file-locations/jsp.txt +294 -0
  234. data/lib/itsi/server/config/known_paths/login-file-locations/php.txt +294 -0
  235. data/lib/itsi/server/config/known_paths/login-file-locations/windows-asp.txt +294 -0
  236. data/lib/itsi/server/config/known_paths/login-file-locations/windows-aspx.txt +294 -0
  237. data/lib/itsi/server/config/known_paths/password-file-locations/Passwords.txt +47 -0
  238. data/lib/itsi/server/config/known_paths/php/PHP.txt +30 -0
  239. data/lib/itsi/server/config/known_paths/php/PHP_CommonBackdoors.txt +5 -0
  240. data/lib/itsi/server/config/known_paths/proxy-conf.txt +31 -0
  241. data/lib/itsi/server/config/known_paths/tftp.txt +79 -0
  242. data/lib/itsi/server/config/known_paths/webservers-appservers/ADFS.txt +86 -0
  243. data/lib/itsi/server/config/known_paths/webservers-appservers/AdobeXML.txt +16 -0
  244. data/lib/itsi/server/config/known_paths/webservers-appservers/Apache.txt +101 -0
  245. data/lib/itsi/server/config/known_paths/webservers-appservers/ApacheTomcat.txt +47 -0
  246. data/lib/itsi/server/config/known_paths/webservers-appservers/Apache_Axis.txt +16 -0
  247. data/lib/itsi/server/config/known_paths/webservers-appservers/ColdFusion.txt +111 -0
  248. data/lib/itsi/server/config/known_paths/webservers-appservers/FatwireCMS.txt +390 -0
  249. data/lib/itsi/server/config/known_paths/webservers-appservers/Frontpage.txt +38 -0
  250. data/lib/itsi/server/config/known_paths/webservers-appservers/HP_System_Mgmt_Homepage.txt +239 -0
  251. data/lib/itsi/server/config/known_paths/webservers-appservers/HTTP_POST_Microsoft.txt +2 -0
  252. data/lib/itsi/server/config/known_paths/webservers-appservers/Hyperion.txt +578 -0
  253. data/lib/itsi/server/config/known_paths/webservers-appservers/IIS.txt +187 -0
  254. data/lib/itsi/server/config/known_paths/webservers-appservers/JBoss.txt +5 -0
  255. data/lib/itsi/server/config/known_paths/webservers-appservers/JRun.txt +13 -0
  256. data/lib/itsi/server/config/known_paths/webservers-appservers/JavaServlets_Common.txt +3 -0
  257. data/lib/itsi/server/config/known_paths/webservers-appservers/Joomla_exploitable.txt +1937 -0
  258. data/lib/itsi/server/config/known_paths/webservers-appservers/LotusNotes.txt +206 -0
  259. data/lib/itsi/server/config/known_paths/webservers-appservers/Netware.txt +18 -0
  260. data/lib/itsi/server/config/known_paths/webservers-appservers/Oracle9i.txt +60 -0
  261. data/lib/itsi/server/config/known_paths/webservers-appservers/OracleAppServer.txt +192 -0
  262. data/lib/itsi/server/config/known_paths/webservers-appservers/README.md +6 -0
  263. data/lib/itsi/server/config/known_paths/webservers-appservers/Ruby_Rails.txt +121 -0
  264. data/lib/itsi/server/config/known_paths/webservers-appservers/SAP.txt +463 -0
  265. data/lib/itsi/server/config/known_paths/webservers-appservers/Sharepoint.txt +1707 -0
  266. data/lib/itsi/server/config/known_paths/webservers-appservers/SiteMinder.txt +19 -0
  267. data/lib/itsi/server/config/known_paths/webservers-appservers/SunAppServerGlassfish.txt +51 -0
  268. data/lib/itsi/server/config/known_paths/webservers-appservers/SuniPlanet.txt +35 -0
  269. data/lib/itsi/server/config/known_paths/webservers-appservers/Vignette.txt +73 -0
  270. data/lib/itsi/server/config/known_paths/webservers-appservers/Weblogic.txt +160 -0
  271. data/lib/itsi/server/config/known_paths/webservers-appservers/Websphere.txt +366 -0
  272. data/lib/itsi/server/config/known_paths/wellknown-rfc5785.txt +30 -0
  273. data/lib/itsi/server/config/known_paths.rb +17 -0
  274. data/lib/itsi/server/config/middleware/_index.md +54 -0
  275. data/lib/itsi/server/config/middleware/log_requests.md +63 -0
  276. data/lib/itsi/server/config/middleware/log_requests.rb +33 -0
  277. data/lib/itsi/server/config/middleware.rb +9 -0
  278. data/lib/itsi/server/config/option.rb +9 -0
  279. data/lib/itsi/server/config/options/_index.md +36 -0
  280. data/lib/itsi/server/config/options/fiber_scheduler.md +35 -0
  281. data/lib/itsi/server/config/options/fiber_scheduler.rb +18 -0
  282. data/lib/itsi/server/config/options/threads.md +39 -0
  283. data/lib/itsi/server/config/options/threads.rb +17 -0
  284. data/lib/itsi/server/config/options/workers.md +43 -0
  285. data/lib/itsi/server/config/options/workers.rb +17 -0
  286. data/lib/itsi/server/config/typed_struct.rb +203 -0
  287. data/lib/itsi/server/config.rb +260 -0
  288. data/lib/itsi/server/default_app/default_app.rb +34 -0
  289. data/lib/itsi/server/default_app/index.html +115 -0
  290. data/lib/itsi/server/default_config/Itsi-rackup.rb +119 -0
  291. data/lib/itsi/server/default_config/Itsi.rb +107 -0
  292. data/lib/itsi/server/grpc/grpc_call.rb +246 -0
  293. data/lib/itsi/server/grpc/grpc_interface.rb +100 -0
  294. data/lib/itsi/server/grpc/reflection/v1/reflection_pb.rb +26 -0
  295. data/lib/itsi/server/grpc/reflection/v1/reflection_services_pb.rb +122 -0
  296. data/lib/itsi/server/rack/handler/itsi.rb +27 -0
  297. data/lib/itsi/server/rack_interface.rb +94 -0
  298. data/lib/itsi/server/route_tester.rb +107 -0
  299. data/lib/itsi/server/scheduler_interface.rb +21 -0
  300. data/lib/itsi/server/scheduler_mode.rb +10 -0
  301. data/lib/itsi/server/signal_trap.rb +33 -0
  302. data/lib/itsi/server/typed_handlers/param_parser.rb +200 -0
  303. data/lib/itsi/server/typed_handlers/source_parser.rb +55 -0
  304. data/lib/itsi/server/typed_handlers.rb +17 -0
  305. data/lib/itsi/server/version.rb +1 -1
  306. data/lib/itsi/server.rb +181 -9
  307. data/lib/itsi/standard_headers.rb +86 -0
  308. data/lib/ruby_lsp/itsi/addon.rb +127 -0
  309. data/lib/shell_completions/completions.rb +26 -0
  310. metadata +321 -28
  311. data/CHANGELOG.md +0 -5
  312. data/CODE_OF_CONDUCT.md +0 -132
  313. data/LICENSE.txt +0 -21
  314. data/ext/itsi_server/src/request/itsi_request.rs +0 -143
  315. data/ext/itsi_server/src/request/mod.rs +0 -1
  316. data/ext/itsi_server/src/server/bind.rs +0 -138
  317. data/ext/itsi_server/src/server/itsi_ca/itsi_ca.crt +0 -32
  318. data/ext/itsi_server/src/server/itsi_ca/itsi_ca.key +0 -52
  319. data/ext/itsi_server/src/server/itsi_server.rs +0 -182
  320. data/ext/itsi_server/src/server/listener.rs +0 -218
  321. data/ext/itsi_server/src/server/tls.rs +0 -138
  322. data/ext/itsi_server/src/server/transfer_protocol.rs +0 -23
  323. data/ext/itsi_server/src/stream_writer/mod.rs +0 -21
  324. data/lib/itsi/request.rb +0 -39
@@ -0,0 +1,260 @@
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
+
13
+ def self.prep_reexec!
14
+ @argv ||= ARGV[0...ARGV.index("--listeners")]
15
+
16
+ auto_suppress_fork_darwin_fork_safety_warnings = [
17
+ ENV["OBJC_DISABLE_INITIALIZE_FORK_SAFETY"].nil? || ENV["PGGSSENCMODE"].nil?,
18
+ RUBY_PLATFORM =~ /darwin/,
19
+ !ENV.key?("ITSI_DISABLE_AUTO_DISABLE_DARWIN_FORK_SAFETY_WARNINGS"),
20
+ $PROGRAM_NAME =~ /itsi$/
21
+ ].all?
22
+ return unless auto_suppress_fork_darwin_fork_safety_warnings
23
+
24
+ env = ENV.to_h.merge("OBJC_DISABLE_INITIALIZE_FORK_SAFETY" => "YES", "PGGSSENCMODE" => "disable")
25
+ if ENV["BUNDLE_BIN_PATH"]
26
+ exec env, "bundle", "exec", $PROGRAM_NAME, *@argv
27
+ else
28
+ exec env, $PROGRAM_NAME, *@argv
29
+ end
30
+ end
31
+
32
+ # The configuration used when launching the Itsi server are evaluated in the following precedence:
33
+ # 1. CLI Args.
34
+ # 2. Itsi.rb file.
35
+ # 3. Default values.
36
+ def self.build_config(args, config_file_path, builder_proc = nil)
37
+ args.transform_keys!(&:to_sym)
38
+ itsifile_config, errors = \
39
+ if builder_proc
40
+ DSL.evaluate(&builder_proc)
41
+ elsif args[:static]
42
+ DSL.evaluate do
43
+ location "/" do
44
+ allow_list allowed_patterns: ['127.0.0.1']
45
+ rate_limit key: 'address', store_config: 'in_memory', requests: 2, seconds: 5
46
+ etag type: 'strong', algorithm: 'md5', min_body_size: 1024 * 1024
47
+ compress min_size: 1024 * 1024, level: 'fastest', algorithms: %w[zstd gzip brotli deflate], mime_types: %w[all], compress_streams: true
48
+ log_requests before: { level: "INFO", format: "[{request_id}] {method} {path_and_query} - {addr} " }, after: { level: "INFO", format: "[{request_id}] └─ {status} in {response_time}" }
49
+ static_assets \
50
+ relative_path: true,
51
+ allowed_extensions: [],
52
+ root_dir: '.',
53
+ not_found_behavior: {error: 'not_found'},
54
+ auto_index: true,
55
+ try_html_extension: true,
56
+ max_file_size_in_memory: 1024 * 1024, # 1MB
57
+ max_files_in_memory: 1000,
58
+ file_check_interval: 1,
59
+ serve_hidden_files: false,
60
+ headers: {
61
+ 'X-Content-Type-Options' => 'nosniff'
62
+ }
63
+ end
64
+ end
65
+ elsif File.exist?(config_file_path.to_s)
66
+ DSL.evaluate(config_file_path)
67
+ elsif File.exist?("./config.ru")
68
+ DSL.evaluate do
69
+ preload true
70
+ rackup_file args.fetch(:rackup_file, "./config.ru")
71
+ end
72
+ else
73
+ DSL.evaluate{}
74
+ end
75
+
76
+ itsifile_config.transform_keys!(&:to_sym)
77
+
78
+ # We'll preload while we load config, if enabled.
79
+ middleware_loader = itsifile_config.fetch(:middleware_loader, -> {})
80
+ preload = args.fetch(:preload) { itsifile_config.fetch(:preload, false) }
81
+
82
+ case preload
83
+ # If we preload everything, then we'll load middleware and default rack app ahead of time
84
+ when true
85
+ preloaded_middleware = middleware_loader.call
86
+ middleware_loader = -> { preloaded_middleware }
87
+ # If we're just preloading a specific gem group, we'll do that here too
88
+ when Symbol
89
+ Bundler.require(preload)
90
+ end
91
+
92
+ [
93
+ {
94
+ workers: args.fetch(:workers) { itsifile_config.fetch(:workers, 1) },
95
+ worker_memory_limit: args.fetch(:worker_memory_limit) { itsifile_config.fetch(:worker_memory_limit, nil) },
96
+ silence: args.fetch(:silence) { itsifile_config.fetch(:silence, false) },
97
+ shutdown_timeout: args.fetch(:shutdown_timeout) { itsifile_config.fetch(:shutdown_timeout, 5) },
98
+ hooks: itsifile_config.fetch(:hooks, nil),
99
+ preload: !!preload,
100
+ request_timeout: itsifile_config.fetch(:request_timeout, nil),
101
+ header_read_timeout: args.fetch(:header_read_timeout) { itsifile_config.fetch(:header_read_timeout, nil) },
102
+ notify_watchers: itsifile_config.fetch(:notify_watchers, nil),
103
+ threads: args.fetch(:threads) { itsifile_config.fetch(:threads, 1) },
104
+ scheduler_threads: args.fetch(:scheduler_threads) { itsifile_config.fetch(:scheduler_threads, nil) },
105
+ streamable_body: args.fetch(:streamable_body) { itsifile_config.fetch(:streamable_body, false) },
106
+ multithreaded_reactor: args.fetch(:multithreaded_reactor) do
107
+ itsifile_config.fetch(:multithreaded_reactor, nil)
108
+ end,
109
+ pin_worker_cores: args.fetch(:pin_worker_cores) { itsifile_config.fetch(:pin_worker_cores, true) },
110
+ scheduler_class: args.fetch(:scheduler_class) { itsifile_config.fetch(:scheduler_class, nil) },
111
+ oob_gc_responses_threshold: args.fetch(:oob_gc_responses_threshold) do
112
+ itsifile_config.fetch(:oob_gc_responses_threshold, nil)
113
+ end,
114
+ log_level: args.fetch(:log_level) { itsifile_config.fetch(:log_level, nil) },
115
+ log_format: args.fetch(:log_format) { itsifile_config.fetch(:log_format, nil) },
116
+ log_target: args.fetch(:log_target) { itsifile_config.fetch(:log_target, nil) },
117
+ log_target_filters: args.fetch(:log_target_filters) { itsifile_config.fetch(:log_target_filters, nil) },
118
+ binds: args.fetch(:binds) { itsifile_config.fetch(:binds, ["http://0.0.0.0:3000"]) },
119
+ middleware_loader: middleware_loader,
120
+ listeners: args.fetch(:listeners) { nil },
121
+ reuse_address: itsifile_config.fetch(:reuse_address, true),
122
+ reuse_port: itsifile_config.fetch(:reuse_port, true),
123
+ listen_backlog: itsifile_config.fetch(:listen_backlog, 1024 ),
124
+ nodelay: itsifile_config.fetch(:nodelay, true),
125
+ recv_buffer_size: itsifile_config.fetch(:recv_buffer_size, 262_144)
126
+ }.transform_keys(&:to_s),
127
+
128
+ errors.flat_map do |(error, message)|
129
+ location = message[/(.*?)\:in/,1]
130
+ file, lineno = location.split(":")
131
+ lineno = lineno.to_i
132
+ err_message = error.kind_of?(NoMethodError) ? error.detailed_message : error.message
133
+ file_lines = IO.readlines(file)
134
+ info_lines = if error.kind_of?(SyntaxError)
135
+ []
136
+ else
137
+ ([lineno-2, 0].max...[file_lines.length, lineno.succ.succ].min).map do |currline|
138
+ [
139
+ " #{currline.succ.to_s.rjust(3)} | #{file_lines[currline].strip}",
140
+ if currline == lineno-1
141
+ " | ^^^ "
142
+ end
143
+ ].compact
144
+ end.flatten
145
+ end
146
+ [
147
+ err_message,
148
+ " --> #{File.expand_path(file)}:#{lineno}",
149
+ *info_lines
150
+ ]
151
+ end
152
+ ]
153
+ end
154
+
155
+ def self.test!(cli_params)
156
+ _, errors = build_config(cli_params, Itsi::Server::Config.config_file_path(cli_params[:config_file]))
157
+ if errors.any?
158
+ Itsi.log_error("Config file is invalid")
159
+ puts errors
160
+ else
161
+ Itsi.log_info("Config file is valid")
162
+ end
163
+ end
164
+
165
+ # Reloads the entire process
166
+ # using exec, passing in any active file descriptors
167
+ # and previous invocation arguments
168
+ def self.reload_exec(listener_info)
169
+ if ENV["BUNDLE_BIN_PATH"]
170
+ exec "bundle", "exec", $PROGRAM_NAME, *@argv, "--listeners", listener_info
171
+ else
172
+ exec $PROGRAM_NAME, *@argv, "--listeners", listener_info
173
+ end
174
+ end
175
+
176
+ # Find config file path, if it exists.
177
+ def self.config_file_path(config_file_path = nil)
178
+ config_file_path ||= \
179
+ if File.exist?(ITSI_DEFAULT_CONFIG_FILE)
180
+ ITSI_DEFAULT_CONFIG_FILE
181
+ elsif File.exist?("config/#{ITSI_DEFAULT_CONFIG_FILE}")
182
+ "config/#{ITSI_DEFAULT_CONFIG_FILE}"
183
+ end
184
+ # Options simply pass through unless we've specified a config file
185
+ return unless File.exist?(config_file_path.to_s)
186
+
187
+ config_file_path
188
+ end
189
+
190
+ def self.pid_file_path
191
+ if Dir.exist?("tmp")
192
+ File.join("tmp", "itsi.pid")
193
+ else
194
+ ".itsi.pid"
195
+ end
196
+ end
197
+
198
+ # Write a default config file, if one doesn't exist.
199
+ def self.write_default
200
+ if File.exist?(ITSI_DEFAULT_CONFIG_FILE)
201
+ puts "#{ITSI_DEFAULT_CONFIG_FILE} already exists."
202
+ return
203
+ end
204
+
205
+ default_config = IO.read("#{__dir__}/default_config/Itsi.rb")
206
+
207
+ if File.exist?("./config.ru")
208
+ default_config << <<~RUBY
209
+ # You can mount several Ruby apps as either
210
+ # 1. rackup files
211
+ # 2. inline rack apps
212
+ # 3. inline Ruby endpoints
213
+ #
214
+ # 1. rackup_file
215
+ rackup_file "./config.ru"
216
+ #
217
+ # 2. inline rack app
218
+ # require 'rack'
219
+ # run(Rack::Builder.app do
220
+ # use Rack::CommonLogger
221
+ # run ->(env) { [200, { 'content-type' => 'text/plain' }, ['OK']] }
222
+ # end)
223
+ #
224
+ # 3. Endpoints
225
+ # endpoint "/" do |req|
226
+ # req.ok "Hello from Itsi"
227
+ # end
228
+ RUBY
229
+ else
230
+ default_config << <<~RUBY
231
+ # You can mount several Ruby apps as either
232
+ # 1. rackup files
233
+ # 2. inline rack apps
234
+ # 3. inline Ruby endpoints
235
+ #
236
+ # 1. rackup_file
237
+ # Use `rackup_file` to specify the Rack app file name.
238
+ #
239
+ # 2. inline rack app
240
+ # require 'rack'
241
+ # run(Rack::Builder.app do
242
+ # use Rack::CommonLogger
243
+ # run ->(env) { [200, { 'content-type' => 'text/plain' }, ['OK']] }
244
+ # end)
245
+ #
246
+ # 3. Endpoint
247
+ endpoint "/" do |req|
248
+ req.ok "Hello from Itsi"
249
+ end
250
+ RUBY
251
+ end
252
+
253
+ File.open(ITSI_DEFAULT_CONFIG_FILE, "w") do |file|
254
+ file.write(default_config)
255
+ end
256
+
257
+ end
258
+ end
259
+ end
260
+ 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,119 @@
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.fetch("ITSI_WORKERS") {
14
+ require "etc"
15
+ env == "development" ? 1 : nil
16
+ }
17
+
18
+ # Number of threads to spawn per worker process
19
+ # For pure CPU bound applicationss, you'll get the best results keeping this number low
20
+ # Setting a value of 1 is great for superficial benchmarks, but in reality
21
+ # it's better to set this a bit higher to allow expensive requests to get overtaken and minimize head-of-line blocking
22
+ threads ENV.fetch("ITSI_THREADS", 3)
23
+
24
+ # If your application is IO bound (e.g. performing a lot of proxied HTTP requests, or heavy queries etc)
25
+ # you can see *substantial* benefits from enabling this option.
26
+ # To set this option, pass a string, not a class (as we will not have loaded the class yet)
27
+ # E.g.
28
+ # `fiber_scheduler "Itsi::Scheduler"` - The default fast and light-weight scheduler that comes with Itsi
29
+ # `fiber_scheduler "Async::Scheduler"` - Bring your own scheduler!
30
+ fiber_scheduler nil
31
+
32
+ # By default Itsi will run the Rack app from config.ru.
33
+ # You can provide an alternative Rack app file name here
34
+ # Or you can inline the app directly inside Itsi.rb.
35
+ # Only one of `run` and `rackup_file` can be used.
36
+ # E.g.
37
+ # require 'rack'
38
+ # run(Rack::Builder.app do
39
+ # use Rack::CommonLogger
40
+ # run ->(env) { [200, { 'content-type' => 'text/plain' }, ['OK']] }
41
+ # end)
42
+ rackup_file "config.ru"
43
+
44
+ # If you bind to https, without specifying a certificate, Itsi will use a self-signed certificate.
45
+ # The self-signed certificate will use a CA generated for your host and stored inside `ITSI_LOCAL_CA_DIR` (Defaults to ~/.itsi)
46
+ # bind "https://localhost:3000"
47
+ # bind "https://localhost:3000?domains=dev.itsi.fyi"
48
+ #
49
+ # If you want to use let's encrypt to generate you a real certificate you and pass cert=acme and an acme_email address to generate one.
50
+ # bind "https://itsi.fyi?cert=acme&acme_email=admin@itsi.fyi"
51
+ # You can generate certificates for multiple domains at once, by passing a comma-separated list of domains
52
+ # bind "https://0.0.0.0?domains=foo.itsi.fyi,bar.itsi.fyi&cert=acme&acme_email=admin@itsi.fyi"
53
+ #
54
+ # If you already have a certificate you can specify it using the cert and key parameters
55
+ # bind "https://itsi.fyi?cert=/path/to/cert.pem&key=/path/to/key.pem"
56
+ #
57
+ # You can also bind to a unix socket or a tls unix socket. E.g.
58
+ # bind "unix:///tmp/itsi.sock"
59
+ # bind "tls:///tmp/itsi.secure.sock"
60
+
61
+ if env == "development"
62
+ bind "http://localhost:3000"
63
+ else
64
+ bind "https://0.0.0.0?domains=#{ENV["PRODUCTION_DOMAINS"]}&cert=acme&acme_email=admin@itsi.fyi"
65
+ end
66
+
67
+ # If you want to preload the application, set preload to true
68
+ # to load the entire rack-app defined in rack_file_name before forking.
69
+ # Alternatively, you can preload just a specific set of gems in a group in your gemfile,
70
+ # by providing the group name here.
71
+ # E.g.
72
+ #
73
+ # preload :preload # Load gems inside the preload group
74
+ # preload false # Don't preload.
75
+ #
76
+ # If you want to be able to perform zero-downtime deploys using a single itsi process,
77
+ # you should disable preloads, so that the application is loaded fresh each time a new worker boots
78
+ preload true
79
+
80
+ # Set the maximum memory limit for each worker process in bytes
81
+ # When this limit is reached, the worker will be gracefully restarted.
82
+ # Only one worker is restarted at a time to ensure we don't take down
83
+ # all of them at once, if they reach the threshold simultaneously.
84
+ worker_memory_limit 1024 * 1024 * 1024
85
+
86
+ # You can provide an optional block of code to run, when a worker hits its memory threshold (Use this to send yourself an alert,
87
+ # write metrics to disk etc. etc.)
88
+ after_memory_threshold_reached do |pid|
89
+ puts "Worker #{pid} has reached its memory threshold and will restart"
90
+ end
91
+
92
+ # Do clean up of any non-threadsafe resources before forking a new worker here.
93
+ before_fork {}
94
+
95
+ # Reinitialize any non-threadsafe resources after forking a new worker here.
96
+ after_fork {}
97
+
98
+ # Shutdown timeout
99
+ # Number of seconds to wait for workers to gracefully shutdown before killing them.
100
+ shutdown_timeout 5
101
+
102
+ # Set this to false for application environments that require rack.input to be a rewindable body
103
+ # (like Rails). For rack applications that can stream inputs, you can set this to true for a more memory-efficient approach.
104
+ stream_body false
105
+
106
+ # OOB GC responses threshold
107
+ # Specifies how frequently OOB gc should be triggered during periods where there is a gap in queued requests.
108
+ # Setting this too low can substantially worsen performance
109
+ oob_gc_responses_threshold 512
110
+
111
+ # Log level
112
+ # Set this to one of the following values: debug, info, warn, error, fatal
113
+ # Can also be set using the ITSI_LOG environment variable
114
+ log_level :info
115
+
116
+ # Log Format
117
+ # Set this to be either :ansi or :json. If you leave it blank Itsi will try
118
+ # and auto-detect the format based on the TTY environment.
119
+ log_format :auto
@@ -0,0 +1,107 @@
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.fetch("ITSI_WORKERS") {
14
+ require "etc"
15
+ env == "development" ? 1 : nil
16
+ }
17
+
18
+ # Number of threads to spawn per worker process
19
+ # For pure CPU bound applicationss, you'll get the best results keeping this number low
20
+ # Setting a value of 1 is great for superficial benchmarks, but in reality
21
+ # it's better to set this a bit higher to allow expensive requests to get overtaken and minimize head-of-line blocking
22
+ threads ENV.fetch("ITSI_THREADS", 3)
23
+
24
+ # If your application is IO bound (e.g. performing a lot of proxied HTTP requests, or heavy queries etc)
25
+ # you can see *substantial* benefits from enabling this option.
26
+ # To set this option, pass a string, not a class (as we will not have loaded the class yet)
27
+ # E.g.
28
+ # `fiber_scheduler "Itsi::Scheduler"` - The default fast and light-weight scheduler that comes with Itsi
29
+ # `fiber_scheduler "Async::Scheduler"` - Bring your own scheduler!
30
+ fiber_scheduler nil
31
+
32
+ # If you bind to https, without specifying a certificate, Itsi will use a self-signed certificate.
33
+ # The self-signed certificate will use a CA generated for your host and stored inside `ITSI_LOCAL_CA_DIR` (Defaults to ~/.itsi)
34
+ # bind "https://localhost:3000"
35
+ # bind "https://localhost:3000?domains=dev.itsi.fyi"
36
+ #
37
+ # If you want to use let's encrypt to generate you a real certificate you and pass cert=acme and an acme_email address to generate one.
38
+ # bind "https://itsi.fyi?cert=acme&acme_email=admin@itsi.fyi"
39
+ # You can generate certificates for multiple domains at once, by passing a comma-separated list of domains
40
+ # bind "https://0.0.0.0?domains=foo.itsi.fyi,bar.itsi.fyi&cert=acme&acme_email=admin@itsi.fyi"
41
+ #
42
+ # If you already have a certificate you can specify it using the cert and key parameters
43
+ # bind "https://itsi.fyi?cert=/path/to/cert.pem&key=/path/to/key.pem"
44
+ #
45
+ # You can also bind to a unix socket or a tls unix socket. E.g.
46
+ # bind "unix:///tmp/itsi.sock"
47
+ # bind "tls:///tmp/itsi.secure.sock"
48
+
49
+ if env == "development"
50
+ bind "http://localhost:3000"
51
+ else
52
+ bind "https://0.0.0.0?domains=#{ENV["PRODUCTION_DOMAINS"]}&cert=acme&acme_email=admin@itsi.fyi"
53
+ end
54
+
55
+ # If you want to preload the application, set preload to true
56
+ # to load the entire rack-app defined in rack_file_name before forking.
57
+ # Alternatively, you can preload just a specific set of gems in a group in your gemfile,
58
+ # by providing the group name here.
59
+ # E.g.
60
+ #
61
+ # preload :preload # Load gems inside the preload group
62
+ # preload false # Don't preload.
63
+ #
64
+ # If you want to be able to perform zero-downtime deploys using a single itsi process,
65
+ # you should disable preloads, so that the application is loaded fresh each time a new worker boots
66
+ preload true
67
+
68
+ # Set the maximum memory limit for each worker process in bytes
69
+ # When this limit is reached, the worker will be gracefully restarted.
70
+ # Only one worker is restarted at a time to ensure we don't take down
71
+ # all of them at once, if they reach the threshold simultaneously.
72
+ worker_memory_limit 1024 * 1024 * 1024
73
+
74
+ # You can provide an optional block of code to run, when a worker hits its memory threshold (Use this to send yourself an alert,
75
+ # write metrics to disk etc. etc.)
76
+ after_memory_threshold_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 memory-efficient approach.
92
+ stream_body false
93
+
94
+ # OOB GC responses threshold
95
+ # Specifies how frequently OOB gc should be triggered during periods where there is a gap in queued requests.
96
+ # Setting this too low can substantially worsen performance
97
+ oob_gc_responses_threshold 512
98
+
99
+ # Log level
100
+ # Set this to one of the following values: debug, info, warn, error, fatal
101
+ # Can also be set using the ITSI_LOG environment variable
102
+ log_level :info
103
+
104
+ # Log Format
105
+ # Set this to be either :ansi or :json. If you leave it blank Itsi will try
106
+ # and auto-detect the format based on the TTY environment.
107
+ log_format :auto