itsi 0.2.21 → 0.2.23
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/CHANGELOG.md +3 -0
- data/Cargo.lock +26 -12
- data/Cargo.toml +4 -0
- data/Dockerfile +2 -2
- data/Rakefile +4 -0
- data/crates/itsi_scheduler/Cargo.toml +1 -1
- data/crates/itsi_server/Cargo.lock +2 -2
- data/crates/itsi_server/Cargo.toml +1 -1
- data/crates/itsi_server/src/server/middleware_stack/mod.rs +3 -9
- data/crates/itsi_server/src/server/signal.rs +7 -5
- data/crates/itsi_server/src/services/itsi_http_service.rs +5 -8
- data/gems/scheduler/Cargo.lock +518 -3986
- data/gems/scheduler/Cargo.toml +4 -0
- data/gems/scheduler/Gemfile +11 -0
- data/gems/scheduler/Rakefile +21 -6
- data/gems/scheduler/itsi-scheduler.gemspec +5 -1
- data/gems/scheduler/lib/itsi/scheduler/native_extension.rb +34 -0
- data/gems/scheduler/lib/itsi/scheduler/version.rb +1 -1
- data/gems/scheduler/lib/itsi/scheduler.rb +1 -1
- data/gems/scheduler/test/test_block_unblock.rb +1 -1
- data/gems/scheduler/vendor/rb-sys-build/.cargo-ok +1 -0
- data/gems/scheduler/vendor/rb-sys-build/.cargo_vcs_info.json +6 -0
- data/gems/scheduler/vendor/rb-sys-build/Cargo.lock +294 -0
- data/gems/scheduler/vendor/rb-sys-build/Cargo.toml +71 -0
- data/gems/scheduler/vendor/rb-sys-build/Cargo.toml.orig +32 -0
- data/gems/scheduler/vendor/rb-sys-build/LICENSE-APACHE +190 -0
- data/gems/scheduler/vendor/rb-sys-build/LICENSE-MIT +21 -0
- data/gems/scheduler/vendor/rb-sys-build/src/bindings/sanitizer.rs +185 -0
- data/gems/scheduler/vendor/rb-sys-build/src/bindings/stable_api.rs +247 -0
- data/gems/scheduler/vendor/rb-sys-build/src/bindings/wrapper.h +71 -0
- data/gems/scheduler/vendor/rb-sys-build/src/bindings.rs +280 -0
- data/gems/scheduler/vendor/rb-sys-build/src/cc.rs +421 -0
- data/gems/scheduler/vendor/rb-sys-build/src/lib.rs +12 -0
- data/gems/scheduler/vendor/rb-sys-build/src/rb_config/flags.rs +101 -0
- data/gems/scheduler/vendor/rb-sys-build/src/rb_config/library.rs +132 -0
- data/gems/scheduler/vendor/rb-sys-build/src/rb_config/search_path.rs +57 -0
- data/gems/scheduler/vendor/rb-sys-build/src/rb_config.rs +906 -0
- data/gems/scheduler/vendor/rb-sys-build/src/utils.rs +53 -0
- data/gems/server/Cargo.lock +25 -38
- data/gems/server/Cargo.toml +4 -0
- data/gems/server/Gemfile +23 -0
- data/gems/server/Rakefile +39 -7
- data/gems/server/itsi-server.gemspec +5 -1
- data/gems/server/lib/itsi/server/native_extension.rb +34 -0
- data/gems/server/lib/itsi/server/version.rb +1 -1
- data/gems/server/lib/itsi/server.rb +10 -2
- data/gems/server/test/helpers/test_helper.rb +19 -0
- data/gems/server/test/options/unmatched_request.rb +29 -0
- data/gems/server/test/rack/test_rack_server.rb +14 -2
- data/gems/server/vendor/rb-sys-build/.cargo-ok +1 -0
- data/gems/server/vendor/rb-sys-build/.cargo_vcs_info.json +6 -0
- data/gems/server/vendor/rb-sys-build/Cargo.lock +294 -0
- data/gems/server/vendor/rb-sys-build/Cargo.toml +71 -0
- data/gems/server/vendor/rb-sys-build/Cargo.toml.orig +32 -0
- data/gems/server/vendor/rb-sys-build/LICENSE-APACHE +190 -0
- data/gems/server/vendor/rb-sys-build/LICENSE-MIT +21 -0
- data/gems/server/vendor/rb-sys-build/src/bindings/sanitizer.rs +185 -0
- data/gems/server/vendor/rb-sys-build/src/bindings/stable_api.rs +247 -0
- data/gems/server/vendor/rb-sys-build/src/bindings/wrapper.h +71 -0
- data/gems/server/vendor/rb-sys-build/src/bindings.rs +280 -0
- data/gems/server/vendor/rb-sys-build/src/cc.rs +421 -0
- data/gems/server/vendor/rb-sys-build/src/lib.rs +12 -0
- data/gems/server/vendor/rb-sys-build/src/rb_config/flags.rs +101 -0
- data/gems/server/vendor/rb-sys-build/src/rb_config/library.rs +132 -0
- data/gems/server/vendor/rb-sys-build/src/rb_config/search_path.rs +57 -0
- data/gems/server/vendor/rb-sys-build/src/rb_config.rs +906 -0
- data/gems/server/vendor/rb-sys-build/src/utils.rs +53 -0
- data/lib/itsi/version.rb +1 -1
- data/script/ci/resolve_version.rb +32 -0
- data/script/ci/set_version.rb +53 -0
- data/script/ci/setup_cibuildgem_rake_compiler.sh +63 -0
- data/script/ci/smoke_scheduler.rb +24 -0
- data/script/ci/smoke_server.rb +38 -0
- 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 +69 -5
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
use crate::debug_log;
|
|
2
|
+
|
|
3
|
+
/// Check if current platform is mswin.
|
|
4
|
+
pub fn is_msvc() -> bool {
|
|
5
|
+
if let Ok(target) = std::env::var("TARGET") {
|
|
6
|
+
target.contains("msvc")
|
|
7
|
+
} else {
|
|
8
|
+
false
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/// Check if current platform is mswin or mingw.
|
|
13
|
+
pub fn is_mswin_or_mingw() -> bool {
|
|
14
|
+
if let Ok(target) = std::env::var("TARGET") {
|
|
15
|
+
target.contains("msvc") || target.contains("pc-windows-gnu")
|
|
16
|
+
} else {
|
|
17
|
+
false
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/// Splits shell words.
|
|
22
|
+
pub fn shellsplit<S: AsRef<str>>(s: S) -> Vec<String> {
|
|
23
|
+
let s = s.as_ref();
|
|
24
|
+
match shell_words::split(s) {
|
|
25
|
+
Ok(v) => v,
|
|
26
|
+
Err(e) => {
|
|
27
|
+
debug_log!("WARN: shellsplit failed: {}", e);
|
|
28
|
+
s.split_whitespace().map(Into::into).collect()
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
#[macro_export]
|
|
34
|
+
macro_rules! memoize {
|
|
35
|
+
($type:ty: $val:expr) => {{
|
|
36
|
+
static INIT: std::sync::Once = std::sync::Once::new();
|
|
37
|
+
static mut VALUE: Option<$type> = None;
|
|
38
|
+
#[allow(static_mut_refs)]
|
|
39
|
+
unsafe {
|
|
40
|
+
INIT.call_once(|| {
|
|
41
|
+
VALUE = Some($val);
|
|
42
|
+
});
|
|
43
|
+
VALUE.as_ref().unwrap()
|
|
44
|
+
}
|
|
45
|
+
}};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
#[macro_export]
|
|
49
|
+
macro_rules! debug_log {
|
|
50
|
+
($($arg:tt)*) => {
|
|
51
|
+
eprintln!($($arg)*);
|
|
52
|
+
};
|
|
53
|
+
}
|
data/gems/server/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]]
|
|
@@ -1642,27 +1660,9 @@ version = "1.0.15"
|
|
|
1642
1660
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1643
1661
|
checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
|
|
1644
1662
|
|
|
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
|
-
|
|
1663
1663
|
[[package]]
|
|
1664
1664
|
name = "itsi-server"
|
|
1665
|
-
version = "0.2.
|
|
1665
|
+
version = "0.2.23"
|
|
1666
1666
|
dependencies = [
|
|
1667
1667
|
"argon2",
|
|
1668
1668
|
"async-channel",
|
|
@@ -1772,15 +1772,6 @@ dependencies = [
|
|
|
1772
1772
|
"thiserror 2.0.12",
|
|
1773
1773
|
]
|
|
1774
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
|
-
|
|
1784
1775
|
[[package]]
|
|
1785
1776
|
name = "itsi_rb_helpers"
|
|
1786
1777
|
version = "0.1.0"
|
|
@@ -1934,8 +1925,7 @@ checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
|
|
|
1934
1925
|
[[package]]
|
|
1935
1926
|
name = "magnus"
|
|
1936
1927
|
version = "0.8.2"
|
|
1937
|
-
source = "
|
|
1938
|
-
checksum = "3b36a5b126bbe97eb0d02d07acfeb327036c6319fd816139a49824a83b7f9012"
|
|
1928
|
+
source = "git+https://github.com/matsadler/magnus.git?rev=1ed232edb2b75a2eed9b1def34ad57e55c411a5c#1ed232edb2b75a2eed9b1def34ad57e55c411a5c"
|
|
1939
1929
|
dependencies = [
|
|
1940
1930
|
"bytes",
|
|
1941
1931
|
"magnus-macros",
|
|
@@ -1947,8 +1937,7 @@ dependencies = [
|
|
|
1947
1937
|
[[package]]
|
|
1948
1938
|
name = "magnus-macros"
|
|
1949
1939
|
version = "0.8.0"
|
|
1950
|
-
source = "
|
|
1951
|
-
checksum = "47607461fd8e1513cb4f2076c197d8092d921a1ea75bd08af97398f593751892"
|
|
1940
|
+
source = "git+https://github.com/matsadler/magnus.git?rev=1ed232edb2b75a2eed9b1def34ad57e55c411a5c#1ed232edb2b75a2eed9b1def34ad57e55c411a5c"
|
|
1952
1941
|
dependencies = [
|
|
1953
1942
|
"proc-macro2",
|
|
1954
1943
|
"quote",
|
|
@@ -2591,10 +2580,8 @@ dependencies = [
|
|
|
2591
2580
|
[[package]]
|
|
2592
2581
|
name = "rb-sys-build"
|
|
2593
2582
|
version = "0.9.124"
|
|
2594
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2595
|
-
checksum = "568068db4102230882e6d4ae8de6632e224ca75fe5970f6e026a04e91ed635d3"
|
|
2596
2583
|
dependencies = [
|
|
2597
|
-
"bindgen",
|
|
2584
|
+
"bindgen 0.72.1",
|
|
2598
2585
|
"lazy_static",
|
|
2599
2586
|
"proc-macro2",
|
|
2600
2587
|
"quote",
|
|
@@ -3922,7 +3909,7 @@ version = "0.1.9"
|
|
|
3922
3909
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
3923
3910
|
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
|
|
3924
3911
|
dependencies = [
|
|
3925
|
-
"windows-sys 0.
|
|
3912
|
+
"windows-sys 0.48.0",
|
|
3926
3913
|
]
|
|
3927
3914
|
|
|
3928
3915
|
[[package]]
|
data/gems/server/Cargo.toml
CHANGED
data/gems/server/Gemfile
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
source "https://rubygems.org"
|
|
2
|
+
|
|
3
|
+
gemspec
|
|
4
|
+
|
|
5
|
+
group :development, :test do
|
|
6
|
+
gem "bundler"
|
|
7
|
+
gem "minitest", "~> 5.16"
|
|
8
|
+
gem "rack"
|
|
9
|
+
gem "rackup"
|
|
10
|
+
gem "rake", "~> 13.0"
|
|
11
|
+
gem "rake-compiler"
|
|
12
|
+
gem "rb_sys", "~> 0.9.91"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
group :server_test do
|
|
16
|
+
gem "grpc"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
group :server_test_support do
|
|
20
|
+
gem "jwt"
|
|
21
|
+
gem "net_http_unix"
|
|
22
|
+
gem "redis"
|
|
23
|
+
end
|
data/gems/server/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
|
|
@@ -29,7 +29,11 @@ Gem::Specification.new do |spec|
|
|
|
29
29
|
end
|
|
30
30
|
end + Dir["../../crates/**/*.{toml,rs,lock,html,json}"].map do |ext_file|
|
|
31
31
|
"ext/#{ext_file[%r{.*crates/(.*?)$}, 1]}"
|
|
32
|
-
end.compact
|
|
32
|
+
end.compact +
|
|
33
|
+
Dir["vendor/rb-sys-build/**/*.{toml,rs,h,lock}"] +
|
|
34
|
+
Dir["vendor/rb-sys-build/LICENSE-*"] +
|
|
35
|
+
Dir.glob("lib/**/*.{rb,bundle,so,dylib,dll}")
|
|
36
|
+
spec.files.uniq!
|
|
33
37
|
|
|
34
38
|
spec.bindir = "exe"
|
|
35
39
|
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rbconfig"
|
|
4
|
+
|
|
5
|
+
module Itsi
|
|
6
|
+
class Server
|
|
7
|
+
module NativeExtension
|
|
8
|
+
module_function
|
|
9
|
+
|
|
10
|
+
def require!
|
|
11
|
+
ruby_abi = RUBY_VERSION[/\A\d+\.\d+/]
|
|
12
|
+
|
|
13
|
+
if ruby_abi && versioned_binary_present?(ruby_abi)
|
|
14
|
+
begin
|
|
15
|
+
require_relative "#{ruby_abi}/itsi_server"
|
|
16
|
+
return
|
|
17
|
+
rescue LoadError
|
|
18
|
+
# Fall back to the source-built extension when a packaged binary
|
|
19
|
+
# exists but cannot be loaded on this machine.
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
require_relative "itsi_server"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def versioned_binary_present?(ruby_abi)
|
|
27
|
+
binary_path = File.join(__dir__, ruby_abi, "itsi_server.#{RbConfig::CONFIG.fetch("DLEXT")}")
|
|
28
|
+
File.exist?(binary_path)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
Itsi::Server::NativeExtension.require!
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require_relative "server/version"
|
|
4
|
-
require_relative "server/
|
|
4
|
+
require_relative "server/native_extension"
|
|
5
5
|
require_relative "server/rack_interface"
|
|
6
6
|
require_relative "server/grpc/grpc_interface"
|
|
7
7
|
require_relative "server/grpc/grpc_call"
|
|
@@ -87,7 +87,15 @@ module Itsi
|
|
|
87
87
|
|
|
88
88
|
def stop_background_threads
|
|
89
89
|
@running && @running.each(&:stop)
|
|
90
|
-
@background_threads&.each
|
|
90
|
+
@background_threads&.each do |thread|
|
|
91
|
+
next unless thread
|
|
92
|
+
|
|
93
|
+
thread.join(5)
|
|
94
|
+
next unless thread.alive?
|
|
95
|
+
|
|
96
|
+
thread.kill
|
|
97
|
+
thread.join(1)
|
|
98
|
+
end
|
|
91
99
|
@background_threads = []
|
|
92
100
|
@running = []
|
|
93
101
|
end
|
|
@@ -90,6 +90,25 @@ class RequestContext
|
|
|
90
90
|
client.request(request)
|
|
91
91
|
end
|
|
92
92
|
|
|
93
|
+
def raw_http(request)
|
|
94
|
+
socket = TCPSocket.new(@uri.host, @uri.port)
|
|
95
|
+
socket.write(request)
|
|
96
|
+
socket.flush
|
|
97
|
+
|
|
98
|
+
response = +""
|
|
99
|
+
loop do
|
|
100
|
+
ready = IO.select([socket], nil, nil, 1)
|
|
101
|
+
break unless ready
|
|
102
|
+
|
|
103
|
+
response << socket.readpartial(16 * 1024)
|
|
104
|
+
rescue EOFError
|
|
105
|
+
break
|
|
106
|
+
end
|
|
107
|
+
response
|
|
108
|
+
ensure
|
|
109
|
+
socket&.close
|
|
110
|
+
end
|
|
111
|
+
|
|
93
112
|
def head(path)
|
|
94
113
|
request = Net::HTTP::Head.new(uri_for(path))
|
|
95
114
|
client.request(request)
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require_relative "../helpers/test_helper"
|
|
2
|
+
|
|
3
|
+
class TestUnmatchedRequest < Minitest::Test
|
|
4
|
+
def test_connect_request_without_matching_stack_does_not_stop_listener
|
|
5
|
+
server(
|
|
6
|
+
itsi_rb: lambda do
|
|
7
|
+
get("/ok") { |r| r.respond("ok") }
|
|
8
|
+
end
|
|
9
|
+
) do
|
|
10
|
+
response = raw_http("CONNECT google.com:443 HTTP/1.1\r\nHost: google.com:443\r\n\r\n")
|
|
11
|
+
|
|
12
|
+
assert_match(/\AHTTP\/\d(?:\.\d)? 404\b/, response)
|
|
13
|
+
assert_equal "ok", get("/ok")
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def test_origin_form_request_without_leading_slash_does_not_stop_listener
|
|
18
|
+
server(
|
|
19
|
+
itsi_rb: lambda do
|
|
20
|
+
get("/ok") { |r| r.respond("ok") }
|
|
21
|
+
end
|
|
22
|
+
) do
|
|
23
|
+
response = raw_http("GET default.asp HTTP/1.1\r\nHost: example.com\r\n\r\n")
|
|
24
|
+
|
|
25
|
+
assert_match(/\AHTTP\/\d(?:\.\d)? 404\b/, response)
|
|
26
|
+
assert_equal "ok", get("/ok")
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -302,8 +302,20 @@ class TestRackServer < Minitest::Test
|
|
|
302
302
|
)
|
|
303
303
|
end
|
|
304
304
|
|
|
305
|
-
|
|
306
|
-
|
|
305
|
+
response = nil
|
|
306
|
+
|
|
307
|
+
Timeout.timeout(2) do
|
|
308
|
+
loop do
|
|
309
|
+
begin
|
|
310
|
+
response = Net::HTTP.get(URI("http://#{host}:#{port}"))
|
|
311
|
+
break
|
|
312
|
+
rescue Errno::ECONNREFUSED, Net::OpenTimeout
|
|
313
|
+
sleep 0.05
|
|
314
|
+
end
|
|
315
|
+
end
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
assert_equal "Hello, Rackup!", response
|
|
307
319
|
Process.kill(:SIGINT, Process.pid)
|
|
308
320
|
end
|
|
309
321
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"v":1}
|