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.
- checksums.yaml +4 -4
- data/.dockerignore +3 -0
- data/.rubocop.yml +20 -0
- data/CHANGELOG.md +3 -0
- data/Cargo.lock +14 -14
- data/Dockerfile +9 -0
- data/crates/itsi_acme/src/caches/no.rs +1 -1
- data/crates/itsi_acme/src/caches/test.rs +3 -3
- data/crates/itsi_acme/src/config.rs +6 -6
- data/crates/itsi_acme/src/lib.rs +1 -1
- data/crates/itsi_error/Cargo.toml +1 -1
- data/crates/itsi_error/src/lib.rs +32 -15
- data/crates/itsi_rb_helpers/Cargo.toml +2 -2
- data/crates/itsi_rb_helpers/src/heap_value.rs +4 -4
- data/crates/itsi_rb_helpers/src/lib.rs +9 -5
- data/crates/itsi_scheduler/Cargo.toml +3 -3
- data/crates/itsi_scheduler/src/itsi_scheduler.rs +1 -1
- data/crates/itsi_server/Cargo.toml +3 -3
- data/crates/itsi_server/src/lib.rs +3 -2
- data/crates/itsi_server/src/ruby_types/itsi_body_proxy/big_bytes.rs +10 -3
- data/crates/itsi_server/src/ruby_types/itsi_body_proxy/mod.rs +10 -6
- data/crates/itsi_server/src/ruby_types/itsi_grpc_call.rs +7 -5
- data/crates/itsi_server/src/ruby_types/itsi_grpc_response_stream/mod.rs +2 -2
- data/crates/itsi_server/src/ruby_types/itsi_http_request.rs +10 -7
- data/crates/itsi_server/src/ruby_types/itsi_http_response.rs +13 -5
- data/crates/itsi_server/src/ruby_types/itsi_server/file_watcher.rs +6 -6
- data/crates/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +15 -11
- data/crates/itsi_server/src/ruby_types/itsi_server.rs +34 -18
- data/crates/itsi_server/src/server/frame_stream.rs +2 -1
- data/crates/itsi_server/src/server/middleware_stack/middleware.rs +1 -1
- data/crates/itsi_server/src/server/middleware_stack/middlewares/compression.rs +1 -3
- data/crates/itsi_server/src/server/middleware_stack/middlewares/mod.rs +8 -2
- data/crates/itsi_server/src/server/middleware_stack/middlewares/proxy.rs +2 -2
- data/crates/itsi_server/src/server/middleware_stack/middlewares/redirect.rs +1 -1
- data/crates/itsi_server/src/server/middleware_stack/middlewares/ruby_app.rs +17 -7
- data/crates/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs +90 -21
- data/crates/itsi_server/src/server/middleware_stack/mod.rs +12 -12
- data/crates/itsi_server/src/server/serve_strategy/cluster_mode.rs +4 -3
- data/crates/itsi_server/src/services/password_hasher.rs +8 -2
- data/crates/itsi_server/src/services/rate_limiter.rs +72 -25
- data/crates/itsi_server/src/services/static_file_server.rs +38 -13
- data/crates/itsi_tracing/src/lib.rs +3 -3
- data/gems/scheduler/Cargo.lock +3997 -541
- data/gems/scheduler/lib/itsi/scheduler/version.rb +1 -1
- data/gems/server/Cargo.lock +40 -13
- data/gems/server/lib/itsi/http_request.rb +22 -17
- data/gems/server/lib/itsi/rack_env_pool.rb +7 -17
- data/gems/server/lib/itsi/server/config/middleware/static_assets.rb +8 -1
- data/gems/server/lib/itsi/server/rack_interface.rb +12 -0
- data/gems/server/lib/itsi/server/version.rb +1 -1
- data/lib/itsi/version.rb +1 -1
- data/mise.toml +2 -0
- metadata +9 -5
data/gems/server/Cargo.lock
CHANGED
|
@@ -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
|
|
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.
|
|
1936
|
+
version = "0.8.2"
|
|
1910
1937
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1911
|
-
checksum = "
|
|
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.
|
|
1949
|
+
version = "0.8.0"
|
|
1923
1950
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1924
|
-
checksum = "
|
|
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.
|
|
2584
|
+
version = "0.9.124"
|
|
2558
2585
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2559
|
-
checksum = "
|
|
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.
|
|
2593
|
+
version = "0.9.124"
|
|
2567
2594
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2568
|
-
checksum = "
|
|
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.
|
|
2608
|
+
version = "0.2.3"
|
|
2582
2609
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2583
|
-
checksum = "
|
|
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.
|
|
3002
|
+
version = "0.11.0"
|
|
2976
3003
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2977
|
-
checksum = "
|
|
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"] =
|
|
81
|
+
env["rack.hijack"] = self
|
|
67
82
|
each_header do |k, v|
|
|
68
|
-
env[
|
|
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
|
|
36
|
-
POOL.pop
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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(
|
|
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
|
data/lib/itsi/version.rb
CHANGED
data/mise.toml
ADDED
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|