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
metadata CHANGED
@@ -1,28 +1,28 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: itsi-server
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wouter Coppieters
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2025-03-01 00:00:00.000000000 Z
10
+ date: 2025-03-29 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
- name: libclang
13
+ name: rack
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
- - - "~>"
16
+ - - ">="
17
17
  - !ruby/object:Gem::Version
18
- version: '14.0'
18
+ version: '1.6'
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: '14.0'
25
+ version: '1.6'
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: rb_sys
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -37,20 +37,6 @@ dependencies:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
39
  version: 0.9.91
40
- - !ruby/object:Gem::Dependency
41
- name: rack
42
- requirement: !ruby/object:Gem::Requirement
43
- requirements:
44
- - - "~>"
45
- - !ruby/object:Gem::Version
46
- version: '2'
47
- type: :runtime
48
- prerelease: false
49
- version_requirements: !ruby/object:Gem::Requirement
50
- requirements:
51
- - - "~>"
52
- - !ruby/object:Gem::Version
53
- version: '2'
54
40
  description: Itsi Server - A light-weight Rack Server implementation for Ruby
55
41
  email:
56
42
  - wc@pico.net.nz
@@ -63,36 +49,141 @@ files:
63
49
  - ".rubocop.yml"
64
50
  - CHANGELOG.md
65
51
  - CODE_OF_CONDUCT.md
52
+ - Cargo.lock
53
+ - Cargo.toml
66
54
  - LICENSE.txt
67
55
  - README.md
68
56
  - Rakefile
57
+ - _index.md
69
58
  - exe/itsi
70
59
  - ext/itsi_error/Cargo.lock
71
60
  - ext/itsi_error/Cargo.toml
61
+ - ext/itsi_error/src/from.rs
72
62
  - ext/itsi_error/src/lib.rs
63
+ - ext/itsi_error/target/debug/build/clang-sys-da71b0344e568175/out/common.rs
64
+ - ext/itsi_error/target/debug/build/clang-sys-da71b0344e568175/out/dynamic.rs
65
+ - ext/itsi_error/target/debug/build/clang-sys-da71b0344e568175/out/macros.rs
66
+ - ext/itsi_error/target/debug/build/rb-sys-49f554618693db24/out/bindings-0.9.110-mri-arm64-darwin23-3.4.2.rs
67
+ - ext/itsi_error/target/debug/incremental/itsi_error-1mmt5sux7jb0i/s-h510z7m8v9-0bxu7yd.lock
68
+ - ext/itsi_error/target/debug/incremental/itsi_error-2vn3jey74oiw0/s-h5113n0e7e-1v5qzs6.lock
69
+ - ext/itsi_error/target/debug/incremental/itsi_error-37uv9dicz7awp/s-h510ykifhe-0tbnep2.lock
70
+ - ext/itsi_error/target/debug/incremental/itsi_error-37uv9dicz7awp/s-h510yyocpj-0tz7ug7.lock
71
+ - ext/itsi_error/target/debug/incremental/itsi_error-37uv9dicz7awp/s-h510z0xc8g-14ol18k.lock
72
+ - ext/itsi_error/target/debug/incremental/itsi_error-3g5qf4y7d54uj/s-h5113n0e7d-1trk8on.lock
73
+ - ext/itsi_error/target/debug/incremental/itsi_error-3lpfftm45d3e2/s-h510z7m8r3-1pxp20o.lock
74
+ - ext/itsi_error/target/debug/incremental/itsi_error-3o4qownhl3d7n/s-h510ykifek-1uxasnk.lock
75
+ - ext/itsi_error/target/debug/incremental/itsi_error-3o4qownhl3d7n/s-h510yyocki-11u37qm.lock
76
+ - ext/itsi_error/target/debug/incremental/itsi_error-3o4qownhl3d7n/s-h510z0xc93-0pmy0zm.lock
77
+ - ext/itsi_instrument_entry/Cargo.toml
78
+ - ext/itsi_instrument_entry/src/lib.rs
73
79
  - ext/itsi_rb_helpers/Cargo.lock
74
80
  - ext/itsi_rb_helpers/Cargo.toml
81
+ - ext/itsi_rb_helpers/src/heap_value.rs
75
82
  - ext/itsi_rb_helpers/src/lib.rs
83
+ - ext/itsi_rb_helpers/target/debug/build/clang-sys-da71b0344e568175/out/common.rs
84
+ - ext/itsi_rb_helpers/target/debug/build/clang-sys-da71b0344e568175/out/dynamic.rs
85
+ - ext/itsi_rb_helpers/target/debug/build/clang-sys-da71b0344e568175/out/macros.rs
86
+ - ext/itsi_rb_helpers/target/debug/build/rb-sys-eb9ed4ff3a60f995/out/bindings-0.9.110-mri-arm64-darwin23-3.4.2.rs
87
+ - ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-040pxg6yhb3g3/s-h5113n7a1b-03bwlt4.lock
88
+ - ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-131g1u4dzkt1a/s-h51113xnh3-1eik1ip.lock
89
+ - ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-131g1u4dzkt1a/s-h5111704jj-0g4rj8x.lock
90
+ - ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-1q2d3drtxrzs5/s-h5113n79yl-0bxcqc5.lock
91
+ - ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-374a9h7ovycj0/s-h51113xoox-10de2hp.lock
92
+ - ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-374a9h7ovycj0/s-h5111704w7-0vdq7gq.lock
93
+ - ext/itsi_scheduler/Cargo.toml
94
+ - ext/itsi_scheduler/src/itsi_scheduler.rs
95
+ - ext/itsi_scheduler/src/itsi_scheduler/io_helpers.rs
96
+ - ext/itsi_scheduler/src/itsi_scheduler/io_waiter.rs
97
+ - ext/itsi_scheduler/src/itsi_scheduler/timer.rs
98
+ - ext/itsi_scheduler/src/lib.rs
99
+ - ext/itsi_server/Cargo.lock
76
100
  - ext/itsi_server/Cargo.toml
77
101
  - ext/itsi_server/extconf.rb
102
+ - ext/itsi_server/src/env.rs
78
103
  - ext/itsi_server/src/lib.rs
79
- - ext/itsi_server/src/request/itsi_request.rs
80
- - ext/itsi_server/src/request/mod.rs
104
+ - ext/itsi_server/src/ruby_types/itsi_body_proxy/big_bytes.rs
105
+ - ext/itsi_server/src/ruby_types/itsi_body_proxy/mod.rs
106
+ - ext/itsi_server/src/ruby_types/itsi_grpc_request.rs
107
+ - ext/itsi_server/src/ruby_types/itsi_grpc_response.rs
108
+ - ext/itsi_server/src/ruby_types/itsi_grpc_stream/mod.rs
109
+ - ext/itsi_server/src/ruby_types/itsi_http_request.rs
110
+ - ext/itsi_server/src/ruby_types/itsi_http_response.rs
111
+ - ext/itsi_server/src/ruby_types/itsi_server.rs
112
+ - ext/itsi_server/src/ruby_types/itsi_server/file_watcher.rs
113
+ - ext/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs
114
+ - ext/itsi_server/src/ruby_types/mod.rs
81
115
  - ext/itsi_server/src/server/bind.rs
82
- - ext/itsi_server/src/server/itsi_ca/itsi_ca.crt
83
- - ext/itsi_server/src/server/itsi_ca/itsi_ca.key
84
- - ext/itsi_server/src/server/itsi_server.rs
116
+ - ext/itsi_server/src/server/bind_protocol.rs
117
+ - ext/itsi_server/src/server/byte_frame.rs
118
+ - ext/itsi_server/src/server/cache_store.rs
119
+ - ext/itsi_server/src/server/io_stream.rs
120
+ - ext/itsi_server/src/server/itsi_service.rs
121
+ - ext/itsi_server/src/server/lifecycle_event.rs
85
122
  - ext/itsi_server/src/server/listener.rs
123
+ - ext/itsi_server/src/server/middleware_stack/middleware.rs
124
+ - ext/itsi_server/src/server/middleware_stack/middlewares/allow_list.rs
125
+ - ext/itsi_server/src/server/middleware_stack/middlewares/auth_api_key.rs
126
+ - ext/itsi_server/src/server/middleware_stack/middlewares/auth_basic.rs
127
+ - ext/itsi_server/src/server/middleware_stack/middlewares/auth_jwt.rs
128
+ - ext/itsi_server/src/server/middleware_stack/middlewares/cache_control.rs
129
+ - ext/itsi_server/src/server/middleware_stack/middlewares/compression.rs
130
+ - ext/itsi_server/src/server/middleware_stack/middlewares/cors.rs
131
+ - ext/itsi_server/src/server/middleware_stack/middlewares/deny_list.rs
132
+ - ext/itsi_server/src/server/middleware_stack/middlewares/error_response.rs
133
+ - ext/itsi_server/src/server/middleware_stack/middlewares/etag.rs
134
+ - ext/itsi_server/src/server/middleware_stack/middlewares/grpc_service.rs
135
+ - ext/itsi_server/src/server/middleware_stack/middlewares/header_interpretation.rs
136
+ - ext/itsi_server/src/server/middleware_stack/middlewares/intrusion_protection.rs
137
+ - ext/itsi_server/src/server/middleware_stack/middlewares/log_requests.rs
138
+ - ext/itsi_server/src/server/middleware_stack/middlewares/mod.rs
139
+ - ext/itsi_server/src/server/middleware_stack/middlewares/proxy.rs
140
+ - ext/itsi_server/src/server/middleware_stack/middlewares/rate_limit.rs
141
+ - ext/itsi_server/src/server/middleware_stack/middlewares/redirect.rs
142
+ - ext/itsi_server/src/server/middleware_stack/middlewares/request_headers.rs
143
+ - ext/itsi_server/src/server/middleware_stack/middlewares/response_headers.rs
144
+ - ext/itsi_server/src/server/middleware_stack/middlewares/ruby_app.rs
145
+ - ext/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs
146
+ - ext/itsi_server/src/server/middleware_stack/middlewares/string_rewrite.rs
147
+ - ext/itsi_server/src/server/middleware_stack/middlewares/token_source.rs
148
+ - ext/itsi_server/src/server/middleware_stack/mod.rs
86
149
  - ext/itsi_server/src/server/mod.rs
150
+ - ext/itsi_server/src/server/process_worker.rs
151
+ - ext/itsi_server/src/server/rate_limiter.rs
152
+ - ext/itsi_server/src/server/request_job.rs
153
+ - ext/itsi_server/src/server/serve_strategy/cluster_mode.rs
154
+ - ext/itsi_server/src/server/serve_strategy/mod.rs
155
+ - ext/itsi_server/src/server/serve_strategy/single_mode.rs
156
+ - ext/itsi_server/src/server/signal.rs
157
+ - ext/itsi_server/src/server/static_file_server.rs
158
+ - ext/itsi_server/src/server/thread_worker.rs
87
159
  - ext/itsi_server/src/server/tls.rs
88
- - ext/itsi_server/src/server/transfer_protocol.rs
89
- - ext/itsi_server/src/stream_writer/mod.rs
160
+ - ext/itsi_server/src/server/tls/locked_dir_cache.rs
161
+ - ext/itsi_server/src/server/types.rs
90
162
  - ext/itsi_tracing/Cargo.lock
91
163
  - ext/itsi_tracing/Cargo.toml
92
164
  - ext/itsi_tracing/src/lib.rs
93
- - lib/itsi/request.rb
165
+ - ext/itsi_tracing/target/debug/incremental/itsi_tracing-0994n8rpvvt9m/s-h510hfz1f6-1kbycmq.lock
166
+ - ext/itsi_tracing/target/debug/incremental/itsi_tracing-0bob7bf4yq34i/s-h5113125h5-0lh4rag.lock
167
+ - ext/itsi_tracing/target/debug/incremental/itsi_tracing-2fcodulrxbbxo/s-h510h2infk-0hp5kjw.lock
168
+ - ext/itsi_tracing/target/debug/incremental/itsi_tracing-2iak63r1woi1l/s-h510h2in4q-0kxfzw1.lock
169
+ - ext/itsi_tracing/target/debug/incremental/itsi_tracing-2kk4qj9gn5dg2/s-h5113124kv-0enwon2.lock
170
+ - ext/itsi_tracing/target/debug/incremental/itsi_tracing-2mwo0yas7dtw4/s-h510hfz1ha-1udgpei.lock
171
+ - lib/itsi/http_request.rb
172
+ - lib/itsi/http_response.rb
94
173
  - lib/itsi/server.rb
174
+ - lib/itsi/server/Itsi.rb
175
+ - lib/itsi/server/config.rb
176
+ - lib/itsi/server/config/dsl.rb
177
+ - lib/itsi/server/default_app/default_app.rb
178
+ - lib/itsi/server/default_app/index.html
179
+ - lib/itsi/server/grpc_interface.rb
180
+ - lib/itsi/server/rack/handler/itsi.rb
181
+ - lib/itsi/server/rack_interface.rb
182
+ - lib/itsi/server/scheduler_interface.rb
183
+ - lib/itsi/server/scheduler_mode.rb
184
+ - lib/itsi/server/signal_trap.rb
95
185
  - lib/itsi/server/version.rb
186
+ - lib/itsi/standard_headers.rb
96
187
  - sig/itsi_server.rbs
97
188
  homepage: https://itsi.fyi
98
189
  licenses:
@@ -108,12 +199,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
108
199
  requirements:
109
200
  - - ">="
110
201
  - !ruby/object:Gem::Version
111
- version: 3.1.0
202
+ version: 2.7.0
112
203
  required_rubygems_version: !ruby/object:Gem::Requirement
113
204
  requirements:
114
205
  - - ">="
115
206
  - !ruby/object:Gem::Version
116
- version: 3.3.11
207
+ version: '3.1'
117
208
  requirements: []
118
209
  rubygems_version: 3.6.2
119
210
  specification_version: 4
@@ -1,143 +0,0 @@
1
- use std::{collections::HashMap, sync::Arc};
2
-
3
- use crate::server::listener::{Listener, SockAddr};
4
- use bytes::Bytes;
5
- use http::request::Parts;
6
- use http_body_util::BodyExt;
7
- use hyper::{body::Incoming, Request};
8
- use magnus::error::Result;
9
-
10
- #[magnus::wrap(class = "Itsi::Request", free_immediately, size)]
11
- #[derive(Debug)]
12
- pub struct ItsiRequest {
13
- pub path: String,
14
- pub script_name: String,
15
- pub query_string: String,
16
- pub method: String,
17
- pub version: String,
18
- pub rack_protocol: Vec<String>,
19
- pub host: String,
20
- pub scheme: String,
21
- pub headers: HashMap<String, String>,
22
- pub remote_addr: String,
23
- pub port: u16,
24
- pub body: Bytes,
25
- pub parts: Parts,
26
- }
27
-
28
- impl ItsiRequest {
29
- pub(crate) async fn build_from(
30
- request: Request<Incoming>,
31
- sock_addr: SockAddr,
32
- script_name: String,
33
- listener: Arc<Listener>,
34
- ) -> Self {
35
- let (parts, body) = request.into_parts();
36
- let method = parts.method.to_string();
37
- let port = parts.uri.port_u16().unwrap_or(listener.port());
38
- let query_string = parts.uri.query().unwrap_or("").to_string();
39
- let rack_protocol = parts
40
- .headers
41
- .get("upgrade")
42
- .or_else(|| parts.headers.get("protocol"))
43
- .map(|value| {
44
- value
45
- .to_str()
46
- .unwrap_or("")
47
- .split(',')
48
- .map(|s| s.trim().to_owned())
49
- .collect::<Vec<String>>()
50
- })
51
- .unwrap_or_else(|| vec!["http".to_string()]);
52
-
53
- let host = parts
54
- .uri
55
- .host()
56
- .map(ToOwned::to_owned)
57
- .unwrap_or_else(|| listener.host());
58
-
59
- let scheme = parts
60
- .uri
61
- .scheme()
62
- .map(|s| s.to_string())
63
- .unwrap_or_else(|| listener.scheme());
64
-
65
- let headers = parts
66
- .headers
67
- .iter()
68
- .map(|(k, v)| (k.to_string(), v.to_str().unwrap_or("").to_string()))
69
- .collect();
70
-
71
- let path = parts
72
- .uri
73
- .path()
74
- .strip_prefix(&script_name)
75
- .unwrap_or(parts.uri.path())
76
- .to_string();
77
-
78
- let version = format!("{:?}", parts.version);
79
- let body = body.collect().await.unwrap().to_bytes();
80
-
81
- Self {
82
- remote_addr: sock_addr.to_string(),
83
- body,
84
- parts,
85
- script_name,
86
- query_string,
87
- method,
88
- headers,
89
- path,
90
- version,
91
- rack_protocol,
92
- host,
93
- scheme,
94
- port,
95
- }
96
- }
97
- }
98
-
99
- impl ItsiRequest {
100
- pub(crate) fn path(&self) -> Result<String> {
101
- Ok(self.path.clone())
102
- }
103
-
104
- pub(crate) fn script_name(&self) -> Result<String> {
105
- Ok(self.script_name.clone())
106
- }
107
-
108
- pub(crate) fn query_string(&self) -> Result<String> {
109
- Ok(self.query_string.clone())
110
- }
111
-
112
- pub(crate) fn method(&self) -> Result<String> {
113
- Ok(self.method.clone())
114
- }
115
-
116
- pub(crate) fn version(&self) -> Result<String> {
117
- Ok(self.version.clone())
118
- }
119
-
120
- pub(crate) fn rack_protocol(&self) -> Result<Vec<String>> {
121
- Ok(self.rack_protocol.clone())
122
- }
123
-
124
- pub(crate) fn host(&self) -> Result<String> {
125
- Ok(self.host.clone())
126
- }
127
-
128
- pub(crate) fn headers(&self) -> Result<HashMap<String, String>> {
129
- Ok(self.headers.clone())
130
- }
131
-
132
- pub(crate) fn remote_addr(&self) -> Result<String> {
133
- Ok(self.remote_addr.clone())
134
- }
135
-
136
- pub(crate) fn port(&self) -> Result<u16> {
137
- Ok(self.port)
138
- }
139
-
140
- pub(crate) fn body(&self) -> Result<Bytes> {
141
- Ok(self.body.clone())
142
- }
143
- }
@@ -1 +0,0 @@
1
- pub mod itsi_request;
@@ -1,32 +0,0 @@
1
- -----BEGIN CERTIFICATE-----
2
- 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
- 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
- EDAOBgNVBAoMB0l0c2kgQ0ExETAPBgNVBAMMCGl0c2kuZnlpMB4XDTI1MDIyODAy
5
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
31
- jI16bCLO/G1NaQ+N9YFL4TGfvbCe
32
- -----END CERTIFICATE-----
@@ -1,52 +0,0 @@
1
- -----BEGIN PRIVATE KEY-----
2
- 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
- 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
- +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
- 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
- Lq13/ObC/pblE0FTeRLdOyqgqNzTF27blqJ8njSL/7zZvk45aFa36mxI+VNlv5jl
7
- 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
- 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
- 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
- /wrvbKnaFIK7/kRDBXeTAozDQmaMkXJovxILYYme55ZYIghmNh1zRkAD0O+X16hJ
11
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 7JWJNZ5G58muXBzh2+q4mBJTKN9RBHE+CHeNDR6Yp2/Tul0P7GesMMx78De4iNsu
22
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 7TysZFR/DukW2Uh9szgSP8biaP8PDvqpZ+p493MwdEl2YCShAoIBAQDkJClmQ9b+
30
- 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
- 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
- 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
- qs8GSHMc1OPwFe/KKnrLPzpx1tGuBQkdXdv1WzSvfZdznPjMFNhapEWsvS+J5lKo
34
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- G4crHYQNI+vgJ+hM97c09+YY8035XrrZcg/L9R04cLBa0vNNcUyrQ3MqhBtEa9Wl
45
- 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
- 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
- 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
- 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
- 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
- 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
51
- cN5973/E4MpAKMt1shs0YWr3axraOhkg
52
- -----END PRIVATE KEY-----
@@ -1,182 +0,0 @@
1
- use super::{
2
- bind::Bind,
3
- listener::{Listener, SockAddr},
4
- };
5
- use crate::{request::itsi_request::ItsiRequest, ITSI_SERVER};
6
- use bytes::Bytes;
7
- use derive_more::Debug;
8
- use http_body_util::{combinators::BoxBody, Empty};
9
- use hyper::{
10
- body::Incoming, header::HeaderName, service::service_fn, HeaderMap, Request, Response,
11
- StatusCode,
12
- };
13
- use hyper_util::{rt::TokioExecutor, server::conn::auto::Builder};
14
- use itsi_tracing::{error, info};
15
- use magnus::{
16
- error::Result,
17
- scan_args::{get_kwargs, scan_args, Args, KwArgs},
18
- value::{Opaque, ReprValue},
19
- RHash, Ruby, Value,
20
- };
21
- use parking_lot::Mutex;
22
- use std::{collections::HashMap, convert::Infallible, sync::Arc};
23
- use tokio::runtime::Builder as RuntimeBuilder;
24
- use tokio::task::JoinSet;
25
-
26
- #[magnus::wrap(class = "Itsi::Server", free_immediately, size)]
27
- #[derive(Debug)]
28
- pub struct Server {
29
- #[debug(skip)]
30
- app: Opaque<Value>,
31
- #[allow(unused)]
32
- workers: u16,
33
- #[allow(unused)]
34
- threads: u16,
35
- #[allow(unused)]
36
- shutdown_timeout: f64,
37
- script_name: String,
38
- pub(crate) binds: Mutex<Vec<Bind>>,
39
- }
40
-
41
- impl Server {
42
- pub fn new(args: &[Value]) -> Result<Self> {
43
- type OptionalArgs = (
44
- Option<u16>,
45
- Option<u16>,
46
- Option<f64>,
47
- Option<String>,
48
- Option<Vec<String>>,
49
- );
50
-
51
- let scan_args: Args<(), (), (), (), RHash, ()> = scan_args(args)?;
52
- let args: KwArgs<(Value,), OptionalArgs, ()> = get_kwargs(
53
- scan_args.keywords,
54
- &["app"],
55
- &[
56
- "workers",
57
- "threads",
58
- "shutdown_timeout",
59
- "script_name",
60
- "binds",
61
- ],
62
- )?;
63
- let server = Server {
64
- app: Opaque::from(args.required.0),
65
- workers: args.optional.0.unwrap_or(1),
66
- threads: args.optional.1.unwrap_or(1),
67
- shutdown_timeout: args.optional.2.unwrap_or(5.0),
68
- script_name: args.optional.3.unwrap_or("".to_string()),
69
- binds: Mutex::new(
70
- args.optional
71
- .4
72
- .unwrap_or_else(|| vec!["localhost:3000".to_string()])
73
- .into_iter()
74
- .map(|s| s.parse().unwrap_or_else(|_| Bind::default()))
75
- .collect(),
76
- ),
77
- };
78
- Ok(server)
79
- }
80
-
81
- pub(crate) async fn process_request(
82
- hyper_request: Request<Incoming>,
83
- app: Opaque<Value>,
84
- script_name: String,
85
- listener: Arc<Listener>,
86
- addr: SockAddr,
87
- ) -> itsi_error::Result<Response<BoxBody<Bytes, Infallible>>> {
88
- let request = ItsiRequest::build_from(hyper_request, addr, script_name, listener).await;
89
- let ruby = Ruby::get().unwrap();
90
- let server = ruby.get_inner(&ITSI_SERVER);
91
- let response: Result<(u16, HashMap<String, String>, Value)> =
92
- server.funcall("call", (app, request));
93
- if let Ok((status, headers_raw, body)) = response {
94
- let mut body_buf = vec![];
95
- for body_chunk in body.enumeratorize("each", ()) {
96
- body_buf.push(body_chunk.unwrap().to_string())
97
- }
98
- body.check_funcall::<_, _, Value>("close", ());
99
- let boxed_body = BoxBody::new(body_buf.join(""));
100
- let mut response = Response::new(boxed_body);
101
- let mut headers = HeaderMap::new();
102
- headers_raw.into_iter().for_each(|(key, value)| {
103
- let header_name: HeaderName = key.parse().unwrap();
104
- headers.insert(header_name, value.parse().unwrap());
105
- });
106
- *response.headers_mut() = headers;
107
- *response.status_mut() = StatusCode::from_u16(status).unwrap();
108
- Ok(response)
109
- } else {
110
- let mut response = Response::new(BoxBody::new(Empty::new()));
111
- *response.status_mut() = StatusCode::BAD_REQUEST;
112
- Ok(response)
113
- }
114
- }
115
-
116
- pub fn start(&self) {
117
- let mut builder: RuntimeBuilder = RuntimeBuilder::new_current_thread();
118
- let runtime = builder
119
- .thread_name("itsi-server-accept-loop")
120
- .thread_stack_size(3 * 1024 * 1024)
121
- .enable_io()
122
- .enable_time()
123
- .build()
124
- .expect("Failed to build Tokio runtime");
125
-
126
- runtime.block_on(async {
127
- let server = Arc::new(Builder::new(TokioExecutor::new()));
128
- let listeners: Vec<Listener> = self
129
- .binds
130
- .lock()
131
- .iter()
132
- .cloned()
133
- .map(Listener::from)
134
- .collect::<Vec<_>>();
135
-
136
- let mut set = JoinSet::new();
137
-
138
- for listener in listeners {
139
- let app = self.app;
140
- let server_clone = server.clone();
141
- let listener_clone = Arc::new(listener);
142
- let script_name = self.script_name.clone();
143
-
144
- set.spawn(async move {
145
- loop {
146
- let server = server_clone.clone();
147
- let listener = listener_clone.clone();
148
- let script_name = script_name.clone();
149
- let (stream, addr) = match listener.accept().await {
150
- Ok(stream) => stream,
151
- Err(e) => {
152
- error!("Failed to accept connection: {:?}", e);
153
- continue;
154
- }
155
- };
156
-
157
- tokio::spawn(async move {
158
- if let Err(e) = server
159
- .serve_connection_with_upgrades(
160
- stream,
161
- service_fn(move |hyper_request: Request<Incoming>| {
162
- Server::process_request(
163
- hyper_request,
164
- app,
165
- script_name.clone(),
166
- listener.clone(),
167
- addr.clone(),
168
- )
169
- }),
170
- )
171
- .await
172
- {
173
- info!("Closed connection due to: {:?}", e);
174
- }
175
- });
176
- }
177
- });
178
- }
179
- while let Some(_res) = set.join_next().await {}
180
- })
181
- }
182
- }
@@ -1,23 +0,0 @@
1
- use itsi_error::ItsiError;
2
- use std::str::FromStr;
3
-
4
- #[derive(Debug, Default, Clone)]
5
- pub enum TransferProtocol {
6
- #[default]
7
- Https,
8
- Http,
9
- Unix,
10
- }
11
-
12
- impl FromStr for TransferProtocol {
13
- type Err = ItsiError;
14
-
15
- fn from_str(s: &str) -> Result<Self, Self::Err> {
16
- match s {
17
- "http" => Ok(TransferProtocol::Http),
18
- "https" => Ok(TransferProtocol::Https),
19
- "unix" => Ok(TransferProtocol::Unix),
20
- _ => Err(ItsiError::UnsupportedProtocol(s.to_string())),
21
- }
22
- }
23
- }