itsi 0.1.20 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1 -8
  3. data/Cargo.lock +2 -2
  4. data/LICENSE.txt +698 -0
  5. data/README.md +15 -4
  6. data/Rakefile +9 -5
  7. data/crates/itsi_acme/.gitignore +4 -0
  8. data/crates/itsi_acme/Cargo.toml +86 -0
  9. data/crates/itsi_acme/LICENSE-APACHE +201 -0
  10. data/crates/itsi_acme/LICENSE-MIT +23 -0
  11. data/crates/itsi_acme/README.md +9 -0
  12. data/crates/itsi_acme/examples/high_level.rs +63 -0
  13. data/crates/itsi_acme/examples/high_level_warp.rs +52 -0
  14. data/crates/itsi_acme/examples/low_level.rs +87 -0
  15. data/crates/itsi_acme/examples/low_level_axum.rs +66 -0
  16. data/crates/itsi_acme/src/acceptor.rs +81 -0
  17. data/crates/itsi_acme/src/acme.rs +354 -0
  18. data/crates/itsi_acme/src/axum.rs +86 -0
  19. data/crates/itsi_acme/src/cache.rs +39 -0
  20. data/crates/itsi_acme/src/caches/boxed.rs +80 -0
  21. data/crates/itsi_acme/src/caches/composite.rs +69 -0
  22. data/crates/itsi_acme/src/caches/dir.rs +106 -0
  23. data/crates/itsi_acme/src/caches/mod.rs +11 -0
  24. data/crates/itsi_acme/src/caches/no.rs +78 -0
  25. data/crates/itsi_acme/src/caches/test.rs +136 -0
  26. data/crates/itsi_acme/src/config.rs +172 -0
  27. data/crates/itsi_acme/src/https_helper.rs +69 -0
  28. data/crates/itsi_acme/src/incoming.rs +142 -0
  29. data/crates/itsi_acme/src/jose.rs +161 -0
  30. data/crates/itsi_acme/src/lib.rs +142 -0
  31. data/crates/itsi_acme/src/resolver.rs +59 -0
  32. data/crates/itsi_acme/src/state.rs +424 -0
  33. data/crates/itsi_rb_helpers/src/lib.rs +4 -3
  34. data/crates/itsi_scheduler/Cargo.toml +1 -1
  35. data/crates/itsi_scheduler/src/itsi_scheduler.rs +8 -2
  36. data/crates/itsi_scheduler/src/lib.rs +1 -0
  37. data/crates/itsi_server/Cargo.toml +1 -1
  38. data/crates/itsi_server/src/lib.rs +2 -1
  39. data/crates/itsi_server/src/ruby_types/itsi_http_request.rs +18 -1
  40. data/crates/itsi_server/src/ruby_types/itsi_server/file_watcher.rs +11 -3
  41. data/crates/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +122 -63
  42. data/crates/itsi_server/src/ruby_types/itsi_server.rs +2 -0
  43. data/crates/itsi_server/src/server/binds/bind.rs +3 -0
  44. data/crates/itsi_server/src/server/binds/listener.rs +12 -5
  45. data/crates/itsi_server/src/server/binds/tls.rs +13 -5
  46. data/crates/itsi_server/src/server/middleware_stack/middlewares/allow_list.rs +12 -5
  47. data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_api_key.rs +8 -1
  48. data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_basic.rs +9 -1
  49. data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_jwt.rs +48 -43
  50. data/crates/itsi_server/src/server/middleware_stack/middlewares/cache_control.rs +11 -2
  51. data/crates/itsi_server/src/server/middleware_stack/middlewares/compression.rs +39 -12
  52. data/crates/itsi_server/src/server/middleware_stack/middlewares/cors.rs +36 -27
  53. data/crates/itsi_server/src/server/middleware_stack/middlewares/csp.rs +25 -11
  54. data/crates/itsi_server/src/server/middleware_stack/middlewares/deny_list.rs +12 -3
  55. data/crates/itsi_server/src/server/middleware_stack/middlewares/error_response/default_responses.rs +74 -72
  56. data/crates/itsi_server/src/server/middleware_stack/middlewares/error_response.rs +15 -1
  57. data/crates/itsi_server/src/server/middleware_stack/middlewares/etag.rs +11 -8
  58. data/crates/itsi_server/src/server/middleware_stack/middlewares/intrusion_protection.rs +19 -11
  59. data/crates/itsi_server/src/server/middleware_stack/middlewares/log_requests.rs +5 -5
  60. data/crates/itsi_server/src/server/middleware_stack/middlewares/max_body.rs +2 -2
  61. data/crates/itsi_server/src/server/middleware_stack/middlewares/mod.rs +11 -5
  62. data/crates/itsi_server/src/server/middleware_stack/middlewares/proxy.rs +17 -20
  63. data/crates/itsi_server/src/server/middleware_stack/middlewares/rate_limit.rs +19 -8
  64. data/crates/itsi_server/src/server/middleware_stack/middlewares/redirect.rs +16 -37
  65. data/crates/itsi_server/src/server/middleware_stack/middlewares/request_headers.rs +22 -12
  66. data/crates/itsi_server/src/server/middleware_stack/middlewares/response_headers.rs +26 -11
  67. data/crates/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs +7 -1
  68. data/crates/itsi_server/src/server/middleware_stack/middlewares/string_rewrite.rs +14 -4
  69. data/crates/itsi_server/src/server/middleware_stack/middlewares/token_source.rs +19 -0
  70. data/crates/itsi_server/src/server/middleware_stack/mod.rs +49 -13
  71. data/crates/itsi_server/src/server/mod.rs +1 -0
  72. data/crates/itsi_server/src/server/redirect_type.rs +26 -0
  73. data/crates/itsi_server/src/server/serve_strategy/cluster_mode.rs +22 -16
  74. data/crates/itsi_server/src/server/serve_strategy/single_mode.rs +49 -12
  75. data/crates/itsi_server/src/server/signal.rs +1 -0
  76. data/crates/itsi_server/src/server/size_limited_incoming.rs +6 -0
  77. data/crates/itsi_server/src/server/thread_worker.rs +5 -1
  78. data/crates/itsi_server/src/services/itsi_http_service.rs +20 -2
  79. data/crates/itsi_server/src/services/rate_limiter.rs +15 -4
  80. data/crates/itsi_server/src/services/static_file_server.rs +33 -19
  81. data/crates/itsi_tracing/src/lib.rs +42 -22
  82. data/docs/content/_index.md +1 -2
  83. data/docs/content/acknowledgements/_index.md +5 -2
  84. data/docs/content/configuration/_index.md +8 -5
  85. data/docs/content/contact/_index.md +8 -1
  86. data/docs/content/faqs/_index.md +5 -3
  87. data/docs/content/features/_index.md +56 -50
  88. data/docs/content/getting_started/_index.md +8 -5
  89. data/docs/content/getting_started/local_development.md +68 -8
  90. data/docs/content/getting_started/logging.md +16 -9
  91. data/docs/content/getting_started/running_itsi_in_production.md +5 -3
  92. data/docs/content/getting_started/signals.md +38 -0
  93. data/docs/content/itsi_scheduler/_index.md +8 -7
  94. data/docs/content/utilities/_index.md +13 -0
  95. data/docs/content/utilities/config_file_testing.md +17 -0
  96. data/docs/content/utilities/passfile_generator.md +41 -0
  97. data/docs/content/utilities/route_testing.md +27 -0
  98. data/docs/content/utilities/secrets_management.md +30 -0
  99. data/docs/hugo.yaml +1 -1
  100. data/fairytale.txt +3 -4
  101. data/gems/scheduler/Cargo.lock +1 -1
  102. data/gems/scheduler/README.md +4 -5
  103. data/gems/scheduler/Rakefile +0 -4
  104. data/gems/scheduler/lib/itsi/scheduler/version.rb +1 -1
  105. data/gems/scheduler/lib/itsi/scheduler.rb +9 -4
  106. data/gems/scheduler/test/test_active_record.rb +12 -7
  107. data/gems/server/Cargo.lock +1 -1
  108. data/gems/server/Rakefile +0 -4
  109. data/gems/server/exe/itsi +13 -2
  110. data/gems/server/lib/itsi/http_request/response_status_shortcodes.rb +2 -0
  111. data/gems/server/lib/itsi/http_request.rb +40 -9
  112. data/gems/server/lib/itsi/http_response.rb +2 -1
  113. data/gems/server/lib/itsi/passfile.rb +0 -1
  114. data/gems/server/lib/itsi/server/config/config_helpers.rb +20 -8
  115. data/gems/server/lib/itsi/server/config/dsl.rb +20 -435
  116. data/gems/server/lib/itsi/server/config/known_paths.rb +4 -1
  117. data/gems/server/lib/itsi/server/config/middleware/_index.md +6 -4
  118. data/gems/server/lib/itsi/server/config/middleware/allow_list.md +46 -0
  119. data/gems/server/lib/itsi/server/config/middleware/allow_list.rb +42 -0
  120. data/gems/server/lib/itsi/server/config/middleware/auth_api_key.md +90 -0
  121. data/gems/server/lib/itsi/server/config/middleware/auth_api_key.rb +51 -0
  122. data/gems/server/lib/itsi/server/config/middleware/auth_basic.md +45 -0
  123. data/gems/server/lib/itsi/server/config/middleware/auth_basic.rb +44 -0
  124. data/gems/server/lib/itsi/server/config/middleware/auth_jwt.md +82 -0
  125. data/gems/server/lib/itsi/server/config/middleware/auth_jwt.rb +38 -0
  126. data/gems/server/lib/itsi/server/config/middleware/cache_control.md +78 -0
  127. data/gems/server/lib/itsi/server/config/middleware/cache_control.rb +45 -0
  128. data/gems/server/lib/itsi/server/config/middleware/cidr_to_regex.rb +50 -0
  129. data/gems/server/lib/itsi/server/config/middleware/compression.md +50 -0
  130. data/gems/server/lib/itsi/server/config/middleware/compression.rb +37 -0
  131. data/gems/server/lib/itsi/server/config/middleware/cors.md +93 -0
  132. data/gems/server/lib/itsi/server/config/middleware/cors.rb +32 -0
  133. data/gems/server/lib/itsi/server/config/middleware/csp.md +37 -0
  134. data/gems/server/lib/itsi/server/config/middleware/csp.rb +44 -0
  135. data/gems/server/lib/itsi/server/config/middleware/deny_list.md +45 -0
  136. data/gems/server/lib/itsi/server/config/middleware/deny_list.rb +42 -0
  137. data/gems/server/lib/itsi/server/config/middleware/endpoint/_index.md +159 -0
  138. data/gems/server/lib/itsi/server/config/middleware/endpoint/controller.md +186 -0
  139. data/gems/server/lib/itsi/server/config/middleware/endpoint/controller.rb +33 -0
  140. data/gems/server/lib/itsi/server/config/middleware/endpoint/delete.md +12 -0
  141. data/gems/server/lib/itsi/server/config/middleware/endpoint/delete.rb +42 -0
  142. data/gems/server/lib/itsi/server/config/middleware/endpoint/endpoint.rb +99 -0
  143. data/gems/server/lib/itsi/server/config/middleware/endpoint/get.md +12 -0
  144. data/gems/server/lib/itsi/server/config/middleware/endpoint/get.rb +42 -0
  145. data/gems/server/lib/itsi/server/config/middleware/endpoint/http_request.md +44 -0
  146. data/gems/server/lib/itsi/server/config/middleware/endpoint/http_response.md +39 -0
  147. data/gems/server/lib/itsi/server/config/middleware/endpoint/patch.md +12 -0
  148. data/gems/server/lib/itsi/server/config/middleware/endpoint/patch.rb +42 -0
  149. data/gems/server/lib/itsi/server/config/middleware/endpoint/post.md +12 -0
  150. data/gems/server/lib/itsi/server/config/middleware/endpoint/post.rb +42 -0
  151. data/gems/server/lib/itsi/server/config/middleware/endpoint/put.md +12 -0
  152. data/gems/server/lib/itsi/server/config/middleware/endpoint/put.rb +42 -0
  153. data/gems/server/lib/itsi/server/config/middleware/endpoint/schemas.md +122 -0
  154. data/gems/server/lib/itsi/server/config/middleware/error_response.md +61 -0
  155. data/gems/server/lib/itsi/server/config/middleware/error_response.rb +36 -0
  156. data/gems/server/lib/itsi/server/config/middleware/etag.md +59 -0
  157. data/gems/server/lib/itsi/server/config/middleware/etag.rb +27 -0
  158. data/gems/server/lib/itsi/server/config/middleware/grpc.md +172 -0
  159. data/gems/server/lib/itsi/server/config/middleware/grpc.rb +54 -0
  160. data/gems/server/lib/itsi/server/config/middleware/intrusion_protection.md +124 -0
  161. data/gems/server/lib/itsi/server/config/middleware/intrusion_protection.rb +61 -0
  162. data/gems/server/lib/itsi/server/config/middleware/location.md +107 -0
  163. data/gems/server/lib/itsi/server/config/middleware/location.rb +99 -0
  164. data/gems/server/lib/itsi/server/config/middleware/log_requests.md +13 -11
  165. data/gems/server/lib/itsi/server/config/middleware/log_requests.rb +1 -3
  166. data/gems/server/lib/itsi/server/config/middleware/max_body.md +18 -0
  167. data/gems/server/lib/itsi/server/config/middleware/max_body.rb +21 -0
  168. data/gems/server/lib/itsi/server/config/middleware/proxy.md +62 -0
  169. data/gems/server/lib/itsi/server/config/middleware/proxy.rb +41 -0
  170. data/gems/server/lib/itsi/server/config/middleware/rackup_file.md +54 -0
  171. data/gems/server/lib/itsi/server/config/middleware/rackup_file.rb +44 -0
  172. data/gems/server/lib/itsi/server/config/middleware/rate_limit.md +126 -0
  173. data/gems/server/lib/itsi/server/config/middleware/rate_limit.rb +34 -0
  174. data/gems/server/lib/itsi/server/config/middleware/rate_limit_store.rb +25 -0
  175. data/gems/server/lib/itsi/server/config/middleware/redirect.md +55 -0
  176. data/gems/server/lib/itsi/server/config/middleware/redirect.rb +25 -0
  177. data/gems/server/lib/itsi/server/config/middleware/request_headers.md +34 -0
  178. data/gems/server/lib/itsi/server/config/middleware/request_headers.rb +24 -0
  179. data/gems/server/lib/itsi/server/config/middleware/response_headers.md +33 -0
  180. data/gems/server/lib/itsi/server/config/middleware/response_headers.rb +25 -0
  181. data/gems/server/lib/itsi/server/config/middleware/run.md +60 -0
  182. data/gems/server/lib/itsi/server/config/middleware/run.rb +43 -0
  183. data/gems/server/lib/itsi/server/config/middleware/static_assets.md +73 -0
  184. data/gems/server/lib/itsi/server/config/middleware/static_assets.rb +87 -0
  185. data/gems/server/lib/itsi/server/config/middleware/static_response.md +44 -0
  186. data/gems/server/lib/itsi/server/config/middleware/static_response.rb +29 -0
  187. data/gems/server/lib/itsi/server/config/middleware/string_rewrite.md +67 -0
  188. data/gems/server/lib/itsi/server/config/middleware/token_source.rb +32 -0
  189. data/gems/server/lib/itsi/server/config/middleware.rb +4 -0
  190. data/gems/server/lib/itsi/server/config/option.rb +5 -0
  191. data/gems/server/lib/itsi/server/config/options/_index.md +3 -2
  192. data/gems/server/lib/itsi/server/config/options/auto_reload_config.md +13 -0
  193. data/gems/server/lib/itsi/server/config/options/auto_reload_config.rb +41 -0
  194. data/gems/server/lib/itsi/server/config/options/bind.md +71 -0
  195. data/gems/server/lib/itsi/server/config/options/bind.rb +26 -0
  196. data/gems/server/lib/itsi/server/config/options/certificates.md +65 -0
  197. data/gems/server/lib/itsi/server/config/options/daemonize.md +14 -0
  198. data/gems/server/lib/itsi/server/config/options/daemonize.rb +19 -0
  199. data/gems/server/lib/itsi/server/config/options/fiber_scheduler.md +1 -2
  200. data/gems/server/lib/itsi/server/config/options/fiber_scheduler.rb +6 -3
  201. data/gems/server/lib/itsi/server/config/options/header_read_timeout.md +17 -0
  202. data/gems/server/lib/itsi/server/config/options/header_read_timeout.rb +19 -0
  203. data/gems/server/lib/itsi/server/config/options/hooks/_index.md +11 -0
  204. data/gems/server/lib/itsi/server/config/options/hooks/after_fork.md +13 -0
  205. data/gems/server/lib/itsi/server/config/options/hooks/after_fork.rb +28 -0
  206. data/gems/server/lib/itsi/server/config/options/hooks/after_memory_limit_reached.md +14 -0
  207. data/gems/server/lib/itsi/server/config/options/hooks/after_memory_limit_reached.rb +28 -0
  208. data/gems/server/lib/itsi/server/config/options/hooks/after_start.md +12 -0
  209. data/gems/server/lib/itsi/server/config/options/hooks/after_start.rb +28 -0
  210. data/gems/server/lib/itsi/server/config/options/hooks/before_fork.md +13 -0
  211. data/gems/server/lib/itsi/server/config/options/hooks/before_fork.rb +28 -0
  212. data/gems/server/lib/itsi/server/config/options/hooks/before_restart.md +12 -0
  213. data/gems/server/lib/itsi/server/config/options/hooks/before_restart.rb +28 -0
  214. data/gems/server/lib/itsi/server/config/options/hooks/before_shutdown.md +12 -0
  215. data/gems/server/lib/itsi/server/config/options/hooks/before_shutdown.rb +28 -0
  216. data/gems/server/lib/itsi/server/config/options/include.md +20 -0
  217. data/gems/server/lib/itsi/server/config/options/include.rb +36 -0
  218. data/gems/server/lib/itsi/server/config/options/listen_backlog.md +11 -0
  219. data/gems/server/lib/itsi/server/config/options/listen_backlog.rb +19 -0
  220. data/gems/server/lib/itsi/server/config/options/log_format.md +18 -0
  221. data/gems/server/lib/itsi/server/config/options/log_format.rb +19 -0
  222. data/gems/server/lib/itsi/server/config/options/log_level.md +34 -0
  223. data/gems/server/lib/itsi/server/config/options/log_level.rb +20 -0
  224. data/gems/server/lib/itsi/server/config/options/log_target.md +38 -0
  225. data/gems/server/lib/itsi/server/config/options/log_target.rb +19 -0
  226. data/gems/server/lib/itsi/server/config/options/log_target_filters.md +17 -0
  227. data/gems/server/lib/itsi/server/config/options/log_target_filters.rb +19 -0
  228. data/gems/server/lib/itsi/server/config/options/multithreaded_reactor.md +27 -0
  229. data/gems/server/lib/itsi/server/config/options/multithreaded_reactor.rb +24 -0
  230. data/gems/server/lib/itsi/server/config/options/nodelay.md +16 -0
  231. data/gems/server/lib/itsi/server/config/options/nodelay.rb +19 -0
  232. data/gems/server/lib/itsi/server/config/options/oob_gc_responses_threshold.md +19 -0
  233. data/gems/server/lib/itsi/server/config/options/oob_gc_responses_threshold.rb +18 -0
  234. data/gems/server/lib/itsi/server/config/options/pin_worker_cores.md +17 -0
  235. data/gems/server/lib/itsi/server/config/options/pin_worker_cores.rb +19 -0
  236. data/gems/server/lib/itsi/server/config/options/preload.md +21 -0
  237. data/gems/server/lib/itsi/server/config/options/preload.rb +18 -0
  238. data/gems/server/lib/itsi/server/config/options/recv_buffer_size.md +15 -0
  239. data/gems/server/lib/itsi/server/config/options/recv_buffer_size.rb +19 -0
  240. data/gems/server/lib/itsi/server/config/options/redirect_http_to_https.md +21 -0
  241. data/gems/server/lib/itsi/server/config/options/redirect_http_to_https.rb +30 -0
  242. data/gems/server/lib/itsi/server/config/options/request_timeout.md +23 -0
  243. data/gems/server/lib/itsi/server/config/options/request_timeout.rb +19 -0
  244. data/gems/server/lib/itsi/server/config/options/reuse_address.md +16 -0
  245. data/gems/server/lib/itsi/server/config/options/reuse_address.rb +19 -0
  246. data/gems/server/lib/itsi/server/config/options/reuse_port.md +16 -0
  247. data/gems/server/lib/itsi/server/config/options/reuse_port.rb +19 -0
  248. data/gems/server/lib/itsi/server/config/options/scheduler_threads.md +34 -0
  249. data/gems/server/lib/itsi/server/config/options/scheduler_threads.rb +17 -0
  250. data/gems/server/lib/itsi/server/config/options/shutdown_timeout.md +17 -0
  251. data/gems/server/lib/itsi/server/config/options/shutdown_timeout.rb +19 -0
  252. data/gems/server/lib/itsi/server/config/options/stream_body.md +32 -0
  253. data/gems/server/lib/itsi/server/config/options/stream_body.rb +18 -0
  254. data/gems/server/lib/itsi/server/config/options/threads.md +7 -2
  255. data/gems/server/lib/itsi/server/config/options/threads.rb +1 -1
  256. data/gems/server/lib/itsi/server/config/options/watch.md +16 -0
  257. data/gems/server/lib/itsi/server/config/options/watch.rb +28 -0
  258. data/gems/server/lib/itsi/server/config/options/worker_memory_limit.md +22 -0
  259. data/gems/server/lib/itsi/server/config/options/worker_memory_limit.rb +18 -0
  260. data/gems/server/lib/itsi/server/config/options/workers.md +1 -2
  261. data/gems/server/lib/itsi/server/config/options/workers.rb +1 -1
  262. data/gems/server/lib/itsi/server/config/typed_struct.rb +59 -20
  263. data/gems/server/lib/itsi/server/config.rb +77 -48
  264. data/gems/server/lib/itsi/server/default_config/Itsi.rb +3 -3
  265. data/gems/server/lib/itsi/server/grpc/grpc_call.rb +1 -1
  266. data/gems/server/lib/itsi/server/grpc/grpc_interface.rb +11 -4
  267. data/gems/server/lib/itsi/server/rack/handler/itsi.rb +3 -3
  268. data/gems/server/lib/itsi/server/route_tester.rb +58 -8
  269. data/gems/server/lib/itsi/server/signal_trap.rb +1 -1
  270. data/gems/server/lib/itsi/server/typed_handlers/param_parser.rb +14 -18
  271. data/gems/server/lib/itsi/server/typed_handlers/source_parser.rb +5 -4
  272. data/gems/server/lib/itsi/server/typed_handlers.rb +12 -4
  273. data/gems/server/lib/itsi/server/version.rb +1 -1
  274. data/gems/server/lib/itsi/server.rb +98 -14
  275. data/gems/server/lib/ruby_lsp/itsi/addon.rb +20 -18
  276. data/gems/server/test/helpers/test_helper.rb +89 -29
  277. data/gems/server/test/middleware/allow_list.rb +128 -0
  278. data/gems/server/test/middleware/auth_api_key.rb +141 -0
  279. data/gems/server/test/middleware/auth_basic.rb +91 -0
  280. data/gems/server/test/middleware/auth_jwt.rb +214 -0
  281. data/gems/server/test/middleware/cache_control.rb +82 -0
  282. data/gems/server/test/middleware/cidr_to_regex.rb +46 -0
  283. data/gems/server/test/middleware/compression.rb +89 -0
  284. data/gems/server/test/middleware/cors.rb +113 -0
  285. data/gems/server/test/middleware/csp.rb +62 -0
  286. data/gems/server/test/middleware/deny_list.rb +131 -0
  287. data/gems/server/test/middleware/endpoint.rb +300 -0
  288. data/gems/server/test/middleware/etag.rb +75 -0
  289. data/gems/server/test/middleware/grpc/grpc.rb +158 -0
  290. data/gems/server/test/middleware/grpc/test_service.proto +32 -0
  291. data/gems/server/test/middleware/grpc/test_service_impl.rb +28 -0
  292. data/gems/server/test/middleware/grpc/test_service_pb.rb +18 -0
  293. data/gems/server/test/middleware/grpc/test_service_services_pb.rb +30 -0
  294. data/gems/server/test/middleware/header_interpolation.rb +35 -0
  295. data/gems/server/test/middleware/intrusion_protection.rb +259 -0
  296. data/gems/server/test/middleware/location.rb +220 -0
  297. data/gems/server/test/middleware/max_body.rb +20 -0
  298. data/gems/server/test/middleware/proxy.rb +415 -0
  299. data/gems/server/test/middleware/rate_limit.rb +211 -0
  300. data/gems/server/test/middleware/redirect.rb +85 -0
  301. data/gems/server/test/middleware/request_headers.rb +50 -0
  302. data/gems/server/test/middleware/response_headers.rb +50 -0
  303. data/gems/server/test/middleware/static_assets.rb +374 -0
  304. data/gems/server/test/middleware/static_response.rb +56 -0
  305. data/gems/server/test/middleware/string_rewrite.rb +112 -0
  306. data/gems/server/test/options/bind.rb +47 -0
  307. data/gems/server/test/options/header_read_timeout.rb +23 -0
  308. data/gems/server/test/options/test_request_timeout.rb +16 -0
  309. data/gems/server/test/options/test_workers.rb +2 -4
  310. data/gems/server/test/{test_itsi_server.rb → rack/test_rack_server.rb} +2 -2
  311. data/grpc_test/Itsi.rb +11 -0
  312. data/grpc_test/echo.proto +14 -0
  313. data/grpc_test/echo_pb.rb +16 -0
  314. data/grpc_test/echo_service_impl.rb +8 -0
  315. data/grpc_test/echo_services_pb.rb +22 -0
  316. data/lib/itsi/version.rb +1 -1
  317. data/tasks.txt +15 -72
  318. metadata +210 -7
  319. data/gems/server/lib/itsi/server/default_config/Itsi-rackup.rb +0 -119
@@ -6,7 +6,10 @@ use std::{
6
6
  use tracing::Level;
7
7
  pub use tracing::{debug, error, info, trace, warn};
8
8
  use tracing_appender::rolling;
9
- use tracing_subscriber::fmt::writer::BoxMakeWriter;
9
+ use tracing_subscriber::fmt::{
10
+ format::{FmtSpan, JsonFields},
11
+ writer::BoxMakeWriter,
12
+ };
10
13
  use tracing_subscriber::{EnvFilter, fmt, prelude::*, reload};
11
14
  use tracing_subscriber::{Layer, Registry, layer::Layered};
12
15
 
@@ -62,6 +65,10 @@ pub struct LogConfig {
62
65
  pub use_ansi: bool,
63
66
  }
64
67
 
68
+ fn default_log_file() -> String {
69
+ env::var("ITSI_LOG_FILE").unwrap_or_else(|_| "itsi-app.log".into())
70
+ }
71
+
65
72
  impl Default for LogConfig {
66
73
  fn default() -> Self {
67
74
  let level = env::var("ITSI_LOG").unwrap_or_else(|_| "info".into());
@@ -70,14 +77,8 @@ impl Default for LogConfig {
70
77
  _ => LogFormat::Plain,
71
78
  };
72
79
  let target = match env::var("ITSI_LOG_TARGET").as_deref() {
73
- Ok("file") => {
74
- let file = env::var("ITSI_LOG_FILE").unwrap_or_else(|_| "app.log".into());
75
- LogTarget::File(file)
76
- }
77
- Ok("both") => {
78
- let file = env::var("ITSI_LOG_FILE").unwrap_or_else(|_| "app.log".into());
79
- LogTarget::Both(file)
80
- }
80
+ Ok("file") => LogTarget::File(default_log_file()),
81
+ Ok("both") => LogTarget::Both(default_log_file()),
81
82
  _ => LogTarget::Stdout,
82
83
  };
83
84
  // If ITSI_LOG_ANSI is set, use that; otherwise, use ANSI if stdout is a TTY.
@@ -115,17 +116,23 @@ fn build_fmt_layer(
115
116
  .with_thread_ids(false)
116
117
  .with_writer(BoxMakeWriter::new(std::io::stdout))
117
118
  .with_ansi(config.use_ansi)
119
+ .with_span_events(FmtSpan::NONE)
120
+ .fmt_fields(JsonFields::new())
118
121
  .boxed(),
119
- LogFormat::Json => fmt::layer()
120
- .compact()
121
- .with_file(false)
122
- .with_line_number(false)
123
- .with_target(true)
124
- .with_thread_ids(false)
125
- .with_writer(BoxMakeWriter::new(std::io::stdout))
126
- .with_ansi(config.use_ansi)
127
- .json()
128
- .boxed(),
122
+ LogFormat::Json => {
123
+ fmt::layer()
124
+ .compact()
125
+ .with_file(false)
126
+ .with_line_number(false)
127
+ .with_target(true)
128
+ .with_thread_ids(false)
129
+ .with_writer(BoxMakeWriter::new(std::io::stdout))
130
+ .with_ansi(config.use_ansi)
131
+ .event_format(fmt::format().json()) // set the JSON event formatter
132
+ .with_span_events(FmtSpan::NONE)
133
+ .fmt_fields(JsonFields::new())
134
+ .boxed()
135
+ }
129
136
  },
130
137
  LogTarget::File(file) => {
131
138
  let file_clone = file.clone();
@@ -140,6 +147,8 @@ fn build_fmt_layer(
140
147
  rolling::daily(".", file_clone.clone())
141
148
  }))
142
149
  .with_ansi(false)
150
+ .with_span_events(FmtSpan::NONE)
151
+ .fmt_fields(JsonFields::new())
143
152
  .boxed(),
144
153
  LogFormat::Json => {
145
154
  let file_clone = file.clone();
@@ -153,7 +162,9 @@ fn build_fmt_layer(
153
162
  rolling::daily(".", file_clone.clone())
154
163
  }))
155
164
  .with_ansi(false)
156
- .json()
165
+ .event_format(fmt::format().json()) // set the JSON event formatter
166
+ .with_span_events(FmtSpan::NONE)
167
+ .fmt_fields(JsonFields::new())
157
168
  .boxed()
158
169
  }
159
170
  }
@@ -169,6 +180,8 @@ fn build_fmt_layer(
169
180
  .with_target(true)
170
181
  .with_thread_ids(false)
171
182
  .with_writer(BoxMakeWriter::new(std::io::stdout))
183
+ .with_span_events(FmtSpan::NONE)
184
+ .fmt_fields(JsonFields::new())
172
185
  .with_ansi(config.use_ansi);
173
186
  let file_layer = fmt::layer()
174
187
  .compact()
@@ -179,6 +192,8 @@ fn build_fmt_layer(
179
192
  .with_writer(BoxMakeWriter::new(move || {
180
193
  rolling::daily(".", file_clone.clone())
181
194
  }))
195
+ .with_span_events(FmtSpan::NONE)
196
+ .fmt_fields(JsonFields::new())
182
197
  .with_ansi(false);
183
198
  stdout_layer.and_then(file_layer).boxed()
184
199
  }
@@ -191,7 +206,9 @@ fn build_fmt_layer(
191
206
  .with_thread_ids(false)
192
207
  .with_writer(BoxMakeWriter::new(std::io::stdout))
193
208
  .with_ansi(config.use_ansi)
194
- .json();
209
+ .event_format(fmt::format().json()) // set the JSON event formatter
210
+ .with_span_events(FmtSpan::NONE)
211
+ .fmt_fields(JsonFields::new());
195
212
  let file_layer = fmt::layer()
196
213
  .compact()
197
214
  .with_file(false)
@@ -202,7 +219,9 @@ fn build_fmt_layer(
202
219
  rolling::daily(".", file_clone.clone())
203
220
  }))
204
221
  .with_ansi(false)
205
- .json();
222
+ .event_format(fmt::format().json()) // set the JSON event formatter
223
+ .with_span_events(FmtSpan::NONE)
224
+ .fmt_fields(JsonFields::new());
206
225
  stdout_layer.and_then(file_layer).boxed()
207
226
  }
208
227
  }
@@ -279,6 +298,7 @@ pub fn set_level(new_level: &str) {
279
298
  pub fn set_target(new_target: &str) {
280
299
  let target: LogTarget = match new_target {
281
300
  "stdout" => LogTarget::Stdout,
301
+ "both" => LogTarget::Both(default_log_file()),
282
302
  path => LogTarget::File(path.to_string()),
283
303
  };
284
304
  if let Some(config_mutex) = CURRENT_CONFIG.get() {
@@ -8,8 +8,7 @@ type: docs
8
8
 
9
9
 
10
10
  Itsi is a feature-packed, high performance web and application server, with first-class support for Ruby applications.
11
- It's a compliant Rack server with top-tier performance.
12
- It's *also* a well-equipped Reverse Proxy, API Gateway and Static file server, controlled by an intuitive and elegant configuration API and DSL.
11
+ It's a compliant Rack server. It’s also a well-equipped reverse-proxy, API gateway, and static file server, controlled by an intuitive and elegant configuration API and DSL.
13
12
 
14
13
 
15
14
  Itsi is motivated by the belief that:
@@ -1,11 +1,12 @@
1
1
  ---
2
2
  title: Acknowledgements
3
3
  type: docs
4
+ prev: itsi_scheduler/
4
5
  sidebar:
5
6
  exclude: true
6
7
  ---
7
8
 
8
- Itsi is **heavily** is dependent on and/or heavily inspired by a long list of related projects and individuals.
9
+ Itsi has a long list of **critical** dependencies and **strong** influences.
9
10
 
10
11
 
11
12
  ## Key Dependencies
@@ -17,6 +18,8 @@ It is an absolutely essential component of Itsi.
17
18
  Tokio is a fast and featureful asynchronous runtime for Rust.
18
19
  It is the backbone of *all* asynchronous IO in Itsi.
19
20
 
21
+ * [rb-sys](https://github.com/oxidize-rb/rb-sys) and [magnus](https://github.com/matsadler/magnus), two essential libraries for building Ruby extensions in Rust.
22
+
20
23
  * and many more [essential](https://github.com/wouterken/itsi/blob/main/crates/itsi_server/Cargo.toml) Rust crates!
21
24
 
22
25
  * [hugo](https://gohugo.io/) and [hextra](https://imfing.github.io/hextra/) - generating *this very page* and allowing me to put together
@@ -24,7 +27,7 @@ this website with minimal effort.
24
27
 
25
28
 
26
29
  ## Inspiration
27
- * [Puma](https://puma.io/) is a long-standing industry heavy-weight and the current leading choice of Web Server in the Ruby ecosystem.
30
+ * [Puma](https://puma.io/) is a long-standing industry heavyweight and the current leading choice of web server in the Ruby ecosystem.
28
31
  It's mature, stable and rock solid. Many features and interfaces of Itsi have been inspired by Puma.
29
32
 
30
33
  * [NGINX](https://nginx.org/) is a popular open-source web server and reverse proxy server.
@@ -2,7 +2,8 @@
2
2
  title: Configuration
3
3
  type: docs
4
4
  weight: 3
5
- next: /options/
5
+ next: options/
6
+ prev: getting_started/
6
7
  ---
7
8
 
8
9
  ## Itsi.rb
@@ -13,13 +14,13 @@ If you're ready to get stuck in and learn all about what Itsi has to offer, use
13
14
 
14
15
 
15
16
  ## Out-of-the-box
16
- If you prefer a more gradual introduction, Itsi provides several "out-of-the box" capabilities that you can take immediate advantage of *without*, needing to start a dedicated configuration file.
17
+ If you prefer a more gradual introduction, Itsi provides several out-of-the box capabilities that you can take advantage of immediately, *without* needing to create a dedicated configuration file.
17
18
 
18
19
 
19
20
 
20
21
  ## Run Rack Applications
21
22
  Itsi will automatically host your Rack application if you launch it in a directory with a `config.ru` file.
22
- This means, it's a drop in server replacement for your favourite `Rails`, `Hanami`, or `Sinatra` applications.
23
+ This means, it's a drop-in server replacement (and potentially a free performance boost) for your favorite `Rails`, `Hanami`, or `Sinatra` applications.
23
24
 
24
25
  To get started just run
25
26
  ```ruby
@@ -33,7 +34,7 @@ There's also a Rails adapter allowing you to add it to your Gemfile and launch i
33
34
  rails server -U itsi
34
35
  ```
35
36
  {{< callout type="info" >}}
36
- Note that `rails server -U itsi` runs Itsi with a intentionally minimal footprint, specifically for development purposes. To take full advantage of Itsi's concurrency features,
37
+ Note that `rails server -U itsi` runs Itsi with an intentionally minimal footprint, specifically for development purposes. To take full advantage of Itsi's concurrency features,
37
38
  it's advised you tweak these inside a dedicated `Itsi.rb` file.
38
39
  {{< /callout >}}
39
40
 
@@ -90,8 +91,10 @@ COMMAND:
90
91
  restart - Restart the server
91
92
  add_worker - Add a new worker to the server cluster
92
93
  remove_worker - Remove a worker from the server cluster
94
+ test - Test config file validity
93
95
  routes - Print the routes of the server
94
- passfile - Manage hashed users and passwords in a passfile (like .htpasswd). [add, remove, list]
96
+ passfile - Manage hashed users and passwords in a passfile (like .htpasswd). [add, echo, remove, list]
97
+ secret - Generate a new secret for use in a JWT verifier
95
98
  test_route - Test which route a request will be routed to
96
99
  static - Serve static assets in the given directory
97
100
 
@@ -1,7 +1,14 @@
1
1
  ---
2
2
  title: Contact
3
3
  type: docs
4
- weight: 3
5
4
  sidebar:
6
5
  exclude: true
7
6
  ---
7
+ <img src="../itsi-server-100.png" alt="asd" width="80px" style="display: block; margin-left: auto; margin-right: auto;">
8
+
9
+ * GitHub: [@wouterken](https://github.com/wouterken/)
10
+ * Email: [wc@pico.net.nz](mailto:wc@pico.net.nz)
11
+
12
+ For general inquiries, please feel free to contact me via email at wc@pico.net.nz.
13
+
14
+ For issues and bugs, please open an issue on GitHub at https://github.com/wouterken/itsi/issues.
@@ -1,10 +1,12 @@
1
1
  ---
2
- title: F.A.Qs
2
+ title: FAQs
3
3
  type: docs
4
+ prev: middleware/
5
+ next: utilities/
4
6
  ---
5
7
 
6
8
  {{% details title="Is it just for Ruby applications?" closed="true" %}}
7
- **No!** While one of Itsi's goals is to be the most frictionless way to get Ruby onto the web, it stands alone as a powerful Reverse Proxy, Static File Server and API Gateway.
9
+ **No!** While one of Itsi's goals is to be the most frictionless way to get Ruby onto the web, it stands alone as a powerful reverse Proxy, static File Server and API gateway.
8
10
 
9
11
  You can have Itsi sit in front of *any* application that speaks HTTP and immediately benefit from security middleware, performance enhancements, and more.
10
12
  You will need to write a little bit of Ruby, just to configure your Itsi server inside the `Itsi.rb` file. Who knows, maybe you'll learn to love it!
@@ -17,7 +19,7 @@ Take a look at the [Cargo.toml](https://github.com/wouterken/itsi/blob/main/crat
17
19
  This is exposed via a robust and ergonomic Ruby DSL.
18
20
  {{% /details %}}
19
21
 
20
- {{% details title="What License is it under?" closed="true" %}}
22
+ {{% details title="What license is it under?" closed="true" %}}
21
23
  Itsi is an open source project licensed under the terms of the [LGPLv3](https://www.gnu.org/licenses/lgpl-3.0.en.html).
22
24
 
23
25
  You can integrate and use Itsi in your projects—whether they are open source or proprietary—without any licensing fees or obligations, as long as you use Itsi in its unmodified form. However, if you modify Itsi’s source code and distribute the modified version, you are required to release your modifications under the same LGPLv3 license.
@@ -2,11 +2,12 @@
2
2
  title: Features
3
3
  type: docs
4
4
  weight: 1
5
+ next: /getting_started
5
6
  ---
6
7
 
7
8
  Itsi bundles a slew of essential modern web features into a single, easy-to-use package.
8
- Here's a list of several of the essentials.
9
- Jump straight in to [install Itsi](/getting_started) and [configure it](/configuration) for a deeper dive.
9
+ Here's a list of the essentials.
10
+ Or jump straight in to <a target="_blank" href="tsi](/getting_started)">install</a> and <a target="_blank" href="t](/configuration)"> configure</a> for a deeper dive.
10
11
 
11
12
  {{< callout >}}
12
13
  You don't need to use all of the features listed below to benefit from Itsi. E.g.
@@ -25,33 +26,33 @@ Pick and choose **just** the features that make sense for you.
25
26
  * Streaming compression
26
27
  * Serve static precompressed files from the file-system
27
28
  * gRPC compression (`zlib` and `gzip`)
28
- * See [compression](/middleware/compression)
29
+ * See <a target="_blank" href="/middleware/compression">compression</a>
29
30
  {{% /details %}}
30
31
 
31
32
  {{% details title="CORS" closed="true" %}}
32
33
  * Full control over CORS rules on a location-by-location basis.
33
- * See [cors](/middleware/cors)
34
+ * See <a target="_blank" href="/middleware/cors">cors</a>
34
35
  {{% /details %}}
35
36
 
36
37
  {{% details title="ETag and Cache Control" closed="true" %}}
37
38
  * Weak and Strong eTag support.
38
39
  * `If-None-Match` and `If-Modified-Since` support.
39
40
  * Automated etag generation for dynamic content (or forwarding of existing `etags` if present)
40
- * See [etag](/middleware/etag)
41
+ * See <a target="_blank" href="/middleware/etag">etag</a> and <a target="_blank" href="/middleware/cache_control">cache_control</a>
41
42
  {{% /details %}}
42
43
 
43
- {{% details title="Conditional Middleware" closed="true" %}}
44
+ {{% details title="Configurable Middleware" closed="true" %}}
44
45
  * Expressive controls to apply middleware selectively on a request-by-request basis.
45
46
  * Expressive matching based on route, content-type and body size, hostnames etc.
46
47
  * A single Itsi process can support simultaneous running of several apps, each with specialized configuration.
47
- * See [location](/middleware/location)
48
+ * See <a target="_blank" href="/middleware/location">location</a>
48
49
  {{% /details %}}
49
50
 
50
51
  {{% details title="Redirects" closed="true" %}}
51
52
  * Simple redirect functionality (all of `permanent`, `temporary`, `found`, `moved_permanently`)
52
- * HTTP to HTTPs Redirects
53
+ * HTTP to HTTPS Redirects
53
54
  * Dynamic URL Rewriting
54
- * See [redirect](/middleware/redirect)
55
+ * See <a target="_blank" href="/middleware/redirect">redirect</a>
55
56
  {{% /details %}}
56
57
 
57
58
  {{% details title="Reverse Proxy" closed="true" %}}
@@ -61,12 +62,12 @@ Pick and choose **just** the features that make sense for you.
61
62
  * Multiple backends per host, with load balancing and failover support
62
63
  * Automatic retries for Idempotent requests
63
64
  * Configurable error pages
64
- * See [proxy](/middleware/proxy)
65
+ * See <a target="_blank" href="/middleware/proxy">proxy</a>
65
66
  {{% /details %}}
66
67
 
67
68
  {{% details title="Range Requests" closed="true" %}}
68
69
  * Partial content delivery support, so clients can resume downloads or stream large files efficiently.
69
- * See [static_assets](/middleware/static_assets)
70
+ * See <a target="_blank" href="/middleware/static_assets">static_assets</a>
70
71
  {{% /details %}}
71
72
 
72
73
  {{% details title="Static File Server" closed="true" %}}
@@ -75,31 +76,31 @@ Efficiently serves static assets with proper content types and caching headers.
75
76
  * Configurable in-memory caching for faster serving of small and frequently accessed files.
76
77
  * Auto try `.html` extension (for cleaner paths)
77
78
  * Configurable fallback behaviour (e.g. route request misses to an index.html for SPAs)
78
- * See [static_assets](/middleware/static_assets)
79
+ * See <a target="_blank" href="/middleware/static_assets">static_assets</a>
79
80
  {{% /details %}}
80
81
 
81
82
  {{% details title="Multiple Binds" closed="true" %}}
82
83
  * Itsi can listen on multiple IP addresses or ports simultaneously for flexible deployment.
83
84
  * Unix socket binds (both plain-text and TLS) are supported.
84
- * See [bind](/options/bind).
85
+ * See <a target="_blank" href="/options/bind">bind</a>.
85
86
  {{% /details %}}
86
87
 
87
88
  ## DevOps
88
89
  {{% details title="File Watcher & Live Reloading" closed="true" %}}
89
90
  * Monitors file changes and to automatically reloads configuration or content.
90
91
  * Use custom watchers to e.g. trigger frontend builds on file changes.
91
- * See [local_development](/getting_started/local_development).
92
+ * See <a target="_blank" href="/getting_started/local_development">local_development</a>, <a target="_blank" href="/options/auto_reload_config">auto_reload_config</a>, and <a target="_blank" href="/options/watch">watch</a>.
92
93
  {{% /details %}}
93
94
 
94
95
  {{% details title="LSP and shell completion support" closed="true" %}}
95
96
  * The bundled RubyLSP addon provides rich inline documentation and hover support when editing `Itsi.rb` files.
96
- * Shell completion support (just add `eval "$(itsi --install-completions)"` to the bottom of your shell init file)
97
- * See [local_development](/getting_started/local_development).
97
+ * Shell completion support (add `eval "$(itsi --install-completions)"` to the bottom of your shell init file)
98
+ * See <a target="_blank" href="/getting_started/local_development">local_development</a>.
98
99
  {{% /details %}}
99
100
 
100
101
  {{% details title="Status Reporting" closed="true" %}}
101
102
  * Send SIGUSR2 to trigger detailed status report across all Itsi processes.
102
- * See [signals](/getting_started/signals).
103
+ * See <a target="_blank" href="/getting_started/signals">signals</a>.
103
104
  {{% /details %}}
104
105
 
105
106
  {{% details title="Granular Logging" closed="true" %}}
@@ -107,25 +108,25 @@ Efficiently serves static assets with proper content types and caching headers.
107
108
  * Support `STDOUT`, file-system and combined log sinks.
108
109
  * Apply selective log levels for specific log targets only.
109
110
  * Configurable request logging middleware, with custom log templates.
110
- * See [log_responses](/middleware/log_responses) & [logging](/getting_started/logging).
111
+ * See <a target="_blank" href="/middleware/log_requests">Request Logs</a> & <a target="_blank" href="/getting_started/logging">Logging</a>.
111
112
  {{% /details %}}
112
113
 
113
114
  {{% details title="Hot Config Reloads & Config File Validation" closed="true" %}}
114
115
  * Zero-downtime config file reloads.
115
116
  * Phased restart support when running in `cluster` mode
116
117
  * Config file testing and dry-run functionality
117
- * See [hot_reloads](/getting_started/hot_reloads).
118
+ * See <a target="_blank" href="/getting_started/signals">signals</a> and <a target="_blank" href="/options/auto_reload_config">auto_reload_config</a>.
118
119
  {{% /details %}}
119
120
 
120
121
  {{% details title="Configurable Error Responses" closed="true" %}}
121
122
  * Provide your own exception responses (HTML and JSON) for all common exception scenarios, or simply rely on the light-weight defaults.
122
- * See [error_responses](/middleware/error_responses).
123
+ * See <a target="_blank" href="/middleware/error_response">error_responses</a>.
123
124
  {{% /details %}}
124
125
 
125
126
  {{% details title="Management Signals" closed="true" %}}
126
127
  * Use a full suite of Unix signals to control your live Itsi cluster.
127
128
  * Add or remove workers on the fly, reload config, generate status reports etc.
128
- * See [signals](/getting_started/signals).
129
+ * See <a target="_blank" href="/getting_started/signals">signals</a>.
129
130
  {{% /details %}}
130
131
 
131
132
  ## Security
@@ -137,118 +138,123 @@ Efficiently serves static assets with proper content types and caching headers.
137
138
 
138
139
  Itsi also comes bundled with a passfile generator, to help you manage your password hashes effectively.
139
140
 
140
- * See [auth_jwt](/middleware/auth_jwt), [auth_api_key](/middleware/auth_api_key), [auth_basic](/middleware/auth_basic) and [passfile](/getting_started/passfile).
141
+ * See <a target="_blank" href="/middleware/auth_jwt">auth_jwt</a>, <a target="_blank" href="/middleware/auth_api_key">auth_api_key</a>, <a target="_blank" href="/middleware/auth_basic">auth_basic</a> and <a target="_blank" href="/utilities/passfile_generator">passfile</a>.
141
142
  {{% /details %}}
142
143
 
143
144
  {{% details title="Automatic Let's Encrypt Certificates" closed="true" %}}
144
145
  * Automated provisioning of Let's Encrypt certificates.
145
146
  * File system caching of certificate data to avoid excessive API calls.
146
147
  * Supports usage of subject alternative names (SANs) for certificates that span multiple domains/sub-domains.
147
- * See [bind](/options/bind).
148
+ * See <a target="_blank" href="/options/certificates#production-certificates-lets-encrypt">certificates</a>.
148
149
  {{% /details %}}
149
150
 
150
151
  {{% details title="Automatic Development Certificates" closed="true" %}}
151
152
  * Easily mirror your production SSL set-up in Development
152
153
  * Custom local CA generation (add this CA cert to your trusted root certificates for warning-less SSL during local development)
153
- * See [bind](/options/bind).
154
+ * See <a target="_blank" href="/options/certificates#development">certificates</a>.
154
155
  {{% /details %}}
155
156
 
156
157
  {{% details title="(Distributed) Rate Limiting" closed="true" %}}
157
158
  * Combine any number of configurable rate limits
158
159
  * Support for a `Redis` backend for distributed rate limiting (falls back to in-memory backend)
159
160
  * In-memory backend for simple setups and local development.
160
- * See [rate_limit](/middleware/rate_limit).
161
+ * See <a target="_blank" href="/middleware/rate_limit">rate_limit</a>.
161
162
  {{% /details %}}
162
163
 
163
164
  {{% details title="Allow & Deny Lists" closed="true" %}}
164
165
  * IP Allow lists to limit access to a specific set of IP addresses or blocks.
165
166
  * IP Deny lists to block access from specific IP addresses or blocks.
166
- * See [allow_list](/middleware/allow_list) & [deny_list](/middleware/deny_list).
167
+ * See <a target="_blank" href="/middleware/allow_list">allow_list</a> & <a target="_blank" href="/middleware/deny_list">deny_list</a>.
167
168
  {{% /details %}}
168
169
 
169
170
  {{% details title="Intrusion Protection" closed="true" %}}
170
171
  * Automatically scan request paths and headers for known malicious patterns
171
172
  * Configurable ban rules to block offenders for a specified duration.
172
- * See [intrusion_protection](/middleware/intrusion_protection)
173
+ * See <a target="_blank" href="/middleware/intrusion_protection">intrusion_protection</a>
173
174
  {{% /details %}}
174
175
 
175
176
  {{% details title="Slowhttp attack prevention" closed="true" %}}
176
177
  * Protections against several slowhttp attacks (e.g. Slowloris, Slowbody), through header and request timeouts and maximum request body sizes.
177
- * See [max_body](/options/max_body), [request_timeout](/options/request_timeout) and [header_read_timeout](/options/header_read_timeout)
178
+ * See <a target="_blank" href="/options/max_body">max_body</a>, <a target="_blank" href="/options/request_timeout">request_timeout</a> and <a target="_blank" href="/options/header_read_timeout">header_read_timeout</a>
178
179
  {{% /details %}}
179
180
 
180
181
  {{% details title="CSP Reporting" closed="true" %}}
181
182
  * Simple configuration for enabling CSP headers.
182
183
  * Support for hosting a CSP reporting endpoint to track violations of CSPs running in reporting only mode.
183
- * See [CSP](/middleware/csp)
184
+ * See <a target="_blank" href="/middleware/csp">CSP</a>
184
185
  {{% /details %}}
185
186
 
186
187
  ## Protocols & Standards
187
188
  {{% details title="HTTP2" closed="true" %}}
188
189
  * Benefit from connection multiplexing by using http2 all the way from client to app/file server.
189
- * `Itsi`'s underlying HTTP1 and 2 implementations are provided directly by [hyper](https://github.com/hyperium/hyper). Itsi simply exposes these existing capabilities. This means that once [h3](https://hyper.rs/contrib/roadmap/#http3) lands in Hyper - we'll get it in Itsi too!
190
+ * `Itsi`'s underlying HTTP1 and 2 implementations are provided directly by <a target="_blank" href="https://github.com/hyperium/hyper">hyper</a>. Itsi simply exposes these existing capabilities. This means that once <a target="_blank" href="https://hyper.rs/contrib/roadmap/#http3">h3</a> lands in Hyper - we'll get it in Itsi too!
190
191
  {{% /details %}}
191
192
 
192
193
  {{% details title="Rack Server" closed="true" %}}
193
194
  * Rack compliant. Itsi plays nicely with your existing Rack-based applications and middleware.
194
- * See [run](/middleware/run) and [rack_file](/middleware/rack_file)
195
+ * See <a target="_blank" href="/middleware/run">run</a> and <a target="_blank" href="/middleware/rackup_file">rackup_file</a>
195
196
  {{% /details %}}
196
197
 
197
198
  {{% details title="gRPC Server" closed="true" %}}
198
199
  * Itsi is compatible with ruby `grpc` service handlers and can
199
- replace the [official Ruby gRPC server implementation](https://github.com/grpc/grpc/blob/master/src/ruby/README.md) for a free performance boost!
200
- * Consider implementing non-blocking IO to further enhance performance.
200
+ replace the <a target="_blank" href="https://github.com/grpc/grpc/blob/master/src/ruby/README.md">official</a> Ruby gRPC server implementation for a free performance boost!
201
+ * Consider enabling [non-blocking IO](/options/fiber_scheduler) to further enhance performance.
201
202
  * Support for gRPC server reflection (use with tools like evans and Postman for easy service discovery)
202
203
  * Support for gzip and zlib compression
203
- * See [grpc](/middleware/grpc)
204
+ * See <a target="_blank" href="/middleware/grpc">grpc</a>
204
205
  {{% /details %}}
205
206
 
206
207
  {{% details title="gRPC+REST compatibility mode" closed="true" %}}
207
208
  * Itsi provides a `gRPC+REST` compatibility layer for easy reuse of gRPC endpoints by clients and environments that are not gRPC capable. Invoke unidirectional and streaming endpoints using plain-old JSON.
208
- * See [grpc](/middleware/grpc)
209
+ * See <a target="_blank" href="/middleware/grpc">grpc</a>
209
210
  {{< callout type="warn" >}}
210
- Note: This is not the same as [gRPC with Json](https://grpc.io/blog/grpc-with-json/), which swaps out protobuf for JSON but still relies on gRPC's underlying framing mechanics.
211
+ Note: This is not the same as <a target="_blank" href="https://grpc.io/blog/grpc-with-json/">gRPC with JSON</a> which swaps out protobuf for JSON but still relies on gRPC's underlying framing mechanics.
211
212
  {{< /callout >}}
212
213
  {{% /details %}}
213
214
 
214
215
  {{% details title="WebSockets" closed="true" %}}
215
- * WebSocket support for Rack apps (e.g. [ActionCable](https://guides.rubyonrails.org/action_cable_overview.html))
216
+ * WebSocket support for Rack apps (e.g. <a target="_blank" a href="https://guides.rubyonrails.org/action_cable_overview.html">ActionCable</a>)
216
217
  {{% /details %}}
217
218
 
218
219
  ## Concurrency & Performance
219
220
  {{% details title="Cluster Mode" closed="true" %}}
220
221
  * Supports running in a clustered mode, to fully leverage multi-core systems.
221
- * See [workers](/options/workers).
222
+ * See <a target="_blank" href="/options/workers">workers</a>.
222
223
  {{% /details %}}
223
224
 
224
225
  {{% details title="Non-blocking(Fiber Scheduler) Mode" closed="true" %}}
225
226
  * Support for Ruby’s fiber scheduler for non-blocking concurrency, boosting performance during I/O operations.
226
- * Use Itsi's own high-performance build-in [Fiber scheduler](/itsi_scheduler), or if your prefer you can bring your own!
227
- * See [fiber_scheduler](/options/fiber_scheduler).
227
+ * Use Itsi's own high-performance built-in <a target="_blank" href="/itsi_scheduler">Fiber Scheduler</a> or if your prefer you can bring your own!
228
+ * See <a target="_blank" href="/options/fiber_scheduler">fiber_scheduler</a>.
228
229
  {{% /details %}}
229
230
 
230
231
  {{% details title="Hybrid Blocking/Non-Blocking Mode" closed="true" %}}
231
232
  * `Itsi` allows you to split endpoints between using a Fiber scheduler versus running using the traditional blocking IO model. This allows you to dip your toes into the waters of Ruby's new non-blocking IO, without having to port an entire application at once!
232
- * See [scheduler_threads](/options/scheduler_threads).
233
+ * See <a target="_blank" href="/options/scheduler_threads">scheduler_threads</a>.
233
234
  {{% /details %}}
234
235
 
235
236
  {{% details title="Non-blocking by design" closed="true" %}}
236
- * Itsi is underpinned by [hyper](https://hyper.rs/) and [tokio](https://tokio.rs/) and as such is fundamentally an evented, non-blocking server. Whether you're proxying, serving large files, or delegating to Ruby endpoints, `Itsi` remains responsive, even under heavy load.
237
+ * Itsi is underpinned by <a target="_blank" href="https://hyper.rs/">hyper</a> and <a target="_blank" href="https://tokio.rs/">tokio</a> and as such is fundamentally an evented, non-blocking server. Whether you're proxying, serving large files, or delegating to Ruby endpoints, `Itsi` remains responsive, even under heavy load.
237
238
  {{% /details %}}
238
239
 
239
240
  ## Ruby
240
241
  {{% details title="Preloading" closed="true" %}}
241
242
  * Preload your Ruby application code before forking to benefit from reduced memory through CoW
242
243
  * Alternatively, use groups in bundler to target specific gems or dependencies for preloading
243
- * See [preload](/options/preload).
244
+ * See <a target="_blank" href="/options/preload">preload</a>.
244
245
  {{% /details %}}
245
246
 
246
- {{% details title="Streaming Bodies" closed="true" %}}
247
- * For both [streaming and enumerable bodies](https://github.com/rack/rack/blob/main/SPEC.rdoc#the-body-), Itsi sends data to the client as soon as it is available. This means modules like [ActionController::Live](https://api.rubyonrails.org/v7.1/classes/ActionController/Live.html) behave as expected, and the minimal buffering keeps `Itsi`'s memory footprint consistently low.
247
+ {{% details title="Streaming Response Bodies" closed="true" %}}
248
+ * For both <a target="_blank" href="https://github.com/rack/rack/blob/main/SPEC.rdoc#the-body-">streaming</a> and <a target="_blank" href="https://github.com/rack/rack/blob/main/SPEC.rdoc#enumerable-body-">Enumerable</a> bodies, Itsi sends data to the client as soon as it is available. This means modules like <a target="_blank" href="https://api.rubyonrails.org/v7.1/classes/ActionController/Live.html">ActionController</a> behave as expected, and the minimal buffering keeps `Itsi`'s memory footprint consistently low.
249
+ {{% /details %}}
250
+
251
+ {{% details title="Streaming Request Bodies" closed="true" %}}
252
+ * Itsi supports streaming incoming request bodies too, for efficient processing of large simultaneous input streams (Disabled by default for maximum compatibility).
253
+ * See <a target="_blank" href="/options/stream_body">stream_body</a>.
248
254
  {{% /details %}}
249
255
 
250
256
  {{% details title="Full & Partial Rack Hijacking" closed="true" %}}
251
- * Itsi supports both [full and partial Rack hijacking](https://github.com/rack/rack/blob/main/SPEC.rdoc#hijacking-). Even over HTTP2!
257
+ * Itsi supports both <a href="https://github.com/rack/rack/blob/main/SPEC.rdoc#hijacking-" target="_blank">full</a> and partial Rack hijacking. Even over HTTP2!
252
258
  {{< callout type="warn" >}}
253
259
  By design, Full hijacking assumes you are writing a raw HTTP1 response directly to a raw connection stream.
254
260
  Itsi's support for full hijack over HTTP2 is similar to what you would see if running a dedicated reverse proxy in front of a Ruby app.
@@ -258,7 +264,7 @@ Itsi translates that request from HTTP1 to HTTP2, in real-time, allowing full hi
258
264
 
259
265
  {{% details title="Sendfile" closed="true" %}}
260
266
  * Itsi allows Ruby apps to set a `X-Sendfile` header to enable efficient, streaming file transfers, outside of Ruby, via fast native code.
261
- * See [run](/middleware/run) and [rack_file](/middleware/rack_file).
267
+ * See <a target="_blank" href="/middleware/run">run</a> and <a target="_blank" href="/middleware/rackup_file">rackup_file</a>.
262
268
 
263
269
  {{< callout type="info" >}}
264
270
  Note that despite the header being named `X-Sendfile`, Itsi does not use the Sendfile system call, instead delegating the efficient streaming to Tokio's native asynchronous file streaming capabilities.
@@ -269,17 +275,17 @@ Note that despite the header being named `X-Sendfile`, Itsi does not use the Sen
269
275
  {{% details title="Graceful Memory Limits" closed="true" %}}
270
276
  * Itsi allows you to specify memory limits for Ruby processes. When the limit is reached, Itsi gracefully terminates the process and also invokes a dedicated `after_memory_threshold_reached` callback,
271
277
  so that you can log the event for further analysis.
272
- * See [worker_memory_limit](/options/worker_memory_limit) and [after_memory_threshold_reached](/options/after_memory_threshold_reached).
278
+ * See <a target="_blank" href="/options/worker_memory_limit">worker_memory_limit</a> and <a target="_blank" href="/options/after_memory_threshold_reached">after_memory_threshold_reached</a>.
273
279
  {{% /details %}}
274
280
 
275
281
  {{% details title="OOB GC" closed="true" %}}
276
282
  * Itsi can be configured to periodically trigger GC every N idle periods (where an idle period is defined as a time where no requests are currently queued).
277
283
  * Periodic triggering of GC outside of the request flow can help reduce the impact of GC on latency.
278
- * See [oob_gc_threshold](/options/oob_gc_threshold)
284
+ * See <a target="_blank" href="/options/oob_gc">oob_gc_threshold</a>
279
285
  {{% /details %}}
280
286
 
281
287
  {{% details title="'Rackless' Ruby Apps" closed="true" %}}
282
288
  * Itsi allows definition of ultra-light-weight Ruby web-apps, using plain old functions and procs.
283
289
  * For simple endpoints this barebones option can provide a substantial increase in throughput over a Rack request (primarily by avoiding allocating the env hash and response array)
284
- * See [endpoint](/middleware/endpoint)
290
+ * See <a target="_blank" href="/middleware/endpoint">endpoint</a>
285
291
  {{% /details %}}
@@ -2,6 +2,8 @@
2
2
  title: Getting Started
3
3
  type: docs
4
4
  weight: 2
5
+ prev: features/
6
+ next: getting_started/local_development/
5
7
  ---
6
8
 
7
9
  {{% steps %}}
@@ -49,7 +51,7 @@ Install Ruby
49
51
  {{< /callout >}}
50
52
 
51
53
  {{< /tab >}}
52
- {{< tab >}}**Windows**: Itsi currently doesn't support native Windows builds, but it runs great on [https://learn.microsoft.com/en-us/windows/wsl/install](WSL).
54
+ {{< tab >}}**Windows**: Itsi currently doesn't support native Windows builds, but it runs well on [https://learn.microsoft.com/en-us/windows/wsl/install](WSL).
53
55
 
54
56
  Follow the linked instructions to Install a linux distribution like Ubuntu or Debian and then follow the instructions in the Linux tab.
55
57
  {{< /tab >}}
@@ -60,11 +62,12 @@ Install Ruby
60
62
 
61
63
  Great! You now have Itsi installed. Go to one of the following pages to learn how to use it:
62
64
 
65
+
63
66
  {{< cards >}}
64
- {{< card link="../features" title="Essential Features" icon="star" >}}
65
- {{< card link="../configuration" title="Configuration" icon="adjustments" >}}
66
- {{< card link="../reverse_proxy" title="Reverse Proxy & Gateway" icon="arrow-circle-right" >}}
67
- {{< card link="../for_rubyists" title="For Ruby Apps" icon="library" >}}
67
+ {{< card link="./local_development" title="Local Development" icon="star" >}}
68
+ {{< card link="../options" title="Options" icon="adjustments" >}}
69
+ {{< card link="../middleware" title="Middleware" icon="cog" >}}
70
+ {{< card link="https://github.com/wouterken/itsi" title="Source Code" icon="github" >}}
68
71
  {{< /cards >}}
69
72
 
70
73
  {{% /steps %}}