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.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +3 -0
  3. data/Cargo.lock +26 -12
  4. data/Cargo.toml +4 -0
  5. data/Dockerfile +2 -2
  6. data/Rakefile +4 -0
  7. data/crates/itsi_scheduler/Cargo.toml +1 -1
  8. data/crates/itsi_server/Cargo.lock +2 -2
  9. data/crates/itsi_server/Cargo.toml +1 -1
  10. data/crates/itsi_server/src/server/middleware_stack/mod.rs +3 -9
  11. data/crates/itsi_server/src/server/signal.rs +7 -5
  12. data/crates/itsi_server/src/services/itsi_http_service.rs +5 -8
  13. data/gems/scheduler/Cargo.lock +518 -3986
  14. data/gems/scheduler/Cargo.toml +4 -0
  15. data/gems/scheduler/Gemfile +11 -0
  16. data/gems/scheduler/Rakefile +21 -6
  17. data/gems/scheduler/itsi-scheduler.gemspec +5 -1
  18. data/gems/scheduler/lib/itsi/scheduler/native_extension.rb +34 -0
  19. data/gems/scheduler/lib/itsi/scheduler/version.rb +1 -1
  20. data/gems/scheduler/lib/itsi/scheduler.rb +1 -1
  21. data/gems/scheduler/test/test_block_unblock.rb +1 -1
  22. data/gems/scheduler/vendor/rb-sys-build/.cargo-ok +1 -0
  23. data/gems/scheduler/vendor/rb-sys-build/.cargo_vcs_info.json +6 -0
  24. data/gems/scheduler/vendor/rb-sys-build/Cargo.lock +294 -0
  25. data/gems/scheduler/vendor/rb-sys-build/Cargo.toml +71 -0
  26. data/gems/scheduler/vendor/rb-sys-build/Cargo.toml.orig +32 -0
  27. data/gems/scheduler/vendor/rb-sys-build/LICENSE-APACHE +190 -0
  28. data/gems/scheduler/vendor/rb-sys-build/LICENSE-MIT +21 -0
  29. data/gems/scheduler/vendor/rb-sys-build/src/bindings/sanitizer.rs +185 -0
  30. data/gems/scheduler/vendor/rb-sys-build/src/bindings/stable_api.rs +247 -0
  31. data/gems/scheduler/vendor/rb-sys-build/src/bindings/wrapper.h +71 -0
  32. data/gems/scheduler/vendor/rb-sys-build/src/bindings.rs +280 -0
  33. data/gems/scheduler/vendor/rb-sys-build/src/cc.rs +421 -0
  34. data/gems/scheduler/vendor/rb-sys-build/src/lib.rs +12 -0
  35. data/gems/scheduler/vendor/rb-sys-build/src/rb_config/flags.rs +101 -0
  36. data/gems/scheduler/vendor/rb-sys-build/src/rb_config/library.rs +132 -0
  37. data/gems/scheduler/vendor/rb-sys-build/src/rb_config/search_path.rs +57 -0
  38. data/gems/scheduler/vendor/rb-sys-build/src/rb_config.rs +906 -0
  39. data/gems/scheduler/vendor/rb-sys-build/src/utils.rs +53 -0
  40. data/gems/server/Cargo.lock +25 -38
  41. data/gems/server/Cargo.toml +4 -0
  42. data/gems/server/Gemfile +23 -0
  43. data/gems/server/Rakefile +39 -7
  44. data/gems/server/itsi-server.gemspec +5 -1
  45. data/gems/server/lib/itsi/server/native_extension.rb +34 -0
  46. data/gems/server/lib/itsi/server/version.rb +1 -1
  47. data/gems/server/lib/itsi/server.rb +10 -2
  48. data/gems/server/test/helpers/test_helper.rb +19 -0
  49. data/gems/server/test/options/unmatched_request.rb +29 -0
  50. data/gems/server/test/rack/test_rack_server.rb +14 -2
  51. data/gems/server/vendor/rb-sys-build/.cargo-ok +1 -0
  52. data/gems/server/vendor/rb-sys-build/.cargo_vcs_info.json +6 -0
  53. data/gems/server/vendor/rb-sys-build/Cargo.lock +294 -0
  54. data/gems/server/vendor/rb-sys-build/Cargo.toml +71 -0
  55. data/gems/server/vendor/rb-sys-build/Cargo.toml.orig +32 -0
  56. data/gems/server/vendor/rb-sys-build/LICENSE-APACHE +190 -0
  57. data/gems/server/vendor/rb-sys-build/LICENSE-MIT +21 -0
  58. data/gems/server/vendor/rb-sys-build/src/bindings/sanitizer.rs +185 -0
  59. data/gems/server/vendor/rb-sys-build/src/bindings/stable_api.rs +247 -0
  60. data/gems/server/vendor/rb-sys-build/src/bindings/wrapper.h +71 -0
  61. data/gems/server/vendor/rb-sys-build/src/bindings.rs +280 -0
  62. data/gems/server/vendor/rb-sys-build/src/cc.rs +421 -0
  63. data/gems/server/vendor/rb-sys-build/src/lib.rs +12 -0
  64. data/gems/server/vendor/rb-sys-build/src/rb_config/flags.rs +101 -0
  65. data/gems/server/vendor/rb-sys-build/src/rb_config/library.rs +132 -0
  66. data/gems/server/vendor/rb-sys-build/src/rb_config/search_path.rs +57 -0
  67. data/gems/server/vendor/rb-sys-build/src/rb_config.rs +906 -0
  68. data/gems/server/vendor/rb-sys-build/src/utils.rs +53 -0
  69. data/lib/itsi/version.rb +1 -1
  70. data/script/ci/resolve_version.rb +32 -0
  71. data/script/ci/set_version.rb +53 -0
  72. data/script/ci/setup_cibuildgem_rake_compiler.sh +63 -0
  73. data/script/ci/smoke_scheduler.rb +24 -0
  74. data/script/ci/smoke_server.rb +38 -0
  75. data/vendor/rb-sys-build/.cargo-ok +1 -0
  76. data/vendor/rb-sys-build/.cargo_vcs_info.json +6 -0
  77. data/vendor/rb-sys-build/Cargo.lock +294 -0
  78. data/vendor/rb-sys-build/Cargo.toml +71 -0
  79. data/vendor/rb-sys-build/Cargo.toml.orig +32 -0
  80. data/vendor/rb-sys-build/LICENSE-APACHE +190 -0
  81. data/vendor/rb-sys-build/LICENSE-MIT +21 -0
  82. data/vendor/rb-sys-build/src/bindings/sanitizer.rs +185 -0
  83. data/vendor/rb-sys-build/src/bindings/stable_api.rs +247 -0
  84. data/vendor/rb-sys-build/src/bindings/wrapper.h +71 -0
  85. data/vendor/rb-sys-build/src/bindings.rs +280 -0
  86. data/vendor/rb-sys-build/src/cc.rs +421 -0
  87. data/vendor/rb-sys-build/src/lib.rs +12 -0
  88. data/vendor/rb-sys-build/src/rb_config/flags.rs +101 -0
  89. data/vendor/rb-sys-build/src/rb_config/library.rs +132 -0
  90. data/vendor/rb-sys-build/src/rb_config/search_path.rs +57 -0
  91. data/vendor/rb-sys-build/src/rb_config.rs +906 -0
  92. data/vendor/rb-sys-build/src/utils.rs +53 -0
  93. 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
+ }
@@ -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.59.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.21"
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 = "registry+https://github.com/rust-lang/crates.io-index"
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 = "registry+https://github.com/rust-lang/crates.io-index"
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.59.0",
3912
+ "windows-sys 0.48.0",
3926
3913
  ]
3927
3914
 
3928
3915
  [[package]]
@@ -5,3 +5,7 @@
5
5
  [workspace]
6
6
  members = ["./ext/itsi_server"]
7
7
  resolver = "2"
8
+
9
+ [patch.crates-io]
10
+ magnus = { git = "https://github.com/matsadler/magnus.git", rev = "1ed232edb2b75a2eed9b1def34ad57e55c411a5c" }
11
+ rb-sys-build = { path = "vendor/rb-sys-build" }
@@ -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
- Minitest::TestTask.create(:test) do |t|
8
- t.libs << 'test'
9
- t.libs << 'lib'
10
- t.warning = false
11
- t.test_globs = ['test/**/*.rb']
12
- t.test_prelude = 'require "helpers/test_helper.rb"'
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!
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Itsi
4
4
  class Server
5
- VERSION = "0.2.21"
5
+ VERSION = "0.2.23"
6
6
  end
7
7
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "server/version"
4
- require_relative "server/itsi_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(&:join)
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
- sleep 0.25
306
- assert_equal Net::HTTP.get(URI("http://#{host}:#{port}")), "Hello, Rackup!"
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}
@@ -0,0 +1,6 @@
1
+ {
2
+ "git": {
3
+ "sha1": "8b8369748af0e3fa80d20e11b38b423cb2009bdf"
4
+ },
5
+ "path_in_vcs": "crates/rb-sys-build"
6
+ }