itsi 0.2.22 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 431fc2c382fd32204fb84de948bfa584a7ad420aff7bd38df80823aef47e6a6e
4
- data.tar.gz: 2f65a4465d5dfe4230d47409426713632eed82de3269a0f54678c558523cf27c
3
+ metadata.gz: 6f500a7fdc96a95bb73c92215cef369ad5a208c0ef60f260c36257f74a592448
4
+ data.tar.gz: 42ccd29b510e972f40b291a0f058b618e4605f2c9379412c853542d7e5e4e8a8
5
5
  SHA512:
6
- metadata.gz: e9e4b8395a97b8b81180aa83fb19c5bb1f0a15abb80846f29aa933051ac1ff1ac8e20a55244ab60f10eeb35e78ab3703c90073b5bc28da9c4b82b1c3e609224d
7
- data.tar.gz: 9f5a32484e1e861e348dcfd3728479a0b8ea0ed11821f13256ffc64d6af1c8a17d5b2c53545e5b4b29eb5774421098f3d7a41d03b3094937230b8f4f37573f83
6
+ metadata.gz: 3e1e1c6426657562728948fbfab3ca19a727e62ba144ef0c1d0c4ab46d6fa4a7152305ea47d4b23cfdb795a906b60e7bea6e8891c6af704ff9486210a7f05a1e
7
+ data.tar.gz: 499ba6cd3408cf9e780092e025cb3791af23460cc581dbf774f2774a573b45ddded6c8153358ca3ef6744d6bacc998ac829505c37f329e22dc1e856a7e65891d
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## [0.2.23] - 2026-04-18
2
+ - Return a normal 404 for unmatched proxy-style requests such as CONNECT instead of panicking the HTTP listener.
3
+
1
4
  ## [0.2.21] - 2026-02-16
2
5
  - Fix Ruby 2.7 startup NameError in static_assets redirect schema load path
3
6
 
data/Cargo.lock CHANGED
@@ -1662,7 +1662,7 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
1662
1662
 
1663
1663
  [[package]]
1664
1664
  name = "itsi-scheduler"
1665
- version = "0.2.21"
1665
+ version = "0.2.23"
1666
1666
  dependencies = [
1667
1667
  "bytes",
1668
1668
  "derive_more",
@@ -1680,7 +1680,7 @@ dependencies = [
1680
1680
 
1681
1681
  [[package]]
1682
1682
  name = "itsi-server"
1683
- version = "0.2.21"
1683
+ version = "0.2.23"
1684
1684
  dependencies = [
1685
1685
  "argon2",
1686
1686
  "async-channel",
data/Dockerfile CHANGED
@@ -3,7 +3,7 @@ FROM ruby:3.4
3
3
  RUN apt-get update && apt-get install build-essential libclang-dev -y && apt-get clean && rm -rf /var/lib/apt/lists/*
4
4
  RUN curl https://sh.rustup.rs -sSf | sh -s -- -y
5
5
 
6
- COPY pkg/itsi-server-0.2.21.gem .
7
- RUN gem install itsi-server-0.2.21.gem
6
+ COPY pkg/itsi-server-0.2.23.gem .
7
+ RUN gem install itsi-server-0.2.23.gem
8
8
 
9
9
  CMD ["itsi", "serve"]
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "itsi-scheduler"
3
- version = "0.2.22"
3
+ version = "0.2.23"
4
4
  edition = "2021"
5
5
  authors = ["Wouter Coppieters <wc@pico.net.nz>"]
6
6
  license = "MIT"
@@ -984,7 +984,7 @@ checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
984
984
 
985
985
  [[package]]
986
986
  name = "itsi-scheduler"
987
- version = "0.1.0"
987
+ version = "0.2.23"
988
988
  dependencies = [
989
989
  "bytes",
990
990
  "derive_more",
@@ -1002,7 +1002,7 @@ dependencies = [
1002
1002
 
1003
1003
  [[package]]
1004
1004
  name = "itsi-server"
1005
- version = "0.1.0"
1005
+ version = "0.2.23"
1006
1006
  dependencies = [
1007
1007
  "async-channel",
1008
1008
  "async-trait",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "itsi-server"
3
- version = "0.2.22"
3
+ version = "0.2.23"
4
4
  edition = "2021"
5
5
  authors = ["Wouter Coppieters <wc@pico.net.nz>"]
6
6
  license = "MIT"
@@ -263,7 +263,7 @@ impl MiddlewareSet {
263
263
  pub fn stack_for(
264
264
  &self,
265
265
  request: &HttpRequest,
266
- ) -> Result<(&Vec<Middleware>, Option<Arc<Regex>>)> {
266
+ ) -> Option<(&Vec<Middleware>, Option<Arc<Regex>>)> {
267
267
  let binding = self.route_set.matches(request.uri().path());
268
268
  let matches = binding.iter();
269
269
 
@@ -276,7 +276,7 @@ impl MiddlewareSet {
276
276
  let matching_pattern = self.patterns.get(index).cloned();
277
277
  if let Some(stack) = self.stacks.get(&index) {
278
278
  if stack.matches(request) {
279
- return Ok((&stack.layers, matching_pattern));
279
+ return Some((&stack.layers, matching_pattern));
280
280
  }
281
281
  }
282
282
  }
@@ -285,13 +285,7 @@ impl MiddlewareSet {
285
285
  request.uri().path(),
286
286
  self.route_set
287
287
  );
288
- Err(magnus::Error::new(
289
- magnus::Ruby::get().unwrap().exception_standard_error(),
290
- format!(
291
- "No matching middleware stack found for request: {:?}",
292
- request
293
- ),
294
- ))
288
+ None
295
289
  }
296
290
 
297
291
  pub fn parse_middleware(middleware_type: String, parameters: Value) -> Result<Middleware> {
@@ -188,14 +188,11 @@ impl ItsiHttpService {
188
188
  let token_preference = self.server_params.itsi_server_token_preference;
189
189
 
190
190
  let service_future = async move {
191
- let middleware_stack = self
192
- .server_params
193
- .middleware
194
- .get()
195
- .unwrap()
196
- .stack_for(&req)
197
- .unwrap();
198
- let (stack, matching_pattern) = middleware_stack;
191
+ let Some((stack, matching_pattern)) =
192
+ self.server_params.middleware.get().unwrap().stack_for(&req)
193
+ else {
194
+ return Ok(NOT_FOUND_RESPONSE.to_http_response(accept).await);
195
+ };
199
196
  let mut resp: Option<HttpResponse> = None;
200
197
 
201
198
  let mut context =
@@ -211,7 +211,7 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
211
211
 
212
212
  [[package]]
213
213
  name = "itsi-scheduler"
214
- version = "0.2.21"
214
+ version = "0.2.23"
215
215
  dependencies = [
216
216
  "bytes",
217
217
  "derive_more",
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Itsi
4
4
  class Scheduler
5
- VERSION = "0.2.22"
5
+ VERSION = "0.2.23"
6
6
  end
7
7
  end
@@ -1662,7 +1662,7 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
1662
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",
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Itsi
4
4
  class Server
5
- VERSION = "0.2.22"
5
+ VERSION = "0.2.23"
6
6
  end
7
7
  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
data/lib/itsi/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Itsi
2
- VERSION = "0.2.22"
2
+ VERSION = "0.2.23"
3
3
  end
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.22
4
+ version: 0.2.23
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.22
18
+ version: 0.2.23
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.22
25
+ version: 0.2.23
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.22
32
+ version: 0.2.23
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.22
39
+ version: 0.2.23
40
40
  description: Wrapper Gem for both the Itsi server and the Itsi Fiber scheduler
41
41
  email:
42
42
  - wc@pico.net.nz
@@ -1139,6 +1139,7 @@ files:
1139
1139
  - gems/server/test/options/test_request_timeout.rb
1140
1140
  - gems/server/test/options/test_threads.rb
1141
1141
  - gems/server/test/options/test_workers.rb
1142
+ - gems/server/test/options/unmatched_request.rb
1142
1143
  - gems/server/test/rack/test_rack_server.rb
1143
1144
  - gems/server/vendor/rb-sys-build/.cargo-ok
1144
1145
  - gems/server/vendor/rb-sys-build/.cargo_vcs_info.json