itsi 0.1.14 → 0.1.19

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 (169) hide show
  1. checksums.yaml +4 -4
  2. data/Cargo.lock +126 -272
  3. data/Cargo.toml +6 -0
  4. data/crates/itsi_error/Cargo.toml +1 -0
  5. data/crates/itsi_error/src/lib.rs +100 -10
  6. data/crates/itsi_scheduler/src/itsi_scheduler.rs +1 -1
  7. data/crates/itsi_server/Cargo.toml +12 -11
  8. data/crates/itsi_server/src/default_responses/html/401.html +68 -0
  9. data/crates/itsi_server/src/default_responses/html/403.html +68 -0
  10. data/crates/itsi_server/src/default_responses/html/404.html +68 -0
  11. data/crates/itsi_server/src/default_responses/html/413.html +71 -0
  12. data/crates/itsi_server/src/default_responses/html/429.html +68 -0
  13. data/crates/itsi_server/src/default_responses/html/500.html +71 -0
  14. data/crates/itsi_server/src/default_responses/html/502.html +71 -0
  15. data/crates/itsi_server/src/default_responses/html/503.html +68 -0
  16. data/crates/itsi_server/src/default_responses/html/504.html +69 -0
  17. data/crates/itsi_server/src/default_responses/html/index.html +238 -0
  18. data/crates/itsi_server/src/default_responses/json/401.json +6 -0
  19. data/crates/itsi_server/src/default_responses/json/403.json +6 -0
  20. data/crates/itsi_server/src/default_responses/json/404.json +6 -0
  21. data/crates/itsi_server/src/default_responses/json/413.json +6 -0
  22. data/crates/itsi_server/src/default_responses/json/429.json +6 -0
  23. data/crates/itsi_server/src/default_responses/json/500.json +6 -0
  24. data/crates/itsi_server/src/default_responses/json/502.json +6 -0
  25. data/crates/itsi_server/src/default_responses/json/503.json +6 -0
  26. data/crates/itsi_server/src/default_responses/json/504.json +6 -0
  27. data/crates/itsi_server/src/default_responses/mod.rs +11 -0
  28. data/crates/itsi_server/src/lib.rs +58 -26
  29. data/crates/itsi_server/src/prelude.rs +2 -0
  30. data/crates/itsi_server/src/ruby_types/README.md +21 -0
  31. data/crates/itsi_server/src/ruby_types/itsi_body_proxy/mod.rs +8 -6
  32. data/crates/itsi_server/src/ruby_types/itsi_grpc_call.rs +344 -0
  33. data/crates/itsi_server/src/ruby_types/{itsi_grpc_stream → itsi_grpc_response_stream}/mod.rs +121 -73
  34. data/crates/itsi_server/src/ruby_types/itsi_http_request.rs +103 -40
  35. data/crates/itsi_server/src/ruby_types/itsi_http_response.rs +8 -5
  36. data/crates/itsi_server/src/ruby_types/itsi_server/file_watcher.rs +4 -4
  37. data/crates/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +37 -17
  38. data/crates/itsi_server/src/ruby_types/itsi_server.rs +4 -3
  39. data/crates/itsi_server/src/ruby_types/mod.rs +6 -13
  40. data/crates/itsi_server/src/server/{bind.rs → binds/bind.rs} +23 -4
  41. data/crates/itsi_server/src/server/{listener.rs → binds/listener.rs} +24 -10
  42. data/crates/itsi_server/src/server/binds/mod.rs +4 -0
  43. data/crates/itsi_server/src/server/{tls.rs → binds/tls.rs} +9 -4
  44. data/crates/itsi_server/src/server/http_message_types.rs +97 -0
  45. data/crates/itsi_server/src/server/io_stream.rs +2 -1
  46. data/crates/itsi_server/src/server/middleware_stack/middleware.rs +28 -16
  47. data/crates/itsi_server/src/server/middleware_stack/middlewares/allow_list.rs +17 -8
  48. data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_api_key.rs +47 -18
  49. data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_basic.rs +13 -9
  50. data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_jwt.rs +50 -29
  51. data/crates/itsi_server/src/server/middleware_stack/middlewares/cache_control.rs +5 -2
  52. data/crates/itsi_server/src/server/middleware_stack/middlewares/compression.rs +37 -48
  53. data/crates/itsi_server/src/server/middleware_stack/middlewares/cors.rs +25 -20
  54. data/crates/itsi_server/src/server/middleware_stack/middlewares/deny_list.rs +14 -7
  55. data/crates/itsi_server/src/server/middleware_stack/middlewares/error_response/default_responses.rs +190 -0
  56. data/crates/itsi_server/src/server/middleware_stack/middlewares/error_response.rs +125 -95
  57. data/crates/itsi_server/src/server/middleware_stack/middlewares/etag.rs +9 -5
  58. data/crates/itsi_server/src/server/middleware_stack/middlewares/header_interpretation.rs +1 -4
  59. data/crates/itsi_server/src/server/middleware_stack/middlewares/intrusion_protection.rs +25 -19
  60. data/crates/itsi_server/src/server/middleware_stack/middlewares/log_requests.rs +4 -4
  61. data/crates/itsi_server/src/server/middleware_stack/middlewares/max_body.rs +47 -0
  62. data/crates/itsi_server/src/server/middleware_stack/middlewares/mod.rs +9 -4
  63. data/crates/itsi_server/src/server/middleware_stack/middlewares/proxy.rs +260 -62
  64. data/crates/itsi_server/src/server/middleware_stack/middlewares/rate_limit.rs +29 -22
  65. data/crates/itsi_server/src/server/middleware_stack/middlewares/redirect.rs +6 -6
  66. data/crates/itsi_server/src/server/middleware_stack/middlewares/request_headers.rs +6 -5
  67. data/crates/itsi_server/src/server/middleware_stack/middlewares/response_headers.rs +4 -2
  68. data/crates/itsi_server/src/server/middleware_stack/middlewares/ruby_app.rs +51 -18
  69. data/crates/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs +31 -13
  70. data/crates/itsi_server/src/server/middleware_stack/middlewares/static_response.rs +55 -0
  71. data/crates/itsi_server/src/server/middleware_stack/middlewares/string_rewrite.rs +13 -8
  72. data/crates/itsi_server/src/server/middleware_stack/mod.rs +101 -69
  73. data/crates/itsi_server/src/server/mod.rs +3 -9
  74. data/crates/itsi_server/src/server/process_worker.rs +21 -3
  75. data/crates/itsi_server/src/server/request_job.rs +2 -2
  76. data/crates/itsi_server/src/server/serve_strategy/cluster_mode.rs +8 -3
  77. data/crates/itsi_server/src/server/serve_strategy/single_mode.rs +26 -26
  78. data/crates/itsi_server/src/server/signal.rs +24 -41
  79. data/crates/itsi_server/src/server/size_limited_incoming.rs +101 -0
  80. data/crates/itsi_server/src/server/thread_worker.rs +59 -28
  81. data/crates/itsi_server/src/services/itsi_http_service.rs +239 -0
  82. data/crates/itsi_server/src/services/mime_types.rs +1416 -0
  83. data/crates/itsi_server/src/services/mod.rs +6 -0
  84. data/crates/itsi_server/src/services/password_hasher.rs +83 -0
  85. data/crates/itsi_server/src/{server → services}/rate_limiter.rs +35 -31
  86. data/crates/itsi_server/src/{server → services}/static_file_server.rs +521 -181
  87. data/crates/itsi_tracing/src/lib.rs +145 -55
  88. data/{Itsi.rb → foo/Itsi.rb} +6 -9
  89. data/gems/scheduler/Cargo.lock +7 -0
  90. data/gems/scheduler/lib/itsi/scheduler/version.rb +1 -1
  91. data/gems/scheduler/test/helpers/test_helper.rb +0 -1
  92. data/gems/scheduler/test/test_address_resolve.rb +0 -1
  93. data/gems/scheduler/test/test_network_io.rb +1 -1
  94. data/gems/scheduler/test/test_process_wait.rb +0 -1
  95. data/gems/server/Cargo.lock +126 -272
  96. data/gems/server/exe/itsi +65 -19
  97. data/gems/server/itsi-server.gemspec +4 -3
  98. data/gems/server/lib/itsi/http_request/response_status_shortcodes.rb +74 -0
  99. data/gems/server/lib/itsi/http_request.rb +117 -17
  100. data/gems/server/lib/itsi/http_response.rb +2 -0
  101. data/gems/server/lib/itsi/passfile.rb +109 -0
  102. data/gems/server/lib/itsi/server/config/dsl.rb +171 -99
  103. data/gems/server/lib/itsi/server/config.rb +58 -23
  104. data/gems/server/lib/itsi/server/default_app/default_app.rb +25 -29
  105. data/gems/server/lib/itsi/server/default_app/index.html +113 -89
  106. data/gems/server/lib/itsi/server/{Itsi.rb → default_config/Itsi-rackup.rb} +1 -1
  107. data/gems/server/lib/itsi/server/default_config/Itsi.rb +107 -0
  108. data/gems/server/lib/itsi/server/grpc/grpc_call.rb +246 -0
  109. data/gems/server/lib/itsi/server/grpc/grpc_interface.rb +100 -0
  110. data/gems/server/lib/itsi/server/grpc/reflection/v1/reflection_pb.rb +26 -0
  111. data/gems/server/lib/itsi/server/grpc/reflection/v1/reflection_services_pb.rb +122 -0
  112. data/gems/server/lib/itsi/server/route_tester.rb +107 -0
  113. data/gems/server/lib/itsi/server/typed_handlers/param_parser.rb +200 -0
  114. data/gems/server/lib/itsi/server/typed_handlers/source_parser.rb +55 -0
  115. data/gems/server/lib/itsi/server/typed_handlers.rb +17 -0
  116. data/gems/server/lib/itsi/server/version.rb +1 -1
  117. data/gems/server/lib/itsi/server.rb +82 -12
  118. data/gems/server/lib/ruby_lsp/itsi/addon.rb +111 -0
  119. data/gems/server/lib/shell_completions/completions.rb +26 -0
  120. data/gems/server/test/helpers/test_helper.rb +2 -1
  121. data/lib/itsi/version.rb +1 -1
  122. data/sandbox/README.md +5 -0
  123. data/sandbox/itsi_file/Gemfile +4 -2
  124. data/sandbox/itsi_file/Gemfile.lock +48 -6
  125. data/sandbox/itsi_file/Itsi.rb +327 -129
  126. data/sandbox/itsi_file/call.json +1 -0
  127. data/sandbox/itsi_file/echo_client/Gemfile +10 -0
  128. data/sandbox/itsi_file/echo_client/Gemfile.lock +27 -0
  129. data/sandbox/itsi_file/echo_client/README.md +95 -0
  130. data/sandbox/itsi_file/echo_client/echo_client.rb +164 -0
  131. data/sandbox/itsi_file/echo_client/gen_proto.sh +17 -0
  132. data/sandbox/itsi_file/echo_client/lib/echo_pb.rb +16 -0
  133. data/sandbox/itsi_file/echo_client/lib/echo_services_pb.rb +29 -0
  134. data/sandbox/itsi_file/echo_client/run_client.rb +64 -0
  135. data/sandbox/itsi_file/echo_client/test_compressions.sh +20 -0
  136. data/sandbox/itsi_file/echo_service_nonitsi/Gemfile +10 -0
  137. data/sandbox/itsi_file/echo_service_nonitsi/Gemfile.lock +79 -0
  138. data/sandbox/itsi_file/echo_service_nonitsi/echo.proto +26 -0
  139. data/sandbox/itsi_file/echo_service_nonitsi/echo_pb.rb +16 -0
  140. data/sandbox/itsi_file/echo_service_nonitsi/echo_services_pb.rb +29 -0
  141. data/sandbox/itsi_file/echo_service_nonitsi/server.rb +52 -0
  142. data/sandbox/itsi_sandbox_async/config.ru +0 -1
  143. data/sandbox/itsi_sandbox_rack/Gemfile.lock +2 -2
  144. data/sandbox/itsi_sandbox_rails/Gemfile +2 -2
  145. data/sandbox/itsi_sandbox_rails/Gemfile.lock +76 -2
  146. data/sandbox/itsi_sandbox_rails/app/controllers/home_controller.rb +15 -0
  147. data/sandbox/itsi_sandbox_rails/config/environments/development.rb +1 -0
  148. data/sandbox/itsi_sandbox_rails/config/environments/production.rb +1 -0
  149. data/sandbox/itsi_sandbox_rails/config/routes.rb +2 -0
  150. data/sandbox/itsi_sinatra/app.rb +0 -1
  151. data/sandbox/static_files/.env +1 -0
  152. data/sandbox/static_files/404.html +25 -0
  153. data/sandbox/static_files/_DSC0102.NEF.jpg +0 -0
  154. data/sandbox/static_files/about.html +68 -0
  155. data/sandbox/static_files/tiny.html +1 -0
  156. data/sandbox/static_files/writebook.zip +0 -0
  157. data/tasks.txt +28 -33
  158. metadata +87 -26
  159. data/crates/itsi_error/src/from.rs +0 -68
  160. data/crates/itsi_server/src/ruby_types/itsi_grpc_request.rs +0 -147
  161. data/crates/itsi_server/src/ruby_types/itsi_grpc_response.rs +0 -19
  162. data/crates/itsi_server/src/server/itsi_service.rs +0 -172
  163. data/crates/itsi_server/src/server/middleware_stack/middlewares/grpc_service.rs +0 -72
  164. data/crates/itsi_server/src/server/types.rs +0 -43
  165. data/gems/server/lib/itsi/server/grpc_interface.rb +0 -213
  166. data/sandbox/itsi_file/public/assets/index.html +0 -1
  167. /data/crates/itsi_server/src/server/{bind_protocol.rs → binds/bind_protocol.rs} +0 -0
  168. /data/crates/itsi_server/src/server/{tls → binds/tls}/locked_dir_cache.rs +0 -0
  169. /data/crates/itsi_server/src/{server → services}/cache_store.rs +0 -0
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: itsi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.14
4
+ version: 0.1.19
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wouter Coppieters
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2025-03-29 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: itsi-scheduler
@@ -15,28 +15,28 @@ dependencies:
15
15
  requirements:
16
16
  - - "~>"
17
17
  - !ruby/object:Gem::Version
18
- version: 0.1.14
18
+ version: 0.1.19
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.1.14
25
+ version: 0.1.19
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.1.14
32
+ version: 0.1.19
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.1.14
39
+ version: 0.1.19
40
40
  description: Wrapper Gem for both the Itsi server and the Itsi Fiber scheduler
41
41
  email:
42
42
  - wc@pico.net.nz
@@ -46,13 +46,11 @@ extra_rdoc_files: []
46
46
  files:
47
47
  - Cargo.lock
48
48
  - Cargo.toml
49
- - Itsi.rb
50
49
  - README.md
51
50
  - Rakefile
52
51
  - crates/_index.md
53
52
  - crates/itsi_error/Cargo.lock
54
53
  - crates/itsi_error/Cargo.toml
55
- - crates/itsi_error/src/from.rs
56
54
  - crates/itsi_error/src/lib.rs
57
55
  - crates/itsi_instrument_entry/Cargo.toml
58
56
  - crates/itsi_instrument_entry/src/lib.rs
@@ -70,27 +68,50 @@ files:
70
68
  - crates/itsi_server/Cargo.lock
71
69
  - crates/itsi_server/Cargo.toml
72
70
  - crates/itsi_server/extconf.rb
71
+ - crates/itsi_server/src/default_responses/html/401.html
72
+ - crates/itsi_server/src/default_responses/html/403.html
73
+ - crates/itsi_server/src/default_responses/html/404.html
74
+ - crates/itsi_server/src/default_responses/html/413.html
75
+ - crates/itsi_server/src/default_responses/html/429.html
76
+ - crates/itsi_server/src/default_responses/html/500.html
77
+ - crates/itsi_server/src/default_responses/html/502.html
78
+ - crates/itsi_server/src/default_responses/html/503.html
79
+ - crates/itsi_server/src/default_responses/html/504.html
80
+ - crates/itsi_server/src/default_responses/html/index.html
81
+ - crates/itsi_server/src/default_responses/json/401.json
82
+ - crates/itsi_server/src/default_responses/json/403.json
83
+ - crates/itsi_server/src/default_responses/json/404.json
84
+ - crates/itsi_server/src/default_responses/json/413.json
85
+ - crates/itsi_server/src/default_responses/json/429.json
86
+ - crates/itsi_server/src/default_responses/json/500.json
87
+ - crates/itsi_server/src/default_responses/json/502.json
88
+ - crates/itsi_server/src/default_responses/json/503.json
89
+ - crates/itsi_server/src/default_responses/json/504.json
90
+ - crates/itsi_server/src/default_responses/mod.rs
73
91
  - crates/itsi_server/src/env.rs
74
92
  - crates/itsi_server/src/lib.rs
93
+ - crates/itsi_server/src/prelude.rs
94
+ - crates/itsi_server/src/ruby_types/README.md
75
95
  - crates/itsi_server/src/ruby_types/itsi_body_proxy/big_bytes.rs
76
96
  - crates/itsi_server/src/ruby_types/itsi_body_proxy/mod.rs
77
- - crates/itsi_server/src/ruby_types/itsi_grpc_request.rs
78
- - crates/itsi_server/src/ruby_types/itsi_grpc_response.rs
79
- - crates/itsi_server/src/ruby_types/itsi_grpc_stream/mod.rs
97
+ - crates/itsi_server/src/ruby_types/itsi_grpc_call.rs
98
+ - crates/itsi_server/src/ruby_types/itsi_grpc_response_stream/mod.rs
80
99
  - crates/itsi_server/src/ruby_types/itsi_http_request.rs
81
100
  - crates/itsi_server/src/ruby_types/itsi_http_response.rs
82
101
  - crates/itsi_server/src/ruby_types/itsi_server.rs
83
102
  - crates/itsi_server/src/ruby_types/itsi_server/file_watcher.rs
84
103
  - crates/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs
85
104
  - crates/itsi_server/src/ruby_types/mod.rs
86
- - crates/itsi_server/src/server/bind.rs
87
- - crates/itsi_server/src/server/bind_protocol.rs
105
+ - crates/itsi_server/src/server/binds/bind.rs
106
+ - crates/itsi_server/src/server/binds/bind_protocol.rs
107
+ - crates/itsi_server/src/server/binds/listener.rs
108
+ - crates/itsi_server/src/server/binds/mod.rs
109
+ - crates/itsi_server/src/server/binds/tls.rs
110
+ - crates/itsi_server/src/server/binds/tls/locked_dir_cache.rs
88
111
  - crates/itsi_server/src/server/byte_frame.rs
89
- - crates/itsi_server/src/server/cache_store.rs
112
+ - crates/itsi_server/src/server/http_message_types.rs
90
113
  - crates/itsi_server/src/server/io_stream.rs
91
- - crates/itsi_server/src/server/itsi_service.rs
92
114
  - crates/itsi_server/src/server/lifecycle_event.rs
93
- - crates/itsi_server/src/server/listener.rs
94
115
  - crates/itsi_server/src/server/middleware_stack/middleware.rs
95
116
  - crates/itsi_server/src/server/middleware_stack/middlewares/allow_list.rs
96
117
  - crates/itsi_server/src/server/middleware_stack/middlewares/auth_api_key.rs
@@ -101,11 +122,12 @@ files:
101
122
  - crates/itsi_server/src/server/middleware_stack/middlewares/cors.rs
102
123
  - crates/itsi_server/src/server/middleware_stack/middlewares/deny_list.rs
103
124
  - crates/itsi_server/src/server/middleware_stack/middlewares/error_response.rs
125
+ - crates/itsi_server/src/server/middleware_stack/middlewares/error_response/default_responses.rs
104
126
  - crates/itsi_server/src/server/middleware_stack/middlewares/etag.rs
105
- - crates/itsi_server/src/server/middleware_stack/middlewares/grpc_service.rs
106
127
  - crates/itsi_server/src/server/middleware_stack/middlewares/header_interpretation.rs
107
128
  - crates/itsi_server/src/server/middleware_stack/middlewares/intrusion_protection.rs
108
129
  - crates/itsi_server/src/server/middleware_stack/middlewares/log_requests.rs
130
+ - crates/itsi_server/src/server/middleware_stack/middlewares/max_body.rs
109
131
  - crates/itsi_server/src/server/middleware_stack/middlewares/mod.rs
110
132
  - crates/itsi_server/src/server/middleware_stack/middlewares/proxy.rs
111
133
  - crates/itsi_server/src/server/middleware_stack/middlewares/rate_limit.rs
@@ -114,22 +136,26 @@ files:
114
136
  - crates/itsi_server/src/server/middleware_stack/middlewares/response_headers.rs
115
137
  - crates/itsi_server/src/server/middleware_stack/middlewares/ruby_app.rs
116
138
  - crates/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs
139
+ - crates/itsi_server/src/server/middleware_stack/middlewares/static_response.rs
117
140
  - crates/itsi_server/src/server/middleware_stack/middlewares/string_rewrite.rs
118
141
  - crates/itsi_server/src/server/middleware_stack/middlewares/token_source.rs
119
142
  - crates/itsi_server/src/server/middleware_stack/mod.rs
120
143
  - crates/itsi_server/src/server/mod.rs
121
144
  - crates/itsi_server/src/server/process_worker.rs
122
- - crates/itsi_server/src/server/rate_limiter.rs
123
145
  - crates/itsi_server/src/server/request_job.rs
124
146
  - crates/itsi_server/src/server/serve_strategy/cluster_mode.rs
125
147
  - crates/itsi_server/src/server/serve_strategy/mod.rs
126
148
  - crates/itsi_server/src/server/serve_strategy/single_mode.rs
127
149
  - crates/itsi_server/src/server/signal.rs
128
- - crates/itsi_server/src/server/static_file_server.rs
150
+ - crates/itsi_server/src/server/size_limited_incoming.rs
129
151
  - crates/itsi_server/src/server/thread_worker.rs
130
- - crates/itsi_server/src/server/tls.rs
131
- - crates/itsi_server/src/server/tls/locked_dir_cache.rs
132
- - crates/itsi_server/src/server/types.rs
152
+ - crates/itsi_server/src/services/cache_store.rs
153
+ - crates/itsi_server/src/services/itsi_http_service.rs
154
+ - crates/itsi_server/src/services/mime_types.rs
155
+ - crates/itsi_server/src/services/mod.rs
156
+ - crates/itsi_server/src/services/password_hasher.rs
157
+ - crates/itsi_server/src/services/rate_limiter.rs
158
+ - crates/itsi_server/src/services/static_file_server.rs
133
159
  - crates/itsi_server/test.md
134
160
  - crates/itsi_tracing/Cargo.lock
135
161
  - crates/itsi_tracing/Cargo.toml
@@ -147,6 +173,7 @@ files:
147
173
  - docs/go.sum
148
174
  - docs/hugo.yaml
149
175
  - examples/static_assets_example.rb
176
+ - foo/Itsi.rb
150
177
  - gems/_index.md
151
178
  - gems/scheduler/.gitignore
152
179
  - gems/scheduler/.rubocop.yml
@@ -189,26 +216,39 @@ files:
189
216
  - gems/server/exe/itsi
190
217
  - gems/server/itsi-server.gemspec
191
218
  - gems/server/lib/itsi/http_request.rb
219
+ - gems/server/lib/itsi/http_request/response_status_shortcodes.rb
192
220
  - gems/server/lib/itsi/http_response.rb
221
+ - gems/server/lib/itsi/passfile.rb
193
222
  - gems/server/lib/itsi/server.rb
194
- - gems/server/lib/itsi/server/Itsi.rb
195
223
  - gems/server/lib/itsi/server/config.rb
196
224
  - gems/server/lib/itsi/server/config/dsl.rb
197
225
  - gems/server/lib/itsi/server/default_app/default_app.rb
198
226
  - gems/server/lib/itsi/server/default_app/index.html
199
- - gems/server/lib/itsi/server/grpc_interface.rb
227
+ - gems/server/lib/itsi/server/default_config/Itsi-rackup.rb
228
+ - gems/server/lib/itsi/server/default_config/Itsi.rb
229
+ - gems/server/lib/itsi/server/grpc/grpc_call.rb
230
+ - gems/server/lib/itsi/server/grpc/grpc_interface.rb
231
+ - gems/server/lib/itsi/server/grpc/reflection/v1/reflection_pb.rb
232
+ - gems/server/lib/itsi/server/grpc/reflection/v1/reflection_services_pb.rb
200
233
  - gems/server/lib/itsi/server/rack/handler/itsi.rb
201
234
  - gems/server/lib/itsi/server/rack_interface.rb
235
+ - gems/server/lib/itsi/server/route_tester.rb
202
236
  - gems/server/lib/itsi/server/scheduler_interface.rb
203
237
  - gems/server/lib/itsi/server/scheduler_mode.rb
204
238
  - gems/server/lib/itsi/server/signal_trap.rb
239
+ - gems/server/lib/itsi/server/typed_handlers.rb
240
+ - gems/server/lib/itsi/server/typed_handlers/param_parser.rb
241
+ - gems/server/lib/itsi/server/typed_handlers/source_parser.rb
205
242
  - gems/server/lib/itsi/server/version.rb
206
243
  - gems/server/lib/itsi/standard_headers.rb
244
+ - gems/server/lib/ruby_lsp/itsi/addon.rb
245
+ - gems/server/lib/shell_completions/completions.rb
207
246
  - gems/server/sig/itsi_server.rbs
208
247
  - gems/server/test/helpers/test_helper.rb
209
248
  - gems/server/test/test_itsi_server.rb
210
249
  - lib/itsi.rb
211
250
  - lib/itsi/version.rb
251
+ - sandbox/README.md
212
252
  - sandbox/deploy/main.tf
213
253
  - sandbox/deploy/outputs.tf
214
254
  - sandbox/deploy/vars.tf
@@ -218,10 +258,25 @@ files:
218
258
  - sandbox/itsi_file/Gemfile
219
259
  - sandbox/itsi_file/Gemfile.lock
220
260
  - sandbox/itsi_file/Itsi.rb
261
+ - sandbox/itsi_file/call.json
262
+ - sandbox/itsi_file/echo_client/Gemfile
263
+ - sandbox/itsi_file/echo_client/Gemfile.lock
264
+ - sandbox/itsi_file/echo_client/README.md
265
+ - sandbox/itsi_file/echo_client/echo_client.rb
266
+ - sandbox/itsi_file/echo_client/gen_proto.sh
267
+ - sandbox/itsi_file/echo_client/lib/echo_pb.rb
268
+ - sandbox/itsi_file/echo_client/lib/echo_services_pb.rb
269
+ - sandbox/itsi_file/echo_client/run_client.rb
270
+ - sandbox/itsi_file/echo_client/test_compressions.sh
271
+ - sandbox/itsi_file/echo_service_nonitsi/Gemfile
272
+ - sandbox/itsi_file/echo_service_nonitsi/Gemfile.lock
273
+ - sandbox/itsi_file/echo_service_nonitsi/echo.proto
274
+ - sandbox/itsi_file/echo_service_nonitsi/echo_pb.rb
275
+ - sandbox/itsi_file/echo_service_nonitsi/echo_services_pb.rb
276
+ - sandbox/itsi_file/echo_service_nonitsi/server.rb
221
277
  - sandbox/itsi_file/error.html
222
278
  - sandbox/itsi_file/organisations_controller.rb
223
279
  - sandbox/itsi_file/public/assets/image.png
224
- - sandbox/itsi_file/public/assets/index.html
225
280
  - sandbox/itsi_sandbox_async/Gemfile
226
281
  - sandbox/itsi_sandbox_async/Gemfile.lock
227
282
  - sandbox/itsi_sandbox_async/config.ru
@@ -378,6 +433,12 @@ files:
378
433
  - sandbox/itsi_sinatra/Gemfile.lock
379
434
  - sandbox/itsi_sinatra/app.rb
380
435
  - sandbox/pebble/docker-compose.yml
436
+ - sandbox/static_files/.env
437
+ - sandbox/static_files/404.html
438
+ - sandbox/static_files/_DSC0102.NEF.jpg
439
+ - sandbox/static_files/about.html
440
+ - sandbox/static_files/tiny.html
441
+ - sandbox/static_files/writebook.zip
381
442
  - tasks.txt
382
443
  homepage: https://itsi.fyi
383
444
  licenses:
@@ -400,7 +461,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
400
461
  - !ruby/object:Gem::Version
401
462
  version: '3.2'
402
463
  requirements: []
403
- rubygems_version: 3.6.2
464
+ rubygems_version: 3.6.7
404
465
  specification_version: 4
405
466
  summary: Wrapper Gem for both the Itsi server and the Itsi Fiber scheduler
406
467
  test_files: []
@@ -1,68 +0,0 @@
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,147 +0,0 @@
1
- use derive_more::Debug;
2
- use http::{request::Parts, Response, StatusCode};
3
- use http_body_util::{combinators::BoxBody, BodyExt, Empty};
4
- use itsi_error::from::CLIENT_CONNECTION_CLOSED;
5
- use itsi_rb_helpers::{print_rb_backtrace, HeapValue};
6
- use itsi_tracing::debug;
7
- use magnus::{
8
- block::Proc,
9
- error::{ErrorType, Result as MagnusResult},
10
- Error,
11
- };
12
- use magnus::{
13
- value::{LazyId, ReprValue},
14
- Ruby, Value,
15
- };
16
- use std::{sync::Arc, time::Instant};
17
- use tokio::sync::mpsc::{self};
18
- use tracing::error;
19
-
20
- use super::itsi_grpc_stream::ItsiGrpcStream;
21
- use crate::server::{
22
- byte_frame::ByteFrame,
23
- itsi_service::RequestContext,
24
- request_job::RequestJob,
25
- types::{HttpRequest, HttpResponse},
26
- };
27
-
28
- static ID_MESSAGE: LazyId = LazyId::new("message");
29
-
30
- #[derive(Debug)]
31
- #[magnus::wrap(class = "Itsi::GrpcRequest", free_immediately, size)]
32
- pub struct ItsiGrpcRequest {
33
- pub parts: Parts,
34
- pub start: Instant,
35
- #[debug(skip)]
36
- pub context: RequestContext,
37
- #[debug(skip)]
38
- pub stream: ItsiGrpcStream,
39
- }
40
-
41
- impl ItsiGrpcRequest {
42
- pub fn service_name(&self) -> MagnusResult<String> {
43
- let path = self.parts.uri.path();
44
- Ok(path.split('/').nth_back(1).unwrap().to_string())
45
- }
46
-
47
- pub fn method_name(&self) -> MagnusResult<String> {
48
- let path = self.parts.uri.path();
49
- Ok(path.split('/').nth_back(0).unwrap().to_string())
50
- }
51
-
52
- pub fn stream(&self) -> MagnusResult<ItsiGrpcStream> {
53
- Ok(self.stream.clone())
54
- }
55
-
56
- pub fn content_type_str(&self) -> &str {
57
- self.parts
58
- .headers
59
- .get("Content-Type")
60
- .and_then(|hv| hv.to_str().ok())
61
- .unwrap_or("application/x-www-form-urlencoded")
62
- }
63
-
64
- pub fn is_json(&self) -> bool {
65
- self.content_type_str() == "application/json"
66
- }
67
-
68
- pub fn process(self, ruby: &Ruby, app_proc: Arc<HeapValue<Proc>>) -> magnus::error::Result<()> {
69
- let response = self.stream.clone();
70
- let result = app_proc.call::<_, Value>((self,));
71
- if let Err(err) = result {
72
- Self::internal_error(ruby, response, err);
73
- }
74
- Ok(())
75
- }
76
-
77
- pub fn internal_error(_ruby: &Ruby, stream: ItsiGrpcStream, err: Error) {
78
- if let Some(rb_err) = err.value() {
79
- print_rb_backtrace(rb_err);
80
- stream.internal_server_error(err.to_string());
81
- } else {
82
- stream.internal_server_error(err.to_string());
83
- }
84
- }
85
-
86
- pub(crate) async fn process_request(
87
- app: Arc<HeapValue<Proc>>,
88
- hyper_request: HttpRequest,
89
- context: &RequestContext,
90
- ) -> itsi_error::Result<HttpResponse> {
91
- let (request, mut receiver) = ItsiGrpcRequest::new(hyper_request, context).await;
92
- let shutdown_channel = context.service.shutdown_channel.clone();
93
- let response_stream = request.stream.clone();
94
- match context
95
- .sender
96
- .send(RequestJob::ProcessGrpcRequest(request, app))
97
- .await
98
- {
99
- Err(err) => {
100
- error!("Error occurred: {}", err);
101
- let mut response = Response::new(BoxBody::new(Empty::new()));
102
- *response.status_mut() = StatusCode::BAD_REQUEST;
103
- Ok(response)
104
- }
105
- _ => match receiver.recv().await {
106
- Some(first_frame) => Ok(response_stream
107
- .build_response(first_frame, receiver, shutdown_channel)
108
- .await),
109
- None => Ok(Response::new(BoxBody::new(Empty::new()))),
110
- },
111
- }
112
- }
113
- pub fn is_connection_closed_err(ruby: &Ruby, err: &Error) -> bool {
114
- match err.error_type() {
115
- ErrorType::Jump(_) => false,
116
- ErrorType::Error(_, _) => false,
117
- ErrorType::Exception(exception) => {
118
- exception.is_kind_of(ruby.exception_eof_error())
119
- && err
120
- .value()
121
- .map(|v| {
122
- v.funcall::<_, _, String>(*ID_MESSAGE, ())
123
- .unwrap_or("".to_string())
124
- .eq(CLIENT_CONNECTION_CLOSED)
125
- })
126
- .unwrap_or(false)
127
- }
128
- }
129
- }
130
-
131
- pub(crate) async fn new(
132
- request: HttpRequest,
133
- context: &RequestContext,
134
- ) -> (ItsiGrpcRequest, mpsc::Receiver<ByteFrame>) {
135
- let (parts, body) = request.into_parts();
136
- let response_channel = mpsc::channel::<ByteFrame>(100);
137
- (
138
- Self {
139
- context: context.clone(),
140
- start: Instant::now(),
141
- parts,
142
- stream: ItsiGrpcStream::new(response_channel.0, body.into_data_stream()),
143
- },
144
- response_channel.1,
145
- )
146
- }
147
- }
@@ -1,19 +0,0 @@
1
- use derive_more::Debug;
2
- use http::request::Parts;
3
- use tokio::sync::mpsc::Sender;
4
-
5
- use crate::server::byte_frame::ByteFrame;
6
-
7
- #[derive(Debug, Clone)]
8
- #[magnus::wrap(class = "Itsi::GrpcResponse", free_immediately, size)]
9
- pub struct ItsiGrpcResponse {
10
- pub parts: Parts,
11
- #[debug(skip)]
12
- pub sender: Sender<ByteFrame>,
13
- }
14
-
15
- impl ItsiGrpcResponse {
16
- pub fn new(parts: Parts, sender: Sender<ByteFrame>) -> Self {
17
- Self { parts, sender }
18
- }
19
- }
@@ -1,172 +0,0 @@
1
- use super::listener::ListenerInfo;
2
- use super::middleware_stack::CompressionAlgorithm;
3
- use super::middleware_stack::MiddlewareLayer;
4
- use super::request_job::RequestJob;
5
- use super::serve_strategy::single_mode::RunningPhase;
6
- use super::types::HttpRequest;
7
- use super::types::HttpResponse;
8
- use crate::ruby_types::itsi_server::itsi_server_config::ServerParams;
9
- use chrono;
10
- use chrono::Local;
11
- use either::Either;
12
- use hyper::service::Service;
13
- use itsi_error::ItsiError;
14
- use regex::Regex;
15
- use std::sync::OnceLock;
16
- use std::{future::Future, ops::Deref, pin::Pin, sync::Arc};
17
- use tokio::sync::watch::{self};
18
-
19
- #[derive(Clone)]
20
- pub struct ItsiService {
21
- pub inner: Arc<IstiServiceInner>,
22
- }
23
-
24
- impl Deref for ItsiService {
25
- type Target = Arc<IstiServiceInner>;
26
-
27
- fn deref(&self) -> &Self::Target {
28
- &self.inner
29
- }
30
- }
31
-
32
- pub struct IstiServiceInner {
33
- pub sender: async_channel::Sender<RequestJob>,
34
- pub server_params: Arc<ServerParams>,
35
- pub listener: Arc<ListenerInfo>,
36
- pub addr: String,
37
- pub shutdown_channel: watch::Receiver<RunningPhase>,
38
- }
39
-
40
- #[derive(Clone)]
41
- pub struct RequestContext {
42
- inner: Arc<RequestContextInner>,
43
- }
44
-
45
- impl Deref for RequestContext {
46
- type Target = Arc<RequestContextInner>;
47
-
48
- fn deref(&self) -> &Self::Target {
49
- &self.inner
50
- }
51
- }
52
-
53
- impl Deref for RequestContextInner {
54
- type Target = ItsiService;
55
-
56
- fn deref(&self) -> &Self::Target {
57
- &self.service
58
- }
59
- }
60
-
61
- pub struct RequestContextInner {
62
- pub request_id: i128,
63
- pub service: ItsiService,
64
- pub matching_pattern: Option<Arc<Regex>>,
65
- pub compression_method: OnceLock<CompressionAlgorithm>,
66
- pub origin: OnceLock<Option<String>>,
67
- pub start_time: chrono::DateTime<chrono::Utc>,
68
- pub request: Option<Arc<HttpRequest>>,
69
- pub request_start_time: OnceLock<chrono::DateTime<Local>>,
70
- pub if_none_match: OnceLock<Option<String>>,
71
- pub etag_value: OnceLock<Option<String>>,
72
- }
73
-
74
- impl RequestContext {
75
- fn new(service: ItsiService, matching_pattern: Option<Arc<Regex>>) -> Self {
76
- RequestContext {
77
- inner: Arc::new(RequestContextInner {
78
- request_id: rand::random::<i128>(),
79
- service,
80
- matching_pattern,
81
- compression_method: OnceLock::new(),
82
- origin: OnceLock::new(),
83
- start_time: chrono::Utc::now(),
84
- request: None,
85
- request_start_time: OnceLock::new(),
86
- if_none_match: OnceLock::new(),
87
- etag_value: OnceLock::new(),
88
- }),
89
- }
90
- }
91
-
92
- pub fn set_compression_method(&self, method: CompressionAlgorithm) {
93
- self.inner.compression_method.set(method).unwrap();
94
- }
95
-
96
- pub fn set_origin(&self, origin: Option<String>) {
97
- self.inner.origin.set(origin).unwrap();
98
- }
99
-
100
- pub fn set_if_none_match(&self, value: Option<String>) {
101
- self.inner.if_none_match.set(value).unwrap();
102
- }
103
-
104
- pub fn get_if_none_match(&self) -> Option<String> {
105
- self.inner.if_none_match.get().cloned().flatten()
106
- }
107
-
108
- pub fn request_id(&self) -> String {
109
- self.inner.request_id.to_string()
110
- }
111
-
112
- pub fn track_start_time(&self) {
113
- self.inner
114
- .request_start_time
115
- .get_or_init(chrono::Local::now);
116
- }
117
-
118
- pub fn start_time(&self) -> Option<chrono::DateTime<Local>> {
119
- self.inner.request_start_time.get().cloned()
120
- }
121
-
122
- pub fn get_response_time(&self) -> Option<chrono::TimeDelta> {
123
- self.inner
124
- .request_start_time
125
- .get()
126
- .map(|instant| Local::now() - instant)
127
- }
128
- }
129
-
130
- impl Service<HttpRequest> for ItsiService {
131
- type Response = HttpResponse;
132
- type Error = ItsiError;
133
- type Future = Pin<Box<dyn Future<Output = itsi_error::Result<HttpResponse>> + Send>>;
134
-
135
- // This is called once per incoming Request.
136
- fn call(&self, req: HttpRequest) -> Self::Future {
137
- let params = self.server_params.clone();
138
- let self_clone = self.clone();
139
- Box::pin(async move {
140
- let mut req = req;
141
- let mut resp: Option<HttpResponse> = None;
142
- let (stack, matching_pattern) = params.middleware.get().unwrap().stack_for(&req);
143
- let mut context = RequestContext::new(self_clone, matching_pattern);
144
- let mut depth = 0;
145
- for (index, elm) in stack.iter().enumerate() {
146
- match elm.before(req, &mut context).await {
147
- Ok(Either::Left(r)) => req = r,
148
- Ok(Either::Right(r)) => {
149
- resp = Some(r);
150
- depth = index;
151
- break;
152
- }
153
- Err(e) => return Err(e.into()),
154
- }
155
- }
156
-
157
- let mut resp = match resp {
158
- Some(r) => r,
159
- None => {
160
- return Err(ItsiError::InternalServerError(
161
- "No response returned from middleware stack".to_string(),
162
- ))
163
- }
164
- };
165
- for elm in stack.iter().rev().skip(stack.len() - depth - 1) {
166
- resp = elm.after(resp, &mut context).await;
167
- }
168
-
169
- Ok(resp)
170
- })
171
- }
172
- }