itsi-server 0.1.1 → 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 (457) 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 +7 -4
  6. data/exe/itsi +152 -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 +141 -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 +314 -0
  65. data/ext/itsi_scheduler/src/lib.rs +39 -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 +133 -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 +362 -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 +233 -0
  99. data/ext/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +565 -0
  100. data/ext/itsi_server/src/ruby_types/itsi_server.rs +86 -0
  101. data/ext/itsi_server/src/ruby_types/mod.rs +48 -0
  102. data/ext/itsi_server/src/server/binds/bind.rs +204 -0
  103. data/ext/itsi_server/src/server/binds/bind_protocol.rs +37 -0
  104. data/ext/itsi_server/src/server/binds/listener.rs +444 -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 +278 -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 +63 -0
  114. data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_api_key.rs +94 -0
  115. data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_basic.rs +94 -0
  116. data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_jwt.rs +343 -0
  117. data/ext/itsi_server/src/server/middleware_stack/middlewares/cache_control.rs +151 -0
  118. data/ext/itsi_server/src/server/middleware_stack/middlewares/compression.rs +316 -0
  119. data/ext/itsi_server/src/server/middleware_stack/middlewares/cors.rs +301 -0
  120. data/ext/itsi_server/src/server/middleware_stack/middlewares/csp.rs +193 -0
  121. data/ext/itsi_server/src/server/middleware_stack/middlewares/deny_list.rs +64 -0
  122. data/ext/itsi_server/src/server/middleware_stack/middlewares/error_response/default_responses.rs +192 -0
  123. data/ext/itsi_server/src/server/middleware_stack/middlewares/error_response.rs +171 -0
  124. data/ext/itsi_server/src/server/middleware_stack/middlewares/etag.rs +198 -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 +209 -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 +116 -0
  130. data/ext/itsi_server/src/server/middleware_stack/middlewares/proxy.rs +411 -0
  131. data/ext/itsi_server/src/server/middleware_stack/middlewares/rate_limit.rs +142 -0
  132. data/ext/itsi_server/src/server/middleware_stack/middlewares/redirect.rs +55 -0
  133. data/ext/itsi_server/src/server/middleware_stack/middlewares/request_headers.rs +54 -0
  134. data/ext/itsi_server/src/server/middleware_stack/middlewares/response_headers.rs +51 -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 +187 -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 +173 -0
  139. data/ext/itsi_server/src/server/middleware_stack/middlewares/token_source.rs +31 -0
  140. data/ext/itsi_server/src/server/middleware_stack/mod.rs +381 -0
  141. data/ext/itsi_server/src/server/mod.rs +13 -5
  142. data/ext/itsi_server/src/server/process_worker.rs +247 -0
  143. data/ext/itsi_server/src/server/redirect_type.rs +26 -0
  144. data/ext/itsi_server/src/server/request_job.rs +11 -0
  145. data/ext/itsi_server/src/server/serve_strategy/cluster_mode.rs +354 -0
  146. data/ext/itsi_server/src/server/serve_strategy/mod.rs +30 -0
  147. data/ext/itsi_server/src/server/serve_strategy/single_mode.rs +481 -0
  148. data/ext/itsi_server/src/server/signal.rs +77 -0
  149. data/ext/itsi_server/src/server/size_limited_incoming.rs +107 -0
  150. data/ext/itsi_server/src/server/thread_worker.rs +479 -0
  151. data/ext/itsi_server/src/services/cache_store.rs +74 -0
  152. data/ext/itsi_server/src/services/itsi_http_service.rs +257 -0
  153. data/ext/itsi_server/src/services/mime_types.rs +1416 -0
  154. data/ext/itsi_server/src/services/mod.rs +6 -0
  155. data/ext/itsi_server/src/services/password_hasher.rs +83 -0
  156. data/ext/itsi_server/src/services/rate_limiter.rs +580 -0
  157. data/ext/itsi_server/src/services/static_file_server.rs +1340 -0
  158. data/ext/itsi_tracing/Cargo.toml +5 -0
  159. data/ext/itsi_tracing/src/lib.rs +366 -7
  160. data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-0994n8rpvvt9m/s-h510hfz1f6-1kbycmq.lock +0 -0
  161. data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-0bob7bf4yq34i/s-h5113125h5-0lh4rag.lock +0 -0
  162. data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2fcodulrxbbxo/s-h510h2infk-0hp5kjw.lock +0 -0
  163. data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2iak63r1woi1l/s-h510h2in4q-0kxfzw1.lock +0 -0
  164. data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2kk4qj9gn5dg2/s-h5113124kv-0enwon2.lock +0 -0
  165. data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2mwo0yas7dtw4/s-h510hfz1ha-1udgpei.lock +0 -0
  166. data/lib/itsi/http_request/response_status_shortcodes.rb +76 -0
  167. data/lib/itsi/http_request.rb +218 -0
  168. data/lib/itsi/http_response.rb +42 -0
  169. data/lib/itsi/passfile.rb +108 -0
  170. data/lib/itsi/server/config/config_helpers.rb +105 -0
  171. data/lib/itsi/server/config/dsl.rb +211 -0
  172. data/lib/itsi/server/config/known_paths/KitchensinkDirectories.txt +2346 -0
  173. data/lib/itsi/server/config/known_paths/Randomfiles.txt +24 -0
  174. data/lib/itsi/server/config/known_paths/UnixDotfiles.txt +52 -0
  175. data/lib/itsi/server/config/known_paths/backdoors/ASP_CommonBackdoors.txt +29 -0
  176. data/lib/itsi/server/config/known_paths/backdoors/bot_control_panels.txt +1668 -0
  177. data/lib/itsi/server/config/known_paths/backdoors/shells.txt +1167 -0
  178. data/lib/itsi/server/config/known_paths/cgi/CGI_HTTP_POST.txt +7 -0
  179. data/lib/itsi/server/config/known_paths/cgi/CGI_HTTP_POST_Windows.txt +6 -0
  180. data/lib/itsi/server/config/known_paths/cgi/CGI_Microsoft.txt +79 -0
  181. data/lib/itsi/server/config/known_paths/cgi/CGI_XPlatform.txt +3948 -0
  182. data/lib/itsi/server/config/known_paths/cms/README.md +5 -0
  183. data/lib/itsi/server/config/known_paths/cms/drupal_plugins.txt +6320 -0
  184. data/lib/itsi/server/config/known_paths/cms/drupal_themes.txt +828 -0
  185. data/lib/itsi/server/config/known_paths/cms/joomla_plugins.txt +224 -0
  186. data/lib/itsi/server/config/known_paths/cms/joomla_themes.txt +30 -0
  187. data/lib/itsi/server/config/known_paths/cms/php-nuke.txt +2142 -0
  188. data/lib/itsi/server/config/known_paths/cms/wordpress.txt +1566 -0
  189. data/lib/itsi/server/config/known_paths/cms/wp_common_theme_files.txt +46 -0
  190. data/lib/itsi/server/config/known_paths/cms/wp_plugins.txt +13366 -0
  191. data/lib/itsi/server/config/known_paths/cms/wp_plugins_full.txt +68662 -0
  192. data/lib/itsi/server/config/known_paths/cms/wp_plugins_top225.txt +225 -0
  193. data/lib/itsi/server/config/known_paths/cms/wp_themes.readme +12 -0
  194. data/lib/itsi/server/config/known_paths/cms/wp_themes.txt +7336 -0
  195. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/3CharExtBrute.txt +17576 -0
  196. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/CommonWebExtensions.txt +80 -0
  197. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Backup.txt +14 -0
  198. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Common.txt +865 -0
  199. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Compressed.txt +186 -0
  200. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Mostcommon.txt +30 -0
  201. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Skipfish.txt +93 -0
  202. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/WordlistSkipfish.txt +1918 -0
  203. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/copy_of.txt +8 -0
  204. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-directories-lowercase.txt +56180 -0
  205. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-directories.txt +62290 -0
  206. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-extensions-lowercase.txt +2367 -0
  207. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-extensions.txt +2450 -0
  208. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-files-lowercase.txt +35323 -0
  209. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-files.txt +37037 -0
  210. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-words-lowercase.txt +107982 -0
  211. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-words.txt +119600 -0
  212. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-directories-lowercase.txt +26593 -0
  213. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-directories.txt +30009 -0
  214. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-extensions-lowercase.txt +1233 -0
  215. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-extensions.txt +1289 -0
  216. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-files-lowercase.txt +16243 -0
  217. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-files.txt +17128 -0
  218. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-words-lowercase.txt +56293 -0
  219. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-words.txt +63087 -0
  220. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-directories-lowercase.txt +17776 -0
  221. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-directories.txt +20122 -0
  222. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-extensions-lowercase.txt +914 -0
  223. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-extensions.txt +963 -0
  224. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-files-lowercase.txt +10848 -0
  225. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-files.txt +11424 -0
  226. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-words-lowercase.txt +38267 -0
  227. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-words.txt +43003 -0
  228. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/spanish.txt +445 -0
  229. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/test_demo.txt +36 -0
  230. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/upload_variants.txt +44 -0
  231. data/lib/itsi/server/config/known_paths/login-file-locations/Logins.txt +71 -0
  232. data/lib/itsi/server/config/known_paths/login-file-locations/cfm.txt +294 -0
  233. data/lib/itsi/server/config/known_paths/login-file-locations/html.txt +295 -0
  234. data/lib/itsi/server/config/known_paths/login-file-locations/jsp.txt +294 -0
  235. data/lib/itsi/server/config/known_paths/login-file-locations/php.txt +294 -0
  236. data/lib/itsi/server/config/known_paths/login-file-locations/windows-asp.txt +294 -0
  237. data/lib/itsi/server/config/known_paths/login-file-locations/windows-aspx.txt +294 -0
  238. data/lib/itsi/server/config/known_paths/password-file-locations/Passwords.txt +47 -0
  239. data/lib/itsi/server/config/known_paths/php/PHP.txt +30 -0
  240. data/lib/itsi/server/config/known_paths/php/PHP_CommonBackdoors.txt +5 -0
  241. data/lib/itsi/server/config/known_paths/proxy-conf.txt +31 -0
  242. data/lib/itsi/server/config/known_paths/tftp.txt +79 -0
  243. data/lib/itsi/server/config/known_paths/webservers-appservers/ADFS.txt +86 -0
  244. data/lib/itsi/server/config/known_paths/webservers-appservers/AdobeXML.txt +16 -0
  245. data/lib/itsi/server/config/known_paths/webservers-appservers/Apache.txt +101 -0
  246. data/lib/itsi/server/config/known_paths/webservers-appservers/ApacheTomcat.txt +47 -0
  247. data/lib/itsi/server/config/known_paths/webservers-appservers/Apache_Axis.txt +16 -0
  248. data/lib/itsi/server/config/known_paths/webservers-appservers/ColdFusion.txt +111 -0
  249. data/lib/itsi/server/config/known_paths/webservers-appservers/FatwireCMS.txt +390 -0
  250. data/lib/itsi/server/config/known_paths/webservers-appservers/Frontpage.txt +38 -0
  251. data/lib/itsi/server/config/known_paths/webservers-appservers/HP_System_Mgmt_Homepage.txt +239 -0
  252. data/lib/itsi/server/config/known_paths/webservers-appservers/HTTP_POST_Microsoft.txt +2 -0
  253. data/lib/itsi/server/config/known_paths/webservers-appservers/Hyperion.txt +578 -0
  254. data/lib/itsi/server/config/known_paths/webservers-appservers/IIS.txt +187 -0
  255. data/lib/itsi/server/config/known_paths/webservers-appservers/JBoss.txt +5 -0
  256. data/lib/itsi/server/config/known_paths/webservers-appservers/JRun.txt +13 -0
  257. data/lib/itsi/server/config/known_paths/webservers-appservers/JavaServlets_Common.txt +3 -0
  258. data/lib/itsi/server/config/known_paths/webservers-appservers/Joomla_exploitable.txt +1937 -0
  259. data/lib/itsi/server/config/known_paths/webservers-appservers/LotusNotes.txt +206 -0
  260. data/lib/itsi/server/config/known_paths/webservers-appservers/Netware.txt +18 -0
  261. data/lib/itsi/server/config/known_paths/webservers-appservers/Oracle9i.txt +60 -0
  262. data/lib/itsi/server/config/known_paths/webservers-appservers/OracleAppServer.txt +192 -0
  263. data/lib/itsi/server/config/known_paths/webservers-appservers/README.md +6 -0
  264. data/lib/itsi/server/config/known_paths/webservers-appservers/Ruby_Rails.txt +121 -0
  265. data/lib/itsi/server/config/known_paths/webservers-appservers/SAP.txt +463 -0
  266. data/lib/itsi/server/config/known_paths/webservers-appservers/Sharepoint.txt +1707 -0
  267. data/lib/itsi/server/config/known_paths/webservers-appservers/SiteMinder.txt +19 -0
  268. data/lib/itsi/server/config/known_paths/webservers-appservers/SunAppServerGlassfish.txt +51 -0
  269. data/lib/itsi/server/config/known_paths/webservers-appservers/SuniPlanet.txt +35 -0
  270. data/lib/itsi/server/config/known_paths/webservers-appservers/Vignette.txt +73 -0
  271. data/lib/itsi/server/config/known_paths/webservers-appservers/Weblogic.txt +160 -0
  272. data/lib/itsi/server/config/known_paths/webservers-appservers/Websphere.txt +366 -0
  273. data/lib/itsi/server/config/known_paths/wellknown-rfc5785.txt +30 -0
  274. data/lib/itsi/server/config/known_paths.rb +20 -0
  275. data/lib/itsi/server/config/middleware/_index.md +56 -0
  276. data/lib/itsi/server/config/middleware/allow_list.md +46 -0
  277. data/lib/itsi/server/config/middleware/allow_list.rb +42 -0
  278. data/lib/itsi/server/config/middleware/auth_api_key.md +90 -0
  279. data/lib/itsi/server/config/middleware/auth_api_key.rb +51 -0
  280. data/lib/itsi/server/config/middleware/auth_basic.md +45 -0
  281. data/lib/itsi/server/config/middleware/auth_basic.rb +44 -0
  282. data/lib/itsi/server/config/middleware/auth_jwt.md +82 -0
  283. data/lib/itsi/server/config/middleware/auth_jwt.rb +38 -0
  284. data/lib/itsi/server/config/middleware/cache_control.md +78 -0
  285. data/lib/itsi/server/config/middleware/cache_control.rb +45 -0
  286. data/lib/itsi/server/config/middleware/cidr_to_regex.rb +50 -0
  287. data/lib/itsi/server/config/middleware/compression.md +50 -0
  288. data/lib/itsi/server/config/middleware/compression.rb +37 -0
  289. data/lib/itsi/server/config/middleware/cors.md +93 -0
  290. data/lib/itsi/server/config/middleware/cors.rb +32 -0
  291. data/lib/itsi/server/config/middleware/csp.md +37 -0
  292. data/lib/itsi/server/config/middleware/csp.rb +44 -0
  293. data/lib/itsi/server/config/middleware/deny_list.md +45 -0
  294. data/lib/itsi/server/config/middleware/deny_list.rb +42 -0
  295. data/lib/itsi/server/config/middleware/endpoint/_index.md +159 -0
  296. data/lib/itsi/server/config/middleware/endpoint/controller.md +186 -0
  297. data/lib/itsi/server/config/middleware/endpoint/controller.rb +33 -0
  298. data/lib/itsi/server/config/middleware/endpoint/delete.md +12 -0
  299. data/lib/itsi/server/config/middleware/endpoint/delete.rb +42 -0
  300. data/lib/itsi/server/config/middleware/endpoint/endpoint.rb +99 -0
  301. data/lib/itsi/server/config/middleware/endpoint/get.md +12 -0
  302. data/lib/itsi/server/config/middleware/endpoint/get.rb +42 -0
  303. data/lib/itsi/server/config/middleware/endpoint/http_request.md +44 -0
  304. data/lib/itsi/server/config/middleware/endpoint/http_response.md +39 -0
  305. data/lib/itsi/server/config/middleware/endpoint/patch.md +12 -0
  306. data/lib/itsi/server/config/middleware/endpoint/patch.rb +42 -0
  307. data/lib/itsi/server/config/middleware/endpoint/post.md +12 -0
  308. data/lib/itsi/server/config/middleware/endpoint/post.rb +42 -0
  309. data/lib/itsi/server/config/middleware/endpoint/put.md +12 -0
  310. data/lib/itsi/server/config/middleware/endpoint/put.rb +42 -0
  311. data/lib/itsi/server/config/middleware/endpoint/schemas.md +122 -0
  312. data/lib/itsi/server/config/middleware/error_response.md +61 -0
  313. data/lib/itsi/server/config/middleware/error_response.rb +36 -0
  314. data/lib/itsi/server/config/middleware/etag.md +59 -0
  315. data/lib/itsi/server/config/middleware/etag.rb +27 -0
  316. data/lib/itsi/server/config/middleware/grpc.md +172 -0
  317. data/lib/itsi/server/config/middleware/grpc.rb +54 -0
  318. data/lib/itsi/server/config/middleware/intrusion_protection.md +124 -0
  319. data/lib/itsi/server/config/middleware/intrusion_protection.rb +61 -0
  320. data/lib/itsi/server/config/middleware/location.md +107 -0
  321. data/lib/itsi/server/config/middleware/location.rb +99 -0
  322. data/lib/itsi/server/config/middleware/log_requests.md +65 -0
  323. data/lib/itsi/server/config/middleware/log_requests.rb +31 -0
  324. data/lib/itsi/server/config/middleware/max_body.md +18 -0
  325. data/lib/itsi/server/config/middleware/max_body.rb +21 -0
  326. data/lib/itsi/server/config/middleware/proxy.md +62 -0
  327. data/lib/itsi/server/config/middleware/proxy.rb +41 -0
  328. data/lib/itsi/server/config/middleware/rackup_file.md +54 -0
  329. data/lib/itsi/server/config/middleware/rackup_file.rb +44 -0
  330. data/lib/itsi/server/config/middleware/rate_limit.md +126 -0
  331. data/lib/itsi/server/config/middleware/rate_limit.rb +34 -0
  332. data/lib/itsi/server/config/middleware/rate_limit_store.rb +25 -0
  333. data/lib/itsi/server/config/middleware/redirect.md +55 -0
  334. data/lib/itsi/server/config/middleware/redirect.rb +25 -0
  335. data/lib/itsi/server/config/middleware/request_headers.md +34 -0
  336. data/lib/itsi/server/config/middleware/request_headers.rb +24 -0
  337. data/lib/itsi/server/config/middleware/response_headers.md +33 -0
  338. data/lib/itsi/server/config/middleware/response_headers.rb +25 -0
  339. data/lib/itsi/server/config/middleware/run.md +60 -0
  340. data/lib/itsi/server/config/middleware/run.rb +43 -0
  341. data/lib/itsi/server/config/middleware/static_assets.md +73 -0
  342. data/lib/itsi/server/config/middleware/static_assets.rb +87 -0
  343. data/lib/itsi/server/config/middleware/static_response.md +44 -0
  344. data/lib/itsi/server/config/middleware/static_response.rb +29 -0
  345. data/lib/itsi/server/config/middleware/string_rewrite.md +67 -0
  346. data/lib/itsi/server/config/middleware/token_source.rb +32 -0
  347. data/lib/itsi/server/config/middleware.rb +13 -0
  348. data/lib/itsi/server/config/option.rb +14 -0
  349. data/lib/itsi/server/config/options/_index.md +37 -0
  350. data/lib/itsi/server/config/options/auto_reload_config.md +13 -0
  351. data/lib/itsi/server/config/options/auto_reload_config.rb +41 -0
  352. data/lib/itsi/server/config/options/bind.md +71 -0
  353. data/lib/itsi/server/config/options/bind.rb +26 -0
  354. data/lib/itsi/server/config/options/certificates.md +65 -0
  355. data/lib/itsi/server/config/options/daemonize.md +14 -0
  356. data/lib/itsi/server/config/options/daemonize.rb +19 -0
  357. data/lib/itsi/server/config/options/fiber_scheduler.md +34 -0
  358. data/lib/itsi/server/config/options/fiber_scheduler.rb +21 -0
  359. data/lib/itsi/server/config/options/header_read_timeout.md +17 -0
  360. data/lib/itsi/server/config/options/header_read_timeout.rb +19 -0
  361. data/lib/itsi/server/config/options/hooks/_index.md +11 -0
  362. data/lib/itsi/server/config/options/hooks/after_fork.md +13 -0
  363. data/lib/itsi/server/config/options/hooks/after_fork.rb +28 -0
  364. data/lib/itsi/server/config/options/hooks/after_memory_limit_reached.md +14 -0
  365. data/lib/itsi/server/config/options/hooks/after_memory_limit_reached.rb +28 -0
  366. data/lib/itsi/server/config/options/hooks/after_start.md +12 -0
  367. data/lib/itsi/server/config/options/hooks/after_start.rb +28 -0
  368. data/lib/itsi/server/config/options/hooks/before_fork.md +13 -0
  369. data/lib/itsi/server/config/options/hooks/before_fork.rb +28 -0
  370. data/lib/itsi/server/config/options/hooks/before_restart.md +12 -0
  371. data/lib/itsi/server/config/options/hooks/before_restart.rb +28 -0
  372. data/lib/itsi/server/config/options/hooks/before_shutdown.md +12 -0
  373. data/lib/itsi/server/config/options/hooks/before_shutdown.rb +28 -0
  374. data/lib/itsi/server/config/options/include.md +20 -0
  375. data/lib/itsi/server/config/options/include.rb +36 -0
  376. data/lib/itsi/server/config/options/listen_backlog.md +11 -0
  377. data/lib/itsi/server/config/options/listen_backlog.rb +19 -0
  378. data/lib/itsi/server/config/options/log_format.md +18 -0
  379. data/lib/itsi/server/config/options/log_format.rb +19 -0
  380. data/lib/itsi/server/config/options/log_level.md +34 -0
  381. data/lib/itsi/server/config/options/log_level.rb +20 -0
  382. data/lib/itsi/server/config/options/log_target.md +38 -0
  383. data/lib/itsi/server/config/options/log_target.rb +19 -0
  384. data/lib/itsi/server/config/options/log_target_filters.md +17 -0
  385. data/lib/itsi/server/config/options/log_target_filters.rb +19 -0
  386. data/lib/itsi/server/config/options/multithreaded_reactor.md +27 -0
  387. data/lib/itsi/server/config/options/multithreaded_reactor.rb +24 -0
  388. data/lib/itsi/server/config/options/nodelay.md +16 -0
  389. data/lib/itsi/server/config/options/nodelay.rb +19 -0
  390. data/lib/itsi/server/config/options/oob_gc_responses_threshold.md +19 -0
  391. data/lib/itsi/server/config/options/oob_gc_responses_threshold.rb +18 -0
  392. data/lib/itsi/server/config/options/pin_worker_cores.md +17 -0
  393. data/lib/itsi/server/config/options/pin_worker_cores.rb +19 -0
  394. data/lib/itsi/server/config/options/preload.md +21 -0
  395. data/lib/itsi/server/config/options/preload.rb +18 -0
  396. data/lib/itsi/server/config/options/recv_buffer_size.md +15 -0
  397. data/lib/itsi/server/config/options/recv_buffer_size.rb +19 -0
  398. data/lib/itsi/server/config/options/redirect_http_to_https.md +21 -0
  399. data/lib/itsi/server/config/options/redirect_http_to_https.rb +30 -0
  400. data/lib/itsi/server/config/options/request_timeout.md +23 -0
  401. data/lib/itsi/server/config/options/request_timeout.rb +19 -0
  402. data/lib/itsi/server/config/options/reuse_address.md +16 -0
  403. data/lib/itsi/server/config/options/reuse_address.rb +19 -0
  404. data/lib/itsi/server/config/options/reuse_port.md +16 -0
  405. data/lib/itsi/server/config/options/reuse_port.rb +19 -0
  406. data/lib/itsi/server/config/options/scheduler_threads.md +34 -0
  407. data/lib/itsi/server/config/options/scheduler_threads.rb +17 -0
  408. data/lib/itsi/server/config/options/shutdown_timeout.md +17 -0
  409. data/lib/itsi/server/config/options/shutdown_timeout.rb +19 -0
  410. data/lib/itsi/server/config/options/stream_body.md +32 -0
  411. data/lib/itsi/server/config/options/stream_body.rb +18 -0
  412. data/lib/itsi/server/config/options/threads.md +44 -0
  413. data/lib/itsi/server/config/options/threads.rb +17 -0
  414. data/lib/itsi/server/config/options/watch.md +16 -0
  415. data/lib/itsi/server/config/options/watch.rb +28 -0
  416. data/lib/itsi/server/config/options/worker_memory_limit.md +22 -0
  417. data/lib/itsi/server/config/options/worker_memory_limit.rb +18 -0
  418. data/lib/itsi/server/config/options/workers.md +42 -0
  419. data/lib/itsi/server/config/options/workers.rb +17 -0
  420. data/lib/itsi/server/config/typed_struct.rb +242 -0
  421. data/lib/itsi/server/config.rb +289 -0
  422. data/lib/itsi/server/default_app/default_app.rb +34 -0
  423. data/lib/itsi/server/default_app/index.html +115 -0
  424. data/lib/itsi/server/default_config/Itsi.rb +107 -0
  425. data/lib/itsi/server/grpc/grpc_call.rb +246 -0
  426. data/lib/itsi/server/grpc/grpc_interface.rb +107 -0
  427. data/lib/itsi/server/grpc/reflection/v1/reflection_pb.rb +26 -0
  428. data/lib/itsi/server/grpc/reflection/v1/reflection_services_pb.rb +122 -0
  429. data/lib/itsi/server/rack/handler/itsi.rb +27 -0
  430. data/lib/itsi/server/rack_interface.rb +94 -0
  431. data/lib/itsi/server/route_tester.rb +157 -0
  432. data/lib/itsi/server/scheduler_interface.rb +21 -0
  433. data/lib/itsi/server/scheduler_mode.rb +10 -0
  434. data/lib/itsi/server/signal_trap.rb +33 -0
  435. data/lib/itsi/server/typed_handlers/param_parser.rb +196 -0
  436. data/lib/itsi/server/typed_handlers/source_parser.rb +56 -0
  437. data/lib/itsi/server/typed_handlers.rb +25 -0
  438. data/lib/itsi/server/version.rb +1 -1
  439. data/lib/itsi/server.rb +265 -9
  440. data/lib/itsi/standard_headers.rb +86 -0
  441. data/lib/ruby_lsp/itsi/addon.rb +129 -0
  442. data/lib/shell_completions/completions.rb +26 -0
  443. metadata +454 -28
  444. data/CHANGELOG.md +0 -5
  445. data/CODE_OF_CONDUCT.md +0 -132
  446. data/LICENSE.txt +0 -21
  447. data/ext/itsi_server/src/request/itsi_request.rs +0 -143
  448. data/ext/itsi_server/src/request/mod.rs +0 -1
  449. data/ext/itsi_server/src/server/bind.rs +0 -138
  450. data/ext/itsi_server/src/server/itsi_ca/itsi_ca.crt +0 -32
  451. data/ext/itsi_server/src/server/itsi_ca/itsi_ca.key +0 -52
  452. data/ext/itsi_server/src/server/itsi_server.rs +0 -182
  453. data/ext/itsi_server/src/server/listener.rs +0 -218
  454. data/ext/itsi_server/src/server/tls.rs +0 -138
  455. data/ext/itsi_server/src/server/transfer_protocol.rs +0 -23
  456. data/ext/itsi_server/src/stream_writer/mod.rs +0 -21
  457. data/lib/itsi/request.rb +0 -39
@@ -0,0 +1,50 @@
1
+ module Itsi
2
+ class Server
3
+ module CidrToRegex
4
+ require 'ipaddr'
5
+
6
+ def range_to_regex(range)
7
+ # Convert an IP range to regex by component
8
+ start_ip, end_ip = range.begin, range.end
9
+
10
+ start_parts = start_ip.to_s.split('.').map(&:to_i)
11
+ end_parts = end_ip.to_s.split('.').map(&:to_i)
12
+
13
+ build_regex_from_parts(start_parts, end_parts)
14
+ end
15
+
16
+ def part_to_range_regex(start_val, end_val)
17
+ return start_val.to_s if start_val == end_val
18
+
19
+ ranges = []
20
+ (start_val..end_val).each do |val|
21
+ ranges << val.to_s
22
+ end
23
+
24
+ # Group similar patterns for compact regex
25
+ ranges.map! { |v| Regexp.escape(v) }
26
+ "(#{ranges.join('|')})"
27
+ end
28
+
29
+ def build_regex_from_parts(start_parts, end_parts)
30
+ # Build regex for each octet
31
+ parts = []
32
+ (0..3).each do |i|
33
+ if start_parts[i] == end_parts[i]
34
+ parts << Regexp.escape(start_parts[i].to_s)
35
+ else
36
+ parts << part_to_range_regex(start_parts[i], end_parts[i])
37
+ end
38
+ end
39
+
40
+ /^#{parts.join('\.')}$/
41
+ end
42
+
43
+ def cidr_to_regex(cidr)
44
+ ip_range = IPAddr.new(cidr).to_range
45
+ range_to_regex(ip_range)
46
+ end
47
+
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,50 @@
1
+ ---
2
+ title: Compression
3
+ url: /middleware/compression
4
+ ---
5
+
6
+ The compression middleware allows you to configure compression settings for your application.
7
+ You can enable several different compression algorithms, and choose to selectively apply these based on the request path, content type, mime-type, and size. You can also choose whether or not to compress streams, and adjust the compression level.
8
+
9
+
10
+ ## Top level compression
11
+ ```ruby {filename=Itsi.rb}
12
+ compress \
13
+ min_size: 1024 # 1KiB,
14
+ algorithms: %w[zstd gzip deflate br],
15
+ compress_streams: true,
16
+ mime_types: %[all],
17
+ level: "fastest"
18
+ ```
19
+
20
+ ## Compression within a location block
21
+ ```ruby {filename=Itsi.rb}
22
+
23
+ location "/images" do
24
+ compress \
25
+ min_size: 1024 # 1KiB,
26
+ algorithms: %w[zstd gzip deflate br],
27
+ mime_types: %[image],
28
+ level: "fastest"
29
+
30
+ static_assets: \
31
+ ...
32
+ end
33
+ ```
34
+
35
+ ## Parameters
36
+
37
+ | Parameter | Description |
38
+ | --- | --- |
39
+ | `min_size` | The minimum size of the response body in bytes before compression is applied. Default is `1024` (1KiB). |
40
+ | `algorithms` | An array of compression algorithms to use. Supports any combination of `zstd`, `gzip`, `deflate`, `br`. |
41
+ | `compress_streams` | Whether or not to compress streams. Default is `true`. |
42
+ | `mime_types` | An array of mime-type groups/classes as string to compress. Default is `["all"]`.<br/>Available options are `all`, `text`, `image`, `audio`, `video`, `application`, `font`. <br/>You can also match arbitrary mime-types, by using an `other` object instead `{ "other" => "other/type" }` |
43
+ | `level` | The compression level to use. Default is `fastest`. Can be any of `fastest`, `best`, `balanced` and `precise` |
44
+
45
+ <br/>
46
+
47
+ # Pre-compressed `static_assets`
48
+ Itsi also supports serving pre-compressed static assets directly from the file-system.
49
+ This is configured inside the `static_assets` middleware.
50
+ Go to the [static_assets](/middleware/static_assets.md) middleware for more information.
@@ -0,0 +1,37 @@
1
+ module Itsi
2
+ class Server
3
+ module Config
4
+ class Compress < Middleware
5
+
6
+ insert_text <<~SNIPPET
7
+ compress \\
8
+ min_size: ${1|1024 * 1024|},
9
+ algorithms: ${2|%w[zstd gzip deflate br]|},
10
+ compress_streams: ${3|true,false|},
11
+ mime_types: ${4|%w[all],%w[image],%w[text image audio video font]|},
12
+ level: ${5|"fastest","precise","balanced","best"|}
13
+ SNIPPET
14
+
15
+ detail "Enable response compression"
16
+
17
+ OtherMimeType = TypedStruct.new do
18
+ {
19
+ other: Type(String)
20
+ }
21
+ end
22
+
23
+ schema do
24
+ {
25
+ min_size: (Range(0..1024 ** 4) & Required()).default(1024),
26
+ algorithms: (Array(Enum(%w[zstd gzip deflate br])).default(%w[zstd gzip deflate br])),
27
+ compress_streams: (Bool().default(true)),
28
+ mime_types: Array(Or(Enum(%w[text image application audio video font all]), Type(OtherMimeType))).default(%w[all]),
29
+ level: Enum(%w[fastest precise balanced best]).default("fastest")
30
+ }
31
+ end
32
+
33
+
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,93 @@
1
+ ---
2
+ title: CORS
3
+ url: /middleware/cors
4
+ ---
5
+
6
+ The CORS middleware allows you to configure CORS settings for your application.
7
+ You can enable CORS for specific origins, methods, headers, and credentials.
8
+
9
+
10
+ ## CORS configuration
11
+ ```ruby {filename=Itsi.rb}
12
+ cors \
13
+ allow_origins: ["*"],
14
+ allow_methods: ["GET", "POST", "PUT", "DELETE"],
15
+ allow_headers: ["Content-Type", "Authorization"],
16
+ allow_credentials: true,
17
+ expose_headers: ["X-Total-Count"],
18
+ max_age: 3600
19
+ ```
20
+
21
+
22
+
23
+ ## CORS Applied to a sub-location
24
+ ```ruby {filename=Itsi.rb}
25
+ location "/api" do
26
+ cors \
27
+ allow_origins: ["*"],
28
+ allow_methods: ["GET", "POST", "PUT", "DELETE"],
29
+ allow_headers: ["Content-Type", "Authorization"],
30
+ allow_credentials: true,
31
+ expose_headers: ["X-Total-Count"],
32
+ max_age: 3600
33
+ end
34
+ ```
35
+
36
+ ## Configuration Options
37
+
38
+ You can customize the CORS behavior using the following options:
39
+
40
+ - **allow_origins**:
41
+ A list of allowed origins (e.g., `"*"` or specific domain names).
42
+ When credentials are allowed (see `allow_credentials`), the middleware echoes back the exact origin from the request.
43
+
44
+ - **allow_methods**:
45
+ A list of allowed HTTP methods. Supported methods include:
46
+ - `GET`
47
+ - `POST`
48
+ - `PUT`
49
+ - `DELETE`
50
+ - `OPTIONS`
51
+ - `HEAD`
52
+ - `PATCH`
53
+ The internal implementation uses an enum (`HttpMethod`) with helper methods to match and convert these values.
54
+
55
+ - **allow_headers**:
56
+ A list of headers that the client is allowed to include in its requests.
57
+
58
+ - **allow_credentials**:
59
+ A boolean flag indicating whether credentials (like cookies or authorization headers) are allowed.
60
+
61
+ - **expose_headers**:
62
+ A list of headers that browsers are allowed to access from the response.
63
+
64
+ - **max_age**:
65
+ An optional field that sets the maximum time (in seconds) the result of a preflight request can be cached.
66
+
67
+ ## How It Works
68
+
69
+ ### Preflight Requests
70
+
71
+ For HTTP OPTIONS requests (used to determine if the actual request is safe to send):
72
+ #### 1. Extraction of Request Headers
73
+ The middleware extracts the following from the incoming request:
74
+ * `Origin`
75
+ * `Access-Control-Request-Method`
76
+ * `Access-Control-Request-Headers`
77
+
78
+ #### 2. Validation via preflight_headers
79
+ These values are validated:
80
+ * The Origin must be provided and permitted according to allow_origins.
81
+ * The Access-Control-Request-Method must match one of the configured allow_methods.
82
+ * Any headers listed in Access-Control-Request-Headers must appear in the allow_headers configuration.
83
+
84
+ #### 3. Response Generation
85
+ If the validation succeeds, the middleware constructs a set of CORS headers including:
86
+ * `Access-Control-Allow-Origin`
87
+ * `Access-Control-Allow-Methods`
88
+ * `Access-Control-Allow-Headers`
89
+ * `Access-Control-Allow-Credentials` (if enabled)
90
+ * `Access-Control-Max-Age` (if set)
91
+ * `Access-Control-Expose-Headers` (if configured)
92
+
93
+ A response with status code 204 No Content is sent immediately, ending further processing.
@@ -0,0 +1,32 @@
1
+ module Itsi
2
+ class Server
3
+ module Config
4
+ class Cors < Middleware
5
+
6
+ insert_text <<~SNIPPET
7
+ cors \\
8
+ allow_origins: ${1|["*"]|},
9
+ allow_methods: ${2|%w[GET POST PUT DELETE]|},
10
+ allow_headers: ${3|%w[Content-Type Authorization]|},
11
+ allow_credentials: ${4|true,false|},
12
+ expose_headers: ${5|[]|},
13
+ max_age: ${6|3600|}
14
+ SNIPPET
15
+
16
+ detail "Enables Cross-Origin Resource Sharing (CORS) for the server."
17
+
18
+ schema do
19
+ {
20
+ allow_origins: Array(Type(String)).default(["*"]),
21
+ allow_methods: Array(Type(String)).default(["GET", "POST", "PUT", "DELETE"]),
22
+ allow_headers: Array(Type(String)).default(["Content-Type", "Authorization"]),
23
+ allow_credentials: Bool().default(false),
24
+ expose_headers: Array(Type(String)).default([]),
25
+ max_age: Type(Integer).default(3600)
26
+ }
27
+ end
28
+
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,37 @@
1
+ ---
2
+ title: Content Security Policy
3
+ url: /middleware/csp
4
+ ---
5
+
6
+ The `csp` middleware sets a [Content-Security-Policy (CSP)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) header on outgoing responses and optionally collects violation reports from clients.
7
+
8
+ ### Options
9
+
10
+ | Key | Type | Default | Description |
11
+ |----------------------|-------------|------------------|-------------|
12
+ | `policy` | `CspConfig` | `nil` | Optional policy components for `default-src`, `script-src`, etc. |
13
+ | `reporting_enabled` | `Bool` | `false` | Enable collection of CSP violation reports |
14
+ | `report_file` | `PathBuf` | `nil` | Where to persist reports if reporting is enabled |
15
+ | `report_endpoint` | `String` | `"/csp-report"` | Endpoint to receive reports from the browser |
16
+ | `flush_interval` | `Integer` | `10` | How frequently (in seconds) to flush pending reports to file |
17
+
18
+ ### Example
19
+
20
+ ```ruby
21
+ csp \
22
+ policy: {
23
+ default_src: ["'self'"],
24
+ script_src: ["'self'", "cdn.example.com"],
25
+ style_src: ["'self'"],
26
+ report_uri: ["/csp-report"]
27
+ },
28
+ reporting_enabled: true,
29
+ report_endpoint: "/csp-report",
30
+ report_file: "csp_reports.json",
31
+ flush_interval: 5
32
+ ```
33
+
34
+ ### Reporting
35
+ Configure `reporting_enabled`, `report_endpoint`, `report_file` and `flush_interval` to have Itsi perform CSP violation report collection.
36
+
37
+ If reporting is enabled, the middleware will collect violation reports from clients and persist them to the specified file at the given interval. (Make sure that `report_endpoint` and `report_uri` inside `policy_input` are correctly matched.)
@@ -0,0 +1,44 @@
1
+ module Itsi
2
+ class Server
3
+ module Config
4
+ class Csp < Middleware
5
+ insert_text <<~SNIPPET
6
+ csp \\
7
+ policy: {
8
+ default_src: ${1:["'self'"]},
9
+ script_src: ${2:["'self'", "cdn.example.com"]},
10
+ style_src: ${3:["'self'"]},
11
+ report_uri: ${4:["/csp-report"]}
12
+ },
13
+ reporting_enabled: ${5|true,false|},
14
+ report_file: "${6:csp_reports.json}",
15
+ report_endpoint: "${7:/csp-report}",
16
+ flush_interval: ${8:5.0}
17
+ SNIPPET
18
+
19
+ detail "Adds Content-Security-Policy headers and collects violation reports."
20
+
21
+ CspPolicy = TypedStruct.new do
22
+ {
23
+ default_src: Array(Type(String)).default([]),
24
+ script_src: Array(Type(String)).default([]),
25
+ style_src: Array(Type(String)).default([]),
26
+ report_uri: Array(Type(String)).default([])
27
+ }
28
+ end
29
+
30
+ schema do
31
+ {
32
+ policy: (Type(CspPolicy) & Required()).default({default_src: [], script_src: [], style_src: [], report_uri: []}),
33
+ reporting_enabled: Bool().default(false),
34
+ report_file: Type(String),
35
+ report_endpoint: Type(String).default("/csp-report"),
36
+ flush_interval: Type(Float).default(5.0)
37
+ }
38
+ end
39
+
40
+
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,45 @@
1
+ ---
2
+ title: Deny List
3
+ url: /middleware/deny_list
4
+ next: endpoint/
5
+ ---
6
+ The **deny_list** middleware restricts access to only those clients whose IP address matches one a set of approved patterns. All other requests receive a configurable forbidden response.
7
+
8
+ ## Configuration
9
+
10
+ ```ruby {filename=Itsi.rb}
11
+ deny_list \
12
+ denied_patterns: [
13
+ /192\.168\.0\.\d+/, # block all 192.168.0.x
14
+ /203\.0\.113\.(10|11)/, # block .10 and .11
15
+ "10.0.0.0/24" # block all IPs in the 10.0.0.x range
16
+ ],
17
+ error_response: { code: 403,
18
+ plaintext: { inline: "Access denied" },
19
+ default: "plaintext" }
20
+ ```
21
+
22
+ * `denied_patterns` (required):
23
+ An array of Ruby‑style regexp strings. Each incoming client IP (from req.addr) is tested against this set; if any match, the request is blocked.
24
+ * `error_response` (optional):
25
+ A built‑in or custom error response (default is forbidden / HTTP 403).
26
+
27
+
28
+ ## Trusted Proxies
29
+
30
+ By default, a deny-list uses the IP address from the underlying socket (remote_addr). However, if your server is behind a reverse proxy, all requests will appear to come from the proxy’s IP address. This can break IP-based rules or cause rate-limiting to group all users together.
31
+
32
+ To address this, you can declare trusted proxies and instruct the server to extract the original client IP from forwarded headers only if the request came from one of these proxies.
33
+
34
+ ### Configuring trusted_proxies
35
+
36
+ To trust one or more upstream proxies, provide a trusted_proxies map in the middleware configuration.
37
+ E.g.
38
+ ```ruby {filename=Itsi.rb}
39
+ deny_list \
40
+ denied_patterns: ["10.0.0.0/8", /198\.51\.100\.\d+/],
41
+ trusted_proxies: {
42
+ "192.168.1.1" => { header: { name: "X-Forwarded-For" } }
43
+ },
44
+ error_response: { code: 403, plaintext: { inline: "Access denied" } }
45
+ ```
@@ -0,0 +1,42 @@
1
+ module Itsi
2
+ class Server
3
+ module Config
4
+
5
+ require_relative "cidr_to_regex"
6
+ require_relative "token_source"
7
+
8
+ include CidrToRegex
9
+
10
+ class DenyList < Middleware
11
+ insert_text <<~SNIPPET
12
+ deny_list \\
13
+ denied_patterns: [${1|"127.0.0.1","127.*", /127\.0\.*/|}],
14
+ error_response: ${2|"forbidden",{ code: 403\\, plaintext: { inline: "Access denied" } }|}
15
+ SNIPPET
16
+
17
+ detail "Block any clients whose IP matches one of the given regex patterns."
18
+
19
+ schema do
20
+ {
21
+ denied_patterns: Array(Type(String)) & Required(),
22
+ error_response: Type(ErrorResponseDef).default("forbidden"),
23
+ trusted_proxies: (Hash(Type(String), Type(TokenSource)) & Required()).default({})
24
+ }
25
+ end
26
+
27
+ def initialize(location, params={})
28
+ params[:denied_patterns] = Array(params[:denied_patterns]).map do |pattern|
29
+ if pattern.is_a?(Regexp)
30
+ pattern.source
31
+ elsif pattern =~ /\A\d{1,3}(?:\.\d{1,3}){3}\/\d{1,2}\z/
32
+ cidr_to_regex(pattern).source
33
+ else
34
+ pattern
35
+ end
36
+ end
37
+ super
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,159 @@
1
+ ---
2
+ title: Endpoint
3
+ url: /middleware/endpoint
4
+ prev: deny_list/
5
+ next: controller/
6
+ ---
7
+
8
+ The **endpoint** middleware allows you to define an ultra light-weight, inline, Ruby endpoint.
9
+
10
+ > If you're after running a rack app using a fully-featured framework, e.g. a Ruby on Rails or Sinatra, take a look at the [Rackup File](/middleware/rackup_file) middleware instead.
11
+ This feature can be useful for quickly prototyping, building small pieces of isolated functionality, or minimal endpoints where high throughput is essential.
12
+
13
+ `endpoint` has several variants, that further restrict the endpoint to respond to specific HTTP methods:
14
+ - [`get`](/middleware/get) for **GET** requests
15
+ - [`post`](/middleware/post) for **POST** requests
16
+ - [`put`](/middleware/put) for **PUT** requests
17
+ - [`patch`](/middleware/patch) for **PATCH** requests
18
+ - [`delete`](/middleware/delete) for **DELETE** requests
19
+
20
+ ### Functions
21
+ Endpoints also support:
22
+ * Request and response schema validation. See [Schema Validation](/middleware/endpoint/schemas)
23
+ * Controllers. See [Controllers](/middleware/controller)
24
+
25
+ ## Usage
26
+ Endpoints require an optional path (default "*") and a handler proc or function, which must accept a mandatory request object (See [Request](/middleware/http_request)) and an optional params object.
27
+
28
+
29
+ ```ruby {filename=Itsi.rb}
30
+ # A routeless endpoint is the same as a 'catch-all' endpoint.
31
+ # E.g. this:
32
+ get do |req|
33
+ end
34
+
35
+ # Is equivalent to this:
36
+ get "*" do |req|
37
+ end
38
+ ```
39
+
40
+ The request object itself holds a reference [`#response`](/middleware/http_response) object, which can be used to manage the response explicitly.
41
+
42
+ ### Request Life-cycle
43
+ Unlike most Rack frameworks where the life-span of an HTTP request/response is tied to the controller action, in Itsi there is no such contract.
44
+ You must explicitly close the response to complete it.
45
+ This also allows you hold on to a connection *indefinitely* (or until top-level timeouts occur, e.g. [request_timeout](/options/request_timeout)), and makes it easy to manage several concurrent requests asynchronously (especially if combined with [fiber_scheduler](/options/fiber_scheduler)).
46
+
47
+ There are several ways to write and close a response.
48
+
49
+ **Simple Responses**
50
+ * `request#respond`.
51
+ ```ruby
52
+ get do |req|
53
+ req.respond "ok", 200, {} # All params are optional, and can also use named kwargs instead of positional args
54
+ end
55
+ ```
56
+ * respond + status aliases. E.g. `request#ok`, `request#created`, `request#not_found`
57
+ ```ruby
58
+ get do |req|
59
+ req.ok "ok", {} # All params are optional, and can also use named kwargs instead of positional args
60
+ end
61
+ ```
62
+
63
+ **Low-level responses** (for low-level control over long-lived requests)
64
+ * `response#respond`
65
+ * `response#send_and_close`
66
+ * `response#close`
67
+
68
+ #### Simple Responses
69
+ For most use-cases using simple responses is all you need.
70
+ E.g.
71
+
72
+ ```ruby {filename=Itsi.rb}
73
+ # Catch-all endpoint.
74
+ endpoint "/example/*" do |request|
75
+ request.ok "Hello, World!"
76
+ end
77
+ ```
78
+
79
+
80
+ ```ruby{filename=Itsi.rb}
81
+ # Single body, status and headers
82
+
83
+ # 200 assumed
84
+ endpoint("/"){|req| req.respond "Just a body" }
85
+
86
+ # With status
87
+ endpoint("/"){|req| req.respond "Body and status", 200 }
88
+
89
+ # With status and headers
90
+ endpoint("/"){|req| req.respond "Body and status", 200, {"Content-Type" => "text/plain"} }
91
+
92
+ # With kwargs
93
+ endpoint("/"){|req| req.respond body: "Just a body" }
94
+
95
+ # With status
96
+ endpoint("/"){|req| req.respond body: "Body and status", status: 200 }
97
+
98
+ # With status and headers
99
+ endpoint("/"){|req| req.respond body: "Body and status", status: 200, headers: {"Content-Type" => "text/plain"} }
100
+
101
+ # Response Formats
102
+ # JSON
103
+ endpoint("/"){|req| req.respond json: { "message": "With JSON Body" } }
104
+
105
+ # XML
106
+ endpoint("/"){|req| req.respond xml: "<message>With XML Body</message>"}
107
+
108
+ # HTML
109
+ endpoint("/"){|req| req.respond html: "<html><body><h1>With HTML Body</h1></body></html>"}
110
+
111
+ # Text
112
+ endpoint("/"){|req| req.respond text: "With Text Body"}
113
+
114
+
115
+ # Status helpers (All status codes supported)
116
+ endpoint("/"){|req| req.ok "Ok" }
117
+ endpoint("/"){|req| req.not_found "Not Found" }
118
+ endpoint("/"){|req| req.created "Created" }
119
+ endpoint("/"){|req| req.accepted "Accepted" }
120
+ ```
121
+
122
+ For more advanced responses (e.g streaming responses), see documentation on [response](/middleware/response.rb)
123
+
124
+ ### Capturing URL parameters
125
+ ```ruby {filename=Itsi.rb}
126
+ # Catch-all endpoint.
127
+ location "/foo" do
128
+ endpoint "/users/:user_id" do |request|
129
+ if (user = User.find(request.query_params[:user_id]))
130
+ request.ok json: user.to_json
131
+ else
132
+ request.not_found "User not found!"
133
+ end
134
+ end
135
+
136
+ # Optionally restrict the character sets of capture groups using Regex
137
+ endpoint "/books/:book_id(\d+)" do |request|
138
+ request.ok "Got book #{request.query_params[:book_id]}"
139
+ end
140
+ end
141
+ ```
142
+
143
+ ### Basic Request Body / Parameters
144
+
145
+ If an endpoint accepts a second parameters argument, incoming request bodies will be parsed into a Ruby hash (including uploaded files as `File` objects and fed into the handler as the second parameter ).
146
+
147
+ The following request formats will be automatically detected and deserialized:
148
+ * **JSON** (`"Content-Type"` header is set to `"application/json"`)
149
+ * **Form-encoded** (`"Content-Type"` header is set to `"application/x-www-form-urlencoded"`)
150
+ * **Multipart** (`"Content-Type"` header is set to `"multipart/form-data"`)
151
+
152
+
153
+ ```ruby {filename=Itsi.rb}
154
+ location "/echo" do
155
+ post "/body" do |request, params|
156
+ request.ok json: params.to_json
157
+ end
158
+ end
159
+ ```