itsi 0.2.3 → 0.2.4

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 (460) hide show
  1. checksums.yaml +4 -4
  2. data/Cargo.lock +2 -2
  3. data/README.md +1 -1
  4. data/Rakefile +2 -2
  5. data/crates/itsi_scheduler/Cargo.toml +1 -1
  6. data/crates/itsi_server/Cargo.toml +1 -1
  7. data/crates/itsi_server/src/server/middleware_stack/middlewares/compression.rs +28 -11
  8. data/crates/itsi_server/src/server/middleware_stack/middlewares/log_requests.rs +1 -1
  9. data/crates/itsi_server/src/server/middleware_stack/middlewares/proxy.rs +1 -2
  10. data/crates/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs +14 -2
  11. data/crates/itsi_server/src/server/middleware_stack/middlewares/string_rewrite.rs +86 -41
  12. data/crates/itsi_server/src/services/itsi_http_service.rs +46 -35
  13. data/crates/itsi_server/src/services/static_file_server.rs +31 -3
  14. data/examples/api_with_schema_and_controllers/Itsi.rb +35 -0
  15. data/examples/api_with_schema_and_controllers/README.md +10 -0
  16. data/examples/api_with_schema_and_controllers/controllers.rb +66 -0
  17. data/examples/api_with_schema_and_controllers/schemas.rb +25 -0
  18. data/examples/file_server/Itsi.rb +30 -0
  19. data/examples/file_server/README.md +3 -0
  20. data/examples/file_server/about.html +80 -0
  21. data/examples/file_server/admin/secrets.txt +1 -0
  22. data/examples/file_server/fairytale.txt +33 -0
  23. data/examples/file_server/itsi-server-100.png +0 -0
  24. data/examples/file_server/subdirectory/movies.csv +21 -0
  25. data/examples/helpers/datastore.rb +84 -0
  26. data/examples/media_server/Itsi.rb +5 -0
  27. data/examples/media_server/README.md +3 -0
  28. data/examples/media_server/images/itsi-server-100.png +0 -0
  29. data/examples/media_server/index.html +82 -0
  30. data/examples/multi_rack_rails_sinatra/Gemfile +66 -0
  31. data/examples/multi_rack_rails_sinatra/Gemfile.lock +416 -0
  32. data/examples/multi_rack_rails_sinatra/Itsi.rb +44 -0
  33. data/examples/multi_rack_rails_sinatra/README.md +7 -0
  34. data/examples/multi_rack_rails_sinatra/index.html +119 -0
  35. data/examples/multi_rack_rails_sinatra/rails_subapp/.dockerignore +51 -0
  36. data/examples/multi_rack_rails_sinatra/rails_subapp/.gitattributes +9 -0
  37. data/examples/multi_rack_rails_sinatra/rails_subapp/.github/dependabot.yml +12 -0
  38. data/examples/multi_rack_rails_sinatra/rails_subapp/.github/workflows/ci.yml +90 -0
  39. data/examples/multi_rack_rails_sinatra/rails_subapp/.gitignore +34 -0
  40. data/examples/multi_rack_rails_sinatra/rails_subapp/.kamal/hooks/docker-setup.sample +3 -0
  41. data/examples/multi_rack_rails_sinatra/rails_subapp/.kamal/hooks/post-app-boot.sample +3 -0
  42. data/examples/multi_rack_rails_sinatra/rails_subapp/.kamal/hooks/post-deploy.sample +14 -0
  43. data/examples/multi_rack_rails_sinatra/rails_subapp/.kamal/hooks/post-proxy-reboot.sample +3 -0
  44. data/examples/multi_rack_rails_sinatra/rails_subapp/.kamal/hooks/pre-app-boot.sample +3 -0
  45. data/examples/multi_rack_rails_sinatra/rails_subapp/.kamal/hooks/pre-build.sample +51 -0
  46. data/examples/multi_rack_rails_sinatra/rails_subapp/.kamal/hooks/pre-connect.sample +47 -0
  47. data/examples/multi_rack_rails_sinatra/rails_subapp/.kamal/hooks/pre-deploy.sample +109 -0
  48. data/examples/multi_rack_rails_sinatra/rails_subapp/.kamal/hooks/pre-proxy-reboot.sample +3 -0
  49. data/examples/multi_rack_rails_sinatra/rails_subapp/.kamal/secrets +17 -0
  50. data/examples/multi_rack_rails_sinatra/rails_subapp/.rubocop.yml +8 -0
  51. data/examples/multi_rack_rails_sinatra/rails_subapp/.ruby-version +1 -0
  52. data/examples/multi_rack_rails_sinatra/rails_subapp/Dockerfile +72 -0
  53. data/examples/multi_rack_rails_sinatra/rails_subapp/Gemfile +66 -0
  54. data/examples/multi_rack_rails_sinatra/rails_subapp/Gemfile.lock +416 -0
  55. data/examples/multi_rack_rails_sinatra/rails_subapp/README.md +24 -0
  56. data/examples/multi_rack_rails_sinatra/rails_subapp/Rakefile +6 -0
  57. data/examples/multi_rack_rails_sinatra/rails_subapp/app/assets/images/.keep +0 -0
  58. data/examples/multi_rack_rails_sinatra/rails_subapp/app/assets/stylesheets/application.css +161 -0
  59. data/examples/multi_rack_rails_sinatra/rails_subapp/app/controllers/application_controller.rb +4 -0
  60. data/examples/multi_rack_rails_sinatra/rails_subapp/app/controllers/articles_controller.rb +70 -0
  61. data/examples/multi_rack_rails_sinatra/rails_subapp/app/controllers/concerns/.keep +0 -0
  62. data/examples/multi_rack_rails_sinatra/rails_subapp/app/controllers/home_controller.rb +4 -0
  63. data/examples/multi_rack_rails_sinatra/rails_subapp/app/helpers/application_helper.rb +2 -0
  64. data/examples/multi_rack_rails_sinatra/rails_subapp/app/helpers/articles_helper.rb +2 -0
  65. data/examples/multi_rack_rails_sinatra/rails_subapp/app/helpers/home_helper.rb +2 -0
  66. data/examples/multi_rack_rails_sinatra/rails_subapp/app/javascript/application.js +3 -0
  67. data/examples/multi_rack_rails_sinatra/rails_subapp/app/javascript/controllers/application.js +9 -0
  68. data/examples/multi_rack_rails_sinatra/rails_subapp/app/javascript/controllers/hello_controller.js +7 -0
  69. data/examples/multi_rack_rails_sinatra/rails_subapp/app/javascript/controllers/index.js +4 -0
  70. data/examples/multi_rack_rails_sinatra/rails_subapp/app/jobs/application_job.rb +7 -0
  71. data/examples/multi_rack_rails_sinatra/rails_subapp/app/mailers/application_mailer.rb +4 -0
  72. data/examples/multi_rack_rails_sinatra/rails_subapp/app/models/application_record.rb +3 -0
  73. data/examples/multi_rack_rails_sinatra/rails_subapp/app/models/article.rb +2 -0
  74. data/examples/multi_rack_rails_sinatra/rails_subapp/app/models/concerns/.keep +0 -0
  75. data/examples/multi_rack_rails_sinatra/rails_subapp/app/views/articles/_article.html.erb +14 -0
  76. data/examples/multi_rack_rails_sinatra/rails_subapp/app/views/articles/_article.json.jbuilder +2 -0
  77. data/examples/multi_rack_rails_sinatra/rails_subapp/app/views/articles/_form.html.erb +30 -0
  78. data/examples/multi_rack_rails_sinatra/rails_subapp/app/views/articles/edit.html.erb +12 -0
  79. data/examples/multi_rack_rails_sinatra/rails_subapp/app/views/articles/index.html.erb +29 -0
  80. data/examples/multi_rack_rails_sinatra/rails_subapp/app/views/articles/index.json.jbuilder +1 -0
  81. data/examples/multi_rack_rails_sinatra/rails_subapp/app/views/articles/new.html.erb +11 -0
  82. data/examples/multi_rack_rails_sinatra/rails_subapp/app/views/articles/show.html.erb +10 -0
  83. data/examples/multi_rack_rails_sinatra/rails_subapp/app/views/articles/show.json.jbuilder +1 -0
  84. data/examples/multi_rack_rails_sinatra/rails_subapp/app/views/home/index.html.erb +8 -0
  85. data/examples/multi_rack_rails_sinatra/rails_subapp/app/views/layouts/application.html.erb +34 -0
  86. data/examples/multi_rack_rails_sinatra/rails_subapp/app/views/layouts/mailer.html.erb +13 -0
  87. data/examples/multi_rack_rails_sinatra/rails_subapp/app/views/layouts/mailer.text.erb +1 -0
  88. data/examples/multi_rack_rails_sinatra/rails_subapp/app/views/pwa/manifest.json.erb +22 -0
  89. data/examples/multi_rack_rails_sinatra/rails_subapp/app/views/pwa/service-worker.js +26 -0
  90. data/examples/multi_rack_rails_sinatra/rails_subapp/bin/brakeman +7 -0
  91. data/examples/multi_rack_rails_sinatra/rails_subapp/bin/bundle +109 -0
  92. data/examples/multi_rack_rails_sinatra/rails_subapp/bin/dev +2 -0
  93. data/examples/multi_rack_rails_sinatra/rails_subapp/bin/docker-entrypoint +14 -0
  94. data/examples/multi_rack_rails_sinatra/rails_subapp/bin/importmap +4 -0
  95. data/examples/multi_rack_rails_sinatra/rails_subapp/bin/jobs +6 -0
  96. data/examples/multi_rack_rails_sinatra/rails_subapp/bin/kamal +27 -0
  97. data/examples/multi_rack_rails_sinatra/rails_subapp/bin/rails +4 -0
  98. data/examples/multi_rack_rails_sinatra/rails_subapp/bin/rake +4 -0
  99. data/examples/multi_rack_rails_sinatra/rails_subapp/bin/rubocop +8 -0
  100. data/examples/multi_rack_rails_sinatra/rails_subapp/bin/setup +34 -0
  101. data/examples/multi_rack_rails_sinatra/rails_subapp/bin/thrust +5 -0
  102. data/examples/multi_rack_rails_sinatra/rails_subapp/config/application.rb +27 -0
  103. data/examples/multi_rack_rails_sinatra/rails_subapp/config/boot.rb +4 -0
  104. data/examples/multi_rack_rails_sinatra/rails_subapp/config/cable.yml +17 -0
  105. data/examples/multi_rack_rails_sinatra/rails_subapp/config/cache.yml +16 -0
  106. data/examples/multi_rack_rails_sinatra/rails_subapp/config/credentials.yml.enc +1 -0
  107. data/examples/multi_rack_rails_sinatra/rails_subapp/config/database.yml +41 -0
  108. data/examples/multi_rack_rails_sinatra/rails_subapp/config/deploy.yml +116 -0
  109. data/examples/multi_rack_rails_sinatra/rails_subapp/config/environment.rb +5 -0
  110. data/examples/multi_rack_rails_sinatra/rails_subapp/config/environments/development.rb +72 -0
  111. data/examples/multi_rack_rails_sinatra/rails_subapp/config/environments/production.rb +90 -0
  112. data/examples/multi_rack_rails_sinatra/rails_subapp/config/environments/test.rb +53 -0
  113. data/examples/multi_rack_rails_sinatra/rails_subapp/config/importmap.rb +7 -0
  114. data/examples/multi_rack_rails_sinatra/rails_subapp/config/initializers/assets.rb +7 -0
  115. data/examples/multi_rack_rails_sinatra/rails_subapp/config/initializers/content_security_policy.rb +25 -0
  116. data/examples/multi_rack_rails_sinatra/rails_subapp/config/initializers/filter_parameter_logging.rb +8 -0
  117. data/examples/multi_rack_rails_sinatra/rails_subapp/config/initializers/inflections.rb +16 -0
  118. data/examples/multi_rack_rails_sinatra/rails_subapp/config/locales/en.yml +31 -0
  119. data/examples/multi_rack_rails_sinatra/rails_subapp/config/puma.rb +41 -0
  120. data/examples/multi_rack_rails_sinatra/rails_subapp/config/queue.yml +18 -0
  121. data/examples/multi_rack_rails_sinatra/rails_subapp/config/recurring.yml +10 -0
  122. data/examples/multi_rack_rails_sinatra/rails_subapp/config/routes.rb +17 -0
  123. data/examples/multi_rack_rails_sinatra/rails_subapp/config/storage.yml +34 -0
  124. data/examples/multi_rack_rails_sinatra/rails_subapp/config.ru +6 -0
  125. data/examples/multi_rack_rails_sinatra/rails_subapp/db/cable_schema.rb +11 -0
  126. data/examples/multi_rack_rails_sinatra/rails_subapp/db/cache_schema.rb +14 -0
  127. data/examples/multi_rack_rails_sinatra/rails_subapp/db/migrate/20250422211855_create_articles.rb +10 -0
  128. data/examples/multi_rack_rails_sinatra/rails_subapp/db/queue_schema.rb +129 -0
  129. data/examples/multi_rack_rails_sinatra/rails_subapp/db/schema.rb +20 -0
  130. data/examples/multi_rack_rails_sinatra/rails_subapp/db/seeds.rb +9 -0
  131. data/examples/multi_rack_rails_sinatra/rails_subapp/lib/tasks/.keep +0 -0
  132. data/examples/multi_rack_rails_sinatra/rails_subapp/log/.keep +0 -0
  133. data/examples/multi_rack_rails_sinatra/rails_subapp/public/400.html +114 -0
  134. data/examples/multi_rack_rails_sinatra/rails_subapp/public/404.html +114 -0
  135. data/examples/multi_rack_rails_sinatra/rails_subapp/public/406-unsupported-browser.html +114 -0
  136. data/examples/multi_rack_rails_sinatra/rails_subapp/public/422.html +114 -0
  137. data/examples/multi_rack_rails_sinatra/rails_subapp/public/500.html +114 -0
  138. data/examples/multi_rack_rails_sinatra/rails_subapp/public/icon.png +0 -0
  139. data/examples/multi_rack_rails_sinatra/rails_subapp/public/icon.svg +3 -0
  140. data/examples/multi_rack_rails_sinatra/rails_subapp/public/robots.txt +1 -0
  141. data/examples/multi_rack_rails_sinatra/rails_subapp/script/.keep +0 -0
  142. data/examples/multi_rack_rails_sinatra/rails_subapp/storage/.keep +0 -0
  143. data/examples/multi_rack_rails_sinatra/rails_subapp/test/application_system_test_case.rb +5 -0
  144. data/examples/multi_rack_rails_sinatra/rails_subapp/test/controllers/.keep +0 -0
  145. data/examples/multi_rack_rails_sinatra/rails_subapp/test/controllers/articles_controller_test.rb +48 -0
  146. data/examples/multi_rack_rails_sinatra/rails_subapp/test/controllers/home_controller_test.rb +8 -0
  147. data/examples/multi_rack_rails_sinatra/rails_subapp/test/fixtures/articles.yml +9 -0
  148. data/examples/multi_rack_rails_sinatra/rails_subapp/test/fixtures/files/.keep +0 -0
  149. data/examples/multi_rack_rails_sinatra/rails_subapp/test/helpers/.keep +0 -0
  150. data/examples/multi_rack_rails_sinatra/rails_subapp/test/integration/.keep +0 -0
  151. data/examples/multi_rack_rails_sinatra/rails_subapp/test/mailers/.keep +0 -0
  152. data/examples/multi_rack_rails_sinatra/rails_subapp/test/models/.keep +0 -0
  153. data/examples/multi_rack_rails_sinatra/rails_subapp/test/models/article_test.rb +7 -0
  154. data/examples/multi_rack_rails_sinatra/rails_subapp/test/system/.keep +0 -0
  155. data/examples/multi_rack_rails_sinatra/rails_subapp/test/system/articles_test.rb +43 -0
  156. data/examples/multi_rack_rails_sinatra/rails_subapp/test/test_helper.rb +15 -0
  157. data/examples/multi_rack_rails_sinatra/rails_subapp/tmp/.keep +0 -0
  158. data/examples/multi_rack_rails_sinatra/rails_subapp/tmp/pids/.keep +0 -0
  159. data/examples/multi_rack_rails_sinatra/rails_subapp/tmp/storage/.keep +0 -0
  160. data/examples/multi_rack_rails_sinatra/rails_subapp/vendor/.keep +0 -0
  161. data/examples/multi_rack_rails_sinatra/rails_subapp/vendor/javascript/.keep +0 -0
  162. data/examples/multi_rack_rails_sinatra/sinatra_subapp/config.ru +2 -0
  163. data/examples/multi_rack_rails_sinatra/sinatra_subapp/my_app.rb +96 -0
  164. data/examples/rails_with_static_assets/.dockerignore +51 -0
  165. data/examples/rails_with_static_assets/.gitattributes +9 -0
  166. data/examples/rails_with_static_assets/.github/dependabot.yml +12 -0
  167. data/examples/rails_with_static_assets/.github/workflows/ci.yml +90 -0
  168. data/examples/rails_with_static_assets/.gitignore +34 -0
  169. data/examples/rails_with_static_assets/.kamal/hooks/docker-setup.sample +3 -0
  170. data/examples/rails_with_static_assets/.kamal/hooks/post-app-boot.sample +3 -0
  171. data/examples/rails_with_static_assets/.kamal/hooks/post-deploy.sample +14 -0
  172. data/examples/rails_with_static_assets/.kamal/hooks/post-proxy-reboot.sample +3 -0
  173. data/examples/rails_with_static_assets/.kamal/hooks/pre-app-boot.sample +3 -0
  174. data/examples/rails_with_static_assets/.kamal/hooks/pre-build.sample +51 -0
  175. data/examples/rails_with_static_assets/.kamal/hooks/pre-connect.sample +47 -0
  176. data/examples/rails_with_static_assets/.kamal/hooks/pre-deploy.sample +109 -0
  177. data/examples/rails_with_static_assets/.kamal/hooks/pre-proxy-reboot.sample +3 -0
  178. data/examples/rails_with_static_assets/.kamal/secrets +17 -0
  179. data/examples/rails_with_static_assets/.rubocop.yml +8 -0
  180. data/examples/rails_with_static_assets/.ruby-version +1 -0
  181. data/examples/rails_with_static_assets/Dockerfile +72 -0
  182. data/examples/rails_with_static_assets/Gemfile +66 -0
  183. data/examples/rails_with_static_assets/Gemfile.lock +416 -0
  184. data/examples/rails_with_static_assets/Itsi.rb +10 -0
  185. data/examples/rails_with_static_assets/README.md +14 -0
  186. data/examples/rails_with_static_assets/Rakefile +6 -0
  187. data/examples/rails_with_static_assets/app/assets/images/.keep +0 -0
  188. data/examples/rails_with_static_assets/app/assets/stylesheets/application.css +161 -0
  189. data/examples/rails_with_static_assets/app/controllers/application_controller.rb +4 -0
  190. data/examples/rails_with_static_assets/app/controllers/articles_controller.rb +70 -0
  191. data/examples/rails_with_static_assets/app/controllers/concerns/.keep +0 -0
  192. data/examples/rails_with_static_assets/app/controllers/home_controller.rb +4 -0
  193. data/examples/rails_with_static_assets/app/helpers/application_helper.rb +2 -0
  194. data/examples/rails_with_static_assets/app/helpers/articles_helper.rb +2 -0
  195. data/examples/rails_with_static_assets/app/helpers/home_helper.rb +2 -0
  196. data/examples/rails_with_static_assets/app/javascript/application.js +3 -0
  197. data/examples/rails_with_static_assets/app/javascript/controllers/application.js +9 -0
  198. data/examples/rails_with_static_assets/app/javascript/controllers/hello_controller.js +7 -0
  199. data/examples/rails_with_static_assets/app/javascript/controllers/index.js +4 -0
  200. data/examples/rails_with_static_assets/app/jobs/application_job.rb +7 -0
  201. data/examples/rails_with_static_assets/app/mailers/application_mailer.rb +4 -0
  202. data/examples/rails_with_static_assets/app/models/application_record.rb +3 -0
  203. data/examples/rails_with_static_assets/app/models/article.rb +2 -0
  204. data/examples/rails_with_static_assets/app/models/concerns/.keep +0 -0
  205. data/examples/rails_with_static_assets/app/views/articles/_article.html.erb +14 -0
  206. data/examples/rails_with_static_assets/app/views/articles/_article.json.jbuilder +2 -0
  207. data/examples/rails_with_static_assets/app/views/articles/_form.html.erb +30 -0
  208. data/examples/rails_with_static_assets/app/views/articles/edit.html.erb +12 -0
  209. data/examples/rails_with_static_assets/app/views/articles/index.html.erb +29 -0
  210. data/examples/rails_with_static_assets/app/views/articles/index.json.jbuilder +1 -0
  211. data/examples/rails_with_static_assets/app/views/articles/new.html.erb +11 -0
  212. data/examples/rails_with_static_assets/app/views/articles/show.html.erb +10 -0
  213. data/examples/rails_with_static_assets/app/views/articles/show.json.jbuilder +1 -0
  214. data/examples/rails_with_static_assets/app/views/home/index.html.erb +8 -0
  215. data/examples/rails_with_static_assets/app/views/layouts/application.html.erb +34 -0
  216. data/examples/rails_with_static_assets/app/views/layouts/mailer.html.erb +13 -0
  217. data/examples/rails_with_static_assets/app/views/layouts/mailer.text.erb +1 -0
  218. data/examples/rails_with_static_assets/app/views/pwa/manifest.json.erb +22 -0
  219. data/examples/rails_with_static_assets/app/views/pwa/service-worker.js +26 -0
  220. data/examples/rails_with_static_assets/bin/brakeman +7 -0
  221. data/examples/rails_with_static_assets/bin/bundle +109 -0
  222. data/examples/rails_with_static_assets/bin/dev +2 -0
  223. data/examples/rails_with_static_assets/bin/docker-entrypoint +14 -0
  224. data/examples/rails_with_static_assets/bin/importmap +4 -0
  225. data/examples/rails_with_static_assets/bin/jobs +6 -0
  226. data/examples/rails_with_static_assets/bin/kamal +27 -0
  227. data/examples/rails_with_static_assets/bin/rails +4 -0
  228. data/examples/rails_with_static_assets/bin/rake +4 -0
  229. data/examples/rails_with_static_assets/bin/rubocop +8 -0
  230. data/examples/rails_with_static_assets/bin/setup +34 -0
  231. data/examples/rails_with_static_assets/bin/thrust +5 -0
  232. data/examples/rails_with_static_assets/config/application.rb +26 -0
  233. data/examples/rails_with_static_assets/config/boot.rb +4 -0
  234. data/examples/rails_with_static_assets/config/cable.yml +17 -0
  235. data/examples/rails_with_static_assets/config/cache.yml +16 -0
  236. data/examples/rails_with_static_assets/config/credentials.yml.enc +1 -0
  237. data/examples/rails_with_static_assets/config/database.yml +41 -0
  238. data/examples/rails_with_static_assets/config/deploy.yml +116 -0
  239. data/examples/rails_with_static_assets/config/environment.rb +5 -0
  240. data/examples/rails_with_static_assets/config/environments/development.rb +74 -0
  241. data/examples/rails_with_static_assets/config/environments/production.rb +90 -0
  242. data/examples/rails_with_static_assets/config/environments/test.rb +53 -0
  243. data/examples/rails_with_static_assets/config/importmap.rb +7 -0
  244. data/examples/rails_with_static_assets/config/initializers/assets.rb +7 -0
  245. data/examples/rails_with_static_assets/config/initializers/content_security_policy.rb +25 -0
  246. data/examples/rails_with_static_assets/config/initializers/filter_parameter_logging.rb +8 -0
  247. data/examples/rails_with_static_assets/config/initializers/inflections.rb +16 -0
  248. data/examples/rails_with_static_assets/config/locales/en.yml +31 -0
  249. data/examples/rails_with_static_assets/config/puma.rb +41 -0
  250. data/examples/rails_with_static_assets/config/queue.yml +18 -0
  251. data/examples/rails_with_static_assets/config/recurring.yml +10 -0
  252. data/examples/rails_with_static_assets/config/routes.rb +17 -0
  253. data/examples/rails_with_static_assets/config/storage.yml +34 -0
  254. data/examples/rails_with_static_assets/config.ru +6 -0
  255. data/examples/rails_with_static_assets/db/cable_schema.rb +11 -0
  256. data/examples/rails_with_static_assets/db/cache_schema.rb +14 -0
  257. data/examples/rails_with_static_assets/db/migrate/20250422211855_create_articles.rb +10 -0
  258. data/examples/rails_with_static_assets/db/queue_schema.rb +129 -0
  259. data/examples/rails_with_static_assets/db/schema.rb +20 -0
  260. data/examples/rails_with_static_assets/db/seeds.rb +9 -0
  261. data/examples/rails_with_static_assets/lib/tasks/.keep +0 -0
  262. data/examples/rails_with_static_assets/log/.keep +0 -0
  263. data/examples/rails_with_static_assets/public/400.html +114 -0
  264. data/examples/rails_with_static_assets/public/404.html +114 -0
  265. data/examples/rails_with_static_assets/public/406-unsupported-browser.html +114 -0
  266. data/examples/rails_with_static_assets/public/422.html +114 -0
  267. data/examples/rails_with_static_assets/public/500.html +114 -0
  268. data/examples/rails_with_static_assets/public/icon.png +0 -0
  269. data/examples/rails_with_static_assets/public/icon.svg +3 -0
  270. data/examples/rails_with_static_assets/public/robots.txt +1 -0
  271. data/examples/rails_with_static_assets/script/.keep +0 -0
  272. data/examples/rails_with_static_assets/storage/.keep +0 -0
  273. data/examples/rails_with_static_assets/test/application_system_test_case.rb +5 -0
  274. data/examples/rails_with_static_assets/test/controllers/.keep +0 -0
  275. data/examples/rails_with_static_assets/test/controllers/articles_controller_test.rb +48 -0
  276. data/examples/rails_with_static_assets/test/controllers/home_controller_test.rb +8 -0
  277. data/examples/rails_with_static_assets/test/fixtures/articles.yml +9 -0
  278. data/examples/rails_with_static_assets/test/fixtures/files/.keep +0 -0
  279. data/examples/rails_with_static_assets/test/helpers/.keep +0 -0
  280. data/examples/rails_with_static_assets/test/integration/.keep +0 -0
  281. data/examples/rails_with_static_assets/test/mailers/.keep +0 -0
  282. data/examples/rails_with_static_assets/test/models/.keep +0 -0
  283. data/examples/rails_with_static_assets/test/models/article_test.rb +7 -0
  284. data/examples/rails_with_static_assets/test/system/.keep +0 -0
  285. data/examples/rails_with_static_assets/test/system/articles_test.rb +43 -0
  286. data/examples/rails_with_static_assets/test/test_helper.rb +15 -0
  287. data/examples/rails_with_static_assets/tmp/.keep +0 -0
  288. data/examples/rails_with_static_assets/tmp/pids/.keep +0 -0
  289. data/examples/rails_with_static_assets/tmp/storage/.keep +0 -0
  290. data/examples/rails_with_static_assets/vendor/.keep +0 -0
  291. data/examples/rails_with_static_assets/vendor/javascript/.keep +0 -0
  292. data/examples/reverse_proxy/Itsi.rb +28 -0
  293. data/examples/reverse_proxy/README.md +14 -0
  294. data/examples/reverse_proxy/index.html +119 -0
  295. data/examples/reverse_proxy/rails_subapp/.dockerignore +51 -0
  296. data/examples/reverse_proxy/rails_subapp/.gitattributes +9 -0
  297. data/examples/reverse_proxy/rails_subapp/.github/dependabot.yml +12 -0
  298. data/examples/reverse_proxy/rails_subapp/.github/workflows/ci.yml +90 -0
  299. data/examples/reverse_proxy/rails_subapp/.gitignore +34 -0
  300. data/examples/reverse_proxy/rails_subapp/.kamal/hooks/docker-setup.sample +3 -0
  301. data/examples/reverse_proxy/rails_subapp/.kamal/hooks/post-app-boot.sample +3 -0
  302. data/examples/reverse_proxy/rails_subapp/.kamal/hooks/post-deploy.sample +14 -0
  303. data/examples/reverse_proxy/rails_subapp/.kamal/hooks/post-proxy-reboot.sample +3 -0
  304. data/examples/reverse_proxy/rails_subapp/.kamal/hooks/pre-app-boot.sample +3 -0
  305. data/examples/reverse_proxy/rails_subapp/.kamal/hooks/pre-build.sample +51 -0
  306. data/examples/reverse_proxy/rails_subapp/.kamal/hooks/pre-connect.sample +47 -0
  307. data/examples/reverse_proxy/rails_subapp/.kamal/hooks/pre-deploy.sample +109 -0
  308. data/examples/reverse_proxy/rails_subapp/.kamal/hooks/pre-proxy-reboot.sample +3 -0
  309. data/examples/reverse_proxy/rails_subapp/.kamal/secrets +17 -0
  310. data/examples/reverse_proxy/rails_subapp/.rubocop.yml +8 -0
  311. data/examples/reverse_proxy/rails_subapp/.ruby-version +1 -0
  312. data/examples/reverse_proxy/rails_subapp/Dockerfile +72 -0
  313. data/examples/reverse_proxy/rails_subapp/Gemfile +66 -0
  314. data/examples/reverse_proxy/rails_subapp/Gemfile.lock +416 -0
  315. data/examples/reverse_proxy/rails_subapp/README.md +24 -0
  316. data/examples/reverse_proxy/rails_subapp/Rakefile +6 -0
  317. data/examples/reverse_proxy/rails_subapp/app/assets/images/.keep +0 -0
  318. data/examples/reverse_proxy/rails_subapp/app/assets/stylesheets/application.css +161 -0
  319. data/examples/reverse_proxy/rails_subapp/app/controllers/application_controller.rb +4 -0
  320. data/examples/reverse_proxy/rails_subapp/app/controllers/articles_controller.rb +70 -0
  321. data/examples/reverse_proxy/rails_subapp/app/controllers/concerns/.keep +0 -0
  322. data/examples/reverse_proxy/rails_subapp/app/controllers/home_controller.rb +4 -0
  323. data/examples/reverse_proxy/rails_subapp/app/helpers/application_helper.rb +2 -0
  324. data/examples/reverse_proxy/rails_subapp/app/helpers/articles_helper.rb +2 -0
  325. data/examples/reverse_proxy/rails_subapp/app/helpers/home_helper.rb +2 -0
  326. data/examples/reverse_proxy/rails_subapp/app/javascript/application.js +3 -0
  327. data/examples/reverse_proxy/rails_subapp/app/javascript/controllers/application.js +9 -0
  328. data/examples/reverse_proxy/rails_subapp/app/javascript/controllers/hello_controller.js +7 -0
  329. data/examples/reverse_proxy/rails_subapp/app/javascript/controllers/index.js +4 -0
  330. data/examples/reverse_proxy/rails_subapp/app/jobs/application_job.rb +7 -0
  331. data/examples/reverse_proxy/rails_subapp/app/mailers/application_mailer.rb +4 -0
  332. data/examples/reverse_proxy/rails_subapp/app/models/application_record.rb +3 -0
  333. data/examples/reverse_proxy/rails_subapp/app/models/article.rb +2 -0
  334. data/examples/reverse_proxy/rails_subapp/app/models/concerns/.keep +0 -0
  335. data/examples/reverse_proxy/rails_subapp/app/views/articles/_article.html.erb +14 -0
  336. data/examples/reverse_proxy/rails_subapp/app/views/articles/_article.json.jbuilder +2 -0
  337. data/examples/reverse_proxy/rails_subapp/app/views/articles/_form.html.erb +30 -0
  338. data/examples/reverse_proxy/rails_subapp/app/views/articles/edit.html.erb +12 -0
  339. data/examples/reverse_proxy/rails_subapp/app/views/articles/index.html.erb +29 -0
  340. data/examples/reverse_proxy/rails_subapp/app/views/articles/index.json.jbuilder +1 -0
  341. data/examples/reverse_proxy/rails_subapp/app/views/articles/new.html.erb +11 -0
  342. data/examples/reverse_proxy/rails_subapp/app/views/articles/show.html.erb +10 -0
  343. data/examples/reverse_proxy/rails_subapp/app/views/articles/show.json.jbuilder +1 -0
  344. data/examples/reverse_proxy/rails_subapp/app/views/home/index.html.erb +8 -0
  345. data/examples/reverse_proxy/rails_subapp/app/views/layouts/application.html.erb +34 -0
  346. data/examples/reverse_proxy/rails_subapp/app/views/layouts/mailer.html.erb +13 -0
  347. data/examples/reverse_proxy/rails_subapp/app/views/layouts/mailer.text.erb +1 -0
  348. data/examples/reverse_proxy/rails_subapp/app/views/pwa/manifest.json.erb +22 -0
  349. data/examples/reverse_proxy/rails_subapp/app/views/pwa/service-worker.js +26 -0
  350. data/examples/reverse_proxy/rails_subapp/bin/brakeman +7 -0
  351. data/examples/reverse_proxy/rails_subapp/bin/bundle +109 -0
  352. data/examples/reverse_proxy/rails_subapp/bin/dev +2 -0
  353. data/examples/reverse_proxy/rails_subapp/bin/docker-entrypoint +14 -0
  354. data/examples/reverse_proxy/rails_subapp/bin/importmap +4 -0
  355. data/examples/reverse_proxy/rails_subapp/bin/jobs +6 -0
  356. data/examples/reverse_proxy/rails_subapp/bin/kamal +27 -0
  357. data/examples/reverse_proxy/rails_subapp/bin/rails +4 -0
  358. data/examples/reverse_proxy/rails_subapp/bin/rake +4 -0
  359. data/examples/reverse_proxy/rails_subapp/bin/rubocop +8 -0
  360. data/examples/reverse_proxy/rails_subapp/bin/setup +34 -0
  361. data/examples/reverse_proxy/rails_subapp/bin/thrust +5 -0
  362. data/examples/reverse_proxy/rails_subapp/config/application.rb +26 -0
  363. data/examples/reverse_proxy/rails_subapp/config/boot.rb +4 -0
  364. data/examples/reverse_proxy/rails_subapp/config/cable.yml +17 -0
  365. data/examples/reverse_proxy/rails_subapp/config/cache.yml +16 -0
  366. data/examples/reverse_proxy/rails_subapp/config/credentials.yml.enc +1 -0
  367. data/examples/reverse_proxy/rails_subapp/config/database.yml +41 -0
  368. data/examples/reverse_proxy/rails_subapp/config/deploy.yml +116 -0
  369. data/examples/reverse_proxy/rails_subapp/config/environment.rb +5 -0
  370. data/examples/reverse_proxy/rails_subapp/config/environments/development.rb +72 -0
  371. data/examples/reverse_proxy/rails_subapp/config/environments/production.rb +90 -0
  372. data/examples/reverse_proxy/rails_subapp/config/environments/test.rb +53 -0
  373. data/examples/reverse_proxy/rails_subapp/config/importmap.rb +7 -0
  374. data/examples/reverse_proxy/rails_subapp/config/initializers/assets.rb +7 -0
  375. data/examples/reverse_proxy/rails_subapp/config/initializers/content_security_policy.rb +25 -0
  376. data/examples/reverse_proxy/rails_subapp/config/initializers/filter_parameter_logging.rb +8 -0
  377. data/examples/reverse_proxy/rails_subapp/config/initializers/inflections.rb +16 -0
  378. data/examples/reverse_proxy/rails_subapp/config/locales/en.yml +31 -0
  379. data/examples/reverse_proxy/rails_subapp/config/puma.rb +41 -0
  380. data/examples/reverse_proxy/rails_subapp/config/queue.yml +18 -0
  381. data/examples/reverse_proxy/rails_subapp/config/recurring.yml +10 -0
  382. data/examples/reverse_proxy/rails_subapp/config/routes.rb +17 -0
  383. data/examples/reverse_proxy/rails_subapp/config/storage.yml +34 -0
  384. data/examples/reverse_proxy/rails_subapp/config.ru +6 -0
  385. data/examples/reverse_proxy/rails_subapp/db/cable_schema.rb +11 -0
  386. data/examples/reverse_proxy/rails_subapp/db/cache_schema.rb +14 -0
  387. data/examples/reverse_proxy/rails_subapp/db/migrate/20250422211855_create_articles.rb +10 -0
  388. data/examples/reverse_proxy/rails_subapp/db/queue_schema.rb +129 -0
  389. data/examples/reverse_proxy/rails_subapp/db/schema.rb +20 -0
  390. data/examples/reverse_proxy/rails_subapp/db/seeds.rb +9 -0
  391. data/examples/reverse_proxy/rails_subapp/lib/tasks/.keep +0 -0
  392. data/examples/reverse_proxy/rails_subapp/log/.keep +0 -0
  393. data/examples/reverse_proxy/rails_subapp/public/400.html +114 -0
  394. data/examples/reverse_proxy/rails_subapp/public/404.html +114 -0
  395. data/examples/reverse_proxy/rails_subapp/public/406-unsupported-browser.html +114 -0
  396. data/examples/reverse_proxy/rails_subapp/public/422.html +114 -0
  397. data/examples/reverse_proxy/rails_subapp/public/500.html +114 -0
  398. data/examples/reverse_proxy/rails_subapp/public/icon.png +0 -0
  399. data/examples/reverse_proxy/rails_subapp/public/icon.svg +3 -0
  400. data/examples/reverse_proxy/rails_subapp/public/robots.txt +1 -0
  401. data/examples/reverse_proxy/rails_subapp/script/.keep +0 -0
  402. data/examples/reverse_proxy/rails_subapp/storage/.keep +0 -0
  403. data/examples/reverse_proxy/rails_subapp/test/application_system_test_case.rb +5 -0
  404. data/examples/reverse_proxy/rails_subapp/test/controllers/.keep +0 -0
  405. data/examples/reverse_proxy/rails_subapp/test/controllers/articles_controller_test.rb +48 -0
  406. data/examples/reverse_proxy/rails_subapp/test/controllers/home_controller_test.rb +8 -0
  407. data/examples/reverse_proxy/rails_subapp/test/fixtures/articles.yml +9 -0
  408. data/examples/reverse_proxy/rails_subapp/test/fixtures/files/.keep +0 -0
  409. data/examples/reverse_proxy/rails_subapp/test/helpers/.keep +0 -0
  410. data/examples/reverse_proxy/rails_subapp/test/integration/.keep +0 -0
  411. data/examples/reverse_proxy/rails_subapp/test/mailers/.keep +0 -0
  412. data/examples/reverse_proxy/rails_subapp/test/models/.keep +0 -0
  413. data/examples/reverse_proxy/rails_subapp/test/models/article_test.rb +7 -0
  414. data/examples/reverse_proxy/rails_subapp/test/system/.keep +0 -0
  415. data/examples/reverse_proxy/rails_subapp/test/system/articles_test.rb +43 -0
  416. data/examples/reverse_proxy/rails_subapp/test/test_helper.rb +15 -0
  417. data/examples/reverse_proxy/rails_subapp/tmp/.keep +0 -0
  418. data/examples/reverse_proxy/rails_subapp/tmp/pids/.keep +0 -0
  419. data/examples/reverse_proxy/rails_subapp/tmp/storage/.keep +0 -0
  420. data/examples/reverse_proxy/rails_subapp/vendor/.keep +0 -0
  421. data/examples/reverse_proxy/rails_subapp/vendor/javascript/.keep +0 -0
  422. data/examples/reverse_proxy/sinatra_subapp/Gemfile +2 -0
  423. data/examples/reverse_proxy/sinatra_subapp/Gemfile.lock +46 -0
  424. data/examples/reverse_proxy/sinatra_subapp/config.ru +2 -0
  425. data/examples/reverse_proxy/sinatra_subapp/my_app.rb +96 -0
  426. data/examples/simple_api/Itsi.rb +127 -0
  427. data/examples/simple_api_no_schema/Itsi.rb +86 -0
  428. data/examples/spa/Itsi.rb +5 -0
  429. data/examples/spa/README.md +3 -0
  430. data/examples/spa/dist/assets/index-2cf7be43.js +40 -0
  431. data/examples/spa/dist/index.html +13 -0
  432. data/examples/spa/index.html +12 -0
  433. data/examples/spa/package-lock.json +1265 -0
  434. data/examples/spa/package.json +18 -0
  435. data/examples/spa/src/App.jsx +49 -0
  436. data/examples/spa/src/main.jsx +6 -0
  437. data/examples/spa/src/pages/About.jsx +9 -0
  438. data/examples/spa/src/pages/Home.jsx +9 -0
  439. data/examples/spa/vite.config.js +9 -0
  440. data/gems/scheduler/Cargo.lock +1 -1
  441. data/gems/scheduler/lib/itsi/scheduler/version.rb +1 -1
  442. data/gems/server/Cargo.lock +1 -1
  443. data/gems/server/lib/itsi/server/config/dsl.rb +2 -2
  444. data/gems/server/lib/itsi/server/config/middleware/endpoint/endpoint.rb +0 -4
  445. data/gems/server/lib/itsi/server/config/middleware/location.rb +25 -21
  446. data/gems/server/lib/itsi/server/config/middleware/proxy.rb +15 -14
  447. data/gems/server/lib/itsi/server/config/middleware/rackup_file.rb +7 -10
  448. data/gems/server/lib/itsi/server/config/middleware/static_assets.rb +8 -4
  449. data/gems/server/lib/itsi/server/config/middleware/string_rewrite.md +14 -0
  450. data/gems/server/lib/itsi/server/config/options/include.rb +1 -1
  451. data/gems/server/lib/itsi/server/rack_interface.rb +1 -1
  452. data/gems/server/lib/itsi/server/route_tester.rb +1 -1
  453. data/gems/server/lib/itsi/server/typed_handlers/param_parser.rb +25 -0
  454. data/gems/server/lib/itsi/server/version.rb +1 -1
  455. data/gems/server/lib/itsi/server.rb +1 -1
  456. data/gems/server/test/middleware/static_assets.rb +6 -4
  457. data/gems/server/test/middleware/string_rewrite.rb +54 -0
  458. data/gems/server/test/middleware/test_log_requests.rb +13 -1
  459. data/lib/itsi/version.rb +1 -1
  460. metadata +431 -5
@@ -0,0 +1,114 @@
1
+ <!doctype html>
2
+
3
+ <html lang="en">
4
+
5
+ <head>
6
+
7
+ <title>We’re sorry, but something went wrong (500 Internal Server Error)</title>
8
+
9
+ <meta charset="utf-8">
10
+ <meta name="viewport" content="initial-scale=1, width=device-width">
11
+ <meta name="robots" content="noindex, nofollow">
12
+
13
+ <style>
14
+
15
+ *, *::before, *::after {
16
+ box-sizing: border-box;
17
+ }
18
+
19
+ * {
20
+ margin: 0;
21
+ }
22
+
23
+ html {
24
+ font-size: 16px;
25
+ }
26
+
27
+ body {
28
+ background: #FFF;
29
+ color: #261B23;
30
+ display: grid;
31
+ font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Aptos, Roboto, "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
32
+ font-size: clamp(1rem, 2.5vw, 2rem);
33
+ -webkit-font-smoothing: antialiased;
34
+ font-style: normal;
35
+ font-weight: 400;
36
+ letter-spacing: -0.0025em;
37
+ line-height: 1.4;
38
+ min-height: 100vh;
39
+ place-items: center;
40
+ text-rendering: optimizeLegibility;
41
+ -webkit-text-size-adjust: 100%;
42
+ }
43
+
44
+ a {
45
+ color: inherit;
46
+ font-weight: 700;
47
+ text-decoration: underline;
48
+ text-underline-offset: 0.0925em;
49
+ }
50
+
51
+ b, strong {
52
+ font-weight: 700;
53
+ }
54
+
55
+ i, em {
56
+ font-style: italic;
57
+ }
58
+
59
+ main {
60
+ display: grid;
61
+ gap: 1em;
62
+ padding: 2em;
63
+ place-items: center;
64
+ text-align: center;
65
+ }
66
+
67
+ main header {
68
+ width: min(100%, 12em);
69
+ }
70
+
71
+ main header svg {
72
+ height: auto;
73
+ max-width: 100%;
74
+ width: 100%;
75
+ }
76
+
77
+ main article {
78
+ width: min(100%, 30em);
79
+ }
80
+
81
+ main article p {
82
+ font-size: 75%;
83
+ }
84
+
85
+ main article br {
86
+
87
+ display: none;
88
+
89
+ @media(min-width: 48em) {
90
+ display: inline;
91
+ }
92
+
93
+ }
94
+
95
+ </style>
96
+
97
+ </head>
98
+
99
+ <body>
100
+
101
+ <!-- This file lives in public/500.html -->
102
+
103
+ <main>
104
+ <header>
105
+ <svg height="172" viewBox="0 0 480 172" width="480" xmlns="http://www.w3.org/2000/svg"><path d="m101.23 93.8427c-8.1103 0-15.4098 3.7849-19.7354 8.3813h-36.2269v-99.21891h103.8143v37.03791h-68.3984v24.8722c5.1366-2.7035 15.1396-5.9477 24.6014-5.9477 35.146 0 56.233 22.7094 56.233 55.4215 0 34.605-23.791 57.315-60.558 57.315-37.8492 0-61.64-22.169-63.8028-55.963h42.9857c1.0814 10.814 9.1919 19.195 21.6281 19.195 11.355 0 19.465-8.381 19.465-20.547 0-11.625-7.299-20.5463-20.006-20.5463zm138.833 77.8613c-40.822 0-64.884-35.146-64.884-85.7015 0-50.5554 24.062-85.700907 64.884-85.700907 40.823 0 64.884 35.145507 64.884 85.700907 0 50.5555-24.061 85.7015-64.884 85.7015zm0-133.2831c-17.572 0-22.709 21.8984-22.709 47.5816 0 25.6835 5.137 47.5815 22.709 47.5815 17.303 0 22.71-21.898 22.71-47.5815 0-25.6832-5.407-47.5816-22.71-47.5816zm140.456 133.2831c-40.823 0-64.884-35.146-64.884-85.7015 0-50.5554 24.061-85.700907 64.884-85.700907 40.822 0 64.884 35.145507 64.884 85.700907 0 50.5555-24.062 85.7015-64.884 85.7015zm0-133.2831c-17.573 0-22.71 21.8984-22.71 47.5816 0 25.6835 5.137 47.5815 22.71 47.5815 17.302 0 22.709-21.898 22.709-47.5815 0-25.6832-5.407-47.5816-22.709-47.5816z" fill="#f0eff0"/><path d="m23.1377 68.9967v34.0033h-8.9162v-34.0033zm4.3157 34.0033v-24.921h8.6947v2.1598c1.3845-1.5506 3.8212-2.7136 6.701-2.7136 5.538 0 8.8054 3.5997 8.8054 9.1377v16.3371h-8.6393v-14.2327c0-2.049-1.0522-3.5443-3.2674-3.5443-1.7168 0-3.1567.9969-3.5997 2.7136v15.0634zm29.9913-8.5839v-9.5807h-3.655v-6.7564h3.655v-6.8671h8.5839v6.8671h5.2058v6.7564h-5.2058v8.307c0 1.9383.9415 2.769 2.6583 2.769.9414 0 1.9937-.2216 2.769-.5538v7.3654c-.9969.443-2.8798.775-4.8181.775-5.8703 0-9.1931-2.769-9.1931-9.0819zm32.3666-.1108h8.0301c-.8861 5.7597-5.2057 9.2487-11.6852 9.2487-7.6424 0-12.682-5.2613-12.682-13.0145 0-7.6978 5.3165-13.0143 12.5159-13.0143 7.6424 0 11.9621 5.095 11.9621 12.5159v2.1598h-16.1156c.2769 2.9905 1.8275 4.5965 4.3196 4.5965 1.7722 0 3.1567-.7753 3.6551-2.4921zm-3.8212-10.0237c-2.0491 0-3.4336 1.2737-3.9874 3.5997h7.5317c-.1107-2.0491-1.3845-3.5997-3.5443-3.5997zm31.4299-6.3134v8.3624c-1.052-.5538-2.215-.7753-3.599-.7753-2.382 0-3.988 1.0522-4.431 2.8244v14.6203h-8.694v-24.921h8.694v2.2152c1.219-1.6614 3.157-2.769 5.649-2.769 1.108 0 1.994.2215 2.381.443zm2.949 25.0318v-24.921h8.694v2.1598c1.385-1.5506 3.821-2.7136 6.701-2.7136 5.538 0 8.806 3.5997 8.806 9.1377v16.3371h-8.64v-14.2327c0-2.049-1.052-3.5443-3.267-3.5443-1.717 0-3.157.9969-3.6 2.7136v15.0634zm50.371 0h-8.363v-1.274c-.83.831-3.323 1.717-5.981 1.717-4.929 0-9.082-2.769-9.082-8.0301 0-4.818 4.153-7.9193 9.581-7.9193 2.049 0 4.485.6646 5.482 1.3845v-1.606c0-1.606-.941-2.9905-3.046-2.9905-1.606 0-2.547.7199-2.935 1.8275h-8.196c.72-4.8181 4.984-8.6393 11.408-8.6393 7.089 0 11.132 3.7659 11.132 10.2453zm-8.363-6.9779v-1.4399c-.554-1.0522-2.049-1.7167-3.655-1.7167-1.717 0-3.433.7199-3.433 2.3813 0 1.7168 1.716 2.4367 3.433 2.4367 1.606 0 3.101-.6645 3.655-1.6614zm20.742-29.0191v35.997h-8.694v-35.997zm13.036 25.9178h9.248c.72 2.326 2.714 3.489 5.483 3.489 2.713 0 4.596-1.163 4.596-3.2674 0-1.6061-1.052-2.326-3.212-2.8244l-6.534-1.3845c-4.985-1.1076-8.751-3.7105-8.751-9.47 0-6.6456 5.538-11.0206 13.07-11.0206 8.307 0 13.014 4.5411 13.956 10.4114h-8.695c-.72-1.8829-2.27-3.3228-5.205-3.3228-2.548 0-4.265 1.1076-4.265 2.9905 0 1.4953 1.052 2.326 2.825 2.7137l6.645 1.5506c5.815 1.3845 9.027 4.5412 9.027 9.8023 0 6.9778-5.87 10.9654-13.291 10.9654-8.141 0-13.679-3.9322-14.897-10.6332zm46.509 1.3845h8.031c-.887 5.7597-5.206 9.2487-11.686 9.2487-7.642 0-12.682-5.2613-12.682-13.0145 0-7.6978 5.317-13.0143 12.516-13.0143 7.643 0 11.962 5.095 11.962 12.5159v2.1598h-16.115c.277 2.9905 1.827 4.5965 4.319 4.5965 1.773 0 3.157-.7753 3.655-2.4921zm-3.821-10.0237c-2.049 0-3.433 1.2737-3.987 3.5997h7.532c-.111-2.0491-1.385-3.5997-3.545-3.5997zm31.431-6.3134v8.3624c-1.053-.5538-2.216-.7753-3.6-.7753-2.381 0-3.988 1.0522-4.431 2.8244v14.6203h-8.694v-24.921h8.694v2.2152c1.219-1.6614 3.157-2.769 5.649-2.769 1.108 0 1.994.2215 2.382.443zm18.288 25.0318h-7.809l-9.47-24.921h8.861l4.763 14.288 4.652-14.288h8.528zm25.614-8.6947h8.03c-.886 5.7597-5.206 9.2487-11.685 9.2487-7.642 0-12.682-5.2613-12.682-13.0145 0-7.6978 5.316-13.0143 12.516-13.0143 7.642 0 11.962 5.095 11.962 12.5159v2.1598h-16.116c.277 2.9905 1.828 4.5965 4.32 4.5965 1.772 0 3.157-.7753 3.655-2.4921zm-3.821-10.0237c-2.049 0-3.434 1.2737-3.988 3.5997h7.532c-.111-2.0491-1.384-3.5997-3.544-3.5997zm31.43-6.3134v8.3624c-1.052-.5538-2.215-.7753-3.6-.7753-2.381 0-3.987 1.0522-4.43 2.8244v14.6203h-8.695v-24.921h8.695v2.2152c1.218-1.6614 3.157-2.769 5.649-2.769 1.107 0 1.993.2215 2.381.443zm13.703-8.9715h24.312v7.6424h-15.562v5.3165h14.232v7.4763h-14.232v5.8703h15.562v7.6978h-24.312zm44.667 8.9715v8.3624c-1.052-.5538-2.215-.7753-3.6-.7753-2.381 0-3.987 1.0522-4.43 2.8244v14.6203h-8.695v-24.921h8.695v2.2152c1.218-1.6614 3.156-2.769 5.648-2.769 1.108 0 1.994.2215 2.382.443zm19.673 0v8.3624c-1.053-.5538-2.216-.7753-3.6-.7753-2.381 0-3.987 1.0522-4.43 2.8244v14.6203h-8.695v-24.921h8.695v2.2152c1.218-1.6614 3.156-2.769 5.648-2.769 1.108 0 1.994.2215 2.382.443zm26.769 12.5713c0 7.6978-5.15 13.0145-12.737 13.0145-7.532 0-12.738-5.3167-12.738-13.0145s5.206-13.0143 12.738-13.0143c7.587 0 12.737 5.3165 12.737 13.0143zm-8.529 0c0-3.4336-1.495-5.8703-4.208-5.8703-2.659 0-4.154 2.4367-4.154 5.8703s1.495 5.8149 4.154 5.8149c2.713 0 4.208-2.3813 4.208-5.8149zm28.082-12.5713v8.3624c-1.052-.5538-2.215-.7753-3.6-.7753-2.381 0-3.987 1.0522-4.43 2.8244v14.6203h-8.695v-24.921h8.695v2.2152c1.218-1.6614 3.157-2.769 5.649-2.769 1.107 0 1.993.2215 2.381.443z" fill="#d30001"/></svg>
106
+ </header>
107
+ <article>
108
+ <p><strong>We’re sorry, but something went wrong.</strong><br> If you’re the application owner check the logs for more information.</p>
109
+ </article>
110
+ </main>
111
+
112
+ </body>
113
+
114
+ </html>
@@ -0,0 +1,3 @@
1
+ <svg width="512" height="512" xmlns="http://www.w3.org/2000/svg">
2
+ <circle cx="256" cy="256" r="256" fill="red"/>
3
+ </svg>
@@ -0,0 +1 @@
1
+ # See https://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file
File without changes
File without changes
@@ -0,0 +1,5 @@
1
+ require "test_helper"
2
+
3
+ class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
4
+ driven_by :selenium, using: :headless_chrome, screen_size: [ 1400, 1400 ]
5
+ end
@@ -0,0 +1,48 @@
1
+ require "test_helper"
2
+
3
+ class ArticlesControllerTest < ActionDispatch::IntegrationTest
4
+ setup do
5
+ @article = articles(:one)
6
+ end
7
+
8
+ test "should get index" do
9
+ get articles_url
10
+ assert_response :success
11
+ end
12
+
13
+ test "should get new" do
14
+ get new_article_url
15
+ assert_response :success
16
+ end
17
+
18
+ test "should create article" do
19
+ assert_difference("Article.count") do
20
+ post articles_url, params: { article: { body: @article.body, title: @article.title } }
21
+ end
22
+
23
+ assert_redirected_to article_url(Article.last)
24
+ end
25
+
26
+ test "should show article" do
27
+ get article_url(@article)
28
+ assert_response :success
29
+ end
30
+
31
+ test "should get edit" do
32
+ get edit_article_url(@article)
33
+ assert_response :success
34
+ end
35
+
36
+ test "should update article" do
37
+ patch article_url(@article), params: { article: { body: @article.body, title: @article.title } }
38
+ assert_redirected_to article_url(@article)
39
+ end
40
+
41
+ test "should destroy article" do
42
+ assert_difference("Article.count", -1) do
43
+ delete article_url(@article)
44
+ end
45
+
46
+ assert_redirected_to articles_url
47
+ end
48
+ end
@@ -0,0 +1,8 @@
1
+ require "test_helper"
2
+
3
+ class HomeControllerTest < ActionDispatch::IntegrationTest
4
+ test "should get index" do
5
+ get home_index_url
6
+ assert_response :success
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ # Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
2
+
3
+ one:
4
+ title: MyString
5
+ body: MyText
6
+
7
+ two:
8
+ title: MyString
9
+ body: MyText
@@ -0,0 +1,7 @@
1
+ require "test_helper"
2
+
3
+ class ArticleTest < ActiveSupport::TestCase
4
+ # test "the truth" do
5
+ # assert true
6
+ # end
7
+ end
@@ -0,0 +1,43 @@
1
+ require "application_system_test_case"
2
+
3
+ class ArticlesTest < ApplicationSystemTestCase
4
+ setup do
5
+ @article = articles(:one)
6
+ end
7
+
8
+ test "visiting the index" do
9
+ visit articles_url
10
+ assert_selector "h1", text: "Articles"
11
+ end
12
+
13
+ test "should create article" do
14
+ visit articles_url
15
+ click_on "New article"
16
+
17
+ fill_in "Body", with: @article.body
18
+ fill_in "Title", with: @article.title
19
+ click_on "Create Article"
20
+
21
+ assert_text "Article was successfully created"
22
+ click_on "Back"
23
+ end
24
+
25
+ test "should update Article" do
26
+ visit article_url(@article)
27
+ click_on "Edit this article", match: :first
28
+
29
+ fill_in "Body", with: @article.body
30
+ fill_in "Title", with: @article.title
31
+ click_on "Update Article"
32
+
33
+ assert_text "Article was successfully updated"
34
+ click_on "Back"
35
+ end
36
+
37
+ test "should destroy Article" do
38
+ visit article_url(@article)
39
+ click_on "Destroy this article", match: :first
40
+
41
+ assert_text "Article was successfully destroyed"
42
+ end
43
+ end
@@ -0,0 +1,15 @@
1
+ ENV["RAILS_ENV"] ||= "test"
2
+ require_relative "../config/environment"
3
+ require "rails/test_help"
4
+
5
+ module ActiveSupport
6
+ class TestCase
7
+ # Run tests in parallel with specified workers
8
+ parallelize(workers: :number_of_processors)
9
+
10
+ # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
11
+ fixtures :all
12
+
13
+ # Add more helper methods to be used by all tests here...
14
+ end
15
+ end
File without changes
File without changes
File without changes
@@ -0,0 +1,28 @@
1
+ # Make sure to run bundle install and bundle exec rails db:migrate before running this test.
2
+ #
3
+ # You can visit "/" to see an index to pick between the Rails and Sinatra app.
4
+ # Go to rails/articles
5
+
6
+ auto_reload_config! # Auto-reload the server configuration each time it changes.
7
+
8
+ # Example of how we can use string rewrite modifiers
9
+ location "/rails*" do
10
+ proxy to: "http://localhost:4000{path_and_query|strip_prefix:/rails}"
11
+ end
12
+ # We assume all assets are hosted by Rails in this simple example
13
+ location "/assets*" do
14
+ proxy to: "http://localhost:4000{path_and_query}"
15
+ end
16
+
17
+ # route sub-path requests to top level of sinatra app
18
+ location "/sinatra*" do
19
+ proxy to: "http://localhost:6000{path_and_query|strip_prefix:/sinatra}"
20
+ end
21
+ location "/api/status" do
22
+ proxy to: "http://localhost:6000{path_and_query}"
23
+ end
24
+
25
+ # Fallthrough
26
+ static_assets \
27
+ root_dir: "./",
28
+ not_found_behavior: {error: "not_found"}
@@ -0,0 +1,14 @@
1
+ ## Reverse Proxy (2 apps)
2
+ This example allows you to toggle between a Rails and Sinatra application hosted as separate services, using Itsi's reverse proxy feature.
3
+
4
+ Both can also be hosted using Itsi.
5
+
6
+ To launch these first, execute:
7
+
8
+ `(cd rails_subapp && bundle exec itsi --rackup_file config.ru -b http://0.0.0.0:4000)`
9
+ `(cd sinatra_subapp && bundle exec itsi --rackup_file config.ru -b http://0.0.0.0:6000)`
10
+
11
+
12
+ Then start the Proxy
13
+
14
+ `itsi`
@@ -0,0 +1,119 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Rack App Dashboard</title>
7
+ <!-- Load a nicer font -->
8
+ <link
9
+ href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;500;700&display=swap"
10
+ rel="stylesheet"
11
+ />
12
+ <style>
13
+ :root {
14
+ --bg-start: #0f2027;
15
+ --bg-end: #203a43;
16
+ --primary: #00d2ff;
17
+ --accent: #3a7bd5;
18
+ --text: #f0f4f8;
19
+ --card-bg: rgba(255, 255, 255, 0.05);
20
+ }
21
+
22
+ *, *::before, *::after {
23
+ box-sizing: border-box;
24
+ }
25
+
26
+ body {
27
+ margin: 0;
28
+ font-family: "Poppins", sans-serif;
29
+ background: linear-gradient(135deg, var(--bg-start), var(--bg-end));
30
+ color: var(--text);
31
+ min-height: 100vh;
32
+ display: grid;
33
+ place-items: center;
34
+ padding: 2rem;
35
+ }
36
+
37
+ .dashboard {
38
+ text-align: center;
39
+ max-width: 400px;
40
+ width: 100%;
41
+ }
42
+
43
+ .dashboard header {
44
+ margin-bottom: 2rem;
45
+ }
46
+
47
+ .dashboard h1 {
48
+ font-size: 1.75rem;
49
+ font-weight: 700;
50
+ margin: 0;
51
+ line-height: 1.2;
52
+ }
53
+
54
+ .links {
55
+ display: grid;
56
+ gap: 1rem;
57
+ }
58
+
59
+ .app-link {
60
+ display: block;
61
+ padding: 1rem 1.5rem;
62
+ font-weight: 500;
63
+ text-decoration: none;
64
+ color: var(--text);
65
+ background: var(--card-bg);
66
+ border: 2px solid transparent;
67
+ border-radius: 0.5rem;
68
+ position: relative;
69
+ overflow: hidden;
70
+ transition: border-color 0.3s ease, transform 0.3s ease;
71
+ }
72
+
73
+ .app-link::before {
74
+ content: "";
75
+ position: absolute;
76
+ top: 0; left: -100%;
77
+ width: 200%; height: 100%;
78
+ background: linear-gradient(
79
+ 90deg,
80
+ transparent,
81
+ rgba(255,255,255,0.1),
82
+ transparent
83
+ );
84
+ transform: skewX(-20deg);
85
+ transition: left 0.5s ease;
86
+ }
87
+
88
+ .app-link:hover {
89
+ border-color: var(--primary);
90
+ transform: translateY(-3px);
91
+ }
92
+
93
+ .app-link:hover::before {
94
+ left: 100%;
95
+ }
96
+
97
+ .app-link span {
98
+ display: inline-block;
99
+ position: relative;
100
+ z-index: 1;
101
+ }
102
+ </style>
103
+ </head>
104
+ <body>
105
+ <div class="dashboard">
106
+ <header>
107
+ <h1>Rack App Dashboard</h1>
108
+ </header>
109
+ <div class="links">
110
+ <a href="/rails" class="app-link">
111
+ <span>🚂 Rails App</span>
112
+ </a>
113
+ <a href="/sinatra" class="app-link">
114
+ <span🎩> Sinatra App</span>
115
+ </a>
116
+ </div>
117
+ </div>
118
+ </body>
119
+ </html>
@@ -0,0 +1,51 @@
1
+ # See https://docs.docker.com/engine/reference/builder/#dockerignore-file for more about ignoring files.
2
+
3
+ # Ignore git directory.
4
+ /.git/
5
+ /.gitignore
6
+
7
+ # Ignore bundler config.
8
+ /.bundle
9
+
10
+ # Ignore all environment files.
11
+ /.env*
12
+
13
+ # Ignore all default key files.
14
+ /config/master.key
15
+ /config/credentials/*.key
16
+
17
+ # Ignore all logfiles and tempfiles.
18
+ /log/*
19
+ /tmp/*
20
+ !/log/.keep
21
+ !/tmp/.keep
22
+
23
+ # Ignore pidfiles, but keep the directory.
24
+ /tmp/pids/*
25
+ !/tmp/pids/.keep
26
+
27
+ # Ignore storage (uploaded files in development and any SQLite databases).
28
+ /storage/*
29
+ !/storage/.keep
30
+ /tmp/storage/*
31
+ !/tmp/storage/.keep
32
+
33
+ # Ignore assets.
34
+ /node_modules/
35
+ /app/assets/builds/*
36
+ !/app/assets/builds/.keep
37
+ /public/assets
38
+
39
+ # Ignore CI service files.
40
+ /.github
41
+
42
+ # Ignore Kamal files.
43
+ /config/deploy*.yml
44
+ /.kamal
45
+
46
+ # Ignore development files
47
+ /.devcontainer
48
+
49
+ # Ignore Docker-related files
50
+ /.dockerignore
51
+ /Dockerfile*
@@ -0,0 +1,9 @@
1
+ # See https://git-scm.com/docs/gitattributes for more about git attribute files.
2
+
3
+ # Mark the database schema as having been generated.
4
+ db/schema.rb linguist-generated
5
+
6
+ # Mark any vendored files as having been vendored.
7
+ vendor/* linguist-vendored
8
+ config/credentials/*.yml.enc diff=rails_credentials
9
+ config/credentials.yml.enc diff=rails_credentials
@@ -0,0 +1,12 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: bundler
4
+ directory: "/"
5
+ schedule:
6
+ interval: daily
7
+ open-pull-requests-limit: 10
8
+ - package-ecosystem: github-actions
9
+ directory: "/"
10
+ schedule:
11
+ interval: daily
12
+ open-pull-requests-limit: 10
@@ -0,0 +1,90 @@
1
+ name: CI
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches: [ main ]
7
+
8
+ jobs:
9
+ scan_ruby:
10
+ runs-on: ubuntu-latest
11
+
12
+ steps:
13
+ - name: Checkout code
14
+ uses: actions/checkout@v4
15
+
16
+ - name: Set up Ruby
17
+ uses: ruby/setup-ruby@v1
18
+ with:
19
+ ruby-version: .ruby-version
20
+ bundler-cache: true
21
+
22
+ - name: Scan for common Rails security vulnerabilities using static analysis
23
+ run: bin/brakeman --no-pager
24
+
25
+ scan_js:
26
+ runs-on: ubuntu-latest
27
+
28
+ steps:
29
+ - name: Checkout code
30
+ uses: actions/checkout@v4
31
+
32
+ - name: Set up Ruby
33
+ uses: ruby/setup-ruby@v1
34
+ with:
35
+ ruby-version: .ruby-version
36
+ bundler-cache: true
37
+
38
+ - name: Scan for security vulnerabilities in JavaScript dependencies
39
+ run: bin/importmap audit
40
+
41
+ lint:
42
+ runs-on: ubuntu-latest
43
+ steps:
44
+ - name: Checkout code
45
+ uses: actions/checkout@v4
46
+
47
+ - name: Set up Ruby
48
+ uses: ruby/setup-ruby@v1
49
+ with:
50
+ ruby-version: .ruby-version
51
+ bundler-cache: true
52
+
53
+ - name: Lint code for consistent style
54
+ run: bin/rubocop -f github
55
+
56
+ test:
57
+ runs-on: ubuntu-latest
58
+
59
+ # services:
60
+ # redis:
61
+ # image: redis
62
+ # ports:
63
+ # - 6379:6379
64
+ # options: --health-cmd "redis-cli ping" --health-interval 10s --health-timeout 5s --health-retries 5
65
+ steps:
66
+ - name: Install packages
67
+ run: sudo apt-get update && sudo apt-get install --no-install-recommends -y build-essential git libyaml-dev pkg-config google-chrome-stable
68
+
69
+ - name: Checkout code
70
+ uses: actions/checkout@v4
71
+
72
+ - name: Set up Ruby
73
+ uses: ruby/setup-ruby@v1
74
+ with:
75
+ ruby-version: .ruby-version
76
+ bundler-cache: true
77
+
78
+ - name: Run tests
79
+ env:
80
+ RAILS_ENV: test
81
+ # REDIS_URL: redis://localhost:6379/0
82
+ run: bin/rails db:test:prepare test test:system
83
+
84
+ - name: Keep screenshots from failed system tests
85
+ uses: actions/upload-artifact@v4
86
+ if: failure()
87
+ with:
88
+ name: screenshots
89
+ path: ${{ github.workspace }}/tmp/screenshots
90
+ if-no-files-found: ignore
@@ -0,0 +1,34 @@
1
+ # See https://help.github.com/articles/ignoring-files for more about ignoring files.
2
+ #
3
+ # Temporary files generated by your text editor or operating system
4
+ # belong in git's global ignore instead:
5
+ # `$XDG_CONFIG_HOME/git/ignore` or `~/.config/git/ignore`
6
+
7
+ # Ignore bundler config.
8
+ /.bundle
9
+
10
+ # Ignore all environment files.
11
+ /.env*
12
+
13
+ # Ignore all logfiles and tempfiles.
14
+ /log/*
15
+ /tmp/*
16
+ !/log/.keep
17
+ !/tmp/.keep
18
+
19
+ # Ignore pidfiles, but keep the directory.
20
+ /tmp/pids/*
21
+ !/tmp/pids/
22
+ !/tmp/pids/.keep
23
+
24
+ # Ignore storage (uploaded files in development and any SQLite databases).
25
+ /storage/*
26
+ !/storage/.keep
27
+ /tmp/storage/*
28
+ !/tmp/storage/
29
+ !/tmp/storage/.keep
30
+
31
+ /public/assets
32
+
33
+ # Ignore master key for decrypting credentials and more.
34
+ /config/master.key
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+
3
+ echo "Docker set up on $KAMAL_HOSTS..."