itsi 0.2.21.rc1 → 0.2.21

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 (53) hide show
  1. checksums.yaml +4 -4
  2. data/.dockerignore +3 -0
  3. data/.rubocop.yml +20 -0
  4. data/CHANGELOG.md +3 -0
  5. data/Cargo.lock +14 -14
  6. data/Dockerfile +9 -0
  7. data/crates/itsi_acme/src/caches/no.rs +1 -1
  8. data/crates/itsi_acme/src/caches/test.rs +3 -3
  9. data/crates/itsi_acme/src/config.rs +6 -6
  10. data/crates/itsi_acme/src/lib.rs +1 -1
  11. data/crates/itsi_error/Cargo.toml +1 -1
  12. data/crates/itsi_error/src/lib.rs +32 -15
  13. data/crates/itsi_rb_helpers/Cargo.toml +2 -2
  14. data/crates/itsi_rb_helpers/src/heap_value.rs +4 -4
  15. data/crates/itsi_rb_helpers/src/lib.rs +9 -5
  16. data/crates/itsi_scheduler/Cargo.toml +3 -3
  17. data/crates/itsi_scheduler/src/itsi_scheduler.rs +1 -1
  18. data/crates/itsi_server/Cargo.toml +3 -3
  19. data/crates/itsi_server/src/lib.rs +3 -2
  20. data/crates/itsi_server/src/ruby_types/itsi_body_proxy/big_bytes.rs +10 -3
  21. data/crates/itsi_server/src/ruby_types/itsi_body_proxy/mod.rs +10 -6
  22. data/crates/itsi_server/src/ruby_types/itsi_grpc_call.rs +7 -5
  23. data/crates/itsi_server/src/ruby_types/itsi_grpc_response_stream/mod.rs +2 -2
  24. data/crates/itsi_server/src/ruby_types/itsi_http_request.rs +10 -7
  25. data/crates/itsi_server/src/ruby_types/itsi_http_response.rs +13 -5
  26. data/crates/itsi_server/src/ruby_types/itsi_server/file_watcher.rs +6 -6
  27. data/crates/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +15 -11
  28. data/crates/itsi_server/src/ruby_types/itsi_server.rs +34 -18
  29. data/crates/itsi_server/src/server/frame_stream.rs +2 -1
  30. data/crates/itsi_server/src/server/middleware_stack/middleware.rs +1 -1
  31. data/crates/itsi_server/src/server/middleware_stack/middlewares/compression.rs +1 -3
  32. data/crates/itsi_server/src/server/middleware_stack/middlewares/mod.rs +8 -2
  33. data/crates/itsi_server/src/server/middleware_stack/middlewares/proxy.rs +2 -2
  34. data/crates/itsi_server/src/server/middleware_stack/middlewares/redirect.rs +1 -1
  35. data/crates/itsi_server/src/server/middleware_stack/middlewares/ruby_app.rs +17 -7
  36. data/crates/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs +90 -21
  37. data/crates/itsi_server/src/server/middleware_stack/mod.rs +12 -12
  38. data/crates/itsi_server/src/server/serve_strategy/cluster_mode.rs +4 -3
  39. data/crates/itsi_server/src/services/password_hasher.rs +8 -2
  40. data/crates/itsi_server/src/services/rate_limiter.rs +72 -25
  41. data/crates/itsi_server/src/services/static_file_server.rs +38 -13
  42. data/crates/itsi_tracing/src/lib.rs +3 -3
  43. data/gems/scheduler/Cargo.lock +3997 -541
  44. data/gems/scheduler/lib/itsi/scheduler/version.rb +1 -1
  45. data/gems/server/Cargo.lock +40 -13
  46. data/gems/server/lib/itsi/http_request.rb +22 -17
  47. data/gems/server/lib/itsi/rack_env_pool.rb +7 -17
  48. data/gems/server/lib/itsi/server/config/middleware/static_assets.rb +8 -1
  49. data/gems/server/lib/itsi/server/rack_interface.rb +12 -0
  50. data/gems/server/lib/itsi/server/version.rb +1 -1
  51. data/lib/itsi/version.rb +1 -1
  52. data/mise.toml +2 -0
  53. metadata +9 -5
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Itsi
4
4
  class Scheduler
5
- VERSION = "0.2.21.rc1"
5
+ VERSION = "0.2.21"
6
6
  end
7
7
  end
@@ -1642,9 +1642,27 @@ version = "1.0.15"
1642
1642
  source = "registry+https://github.com/rust-lang/crates.io-index"
1643
1643
  checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
1644
1644
 
1645
+ [[package]]
1646
+ name = "itsi-scheduler"
1647
+ version = "0.2.21"
1648
+ dependencies = [
1649
+ "bytes",
1650
+ "derive_more",
1651
+ "itsi_error",
1652
+ "itsi_instrument_entry",
1653
+ "itsi_rb_helpers",
1654
+ "itsi_tracing",
1655
+ "magnus",
1656
+ "mio",
1657
+ "nix",
1658
+ "parking_lot",
1659
+ "rb-sys",
1660
+ "tracing",
1661
+ ]
1662
+
1645
1663
  [[package]]
1646
1664
  name = "itsi-server"
1647
- version = "0.2.21-rc1"
1665
+ version = "0.2.21"
1648
1666
  dependencies = [
1649
1667
  "argon2",
1650
1668
  "async-channel",
@@ -1754,6 +1772,15 @@ dependencies = [
1754
1772
  "thiserror 2.0.12",
1755
1773
  ]
1756
1774
 
1775
+ [[package]]
1776
+ name = "itsi_instrument_entry"
1777
+ version = "0.1.0"
1778
+ dependencies = [
1779
+ "proc-macro2",
1780
+ "quote",
1781
+ "syn 1.0.109",
1782
+ ]
1783
+
1757
1784
  [[package]]
1758
1785
  name = "itsi_rb_helpers"
1759
1786
  version = "0.1.0"
@@ -1906,9 +1933,9 @@ checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
1906
1933
 
1907
1934
  [[package]]
1908
1935
  name = "magnus"
1909
- version = "0.7.1"
1936
+ version = "0.8.2"
1910
1937
  source = "registry+https://github.com/rust-lang/crates.io-index"
1911
- checksum = "3d87ae53030f3a22e83879e666cb94e58a7bdf31706878a0ba48752994146dab"
1938
+ checksum = "3b36a5b126bbe97eb0d02d07acfeb327036c6319fd816139a49824a83b7f9012"
1912
1939
  dependencies = [
1913
1940
  "bytes",
1914
1941
  "magnus-macros",
@@ -1919,9 +1946,9 @@ dependencies = [
1919
1946
 
1920
1947
  [[package]]
1921
1948
  name = "magnus-macros"
1922
- version = "0.6.0"
1949
+ version = "0.8.0"
1923
1950
  source = "registry+https://github.com/rust-lang/crates.io-index"
1924
- checksum = "5968c820e2960565f647819f5928a42d6e874551cab9d88d75e3e0660d7f71e3"
1951
+ checksum = "47607461fd8e1513cb4f2076c197d8092d921a1ea75bd08af97398f593751892"
1925
1952
  dependencies = [
1926
1953
  "proc-macro2",
1927
1954
  "quote",
@@ -2554,18 +2581,18 @@ dependencies = [
2554
2581
 
2555
2582
  [[package]]
2556
2583
  name = "rb-sys"
2557
- version = "0.9.111"
2584
+ version = "0.9.124"
2558
2585
  source = "registry+https://github.com/rust-lang/crates.io-index"
2559
- checksum = "becea799ce051c16fb140be80f5e7cf781070f99ca099332383c2b17861249af"
2586
+ checksum = "c85c4188462601e2aa1469def389c17228566f82ea72f137ed096f21591bc489"
2560
2587
  dependencies = [
2561
2588
  "rb-sys-build",
2562
2589
  ]
2563
2590
 
2564
2591
  [[package]]
2565
2592
  name = "rb-sys-build"
2566
- version = "0.9.111"
2593
+ version = "0.9.124"
2567
2594
  source = "registry+https://github.com/rust-lang/crates.io-index"
2568
- checksum = "64691175abc704862f60a9ca8ef06174080cc50615f2bf1d4759f46db18b4d29"
2595
+ checksum = "568068db4102230882e6d4ae8de6632e224ca75fe5970f6e026a04e91ed635d3"
2569
2596
  dependencies = [
2570
2597
  "bindgen",
2571
2598
  "lazy_static",
@@ -2578,9 +2605,9 @@ dependencies = [
2578
2605
 
2579
2606
  [[package]]
2580
2607
  name = "rb-sys-env"
2581
- version = "0.1.2"
2608
+ version = "0.2.3"
2582
2609
  source = "registry+https://github.com/rust-lang/crates.io-index"
2583
- checksum = "a35802679f07360454b418a5d1735c89716bde01d35b1560fc953c1415a0b3bb"
2610
+ checksum = "cca7ad6a7e21e72151d56fe2495a259b5670e204c3adac41ee7ef676ea08117a"
2584
2611
 
2585
2612
  [[package]]
2586
2613
  name = "rcgen"
@@ -2972,9 +2999,9 @@ dependencies = [
2972
2999
 
2973
3000
  [[package]]
2974
3001
  name = "serde_magnus"
2975
- version = "0.9.0"
3002
+ version = "0.11.0"
2976
3003
  source = "registry+https://github.com/rust-lang/crates.io-index"
2977
- checksum = "51b8b945a2dadb221f1c5490cfb411cab6c3821446b8eca50ee07e5a3893ec51"
3004
+ checksum = "8ff64c88ddd26acdcad5a501f18bcc339927b77b69f4a03bfaf2a6fc5ba2ac4b"
2978
3005
  dependencies = [
2979
3006
  "magnus",
2980
3007
  "serde",
@@ -27,6 +27,21 @@ module Itsi
27
27
 
28
28
  RACK_HEADER_MAP.default_proc = proc { |_, key| "HTTP_#{key.upcase.gsub(/-/, "_")}" }
29
29
 
30
+ SPECIAL_RACK_HEADER_MAP = {
31
+ "content-type" => "CONTENT_TYPE",
32
+ "content-length" => "CONTENT_LENGTH",
33
+ "accept" => "HTTP_ACCEPT",
34
+ "accept-encoding" => "HTTP_ACCEPT_ENCODING",
35
+ "accept-language" => "HTTP_ACCEPT_LANGUAGE",
36
+ "user-agent" => "HTTP_USER_AGENT",
37
+ "referer" => "HTTP_REFERER",
38
+ "origin" => "HTTP_ORIGIN",
39
+ "cookie" => "HTTP_COOKIE",
40
+ "authorization" => "HTTP_AUTHORIZATION",
41
+ "x-forwarded-for" => "HTTP_X_FORWARDED_FOR",
42
+ "x-forwarded-proto" => "HTTP_X_FORWARDED_PROTO"
43
+ }.freeze
44
+
30
45
  HTTP_09 = "HTTP/0.9"
31
46
  HTTP_09_ARR = ["HTTP/0.9"].freeze
32
47
  HTTP_10 = "HTTP/1.0"
@@ -63,24 +78,9 @@ module Itsi
63
78
  end
64
79
  env["rack.url_scheme"] = scheme
65
80
  env["rack.input"] = build_input_io
66
- env["rack.hijack"] = method(:hijack)
81
+ env["rack.hijack"] = self
67
82
  each_header do |k, v|
68
- env[case k
69
- when "content-type" then "CONTENT_TYPE"
70
- when "content-length" then "CONTENT_LENGTH"
71
- when "accept" then "HTTP_ACCEPT"
72
- when "accept-encoding" then "HTTP_ACCEPT_ENCODING"
73
- when "accept-language" then "HTTP_ACCEPT_LANGUAGE"
74
- when "user-agent" then "HTTP_USER_AGENT"
75
- when "referer" then "HTTP_REFERER"
76
- when "origin" then "HTTP_ORIGIN"
77
- when "cookie" then "HTTP_COOKIE"
78
- when "authorization" then "HTTP_AUTHORIZATION"
79
- when "x-forwarded-for" then "HTTP_X_FORWARDED_FOR"
80
- when "x-forwarded-proto" then "HTTP_X_FORWARDED_PROTO"
81
- else RACK_HEADER_MAP[k]
82
- end
83
- ] = v
83
+ env[SPECIAL_RACK_HEADER_MAP[k] || RACK_HEADER_MAP[k]] = v
84
84
  end
85
85
  env
86
86
  end
@@ -138,6 +138,11 @@ module Itsi
138
138
  end
139
139
  end
140
140
 
141
+ # Rack expects env["rack.hijack"] to respond to #call.
142
+ def call
143
+ hijack
144
+ end
145
+
141
146
  def body
142
147
  @body ||= build_input_io
143
148
  end
@@ -32,23 +32,13 @@ module Itsi
32
32
 
33
33
  POOL = []
34
34
 
35
- def self.checkout # rubocop:disable Metrics/CyclomaticComplexity,Metrics/MethodLength
36
- POOL.pop&.tap do |recycled|
37
- recycled.keys.each do |key|
38
- case key
39
- when "SERVER_SOFTWARE" then recycled[key] = "Itsi"
40
- when "rack.errors" then recycled[key] = $stderr
41
- when "rack.multithread", "rack.multiprocess", "rack.hijack?" then recycled[key] = true
42
- when "rack.run_once" then recycled[key] = false
43
- when "rack.multipart.buffer_size" then recycled[key] = 16_384
44
- when "SCRIPT_NAME", "REQUEST_METHOD", "PATH_INFO", "REQUEST_PATH", "QUERY_STRING", "REMOTE_ADDR",
45
- "SERVER_PORT", "SERVER_NAME", "SERVER_PROTOCOL", "HTTP_HOST", "HTTP_VERSION", "itsi.request",
46
- "itsi.response", "rack.version", "rack.url_scheme", "rack.input", "rack.hijack"
47
- nil
48
- else recycled.delete(key)
49
- end
50
- end
51
- end || RACK_ENV_TEMPLATE.dup
35
+ def self.checkout
36
+ recycled = POOL.pop
37
+ return RACK_ENV_TEMPLATE.dup unless recycled
38
+
39
+ # Reset in C rather than iterating key-by-key in Ruby for every request.
40
+ recycled.replace(RACK_ENV_TEMPLATE)
41
+ recycled
52
42
  end
53
43
 
54
44
  def self.checkin(env)
@@ -33,9 +33,16 @@ module Itsi
33
33
  }
34
34
  end
35
35
 
36
+ RedirectTarget = TypedStruct.new do
37
+ {
38
+ to: (Required() & Type(String)),
39
+ type: Enum(["permanent", "temporary", "found", "moved_permanently"]).default("moved_permanently")
40
+ }
41
+ end
42
+
36
43
  RedirectResponse = TypedStruct.new do
37
44
  {
38
- redirect: Type(Redirect::Redirect) & Required()
45
+ redirect: Type(RedirectTarget) & Required()
39
46
  }
40
47
  end
41
48
 
@@ -62,6 +62,18 @@ module Itsi
62
62
  # stream this response.
63
63
  body_streamer.call(response)
64
64
 
65
+ elsif body.is_a?(Array)
66
+ if body.length == 1
67
+ response.send_and_close(body[0].to_s)
68
+ else
69
+ buffer = nil
70
+ body.each do |part|
71
+ response << buffer.to_s if buffer
72
+ buffer = part
73
+ end
74
+
75
+ response.send_and_close(buffer.to_s)
76
+ end
65
77
  elsif body.respond_to?(:each) || body.respond_to?(:to_ary)
66
78
  # If we're enumerable with more than one chunk
67
79
  # also stream, otherwise write in a single chunk
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Itsi
4
4
  class Server
5
- VERSION = "0.2.21.rc1"
5
+ VERSION = "0.2.21"
6
6
  end
7
7
  end
data/lib/itsi/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Itsi
2
- VERSION = "0.2.21.rc1"
2
+ VERSION = "0.2.21"
3
3
  end
data/mise.toml ADDED
@@ -0,0 +1,2 @@
1
+ [tools]
2
+ ruby = "4.0.1"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: itsi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.21.rc1
4
+ version: 0.2.21
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wouter Coppieters
@@ -15,28 +15,28 @@ dependencies:
15
15
  requirements:
16
16
  - - '='
17
17
  - !ruby/object:Gem::Version
18
- version: 0.2.21.rc1
18
+ version: 0.2.21
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - '='
24
24
  - !ruby/object:Gem::Version
25
- version: 0.2.21.rc1
25
+ version: 0.2.21
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: itsi-server
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
30
  - - '='
31
31
  - !ruby/object:Gem::Version
32
- version: 0.2.21.rc1
32
+ version: 0.2.21
33
33
  type: :runtime
34
34
  prerelease: false
35
35
  version_requirements: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - '='
38
38
  - !ruby/object:Gem::Version
39
- version: 0.2.21.rc1
39
+ version: 0.2.21
40
40
  description: Wrapper Gem for both the Itsi server and the Itsi Fiber scheduler
41
41
  email:
42
42
  - wc@pico.net.nz
@@ -44,10 +44,13 @@ executables: []
44
44
  extensions: []
45
45
  extra_rdoc_files: []
46
46
  files:
47
+ - ".dockerignore"
48
+ - ".rubocop.yml"
47
49
  - ".zed/settings.json"
48
50
  - CHANGELOG.md
49
51
  - Cargo.lock
50
52
  - Cargo.toml
53
+ - Dockerfile
51
54
  - LICENSE.txt
52
55
  - README.md
53
56
  - Rakefile
@@ -1119,6 +1122,7 @@ files:
1119
1122
  - itsi-server-100.png
1120
1123
  - lib/itsi.rb
1121
1124
  - lib/itsi/version.rb
1125
+ - mise.toml
1122
1126
  homepage: https://itsi.fyi
1123
1127
  licenses:
1124
1128
  - LGPL-3.0