itsi 0.1.14 → 0.1.18

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 (169) hide show
  1. checksums.yaml +4 -4
  2. data/Cargo.lock +124 -109
  3. data/Cargo.toml +6 -0
  4. data/crates/itsi_error/Cargo.toml +1 -0
  5. data/crates/itsi_error/src/lib.rs +100 -10
  6. data/crates/itsi_scheduler/src/itsi_scheduler.rs +1 -1
  7. data/crates/itsi_server/Cargo.toml +8 -10
  8. data/crates/itsi_server/src/default_responses/html/401.html +68 -0
  9. data/crates/itsi_server/src/default_responses/html/403.html +68 -0
  10. data/crates/itsi_server/src/default_responses/html/404.html +68 -0
  11. data/crates/itsi_server/src/default_responses/html/413.html +71 -0
  12. data/crates/itsi_server/src/default_responses/html/429.html +68 -0
  13. data/crates/itsi_server/src/default_responses/html/500.html +71 -0
  14. data/crates/itsi_server/src/default_responses/html/502.html +71 -0
  15. data/crates/itsi_server/src/default_responses/html/503.html +68 -0
  16. data/crates/itsi_server/src/default_responses/html/504.html +69 -0
  17. data/crates/itsi_server/src/default_responses/html/index.html +238 -0
  18. data/crates/itsi_server/src/default_responses/json/401.json +6 -0
  19. data/crates/itsi_server/src/default_responses/json/403.json +6 -0
  20. data/crates/itsi_server/src/default_responses/json/404.json +6 -0
  21. data/crates/itsi_server/src/default_responses/json/413.json +6 -0
  22. data/crates/itsi_server/src/default_responses/json/429.json +6 -0
  23. data/crates/itsi_server/src/default_responses/json/500.json +6 -0
  24. data/crates/itsi_server/src/default_responses/json/502.json +6 -0
  25. data/crates/itsi_server/src/default_responses/json/503.json +6 -0
  26. data/crates/itsi_server/src/default_responses/json/504.json +6 -0
  27. data/crates/itsi_server/src/default_responses/mod.rs +11 -0
  28. data/crates/itsi_server/src/lib.rs +58 -26
  29. data/crates/itsi_server/src/prelude.rs +2 -0
  30. data/crates/itsi_server/src/ruby_types/README.md +21 -0
  31. data/crates/itsi_server/src/ruby_types/itsi_body_proxy/mod.rs +8 -6
  32. data/crates/itsi_server/src/ruby_types/itsi_grpc_call.rs +344 -0
  33. data/crates/itsi_server/src/ruby_types/{itsi_grpc_stream → itsi_grpc_response_stream}/mod.rs +121 -73
  34. data/crates/itsi_server/src/ruby_types/itsi_http_request.rs +103 -40
  35. data/crates/itsi_server/src/ruby_types/itsi_http_response.rs +8 -5
  36. data/crates/itsi_server/src/ruby_types/itsi_server/file_watcher.rs +4 -4
  37. data/crates/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +37 -17
  38. data/crates/itsi_server/src/ruby_types/itsi_server.rs +4 -3
  39. data/crates/itsi_server/src/ruby_types/mod.rs +6 -13
  40. data/crates/itsi_server/src/server/{bind.rs → binds/bind.rs} +23 -4
  41. data/crates/itsi_server/src/server/{listener.rs → binds/listener.rs} +24 -10
  42. data/crates/itsi_server/src/server/binds/mod.rs +4 -0
  43. data/crates/itsi_server/src/server/{tls.rs → binds/tls.rs} +9 -4
  44. data/crates/itsi_server/src/server/http_message_types.rs +97 -0
  45. data/crates/itsi_server/src/server/io_stream.rs +2 -1
  46. data/crates/itsi_server/src/server/middleware_stack/middleware.rs +28 -16
  47. data/crates/itsi_server/src/server/middleware_stack/middlewares/allow_list.rs +17 -8
  48. data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_api_key.rs +47 -18
  49. data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_basic.rs +13 -9
  50. data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_jwt.rs +50 -29
  51. data/crates/itsi_server/src/server/middleware_stack/middlewares/cache_control.rs +5 -2
  52. data/crates/itsi_server/src/server/middleware_stack/middlewares/compression.rs +37 -48
  53. data/crates/itsi_server/src/server/middleware_stack/middlewares/cors.rs +25 -20
  54. data/crates/itsi_server/src/server/middleware_stack/middlewares/deny_list.rs +14 -7
  55. data/crates/itsi_server/src/server/middleware_stack/middlewares/error_response/default_responses.rs +190 -0
  56. data/crates/itsi_server/src/server/middleware_stack/middlewares/error_response.rs +125 -95
  57. data/crates/itsi_server/src/server/middleware_stack/middlewares/etag.rs +9 -5
  58. data/crates/itsi_server/src/server/middleware_stack/middlewares/header_interpretation.rs +1 -4
  59. data/crates/itsi_server/src/server/middleware_stack/middlewares/intrusion_protection.rs +25 -19
  60. data/crates/itsi_server/src/server/middleware_stack/middlewares/log_requests.rs +4 -4
  61. data/crates/itsi_server/src/server/middleware_stack/middlewares/max_body.rs +47 -0
  62. data/crates/itsi_server/src/server/middleware_stack/middlewares/mod.rs +9 -4
  63. data/crates/itsi_server/src/server/middleware_stack/middlewares/proxy.rs +260 -62
  64. data/crates/itsi_server/src/server/middleware_stack/middlewares/rate_limit.rs +29 -22
  65. data/crates/itsi_server/src/server/middleware_stack/middlewares/redirect.rs +6 -6
  66. data/crates/itsi_server/src/server/middleware_stack/middlewares/request_headers.rs +6 -5
  67. data/crates/itsi_server/src/server/middleware_stack/middlewares/response_headers.rs +4 -2
  68. data/crates/itsi_server/src/server/middleware_stack/middlewares/ruby_app.rs +51 -18
  69. data/crates/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs +31 -13
  70. data/crates/itsi_server/src/server/middleware_stack/middlewares/static_response.rs +55 -0
  71. data/crates/itsi_server/src/server/middleware_stack/middlewares/string_rewrite.rs +13 -8
  72. data/crates/itsi_server/src/server/middleware_stack/mod.rs +101 -69
  73. data/crates/itsi_server/src/server/mod.rs +3 -9
  74. data/crates/itsi_server/src/server/process_worker.rs +21 -3
  75. data/crates/itsi_server/src/server/request_job.rs +2 -2
  76. data/crates/itsi_server/src/server/serve_strategy/cluster_mode.rs +8 -3
  77. data/crates/itsi_server/src/server/serve_strategy/single_mode.rs +26 -26
  78. data/crates/itsi_server/src/server/signal.rs +24 -41
  79. data/crates/itsi_server/src/server/size_limited_incoming.rs +101 -0
  80. data/crates/itsi_server/src/server/thread_worker.rs +59 -28
  81. data/crates/itsi_server/src/services/itsi_http_service.rs +239 -0
  82. data/crates/itsi_server/src/services/mime_types.rs +1416 -0
  83. data/crates/itsi_server/src/services/mod.rs +6 -0
  84. data/crates/itsi_server/src/services/password_hasher.rs +83 -0
  85. data/crates/itsi_server/src/{server → services}/rate_limiter.rs +35 -31
  86. data/crates/itsi_server/src/{server → services}/static_file_server.rs +521 -181
  87. data/crates/itsi_tracing/src/lib.rs +145 -55
  88. data/{Itsi.rb → foo/Itsi.rb} +6 -9
  89. data/gems/scheduler/Cargo.lock +7 -0
  90. data/gems/scheduler/lib/itsi/scheduler/version.rb +1 -1
  91. data/gems/scheduler/test/helpers/test_helper.rb +0 -1
  92. data/gems/scheduler/test/test_address_resolve.rb +0 -1
  93. data/gems/scheduler/test/test_network_io.rb +1 -1
  94. data/gems/scheduler/test/test_process_wait.rb +0 -1
  95. data/gems/server/Cargo.lock +124 -109
  96. data/gems/server/exe/itsi +65 -19
  97. data/gems/server/itsi-server.gemspec +4 -3
  98. data/gems/server/lib/itsi/http_request/response_status_shortcodes.rb +74 -0
  99. data/gems/server/lib/itsi/http_request.rb +116 -17
  100. data/gems/server/lib/itsi/http_response.rb +2 -0
  101. data/gems/server/lib/itsi/passfile.rb +109 -0
  102. data/gems/server/lib/itsi/server/config/dsl.rb +160 -101
  103. data/gems/server/lib/itsi/server/config.rb +58 -23
  104. data/gems/server/lib/itsi/server/default_app/default_app.rb +25 -29
  105. data/gems/server/lib/itsi/server/default_app/index.html +113 -89
  106. data/gems/server/lib/itsi/server/{Itsi.rb → default_config/Itsi-rackup.rb} +1 -1
  107. data/gems/server/lib/itsi/server/default_config/Itsi.rb +107 -0
  108. data/gems/server/lib/itsi/server/grpc/grpc_call.rb +246 -0
  109. data/gems/server/lib/itsi/server/grpc/grpc_interface.rb +100 -0
  110. data/gems/server/lib/itsi/server/grpc/reflection/v1/reflection_pb.rb +26 -0
  111. data/gems/server/lib/itsi/server/grpc/reflection/v1/reflection_services_pb.rb +122 -0
  112. data/gems/server/lib/itsi/server/route_tester.rb +107 -0
  113. data/gems/server/lib/itsi/server/typed_handlers/param_parser.rb +200 -0
  114. data/gems/server/lib/itsi/server/typed_handlers/source_parser.rb +55 -0
  115. data/gems/server/lib/itsi/server/typed_handlers.rb +17 -0
  116. data/gems/server/lib/itsi/server/version.rb +1 -1
  117. data/gems/server/lib/itsi/server.rb +82 -12
  118. data/gems/server/lib/ruby_lsp/itsi/addon.rb +111 -0
  119. data/gems/server/lib/shell_completions/completions.rb +26 -0
  120. data/gems/server/test/helpers/test_helper.rb +2 -1
  121. data/lib/itsi/version.rb +1 -1
  122. data/sandbox/README.md +5 -0
  123. data/sandbox/itsi_file/Gemfile +4 -2
  124. data/sandbox/itsi_file/Gemfile.lock +48 -6
  125. data/sandbox/itsi_file/Itsi.rb +326 -129
  126. data/sandbox/itsi_file/call.json +1 -0
  127. data/sandbox/itsi_file/echo_client/Gemfile +10 -0
  128. data/sandbox/itsi_file/echo_client/Gemfile.lock +27 -0
  129. data/sandbox/itsi_file/echo_client/README.md +95 -0
  130. data/sandbox/itsi_file/echo_client/echo_client.rb +164 -0
  131. data/sandbox/itsi_file/echo_client/gen_proto.sh +17 -0
  132. data/sandbox/itsi_file/echo_client/lib/echo_pb.rb +16 -0
  133. data/sandbox/itsi_file/echo_client/lib/echo_services_pb.rb +29 -0
  134. data/sandbox/itsi_file/echo_client/run_client.rb +64 -0
  135. data/sandbox/itsi_file/echo_client/test_compressions.sh +20 -0
  136. data/sandbox/itsi_file/echo_service_nonitsi/Gemfile +10 -0
  137. data/sandbox/itsi_file/echo_service_nonitsi/Gemfile.lock +79 -0
  138. data/sandbox/itsi_file/echo_service_nonitsi/echo.proto +26 -0
  139. data/sandbox/itsi_file/echo_service_nonitsi/echo_pb.rb +16 -0
  140. data/sandbox/itsi_file/echo_service_nonitsi/echo_services_pb.rb +29 -0
  141. data/sandbox/itsi_file/echo_service_nonitsi/server.rb +52 -0
  142. data/sandbox/itsi_sandbox_async/config.ru +0 -1
  143. data/sandbox/itsi_sandbox_rack/Gemfile.lock +2 -2
  144. data/sandbox/itsi_sandbox_rails/Gemfile +2 -2
  145. data/sandbox/itsi_sandbox_rails/Gemfile.lock +76 -2
  146. data/sandbox/itsi_sandbox_rails/app/controllers/home_controller.rb +15 -0
  147. data/sandbox/itsi_sandbox_rails/config/environments/development.rb +1 -0
  148. data/sandbox/itsi_sandbox_rails/config/environments/production.rb +1 -0
  149. data/sandbox/itsi_sandbox_rails/config/routes.rb +2 -0
  150. data/sandbox/itsi_sinatra/app.rb +0 -1
  151. data/sandbox/static_files/.env +1 -0
  152. data/sandbox/static_files/404.html +25 -0
  153. data/sandbox/static_files/_DSC0102.NEF.jpg +0 -0
  154. data/sandbox/static_files/about.html +68 -0
  155. data/sandbox/static_files/tiny.html +1 -0
  156. data/sandbox/static_files/writebook.zip +0 -0
  157. data/tasks.txt +28 -33
  158. metadata +87 -26
  159. data/crates/itsi_error/src/from.rs +0 -68
  160. data/crates/itsi_server/src/ruby_types/itsi_grpc_request.rs +0 -147
  161. data/crates/itsi_server/src/ruby_types/itsi_grpc_response.rs +0 -19
  162. data/crates/itsi_server/src/server/itsi_service.rs +0 -172
  163. data/crates/itsi_server/src/server/middleware_stack/middlewares/grpc_service.rs +0 -72
  164. data/crates/itsi_server/src/server/types.rs +0 -43
  165. data/gems/server/lib/itsi/server/grpc_interface.rb +0 -213
  166. data/sandbox/itsi_file/public/assets/index.html +0 -1
  167. /data/crates/itsi_server/src/server/{bind_protocol.rs → binds/bind_protocol.rs} +0 -0
  168. /data/crates/itsi_server/src/server/{tls → binds/tls}/locked_dir_cache.rs +0 -0
  169. /data/crates/itsi_server/src/{server → services}/cache_store.rs +0 -0
@@ -56,12 +56,30 @@ dependencies = [
56
56
  "libc",
57
57
  ]
58
58
 
59
+ [[package]]
60
+ name = "anyhow"
61
+ version = "1.0.97"
62
+ source = "registry+https://github.com/rust-lang/crates.io-index"
63
+ checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f"
64
+
59
65
  [[package]]
60
66
  name = "arc-swap"
61
67
  version = "1.7.1"
62
68
  source = "registry+https://github.com/rust-lang/crates.io-index"
63
69
  checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457"
64
70
 
71
+ [[package]]
72
+ name = "argon2"
73
+ version = "0.5.3"
74
+ source = "registry+https://github.com/rust-lang/crates.io-index"
75
+ checksum = "3c3610892ee6e0cbce8ae2700349fcf8f98adb0dbfbee85aec3c9179d29cc072"
76
+ dependencies = [
77
+ "base64ct",
78
+ "blake2",
79
+ "cpufeatures",
80
+ "password-hash",
81
+ ]
82
+
65
83
  [[package]]
66
84
  name = "asn1-rs"
67
85
  version = "0.6.2"
@@ -122,6 +140,7 @@ dependencies = [
122
140
  "brotli",
123
141
  "flate2",
124
142
  "futures-core",
143
+ "futures-io",
125
144
  "memchr",
126
145
  "pin-project-lite",
127
146
  "tokio",
@@ -218,6 +237,25 @@ version = "0.22.1"
218
237
  source = "registry+https://github.com/rust-lang/crates.io-index"
219
238
  checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
220
239
 
240
+ [[package]]
241
+ name = "base64ct"
242
+ version = "1.7.3"
243
+ source = "registry+https://github.com/rust-lang/crates.io-index"
244
+ checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3"
245
+
246
+ [[package]]
247
+ name = "bcrypt"
248
+ version = "0.17.0"
249
+ source = "registry+https://github.com/rust-lang/crates.io-index"
250
+ checksum = "92758ad6077e4c76a6cadbce5005f666df70d4f13b19976b1a8062eef880040f"
251
+ dependencies = [
252
+ "base64",
253
+ "blowfish",
254
+ "getrandom 0.3.1",
255
+ "subtle",
256
+ "zeroize",
257
+ ]
258
+
221
259
  [[package]]
222
260
  name = "bindgen"
223
261
  version = "0.69.5"
@@ -253,6 +291,15 @@ version = "2.8.0"
253
291
  source = "registry+https://github.com/rust-lang/crates.io-index"
254
292
  checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36"
255
293
 
294
+ [[package]]
295
+ name = "blake2"
296
+ version = "0.10.6"
297
+ source = "registry+https://github.com/rust-lang/crates.io-index"
298
+ checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe"
299
+ dependencies = [
300
+ "digest",
301
+ ]
302
+
256
303
  [[package]]
257
304
  name = "block-buffer"
258
305
  version = "0.10.4"
@@ -262,6 +309,16 @@ dependencies = [
262
309
  "generic-array",
263
310
  ]
264
311
 
312
+ [[package]]
313
+ name = "blowfish"
314
+ version = "0.9.1"
315
+ source = "registry+https://github.com/rust-lang/crates.io-index"
316
+ checksum = "e412e2cd0f2b2d93e02543ceae7917b3c70331573df19ee046bcbc35e45e87d7"
317
+ dependencies = [
318
+ "byteorder",
319
+ "cipher",
320
+ ]
321
+
265
322
  [[package]]
266
323
  name = "brotli"
267
324
  version = "7.0.0"
@@ -299,6 +356,12 @@ version = "3.17.0"
299
356
  source = "registry+https://github.com/rust-lang/crates.io-index"
300
357
  checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
301
358
 
359
+ [[package]]
360
+ name = "byteorder"
361
+ version = "1.5.0"
362
+ source = "registry+https://github.com/rust-lang/crates.io-index"
363
+ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
364
+
302
365
  [[package]]
303
366
  name = "bytes"
304
367
  version = "1.10.1"
@@ -351,6 +414,16 @@ dependencies = [
351
414
  "windows-link",
352
415
  ]
353
416
 
417
+ [[package]]
418
+ name = "cipher"
419
+ version = "0.4.4"
420
+ source = "registry+https://github.com/rust-lang/crates.io-index"
421
+ checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad"
422
+ dependencies = [
423
+ "crypto-common",
424
+ "inout",
425
+ ]
426
+
354
427
  [[package]]
355
428
  name = "clang-sys"
356
429
  version = "1.8.1"
@@ -420,6 +493,17 @@ version = "0.8.7"
420
493
  source = "registry+https://github.com/rust-lang/crates.io-index"
421
494
  checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
422
495
 
496
+ [[package]]
497
+ name = "core_affinity"
498
+ version = "0.8.3"
499
+ source = "registry+https://github.com/rust-lang/crates.io-index"
500
+ checksum = "a034b3a7b624016c6e13f5df875747cc25f884156aad2abd12b6c46797971342"
501
+ dependencies = [
502
+ "libc",
503
+ "num_cpus",
504
+ "winapi",
505
+ ]
506
+
423
507
  [[package]]
424
508
  name = "cpufeatures"
425
509
  version = "0.2.17"
@@ -438,19 +522,6 @@ dependencies = [
438
522
  "cfg-if",
439
523
  ]
440
524
 
441
- [[package]]
442
- name = "crossbeam"
443
- version = "0.8.4"
444
- source = "registry+https://github.com/rust-lang/crates.io-index"
445
- checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8"
446
- dependencies = [
447
- "crossbeam-channel",
448
- "crossbeam-deque",
449
- "crossbeam-epoch",
450
- "crossbeam-queue",
451
- "crossbeam-utils",
452
- ]
453
-
454
525
  [[package]]
455
526
  name = "crossbeam-channel"
456
527
  version = "0.5.14"
@@ -479,15 +550,6 @@ dependencies = [
479
550
  "crossbeam-utils",
480
551
  ]
481
552
 
482
- [[package]]
483
- name = "crossbeam-queue"
484
- version = "0.3.12"
485
- source = "registry+https://github.com/rust-lang/crates.io-index"
486
- checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115"
487
- dependencies = [
488
- "crossbeam-utils",
489
- ]
490
-
491
553
  [[package]]
492
554
  name = "crossbeam-utils"
493
555
  version = "0.8.21"
@@ -504,20 +566,6 @@ dependencies = [
504
566
  "typenum",
505
567
  ]
506
568
 
507
- [[package]]
508
- name = "dashmap"
509
- version = "6.1.0"
510
- source = "registry+https://github.com/rust-lang/crates.io-index"
511
- checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf"
512
- dependencies = [
513
- "cfg-if",
514
- "crossbeam-utils",
515
- "hashbrown 0.14.5",
516
- "lock_api",
517
- "once_cell",
518
- "parking_lot_core",
519
- ]
520
-
521
569
  [[package]]
522
570
  name = "data-encoding"
523
571
  version = "2.8.0"
@@ -933,12 +981,6 @@ dependencies = [
933
981
  "tracing",
934
982
  ]
935
983
 
936
- [[package]]
937
- name = "hashbrown"
938
- version = "0.14.5"
939
- source = "registry+https://github.com/rust-lang/crates.io-index"
940
- checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
941
-
942
984
  [[package]]
943
985
  name = "hashbrown"
944
986
  version = "0.15.2"
@@ -960,15 +1002,6 @@ version = "0.3.9"
960
1002
  source = "registry+https://github.com/rust-lang/crates.io-index"
961
1003
  checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
962
1004
 
963
- [[package]]
964
- name = "hmac"
965
- version = "0.12.1"
966
- source = "registry+https://github.com/rust-lang/crates.io-index"
967
- checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
968
- dependencies = [
969
- "digest",
970
- ]
971
-
972
1005
  [[package]]
973
1006
  name = "home"
974
1007
  version = "0.5.11"
@@ -1012,12 +1045,6 @@ dependencies = [
1012
1045
  "pin-project-lite",
1013
1046
  ]
1014
1047
 
1015
- [[package]]
1016
- name = "http-range"
1017
- version = "0.1.5"
1018
- source = "registry+https://github.com/rust-lang/crates.io-index"
1019
- checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573"
1020
-
1021
1048
  [[package]]
1022
1049
  name = "httparse"
1023
1050
  version = "1.10.1"
@@ -1069,25 +1096,6 @@ dependencies = [
1069
1096
  "webpki-roots",
1070
1097
  ]
1071
1098
 
1072
- [[package]]
1073
- name = "hyper-staticfile"
1074
- version = "0.10.1"
1075
- source = "registry+https://github.com/rust-lang/crates.io-index"
1076
- checksum = "bc4bce64c32578957926e75f832032f81ebb30bcee74f86c5848b13a69e547eb"
1077
- dependencies = [
1078
- "futures-util",
1079
- "http",
1080
- "http-range",
1081
- "httpdate",
1082
- "hyper",
1083
- "mime_guess",
1084
- "percent-encoding",
1085
- "rand 0.8.5",
1086
- "tokio",
1087
- "url",
1088
- "winapi",
1089
- ]
1090
-
1091
1099
  [[package]]
1092
1100
  name = "hyper-tls"
1093
1101
  version = "0.6.0"
@@ -1292,7 +1300,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1292
1300
  checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652"
1293
1301
  dependencies = [
1294
1302
  "equivalent",
1295
- "hashbrown 0.15.2",
1303
+ "hashbrown",
1296
1304
  ]
1297
1305
 
1298
1306
  [[package]]
@@ -1315,6 +1323,15 @@ dependencies = [
1315
1323
  "libc",
1316
1324
  ]
1317
1325
 
1326
+ [[package]]
1327
+ name = "inout"
1328
+ version = "0.1.4"
1329
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1330
+ checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01"
1331
+ dependencies = [
1332
+ "generic-array",
1333
+ ]
1334
+
1318
1335
  [[package]]
1319
1336
  name = "ipnet"
1320
1337
  version = "2.11.0"
@@ -1338,30 +1355,28 @@ checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
1338
1355
 
1339
1356
  [[package]]
1340
1357
  name = "itsi-server"
1341
- version = "0.1.0"
1358
+ version = "0.1.18"
1342
1359
  dependencies = [
1360
+ "argon2",
1343
1361
  "async-channel",
1344
1362
  "async-compression",
1345
1363
  "async-trait",
1346
1364
  "base64",
1365
+ "bcrypt",
1347
1366
  "bytes",
1348
1367
  "chrono",
1349
- "crossbeam",
1350
- "dashmap",
1368
+ "core_affinity",
1351
1369
  "derive_more",
1352
1370
  "dirs",
1353
1371
  "either",
1354
- "fnv",
1355
1372
  "fs2",
1356
1373
  "futures",
1357
1374
  "globset",
1358
- "hmac",
1359
1375
  "http",
1360
1376
  "http-body-util",
1361
1377
  "httparse",
1362
1378
  "httpdate",
1363
1379
  "hyper",
1364
- "hyper-staticfile",
1365
1380
  "hyper-util",
1366
1381
  "itsi_error",
1367
1382
  "itsi_rb_helpers",
@@ -1374,20 +1389,19 @@ dependencies = [
1374
1389
  "notify",
1375
1390
  "num_cpus",
1376
1391
  "parking_lot",
1392
+ "percent-encoding",
1377
1393
  "pin-project",
1378
1394
  "rand 0.9.0",
1379
- "rb-sys",
1380
1395
  "rcgen",
1381
1396
  "redis",
1382
1397
  "regex",
1383
1398
  "reqwest",
1384
- "ring",
1385
- "route-recognizer",
1386
1399
  "rustls",
1387
1400
  "rustls-pemfile",
1388
1401
  "serde",
1389
1402
  "serde_json",
1390
1403
  "serde_magnus",
1404
+ "sha-crypt",
1391
1405
  "sha2",
1392
1406
  "socket2",
1393
1407
  "sysinfo",
@@ -1399,13 +1413,13 @@ dependencies = [
1399
1413
  "tokio-util",
1400
1414
  "tracing",
1401
1415
  "url",
1402
- "uuid",
1403
1416
  ]
1404
1417
 
1405
1418
  [[package]]
1406
1419
  name = "itsi_error"
1407
1420
  version = "0.1.0"
1408
1421
  dependencies = [
1422
+ "anyhow",
1409
1423
  "httparse",
1410
1424
  "magnus",
1411
1425
  "nix",
@@ -1635,16 +1649,6 @@ version = "0.3.17"
1635
1649
  source = "registry+https://github.com/rust-lang/crates.io-index"
1636
1650
  checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
1637
1651
 
1638
- [[package]]
1639
- name = "mime_guess"
1640
- version = "2.0.5"
1641
- source = "registry+https://github.com/rust-lang/crates.io-index"
1642
- checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e"
1643
- dependencies = [
1644
- "mime",
1645
- "unicase",
1646
- ]
1647
-
1648
1652
  [[package]]
1649
1653
  name = "minimal-lexical"
1650
1654
  version = "0.2.1"
@@ -1928,6 +1932,17 @@ dependencies = [
1928
1932
  "windows-targets 0.52.6",
1929
1933
  ]
1930
1934
 
1935
+ [[package]]
1936
+ name = "password-hash"
1937
+ version = "0.5.0"
1938
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1939
+ checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166"
1940
+ dependencies = [
1941
+ "base64ct",
1942
+ "rand_core 0.6.4",
1943
+ "subtle",
1944
+ ]
1945
+
1931
1946
  [[package]]
1932
1947
  name = "paste"
1933
1948
  version = "1.0.15"
@@ -2381,12 +2396,6 @@ dependencies = [
2381
2396
  "windows-sys 0.52.0",
2382
2397
  ]
2383
2398
 
2384
- [[package]]
2385
- name = "route-recognizer"
2386
- version = "0.3.1"
2387
- source = "registry+https://github.com/rust-lang/crates.io-index"
2388
- checksum = "afab94fb28594581f62d981211a9a4d53cc8130bbcbbb89a0440d9b8e81a7746"
2389
-
2390
2399
  [[package]]
2391
2400
  name = "rustc-demangle"
2392
2401
  version = "0.1.24"
@@ -2661,6 +2670,18 @@ dependencies = [
2661
2670
  "serde",
2662
2671
  ]
2663
2672
 
2673
+ [[package]]
2674
+ name = "sha-crypt"
2675
+ version = "0.5.0"
2676
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2677
+ checksum = "88e79009728d8311d42d754f2f319a975f9e38f156fd5e422d2451486c78b286"
2678
+ dependencies = [
2679
+ "base64ct",
2680
+ "rand 0.8.5",
2681
+ "sha2",
2682
+ "subtle",
2683
+ ]
2684
+
2664
2685
  [[package]]
2665
2686
  name = "sha1_smol"
2666
2687
  version = "1.0.1"
@@ -3181,12 +3202,6 @@ version = "1.18.0"
3181
3202
  source = "registry+https://github.com/rust-lang/crates.io-index"
3182
3203
  checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
3183
3204
 
3184
- [[package]]
3185
- name = "unicase"
3186
- version = "2.8.1"
3187
- source = "registry+https://github.com/rust-lang/crates.io-index"
3188
- checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539"
3189
-
3190
3205
  [[package]]
3191
3206
  name = "unicode-ident"
3192
3207
  version = "1.0.17"
data/gems/server/exe/itsi CHANGED
@@ -4,28 +4,48 @@
4
4
  require "itsi/server"
5
5
  require "optparse"
6
6
 
7
- Itsi::Server::Config.save_argv!
7
+
8
+ COMMANDS = {
9
+ "init" => "Initialize a new Itsi.rb server configuration file",
10
+ "status" => "Show the status of the server",
11
+ "start" => "Start the Isti server",
12
+ "serve" => "Start the Isti server",
13
+ "stop" => "Stop the server",
14
+ "reload" => "Reload the server",
15
+ "restart" => "Restart the server",
16
+ "add_worker" => "Add a new worker to the server cluster",
17
+ "remove_worker" => "Remove a worker from the server cluster",
18
+ "routes" => "Print the routes of the server",
19
+ "passfile" => "Manage hashed users and passwords in a passfile (like .htpasswd). [add, remove, list]",
20
+ "test_route" => "Test which route a request will be routed to",
21
+ "static" => "Serve static assets in the given directory"
22
+ }
23
+
24
+ Itsi::Server::Config.prep_reexec!
8
25
 
9
26
  options = {}
10
27
 
11
- OptionParser.new do |opts|
12
- opts.banner = "Usage: itsi [options]"
28
+ parser = OptionParser.new do |opts|
29
+ opts.banner = "Usage: itsi [COMMAND] [options]"
13
30
 
14
31
  opts.on("-C", "--config CONFIG_FILE", String, "Itsi Configuration file to use (default: Itsi.rb)") do |config_file|
15
32
  options[:config_file] = config_file
16
33
  end
17
34
 
18
- opts.on("-w", "--workers WORKERS", Integer, "Number of workers (default: #{Etc.nprocessors})") do |w|
35
+ opts.on("-w", "--workers WORKERS", Integer, "Number of workers") do |w|
19
36
  options[:workers] = w
20
37
  end
21
38
 
39
+ opts.on("-d", "--daemonize", "Run the process as a daemon") do
40
+ Process.daemon(true)
41
+ end
42
+
22
43
  opts.on("-t", "--threads THREADS", Integer, "Number of threads (default: 1)") do |t|
23
44
  options[:threads] = t
24
45
  end
25
46
 
26
- opts.on("-mtr", "--multithreaded-reactor true/false", String,
27
- "Use a multithreaded reactor (default: true)") do |mtr|
28
- options[:multithreaded_reactor] = mtr.to_s == "true"
47
+ opts.on("--[no-]multithreaded-reactor", "Use a multithreaded reactor") do |mtr|
48
+ options[:multithreaded_reactor] = mtr
29
49
  end
30
50
 
31
51
  opts.on("-r", "--rackup_file FILE", String, "Rackup file to use (default: config.ru)") do |rf|
@@ -97,9 +117,6 @@ OptionParser.new do |opts|
97
117
  options[:shutdown_timeout] = shutdown_timeout
98
118
  end
99
119
 
100
- opts.on("--script_name SCRIPT_NAME", String, "Script name to inject into Rack ENV") do |script_name|
101
- options[:script_name] = script_name
102
- end
103
120
 
104
121
  opts.on("--stream-body", TrueClass, "Stream body frames (default: false for best compatibility)") do |stream_body|
105
122
  options[:stream_body] = stream_body
@@ -107,6 +124,10 @@ OptionParser.new do |opts|
107
124
 
108
125
  opts.on("-h", "--help", "Show this help message") do
109
126
  puts opts
127
+ puts "COMMAND: "
128
+ COMMANDS.each do |command, description|
129
+ puts " #{command} - #{description}"
130
+ end
110
131
  exit
111
132
  end
112
133
 
@@ -117,17 +138,42 @@ OptionParser.new do |opts|
117
138
  opts.on("--listeners LISTENERS", String, "Listeners for reexec") do |listeners|
118
139
  options[:listeners] = listeners
119
140
  end
120
- end.parse!
121
141
 
142
+ opts.on("--passfile PASSFILE", String, "Passfile") do |passfile|
143
+ options[:passfile] = passfile
144
+ end
145
+
146
+ opts.on("--algorithm ALGORITHM", String, "Algorithm for password hashing") do |algorithm|
147
+ options[:algorithm] = algorithm
148
+ end
149
+ end
150
+
151
+ if ENV['COMP_LINE'] || ARGV.include?('--completion')
152
+ puts COMMANDS.keys
153
+ exit
154
+ end
122
155
 
123
- case (command = ARGV.pop)
124
- when "init"
125
- Itsi::Server::Config.write_default
126
- exit(0)
127
- when "reload", "restart", "down", "up", "add_worker", "remove_worker", "status"
128
- Itsi::Server.send(command)
129
- when nil, "start", "serve"
156
+ parser.parse!
157
+
158
+ case (command = ARGV.shift)
159
+ when *COMMANDS.keys
160
+ required_arity = Itsi::Server.method(command).parameters&.select{|c| c.first == :req }&.length&.succ || 2
161
+ case required_arity
162
+ when 1 then Itsi::Server.send(command)
163
+ when 2 then Itsi::Server.send(command, options)
164
+ else
165
+ if ARGV.length != required_arity - 2
166
+ puts "Command #{command} requires #{required_arity - 2} subcommands. "
167
+ exit(0)
168
+ end
169
+ Itsi::Server.send(command, options, *ARGV)
170
+ end
171
+ when nil
130
172
  Itsi::Server.start(options)
131
173
  else
132
- puts "Invalid command #{command}"
174
+ puts "Invalid command #{command}.\n"
175
+ puts "COMMAND: "
176
+ COMMANDS.each do |command, description|
177
+ puts " #{command} - #{description}"
178
+ end
133
179
  end
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
27
27
  (f == gemspec) ||
28
28
  f.start_with?(*%w[bin/ test/ spec/ features/ .git appveyor Gemfile])
29
29
  end
30
- end + Dir["../../crates/**/*.{toml,rs,lock}"].map do |ext_file|
30
+ end + Dir["../../crates/**/*.{toml,rs,lock,html,json}"].map do |ext_file|
31
31
  "ext/#{ext_file[%r{.*crates/(.*?)$}, 1]}"
32
32
  end.compact
33
33
 
@@ -36,10 +36,11 @@ Gem::Specification.new do |spec|
36
36
  spec.require_paths = ["lib"]
37
37
  spec.extensions = ["ext/itsi_server/extconf.rb"]
38
38
 
39
- # Uncomment to register a new dependency of your gem
40
- # spec.add_dependency "example-gem", "~> 1.0"
41
39
  spec.add_dependency "rack", ">= 1.6"
40
+ spec.add_dependency "json", '~> 2'
42
41
  spec.add_dependency "rb_sys", "~> 0.9.91"
42
+
43
+ spec.add_development_dependency "ruby-lsp"
43
44
  # For more information and examples about making a new gem, check out our
44
45
  # guide at: https://bundler.io/guides/creating_gem.html
45
46
  end
@@ -0,0 +1,74 @@
1
+ module Itsi
2
+ class HttpRequest
3
+ module ResponseStatusShortcodes
4
+
5
+ HTTP_STATUS_CODES = {
6
+ 100 => :continue,
7
+ 101 => :switching_protocols,
8
+ 102 => :processing,
9
+ 200 => :ok,
10
+ 201 => :created,
11
+ 202 => :accepted,
12
+ 203 => :non_authoritative_information,
13
+ 204 => :no_content,
14
+ 205 => :reset_content,
15
+ 206 => :partial_content,
16
+ 207 => :multi_status,
17
+ 208 => :already_reported,
18
+ 226 => :im_used,
19
+ 300 => :multiple_choices,
20
+ 301 => :moved_permanently,
21
+ 302 => :found,
22
+ 303 => :see_other,
23
+ 304 => :not_modified,
24
+ 305 => :use_proxy,
25
+ 307 => :temporary_redirect,
26
+ 308 => :permanent_redirect,
27
+ 400 => :bad_request,
28
+ 401 => :unauthorized,
29
+ 402 => :payment_required,
30
+ 403 => :forbidden,
31
+ 404 => :not_found,
32
+ 405 => :method_not_allowed,
33
+ 406 => :not_acceptable,
34
+ 407 => :proxy_authentication_required,
35
+ 408 => :request_timeout,
36
+ 409 => :conflict,
37
+ 410 => :gone,
38
+ 411 => :length_required,
39
+ 412 => :precondition_failed,
40
+ 413 => :payload_too_large,
41
+ 414 => :uri_too_long,
42
+ 415 => :unsupported_media_type,
43
+ 416 => :range_not_satisfiable,
44
+ 417 => :expectation_failed,
45
+ 418 => :im_a_teapot,
46
+ 421 => :misdirected_request,
47
+ 422 => :unprocessable_entity,
48
+ 423 => :locked,
49
+ 424 => :failed_dependency,
50
+ 425 => :too_early,
51
+ 426 => :upgrade_required,
52
+ 428 => :precondition_required,
53
+ 429 => :too_many_requests,
54
+ 431 => :request_header_fields_too_large,
55
+ 451 => :unavailable_for_legal_reasons,
56
+ 500 => :internal_server_error,
57
+ 501 => :not_implemented,
58
+ 502 => :bad_gateway,
59
+ 503 => :service_unavailable,
60
+ 504 => :gateway_timeout,
61
+ 505 => :http_version_not_supported,
62
+ 506 => :variant_also_negotiates,
63
+ 507 => :insufficient_storage,
64
+ 508 => :loop_detected,
65
+ 510 => :not_extended,
66
+ 511 => :network_authentication_required
67
+ }.freeze
68
+
69
+ HTTP_STATUS_CODES.each do |code, name|
70
+ define_method(name) {|*args, **kwargs| respond(*args, **kwargs, status: code) }
71
+ end
72
+ end
73
+ end
74
+ end