itsi-server 0.1.1 → 0.1.13

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.

Potentially problematic release.


This version of itsi-server might be problematic. Click here for more details.

Files changed (143) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/CODE_OF_CONDUCT.md +7 -0
  4. data/Cargo.lock +4417 -0
  5. data/Cargo.toml +7 -0
  6. data/README.md +4 -0
  7. data/Rakefile +8 -1
  8. data/_index.md +6 -0
  9. data/exe/itsi +94 -45
  10. data/ext/itsi_error/Cargo.toml +2 -0
  11. data/ext/itsi_error/src/from.rs +68 -0
  12. data/ext/itsi_error/src/lib.rs +18 -34
  13. data/ext/itsi_error/target/debug/build/clang-sys-da71b0344e568175/out/common.rs +355 -0
  14. data/ext/itsi_error/target/debug/build/clang-sys-da71b0344e568175/out/dynamic.rs +276 -0
  15. data/ext/itsi_error/target/debug/build/clang-sys-da71b0344e568175/out/macros.rs +49 -0
  16. data/ext/itsi_error/target/debug/build/rb-sys-49f554618693db24/out/bindings-0.9.110-mri-arm64-darwin23-3.4.2.rs +8865 -0
  17. data/ext/itsi_error/target/debug/incremental/itsi_error-1mmt5sux7jb0i/s-h510z7m8v9-0bxu7yd.lock +0 -0
  18. data/ext/itsi_error/target/debug/incremental/itsi_error-2vn3jey74oiw0/s-h5113n0e7e-1v5qzs6.lock +0 -0
  19. data/ext/itsi_error/target/debug/incremental/itsi_error-37uv9dicz7awp/s-h510ykifhe-0tbnep2.lock +0 -0
  20. data/ext/itsi_error/target/debug/incremental/itsi_error-37uv9dicz7awp/s-h510yyocpj-0tz7ug7.lock +0 -0
  21. data/ext/itsi_error/target/debug/incremental/itsi_error-37uv9dicz7awp/s-h510z0xc8g-14ol18k.lock +0 -0
  22. data/ext/itsi_error/target/debug/incremental/itsi_error-3g5qf4y7d54uj/s-h5113n0e7d-1trk8on.lock +0 -0
  23. data/ext/itsi_error/target/debug/incremental/itsi_error-3lpfftm45d3e2/s-h510z7m8r3-1pxp20o.lock +0 -0
  24. data/ext/itsi_error/target/debug/incremental/itsi_error-3o4qownhl3d7n/s-h510ykifek-1uxasnk.lock +0 -0
  25. data/ext/itsi_error/target/debug/incremental/itsi_error-3o4qownhl3d7n/s-h510yyocki-11u37qm.lock +0 -0
  26. data/ext/itsi_error/target/debug/incremental/itsi_error-3o4qownhl3d7n/s-h510z0xc93-0pmy0zm.lock +0 -0
  27. data/ext/itsi_instrument_entry/Cargo.toml +15 -0
  28. data/ext/itsi_instrument_entry/src/lib.rs +31 -0
  29. data/ext/itsi_rb_helpers/Cargo.toml +3 -0
  30. data/ext/itsi_rb_helpers/src/heap_value.rs +139 -0
  31. data/ext/itsi_rb_helpers/src/lib.rs +140 -10
  32. data/ext/itsi_rb_helpers/target/debug/build/clang-sys-da71b0344e568175/out/common.rs +355 -0
  33. data/ext/itsi_rb_helpers/target/debug/build/clang-sys-da71b0344e568175/out/dynamic.rs +276 -0
  34. data/ext/itsi_rb_helpers/target/debug/build/clang-sys-da71b0344e568175/out/macros.rs +49 -0
  35. data/ext/itsi_rb_helpers/target/debug/build/rb-sys-eb9ed4ff3a60f995/out/bindings-0.9.110-mri-arm64-darwin23-3.4.2.rs +8865 -0
  36. data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-040pxg6yhb3g3/s-h5113n7a1b-03bwlt4.lock +0 -0
  37. data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-131g1u4dzkt1a/s-h51113xnh3-1eik1ip.lock +0 -0
  38. data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-131g1u4dzkt1a/s-h5111704jj-0g4rj8x.lock +0 -0
  39. data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-1q2d3drtxrzs5/s-h5113n79yl-0bxcqc5.lock +0 -0
  40. data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-374a9h7ovycj0/s-h51113xoox-10de2hp.lock +0 -0
  41. data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-374a9h7ovycj0/s-h5111704w7-0vdq7gq.lock +0 -0
  42. data/ext/itsi_scheduler/Cargo.toml +24 -0
  43. data/ext/itsi_scheduler/src/itsi_scheduler/io_helpers.rs +56 -0
  44. data/ext/itsi_scheduler/src/itsi_scheduler/io_waiter.rs +44 -0
  45. data/ext/itsi_scheduler/src/itsi_scheduler/timer.rs +44 -0
  46. data/ext/itsi_scheduler/src/itsi_scheduler.rs +308 -0
  47. data/ext/itsi_scheduler/src/lib.rs +38 -0
  48. data/ext/itsi_server/Cargo.lock +2956 -0
  49. data/ext/itsi_server/Cargo.toml +73 -13
  50. data/ext/itsi_server/extconf.rb +1 -1
  51. data/ext/itsi_server/src/env.rs +43 -0
  52. data/ext/itsi_server/src/lib.rs +100 -40
  53. data/ext/itsi_server/src/ruby_types/itsi_body_proxy/big_bytes.rs +109 -0
  54. data/ext/itsi_server/src/ruby_types/itsi_body_proxy/mod.rs +141 -0
  55. data/ext/itsi_server/src/ruby_types/itsi_grpc_request.rs +147 -0
  56. data/ext/itsi_server/src/ruby_types/itsi_grpc_response.rs +19 -0
  57. data/ext/itsi_server/src/ruby_types/itsi_grpc_stream/mod.rs +216 -0
  58. data/ext/itsi_server/src/ruby_types/itsi_http_request.rs +282 -0
  59. data/ext/itsi_server/src/ruby_types/itsi_http_response.rs +388 -0
  60. data/ext/itsi_server/src/ruby_types/itsi_server/file_watcher.rs +225 -0
  61. data/ext/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +355 -0
  62. data/ext/itsi_server/src/ruby_types/itsi_server.rs +82 -0
  63. data/ext/itsi_server/src/ruby_types/mod.rs +55 -0
  64. data/ext/itsi_server/src/server/bind.rs +75 -31
  65. data/ext/itsi_server/src/server/bind_protocol.rs +37 -0
  66. data/ext/itsi_server/src/server/byte_frame.rs +32 -0
  67. data/ext/itsi_server/src/server/cache_store.rs +74 -0
  68. data/ext/itsi_server/src/server/io_stream.rs +104 -0
  69. data/ext/itsi_server/src/server/itsi_service.rs +172 -0
  70. data/ext/itsi_server/src/server/lifecycle_event.rs +12 -0
  71. data/ext/itsi_server/src/server/listener.rs +332 -132
  72. data/ext/itsi_server/src/server/middleware_stack/middleware.rs +153 -0
  73. data/ext/itsi_server/src/server/middleware_stack/middlewares/allow_list.rs +47 -0
  74. data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_api_key.rs +58 -0
  75. data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_basic.rs +82 -0
  76. data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_jwt.rs +321 -0
  77. data/ext/itsi_server/src/server/middleware_stack/middlewares/cache_control.rs +139 -0
  78. data/ext/itsi_server/src/server/middleware_stack/middlewares/compression.rs +300 -0
  79. data/ext/itsi_server/src/server/middleware_stack/middlewares/cors.rs +287 -0
  80. data/ext/itsi_server/src/server/middleware_stack/middlewares/deny_list.rs +48 -0
  81. data/ext/itsi_server/src/server/middleware_stack/middlewares/error_response.rs +127 -0
  82. data/ext/itsi_server/src/server/middleware_stack/middlewares/etag.rs +191 -0
  83. data/ext/itsi_server/src/server/middleware_stack/middlewares/grpc_service.rs +72 -0
  84. data/ext/itsi_server/src/server/middleware_stack/middlewares/header_interpretation.rs +85 -0
  85. data/ext/itsi_server/src/server/middleware_stack/middlewares/intrusion_protection.rs +195 -0
  86. data/ext/itsi_server/src/server/middleware_stack/middlewares/log_requests.rs +82 -0
  87. data/ext/itsi_server/src/server/middleware_stack/middlewares/mod.rs +82 -0
  88. data/ext/itsi_server/src/server/middleware_stack/middlewares/proxy.rs +216 -0
  89. data/ext/itsi_server/src/server/middleware_stack/middlewares/rate_limit.rs +124 -0
  90. data/ext/itsi_server/src/server/middleware_stack/middlewares/redirect.rs +76 -0
  91. data/ext/itsi_server/src/server/middleware_stack/middlewares/request_headers.rs +43 -0
  92. data/ext/itsi_server/src/server/middleware_stack/middlewares/response_headers.rs +34 -0
  93. data/ext/itsi_server/src/server/middleware_stack/middlewares/ruby_app.rs +93 -0
  94. data/ext/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs +162 -0
  95. data/ext/itsi_server/src/server/middleware_stack/middlewares/string_rewrite.rs +158 -0
  96. data/ext/itsi_server/src/server/middleware_stack/middlewares/token_source.rs +12 -0
  97. data/ext/itsi_server/src/server/middleware_stack/mod.rs +315 -0
  98. data/ext/itsi_server/src/server/mod.rs +15 -2
  99. data/ext/itsi_server/src/server/process_worker.rs +229 -0
  100. data/ext/itsi_server/src/server/rate_limiter.rs +565 -0
  101. data/ext/itsi_server/src/server/request_job.rs +11 -0
  102. data/ext/itsi_server/src/server/serve_strategy/cluster_mode.rs +337 -0
  103. data/ext/itsi_server/src/server/serve_strategy/mod.rs +30 -0
  104. data/ext/itsi_server/src/server/serve_strategy/single_mode.rs +421 -0
  105. data/ext/itsi_server/src/server/signal.rs +93 -0
  106. data/ext/itsi_server/src/server/static_file_server.rs +984 -0
  107. data/ext/itsi_server/src/server/thread_worker.rs +444 -0
  108. data/ext/itsi_server/src/server/tls/locked_dir_cache.rs +132 -0
  109. data/ext/itsi_server/src/server/tls.rs +187 -60
  110. data/ext/itsi_server/src/server/types.rs +43 -0
  111. data/ext/itsi_tracing/Cargo.toml +5 -0
  112. data/ext/itsi_tracing/src/lib.rs +225 -7
  113. data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-0994n8rpvvt9m/s-h510hfz1f6-1kbycmq.lock +0 -0
  114. data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-0bob7bf4yq34i/s-h5113125h5-0lh4rag.lock +0 -0
  115. data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2fcodulrxbbxo/s-h510h2infk-0hp5kjw.lock +0 -0
  116. data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2iak63r1woi1l/s-h510h2in4q-0kxfzw1.lock +0 -0
  117. data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2kk4qj9gn5dg2/s-h5113124kv-0enwon2.lock +0 -0
  118. data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2mwo0yas7dtw4/s-h510hfz1ha-1udgpei.lock +0 -0
  119. data/lib/itsi/http_request.rb +87 -0
  120. data/lib/itsi/http_response.rb +39 -0
  121. data/lib/itsi/server/Itsi.rb +119 -0
  122. data/lib/itsi/server/config/dsl.rb +506 -0
  123. data/lib/itsi/server/config.rb +131 -0
  124. data/lib/itsi/server/default_app/default_app.rb +38 -0
  125. data/lib/itsi/server/default_app/index.html +91 -0
  126. data/lib/itsi/server/grpc_interface.rb +213 -0
  127. data/lib/itsi/server/rack/handler/itsi.rb +27 -0
  128. data/lib/itsi/server/rack_interface.rb +94 -0
  129. data/lib/itsi/server/scheduler_interface.rb +21 -0
  130. data/lib/itsi/server/scheduler_mode.rb +10 -0
  131. data/lib/itsi/server/signal_trap.rb +29 -0
  132. data/lib/itsi/server/version.rb +1 -1
  133. data/lib/itsi/server.rb +90 -9
  134. data/lib/itsi/standard_headers.rb +86 -0
  135. metadata +122 -31
  136. data/ext/itsi_server/src/request/itsi_request.rs +0 -143
  137. data/ext/itsi_server/src/request/mod.rs +0 -1
  138. data/ext/itsi_server/src/server/itsi_ca/itsi_ca.crt +0 -32
  139. data/ext/itsi_server/src/server/itsi_ca/itsi_ca.key +0 -52
  140. data/ext/itsi_server/src/server/itsi_server.rs +0 -182
  141. data/ext/itsi_server/src/server/transfer_protocol.rs +0 -23
  142. data/ext/itsi_server/src/stream_writer/mod.rs +0 -21
  143. data/lib/itsi/request.rb +0 -39
data/Cargo.toml ADDED
@@ -0,0 +1,7 @@
1
+ # This Cargo.toml is here to let externals tools (IDEs, etc.) know that this is
2
+ # a Rust project. Your extensions dependencies should be added to the Cargo.toml
3
+ # in the ext/ directory.
4
+
5
+ [workspace]
6
+ members = ["./ext/itsi_server"]
7
+ resolver = "2"
data/README.md CHANGED
@@ -1,3 +1,7 @@
1
+ ---
2
+ type: docs
3
+ ---
4
+
1
5
  # ItsiServer
2
6
 
3
7
  TODO: Delete this and the text below, and describe your gem
data/Rakefile CHANGED
@@ -3,7 +3,14 @@
3
3
  require "bundler/gem_tasks"
4
4
  require "minitest/test_task"
5
5
 
6
- Minitest::TestTask.create
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"'
13
+ end
7
14
 
8
15
  require "rubocop/rake_task"
9
16
 
data/_index.md ADDED
@@ -0,0 +1,6 @@
1
+ ---
2
+ title: Itsi Server
3
+ type: docs
4
+ ---
5
+
6
+ ## Foo
data/exe/itsi CHANGED
@@ -1,59 +1,95 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
+ require "itsi/server"
4
5
  require "optparse"
5
- require "rack"
6
- require "etc"
7
-
8
- # Default options used when starting Osprey from the CLI using `osprey`
9
- DEFAULT_OPTIONS = {
10
- # Number of workers
11
- workers: Etc.nprocessors,
12
- # Number of threads per worker
13
- threads: 1,
14
- # Graceful shutdown timeout
15
- shutdown_timeout: 0.3,
16
- # Binds
17
- binds: ['http://0.0.0.0:3000']
18
- }
19
-
20
- options = DEFAULT_OPTIONS.to_a.select(&:last).to_h
21
-
22
- # Define the option parser
6
+
7
+ Itsi::Server::Config.save_argv!
8
+
9
+ options = {}
10
+
23
11
  OptionParser.new do |opts|
24
- opts.banner = "Usage: script.rb [options]"
12
+ opts.banner = "Usage: itsi [options]"
13
+
14
+ opts.on("-C", "--config CONFIG_FILE", String, "Itsi Configuration file to use (default: Itsi.rb)") do |config_file|
15
+ options[:config_file] = config_file
16
+ end
25
17
 
26
- opts.on("-w", "--workers WORKERS", Integer, "Number of workers (default: #{options[:workers]})") do |w|
18
+ opts.on("-w", "--workers WORKERS", Integer, "Number of workers (default: #{Etc.nprocessors})") do |w|
27
19
  options[:workers] = w
28
20
  end
29
21
 
30
- opts.on("-t", "--threads THREADS", Integer, "Number of threads (default: #{options[:threads]})") do |t|
22
+ opts.on("-t", "--threads THREADS", Integer, "Number of threads (default: 1)") do |t|
31
23
  options[:threads] = t
32
24
  end
33
25
 
34
- opts.on("-h", "--host HOST", String, "Host to bind to (default: #{options[:host]})") do |h|
35
- options[:host] = h
26
+ opts.on("-mtr", "--multithreaded-reactor true/false", String,
27
+ "Use a multithreaded reactor (default: true)") do |mtr|
28
+ options[:multithreaded_reactor] = mtr.to_s == "true"
36
29
  end
37
30
 
38
- opts.on("-p", "--port PORT", Integer, "Port for the application (default: #{options[:port]})") do |p|
39
- options[:port] = p
31
+ opts.on("-r", "--rackup_file FILE", String, "Rackup file to use (default: config.ru)") do |rf|
32
+ options[:rackup_file] = rf
40
33
  end
41
34
 
42
- opts.on("-f", "--use_fiber_scheduler PORT", TrueClass,
43
- "Port for the application (default: #{options[:use_scheduler]})") do |p|
44
- options[:use_scheduler] = p
35
+ opts.on("--worker-memory-limit MEMORY_LIMIT", Integer,
36
+ "Memory limit for each worker (default: None). If this limit is breached the worker is gracefully restarted") do |ml|
37
+ options[:worker_memory_limit] = ml
45
38
  end
46
39
 
47
- opts.on("--http_port HTTP_PORT", Integer, "HTTP port for the application (default: #{options[:http_port]})") do |hp|
48
- options[:http_port] = hp
40
+ opts.on("-f", "--fiber_scheduler [CLASS_NAME]", [String],
41
+ "Scheduler class to use (default: nil). Provide blank or true to use Itsi::Scheduler, or a classname to use an alternative scheduler") do |scheduler_class|
42
+ if scheduler_class.nil? || scheduler_class == "true"
43
+ options[:scheduler_class] = "Itsi::Scheduler"
44
+ elsif scheduler_class == "false"
45
+ options.delete(:scheduler_class)
46
+ else
47
+ options[:scheduler_class] = scheduler_class
48
+ end
49
49
  end
50
50
 
51
- opts.on("-c", "--cert_path CERT_PATH", String, "Path to the SSL certificate file") do |cp|
52
- options[:cert_path] = cp
51
+ opts.on("--preload [true, false, :bundle_group_name]", String, " Toggle preloading the application") do |preload|
52
+ if preload == "true"
53
+ options[:preload] = true
54
+ elsif preload == "false"
55
+ options[:preload] = false
56
+ else
57
+ # Not supported yet
58
+ end
53
59
  end
54
60
 
55
- opts.on("-k", "--key_path KEY_PATH", String, "Path to the SSL key file") do |kp|
56
- options[:key_path] = kp
61
+ opts.on("-b", "--bind BIND", String,
62
+ "Bind address (default: http://0.0.0.0:3000). You can specify this flag multiple times to bind to multiple addresses.") do |bind|
63
+ options[:binds] ||= []
64
+ options[:binds] << bind
65
+ end
66
+
67
+ opts.on("-c", "--cert_path CERT_PATH", String,
68
+ "Path to the SSL certificate file (must follow a --bind option). You can specify this flag multiple times.") do |cp|
69
+ raise OptionParser::InvalidOption, "--cert_path must follow a --bind" if options[:binds].empty?
70
+
71
+ require "uri"
72
+
73
+ # Modify the last bind entry to add/update the cert query parameter
74
+ uri = URI.parse("http://#{options[:binds].last}") # Ensure valid URI parsing
75
+ params = URI.decode_www_form(uri.query.to_s).to_h
76
+ params["cert"] = cp
77
+ query_string = params.map { |k, v| "#{k}=#{v}" }.join("&")
78
+ options[:binds][-1] = "#{uri.host}?#{query_string}"
79
+ end
80
+
81
+ opts.on("-k", "--key_path KEY_PATH", String,
82
+ "Path to the SSL key file (must follow a --bind option). You can specify this flag multiple times.") do |kp|
83
+ raise OptionParser::InvalidOption, "--key_path must follow a --bind" if options[:binds].empty?
84
+
85
+ require "uri"
86
+
87
+ # Modify the last bind entry to add/update the key query parameter
88
+ uri = URI.parse("http://#{options[:binds].last}") # Ensure valid URI parsing
89
+ params = URI.decode_www_form(uri.query.to_s).to_h
90
+ params["key"] = kp
91
+ query_string = params.map { |k, v| "#{k}=#{v}" }.join("&")
92
+ options[:binds][-1] = "#{uri.host}?#{query_string}"
57
93
  end
58
94
 
59
95
  opts.on("--shutdown_timeout SHUTDOWN_TIMEOUT", String,
@@ -65,20 +101,33 @@ OptionParser.new do |opts|
65
101
  options[:script_name] = script_name
66
102
  end
67
103
 
68
- opts.on("--help", "Show this help message") do
104
+ opts.on("--stream-body", TrueClass, "Stream body frames (default: false for best compatibility)") do |stream_body|
105
+ options[:stream_body] = stream_body
106
+ end
107
+
108
+ opts.on("-h", "--help", "Show this help message") do
69
109
  puts opts
70
110
  exit
71
111
  end
112
+
113
+ opts.on("--reexec PARAMS", String, "Reexec the server with the given parameters") do |params|
114
+ options[:reexec] = params
115
+ end
116
+
117
+ opts.on("--listeners LISTENERS", String, "Listeners for reexec") do |listeners|
118
+ options[:listeners] = listeners
119
+ end
72
120
  end.parse!
73
121
 
74
- # Parse the Rack application
75
- app, _ = Rack::Builder.parse_file("config.ru")
76
122
 
77
- puts "App is #{app}"
78
- # Make sure osprey is loaded, if not already loaded by the rack_app above.
79
- # Start the Osprey server
80
- require "itsi/server"
81
- Itsi::Server.new(
82
- app: app,
83
- **options
84
- ).start
123
+ case (command = ARGV.pop)
124
+ when "init"
125
+ Itsi::Server::Config.write_default
126
+ exit(0)
127
+ when "reload", "restart", "down", "up", "add_worker", "remove_worker", "status"
128
+ Itsi::Server.send(command)
129
+ when nil, "start", "serve"
130
+ Itsi::Server.start(options)
131
+ else
132
+ puts "Invalid command #{command}"
133
+ end
@@ -7,3 +7,5 @@ edition = "2024"
7
7
  thiserror = "2.0.11"
8
8
  magnus = { version = "0.7.1" }
9
9
  rcgen = "0.13.2"
10
+ nix = "0.29.0"
11
+ httparse = "1.10.1"
@@ -0,0 +1,68 @@
1
+ use magnus::{
2
+ Error,
3
+ error::ErrorType,
4
+ exception::{self, arg_error, exception},
5
+ };
6
+ use nix::errno::Errno;
7
+
8
+ use crate::ItsiError;
9
+ use std::{ffi::NulError, io};
10
+
11
+ pub static CLIENT_CONNECTION_CLOSED: &str = "Client disconnected";
12
+
13
+ impl From<httparse::Error> for ItsiError {
14
+ fn from(err: httparse::Error) -> Self {
15
+ ItsiError::ArgumentError(err.to_string())
16
+ }
17
+ }
18
+
19
+ impl From<Errno> for ItsiError {
20
+ fn from(err: Errno) -> Self {
21
+ ItsiError::ArgumentError(err.to_string())
22
+ }
23
+ }
24
+
25
+ impl From<io::Error> for ItsiError {
26
+ fn from(err: io::Error) -> Self {
27
+ ItsiError::ArgumentError(err.to_string())
28
+ }
29
+ }
30
+
31
+ impl From<rcgen::Error> for ItsiError {
32
+ fn from(err: rcgen::Error) -> Self {
33
+ ItsiError::ArgumentError(err.to_string())
34
+ }
35
+ }
36
+
37
+ impl From<NulError> for ItsiError {
38
+ fn from(err: NulError) -> Self {
39
+ ItsiError::ArgumentError(err.to_string())
40
+ }
41
+ }
42
+
43
+ impl From<Error> for ItsiError {
44
+ fn from(err: Error) -> Self {
45
+ match err.error_type() {
46
+ ErrorType::Jump(tag) => ItsiError::Jump(tag.to_string()),
47
+ ErrorType::Error(_exception_class, cow) => ItsiError::ArgumentError(cow.to_string()),
48
+ ErrorType::Exception(exception) => ItsiError::ArgumentError(exception.to_string()),
49
+ }
50
+ }
51
+ }
52
+
53
+ impl From<ItsiError> for Error {
54
+ fn from(err: ItsiError) -> Self {
55
+ match err {
56
+ ItsiError::InvalidInput(msg) => Error::new(arg_error(), msg),
57
+ ItsiError::InternalServerError(msg) => Error::new(exception(), msg),
58
+ ItsiError::UnsupportedProtocol(msg) => Error::new(arg_error(), msg),
59
+ ItsiError::ArgumentError(msg) => Error::new(arg_error(), msg),
60
+ ItsiError::Jump(msg) => Error::new(exception::local_jump_error(), msg),
61
+ ItsiError::Break() => Error::new(exception::interrupt(), "Break"),
62
+ ItsiError::ClientConnectionClosed => {
63
+ Error::new(exception::eof_error(), CLIENT_CONNECTION_CLOSED)
64
+ }
65
+ ItsiError::Pass() => Error::new(exception::interrupt(), "Pass"),
66
+ }
67
+ }
68
+ }
@@ -1,49 +1,33 @@
1
+ pub mod from;
1
2
  use thiserror::Error;
2
3
 
3
4
  pub type Result<T> = std::result::Result<T, ItsiError>;
4
5
 
5
- #[derive(Error, Debug)]
6
+ #[derive(Error, Debug, Clone)]
6
7
  pub enum ItsiError {
7
- #[error("Invalid input")]
8
+ #[error("Invalid input {0}")]
8
9
  InvalidInput(String),
9
- #[error("Internal server error")]
10
- InternalServerError,
11
- #[error("Unsupported protocol")]
10
+ #[error("Internal server error {0}")]
11
+ InternalServerError(String),
12
+ #[error("Unsupported protocol {0}")]
12
13
  UnsupportedProtocol(String),
13
- #[error("Argument error")]
14
+ #[error("Argument error: {0}")]
14
15
  ArgumentError(String),
16
+ #[error("Client Connection Closed")]
17
+ ClientConnectionClosed,
15
18
  #[error("Jump")]
16
19
  Jump(String),
20
+ #[error("Break")]
21
+ Break(),
22
+ #[error("Pass")]
23
+ Pass(),
17
24
  }
18
25
 
19
- impl From<ItsiError> for magnus::Error {
20
- fn from(err: ItsiError) -> Self {
21
- magnus::Error::new(magnus::exception::runtime_error(), err.to_string())
26
+ impl ItsiError {
27
+ pub fn default(error: impl Send + Sync + 'static + std::fmt::Display) -> Self {
28
+ ItsiError::InvalidInput(format!("{}", error))
22
29
  }
23
30
  }
24
31
 
25
- impl From<std::io::Error> for ItsiError {
26
- fn from(err: std::io::Error) -> Self {
27
- ItsiError::ArgumentError(err.to_string())
28
- }
29
- }
30
-
31
- impl From<rcgen::Error> for ItsiError {
32
- fn from(err: rcgen::Error) -> Self {
33
- ItsiError::ArgumentError(err.to_string())
34
- }
35
- }
36
-
37
- impl From<magnus::Error> for ItsiError {
38
- fn from(err: magnus::Error) -> Self {
39
- match err.error_type() {
40
- magnus::error::ErrorType::Jump(tag) => ItsiError::Jump(tag.to_string()),
41
- magnus::error::ErrorType::Error(_exception_class, cow) => {
42
- ItsiError::ArgumentError(cow.to_string())
43
- }
44
- magnus::error::ErrorType::Exception(exception) => {
45
- ItsiError::ArgumentError(exception.to_string())
46
- }
47
- }
48
- }
49
- }
32
+ unsafe impl Send for ItsiError {}
33
+ unsafe impl Sync for ItsiError {}