itsi-server 0.2.22-aarch64-linux

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (451) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +8 -0
  3. data/Cargo.lock +4452 -0
  4. data/Cargo.toml +11 -0
  5. data/Rakefile +57 -0
  6. data/exe/itsi +193 -0
  7. data/ext/itsi_acme/Cargo.toml +86 -0
  8. data/ext/itsi_acme/examples/high_level.rs +63 -0
  9. data/ext/itsi_acme/examples/high_level_warp.rs +52 -0
  10. data/ext/itsi_acme/examples/low_level.rs +87 -0
  11. data/ext/itsi_acme/examples/low_level_axum.rs +66 -0
  12. data/ext/itsi_acme/src/acceptor.rs +81 -0
  13. data/ext/itsi_acme/src/acme.rs +354 -0
  14. data/ext/itsi_acme/src/axum.rs +86 -0
  15. data/ext/itsi_acme/src/cache.rs +39 -0
  16. data/ext/itsi_acme/src/caches/boxed.rs +80 -0
  17. data/ext/itsi_acme/src/caches/composite.rs +69 -0
  18. data/ext/itsi_acme/src/caches/dir.rs +106 -0
  19. data/ext/itsi_acme/src/caches/mod.rs +11 -0
  20. data/ext/itsi_acme/src/caches/no.rs +78 -0
  21. data/ext/itsi_acme/src/caches/test.rs +136 -0
  22. data/ext/itsi_acme/src/config.rs +172 -0
  23. data/ext/itsi_acme/src/https_helper.rs +69 -0
  24. data/ext/itsi_acme/src/incoming.rs +142 -0
  25. data/ext/itsi_acme/src/jose.rs +161 -0
  26. data/ext/itsi_acme/src/lib.rs +142 -0
  27. data/ext/itsi_acme/src/resolver.rs +59 -0
  28. data/ext/itsi_acme/src/state.rs +424 -0
  29. data/ext/itsi_error/Cargo.lock +368 -0
  30. data/ext/itsi_error/Cargo.toml +12 -0
  31. data/ext/itsi_error/src/lib.rs +140 -0
  32. data/ext/itsi_instrument_entry/Cargo.toml +15 -0
  33. data/ext/itsi_instrument_entry/src/lib.rs +31 -0
  34. data/ext/itsi_rb_helpers/Cargo.lock +355 -0
  35. data/ext/itsi_rb_helpers/Cargo.toml +11 -0
  36. data/ext/itsi_rb_helpers/src/heap_value.rs +139 -0
  37. data/ext/itsi_rb_helpers/src/lib.rs +232 -0
  38. data/ext/itsi_scheduler/Cargo.toml +24 -0
  39. data/ext/itsi_scheduler/src/itsi_scheduler/io_helpers.rs +56 -0
  40. data/ext/itsi_scheduler/src/itsi_scheduler/io_waiter.rs +44 -0
  41. data/ext/itsi_scheduler/src/itsi_scheduler/timer.rs +44 -0
  42. data/ext/itsi_scheduler/src/itsi_scheduler.rs +320 -0
  43. data/ext/itsi_scheduler/src/lib.rs +39 -0
  44. data/ext/itsi_server/Cargo.lock +2956 -0
  45. data/ext/itsi_server/Cargo.toml +94 -0
  46. data/ext/itsi_server/extconf.rb +11 -0
  47. data/ext/itsi_server/src/default_responses/html/401.html +68 -0
  48. data/ext/itsi_server/src/default_responses/html/403.html +68 -0
  49. data/ext/itsi_server/src/default_responses/html/404.html +68 -0
  50. data/ext/itsi_server/src/default_responses/html/413.html +71 -0
  51. data/ext/itsi_server/src/default_responses/html/429.html +68 -0
  52. data/ext/itsi_server/src/default_responses/html/500.html +71 -0
  53. data/ext/itsi_server/src/default_responses/html/502.html +71 -0
  54. data/ext/itsi_server/src/default_responses/html/503.html +68 -0
  55. data/ext/itsi_server/src/default_responses/html/504.html +69 -0
  56. data/ext/itsi_server/src/default_responses/html/index.html +238 -0
  57. data/ext/itsi_server/src/default_responses/json/401.json +6 -0
  58. data/ext/itsi_server/src/default_responses/json/403.json +6 -0
  59. data/ext/itsi_server/src/default_responses/json/404.json +6 -0
  60. data/ext/itsi_server/src/default_responses/json/413.json +6 -0
  61. data/ext/itsi_server/src/default_responses/json/429.json +6 -0
  62. data/ext/itsi_server/src/default_responses/json/500.json +6 -0
  63. data/ext/itsi_server/src/default_responses/json/502.json +6 -0
  64. data/ext/itsi_server/src/default_responses/json/503.json +6 -0
  65. data/ext/itsi_server/src/default_responses/json/504.json +6 -0
  66. data/ext/itsi_server/src/default_responses/mod.rs +14 -0
  67. data/ext/itsi_server/src/env.rs +43 -0
  68. data/ext/itsi_server/src/lib.rs +154 -0
  69. data/ext/itsi_server/src/prelude.rs +2 -0
  70. data/ext/itsi_server/src/ruby_types/itsi_body_proxy/big_bytes.rs +116 -0
  71. data/ext/itsi_server/src/ruby_types/itsi_body_proxy/mod.rs +149 -0
  72. data/ext/itsi_server/src/ruby_types/itsi_grpc_call.rs +346 -0
  73. data/ext/itsi_server/src/ruby_types/itsi_grpc_response_stream/mod.rs +265 -0
  74. data/ext/itsi_server/src/ruby_types/itsi_http_request.rs +399 -0
  75. data/ext/itsi_server/src/ruby_types/itsi_http_response.rs +447 -0
  76. data/ext/itsi_server/src/ruby_types/itsi_server/file_watcher.rs +545 -0
  77. data/ext/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +650 -0
  78. data/ext/itsi_server/src/ruby_types/itsi_server.rs +102 -0
  79. data/ext/itsi_server/src/ruby_types/mod.rs +48 -0
  80. data/ext/itsi_server/src/server/binds/bind.rs +204 -0
  81. data/ext/itsi_server/src/server/binds/bind_protocol.rs +37 -0
  82. data/ext/itsi_server/src/server/binds/listener.rs +485 -0
  83. data/ext/itsi_server/src/server/binds/mod.rs +4 -0
  84. data/ext/itsi_server/src/server/binds/tls/locked_dir_cache.rs +132 -0
  85. data/ext/itsi_server/src/server/binds/tls.rs +278 -0
  86. data/ext/itsi_server/src/server/byte_frame.rs +32 -0
  87. data/ext/itsi_server/src/server/frame_stream.rs +143 -0
  88. data/ext/itsi_server/src/server/http_message_types.rs +230 -0
  89. data/ext/itsi_server/src/server/io_stream.rs +128 -0
  90. data/ext/itsi_server/src/server/lifecycle_event.rs +12 -0
  91. data/ext/itsi_server/src/server/middleware_stack/middleware.rs +170 -0
  92. data/ext/itsi_server/src/server/middleware_stack/middlewares/allow_list.rs +63 -0
  93. data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_api_key.rs +94 -0
  94. data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_basic.rs +93 -0
  95. data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_jwt.rs +343 -0
  96. data/ext/itsi_server/src/server/middleware_stack/middlewares/cache_control.rs +151 -0
  97. data/ext/itsi_server/src/server/middleware_stack/middlewares/compression.rs +329 -0
  98. data/ext/itsi_server/src/server/middleware_stack/middlewares/cors.rs +300 -0
  99. data/ext/itsi_server/src/server/middleware_stack/middlewares/csp.rs +193 -0
  100. data/ext/itsi_server/src/server/middleware_stack/middlewares/deny_list.rs +64 -0
  101. data/ext/itsi_server/src/server/middleware_stack/middlewares/error_response/default_responses.rs +188 -0
  102. data/ext/itsi_server/src/server/middleware_stack/middlewares/error_response.rs +168 -0
  103. data/ext/itsi_server/src/server/middleware_stack/middlewares/etag.rs +183 -0
  104. data/ext/itsi_server/src/server/middleware_stack/middlewares/header_interpretation.rs +82 -0
  105. data/ext/itsi_server/src/server/middleware_stack/middlewares/intrusion_protection.rs +209 -0
  106. data/ext/itsi_server/src/server/middleware_stack/middlewares/log_requests.rs +133 -0
  107. data/ext/itsi_server/src/server/middleware_stack/middlewares/max_body.rs +47 -0
  108. data/ext/itsi_server/src/server/middleware_stack/middlewares/mod.rs +122 -0
  109. data/ext/itsi_server/src/server/middleware_stack/middlewares/proxy.rs +407 -0
  110. data/ext/itsi_server/src/server/middleware_stack/middlewares/rate_limit.rs +155 -0
  111. data/ext/itsi_server/src/server/middleware_stack/middlewares/redirect.rs +54 -0
  112. data/ext/itsi_server/src/server/middleware_stack/middlewares/request_headers.rs +54 -0
  113. data/ext/itsi_server/src/server/middleware_stack/middlewares/response_headers.rs +51 -0
  114. data/ext/itsi_server/src/server/middleware_stack/middlewares/ruby_app.rs +138 -0
  115. data/ext/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs +269 -0
  116. data/ext/itsi_server/src/server/middleware_stack/middlewares/static_response.rs +62 -0
  117. data/ext/itsi_server/src/server/middleware_stack/middlewares/string_rewrite.rs +218 -0
  118. data/ext/itsi_server/src/server/middleware_stack/middlewares/token_source.rs +31 -0
  119. data/ext/itsi_server/src/server/middleware_stack/mod.rs +381 -0
  120. data/ext/itsi_server/src/server/mod.rs +14 -0
  121. data/ext/itsi_server/src/server/process_worker.rs +247 -0
  122. data/ext/itsi_server/src/server/redirect_type.rs +26 -0
  123. data/ext/itsi_server/src/server/request_job.rs +11 -0
  124. data/ext/itsi_server/src/server/serve_strategy/acceptor.rs +100 -0
  125. data/ext/itsi_server/src/server/serve_strategy/cluster_mode.rs +411 -0
  126. data/ext/itsi_server/src/server/serve_strategy/mod.rs +31 -0
  127. data/ext/itsi_server/src/server/serve_strategy/single_mode.rs +449 -0
  128. data/ext/itsi_server/src/server/signal.rs +129 -0
  129. data/ext/itsi_server/src/server/size_limited_incoming.rs +107 -0
  130. data/ext/itsi_server/src/server/thread_worker.rs +504 -0
  131. data/ext/itsi_server/src/services/cache_store.rs +74 -0
  132. data/ext/itsi_server/src/services/itsi_http_service.rs +270 -0
  133. data/ext/itsi_server/src/services/mime_types.rs +2896 -0
  134. data/ext/itsi_server/src/services/mod.rs +6 -0
  135. data/ext/itsi_server/src/services/password_hasher.rs +89 -0
  136. data/ext/itsi_server/src/services/rate_limiter.rs +609 -0
  137. data/ext/itsi_server/src/services/static_file_server.rs +1400 -0
  138. data/ext/itsi_tracing/Cargo.lock +274 -0
  139. data/ext/itsi_tracing/Cargo.toml +17 -0
  140. data/ext/itsi_tracing/src/lib.rs +370 -0
  141. data/lib/itsi/http_request/response_status_shortcodes.rb +76 -0
  142. data/lib/itsi/http_request.rb +228 -0
  143. data/lib/itsi/http_response.rb +49 -0
  144. data/lib/itsi/passfile.rb +108 -0
  145. data/lib/itsi/rack_env_pool.rb +49 -0
  146. data/lib/itsi/server/3.1/itsi_server.so +0 -0
  147. data/lib/itsi/server/3.2/itsi_server.so +0 -0
  148. data/lib/itsi/server/3.3/itsi_server.so +0 -0
  149. data/lib/itsi/server/3.4/itsi_server.so +0 -0
  150. data/lib/itsi/server/4.0/itsi_server.so +0 -0
  151. data/lib/itsi/server/config/config_helpers.rb +116 -0
  152. data/lib/itsi/server/config/dsl.rb +208 -0
  153. data/lib/itsi/server/config/known_paths/KitchensinkDirectories.txt +2346 -0
  154. data/lib/itsi/server/config/known_paths/Randomfiles.txt +24 -0
  155. data/lib/itsi/server/config/known_paths/UnixDotfiles.txt +52 -0
  156. data/lib/itsi/server/config/known_paths/backdoors/ASP_CommonBackdoors.txt +29 -0
  157. data/lib/itsi/server/config/known_paths/backdoors/bot_control_panels.txt +1668 -0
  158. data/lib/itsi/server/config/known_paths/backdoors/shells.txt +1167 -0
  159. data/lib/itsi/server/config/known_paths/cgi/CGI_HTTP_POST.txt +7 -0
  160. data/lib/itsi/server/config/known_paths/cgi/CGI_HTTP_POST_Windows.txt +6 -0
  161. data/lib/itsi/server/config/known_paths/cgi/CGI_Microsoft.txt +79 -0
  162. data/lib/itsi/server/config/known_paths/cgi/CGI_XPlatform.txt +3948 -0
  163. data/lib/itsi/server/config/known_paths/cms/README.md +5 -0
  164. data/lib/itsi/server/config/known_paths/cms/drupal_plugins.txt +6320 -0
  165. data/lib/itsi/server/config/known_paths/cms/drupal_themes.txt +828 -0
  166. data/lib/itsi/server/config/known_paths/cms/joomla_plugins.txt +224 -0
  167. data/lib/itsi/server/config/known_paths/cms/joomla_themes.txt +30 -0
  168. data/lib/itsi/server/config/known_paths/cms/php-nuke.txt +2142 -0
  169. data/lib/itsi/server/config/known_paths/cms/wordpress.txt +1566 -0
  170. data/lib/itsi/server/config/known_paths/cms/wp_common_theme_files.txt +46 -0
  171. data/lib/itsi/server/config/known_paths/cms/wp_plugins.txt +13366 -0
  172. data/lib/itsi/server/config/known_paths/cms/wp_plugins_full.txt +68662 -0
  173. data/lib/itsi/server/config/known_paths/cms/wp_plugins_top225.txt +225 -0
  174. data/lib/itsi/server/config/known_paths/cms/wp_themes.readme +12 -0
  175. data/lib/itsi/server/config/known_paths/cms/wp_themes.txt +7336 -0
  176. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/3CharExtBrute.txt +17576 -0
  177. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/CommonWebExtensions.txt +80 -0
  178. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Backup.txt +14 -0
  179. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Common.txt +865 -0
  180. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Compressed.txt +186 -0
  181. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Mostcommon.txt +30 -0
  182. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Skipfish.txt +93 -0
  183. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/WordlistSkipfish.txt +1918 -0
  184. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/copy_of.txt +8 -0
  185. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-directories-lowercase.txt +56180 -0
  186. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-directories.txt +62290 -0
  187. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-extensions-lowercase.txt +2367 -0
  188. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-extensions.txt +2450 -0
  189. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-files-lowercase.txt +35323 -0
  190. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-files.txt +37037 -0
  191. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-words-lowercase.txt +107982 -0
  192. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-words.txt +119600 -0
  193. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-directories-lowercase.txt +26593 -0
  194. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-directories.txt +30009 -0
  195. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-extensions-lowercase.txt +1233 -0
  196. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-extensions.txt +1289 -0
  197. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-files-lowercase.txt +16243 -0
  198. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-files.txt +17128 -0
  199. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-words-lowercase.txt +56293 -0
  200. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-words.txt +63087 -0
  201. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-directories-lowercase.txt +17776 -0
  202. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-directories.txt +20122 -0
  203. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-extensions-lowercase.txt +914 -0
  204. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-extensions.txt +963 -0
  205. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-files-lowercase.txt +10848 -0
  206. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-files.txt +11424 -0
  207. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-words-lowercase.txt +38267 -0
  208. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-words.txt +43003 -0
  209. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/spanish.txt +445 -0
  210. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/test_demo.txt +36 -0
  211. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/upload_variants.txt +44 -0
  212. data/lib/itsi/server/config/known_paths/login-file-locations/Logins.txt +71 -0
  213. data/lib/itsi/server/config/known_paths/login-file-locations/cfm.txt +294 -0
  214. data/lib/itsi/server/config/known_paths/login-file-locations/html.txt +295 -0
  215. data/lib/itsi/server/config/known_paths/login-file-locations/jsp.txt +294 -0
  216. data/lib/itsi/server/config/known_paths/login-file-locations/php.txt +294 -0
  217. data/lib/itsi/server/config/known_paths/login-file-locations/windows-asp.txt +294 -0
  218. data/lib/itsi/server/config/known_paths/login-file-locations/windows-aspx.txt +294 -0
  219. data/lib/itsi/server/config/known_paths/password-file-locations/Passwords.txt +47 -0
  220. data/lib/itsi/server/config/known_paths/php/PHP.txt +30 -0
  221. data/lib/itsi/server/config/known_paths/php/PHP_CommonBackdoors.txt +5 -0
  222. data/lib/itsi/server/config/known_paths/proxy-conf.txt +31 -0
  223. data/lib/itsi/server/config/known_paths/tftp.txt +79 -0
  224. data/lib/itsi/server/config/known_paths/webservers-appservers/ADFS.txt +86 -0
  225. data/lib/itsi/server/config/known_paths/webservers-appservers/AdobeXML.txt +16 -0
  226. data/lib/itsi/server/config/known_paths/webservers-appservers/Apache.txt +101 -0
  227. data/lib/itsi/server/config/known_paths/webservers-appservers/ApacheTomcat.txt +47 -0
  228. data/lib/itsi/server/config/known_paths/webservers-appservers/Apache_Axis.txt +16 -0
  229. data/lib/itsi/server/config/known_paths/webservers-appservers/ColdFusion.txt +111 -0
  230. data/lib/itsi/server/config/known_paths/webservers-appservers/FatwireCMS.txt +390 -0
  231. data/lib/itsi/server/config/known_paths/webservers-appservers/Frontpage.txt +38 -0
  232. data/lib/itsi/server/config/known_paths/webservers-appservers/HP_System_Mgmt_Homepage.txt +239 -0
  233. data/lib/itsi/server/config/known_paths/webservers-appservers/HTTP_POST_Microsoft.txt +2 -0
  234. data/lib/itsi/server/config/known_paths/webservers-appservers/Hyperion.txt +578 -0
  235. data/lib/itsi/server/config/known_paths/webservers-appservers/IIS.txt +187 -0
  236. data/lib/itsi/server/config/known_paths/webservers-appservers/JBoss.txt +5 -0
  237. data/lib/itsi/server/config/known_paths/webservers-appservers/JRun.txt +13 -0
  238. data/lib/itsi/server/config/known_paths/webservers-appservers/JavaServlets_Common.txt +3 -0
  239. data/lib/itsi/server/config/known_paths/webservers-appservers/Joomla_exploitable.txt +1937 -0
  240. data/lib/itsi/server/config/known_paths/webservers-appservers/LotusNotes.txt +206 -0
  241. data/lib/itsi/server/config/known_paths/webservers-appservers/Netware.txt +18 -0
  242. data/lib/itsi/server/config/known_paths/webservers-appservers/Oracle9i.txt +60 -0
  243. data/lib/itsi/server/config/known_paths/webservers-appservers/OracleAppServer.txt +192 -0
  244. data/lib/itsi/server/config/known_paths/webservers-appservers/README.md +6 -0
  245. data/lib/itsi/server/config/known_paths/webservers-appservers/Ruby_Rails.txt +121 -0
  246. data/lib/itsi/server/config/known_paths/webservers-appservers/SAP.txt +463 -0
  247. data/lib/itsi/server/config/known_paths/webservers-appservers/Sharepoint.txt +1707 -0
  248. data/lib/itsi/server/config/known_paths/webservers-appservers/SiteMinder.txt +19 -0
  249. data/lib/itsi/server/config/known_paths/webservers-appservers/SunAppServerGlassfish.txt +51 -0
  250. data/lib/itsi/server/config/known_paths/webservers-appservers/SuniPlanet.txt +35 -0
  251. data/lib/itsi/server/config/known_paths/webservers-appservers/Vignette.txt +73 -0
  252. data/lib/itsi/server/config/known_paths/webservers-appservers/Weblogic.txt +160 -0
  253. data/lib/itsi/server/config/known_paths/webservers-appservers/Websphere.txt +366 -0
  254. data/lib/itsi/server/config/known_paths/wellknown-rfc5785.txt +30 -0
  255. data/lib/itsi/server/config/known_paths.rb +24 -0
  256. data/lib/itsi/server/config/middleware/_index.md +56 -0
  257. data/lib/itsi/server/config/middleware/allow_list.md +46 -0
  258. data/lib/itsi/server/config/middleware/allow_list.rb +42 -0
  259. data/lib/itsi/server/config/middleware/auth_api_key.md +90 -0
  260. data/lib/itsi/server/config/middleware/auth_api_key.rb +51 -0
  261. data/lib/itsi/server/config/middleware/auth_basic.md +45 -0
  262. data/lib/itsi/server/config/middleware/auth_basic.rb +46 -0
  263. data/lib/itsi/server/config/middleware/auth_jwt.md +82 -0
  264. data/lib/itsi/server/config/middleware/auth_jwt.rb +38 -0
  265. data/lib/itsi/server/config/middleware/cache_control.md +78 -0
  266. data/lib/itsi/server/config/middleware/cache_control.rb +45 -0
  267. data/lib/itsi/server/config/middleware/cidr_to_regex.rb +50 -0
  268. data/lib/itsi/server/config/middleware/compression.md +50 -0
  269. data/lib/itsi/server/config/middleware/compression.rb +37 -0
  270. data/lib/itsi/server/config/middleware/cors.md +93 -0
  271. data/lib/itsi/server/config/middleware/cors.rb +32 -0
  272. data/lib/itsi/server/config/middleware/csp.md +37 -0
  273. data/lib/itsi/server/config/middleware/csp.rb +44 -0
  274. data/lib/itsi/server/config/middleware/deny_list.md +45 -0
  275. data/lib/itsi/server/config/middleware/deny_list.rb +42 -0
  276. data/lib/itsi/server/config/middleware/endpoint/_index.md +160 -0
  277. data/lib/itsi/server/config/middleware/endpoint/controller.md +186 -0
  278. data/lib/itsi/server/config/middleware/endpoint/controller.rb +33 -0
  279. data/lib/itsi/server/config/middleware/endpoint/delete.md +12 -0
  280. data/lib/itsi/server/config/middleware/endpoint/delete.rb +43 -0
  281. data/lib/itsi/server/config/middleware/endpoint/endpoint.rb +106 -0
  282. data/lib/itsi/server/config/middleware/endpoint/get.md +12 -0
  283. data/lib/itsi/server/config/middleware/endpoint/get.rb +43 -0
  284. data/lib/itsi/server/config/middleware/endpoint/http_request.md +44 -0
  285. data/lib/itsi/server/config/middleware/endpoint/http_response.md +39 -0
  286. data/lib/itsi/server/config/middleware/endpoint/patch.md +12 -0
  287. data/lib/itsi/server/config/middleware/endpoint/patch.rb +43 -0
  288. data/lib/itsi/server/config/middleware/endpoint/post.md +12 -0
  289. data/lib/itsi/server/config/middleware/endpoint/post.rb +43 -0
  290. data/lib/itsi/server/config/middleware/endpoint/put.md +12 -0
  291. data/lib/itsi/server/config/middleware/endpoint/put.rb +43 -0
  292. data/lib/itsi/server/config/middleware/endpoint/schemas.md +122 -0
  293. data/lib/itsi/server/config/middleware/error_response.md +74 -0
  294. data/lib/itsi/server/config/middleware/error_response.rb +36 -0
  295. data/lib/itsi/server/config/middleware/etag.md +55 -0
  296. data/lib/itsi/server/config/middleware/etag.rb +25 -0
  297. data/lib/itsi/server/config/middleware/grpc.md +170 -0
  298. data/lib/itsi/server/config/middleware/grpc.rb +54 -0
  299. data/lib/itsi/server/config/middleware/intrusion_protection.md +124 -0
  300. data/lib/itsi/server/config/middleware/intrusion_protection.rb +61 -0
  301. data/lib/itsi/server/config/middleware/location.md +107 -0
  302. data/lib/itsi/server/config/middleware/location.rb +103 -0
  303. data/lib/itsi/server/config/middleware/log_requests.md +67 -0
  304. data/lib/itsi/server/config/middleware/log_requests.rb +31 -0
  305. data/lib/itsi/server/config/middleware/max_body.md +18 -0
  306. data/lib/itsi/server/config/middleware/max_body.rb +21 -0
  307. data/lib/itsi/server/config/middleware/proxy.md +62 -0
  308. data/lib/itsi/server/config/middleware/proxy.rb +42 -0
  309. data/lib/itsi/server/config/middleware/rackup_file.md +72 -0
  310. data/lib/itsi/server/config/middleware/rackup_file.rb +43 -0
  311. data/lib/itsi/server/config/middleware/rate_limit.md +126 -0
  312. data/lib/itsi/server/config/middleware/rate_limit.rb +34 -0
  313. data/lib/itsi/server/config/middleware/rate_limit_store.rb +25 -0
  314. data/lib/itsi/server/config/middleware/redirect.md +55 -0
  315. data/lib/itsi/server/config/middleware/redirect.rb +25 -0
  316. data/lib/itsi/server/config/middleware/request_headers.md +34 -0
  317. data/lib/itsi/server/config/middleware/request_headers.rb +24 -0
  318. data/lib/itsi/server/config/middleware/response_headers.md +33 -0
  319. data/lib/itsi/server/config/middleware/response_headers.rb +25 -0
  320. data/lib/itsi/server/config/middleware/run.md +79 -0
  321. data/lib/itsi/server/config/middleware/run.rb +45 -0
  322. data/lib/itsi/server/config/middleware/static_assets.md +113 -0
  323. data/lib/itsi/server/config/middleware/static_assets.rb +99 -0
  324. data/lib/itsi/server/config/middleware/static_response.md +44 -0
  325. data/lib/itsi/server/config/middleware/static_response.rb +30 -0
  326. data/lib/itsi/server/config/middleware/string_rewrite.md +81 -0
  327. data/lib/itsi/server/config/middleware/token_source.rb +32 -0
  328. data/lib/itsi/server/config/middleware.rb +13 -0
  329. data/lib/itsi/server/config/option.rb +13 -0
  330. data/lib/itsi/server/config/options/_index.md +41 -0
  331. data/lib/itsi/server/config/options/auto_reload_config.md +13 -0
  332. data/lib/itsi/server/config/options/auto_reload_config.rb +46 -0
  333. data/lib/itsi/server/config/options/bind.md +71 -0
  334. data/lib/itsi/server/config/options/bind.rb +26 -0
  335. data/lib/itsi/server/config/options/certificates.md +65 -0
  336. data/lib/itsi/server/config/options/daemonize.md +14 -0
  337. data/lib/itsi/server/config/options/daemonize.rb +19 -0
  338. data/lib/itsi/server/config/options/fiber_scheduler.md +34 -0
  339. data/lib/itsi/server/config/options/fiber_scheduler.rb +21 -0
  340. data/lib/itsi/server/config/options/header_read_timeout.md +17 -0
  341. data/lib/itsi/server/config/options/header_read_timeout.rb +19 -0
  342. data/lib/itsi/server/config/options/hooks/_index.md +11 -0
  343. data/lib/itsi/server/config/options/hooks/after_fork.md +13 -0
  344. data/lib/itsi/server/config/options/hooks/after_fork.rb +28 -0
  345. data/lib/itsi/server/config/options/hooks/after_memory_limit_reached.md +14 -0
  346. data/lib/itsi/server/config/options/hooks/after_memory_limit_reached.rb +28 -0
  347. data/lib/itsi/server/config/options/hooks/after_start.md +12 -0
  348. data/lib/itsi/server/config/options/hooks/after_start.rb +28 -0
  349. data/lib/itsi/server/config/options/hooks/before_fork.md +13 -0
  350. data/lib/itsi/server/config/options/hooks/before_fork.rb +28 -0
  351. data/lib/itsi/server/config/options/hooks/before_restart.md +12 -0
  352. data/lib/itsi/server/config/options/hooks/before_restart.rb +28 -0
  353. data/lib/itsi/server/config/options/hooks/before_shutdown.md +12 -0
  354. data/lib/itsi/server/config/options/hooks/before_shutdown.rb +28 -0
  355. data/lib/itsi/server/config/options/include.md +21 -0
  356. data/lib/itsi/server/config/options/include.rb +41 -0
  357. data/lib/itsi/server/config/options/listen_backlog.md +11 -0
  358. data/lib/itsi/server/config/options/listen_backlog.rb +19 -0
  359. data/lib/itsi/server/config/options/log_format.md +18 -0
  360. data/lib/itsi/server/config/options/log_format.rb +19 -0
  361. data/lib/itsi/server/config/options/log_level.md +34 -0
  362. data/lib/itsi/server/config/options/log_level.rb +20 -0
  363. data/lib/itsi/server/config/options/log_target.md +38 -0
  364. data/lib/itsi/server/config/options/log_target.rb +19 -0
  365. data/lib/itsi/server/config/options/log_target_filters.md +17 -0
  366. data/lib/itsi/server/config/options/log_target_filters.rb +19 -0
  367. data/lib/itsi/server/config/options/multithreaded_reactor.md +27 -0
  368. data/lib/itsi/server/config/options/multithreaded_reactor.rb +24 -0
  369. data/lib/itsi/server/config/options/nodelay.md +16 -0
  370. data/lib/itsi/server/config/options/nodelay.rb +19 -0
  371. data/lib/itsi/server/config/options/oob_gc_responses_threshold.md +19 -0
  372. data/lib/itsi/server/config/options/oob_gc_responses_threshold.rb +18 -0
  373. data/lib/itsi/server/config/options/pin_worker_cores.md +17 -0
  374. data/lib/itsi/server/config/options/pin_worker_cores.rb +19 -0
  375. data/lib/itsi/server/config/options/pipeline_flush.md +16 -0
  376. data/lib/itsi/server/config/options/pipeline_flush.rb +19 -0
  377. data/lib/itsi/server/config/options/preload.md +21 -0
  378. data/lib/itsi/server/config/options/preload.rb +18 -0
  379. data/lib/itsi/server/config/options/recv_buffer_size.md +15 -0
  380. data/lib/itsi/server/config/options/recv_buffer_size.rb +19 -0
  381. data/lib/itsi/server/config/options/redirect_http_to_https.md +21 -0
  382. data/lib/itsi/server/config/options/redirect_http_to_https.rb +30 -0
  383. data/lib/itsi/server/config/options/request_timeout.md +23 -0
  384. data/lib/itsi/server/config/options/request_timeout.rb +19 -0
  385. data/lib/itsi/server/config/options/reuse_address.md +18 -0
  386. data/lib/itsi/server/config/options/reuse_address.rb +19 -0
  387. data/lib/itsi/server/config/options/reuse_port.md +18 -0
  388. data/lib/itsi/server/config/options/reuse_port.rb +17 -0
  389. data/lib/itsi/server/config/options/ruby_thread_request_backlog_size.md +18 -0
  390. data/lib/itsi/server/config/options/ruby_thread_request_backlog_size.rb +19 -0
  391. data/lib/itsi/server/config/options/scheduler_threads.md +41 -0
  392. data/lib/itsi/server/config/options/scheduler_threads.rb +17 -0
  393. data/lib/itsi/server/config/options/send_buffer_size.md +15 -0
  394. data/lib/itsi/server/config/options/send_buffer_size.rb +19 -0
  395. data/lib/itsi/server/config/options/shutdown_timeout.md +17 -0
  396. data/lib/itsi/server/config/options/shutdown_timeout.rb +19 -0
  397. data/lib/itsi/server/config/options/stream_body.md +32 -0
  398. data/lib/itsi/server/config/options/stream_body.rb +18 -0
  399. data/lib/itsi/server/config/options/threads.md +44 -0
  400. data/lib/itsi/server/config/options/threads.rb +17 -0
  401. data/lib/itsi/server/config/options/watch.md +16 -0
  402. data/lib/itsi/server/config/options/watch.rb +28 -0
  403. data/lib/itsi/server/config/options/worker_memory_limit.md +22 -0
  404. data/lib/itsi/server/config/options/worker_memory_limit.rb +18 -0
  405. data/lib/itsi/server/config/options/workers.md +42 -0
  406. data/lib/itsi/server/config/options/workers.rb +17 -0
  407. data/lib/itsi/server/config/options/writev.md +25 -0
  408. data/lib/itsi/server/config/options/writev.rb +19 -0
  409. data/lib/itsi/server/config/typed_struct.rb +239 -0
  410. data/lib/itsi/server/config.rb +321 -0
  411. data/lib/itsi/server/default_app/default_app.rb +34 -0
  412. data/lib/itsi/server/default_app/index.html +115 -0
  413. data/lib/itsi/server/default_config/Itsi.rb +108 -0
  414. data/lib/itsi/server/grpc/grpc_call.rb +247 -0
  415. data/lib/itsi/server/grpc/grpc_interface.rb +106 -0
  416. data/lib/itsi/server/grpc/reflection/v1/reflection_pb.rb +26 -0
  417. data/lib/itsi/server/grpc/reflection/v1/reflection_services_pb.rb +122 -0
  418. data/lib/itsi/server/native_extension.rb +34 -0
  419. data/lib/itsi/server/rack/handler/itsi.rb +29 -0
  420. data/lib/itsi/server/rack_interface.rb +109 -0
  421. data/lib/itsi/server/route_tester.rb +159 -0
  422. data/lib/itsi/server/scheduler_interface.rb +23 -0
  423. data/lib/itsi/server/scheduler_mode.rb +10 -0
  424. data/lib/itsi/server/signal_trap.rb +33 -0
  425. data/lib/itsi/server/typed_handlers/param_parser.rb +221 -0
  426. data/lib/itsi/server/typed_handlers/source_parser.rb +58 -0
  427. data/lib/itsi/server/typed_handlers.rb +25 -0
  428. data/lib/itsi/server/version.rb +7 -0
  429. data/lib/itsi/server.rb +288 -0
  430. data/lib/itsi/standard_headers.rb +86 -0
  431. data/lib/ruby_lsp/itsi/addon.rb +128 -0
  432. data/lib/shell_completions/completions.rb +26 -0
  433. data/vendor/rb-sys-build/.cargo-ok +1 -0
  434. data/vendor/rb-sys-build/.cargo_vcs_info.json +6 -0
  435. data/vendor/rb-sys-build/Cargo.lock +294 -0
  436. data/vendor/rb-sys-build/Cargo.toml +71 -0
  437. data/vendor/rb-sys-build/Cargo.toml.orig +32 -0
  438. data/vendor/rb-sys-build/LICENSE-APACHE +190 -0
  439. data/vendor/rb-sys-build/LICENSE-MIT +21 -0
  440. data/vendor/rb-sys-build/src/bindings/sanitizer.rs +185 -0
  441. data/vendor/rb-sys-build/src/bindings/stable_api.rs +247 -0
  442. data/vendor/rb-sys-build/src/bindings/wrapper.h +71 -0
  443. data/vendor/rb-sys-build/src/bindings.rs +280 -0
  444. data/vendor/rb-sys-build/src/cc.rs +421 -0
  445. data/vendor/rb-sys-build/src/lib.rs +12 -0
  446. data/vendor/rb-sys-build/src/rb_config/flags.rs +101 -0
  447. data/vendor/rb-sys-build/src/rb_config/library.rs +132 -0
  448. data/vendor/rb-sys-build/src/rb_config/search_path.rs +57 -0
  449. data/vendor/rb-sys-build/src/rb_config.rs +906 -0
  450. data/vendor/rb-sys-build/src/utils.rs +53 -0
  451. metadata +569 -0
@@ -0,0 +1,76 @@
1
+ module Itsi
2
+ class HttpRequest
3
+ module ResponseStatusShortcodes
4
+
5
+ HTTP_STATUS_CODES = {
6
+ 100 => :continue,
7
+ 101 => :switching_protocols,
8
+ 102 => :processing,
9
+ 200 => :ok,
10
+ 201 => :created,
11
+ 202 => :accepted,
12
+ 203 => :non_authoritative_information,
13
+ 204 => :no_content,
14
+ 205 => :reset_content,
15
+ 206 => :partial_content,
16
+ 207 => :multi_status,
17
+ 208 => :already_reported,
18
+ 226 => :im_used,
19
+ 300 => :multiple_choices,
20
+ 301 => :moved_permanently,
21
+ 302 => :found,
22
+ 303 => :see_other,
23
+ 304 => :not_modified,
24
+ 305 => :use_proxy,
25
+ 307 => :temporary_redirect,
26
+ 308 => :permanent_redirect,
27
+ 400 => :bad_request,
28
+ 401 => :unauthorized,
29
+ 402 => :payment_required,
30
+ 403 => :forbidden,
31
+ 404 => :not_found,
32
+ 405 => :method_not_allowed,
33
+ 406 => :not_acceptable,
34
+ 407 => :proxy_authentication_required,
35
+ 408 => :request_timeout,
36
+ 409 => :conflict,
37
+ 410 => :gone,
38
+ 411 => :length_required,
39
+ 412 => :precondition_failed,
40
+ 413 => :payload_too_large,
41
+ 414 => :uri_too_long,
42
+ 415 => :unsupported_media_type,
43
+ 416 => :range_not_satisfiable,
44
+ 417 => :expectation_failed,
45
+ 418 => :im_a_teapot,
46
+ 421 => :misdirected_request,
47
+ 422 => :unprocessable_entity,
48
+ 423 => :locked,
49
+ 424 => :failed_dependency,
50
+ 425 => :too_early,
51
+ 426 => :upgrade_required,
52
+ 428 => :precondition_required,
53
+ 429 => :too_many_requests,
54
+ 431 => :request_header_fields_too_large,
55
+ 451 => :unavailable_for_legal_reasons,
56
+ 500 => :internal_server_error,
57
+ 501 => :not_implemented,
58
+ 502 => :bad_gateway,
59
+ 503 => :service_unavailable,
60
+ 504 => :gateway_timeout,
61
+ 505 => :http_version_not_supported,
62
+ 506 => :variant_also_negotiates,
63
+ 507 => :insufficient_storage,
64
+ 508 => :loop_detected,
65
+ 510 => :not_extended,
66
+ 511 => :network_authentication_required
67
+ }.freeze
68
+
69
+ HTTP_STATUS_NAME_TO_CODE_MAP = HTTP_STATUS_CODES.invert.freeze
70
+
71
+ HTTP_STATUS_CODES.each do |code, name|
72
+ define_method(name) {|*args, **kwargs| respond(*args, **kwargs, status: code) }
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,228 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "stringio"
4
+ require "socket"
5
+ require "uri"
6
+ require_relative "http_request/response_status_shortcodes"
7
+
8
+ module Itsi
9
+ class HttpRequest
10
+ include Server::TypedHandlers::ParamParser
11
+ include ResponseStatusShortcodes
12
+ attr_accessor :hijacked
13
+
14
+ EMPTY_IO = StringIO.new("").tap { |io| io.set_encoding(Encoding::ASCII_8BIT) }
15
+
16
+ RACK_HEADER_MAP = StandardHeaders::ALL.map do |header|
17
+ rack_form = \
18
+ if header == "content-type"
19
+ "CONTENT_TYPE"
20
+ elsif header == "content-length"
21
+ "CONTENT_LENGTH"
22
+ else
23
+ "HTTP_#{header.upcase.gsub(/-/, "_")}"
24
+ end
25
+ [header, rack_form]
26
+ end.to_h
27
+
28
+ RACK_HEADER_MAP.default_proc = proc { |_, key| "HTTP_#{key.upcase.gsub(/-/, "_")}" }
29
+
30
+ SPECIAL_RACK_HEADER_MAP = {
31
+ "content-type" => "CONTENT_TYPE",
32
+ "content-length" => "CONTENT_LENGTH",
33
+ "accept" => "HTTP_ACCEPT",
34
+ "accept-encoding" => "HTTP_ACCEPT_ENCODING",
35
+ "accept-language" => "HTTP_ACCEPT_LANGUAGE",
36
+ "user-agent" => "HTTP_USER_AGENT",
37
+ "referer" => "HTTP_REFERER",
38
+ "origin" => "HTTP_ORIGIN",
39
+ "cookie" => "HTTP_COOKIE",
40
+ "authorization" => "HTTP_AUTHORIZATION",
41
+ "x-forwarded-for" => "HTTP_X_FORWARDED_FOR",
42
+ "x-forwarded-proto" => "HTTP_X_FORWARDED_PROTO"
43
+ }.freeze
44
+
45
+ HTTP_09 = "HTTP/0.9"
46
+ HTTP_09_ARR = ["HTTP/0.9"].freeze
47
+ HTTP_10 = "HTTP/1.0"
48
+ HTTP_10_ARR = ["HTTP/1.0"].freeze
49
+ HTTP_11 = "HTTP/1.1"
50
+ HTTP_11_ARR = ["HTTP/1.1"].freeze
51
+ HTTP_20 = "HTTP/2.0"
52
+ HTTP_20_ARR = ["HTTP/2.0"].freeze
53
+ HTTP_30 = "HTTP/3.0"
54
+ HTTP_30_ARR = ["HTTP/3.0"].freeze
55
+
56
+ def to_rack_env
57
+ path = self.path
58
+ host = self.host
59
+ version = self.version
60
+ env = RackEnvPool.checkout
61
+ env["SCRIPT_NAME"] = script_name
62
+ env["REQUEST_METHOD"] = request_method
63
+ env["REQUEST_PATH"] = env["PATH_INFO"] = path
64
+ env["QUERY_STRING"] = query_string
65
+ env["REMOTE_ADDR"] = remote_addr
66
+ env["SERVER_PORT"] = port.to_s
67
+ env["HTTP_HOST"] = env["SERVER_NAME"] = host
68
+ env["HTTP_VERSION"] = env["SERVER_PROTOCOL"] = version
69
+ env["itsi.request"] = self
70
+ env["itsi.response"] = response
71
+ env["rack.version"] = \
72
+ case version
73
+ when HTTP_09 then HTTP_09_ARR
74
+ when HTTP_10 then HTTP_10_ARR
75
+ when HTTP_11 then HTTP_11_ARR
76
+ when HTTP_20 then HTTP_20_ARR
77
+ when HTTP_30 then HTTP_30_ARR
78
+ end
79
+ env["rack.url_scheme"] = scheme
80
+ env["rack.input"] = build_input_io
81
+ env["rack.hijack"] = self
82
+ each_header do |k, v|
83
+ env[SPECIAL_RACK_HEADER_MAP[k] || RACK_HEADER_MAP[k]] = v
84
+ end
85
+ env
86
+ end
87
+
88
+ def respond(
89
+ _body = nil, _status = 200, _headers = nil, # rubocop:disable Lint/UnderscorePrefixedVariableName
90
+ json: nil,
91
+ html: nil,
92
+ text: nil,
93
+ xml: nil,
94
+ hijack: false,
95
+ as: nil,
96
+ status: _status,
97
+ headers: _headers,
98
+ body: _body,
99
+ &blk
100
+ )
101
+ if json
102
+ if as
103
+ begin
104
+ validate!(json, as: as)
105
+ rescue ValidationError => e
106
+ json = { type: "error", message: "Validation Error: #{e.message}" }
107
+ status = 400
108
+ end
109
+ end
110
+ body = json.to_json
111
+ headers ||= {}
112
+ headers["Content-Type"] ||= "application/json"
113
+ elsif html
114
+ body = html
115
+ headers ||= {}
116
+ headers["Content-Type"] ||= "text/html"
117
+ elsif xml
118
+ body = xml
119
+ headers ||= {}
120
+ headers["Content-Type"] ||= "application/xml"
121
+ elsif text
122
+ body = text
123
+ headers ||= {}
124
+ headers["Content-Type"] ||= "text/plain"
125
+ end
126
+
127
+ response.respond(status: status, headers: headers, body: body, hijack: hijack, &blk)
128
+ end
129
+
130
+ def hijack
131
+ self.hijacked = true
132
+ UNIXSocket.pair.yield_self do |(server_sock, app_sock)|
133
+ server_sock.autoclose = false
134
+ response.hijack(server_sock.fileno)
135
+ server_sock.sync = true
136
+ app_sock.sync = true
137
+ app_sock
138
+ end
139
+ end
140
+
141
+ # Rack expects env["rack.hijack"] to respond to #call.
142
+ def call
143
+ hijack
144
+ end
145
+
146
+ def body
147
+ @body ||= build_input_io
148
+ end
149
+
150
+ def build_input_io
151
+ case body_parts
152
+ when nil then EMPTY_IO
153
+ when String then StringIO.new(body_parts).tap { |io| io.set_encoding(Encoding::ASCII_8BIT) }
154
+ when Array then File.open(body_parts.first, "rb").tap { |io| io.set_encoding(Encoding::ASCII_8BIT) }
155
+ else body_parts
156
+ end
157
+ end
158
+
159
+ def validate!(params, as: nil)
160
+ as ? apply_schema!(params, as) : params
161
+ end
162
+
163
+ def params(schema = nil)
164
+ params = if url_encoded?
165
+ URI.decode_www_form(build_input_io.read).to_h
166
+ elsif json?
167
+ JSON.parse(build_input_io.read)
168
+ elsif multipart?
169
+ Rack::Multipart::Parser.parse(
170
+ build_input_io,
171
+ content_length,
172
+ content_type,
173
+ Rack::Multipart::Parser::TEMPFILE_FACTORY,
174
+ Rack::Multipart::Parser::BUFSIZE,
175
+ Rack::Utils.default_query_parser
176
+ ).params
177
+ else
178
+ {}
179
+ end
180
+
181
+ params.merge!(query_params).merge!(url_params)
182
+ validated = schema ? apply_schema!(params, schema) : params
183
+ if block_given?
184
+ yield validated
185
+ else
186
+ raise "#params must take a block for multipart requests" if multipart?
187
+
188
+ validated
189
+
190
+ end
191
+ rescue ValidationError => e
192
+ if response.json?
193
+ respond(json: { error: e.message }, status: 400)
194
+ else
195
+ respond(e.message, 400)
196
+ end
197
+ rescue StandardError => e
198
+ Itsi.log_error e.message
199
+ puts e.backtrace
200
+
201
+ # Unexpected error.
202
+ # Don't reveal potential sensitive information to client.
203
+ if response.json?
204
+ respond(json: { error: "Internal Server Error" }, status: 500)
205
+ else
206
+ respond("Internal Server Error", 500)
207
+ end
208
+ ensure
209
+ clean_temp_files(params)
210
+ end
211
+
212
+ def clean_temp_files(params)
213
+ case params
214
+ when Hash
215
+ if params.key?(:tempfile)
216
+ params[:tempfile].unlink
217
+ else
218
+ params.each_value { |v| clean_temp_files(v) }
219
+ end
220
+ when Array then params.each { |v| clean_temp_files(v) }
221
+ end
222
+ end
223
+
224
+ def query_params
225
+ URI.decode_www_form(query_string).to_h
226
+ end
227
+ end
228
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "forwardable"
4
+ require "stringio"
5
+ require "socket"
6
+
7
+ module Itsi
8
+ class HttpResponse
9
+ def respond(
10
+ _body = nil, _status = 200, _header = nil, # rubocop:disable Lint/UnderscorePrefixedVariableName
11
+ status: _status, headers: _header, body: _body,
12
+ hijack: false
13
+ )
14
+ self.status = status.is_a?(Symbol) ? HTTP_STATUS_NAME_TO_CODE_MAP.fetch(status) : status.to_i
15
+
16
+ body = body.to_s unless body.is_a?(String)
17
+
18
+ if headers
19
+ reserve_headers(headers.size)
20
+ headers.each do |key, value|
21
+ if value.is_a?(Array)
22
+ value.each { |v| add_header(key, v) }
23
+ else
24
+ add_header(key, value)
25
+ end
26
+ end
27
+ end
28
+
29
+ if body
30
+ # Common case. Write a single string body.
31
+ send_and_close(body)
32
+ elsif block_given?
33
+
34
+ # If you call respond with a block, you get a handle to a stream that you can write to.
35
+ yield self
36
+
37
+ # If you hijack the connection, you are responsible for closing it.
38
+ # Otherwise, the response will be closed automatically.
39
+ close unless hijack
40
+ else
41
+ close
42
+ end
43
+ end
44
+
45
+ def flush
46
+ # No-op. Our Rust server performs stream coalescing and automatically flushes on a tight interval.
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,108 @@
1
+ module Itsi
2
+ class Server
3
+ module Passfile
4
+ require "io/console"
5
+
6
+ module_function
7
+
8
+ def load(filename)
9
+ if filename.nil? || filename.strip.empty?
10
+ puts "Error: a valid filename is required."
11
+ return nil
12
+ end
13
+
14
+ creds = {}
15
+ if File.exist?(filename)
16
+ File.foreach(filename) do |line|
17
+ line.chomp!
18
+ next if line.empty?
19
+
20
+ user, pass = line.split(":", 2)
21
+ creds[user] = pass
22
+ end
23
+ end
24
+ creds
25
+ end
26
+
27
+ def save(creds, filename)
28
+ File.open(filename, "w", 0o600) do |f|
29
+ creds.each do |u, p|
30
+ f.puts "#{u}:#{p}"
31
+ end
32
+ end
33
+ end
34
+
35
+ def echo(_, algorithm)
36
+ print "Enter username: "
37
+ username = $stdin.gets.chomp
38
+
39
+ print "Enter password: "
40
+
41
+ password = $stdin.noecho(&:gets).chomp
42
+ puts
43
+
44
+ print "Confirm password: "
45
+ password_confirm = $stdin.noecho(&:gets).chomp
46
+ puts
47
+
48
+ if password != password_confirm
49
+ puts "Error: Passwords do not match!"
50
+ exit(1)
51
+ end
52
+
53
+ puts "#{username}:#{Itsi.create_password_hash(password, algorithm)}"
54
+ end
55
+
56
+ def add(filename, algorithm)
57
+ return unless (creds = load(filename))
58
+
59
+ print "Enter username: "
60
+ username = $stdin.gets.chomp
61
+
62
+ print "Enter password: "
63
+
64
+ password = $stdin.noecho(&:gets).chomp
65
+ puts
66
+
67
+ print "Confirm password: "
68
+ password_confirm = $stdin.noecho(&:gets).chomp
69
+ puts
70
+
71
+ if password != password_confirm
72
+ puts "Error: Passwords do not match!"
73
+ exit(1)
74
+ end
75
+
76
+ creds[username] = Itsi.create_password_hash(password, algorithm)
77
+
78
+ save(creds, filename)
79
+
80
+ puts "User '#{username}' added."
81
+ end
82
+
83
+ def remove(filename)
84
+ return unless (creds = load(filename))
85
+
86
+ print "Enter username to remove: "
87
+ username = $stdin.gets.chomp
88
+
89
+ if creds.key?(username)
90
+ creds.delete(username)
91
+ save(creds, filename)
92
+ puts "User '#{username}' removed."
93
+ else
94
+ puts "Warning: User '#{username}' not found."
95
+ end
96
+ end
97
+
98
+ def list(filename)
99
+ puts "Current credentials in '#{filename}':"
100
+ return unless (creds = load(filename))
101
+
102
+ creds.each do |u, p|
103
+ puts "#{u}:#{p}"
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Itsi
4
+ module RackEnvPool
5
+
6
+ RACK_ENV_TEMPLATE = {
7
+ "SERVER_SOFTWARE" => "Itsi",
8
+ "rack.errors" => $stderr,
9
+ "rack.multithread" => true,
10
+ "rack.multiprocess" => true,
11
+ "rack.run_once" => false,
12
+ "rack.hijack?" => true,
13
+ "rack.multipart.buffer_size" => 16_384,
14
+ "SCRIPT_NAME" => "",
15
+ "REQUEST_METHOD" => "",
16
+ "PATH_INFO" => "",
17
+ "REQUEST_PATH" => "",
18
+ "QUERY_STRING" => "",
19
+ "REMOTE_ADDR" => "",
20
+ "SERVER_PORT" => "",
21
+ "SERVER_NAME" => "",
22
+ "SERVER_PROTOCOL" => "",
23
+ "HTTP_HOST" => "",
24
+ "HTTP_VERSION" => "",
25
+ "itsi.request" => "",
26
+ "itsi.response" => "",
27
+ "rack.version" => nil,
28
+ "rack.url_scheme" => "",
29
+ "rack.input" => "",
30
+ "rack.hijack" => ""
31
+ }.freeze
32
+
33
+ POOL = []
34
+
35
+ def self.checkout
36
+ recycled = POOL.pop
37
+ return RACK_ENV_TEMPLATE.dup unless recycled
38
+
39
+ # Reset in C rather than iterating key-by-key in Ruby for every request.
40
+ recycled.replace(RACK_ENV_TEMPLATE)
41
+ recycled
42
+ end
43
+
44
+ def self.checkin(env)
45
+ POOL << env
46
+ end
47
+ end
48
+
49
+ end
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,116 @@
1
+ module Itsi
2
+ class Server
3
+ module Config
4
+ module ConfigHelpers
5
+ def self.load_and_register(klass)
6
+ config_type = klass.name.split("::").last.downcase.gsub(/([a-z]()[A-Z])/, '\1_\2')
7
+
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.dup
15
+ require file
16
+ following = klass.subclasses
17
+ new_class = (following - current).first
18
+
19
+ documentation_file = "#{file[/(.*)\.rb/, 1]}.md"
20
+ documentation_file = "#{file[%r{(.*)/[^/]+\.rb}, 1]}/_index.md" unless File.exist?(documentation_file)
21
+ unless File.exist?(documentation_file) && new_class
22
+ new_class&.documentation "Documentation not found"
23
+ next
24
+ end
25
+
26
+ new_class.documentation IO.read(documentation_file)
27
+ .gsub(/^---.*?\n.*?-+/m, "") # Strip frontmatter
28
+ .gsub(/^(```.*?)\{.*?\}.*$/, "\\1") # Strip filename from code blocks
29
+ .gsub(/^\{\{[^}]+\}\}/, "") # Strip Hugo blocks
30
+ end
31
+ end
32
+
33
+ def normalize_keys!(hash, expected = [])
34
+ hash.keys.each do |key|
35
+ value = hash.delete(key)
36
+ key = key.to_s.downcase.to_sym
37
+ hash[key] = value
38
+ raise "Unexpected key: #{key}" unless expected.include?(key)
39
+
40
+ expected -= [key]
41
+ end
42
+ raise "Missing required keys: #{expected.join(", ")}" unless expected.empty?
43
+
44
+ hash
45
+ end
46
+
47
+ def self.included(cls) # rubocop:disable Metrics/PerceivedComplexity,Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength
48
+
49
+ class << cls
50
+ def subclasses
51
+ @subclasses ||= []
52
+ end
53
+ end
54
+
55
+ def cls.inherited(base) # rubocop:disable Metrics/MethodLength,Lint/MissingSuper,Metrics/PerceivedComplexity
56
+ self.subclasses << base
57
+
58
+ %i[detail documentation insert_text schema].each do |attr|
59
+ base.define_singleton_method(attr) do |value = nil|
60
+ @middleware_class_attrs ||= {}
61
+ if value
62
+ @middleware_class_attrs[attr] = value
63
+ else
64
+ @middleware_class_attrs[attr]
65
+ end
66
+ end
67
+
68
+ base.define_method(attr) do |_value = nil|
69
+ self.class.send(attr)
70
+ end
71
+ end
72
+
73
+ def base.schema(value = nil, &blk)
74
+ @middleware_class_attrs ||= {}
75
+ if blk
76
+ @middleware_class_attrs[:schema] = TypedStruct.new(&blk)
77
+ elsif value
78
+ @middleware_class_attrs[:schema] = value
79
+ else
80
+ @middleware_class_attrs[:schema]
81
+ end
82
+ end
83
+ end
84
+
85
+ load_and_register(cls)
86
+
87
+ config_type = cls.name.split("::").last.downcase
88
+
89
+ cls.define_singleton_method("#{config_type}_name") do |name = self.name|
90
+ @config_name ||= name.split("::").last.gsub(/([a-z])([A-Z])/, '\1_\2').downcase.to_sym
91
+ end
92
+ cls.define_method(:opt_name) { self.class.send("#{config_type}_name") }
93
+ cls.define_method(:location) { @location }
94
+ end
95
+
96
+ def initialize(location, params = {})
97
+ if !self.class.ancestors.include?(Middleware) && !location.parent.nil?
98
+ raise "#{opt_name} must be set at the top level"
99
+ end
100
+ @location = location
101
+ @params = case schema
102
+ when TypedStruct::Validation
103
+ schema.validate!(params)
104
+ when Array
105
+ default, validation = schema
106
+ !params.nil? ? validation.validate!(params) : default
107
+ when nil
108
+ nil
109
+ else
110
+ schema.new(params).to_h
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end