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,280 @@
1
+ mod sanitizer;
2
+ mod stable_api;
3
+
4
+ use crate::cc::Build;
5
+ use crate::utils::is_msvc;
6
+ use crate::{debug_log, RbConfig};
7
+ use quote::ToTokens;
8
+ use stable_api::{categorize_bindings, opaqueify_bindings};
9
+ use std::fs::File;
10
+ use std::io::Write;
11
+ use std::path::{Path, PathBuf};
12
+ use std::{env, error::Error};
13
+ use syn::{Expr, ExprLit, ItemConst, Lit};
14
+
15
+ const WRAPPER_H_CONTENT: &str = include_str!("bindings/wrapper.h");
16
+
17
+ /// Generate bindings for the Ruby using bindgen.
18
+ pub fn generate(
19
+ rbconfig: &RbConfig,
20
+ static_ruby: bool,
21
+ cfg_out: &mut File,
22
+ ) -> Result<PathBuf, Box<dyn Error>> {
23
+ let out_dir = PathBuf::from(env::var("OUT_DIR")?);
24
+
25
+ let mut clang_args = vec![];
26
+ if let Some(ruby_include_dir) = rbconfig.get("rubyhdrdir") {
27
+ clang_args.push(format!("-I{}", ruby_include_dir));
28
+ }
29
+ if let Some(ruby_arch_include_dir) = rbconfig.get("rubyarchhdrdir") {
30
+ clang_args.push(format!("-I{}", ruby_arch_include_dir));
31
+ }
32
+
33
+ clang_args.extend(Build::default_cflags());
34
+ clang_args.extend(rbconfig.cflags.clone());
35
+ clang_args.extend(rbconfig.cppflags());
36
+
37
+ // On Windows x86_64, we need to handle AVX512 FP16 compatibility issues
38
+ // Clang 20+ includes types like __m512h that aren't compatible with bindgen
39
+ if cfg!(target_os = "windows") && cfg!(target_arch = "x86_64") {
40
+ // For MinGW toolchain, disable SSE/AVX only for bindgen
41
+ // This prevents intrinsics headers from loading but doesn't affect the final binary
42
+ if !is_msvc() {
43
+ clang_args.push("-mno-sse".to_string());
44
+ clang_args.push("-mno-avx".to_string());
45
+ }
46
+ }
47
+
48
+ debug_log!("INFO: using bindgen with clang args: {:?}", clang_args);
49
+
50
+ let mut wrapper_h = WRAPPER_H_CONTENT.to_string();
51
+
52
+ if !is_msvc() {
53
+ wrapper_h.push_str("#ifdef HAVE_RUBY_ATOMIC_H\n");
54
+ wrapper_h.push_str("#include \"ruby/atomic.h\"\n");
55
+ wrapper_h.push_str("#endif\n");
56
+ }
57
+
58
+ if rbconfig.have_ruby_header("ruby/io/buffer.h") {
59
+ clang_args.push("-DHAVE_RUBY_IO_BUFFER_H".to_string());
60
+ }
61
+
62
+ let bindings = default_bindgen(clang_args, rbconfig)
63
+ .allowlist_file(".*ruby.*")
64
+ .blocklist_item("ruby_abi_version")
65
+ .blocklist_function("rb_tr_abi_version")
66
+ .blocklist_function("^__.*")
67
+ .blocklist_item("RData")
68
+ .blocklist_function("rb_tr_rdata")
69
+ .blocklist_function("rb_tr_rtypeddata")
70
+ .parse_callbacks(Box::new(bindgen::CargoCallbacks::new()));
71
+
72
+ let bindings = if cfg!(feature = "bindgen-rbimpls") {
73
+ bindings
74
+ } else {
75
+ bindings
76
+ .blocklist_item("^rbimpl_.*")
77
+ .blocklist_item("^RBIMPL_.*")
78
+ };
79
+
80
+ let bindings = if cfg!(feature = "bindgen-deprecated-types") {
81
+ bindings
82
+ } else {
83
+ bindings.blocklist_item("^_bindgen_ty_9.*")
84
+ };
85
+
86
+ let bindings = opaqueify_bindings(rbconfig, bindings, &mut wrapper_h);
87
+
88
+ let mut tokens = {
89
+ write!(std::io::stderr(), "{}", wrapper_h)?;
90
+ let bindings = bindings.header_contents("wrapper.h", &wrapper_h);
91
+ let code_string = bindings.generate()?.to_string();
92
+ syn::parse_file(&code_string)?
93
+ };
94
+
95
+ let slug = rbconfig.ruby_version_slug();
96
+ let crate_version = env!("CARGO_PKG_VERSION");
97
+ let out_path = out_dir.join(format!("bindings-{}-{}.rs", crate_version, slug));
98
+
99
+ let code = {
100
+ sanitizer::ensure_backwards_compatible_encoding_pointers(&mut tokens);
101
+ clean_docs(rbconfig, &mut tokens);
102
+
103
+ if is_msvc() {
104
+ qualify_symbols_for_msvc(&mut tokens, static_ruby, rbconfig);
105
+ }
106
+
107
+ push_cargo_cfg_from_bindings(&tokens, cfg_out)?;
108
+ categorize_bindings(&mut tokens);
109
+ tokens.into_token_stream().to_string()
110
+ };
111
+
112
+ let mut out_file = File::create(&out_path)?;
113
+ std::io::Write::write_all(&mut out_file, code.as_bytes())?;
114
+ run_rustfmt(&out_path);
115
+
116
+ Ok(out_path)
117
+ }
118
+
119
+ fn run_rustfmt(path: &Path) {
120
+ let mut cmd = std::process::Command::new("rustfmt");
121
+ cmd.stderr(std::process::Stdio::inherit());
122
+ cmd.stdout(std::process::Stdio::inherit());
123
+
124
+ cmd.arg(path);
125
+
126
+ if let Err(e) = cmd.status() {
127
+ debug_log!("WARN: failed to run rustfmt: {}", e);
128
+ }
129
+ }
130
+
131
+ fn clean_docs(rbconfig: &RbConfig, syntax: &mut syn::File) {
132
+ if rbconfig.is_cross_compiling() {
133
+ return;
134
+ }
135
+
136
+ let ver = rbconfig.ruby_version_slug();
137
+
138
+ sanitizer::cleanup_docs(syntax, &ver).unwrap_or_else(|e| {
139
+ debug_log!("WARN: failed to clean up docs, skipping: {}", e);
140
+ })
141
+ }
142
+
143
+ fn default_bindgen(clang_args: Vec<String>, _rbconfig: &RbConfig) -> bindgen::Builder {
144
+ // Disable layout tests and Debug impl on Windows MinGW due to packed struct layout incompatibilities
145
+ let is_windows_mingw = cfg!(target_os = "windows") && !is_msvc();
146
+
147
+ let enable_layout_tests = !is_windows_mingw && cfg!(feature = "bindgen-layout-tests");
148
+ let impl_debug = !is_windows_mingw && cfg!(feature = "bindgen-impl-debug");
149
+
150
+ let mut bindings = bindgen::Builder::default()
151
+ .rustified_enum(".*")
152
+ .no_copy("rb_data_type_struct")
153
+ .derive_eq(true)
154
+ .derive_debug(true)
155
+ .clang_args(clang_args)
156
+ .layout_tests(enable_layout_tests)
157
+ .blocklist_item("^__darwin_pthread.*")
158
+ .blocklist_item("^_opaque_pthread.*")
159
+ .blocklist_item("^__pthread_.*")
160
+ .blocklist_item("^pthread_.*")
161
+ .blocklist_item("^rb_native.*")
162
+ .blocklist_type("INET_PORT_RESERVATION_INSTANCE")
163
+ .blocklist_type("PINET_PORT_RESERVATION_INSTANCE")
164
+ .opaque_type("^__sFILE$")
165
+ .merge_extern_blocks(true)
166
+ .generate_comments(true)
167
+ .size_t_is_usize(env::var("CARGO_FEATURE_BINDGEN_SIZE_T_IS_USIZE").is_ok())
168
+ .impl_debug(impl_debug)
169
+ .parse_callbacks(Box::new(bindgen::CargoCallbacks::new()));
170
+
171
+ // Make __mingw_ldbl_type_t opaque on Windows MinGW to avoid conflicting packed/align representation
172
+ if cfg!(target_os = "windows") && !is_msvc() {
173
+ bindings = bindings.opaque_type("__mingw_ldbl_type_t");
174
+ }
175
+
176
+ if env::var("CARGO_FEATURE_BINDGEN_ENABLE_FUNCTION_ATTRIBUTE_DETECTION").is_ok() {
177
+ bindings.enable_function_attribute_detection()
178
+ } else {
179
+ bindings
180
+ }
181
+ }
182
+
183
+ // This is needed because bindgen doesn't support the `__declspec(dllimport)` on
184
+ // global variables. Without it, symbols are not found.
185
+ // See https://stackoverflow.com/a/66182704/2057700
186
+ fn qualify_symbols_for_msvc(tokens: &mut syn::File, is_static: bool, rbconfig: &RbConfig) {
187
+ let kind = if is_static { "static" } else { "dylib" };
188
+
189
+ let name = if is_static {
190
+ rbconfig.libruby_static_name()
191
+ } else {
192
+ rbconfig.libruby_so_name()
193
+ };
194
+
195
+ sanitizer::add_link_ruby_directives(tokens, &name, kind).unwrap_or_else(|e| {
196
+ debug_log!("WARN: failed to add link directives: {}", e);
197
+ });
198
+ }
199
+
200
+ // Add things like `#[cfg(ruby_use_transient_heap = "true")]` to the bindings config
201
+ fn push_cargo_cfg_from_bindings(
202
+ syntax: &syn::File,
203
+ cfg_out: &mut File,
204
+ ) -> Result<(), Box<dyn Error>> {
205
+ fn is_defines(line: &str) -> bool {
206
+ line.starts_with("HAVE_RUBY")
207
+ || line.starts_with("HAVE_RB")
208
+ || line.starts_with("USE")
209
+ || line.starts_with("RUBY_DEBUG")
210
+ || line.starts_with("RUBY_NDEBUG")
211
+ }
212
+
213
+ for item in syntax.items.iter() {
214
+ if let syn::Item::Const(item) = item {
215
+ let conf = ConfValue::new(item);
216
+ let conf_name = conf.name();
217
+
218
+ if is_defines(&conf_name) {
219
+ let name = conf_name.to_lowercase();
220
+ let val = conf.value_bool().to_string();
221
+ println!(
222
+ r#"cargo:rustc-check-cfg=cfg(ruby_{}, values("true", "false"))"#,
223
+ name
224
+ );
225
+ println!("cargo:rustc-cfg=ruby_{}=\"{}\"", name, val);
226
+ println!("cargo:defines_{}={}", name, val);
227
+ writeln!(cfg_out, "cargo:defines_{}={}", name, val)?;
228
+ }
229
+
230
+ if conf_name.starts_with("RUBY_ABI_VERSION") {
231
+ println!("cargo:ruby_abi_version={}", conf.value_string());
232
+ writeln!(cfg_out, "cargo:ruby_abi_version={}", conf.value_string())?;
233
+ }
234
+ }
235
+ }
236
+
237
+ Ok(())
238
+ }
239
+
240
+ /// An autoconf constant in the bindings
241
+ struct ConfValue<'a> {
242
+ item: &'a syn::ItemConst,
243
+ }
244
+
245
+ impl<'a> ConfValue<'a> {
246
+ pub fn new(item: &'a ItemConst) -> Self {
247
+ Self { item }
248
+ }
249
+
250
+ pub fn name(&self) -> String {
251
+ self.item.ident.to_string()
252
+ }
253
+
254
+ pub fn value_string(&self) -> String {
255
+ match &*self.item.expr {
256
+ Expr::Lit(ExprLit { lit, .. }) => lit.to_token_stream().to_string(),
257
+ _ => panic!(
258
+ "Could not convert HAVE_* constant to string: {:#?}",
259
+ self.item
260
+ ),
261
+ }
262
+ }
263
+
264
+ pub fn value_bool(&self) -> bool {
265
+ match &*self.item.expr {
266
+ Expr::Lit(ExprLit {
267
+ lit: Lit::Int(ref lit),
268
+ ..
269
+ }) => lit.base10_parse::<u8>().unwrap_or(1) != 0,
270
+ Expr::Lit(ExprLit {
271
+ lit: Lit::Bool(ref lit),
272
+ ..
273
+ }) => lit.value,
274
+ _ => panic!(
275
+ "Could not convert HAVE_* constant to bool: {:#?}",
276
+ self.item
277
+ ),
278
+ }
279
+ }
280
+ }
@@ -0,0 +1,421 @@
1
+ use crate::{
2
+ debug_log, rb_config,
3
+ utils::{is_msvc, shellsplit},
4
+ };
5
+ use std::{
6
+ collections::{hash_map::DefaultHasher, HashSet},
7
+ env,
8
+ ffi::{OsStr, OsString},
9
+ fs,
10
+ hash::Hasher,
11
+ path::{Path, PathBuf},
12
+ process::{Command, ExitStatus, Stdio},
13
+ };
14
+
15
+ type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>;
16
+
17
+ const WELL_KNOWN_WRAPPERS: &[&str] = &["sccache", "cachepot"];
18
+
19
+ #[derive(Default, Debug)]
20
+ pub struct Build {
21
+ files: Vec<PathBuf>,
22
+ flags: Vec<String>,
23
+ }
24
+
25
+ impl Build {
26
+ pub fn new() -> Self {
27
+ Self::default()
28
+ }
29
+
30
+ pub fn default_cflags() -> Vec<String> {
31
+ let mut cflags = vec![];
32
+
33
+ if cfg!(target_os = "openbsd") {
34
+ cflags.push("-fdeclspec".into());
35
+ } else {
36
+ cflags.push("-fms-extensions".into());
37
+ };
38
+
39
+ cflags
40
+ }
41
+
42
+ pub fn file(&mut self, file: PathBuf) {
43
+ println!("cargo:rerun-if-changed={}", file.display());
44
+ self.files.push(file);
45
+ }
46
+
47
+ pub fn try_compile(self, name: &str) -> Result<()> {
48
+ let compiler = get_compiler();
49
+ let archiver = get_archiver();
50
+ let out_dir = PathBuf::from(env::var("OUT_DIR")?).join("cc");
51
+ fs::create_dir_all(&out_dir)?;
52
+ let rb = rb_config();
53
+
54
+ let object_files = self.compile_each_file(compiler, &rb, &out_dir)?;
55
+ debug_log!("INFO: compiled object files: {:?}", object_files);
56
+ let (lib_path, lib_name) =
57
+ self.archive_object_files(archiver.copied(), name, &out_dir, object_files)?;
58
+ if let Err(e) = self.strip_archived_objects(archiver, &lib_path) {
59
+ debug_log!("WARN: failed to strip archived objects: {:?}", e);
60
+ }
61
+
62
+ println!("cargo:rustc-link-search=native={}", out_dir.display());
63
+ println!("cargo:rustc-link-lib=static={}", lib_name);
64
+
65
+ Ok(())
66
+ }
67
+
68
+ fn compile_each_file(
69
+ &self,
70
+ compiler: Command,
71
+ rb: &rb_config::RbConfig,
72
+ out_dir: &Path,
73
+ ) -> Result<HashSet<PathBuf>> {
74
+ self.files
75
+ .iter()
76
+ .map(|f| self.compile_file(f, compiler.copied(), rb, out_dir))
77
+ .collect()
78
+ }
79
+
80
+ fn compile_file(
81
+ &self,
82
+ f: &Path,
83
+ compiler: Command,
84
+ rb: &rb_config::RbConfig,
85
+ out_dir: &Path,
86
+ ) -> Result<PathBuf> {
87
+ let mut hasher = DefaultHasher::new();
88
+ hasher.write(fs::read(f)?.as_slice());
89
+
90
+ let object_file = out_dir
91
+ .join(hasher.finish().to_string())
92
+ .with_extension("o");
93
+
94
+ let mut cmd = compiler;
95
+ cmd.args(get_include_args(rb))
96
+ .arg("-c")
97
+ .arg(f)
98
+ .args(&rb.cflags)
99
+ .args(get_common_args())
100
+ .args(&self.flags)
101
+ .args(get_output_file_flag(&object_file));
102
+
103
+ run_command(cmd)?;
104
+
105
+ Ok(object_file)
106
+ }
107
+
108
+ fn archive_object_files(
109
+ &self,
110
+ archiver: Command,
111
+ name: &str,
112
+ out_dir: &Path,
113
+ object_files: HashSet<PathBuf>,
114
+ ) -> Result<(PathBuf, String)> {
115
+ let mut cmd = archiver;
116
+ let mut hasher = DefaultHasher::new();
117
+ object_files
118
+ .iter()
119
+ .for_each(|f| hasher.write(f.to_str().expect("non-utf8 filename").as_bytes()));
120
+ let lib_name = format!("{}-{}", name, hasher.finish());
121
+ let lib_filename = format!("lib{}.a", lib_name);
122
+ let dst = out_dir.join(lib_filename);
123
+
124
+ // The argument structure differs for MSVC and GCC.
125
+ if is_msvc() {
126
+ cmd.arg(format!("/OUT:{}", dst.display()));
127
+ cmd.args(&object_files);
128
+ } else {
129
+ cmd.env("ZERO_AR_DATE", "1").arg("crs").arg(&dst);
130
+ cmd.args(&object_files);
131
+ }
132
+
133
+ run_command(cmd)?;
134
+
135
+ // The Rust compiler will look for libfoo.a and foo.lib, but the
136
+ // MSVC linker will also be passed foo.lib, so be sure that both
137
+ // exist for now.
138
+ if is_msvc() {
139
+ let lib_dst = dst.with_file_name(format!("{}.lib", lib_name));
140
+ let _ = fs::remove_file(&lib_dst);
141
+ match fs::hard_link(&dst, &lib_dst).or_else(|_| {
142
+ // if hard-link fails, just copy (ignoring the number of bytes written)
143
+ fs::copy(&dst, &lib_dst).map(|_| ())
144
+ }) {
145
+ Ok(_) => (),
146
+ Err(_) => {
147
+ return Err(
148
+ "Could not copy or create a hard-link to the generated lib file.".into(),
149
+ );
150
+ }
151
+ };
152
+ }
153
+
154
+ Ok((dst, lib_name))
155
+ }
156
+
157
+ fn strip_archived_objects(&self, archiver: Command, libpath: &Path) -> Result<()> {
158
+ let mut cmd = archiver;
159
+
160
+ if is_msvc() {
161
+ cmd.arg("/LTCG").arg(libpath);
162
+ } else {
163
+ cmd.arg("s").arg(libpath);
164
+ }
165
+
166
+ run_command(cmd)?;
167
+
168
+ Ok(())
169
+ }
170
+ }
171
+
172
+ fn get_include_args(rb: &rb_config::RbConfig) -> Vec<String> {
173
+ let mut args = vec![];
174
+ if let Some(include_dir) = rb.get("rubyhdrdir") {
175
+ args.push(format!("-I{}", include_dir));
176
+ }
177
+ if let Some(arch_include_dir) = rb.get("rubyarchhdrdir") {
178
+ args.push(format!("-I{}", arch_include_dir));
179
+ }
180
+ if let Some(internal_include_dir) = rb.get("rubyhdrdir") {
181
+ args.push(format!("-I{}/include/internal", internal_include_dir));
182
+ }
183
+ if let Some(impl_include_dir) = rb.get("rubyhdrdir") {
184
+ args.push(format!("-I{}/include/impl", impl_include_dir));
185
+ }
186
+
187
+ args
188
+ }
189
+
190
+ fn get_common_args() -> Vec<String> {
191
+ fn add_debug_flags(flags: &mut Vec<String>) {
192
+ match env::var("DEBUG") {
193
+ Ok(val) if val == "true" => {
194
+ if is_msvc() {
195
+ flags.push("-Z7".into());
196
+ } else if cfg!(target_os = "linux") {
197
+ flags.push("-gdwarf-4".into());
198
+ } else {
199
+ flags.push("-gdwarf-2".into());
200
+ }
201
+ }
202
+ _ => {}
203
+ }
204
+ }
205
+
206
+ fn add_opt_level(flags: &mut Vec<String>) {
207
+ if let Ok(val) = env::var("OPT_LEVEL") {
208
+ match val.as_str() {
209
+ // Msvc uses /O1 to enable all optimizations that minimize code size.
210
+ "z" | "s" | "1" if is_msvc() => flags.push("-O1".into()),
211
+ // -O3 is a valid value for gcc and clang compilers, but not msvc. Cap to /O2.
212
+ "2" | "3" if is_msvc() => flags.push("-O2".into()),
213
+ lvl => flags.push(format!("-O{}", lvl)),
214
+ }
215
+ }
216
+ }
217
+
218
+ fn add_compiler_flags(flags: &mut Vec<String>) {
219
+ if !is_msvc() {
220
+ flags.push("-ffunction-sections".into());
221
+ flags.push("-fdata-sections".into());
222
+ flags.push("-fPIC".into());
223
+ flags.push("-fno-omit-frame-pointer".into());
224
+ }
225
+
226
+ flags.extend(Build::default_cflags());
227
+ }
228
+
229
+ let mut items = vec![];
230
+
231
+ add_debug_flags(&mut items);
232
+ add_compiler_flags(&mut items);
233
+ add_opt_level(&mut items);
234
+
235
+ items
236
+ }
237
+
238
+ fn get_compiler() -> Command {
239
+ let cmd = get_tool("CC", "cc");
240
+ let cmd_program = cmd.get_program().to_str().unwrap_or_default();
241
+ let already_wrapped = WELL_KNOWN_WRAPPERS.iter().any(|w| cmd_program.contains(w));
242
+
243
+ match get_tool_from_rb_config_or_env("CC_WRAPPER") {
244
+ Some(wrapper) if !wrapper.is_empty() && !already_wrapped => {
245
+ debug_log!("INFO: using CC_WRAPPER ({:?})", wrapper);
246
+ cmd.wrapped(wrapper)
247
+ }
248
+ _ => match rustc_wrapper_fallback() {
249
+ Some(wrapper) if !already_wrapped => cmd.wrapped(wrapper),
250
+ _ => cmd,
251
+ },
252
+ }
253
+ }
254
+
255
+ pub fn rustc_wrapper_fallback() -> Option<String> {
256
+ let rustc_wrapper = std::env::var("RUSTC_WRAPPER").ok()?;
257
+ rustc_wrapper_fallback_detect(rustc_wrapper)
258
+ }
259
+
260
+ pub fn rustc_wrapper_fallback_detect(rustc_wrapper: String) -> Option<String> {
261
+ let wrapper_path = Path::new(&rustc_wrapper);
262
+ let wrapper_stem = wrapper_path.file_stem()?;
263
+
264
+ if WELL_KNOWN_WRAPPERS.contains(&wrapper_stem.to_str()?) {
265
+ debug_log!("INFO: using RUSTC_WRAPPER ({:?})", rustc_wrapper);
266
+ Some(rustc_wrapper)
267
+ } else {
268
+ None
269
+ }
270
+ }
271
+
272
+ fn get_archiver() -> Command {
273
+ let cmd = get_tool("AR", "ar");
274
+
275
+ if cmd.get_program() == "libtool" {
276
+ new_command("ar")
277
+ } else {
278
+ cmd
279
+ }
280
+ }
281
+
282
+ fn get_tool(env_var: &str, default: &str) -> Command {
283
+ let tool_args = get_tool_from_rb_config_or_env(env_var)
284
+ .unwrap_or_else(|| panic!("no {} tool found", env_var));
285
+
286
+ let mut tool_args = shellsplit(tool_args).into_iter();
287
+ let tool = tool_args.next().unwrap_or_else(|| default.to_string());
288
+
289
+ fn tool_exists(tool_name: &str) -> std::io::Result<bool> {
290
+ let path = PathBuf::from(tool_name);
291
+
292
+ if path.is_file() {
293
+ return Ok(true);
294
+ }
295
+
296
+ match Command::new(tool_name).spawn() {
297
+ Ok(_) => Ok(true),
298
+ Err(e) => {
299
+ if e.kind() == std::io::ErrorKind::NotFound {
300
+ Ok(false)
301
+ } else {
302
+ Err(e)
303
+ }
304
+ }
305
+ }
306
+ }
307
+
308
+ let mut cmd = if tool_exists(&tool).unwrap_or(false) {
309
+ debug_log!("[INFO] using {tool} for {env_var}");
310
+ new_command(&tool)
311
+ } else {
312
+ debug_log!("[WARN] {tool} tool not found, falling back to {default}");
313
+ new_command(default)
314
+ };
315
+
316
+ cmd.args(tool_args.clone());
317
+
318
+ debug_log!("INFO: found {:?} tool ({:?})", env_var, &cmd);
319
+
320
+ cmd
321
+ }
322
+
323
+ fn get_tool_from_rb_config_or_env(env_var: &str) -> Option<String> {
324
+ let rb = rb_config();
325
+
326
+ get_tool_from_env(env_var)
327
+ .filter(|s| !s.is_empty())
328
+ .or_else(|| rb.get(env_var))
329
+ }
330
+
331
+ fn get_tool_from_env(env_var: &str) -> Option<String> {
332
+ let target_slug = env::var("TARGET").ok()?.replace('-', "_");
333
+ let env_var_with_target = format!("{}_{}", env_var, target_slug);
334
+
335
+ println!("cargo:rerun-if-env-changed={}", env_var);
336
+ println!("cargo:rerun-if-env-changed={}", env_var_with_target);
337
+
338
+ env::var(env_var)
339
+ .or_else(|_| env::var(env_var_with_target))
340
+ .ok()
341
+ }
342
+
343
+ fn run_command(mut cmd: Command) -> Result<ExitStatus> {
344
+ debug_log!("INFO: running command ({:?})", cmd);
345
+ let status = cmd.status()?;
346
+
347
+ if !status.success() {
348
+ Err(format!("Command '{:?}' failed with status: {}", cmd, status).into())
349
+ } else {
350
+ Ok(status)
351
+ }
352
+ }
353
+
354
+ fn new_command(name: &str) -> Command {
355
+ let mut cmd = Command::new(name);
356
+ cmd.stderr(Stdio::inherit()).stdout(Stdio::inherit());
357
+ cmd
358
+ }
359
+
360
+ fn get_output_file_flag(file: &Path) -> Vec<OsString> {
361
+ if is_msvc() {
362
+ vec![format!("-Fo{}", file.display()).into()]
363
+ } else {
364
+ vec!["-o".into(), file.into()]
365
+ }
366
+ }
367
+
368
+ pub trait CommandExt {
369
+ fn copied(&self) -> Command;
370
+ fn wrapped<W: AsRef<OsStr>>(&self, wrapper: W) -> Command;
371
+ }
372
+
373
+ impl CommandExt for Command {
374
+ fn copied(&self) -> Command {
375
+ let mut cmd = Command::new(self.get_program());
376
+ cmd.args(self.get_args());
377
+
378
+ for (k, v) in self.get_envs() {
379
+ if let Some(v) = v {
380
+ cmd.env(k, v);
381
+ } else {
382
+ cmd.env_remove(k);
383
+ }
384
+ }
385
+ cmd
386
+ }
387
+
388
+ fn wrapped<W: AsRef<OsStr>>(&self, wrapper: W) -> Command {
389
+ let mut new_cmd = Command::new(wrapper);
390
+
391
+ new_cmd.arg(self.get_program());
392
+
393
+ for arg in self.get_args() {
394
+ new_cmd.arg(arg);
395
+ }
396
+
397
+ for (k, v) in self.get_envs() {
398
+ if let Some(v) = v {
399
+ new_cmd.env(k, v);
400
+ } else {
401
+ new_cmd.env_remove(k);
402
+ }
403
+ }
404
+
405
+ new_cmd
406
+ }
407
+ }
408
+
409
+ #[cfg(test)]
410
+ mod tests {
411
+ use super::*;
412
+
413
+ #[test]
414
+ fn rustc_wrapper_detect() {
415
+ let wrapper = "/usr/local/bin/sccache";
416
+ assert_eq!(
417
+ rustc_wrapper_fallback_detect(wrapper.to_owned()),
418
+ Some(wrapper.to_owned())
419
+ );
420
+ }
421
+ }
@@ -0,0 +1,12 @@
1
+ pub mod bindings;
2
+ pub mod cc;
3
+ pub mod utils;
4
+
5
+ mod rb_config;
6
+
7
+ pub use rb_config::*;
8
+
9
+ /// The current RbConfig.
10
+ pub fn rb_config() -> RbConfig {
11
+ RbConfig::current()
12
+ }