itsi-server 0.2.21.rc2 → 0.2.22
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/Cargo.lock +25 -11
- data/Cargo.toml +4 -0
- data/Rakefile +39 -7
- data/ext/itsi_acme/src/caches/no.rs +1 -1
- data/ext/itsi_acme/src/caches/test.rs +3 -3
- data/ext/itsi_acme/src/config.rs +6 -6
- data/ext/itsi_acme/src/lib.rs +1 -1
- data/ext/itsi_error/src/lib.rs +32 -15
- data/ext/itsi_rb_helpers/src/heap_value.rs +2 -2
- data/ext/itsi_scheduler/Cargo.toml +1 -1
- data/ext/itsi_scheduler/src/itsi_scheduler.rs +1 -1
- data/ext/itsi_server/Cargo.toml +1 -1
- data/ext/itsi_server/src/ruby_types/itsi_body_proxy/big_bytes.rs +10 -3
- data/ext/itsi_server/src/ruby_types/itsi_body_proxy/mod.rs +10 -6
- data/ext/itsi_server/src/ruby_types/itsi_grpc_call.rs +7 -5
- data/ext/itsi_server/src/ruby_types/itsi_grpc_response_stream/mod.rs +2 -2
- data/ext/itsi_server/src/ruby_types/itsi_http_request.rs +10 -7
- data/ext/itsi_server/src/ruby_types/itsi_http_response.rs +13 -5
- data/ext/itsi_server/src/ruby_types/itsi_server/file_watcher.rs +6 -6
- data/ext/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +15 -11
- data/ext/itsi_server/src/ruby_types/itsi_server.rs +2 -2
- data/ext/itsi_server/src/server/middleware_stack/middleware.rs +1 -1
- data/ext/itsi_server/src/server/middleware_stack/middlewares/compression.rs +1 -3
- data/ext/itsi_server/src/server/middleware_stack/middlewares/mod.rs +2 -2
- data/ext/itsi_server/src/server/middleware_stack/middlewares/proxy.rs +2 -2
- data/ext/itsi_server/src/server/middleware_stack/middlewares/redirect.rs +1 -1
- data/ext/itsi_server/src/server/middleware_stack/middlewares/ruby_app.rs +17 -7
- data/ext/itsi_server/src/server/middleware_stack/mod.rs +12 -12
- data/ext/itsi_server/src/server/serve_strategy/cluster_mode.rs +4 -3
- data/ext/itsi_server/src/server/signal.rs +7 -5
- data/ext/itsi_server/src/services/password_hasher.rs +1 -1
- data/ext/itsi_server/src/services/static_file_server.rs +3 -4
- data/lib/itsi/server/native_extension.rb +34 -0
- data/lib/itsi/server/version.rb +1 -1
- data/lib/itsi/server.rb +10 -2
- data/vendor/rb-sys-build/.cargo-ok +1 -0
- data/vendor/rb-sys-build/.cargo_vcs_info.json +6 -0
- data/vendor/rb-sys-build/Cargo.lock +294 -0
- data/vendor/rb-sys-build/Cargo.toml +71 -0
- data/vendor/rb-sys-build/Cargo.toml.orig +32 -0
- data/vendor/rb-sys-build/LICENSE-APACHE +190 -0
- data/vendor/rb-sys-build/LICENSE-MIT +21 -0
- data/vendor/rb-sys-build/src/bindings/sanitizer.rs +185 -0
- data/vendor/rb-sys-build/src/bindings/stable_api.rs +247 -0
- data/vendor/rb-sys-build/src/bindings/wrapper.h +71 -0
- data/vendor/rb-sys-build/src/bindings.rs +280 -0
- data/vendor/rb-sys-build/src/cc.rs +421 -0
- data/vendor/rb-sys-build/src/lib.rs +12 -0
- data/vendor/rb-sys-build/src/rb_config/flags.rs +101 -0
- data/vendor/rb-sys-build/src/rb_config/library.rs +132 -0
- data/vendor/rb-sys-build/src/rb_config/search_path.rs +57 -0
- data/vendor/rb-sys-build/src/rb_config.rs +906 -0
- data/vendor/rb-sys-build/src/utils.rs +53 -0
- metadata +25 -11
- data/ext/itsi_server/target/release/build/clang-sys-0dae18670e690c25/out/common.rs +0 -355
- data/ext/itsi_server/target/release/build/clang-sys-0dae18670e690c25/out/dynamic.rs +0 -276
- data/ext/itsi_server/target/release/build/clang-sys-0dae18670e690c25/out/macros.rs +0 -49
- data/ext/itsi_server/target/release/build/oid-registry-71b994a322b296ec/out/oid_db.rs +0 -537
- data/ext/itsi_server/target/release/build/rb-sys-9f9831ab50fb86db/out/bindings-0.9.124-mri-arm64-darwin24-2.7.8.rs +0 -6234
- data/ext/itsi_server/target/release/build/rb-sys-9f9831ab50fb86db/out/bindings-0.9.124-mri-arm64-darwin24-3.4.5.rs +0 -8936
- data/ext/itsi_server/target/release/build/rb-sys-9f9831ab50fb86db/out/bindings-0.9.124-mri-arm64-darwin24-4.0.1.rs +0 -9060
- data/ext/itsi_server/target/release/build/typenum-11265e44e46de3b7/out/tests.rs +0 -20563
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4c095031fc57b597bbc6a032600bbebecfbaddb2f30f4caa9880e6fd64d13604
|
|
4
|
+
data.tar.gz: 10c1b76bdb681e9cb8e5222d316d12ec5c852fcba2b30395a6b923ee899a2f63
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 72022fd6073d0c7d80ccc14e255148f23e0ded3e1bb8ab486c9ab0ef0374f96964ad744b3d019475f594387d1192cf0990cf77b16c7a6e29404b44f8124e19c0
|
|
7
|
+
data.tar.gz: 67ba7810fbe87e0843a45ae41666239a14ba6ecff0cff60ccf1335a3c9cec886848441b946b4d863fe3f984a0f982302c24f47eac813c2aa824c1d1c26a367e1
|
data/Cargo.lock
CHANGED
|
@@ -270,7 +270,7 @@ version = "0.28.2"
|
|
|
270
270
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
271
271
|
checksum = "bfa9b6986f250236c27e5a204062434a773a13243d2ffc2955f37bdba4c5c6a1"
|
|
272
272
|
dependencies = [
|
|
273
|
-
"bindgen",
|
|
273
|
+
"bindgen 0.69.5",
|
|
274
274
|
"cc",
|
|
275
275
|
"cmake",
|
|
276
276
|
"dunce",
|
|
@@ -427,6 +427,24 @@ dependencies = [
|
|
|
427
427
|
"which",
|
|
428
428
|
]
|
|
429
429
|
|
|
430
|
+
[[package]]
|
|
431
|
+
name = "bindgen"
|
|
432
|
+
version = "0.72.1"
|
|
433
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
434
|
+
checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895"
|
|
435
|
+
dependencies = [
|
|
436
|
+
"bitflags 2.9.0",
|
|
437
|
+
"cexpr",
|
|
438
|
+
"clang-sys",
|
|
439
|
+
"itertools",
|
|
440
|
+
"proc-macro2",
|
|
441
|
+
"quote",
|
|
442
|
+
"regex",
|
|
443
|
+
"rustc-hash 2.1.1",
|
|
444
|
+
"shlex",
|
|
445
|
+
"syn 2.0.101",
|
|
446
|
+
]
|
|
447
|
+
|
|
430
448
|
[[package]]
|
|
431
449
|
name = "bitflags"
|
|
432
450
|
version = "1.3.2"
|
|
@@ -660,7 +678,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
|
660
678
|
checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c"
|
|
661
679
|
dependencies = [
|
|
662
680
|
"lazy_static",
|
|
663
|
-
"windows-sys 0.
|
|
681
|
+
"windows-sys 0.48.0",
|
|
664
682
|
]
|
|
665
683
|
|
|
666
684
|
[[package]]
|
|
@@ -1644,7 +1662,7 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
|
|
|
1644
1662
|
|
|
1645
1663
|
[[package]]
|
|
1646
1664
|
name = "itsi-server"
|
|
1647
|
-
version = "0.2.
|
|
1665
|
+
version = "0.2.22"
|
|
1648
1666
|
dependencies = [
|
|
1649
1667
|
"argon2",
|
|
1650
1668
|
"async-channel",
|
|
@@ -1907,8 +1925,7 @@ checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
|
|
|
1907
1925
|
[[package]]
|
|
1908
1926
|
name = "magnus"
|
|
1909
1927
|
version = "0.8.2"
|
|
1910
|
-
source = "
|
|
1911
|
-
checksum = "3b36a5b126bbe97eb0d02d07acfeb327036c6319fd816139a49824a83b7f9012"
|
|
1928
|
+
source = "git+https://github.com/matsadler/magnus.git?rev=1ed232edb2b75a2eed9b1def34ad57e55c411a5c#1ed232edb2b75a2eed9b1def34ad57e55c411a5c"
|
|
1912
1929
|
dependencies = [
|
|
1913
1930
|
"bytes",
|
|
1914
1931
|
"magnus-macros",
|
|
@@ -1920,8 +1937,7 @@ dependencies = [
|
|
|
1920
1937
|
[[package]]
|
|
1921
1938
|
name = "magnus-macros"
|
|
1922
1939
|
version = "0.8.0"
|
|
1923
|
-
source = "
|
|
1924
|
-
checksum = "47607461fd8e1513cb4f2076c197d8092d921a1ea75bd08af97398f593751892"
|
|
1940
|
+
source = "git+https://github.com/matsadler/magnus.git?rev=1ed232edb2b75a2eed9b1def34ad57e55c411a5c#1ed232edb2b75a2eed9b1def34ad57e55c411a5c"
|
|
1925
1941
|
dependencies = [
|
|
1926
1942
|
"proc-macro2",
|
|
1927
1943
|
"quote",
|
|
@@ -2564,10 +2580,8 @@ dependencies = [
|
|
|
2564
2580
|
[[package]]
|
|
2565
2581
|
name = "rb-sys-build"
|
|
2566
2582
|
version = "0.9.124"
|
|
2567
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2568
|
-
checksum = "568068db4102230882e6d4ae8de6632e224ca75fe5970f6e026a04e91ed635d3"
|
|
2569
2583
|
dependencies = [
|
|
2570
|
-
"bindgen",
|
|
2584
|
+
"bindgen 0.72.1",
|
|
2571
2585
|
"lazy_static",
|
|
2572
2586
|
"proc-macro2",
|
|
2573
2587
|
"quote",
|
|
@@ -3895,7 +3909,7 @@ version = "0.1.9"
|
|
|
3895
3909
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
3896
3910
|
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
|
|
3897
3911
|
dependencies = [
|
|
3898
|
-
"windows-sys 0.
|
|
3912
|
+
"windows-sys 0.48.0",
|
|
3899
3913
|
]
|
|
3900
3914
|
|
|
3901
3915
|
[[package]]
|
data/Cargo.toml
CHANGED
data/Rakefile
CHANGED
|
@@ -3,15 +3,47 @@
|
|
|
3
3
|
require "bundler/gem_tasks"
|
|
4
4
|
require "minitest/test_task"
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
6
|
+
SMOKE_TEST_GLOBS = %w[
|
|
7
|
+
test/options/bind.rb
|
|
8
|
+
test/options/header_read_timeout.rb
|
|
9
|
+
test/options/test_request_timeout.rb
|
|
10
|
+
test/options/test_threads.rb
|
|
11
|
+
test/rack/test_rack_server.rb
|
|
12
|
+
test/middleware/allow_list.rb
|
|
13
|
+
test/middleware/auth_api_key.rb
|
|
14
|
+
test/middleware/auth_basic.rb
|
|
15
|
+
test/middleware/cache_control.rb
|
|
16
|
+
test/middleware/cidr_to_regex.rb
|
|
17
|
+
test/middleware/compression.rb
|
|
18
|
+
test/middleware/cors.rb
|
|
19
|
+
test/middleware/csp.rb
|
|
20
|
+
test/middleware/deny_list.rb
|
|
21
|
+
test/middleware/etag.rb
|
|
22
|
+
test/middleware/header_interpolation.rb
|
|
23
|
+
test/middleware/location.rb
|
|
24
|
+
test/middleware/max_body.rb
|
|
25
|
+
test/middleware/request_headers.rb
|
|
26
|
+
test/middleware/response_headers.rb
|
|
27
|
+
test/middleware/static_assets.rb
|
|
28
|
+
test/middleware/static_response.rb
|
|
29
|
+
test/middleware/string_rewrite.rb
|
|
30
|
+
].freeze
|
|
31
|
+
|
|
32
|
+
def configure_test_task(task_name, test_globs)
|
|
33
|
+
Minitest::TestTask.create(task_name) do |t|
|
|
34
|
+
t.libs << "test"
|
|
35
|
+
t.libs << "lib"
|
|
36
|
+
t.warning = false
|
|
37
|
+
t.test_globs = test_globs
|
|
38
|
+
t.test_prelude = 'require "helpers/test_helper.rb"'
|
|
39
|
+
end
|
|
13
40
|
end
|
|
14
41
|
|
|
42
|
+
configure_test_task(:test, ["test/**/*.rb"])
|
|
43
|
+
configure_test_task("test:smoke", SMOKE_TEST_GLOBS)
|
|
44
|
+
|
|
45
|
+
task "test:full" => :test
|
|
46
|
+
|
|
15
47
|
require "rb_sys/extensiontask"
|
|
16
48
|
|
|
17
49
|
task build: :compile
|
|
@@ -7,7 +7,7 @@ use std::sync::atomic::AtomicPtr;
|
|
|
7
7
|
|
|
8
8
|
/// No-op cache, which does nothing.
|
|
9
9
|
/// ```rust
|
|
10
|
-
/// # use
|
|
10
|
+
/// # use itsi_acme::caches::NoCache;
|
|
11
11
|
/// # type EC = std::io::Error;
|
|
12
12
|
/// # type EA = EC;
|
|
13
13
|
/// let no_cache = NoCache::<EC, EA>::new();
|
|
@@ -10,9 +10,9 @@ use std::sync::atomic::AtomicPtr;
|
|
|
10
10
|
use std::sync::Arc;
|
|
11
11
|
|
|
12
12
|
/// Test cache, which generates certificates for ACME incompatible test environments.
|
|
13
|
-
/// ```rust
|
|
14
|
-
/// # use
|
|
15
|
-
/// # use
|
|
13
|
+
/// ```rust,no_run
|
|
14
|
+
/// # use itsi_acme::AcmeConfig;
|
|
15
|
+
/// # use itsi_acme::caches::{DirCache, TestCache};
|
|
16
16
|
/// # let test_environment = true;
|
|
17
17
|
/// let mut config = AcmeConfig::new(["example.com"])
|
|
18
18
|
/// .cache(DirCache::new("./cache"));
|
data/ext/itsi_acme/src/config.rs
CHANGED
|
@@ -31,9 +31,9 @@ impl AcmeConfig<Infallible, Infallible> {
|
|
|
31
31
|
/// error types will be `Infallible` since the cache cannot return an error. The methods to set
|
|
32
32
|
/// a cache will change the error types to match those returned by the supplied cache.
|
|
33
33
|
///
|
|
34
|
-
/// ```rust
|
|
35
|
-
/// # use
|
|
36
|
-
/// use
|
|
34
|
+
/// ```rust,no_run
|
|
35
|
+
/// # use itsi_acme::AcmeConfig;
|
|
36
|
+
/// use itsi_acme::caches::DirCache;
|
|
37
37
|
/// let config = AcmeConfig::new(["example.com"]).cache(DirCache::new("./rustls_acme_cache"));
|
|
38
38
|
/// ```
|
|
39
39
|
///
|
|
@@ -43,9 +43,9 @@ impl AcmeConfig<Infallible, Infallible> {
|
|
|
43
43
|
/// An uncached instance of [AcmeConfig] with particular type parameters can be created using
|
|
44
44
|
/// [NoCache].
|
|
45
45
|
///
|
|
46
|
-
/// ```rust
|
|
47
|
-
/// # use
|
|
48
|
-
/// use
|
|
46
|
+
/// ```rust,no_run
|
|
47
|
+
/// # use itsi_acme::AcmeConfig;
|
|
48
|
+
/// use itsi_acme::caches::NoCache;
|
|
49
49
|
/// # type EC = std::io::Error;
|
|
50
50
|
/// # type EA = EC;
|
|
51
51
|
/// let config: AcmeConfig<EC, EA> = AcmeConfig::new(["example.com"]).cache(NoCache::new());
|
data/ext/itsi_acme/src/lib.rs
CHANGED
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
//! ```rust,no_run
|
|
32
32
|
//! use tokio::io::AsyncWriteExt;
|
|
33
33
|
//! use futures::StreamExt;
|
|
34
|
-
//! use
|
|
34
|
+
//! use itsi_acme::{AcmeConfig, caches::DirCache};
|
|
35
35
|
//! use tokio_stream::wrappers::TcpListenerStream;
|
|
36
36
|
//!
|
|
37
37
|
//! #[tokio::main]
|
data/ext/itsi_error/src/lib.rs
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
pub use anyhow::Context;
|
|
2
2
|
use magnus::Error as MagnusError;
|
|
3
|
-
use magnus::{
|
|
4
|
-
error::ErrorType,
|
|
5
|
-
exception::{self, arg_error, standard_error},
|
|
6
|
-
};
|
|
3
|
+
use magnus::{error::ErrorType, Ruby};
|
|
7
4
|
use thiserror::Error;
|
|
8
5
|
|
|
9
6
|
pub static CLIENT_CONNECTION_CLOSED: &str = "Client disconnected";
|
|
@@ -73,7 +70,10 @@ pub trait IntoMagnusError {
|
|
|
73
70
|
|
|
74
71
|
impl<T: std::error::Error> IntoMagnusError for T {
|
|
75
72
|
fn into_magnus_error(self) -> MagnusError {
|
|
76
|
-
MagnusError::new(
|
|
73
|
+
MagnusError::new(
|
|
74
|
+
Ruby::get().unwrap().exception_standard_error(),
|
|
75
|
+
self.to_string(),
|
|
76
|
+
)
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
79
|
|
|
@@ -92,17 +92,34 @@ impl From<String> for ItsiError {
|
|
|
92
92
|
impl From<ItsiError> for magnus::Error {
|
|
93
93
|
fn from(err: ItsiError) -> Self {
|
|
94
94
|
match err {
|
|
95
|
-
ItsiError::InvalidInput(msg) =>
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
ItsiError::
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
ItsiError::
|
|
102
|
-
magnus::Error::new(
|
|
95
|
+
ItsiError::InvalidInput(msg) => {
|
|
96
|
+
magnus::Error::new(Ruby::get().unwrap().exception_arg_error(), msg)
|
|
97
|
+
}
|
|
98
|
+
ItsiError::InternalServerError(msg) => {
|
|
99
|
+
magnus::Error::new(Ruby::get().unwrap().exception_standard_error(), msg)
|
|
100
|
+
}
|
|
101
|
+
ItsiError::InternalError(msg) => {
|
|
102
|
+
magnus::Error::new(Ruby::get().unwrap().exception_standard_error(), msg)
|
|
103
|
+
}
|
|
104
|
+
ItsiError::UnsupportedProtocol(msg) => {
|
|
105
|
+
magnus::Error::new(Ruby::get().unwrap().exception_arg_error(), msg)
|
|
106
|
+
}
|
|
107
|
+
ItsiError::ArgumentError(msg) => {
|
|
108
|
+
magnus::Error::new(Ruby::get().unwrap().exception_arg_error(), msg)
|
|
109
|
+
}
|
|
110
|
+
ItsiError::Jump(msg) => {
|
|
111
|
+
magnus::Error::new(Ruby::get().unwrap().exception_local_jump_error(), msg)
|
|
112
|
+
}
|
|
113
|
+
ItsiError::ClientConnectionClosed => magnus::Error::new(
|
|
114
|
+
Ruby::get().unwrap().exception_eof_error(),
|
|
115
|
+
CLIENT_CONNECTION_CLOSED,
|
|
116
|
+
),
|
|
117
|
+
ItsiError::Break => {
|
|
118
|
+
magnus::Error::new(Ruby::get().unwrap().exception_interrupt(), "Break")
|
|
119
|
+
}
|
|
120
|
+
ItsiError::Pass => {
|
|
121
|
+
magnus::Error::new(Ruby::get().unwrap().exception_interrupt(), "Pass")
|
|
103
122
|
}
|
|
104
|
-
ItsiError::Break => magnus::Error::new(exception::interrupt(), "Break"),
|
|
105
|
-
ItsiError::Pass => magnus::Error::new(exception::interrupt(), "Pass"),
|
|
106
123
|
ItsiError::Io(err) => err.into_magnus_error(),
|
|
107
124
|
ItsiError::Rcgen(err) => err.into_magnus_error(),
|
|
108
125
|
ItsiError::HttpParse(err) => err.into_magnus_error(),
|
|
@@ -66,7 +66,7 @@ where
|
|
|
66
66
|
T: ReprValue,
|
|
67
67
|
{
|
|
68
68
|
fn into_value_with(self, _: &Ruby) -> Value {
|
|
69
|
-
self.0.
|
|
69
|
+
self.0.into_value_with(&magnus::Ruby::get().unwrap())
|
|
70
70
|
}
|
|
71
71
|
}
|
|
72
72
|
|
|
@@ -116,7 +116,7 @@ impl Deref for HeapVal {
|
|
|
116
116
|
|
|
117
117
|
impl IntoValue for HeapVal {
|
|
118
118
|
fn into_value_with(self, _: &Ruby) -> Value {
|
|
119
|
-
self.0.
|
|
119
|
+
self.0.into_value_with(&magnus::Ruby::get().unwrap())
|
|
120
120
|
}
|
|
121
121
|
}
|
|
122
122
|
|
|
@@ -68,7 +68,7 @@ impl ItsiScheduler {
|
|
|
68
68
|
pub fn wake(&self) -> MagnusResult<()> {
|
|
69
69
|
self.waker.lock().wake().map_err(|_| {
|
|
70
70
|
magnus::Error::new(
|
|
71
|
-
magnus::
|
|
71
|
+
magnus::Ruby::get().unwrap().exception_standard_error(),
|
|
72
72
|
"Failed to wake the scheduler",
|
|
73
73
|
)
|
|
74
74
|
})?;
|
data/ext/itsi_server/Cargo.toml
CHANGED
|
@@ -50,14 +50,21 @@ impl BigBytes {
|
|
|
50
50
|
if bytes.is_empty() {
|
|
51
51
|
None
|
|
52
52
|
} else {
|
|
53
|
-
Some(bytes.
|
|
53
|
+
Some(bytes.into_value_with(&magnus::Ruby::get().unwrap()))
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
56
|
BigBytes::OnDisk(path) => {
|
|
57
57
|
let ruby = Ruby::get().unwrap();
|
|
58
58
|
let rarray = ruby.ary_new();
|
|
59
|
-
rarray
|
|
60
|
-
|
|
59
|
+
rarray
|
|
60
|
+
.push(
|
|
61
|
+
path.path()
|
|
62
|
+
.to_str()
|
|
63
|
+
.unwrap()
|
|
64
|
+
.into_value_with(&magnus::Ruby::get().unwrap()),
|
|
65
|
+
)
|
|
66
|
+
.ok();
|
|
67
|
+
Some(rarray.into_value_with(&magnus::Ruby::get().unwrap()))
|
|
61
68
|
}
|
|
62
69
|
}
|
|
63
70
|
}
|
|
@@ -32,7 +32,9 @@ impl ItsiBody {
|
|
|
32
32
|
pub fn into_value(&self) -> Option<Value> {
|
|
33
33
|
match self {
|
|
34
34
|
ItsiBody::Buffered(bytes) => bytes.as_value(),
|
|
35
|
-
ItsiBody::Stream(proxy) =>
|
|
35
|
+
ItsiBody::Stream(proxy) => {
|
|
36
|
+
Some(proxy.clone().into_value_with(&magnus::Ruby::get().unwrap()))
|
|
37
|
+
}
|
|
36
38
|
ItsiBody::Empty => None,
|
|
37
39
|
}
|
|
38
40
|
}
|
|
@@ -54,7 +56,7 @@ impl ItsiBodyProxy {
|
|
|
54
56
|
if let Some(chunk) = block_on(stream.next()) {
|
|
55
57
|
let chunk = chunk.map_err(|err| {
|
|
56
58
|
magnus::Error::new(
|
|
57
|
-
magnus::
|
|
59
|
+
magnus::Ruby::get().unwrap().exception_standard_error(),
|
|
58
60
|
format!("Error reading body {:?}", err),
|
|
59
61
|
)
|
|
60
62
|
})?;
|
|
@@ -86,7 +88,7 @@ impl ItsiBodyProxy {
|
|
|
86
88
|
if let Some(chunk) = block_on(stream.next()) {
|
|
87
89
|
let chunk = chunk.map_err(|err| {
|
|
88
90
|
magnus::Error::new(
|
|
89
|
-
magnus::
|
|
91
|
+
magnus::Ruby::get().unwrap().exception_standard_error(),
|
|
90
92
|
format!("Error reading body {:?}", err),
|
|
91
93
|
)
|
|
92
94
|
})?;
|
|
@@ -97,7 +99,9 @@ impl ItsiBodyProxy {
|
|
|
97
99
|
break;
|
|
98
100
|
}
|
|
99
101
|
}
|
|
100
|
-
let output_string = buffer
|
|
102
|
+
let output_string = buffer
|
|
103
|
+
.take()
|
|
104
|
+
.unwrap_or(magnus::Ruby::get().unwrap().str_buf_new(buf.len()));
|
|
101
105
|
output_string.cat(buf.clone());
|
|
102
106
|
buf.clear();
|
|
103
107
|
Ok(Some(output_string))
|
|
@@ -111,7 +115,7 @@ impl ItsiBodyProxy {
|
|
|
111
115
|
while let Some(chunk) = block_on(stream.next()) {
|
|
112
116
|
let chunk = chunk.map_err(|err| {
|
|
113
117
|
magnus::Error::new(
|
|
114
|
-
magnus::
|
|
118
|
+
magnus::Ruby::get().unwrap().exception_standard_error(),
|
|
115
119
|
format!("Error reading body {:?}", err),
|
|
116
120
|
)
|
|
117
121
|
})?;
|
|
@@ -133,7 +137,7 @@ impl ItsiBodyProxy {
|
|
|
133
137
|
fn verify_open(&self) -> MagnusResult<()> {
|
|
134
138
|
if self.closed.load(atomic::Ordering::SeqCst) {
|
|
135
139
|
return Err(magnus::Error::new(
|
|
136
|
-
magnus::
|
|
140
|
+
magnus::Ruby::get().unwrap().exception_standard_error(),
|
|
137
141
|
"Body stream is closed",
|
|
138
142
|
));
|
|
139
143
|
}
|
|
@@ -64,7 +64,9 @@ impl ItsiGrpcCall {
|
|
|
64
64
|
let snake_case_method_name = METHOD_NAME_REGEX
|
|
65
65
|
.replace_all(method_name, "${1}_${2}")
|
|
66
66
|
.to_lowercase();
|
|
67
|
-
Ok(
|
|
67
|
+
Ok(magnus::Ruby::get()
|
|
68
|
+
.unwrap()
|
|
69
|
+
.to_symbol(snake_case_method_name))
|
|
68
70
|
}
|
|
69
71
|
|
|
70
72
|
pub fn stream(&self) -> MagnusResult<ItsiGrpcResponseStream> {
|
|
@@ -205,7 +207,7 @@ impl ItsiGrpcCall {
|
|
|
205
207
|
})
|
|
206
208
|
.map_err(|e: std::io::Error| {
|
|
207
209
|
Error::new(
|
|
208
|
-
magnus::
|
|
210
|
+
magnus::Ruby::get().unwrap().exception_standard_error(),
|
|
209
211
|
format!("deflate decompression failed: {}", e),
|
|
210
212
|
)
|
|
211
213
|
})?;
|
|
@@ -224,7 +226,7 @@ impl ItsiGrpcCall {
|
|
|
224
226
|
})
|
|
225
227
|
.map_err(|e: std::io::Error| {
|
|
226
228
|
Error::new(
|
|
227
|
-
magnus::
|
|
229
|
+
magnus::Ruby::get().unwrap().exception_standard_error(),
|
|
228
230
|
format!("gzip decompression failed: {}", e),
|
|
229
231
|
)
|
|
230
232
|
})?;
|
|
@@ -243,7 +245,7 @@ impl ItsiGrpcCall {
|
|
|
243
245
|
})
|
|
244
246
|
.map_err(|e| {
|
|
245
247
|
Error::new(
|
|
246
|
-
magnus::
|
|
248
|
+
magnus::Ruby::get().unwrap().exception_standard_error(),
|
|
247
249
|
format!("gzip compression failed: {e}"),
|
|
248
250
|
)
|
|
249
251
|
})?;
|
|
@@ -262,7 +264,7 @@ impl ItsiGrpcCall {
|
|
|
262
264
|
})
|
|
263
265
|
.map_err(|e| {
|
|
264
266
|
Error::new(
|
|
265
|
-
magnus::
|
|
267
|
+
magnus::Ruby::get().unwrap().exception_standard_error(),
|
|
266
268
|
format!("deflate compression failed: {e}"),
|
|
267
269
|
)
|
|
268
270
|
})?;
|
|
@@ -59,7 +59,7 @@ impl ItsiGrpcResponseStreamInner {
|
|
|
59
59
|
.blocking_send(ByteFrame::Data(bytes))
|
|
60
60
|
.map_err(|err| {
|
|
61
61
|
magnus::Error::new(
|
|
62
|
-
magnus::
|
|
62
|
+
magnus::Ruby::get().unwrap().exception_io_error(),
|
|
63
63
|
format!("Trying to write to closed stream: {:?}", err),
|
|
64
64
|
)
|
|
65
65
|
})?;
|
|
@@ -80,7 +80,7 @@ impl ItsiGrpcResponseStreamInner {
|
|
|
80
80
|
let trailer_tx = std::mem::replace(&mut self.trailer_tx, oneshot::channel().0);
|
|
81
81
|
trailer_tx.send(header_map).map_err(|err| {
|
|
82
82
|
magnus::Error::new(
|
|
83
|
-
magnus::
|
|
83
|
+
magnus::Ruby::get().unwrap().exception_standard_error(),
|
|
84
84
|
format!("Error sending trailers {:?}", err),
|
|
85
85
|
)
|
|
86
86
|
})?;
|
|
@@ -6,9 +6,9 @@ use itsi_error::CLIENT_CONNECTION_CLOSED;
|
|
|
6
6
|
use itsi_rb_helpers::{funcall_no_ret, print_rb_backtrace, HeapValue};
|
|
7
7
|
use itsi_tracing::debug;
|
|
8
8
|
use magnus::{
|
|
9
|
-
block::
|
|
9
|
+
block::Proc,
|
|
10
10
|
error::{ErrorType, Result as MagnusResult},
|
|
11
|
-
Error, IntoValue, RHash,
|
|
11
|
+
Error, IntoValue, RHash,
|
|
12
12
|
};
|
|
13
13
|
use magnus::{
|
|
14
14
|
value::{LazyId, ReprValue},
|
|
@@ -110,20 +110,20 @@ impl ItsiHttpRequest {
|
|
|
110
110
|
// when building against Ruby < 3.2...
|
|
111
111
|
#[cfg(not(ruby_gte_3_2))]
|
|
112
112
|
{
|
|
113
|
-
|
|
113
|
+
magnus::Ruby::get().unwrap().hash_new()
|
|
114
114
|
}
|
|
115
115
|
};
|
|
116
116
|
for (i, group_name) in re.capture_names().enumerate().skip(1) {
|
|
117
117
|
if let Some(name) = group_name {
|
|
118
118
|
if let Some(m) = caps.get(i) {
|
|
119
119
|
// Insert into the hash: key is the group name, value is the match.
|
|
120
|
-
params.aset(
|
|
120
|
+
params.aset(magnus::Ruby::get().unwrap().to_symbol(name), m.as_str())?;
|
|
121
121
|
}
|
|
122
122
|
}
|
|
123
123
|
}
|
|
124
124
|
Ok(params)
|
|
125
125
|
} else {
|
|
126
|
-
Ok(
|
|
126
|
+
Ok(magnus::Ruby::get().unwrap().hash_new())
|
|
127
127
|
}
|
|
128
128
|
}
|
|
129
129
|
|
|
@@ -201,7 +201,7 @@ impl ItsiHttpRequest {
|
|
|
201
201
|
}
|
|
202
202
|
},
|
|
203
203
|
Ok(_) => match receiver.await {
|
|
204
|
-
Ok(ResponseFrame::HttpResponse(response)) => Ok(response),
|
|
204
|
+
Ok(ResponseFrame::HttpResponse(response)) => Ok(*response),
|
|
205
205
|
Ok(ResponseFrame::HijackedResponse(response)) => {
|
|
206
206
|
match response.process_hijacked_response().await {
|
|
207
207
|
Ok(result) => Ok(result),
|
|
@@ -354,7 +354,10 @@ impl ItsiHttpRequest {
|
|
|
354
354
|
|
|
355
355
|
pub(crate) fn each_header(&self) -> MagnusResult<()> {
|
|
356
356
|
self.parts.headers.iter().for_each(|(hn, hv)| {
|
|
357
|
-
|
|
357
|
+
magnus::Ruby::get()
|
|
358
|
+
.unwrap()
|
|
359
|
+
.yield_values::<_, Value>((hn.as_str(), hv.to_str().unwrap_or("")))
|
|
360
|
+
.ok();
|
|
358
361
|
});
|
|
359
362
|
Ok(())
|
|
360
363
|
}
|
|
@@ -63,7 +63,7 @@ pub struct ResponseInner {
|
|
|
63
63
|
|
|
64
64
|
#[derive(Debug)]
|
|
65
65
|
pub enum ResponseFrame {
|
|
66
|
-
HttpResponse(HttpResponse),
|
|
66
|
+
HttpResponse(Box<HttpResponse>),
|
|
67
67
|
HijackedResponse(ItsiHttpResponse),
|
|
68
68
|
}
|
|
69
69
|
|
|
@@ -225,7 +225,9 @@ impl ItsiHttpResponse {
|
|
|
225
225
|
if let Some(mut response) = self.response.write().take() {
|
|
226
226
|
*response.status_mut() = StatusCode::INTERNAL_SERVER_ERROR;
|
|
227
227
|
if let Some(sender) = self.response_sender.write().take() {
|
|
228
|
-
sender
|
|
228
|
+
sender
|
|
229
|
+
.send(ResponseFrame::HttpResponse(Box::new(response)))
|
|
230
|
+
.ok();
|
|
229
231
|
}
|
|
230
232
|
}
|
|
231
233
|
}
|
|
@@ -235,7 +237,9 @@ impl ItsiHttpResponse {
|
|
|
235
237
|
if let Some(mut response) = self.response.write().take() {
|
|
236
238
|
*response.status_mut() = StatusCode::SERVICE_UNAVAILABLE;
|
|
237
239
|
if let Some(sender) = self.response_sender.write().take() {
|
|
238
|
-
sender
|
|
240
|
+
sender
|
|
241
|
+
.send(ResponseFrame::HttpResponse(Box::new(response)))
|
|
242
|
+
.ok();
|
|
239
243
|
}
|
|
240
244
|
}
|
|
241
245
|
}
|
|
@@ -253,7 +257,9 @@ impl ItsiHttpResponse {
|
|
|
253
257
|
*response.body_mut() = HttpBody::stream(buffered);
|
|
254
258
|
self.frame_writer.write().replace(writer);
|
|
255
259
|
if let Some(sender) = self.response_sender.write().take() {
|
|
256
|
-
sender
|
|
260
|
+
sender
|
|
261
|
+
.send(ResponseFrame::HttpResponse(Box::new(response)))
|
|
262
|
+
.ok();
|
|
257
263
|
}
|
|
258
264
|
} else {
|
|
259
265
|
info!("No response!");
|
|
@@ -280,7 +286,9 @@ impl ItsiHttpResponse {
|
|
|
280
286
|
*response.body_mut() = HttpBody::full(frame);
|
|
281
287
|
}
|
|
282
288
|
if let Some(sender) = self.response_sender.write().take() {
|
|
283
|
-
sender
|
|
289
|
+
sender
|
|
290
|
+
.send(ResponseFrame::HttpResponse(Box::new(response)))
|
|
291
|
+
.ok();
|
|
284
292
|
}
|
|
285
293
|
}
|
|
286
294
|
|
|
@@ -110,7 +110,7 @@ pub fn send_watcher_command(fd: &OwnedFd, cmd: WatcherCommand) -> Result<()> {
|
|
|
110
110
|
match write(fd, &buf) {
|
|
111
111
|
Ok(_) => Ok(()),
|
|
112
112
|
Err(e) => Err(magnus::Error::new(
|
|
113
|
-
magnus::
|
|
113
|
+
magnus::Ruby::get().unwrap().exception_standard_error(),
|
|
114
114
|
format!("Failed to send command to watcher: {}", e),
|
|
115
115
|
)),
|
|
116
116
|
}
|
|
@@ -122,14 +122,14 @@ pub fn watch_groups(
|
|
|
122
122
|
// Create bidirectional pipes for communication
|
|
123
123
|
let (parent_read_fd, child_write_fd): (OwnedFd, OwnedFd) = pipe().map_err(|e| {
|
|
124
124
|
magnus::Error::new(
|
|
125
|
-
magnus::
|
|
125
|
+
magnus::Ruby::get().unwrap().exception_standard_error(),
|
|
126
126
|
format!("Failed to create parent read pipe: {}", e),
|
|
127
127
|
)
|
|
128
128
|
})?;
|
|
129
129
|
|
|
130
130
|
let (child_read_fd, parent_write_fd): (OwnedFd, OwnedFd) = pipe().map_err(|e| {
|
|
131
131
|
magnus::Error::new(
|
|
132
|
-
magnus::
|
|
132
|
+
magnus::Ruby::get().unwrap().exception_standard_error(),
|
|
133
133
|
format!("Failed to create child read pipe: {}", e),
|
|
134
134
|
)
|
|
135
135
|
})?;
|
|
@@ -137,7 +137,7 @@ pub fn watch_groups(
|
|
|
137
137
|
let fork_result = unsafe {
|
|
138
138
|
fork().map_err(|e| {
|
|
139
139
|
magnus::Error::new(
|
|
140
|
-
magnus::
|
|
140
|
+
magnus::Ruby::get().unwrap().exception_standard_error(),
|
|
141
141
|
format!("Failed to fork file watcher: {}", e),
|
|
142
142
|
)
|
|
143
143
|
})
|
|
@@ -194,7 +194,7 @@ pub fn watch_groups(
|
|
|
194
194
|
|
|
195
195
|
let glob = Glob::new(&remaining_pattern).map_err(|e| {
|
|
196
196
|
magnus::Error::new(
|
|
197
|
-
magnus::
|
|
197
|
+
magnus::Ruby::get().unwrap().exception_standard_error(),
|
|
198
198
|
format!(
|
|
199
199
|
"Failed to create watch glob for pattern '{}': {}",
|
|
200
200
|
remaining_pattern, e
|
|
@@ -203,7 +203,7 @@ pub fn watch_groups(
|
|
|
203
203
|
})?;
|
|
204
204
|
let glob_set = GlobSetBuilder::new().add(glob).build().map_err(|e| {
|
|
205
205
|
magnus::Error::new(
|
|
206
|
-
magnus::
|
|
206
|
+
magnus::Ruby::get().unwrap().exception_standard_error(),
|
|
207
207
|
format!("Failed to create watch glob set: {}", e),
|
|
208
208
|
)
|
|
209
209
|
})?;
|