itsi 0.1.19 → 0.1.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +15 -0
  3. data/Cargo.lock +941 -241
  4. data/README.md +67 -55
  5. data/crates/itsi_server/Cargo.toml +3 -3
  6. data/crates/itsi_server/src/ruby_types/itsi_http_request.rs +2 -2
  7. data/crates/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +150 -19
  8. data/crates/itsi_server/src/ruby_types/itsi_server.rs +1 -0
  9. data/crates/itsi_server/src/server/binds/listener.rs +34 -29
  10. data/crates/itsi_server/src/server/binds/tls/locked_dir_cache.rs +2 -2
  11. data/crates/itsi_server/src/server/binds/tls.rs +1 -1
  12. data/crates/itsi_server/src/server/middleware_stack/middleware.rs +33 -28
  13. data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_jwt.rs +56 -3
  14. data/crates/itsi_server/src/server/middleware_stack/middlewares/csp.rs +179 -0
  15. data/crates/itsi_server/src/server/middleware_stack/middlewares/mod.rs +25 -2
  16. data/crates/itsi_server/src/server/middleware_stack/middlewares/ruby_app.rs +3 -3
  17. data/crates/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs +2 -1
  18. data/crates/itsi_server/src/server/middleware_stack/mod.rs +32 -34
  19. data/crates/itsi_server/src/server/serve_strategy/cluster_mode.rs +10 -4
  20. data/crates/itsi_server/src/server/serve_strategy/single_mode.rs +30 -7
  21. data/crates/itsi_server/src/server/thread_worker.rs +2 -2
  22. data/crates/itsi_server/src/services/static_file_server.rs +30 -28
  23. data/crates/itsi_tracing/src/lib.rs +39 -8
  24. data/docker/Dockerfile +12 -0
  25. data/docs/content/_index.md +18 -10
  26. data/docs/content/acknowledgements/_index.md +43 -0
  27. data/docs/content/configuration/_index.md +98 -0
  28. data/docs/content/contact/_index.md +7 -0
  29. data/docs/content/faqs/_index.md +27 -0
  30. data/docs/content/features/_index.md +285 -0
  31. data/docs/content/getting_started/_index.md +70 -0
  32. data/docs/content/getting_started/local_development.md +40 -0
  33. data/docs/content/getting_started/logging.md +16 -0
  34. data/docs/content/getting_started/running_itsi_in_production.md +24 -0
  35. data/docs/content/itsi-server-100.png +0 -0
  36. data/docs/content/itsi_scheduler/_index.md +105 -0
  37. data/docs/content/itsi_scheduler/itsi-scheduler-100.png +0 -0
  38. data/docs/content/ruby-lsp.png +0 -0
  39. data/docs/content/ruby.svg +948 -0
  40. data/docs/data/icons.yaml +949 -0
  41. data/docs/hugo.yaml +27 -28
  42. data/fairytale.txt +34 -0
  43. data/gems/scheduler/Cargo.lock +46 -46
  44. data/gems/scheduler/README.md +53 -24
  45. data/gems/scheduler/itsi-scheduler-100.png +0 -0
  46. data/gems/scheduler/lib/itsi/scheduler/version.rb +1 -1
  47. data/gems/server/Cargo.lock +950 -239
  48. data/gems/server/README.md +2 -0
  49. data/gems/server/exe/itsi +5 -5
  50. data/gems/server/lib/itsi/server/config/config_helpers.rb +93 -0
  51. data/gems/server/lib/itsi/server/config/dsl.rb +81 -33
  52. data/gems/server/lib/itsi/server/config/known_paths/KitchensinkDirectories.txt +2346 -0
  53. data/gems/server/lib/itsi/server/config/known_paths/Randomfiles.txt +24 -0
  54. data/gems/server/lib/itsi/server/config/known_paths/UnixDotfiles.txt +52 -0
  55. data/gems/server/lib/itsi/server/config/known_paths/backdoors/ASP_CommonBackdoors.txt +29 -0
  56. data/gems/server/lib/itsi/server/config/known_paths/backdoors/bot_control_panels.txt +1668 -0
  57. data/gems/server/lib/itsi/server/config/known_paths/backdoors/shells.txt +1167 -0
  58. data/gems/server/lib/itsi/server/config/known_paths/cgi/CGI_HTTP_POST.txt +7 -0
  59. data/gems/server/lib/itsi/server/config/known_paths/cgi/CGI_HTTP_POST_Windows.txt +6 -0
  60. data/gems/server/lib/itsi/server/config/known_paths/cgi/CGI_Microsoft.txt +79 -0
  61. data/gems/server/lib/itsi/server/config/known_paths/cgi/CGI_XPlatform.txt +3948 -0
  62. data/gems/server/lib/itsi/server/config/known_paths/cms/README.md +5 -0
  63. data/gems/server/lib/itsi/server/config/known_paths/cms/drupal_plugins.txt +6320 -0
  64. data/gems/server/lib/itsi/server/config/known_paths/cms/drupal_themes.txt +828 -0
  65. data/gems/server/lib/itsi/server/config/known_paths/cms/joomla_plugins.txt +224 -0
  66. data/gems/server/lib/itsi/server/config/known_paths/cms/joomla_themes.txt +30 -0
  67. data/gems/server/lib/itsi/server/config/known_paths/cms/php-nuke.txt +2142 -0
  68. data/gems/server/lib/itsi/server/config/known_paths/cms/wordpress.txt +1566 -0
  69. data/gems/server/lib/itsi/server/config/known_paths/cms/wp_common_theme_files.txt +46 -0
  70. data/gems/server/lib/itsi/server/config/known_paths/cms/wp_plugins.txt +13366 -0
  71. data/gems/server/lib/itsi/server/config/known_paths/cms/wp_plugins_full.txt +68662 -0
  72. data/gems/server/lib/itsi/server/config/known_paths/cms/wp_plugins_top225.txt +225 -0
  73. data/gems/server/lib/itsi/server/config/known_paths/cms/wp_themes.readme +12 -0
  74. data/gems/server/lib/itsi/server/config/known_paths/cms/wp_themes.txt +7336 -0
  75. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/3CharExtBrute.txt +17576 -0
  76. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/CommonWebExtensions.txt +80 -0
  77. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Backup.txt +14 -0
  78. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Common.txt +865 -0
  79. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Compressed.txt +186 -0
  80. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Mostcommon.txt +30 -0
  81. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Skipfish.txt +93 -0
  82. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/WordlistSkipfish.txt +1918 -0
  83. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/copy_of.txt +8 -0
  84. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-directories-lowercase.txt +56180 -0
  85. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-directories.txt +62290 -0
  86. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-extensions-lowercase.txt +2367 -0
  87. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-extensions.txt +2450 -0
  88. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-files-lowercase.txt +35323 -0
  89. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-files.txt +37037 -0
  90. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-words-lowercase.txt +107982 -0
  91. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-words.txt +119600 -0
  92. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-directories-lowercase.txt +26593 -0
  93. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-directories.txt +30009 -0
  94. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-extensions-lowercase.txt +1233 -0
  95. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-extensions.txt +1289 -0
  96. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-files-lowercase.txt +16243 -0
  97. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-files.txt +17128 -0
  98. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-words-lowercase.txt +56293 -0
  99. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-words.txt +63087 -0
  100. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-directories-lowercase.txt +17776 -0
  101. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-directories.txt +20122 -0
  102. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-extensions-lowercase.txt +914 -0
  103. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-extensions.txt +963 -0
  104. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-files-lowercase.txt +10848 -0
  105. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-files.txt +11424 -0
  106. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-words-lowercase.txt +38267 -0
  107. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-words.txt +43003 -0
  108. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/spanish.txt +445 -0
  109. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/test_demo.txt +36 -0
  110. data/gems/server/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/upload_variants.txt +44 -0
  111. data/gems/server/lib/itsi/server/config/known_paths/login-file-locations/Logins.txt +71 -0
  112. data/gems/server/lib/itsi/server/config/known_paths/login-file-locations/cfm.txt +294 -0
  113. data/gems/server/lib/itsi/server/config/known_paths/login-file-locations/html.txt +295 -0
  114. data/gems/server/lib/itsi/server/config/known_paths/login-file-locations/jsp.txt +294 -0
  115. data/gems/server/lib/itsi/server/config/known_paths/login-file-locations/php.txt +294 -0
  116. data/gems/server/lib/itsi/server/config/known_paths/login-file-locations/windows-asp.txt +294 -0
  117. data/gems/server/lib/itsi/server/config/known_paths/login-file-locations/windows-aspx.txt +294 -0
  118. data/gems/server/lib/itsi/server/config/known_paths/password-file-locations/Passwords.txt +47 -0
  119. data/gems/server/lib/itsi/server/config/known_paths/php/PHP.txt +30 -0
  120. data/gems/server/lib/itsi/server/config/known_paths/php/PHP_CommonBackdoors.txt +5 -0
  121. data/gems/server/lib/itsi/server/config/known_paths/proxy-conf.txt +31 -0
  122. data/gems/server/lib/itsi/server/config/known_paths/tftp.txt +79 -0
  123. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/ADFS.txt +86 -0
  124. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/AdobeXML.txt +16 -0
  125. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/Apache.txt +101 -0
  126. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/ApacheTomcat.txt +47 -0
  127. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/Apache_Axis.txt +16 -0
  128. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/ColdFusion.txt +111 -0
  129. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/FatwireCMS.txt +390 -0
  130. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/Frontpage.txt +38 -0
  131. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/HP_System_Mgmt_Homepage.txt +239 -0
  132. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/HTTP_POST_Microsoft.txt +2 -0
  133. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/Hyperion.txt +578 -0
  134. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/IIS.txt +187 -0
  135. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/JBoss.txt +5 -0
  136. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/JRun.txt +13 -0
  137. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/JavaServlets_Common.txt +3 -0
  138. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/Joomla_exploitable.txt +1937 -0
  139. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/LotusNotes.txt +206 -0
  140. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/Netware.txt +18 -0
  141. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/Oracle9i.txt +60 -0
  142. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/OracleAppServer.txt +192 -0
  143. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/README.md +6 -0
  144. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/Ruby_Rails.txt +121 -0
  145. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/SAP.txt +463 -0
  146. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/Sharepoint.txt +1707 -0
  147. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/SiteMinder.txt +19 -0
  148. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/SunAppServerGlassfish.txt +51 -0
  149. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/SuniPlanet.txt +35 -0
  150. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/Vignette.txt +73 -0
  151. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/Weblogic.txt +160 -0
  152. data/gems/server/lib/itsi/server/config/known_paths/webservers-appservers/Websphere.txt +366 -0
  153. data/gems/server/lib/itsi/server/config/known_paths/wellknown-rfc5785.txt +30 -0
  154. data/gems/server/lib/itsi/server/config/known_paths.rb +17 -0
  155. data/gems/server/lib/itsi/server/config/middleware/_index.md +54 -0
  156. data/gems/server/lib/itsi/server/config/middleware/log_requests.md +63 -0
  157. data/gems/server/lib/itsi/server/config/middleware/log_requests.rb +33 -0
  158. data/gems/server/lib/itsi/server/config/middleware.rb +9 -0
  159. data/gems/server/lib/itsi/server/config/option.rb +9 -0
  160. data/gems/server/lib/itsi/server/config/options/_index.md +36 -0
  161. data/gems/server/lib/itsi/server/config/options/fiber_scheduler.md +35 -0
  162. data/gems/server/lib/itsi/server/config/options/fiber_scheduler.rb +18 -0
  163. data/gems/server/lib/itsi/server/config/options/threads.md +39 -0
  164. data/gems/server/lib/itsi/server/config/options/threads.rb +17 -0
  165. data/gems/server/lib/itsi/server/config/options/workers.md +43 -0
  166. data/gems/server/lib/itsi/server/config/options/workers.rb +17 -0
  167. data/gems/server/lib/itsi/server/config/typed_struct.rb +203 -0
  168. data/gems/server/lib/itsi/server/config.rb +124 -30
  169. data/gems/server/lib/itsi/server/signal_trap.rb +5 -1
  170. data/gems/server/lib/itsi/server/typed_handlers/source_parser.rb +1 -1
  171. data/gems/server/lib/itsi/server/version.rb +1 -1
  172. data/gems/server/lib/itsi/server.rb +27 -6
  173. data/gems/server/lib/ruby_lsp/itsi/addon.rb +64 -48
  174. data/gems/server/test/helpers/test_helper.rb +64 -5
  175. data/gems/server/test/middleware/test_log_requests.rb +17 -0
  176. data/gems/server/test/options/test_threads.rb +15 -0
  177. data/gems/server/test/options/test_workers.rb +18 -0
  178. data/gems/server/test/test_itsi_server.rb +81 -94
  179. data/itsi-scheduler-100.png +0 -0
  180. data/itsi-server-100.png +0 -0
  181. data/lib/itsi/version.rb +1 -1
  182. data/tasks.txt +36 -28
  183. metadata +147 -215
  184. data/crates/_index.md +0 -0
  185. data/crates/itsi_server/src/ruby_types/README.md +0 -21
  186. data/crates/itsi_server/test.md +0 -14
  187. data/docs/Itsi.rb +0 -17
  188. data/docs/content/about.md +0 -6
  189. data/docs/content/docs/_index.md +0 -18
  190. data/docs/content/docs/first-page.md +0 -9
  191. data/docs/content/docs/folder/_index.md +0 -10
  192. data/docs/content/docs/folder/leaf.md +0 -7
  193. data/foo/Itsi.rb +0 -122
  194. data/gems/_index.md +0 -18
  195. data/gems/scheduler/CHANGELOG.md +0 -5
  196. data/gems/scheduler/CODE_OF_CONDUCT.md +0 -139
  197. data/gems/scheduler/LICENSE.txt +0 -21
  198. data/gems/scheduler/_index.md +0 -7
  199. data/gems/server/CHANGELOG.md +0 -10
  200. data/gems/server/CODE_OF_CONDUCT.md +0 -139
  201. data/gems/server/LICENSE.txt +0 -21
  202. data/gems/server/_index.md +0 -6
  203. data/sandbox/README.md +0 -5
  204. data/sandbox/deploy/main.tf +0 -238
  205. data/sandbox/deploy/outputs.tf +0 -4
  206. data/sandbox/deploy/vars.tf +0 -11
  207. data/sandbox/falcon_benchmark/Gemfile +0 -10
  208. data/sandbox/falcon_benchmark/Gemfile.lock +0 -140
  209. data/sandbox/falcon_benchmark/config.ru +0 -54
  210. data/sandbox/itsi_file/Gemfile +0 -13
  211. data/sandbox/itsi_file/Gemfile.lock +0 -111
  212. data/sandbox/itsi_file/Itsi.rb +0 -474
  213. data/sandbox/itsi_file/call.json +0 -1
  214. data/sandbox/itsi_file/echo_client/Gemfile +0 -10
  215. data/sandbox/itsi_file/echo_client/Gemfile.lock +0 -27
  216. data/sandbox/itsi_file/echo_client/README.md +0 -95
  217. data/sandbox/itsi_file/echo_client/echo_client.rb +0 -164
  218. data/sandbox/itsi_file/echo_client/gen_proto.sh +0 -17
  219. data/sandbox/itsi_file/echo_client/lib/echo_pb.rb +0 -16
  220. data/sandbox/itsi_file/echo_client/lib/echo_services_pb.rb +0 -29
  221. data/sandbox/itsi_file/echo_client/run_client.rb +0 -64
  222. data/sandbox/itsi_file/echo_client/test_compressions.sh +0 -20
  223. data/sandbox/itsi_file/echo_service_nonitsi/Gemfile +0 -10
  224. data/sandbox/itsi_file/echo_service_nonitsi/Gemfile.lock +0 -79
  225. data/sandbox/itsi_file/echo_service_nonitsi/echo.proto +0 -26
  226. data/sandbox/itsi_file/echo_service_nonitsi/echo_pb.rb +0 -16
  227. data/sandbox/itsi_file/echo_service_nonitsi/echo_services_pb.rb +0 -29
  228. data/sandbox/itsi_file/echo_service_nonitsi/server.rb +0 -52
  229. data/sandbox/itsi_file/error.html +0 -2
  230. data/sandbox/itsi_file/organisations_controller.rb +0 -20
  231. data/sandbox/itsi_file/public/assets/image.png +0 -0
  232. data/sandbox/itsi_sandbox_async/Gemfile +0 -10
  233. data/sandbox/itsi_sandbox_async/Gemfile.lock +0 -69
  234. data/sandbox/itsi_sandbox_async/config.ru +0 -9
  235. data/sandbox/itsi_sandbox_hanami/.env +0 -2
  236. data/sandbox/itsi_sandbox_hanami/.gitignore +0 -6
  237. data/sandbox/itsi_sandbox_hanami/.rspec +0 -1
  238. data/sandbox/itsi_sandbox_hanami/Gemfile +0 -49
  239. data/sandbox/itsi_sandbox_hanami/Gemfile.lock +0 -440
  240. data/sandbox/itsi_sandbox_hanami/Guardfile +0 -9
  241. data/sandbox/itsi_sandbox_hanami/Procfile.dev +0 -2
  242. data/sandbox/itsi_sandbox_hanami/README.md +0 -1
  243. data/sandbox/itsi_sandbox_hanami/Rakefile +0 -3
  244. data/sandbox/itsi_sandbox_hanami/app/action.rb +0 -12
  245. data/sandbox/itsi_sandbox_hanami/app/actions/.keep +0 -0
  246. data/sandbox/itsi_sandbox_hanami/app/assets/css/app.css +0 -5
  247. data/sandbox/itsi_sandbox_hanami/app/assets/images/favicon.ico +0 -0
  248. data/sandbox/itsi_sandbox_hanami/app/assets/js/app.js +0 -1
  249. data/sandbox/itsi_sandbox_hanami/app/db/relation.rb +0 -10
  250. data/sandbox/itsi_sandbox_hanami/app/db/repo.rb +0 -10
  251. data/sandbox/itsi_sandbox_hanami/app/db/struct.rb +0 -10
  252. data/sandbox/itsi_sandbox_hanami/app/operation.rb +0 -9
  253. data/sandbox/itsi_sandbox_hanami/app/relations/.keep +0 -0
  254. data/sandbox/itsi_sandbox_hanami/app/repos/.keep +0 -0
  255. data/sandbox/itsi_sandbox_hanami/app/structs/.keep +0 -0
  256. data/sandbox/itsi_sandbox_hanami/app/templates/layouts/app.html.erb +0 -14
  257. data/sandbox/itsi_sandbox_hanami/app/view.rb +0 -9
  258. data/sandbox/itsi_sandbox_hanami/app/views/helpers.rb +0 -10
  259. data/sandbox/itsi_sandbox_hanami/bin/dev +0 -8
  260. data/sandbox/itsi_sandbox_hanami/config/app.rb +0 -8
  261. data/sandbox/itsi_sandbox_hanami/config/assets.js +0 -16
  262. data/sandbox/itsi_sandbox_hanami/config/db/migrate/.keep +0 -0
  263. data/sandbox/itsi_sandbox_hanami/config/db/seeds.rb +0 -15
  264. data/sandbox/itsi_sandbox_hanami/config/puma.rb +0 -47
  265. data/sandbox/itsi_sandbox_hanami/config/routes.rb +0 -7
  266. data/sandbox/itsi_sandbox_hanami/config/settings.rb +0 -9
  267. data/sandbox/itsi_sandbox_hanami/config.ru +0 -5
  268. data/sandbox/itsi_sandbox_hanami/db/.keep +0 -0
  269. data/sandbox/itsi_sandbox_hanami/lib/itsi_hanami/types.rb +0 -11
  270. data/sandbox/itsi_sandbox_hanami/lib/tasks/.keep +0 -0
  271. data/sandbox/itsi_sandbox_hanami/package-lock.json +0 -946
  272. data/sandbox/itsi_sandbox_hanami/package.json +0 -8
  273. data/sandbox/itsi_sandbox_hanami/spec/requests/root_spec.rb +0 -11
  274. data/sandbox/itsi_sandbox_hanami/spec/spec_helper.rb +0 -9
  275. data/sandbox/itsi_sandbox_hanami/spec/support/db/cleaning.rb +0 -42
  276. data/sandbox/itsi_sandbox_hanami/spec/support/db.rb +0 -10
  277. data/sandbox/itsi_sandbox_hanami/spec/support/features.rb +0 -5
  278. data/sandbox/itsi_sandbox_hanami/spec/support/operations.rb +0 -8
  279. data/sandbox/itsi_sandbox_hanami/spec/support/requests.rb +0 -13
  280. data/sandbox/itsi_sandbox_hanami/spec/support/rspec.rb +0 -61
  281. data/sandbox/itsi_sandbox_rack/Gemfile +0 -17
  282. data/sandbox/itsi_sandbox_rack/Gemfile.lock +0 -153
  283. data/sandbox/itsi_sandbox_rack/config.ru +0 -5
  284. data/sandbox/itsi_sandbox_rack_lint/Gemfile +0 -7
  285. data/sandbox/itsi_sandbox_rack_lint/Gemfile.lock +0 -27
  286. data/sandbox/itsi_sandbox_rack_lint/config.ru +0 -3
  287. data/sandbox/itsi_sandbox_rails/.dockerignore +0 -48
  288. data/sandbox/itsi_sandbox_rails/.gitattributes +0 -9
  289. data/sandbox/itsi_sandbox_rails/.github/dependabot.yml +0 -12
  290. data/sandbox/itsi_sandbox_rails/.github/workflows/ci.yml +0 -90
  291. data/sandbox/itsi_sandbox_rails/.gitignore +0 -35
  292. data/sandbox/itsi_sandbox_rails/.rubocop.yml +0 -8
  293. data/sandbox/itsi_sandbox_rails/.ruby-version +0 -1
  294. data/sandbox/itsi_sandbox_rails/Dockerfile +0 -69
  295. data/sandbox/itsi_sandbox_rails/Gemfile +0 -66
  296. data/sandbox/itsi_sandbox_rails/Gemfile.lock +0 -429
  297. data/sandbox/itsi_sandbox_rails/README.md +0 -24
  298. data/sandbox/itsi_sandbox_rails/Rakefile +0 -6
  299. data/sandbox/itsi_sandbox_rails/app/assets/config/manifest.js +0 -4
  300. data/sandbox/itsi_sandbox_rails/app/assets/images/.keep +0 -0
  301. data/sandbox/itsi_sandbox_rails/app/assets/stylesheets/application.css +0 -15
  302. data/sandbox/itsi_sandbox_rails/app/channels/application_cable/channel.rb +0 -4
  303. data/sandbox/itsi_sandbox_rails/app/channels/application_cable/connection.rb +0 -4
  304. data/sandbox/itsi_sandbox_rails/app/controllers/application_controller.rb +0 -4
  305. data/sandbox/itsi_sandbox_rails/app/controllers/concerns/.keep +0 -0
  306. data/sandbox/itsi_sandbox_rails/app/controllers/home_controller.rb +0 -66
  307. data/sandbox/itsi_sandbox_rails/app/controllers/live_controller.rb +0 -40
  308. data/sandbox/itsi_sandbox_rails/app/controllers/uploads_controller.rb +0 -29
  309. data/sandbox/itsi_sandbox_rails/app/helpers/application_helper.rb +0 -2
  310. data/sandbox/itsi_sandbox_rails/app/javascript/application.js +0 -3
  311. data/sandbox/itsi_sandbox_rails/app/javascript/controllers/application.js +0 -9
  312. data/sandbox/itsi_sandbox_rails/app/javascript/controllers/hello_controller.js +0 -7
  313. data/sandbox/itsi_sandbox_rails/app/javascript/controllers/index.js +0 -4
  314. data/sandbox/itsi_sandbox_rails/app/jobs/application_job.rb +0 -7
  315. data/sandbox/itsi_sandbox_rails/app/mailers/application_mailer.rb +0 -4
  316. data/sandbox/itsi_sandbox_rails/app/models/application_record.rb +0 -3
  317. data/sandbox/itsi_sandbox_rails/app/models/concerns/.keep +0 -0
  318. data/sandbox/itsi_sandbox_rails/app/models/post.rb +0 -2
  319. data/sandbox/itsi_sandbox_rails/app/views/layouts/application.html.erb +0 -23
  320. data/sandbox/itsi_sandbox_rails/app/views/layouts/mailer.html.erb +0 -13
  321. data/sandbox/itsi_sandbox_rails/app/views/layouts/mailer.text.erb +0 -1
  322. data/sandbox/itsi_sandbox_rails/app/views/pwa/manifest.json.erb +0 -22
  323. data/sandbox/itsi_sandbox_rails/app/views/pwa/service-worker.js +0 -26
  324. data/sandbox/itsi_sandbox_rails/bin/brakeman +0 -7
  325. data/sandbox/itsi_sandbox_rails/bin/bundle +0 -109
  326. data/sandbox/itsi_sandbox_rails/bin/docker-entrypoint +0 -13
  327. data/sandbox/itsi_sandbox_rails/bin/importmap +0 -4
  328. data/sandbox/itsi_sandbox_rails/bin/rails +0 -4
  329. data/sandbox/itsi_sandbox_rails/bin/rake +0 -4
  330. data/sandbox/itsi_sandbox_rails/bin/rubocop +0 -8
  331. data/sandbox/itsi_sandbox_rails/bin/setup +0 -37
  332. data/sandbox/itsi_sandbox_rails/config/application.rb +0 -27
  333. data/sandbox/itsi_sandbox_rails/config/boot.rb +0 -4
  334. data/sandbox/itsi_sandbox_rails/config/cable.yml +0 -10
  335. data/sandbox/itsi_sandbox_rails/config/credentials.yml.enc +0 -1
  336. data/sandbox/itsi_sandbox_rails/config/database.yml +0 -30
  337. data/sandbox/itsi_sandbox_rails/config/environment.rb +0 -5
  338. data/sandbox/itsi_sandbox_rails/config/environments/development.rb +0 -82
  339. data/sandbox/itsi_sandbox_rails/config/environments/production.rb +0 -106
  340. data/sandbox/itsi_sandbox_rails/config/environments/test.rb +0 -67
  341. data/sandbox/itsi_sandbox_rails/config/importmap.rb +0 -7
  342. data/sandbox/itsi_sandbox_rails/config/initializers/assets.rb +0 -12
  343. data/sandbox/itsi_sandbox_rails/config/initializers/content_security_policy.rb +0 -25
  344. data/sandbox/itsi_sandbox_rails/config/initializers/filter_parameter_logging.rb +0 -8
  345. data/sandbox/itsi_sandbox_rails/config/initializers/inflections.rb +0 -16
  346. data/sandbox/itsi_sandbox_rails/config/initializers/permissions_policy.rb +0 -13
  347. data/sandbox/itsi_sandbox_rails/config/locales/en.yml +0 -31
  348. data/sandbox/itsi_sandbox_rails/config/puma.rb +0 -34
  349. data/sandbox/itsi_sandbox_rails/config/routes.rb +0 -23
  350. data/sandbox/itsi_sandbox_rails/config/storage.yml +0 -34
  351. data/sandbox/itsi_sandbox_rails/config.ru +0 -6
  352. data/sandbox/itsi_sandbox_rails/db/migrate/20250301041554_create_posts.rb +0 -10
  353. data/sandbox/itsi_sandbox_rails/db/schema.rb +0 -23
  354. data/sandbox/itsi_sandbox_rails/db/seeds.rb +0 -9
  355. data/sandbox/itsi_sandbox_rails/lib/assets/.keep +0 -0
  356. data/sandbox/itsi_sandbox_rails/lib/tasks/.keep +0 -0
  357. data/sandbox/itsi_sandbox_rails/log/.keep +0 -0
  358. data/sandbox/itsi_sandbox_rails/public/404.html +0 -67
  359. data/sandbox/itsi_sandbox_rails/public/406-unsupported-browser.html +0 -66
  360. data/sandbox/itsi_sandbox_rails/public/422.html +0 -67
  361. data/sandbox/itsi_sandbox_rails/public/500.html +0 -66
  362. data/sandbox/itsi_sandbox_rails/public/icon.png +0 -0
  363. data/sandbox/itsi_sandbox_rails/public/icon.svg +0 -3
  364. data/sandbox/itsi_sandbox_rails/public/robots.txt +0 -1
  365. data/sandbox/itsi_sandbox_rails/storage/.keep +0 -0
  366. data/sandbox/itsi_sandbox_rails/test/application_system_test_case.rb +0 -5
  367. data/sandbox/itsi_sandbox_rails/test/channels/application_cable/connection_test.rb +0 -13
  368. data/sandbox/itsi_sandbox_rails/test/controllers/.keep +0 -0
  369. data/sandbox/itsi_sandbox_rails/test/fixtures/files/.keep +0 -0
  370. data/sandbox/itsi_sandbox_rails/test/helpers/.keep +0 -0
  371. data/sandbox/itsi_sandbox_rails/test/integration/.keep +0 -0
  372. data/sandbox/itsi_sandbox_rails/test/mailers/.keep +0 -0
  373. data/sandbox/itsi_sandbox_rails/test/models/.keep +0 -0
  374. data/sandbox/itsi_sandbox_rails/test/system/.keep +0 -0
  375. data/sandbox/itsi_sandbox_rails/test/test_helper.rb +0 -15
  376. data/sandbox/itsi_sandbox_rails/tmp/.keep +0 -0
  377. data/sandbox/itsi_sandbox_rails/tmp/pids/.keep +0 -0
  378. data/sandbox/itsi_sandbox_rails/tmp/storage/.keep +0 -0
  379. data/sandbox/itsi_sandbox_rails/vendor/.keep +0 -0
  380. data/sandbox/itsi_sandbox_rails/vendor/javascript/.keep +0 -0
  381. data/sandbox/itsi_sandbox_roda/Gemfile +0 -5
  382. data/sandbox/itsi_sandbox_roda/Gemfile.lock +0 -37
  383. data/sandbox/itsi_sandbox_roda/config.ru +0 -39
  384. data/sandbox/itsi_sinatra/Gemfile +0 -9
  385. data/sandbox/itsi_sinatra/Gemfile.lock +0 -81
  386. data/sandbox/itsi_sinatra/app.rb +0 -8
  387. data/sandbox/pebble/docker-compose.yml +0 -11
  388. data/sandbox/static_files/.env +0 -1
  389. data/sandbox/static_files/404.html +0 -25
  390. data/sandbox/static_files/_DSC0102.NEF.jpg +0 -0
  391. data/sandbox/static_files/about.html +0 -68
  392. data/sandbox/static_files/tiny.html +0 -1
  393. data/sandbox/static_files/writebook.zip +0 -0
@@ -1,5 +1,7 @@
1
1
  ---
2
2
  type: docs
3
+ sidebar:
4
+ exclude: true
3
5
  ---
4
6
 
5
7
  # ItsiServer
data/gems/server/exe/itsi CHANGED
@@ -7,9 +7,10 @@ require "optparse"
7
7
 
8
8
  COMMANDS = {
9
9
  "init" => "Initialize a new Itsi.rb server configuration file",
10
+ "test" => "Test config file validity",
10
11
  "status" => "Show the status of the server",
11
- "start" => "Start the Isti server",
12
- "serve" => "Start the Isti server",
12
+ "start" => "Start the Itsi server",
13
+ "serve" => "Start the Itsi server",
13
14
  "stop" => "Stop the server",
14
15
  "reload" => "Reload the server",
15
16
  "restart" => "Restart the server",
@@ -37,7 +38,7 @@ parser = OptionParser.new do |opts|
37
38
  end
38
39
 
39
40
  opts.on("-d", "--daemonize", "Run the process as a daemon") do
40
- Process.daemon(true)
41
+ options[:daemonize] = true
41
42
  end
42
43
 
43
44
  opts.on("-t", "--threads THREADS", Integer, "Number of threads (default: 1)") do |t|
@@ -57,7 +58,7 @@ parser = OptionParser.new do |opts|
57
58
  options[:worker_memory_limit] = ml
58
59
  end
59
60
 
60
- opts.on("-f", "--fiber_scheduler [CLASS_NAME]", [String],
61
+ opts.on("-f", "--fiber_scheduler [CLASS_NAME]", String,
61
62
  "Scheduler class to use (default: nil). Provide blank or true to use Itsi::Scheduler, or a classname to use an alternative scheduler") do |scheduler_class|
62
63
  if scheduler_class.nil? || scheduler_class == "true"
63
64
  options[:scheduler_class] = "Itsi::Scheduler"
@@ -154,7 +155,6 @@ if ENV['COMP_LINE'] || ARGV.include?('--completion')
154
155
  end
155
156
 
156
157
  parser.parse!
157
-
158
158
  case (command = ARGV.shift)
159
159
  when *COMMANDS.keys
160
160
  required_arity = Itsi::Server.method(command).parameters&.select{|c| c.first == :req }&.length&.succ || 2
@@ -0,0 +1,93 @@
1
+ module Itsi
2
+ class Server
3
+ module Config
4
+ module ConfigHelpers
5
+
6
+ def self.load_and_register(klass)
7
+ config_type = klass.name.split("::").last.downcase
8
+ listing = [
9
+ Dir[File.expand_path(File.dirname(__FILE__) + "/#{config_type}/**.rb")],
10
+ Dir[File.expand_path(File.dirname(__FILE__) + "/#{config_type}s/**.rb")]
11
+ ].flatten
12
+
13
+ listing.each do |file|
14
+ current = klass.subclasses
15
+ require file
16
+ following = klass.subclasses
17
+ new_class = (following - current).first
18
+
19
+ documentation_file = "#{file[/(.*)\.rb/,1]}.md"
20
+ if File.exist?(documentation_file) && new_class
21
+ new_class.documentation IO.read(documentation_file)
22
+ .gsub(/^---.*?\n.*?-+/m,'') # Strip frontmatter
23
+ .gsub(/^(```.*?)\{.*?\}.*$/, "\\1") # Strip filename from code blocks
24
+ .gsub(/^\{\{[^\}]+\}\}/, "") # Strip Hugo blocks
25
+ end
26
+ end
27
+ end
28
+
29
+ def normalize_keys!(hash, expected=[])
30
+ hash.keys.each do |key|
31
+ value = hash.delete(key)
32
+ key = key.to_s.downcase.to_sym
33
+ hash[key] = value
34
+ raise "Unexpected key: #{key}" unless expected.include?(key)
35
+ expected -= [key]
36
+ end
37
+ raise "Missing required keys: #{expected.join(', ')}" unless expected.empty?
38
+ hash
39
+ end
40
+
41
+ def self.included(cls)
42
+ def cls.inherited(base)
43
+ %i[detail documentation insert_text schema].each do |attr|
44
+ base.define_singleton_method(attr) do |value=nil|
45
+ @middleware_class_attrs ||= {}
46
+ if value
47
+ @middleware_class_attrs[attr] = value
48
+ else
49
+ @middleware_class_attrs[attr]
50
+ end
51
+ end
52
+
53
+ base.define_method(attr) do |value=nil|
54
+ self.class.send(attr)
55
+ end
56
+ end
57
+
58
+ def base.schema(value=nil, &blk)
59
+ @middleware_class_attrs ||= {}
60
+ if blk
61
+ @middleware_class_attrs[:schema] = TypedStruct.new(&blk)
62
+ else
63
+ @middleware_class_attrs[:schema]
64
+ end
65
+ end
66
+ end
67
+
68
+ load_and_register(cls)
69
+
70
+ config_type = cls.name.split("::").last.downcase
71
+
72
+ cls.define_singleton_method("#{config_type}_name") do |name=self.name|
73
+ @config_name ||= name.split("::").last.gsub(/([a-z])([A-Z])/, '\1_\2').downcase.to_sym
74
+ end
75
+ end
76
+
77
+ def initialize(location, params)
78
+ @location = location
79
+ @params = case self.schema
80
+ when TypedStruct::Validation
81
+ self.schema.validate!(params)
82
+ else
83
+ self.schema.new(params).to_h
84
+ end
85
+ end
86
+
87
+ def build!
88
+ @params
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -2,18 +2,25 @@ module Itsi
2
2
  class Server
3
3
  module Config
4
4
  class DSL
5
- attr_reader :parent, :children, :middleware, :controller_class, :routes, :methods, :protocols,
5
+ require_relative "config_helpers"
6
+ require_relative "option"
7
+ require_relative "middleware"
8
+
9
+ attr_reader :parent, :children, :middleware, :controller_class, :routes, :http_methods, :protocols,
6
10
  :hosts, :ports, :extensions, :content_types, :accepts, :options
7
11
 
8
12
  def self.evaluate(config = Itsi::Server::Config.config_file_path, &blk)
9
- new(routes: ["/"]) do
13
+ config = new(routes: ["/"]) do
10
14
  if blk
11
15
  instance_exec(&blk)
12
16
  else
13
17
  code = IO.read(config)
14
18
  instance_eval(code, config.to_s, 1)
15
19
  end
16
- end.options
20
+ end
21
+ [config.options, config.errors]
22
+ rescue Exception => e
23
+ [{}, [[e, e.backtrace[0]]]]
17
24
  end
18
25
 
19
26
  def initialize(
@@ -36,7 +43,7 @@ module Itsi
36
43
 
37
44
  @controller = controller
38
45
  @routes = Array(routes).flatten
39
- @methods = methods.map { |s| s.is_a?(Regexp) ? s : s.to_s }
46
+ @http_methods = methods.map { |s| s.is_a?(Regexp) ? s : s.to_s }
40
47
  @protocols = protocols.map { |s| s.is_a?(Regexp) ? s : s.to_s }
41
48
  @hosts = hosts.map { |s| s.is_a?(Regexp) ? s : s.to_s }
42
49
  @ports = ports.map { |s| s.is_a?(Regexp) ? s : s.to_s }
@@ -54,19 +61,30 @@ module Itsi
54
61
  end
55
62
  }
56
63
 
64
+ @errors = []
57
65
  instance_exec(&block)
58
66
  end
59
67
 
60
- def workers(workers)
61
- raise "Workers must be set at the root" unless @parent.nil?
62
-
63
- @options[:workers] = [workers.to_i, 1].max
68
+ def errors
69
+ @children.map(&:errors).flatten + @errors
64
70
  end
65
71
 
66
- def threads(threads)
67
- raise "Threads must be set at the root" unless @parent.nil?
72
+ Option.subclasses.each do |option|
73
+ option_name = option.option_name
74
+ define_method(option_name) do |*args, **kwargs, &blk|
75
+ @options[option_name] = option.new(self, *args, **kwargs, &blk).build!
76
+ rescue => e
77
+ @errors << [e, caller[1]]
78
+ end
79
+ end
68
80
 
69
- @options[:threads] = [threads.to_i, 1].max
81
+ Middleware.subclasses.each do |middleware|
82
+ middleware_name = middleware.middleware_name
83
+ define_method(middleware_name) do |*args, **kwargs, &blk|
84
+ @middleware[middleware_name] = middleware.new(@parent, *args, **kwargs, &blk).build!
85
+ rescue => e
86
+ @errors << [e, caller[1]]
87
+ end
70
88
  end
71
89
 
72
90
  def oob_gc_responses_threshold(threshold)
@@ -81,18 +99,24 @@ module Itsi
81
99
  @options[:log_level] = level.to_s
82
100
  end
83
101
 
84
- def log_format(format)
85
- raise "Log format must be set at the root" unless @parent.nil?
86
-
87
- @options[:log_format] = format.to_s
88
- end
89
-
90
102
  def log_target(target)
91
103
  raise "Log target must be set at the root" unless @parent.nil?
92
104
 
93
105
  @options[:log_target] = target.to_s
94
106
  end
95
107
 
108
+ def log_target_filters(target_filters)
109
+ raise "Log target filters must be set at the root" unless @parent.nil?
110
+
111
+ @options[:log_target_filters] = target_filters
112
+ end
113
+
114
+ def log_format(target)
115
+ raise "Log format must be set at the root" unless @parent.nil?
116
+
117
+ @options[:log_format] = target.to_s
118
+ end
119
+
96
120
  def get(route, app_proc = nil, nonblocking: false, &blk)
97
121
  endpoint(route, [:get], app_proc, nonblocking: nonblocking, &blk)
98
122
  end
@@ -138,11 +162,10 @@ module Itsi
138
162
  app_proc = Itsi::Server::TypedHandlers.handler_for(app_proc, params_schema)
139
163
  end
140
164
 
141
-
142
- if route || methods.any?
165
+ if route || http_methods.any?
143
166
  # For endpoints, it's usually assumed trailing slash and non-trailing slash behaviour is the same
144
167
  routes = route == "/" ? ["", "/"] : [route]
145
- location(*routes, methods: methods) do
168
+ location(*routes, methods: http_methods) do
146
169
  @middleware[:app] = { preloader: -> { app_proc }, nonblocking: nonblocking }
147
170
  end
148
171
  else
@@ -204,6 +227,31 @@ module Itsi
204
227
  instance_eval(code, "#{path}.rb", 1)
205
228
  end
206
229
 
230
+ def reuse_address(reuse_address)
231
+ raise "reuse_address must be set at the root" unless @parent.nil?
232
+ @options[:reuse_address] = reuse_address
233
+ end
234
+
235
+ def reuse_port(reuse_port)
236
+ raise "reuse_port must be set at the root" unless @parent.nil?
237
+ @options[:reuse_port] = reuse_port
238
+ end
239
+
240
+ def listen_backlog(listen_backlog)
241
+ raise "listen_backlog must be set at the root" unless @parent.nil?
242
+ @options[:listen_backlog] = listen_backlog
243
+ end
244
+
245
+ def nodelay(nodelay)
246
+ raise "nodelay must be set at the root" unless @parent.nil?
247
+ @options[:nodelay] = nodelay
248
+ end
249
+
250
+ def recv_buffer_size(recv_buffer_size)
251
+ raise "recv_buffer_size must be set at the root" unless @parent.nil?
252
+ @options[:recv_buffer_size] = recv_buffer_size
253
+ end
254
+
207
255
  def bind(bind_str)
208
256
  raise "Bind must be set at the root" unless @parent.nil?
209
257
 
@@ -296,6 +344,11 @@ module Itsi
296
344
  @options[:shutdown_timeout] = shutdown_timeout.to_f
297
345
  end
298
346
 
347
+ def header_read_timeout(header_read_timeout)
348
+ raise "Header read timeout must be set at the root" unless @parent.nil?
349
+
350
+ @options[:header_read_timeout] = header_read_timeout.to_f
351
+ end
299
352
 
300
353
  def stream_body(stream_body)
301
354
  raise "Stream body must be set at the root" unless @parent.nil?
@@ -309,7 +362,7 @@ module Itsi
309
362
  @children << DSL.new(
310
363
  self,
311
364
  routes: routes,
312
- methods: Array(methods) | self.methods,
365
+ methods: Array(methods) | self.http_methods,
313
366
  protocols: Array(protocols) | self.protocols,
314
367
  hosts: Array(hosts) | self.hosts,
315
368
  ports: Array(ports) | self.ports,
@@ -327,9 +380,6 @@ module Itsi
327
380
  end
328
381
  end
329
382
 
330
- def log_requests(**args)
331
- @middleware[:log_requests] = args
332
- end
333
383
 
334
384
  def allow_list(**args)
335
385
  args[:allowed_patterns] = Array(args[:allowed_patterns]).map do |pattern|
@@ -358,7 +408,6 @@ module Itsi
358
408
  end
359
409
 
360
410
  def auth_basic(**args)
361
-
362
411
  if File.exist?(".itsi-credentials") && !args[:credential_file]
363
412
  args[:credential_file] = ".itsi-credentials"
364
413
  end
@@ -432,8 +481,12 @@ module Itsi
432
481
  @middleware[:etag] = args
433
482
  end
434
483
 
484
+ def csp(**args)
485
+ @middleware[:csp] = args
486
+ end
487
+
435
488
  def intrusion_protection(**args)
436
- args[:banned_url_patterns] = Array(args[:banned_url_patterns]).map do |pattern|
489
+ args[:banned_url_patterns] = Array(args[:banned_url_patterns]).flatten.map do |pattern|
437
490
  if pattern.is_a?(Regexp)
438
491
  pattern.source
439
492
  else
@@ -485,7 +538,7 @@ module Itsi
485
538
  result << deep_stringify_keys(
486
539
  {
487
540
  route: Regexp.new("^#{route_options}/?$"),
488
- methods: @methods.any? ? @methods : nil,
541
+ methods: @http_methods.any? ? @http_methods : nil,
489
542
  protocols: @protocols.any? ? @protocols : nil,
490
543
  hosts: @hosts.any? ? @hosts : nil,
491
544
  ports: @ports.any? ? @ports : nil,
@@ -535,11 +588,6 @@ module Itsi
535
588
  end
536
589
 
537
590
  def effective_middleware
538
- merged = merge_ancestor_middleware
539
- merged.map { |k, v| { type: k.to_s, parameters: v } }
540
- end
541
-
542
- def merge_ancestor_middleware
543
591
  chain = []
544
592
  node = self
545
593
  while node
@@ -558,7 +606,7 @@ module Itsi
558
606
  merged[k] = v
559
607
  end
560
608
  end
561
- merged
609
+ deep_stringify_keys(merged)
562
610
  end
563
611
 
564
612
  def deep_stringify_keys(obj)