itsi 0.1.14 → 0.1.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Cargo.lock +124 -109
- data/Cargo.toml +6 -0
- data/crates/itsi_error/Cargo.toml +1 -0
- data/crates/itsi_error/src/lib.rs +100 -10
- data/crates/itsi_scheduler/src/itsi_scheduler.rs +1 -1
- data/crates/itsi_server/Cargo.toml +8 -10
- data/crates/itsi_server/src/default_responses/html/401.html +68 -0
- data/crates/itsi_server/src/default_responses/html/403.html +68 -0
- data/crates/itsi_server/src/default_responses/html/404.html +68 -0
- data/crates/itsi_server/src/default_responses/html/413.html +71 -0
- data/crates/itsi_server/src/default_responses/html/429.html +68 -0
- data/crates/itsi_server/src/default_responses/html/500.html +71 -0
- data/crates/itsi_server/src/default_responses/html/502.html +71 -0
- data/crates/itsi_server/src/default_responses/html/503.html +68 -0
- data/crates/itsi_server/src/default_responses/html/504.html +69 -0
- data/crates/itsi_server/src/default_responses/html/index.html +238 -0
- data/crates/itsi_server/src/default_responses/json/401.json +6 -0
- data/crates/itsi_server/src/default_responses/json/403.json +6 -0
- data/crates/itsi_server/src/default_responses/json/404.json +6 -0
- data/crates/itsi_server/src/default_responses/json/413.json +6 -0
- data/crates/itsi_server/src/default_responses/json/429.json +6 -0
- data/crates/itsi_server/src/default_responses/json/500.json +6 -0
- data/crates/itsi_server/src/default_responses/json/502.json +6 -0
- data/crates/itsi_server/src/default_responses/json/503.json +6 -0
- data/crates/itsi_server/src/default_responses/json/504.json +6 -0
- data/crates/itsi_server/src/default_responses/mod.rs +11 -0
- data/crates/itsi_server/src/lib.rs +58 -26
- data/crates/itsi_server/src/prelude.rs +2 -0
- data/crates/itsi_server/src/ruby_types/README.md +21 -0
- data/crates/itsi_server/src/ruby_types/itsi_body_proxy/mod.rs +8 -6
- data/crates/itsi_server/src/ruby_types/itsi_grpc_call.rs +344 -0
- data/crates/itsi_server/src/ruby_types/{itsi_grpc_stream → itsi_grpc_response_stream}/mod.rs +121 -73
- data/crates/itsi_server/src/ruby_types/itsi_http_request.rs +103 -40
- data/crates/itsi_server/src/ruby_types/itsi_http_response.rs +8 -5
- data/crates/itsi_server/src/ruby_types/itsi_server/file_watcher.rs +4 -4
- data/crates/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +37 -17
- data/crates/itsi_server/src/ruby_types/itsi_server.rs +4 -3
- data/crates/itsi_server/src/ruby_types/mod.rs +6 -13
- data/crates/itsi_server/src/server/{bind.rs → binds/bind.rs} +23 -4
- data/crates/itsi_server/src/server/{listener.rs → binds/listener.rs} +24 -10
- data/crates/itsi_server/src/server/binds/mod.rs +4 -0
- data/crates/itsi_server/src/server/{tls.rs → binds/tls.rs} +9 -4
- data/crates/itsi_server/src/server/http_message_types.rs +97 -0
- data/crates/itsi_server/src/server/io_stream.rs +2 -1
- data/crates/itsi_server/src/server/middleware_stack/middleware.rs +28 -16
- data/crates/itsi_server/src/server/middleware_stack/middlewares/allow_list.rs +17 -8
- data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_api_key.rs +47 -18
- data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_basic.rs +13 -9
- data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_jwt.rs +50 -29
- data/crates/itsi_server/src/server/middleware_stack/middlewares/cache_control.rs +5 -2
- data/crates/itsi_server/src/server/middleware_stack/middlewares/compression.rs +37 -48
- data/crates/itsi_server/src/server/middleware_stack/middlewares/cors.rs +25 -20
- data/crates/itsi_server/src/server/middleware_stack/middlewares/deny_list.rs +14 -7
- data/crates/itsi_server/src/server/middleware_stack/middlewares/error_response/default_responses.rs +190 -0
- data/crates/itsi_server/src/server/middleware_stack/middlewares/error_response.rs +125 -95
- data/crates/itsi_server/src/server/middleware_stack/middlewares/etag.rs +9 -5
- data/crates/itsi_server/src/server/middleware_stack/middlewares/header_interpretation.rs +1 -4
- data/crates/itsi_server/src/server/middleware_stack/middlewares/intrusion_protection.rs +25 -19
- data/crates/itsi_server/src/server/middleware_stack/middlewares/log_requests.rs +4 -4
- data/crates/itsi_server/src/server/middleware_stack/middlewares/max_body.rs +47 -0
- data/crates/itsi_server/src/server/middleware_stack/middlewares/mod.rs +9 -4
- data/crates/itsi_server/src/server/middleware_stack/middlewares/proxy.rs +260 -62
- data/crates/itsi_server/src/server/middleware_stack/middlewares/rate_limit.rs +29 -22
- data/crates/itsi_server/src/server/middleware_stack/middlewares/redirect.rs +6 -6
- data/crates/itsi_server/src/server/middleware_stack/middlewares/request_headers.rs +6 -5
- data/crates/itsi_server/src/server/middleware_stack/middlewares/response_headers.rs +4 -2
- data/crates/itsi_server/src/server/middleware_stack/middlewares/ruby_app.rs +51 -18
- data/crates/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs +31 -13
- data/crates/itsi_server/src/server/middleware_stack/middlewares/static_response.rs +55 -0
- data/crates/itsi_server/src/server/middleware_stack/middlewares/string_rewrite.rs +13 -8
- data/crates/itsi_server/src/server/middleware_stack/mod.rs +101 -69
- data/crates/itsi_server/src/server/mod.rs +3 -9
- data/crates/itsi_server/src/server/process_worker.rs +21 -3
- data/crates/itsi_server/src/server/request_job.rs +2 -2
- data/crates/itsi_server/src/server/serve_strategy/cluster_mode.rs +8 -3
- data/crates/itsi_server/src/server/serve_strategy/single_mode.rs +26 -26
- data/crates/itsi_server/src/server/signal.rs +24 -41
- data/crates/itsi_server/src/server/size_limited_incoming.rs +101 -0
- data/crates/itsi_server/src/server/thread_worker.rs +59 -28
- data/crates/itsi_server/src/services/itsi_http_service.rs +239 -0
- data/crates/itsi_server/src/services/mime_types.rs +1416 -0
- data/crates/itsi_server/src/services/mod.rs +6 -0
- data/crates/itsi_server/src/services/password_hasher.rs +83 -0
- data/crates/itsi_server/src/{server → services}/rate_limiter.rs +35 -31
- data/crates/itsi_server/src/{server → services}/static_file_server.rs +521 -181
- data/crates/itsi_tracing/src/lib.rs +145 -55
- data/{Itsi.rb → foo/Itsi.rb} +6 -9
- data/gems/scheduler/Cargo.lock +7 -0
- data/gems/scheduler/lib/itsi/scheduler/version.rb +1 -1
- data/gems/scheduler/test/helpers/test_helper.rb +0 -1
- data/gems/scheduler/test/test_address_resolve.rb +0 -1
- data/gems/scheduler/test/test_network_io.rb +1 -1
- data/gems/scheduler/test/test_process_wait.rb +0 -1
- data/gems/server/Cargo.lock +124 -109
- data/gems/server/exe/itsi +65 -19
- data/gems/server/itsi-server.gemspec +4 -3
- data/gems/server/lib/itsi/http_request/response_status_shortcodes.rb +74 -0
- data/gems/server/lib/itsi/http_request.rb +116 -17
- data/gems/server/lib/itsi/http_response.rb +2 -0
- data/gems/server/lib/itsi/passfile.rb +109 -0
- data/gems/server/lib/itsi/server/config/dsl.rb +160 -101
- data/gems/server/lib/itsi/server/config.rb +58 -23
- data/gems/server/lib/itsi/server/default_app/default_app.rb +25 -29
- data/gems/server/lib/itsi/server/default_app/index.html +113 -89
- data/gems/server/lib/itsi/server/{Itsi.rb → default_config/Itsi-rackup.rb} +1 -1
- data/gems/server/lib/itsi/server/default_config/Itsi.rb +107 -0
- data/gems/server/lib/itsi/server/grpc/grpc_call.rb +246 -0
- data/gems/server/lib/itsi/server/grpc/grpc_interface.rb +100 -0
- data/gems/server/lib/itsi/server/grpc/reflection/v1/reflection_pb.rb +26 -0
- data/gems/server/lib/itsi/server/grpc/reflection/v1/reflection_services_pb.rb +122 -0
- data/gems/server/lib/itsi/server/route_tester.rb +107 -0
- data/gems/server/lib/itsi/server/typed_handlers/param_parser.rb +200 -0
- data/gems/server/lib/itsi/server/typed_handlers/source_parser.rb +55 -0
- data/gems/server/lib/itsi/server/typed_handlers.rb +17 -0
- data/gems/server/lib/itsi/server/version.rb +1 -1
- data/gems/server/lib/itsi/server.rb +82 -12
- data/gems/server/lib/ruby_lsp/itsi/addon.rb +111 -0
- data/gems/server/lib/shell_completions/completions.rb +26 -0
- data/gems/server/test/helpers/test_helper.rb +2 -1
- data/lib/itsi/version.rb +1 -1
- data/sandbox/README.md +5 -0
- data/sandbox/itsi_file/Gemfile +4 -2
- data/sandbox/itsi_file/Gemfile.lock +48 -6
- data/sandbox/itsi_file/Itsi.rb +326 -129
- data/sandbox/itsi_file/call.json +1 -0
- data/sandbox/itsi_file/echo_client/Gemfile +10 -0
- data/sandbox/itsi_file/echo_client/Gemfile.lock +27 -0
- data/sandbox/itsi_file/echo_client/README.md +95 -0
- data/sandbox/itsi_file/echo_client/echo_client.rb +164 -0
- data/sandbox/itsi_file/echo_client/gen_proto.sh +17 -0
- data/sandbox/itsi_file/echo_client/lib/echo_pb.rb +16 -0
- data/sandbox/itsi_file/echo_client/lib/echo_services_pb.rb +29 -0
- data/sandbox/itsi_file/echo_client/run_client.rb +64 -0
- data/sandbox/itsi_file/echo_client/test_compressions.sh +20 -0
- data/sandbox/itsi_file/echo_service_nonitsi/Gemfile +10 -0
- data/sandbox/itsi_file/echo_service_nonitsi/Gemfile.lock +79 -0
- data/sandbox/itsi_file/echo_service_nonitsi/echo.proto +26 -0
- data/sandbox/itsi_file/echo_service_nonitsi/echo_pb.rb +16 -0
- data/sandbox/itsi_file/echo_service_nonitsi/echo_services_pb.rb +29 -0
- data/sandbox/itsi_file/echo_service_nonitsi/server.rb +52 -0
- data/sandbox/itsi_sandbox_async/config.ru +0 -1
- data/sandbox/itsi_sandbox_rack/Gemfile.lock +2 -2
- data/sandbox/itsi_sandbox_rails/Gemfile +2 -2
- data/sandbox/itsi_sandbox_rails/Gemfile.lock +76 -2
- data/sandbox/itsi_sandbox_rails/app/controllers/home_controller.rb +15 -0
- data/sandbox/itsi_sandbox_rails/config/environments/development.rb +1 -0
- data/sandbox/itsi_sandbox_rails/config/environments/production.rb +1 -0
- data/sandbox/itsi_sandbox_rails/config/routes.rb +2 -0
- data/sandbox/itsi_sinatra/app.rb +0 -1
- data/sandbox/static_files/.env +1 -0
- data/sandbox/static_files/404.html +25 -0
- data/sandbox/static_files/_DSC0102.NEF.jpg +0 -0
- data/sandbox/static_files/about.html +68 -0
- data/sandbox/static_files/tiny.html +1 -0
- data/sandbox/static_files/writebook.zip +0 -0
- data/tasks.txt +28 -33
- metadata +87 -26
- data/crates/itsi_error/src/from.rs +0 -68
- data/crates/itsi_server/src/ruby_types/itsi_grpc_request.rs +0 -147
- data/crates/itsi_server/src/ruby_types/itsi_grpc_response.rs +0 -19
- data/crates/itsi_server/src/server/itsi_service.rs +0 -172
- data/crates/itsi_server/src/server/middleware_stack/middlewares/grpc_service.rs +0 -72
- data/crates/itsi_server/src/server/types.rs +0 -43
- data/gems/server/lib/itsi/server/grpc_interface.rb +0 -213
- data/sandbox/itsi_file/public/assets/index.html +0 -1
- /data/crates/itsi_server/src/server/{bind_protocol.rs → binds/bind_protocol.rs} +0 -0
- /data/crates/itsi_server/src/server/{tls → binds/tls}/locked_dir_cache.rs +0 -0
- /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.
|
4
|
+
version: 0.1.18
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Wouter Coppieters
|
8
8
|
bindir: exe
|
9
9
|
cert_chain: []
|
10
|
-
date:
|
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.
|
18
|
+
version: 0.1.18
|
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.
|
25
|
+
version: 0.1.18
|
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.
|
32
|
+
version: 0.1.18
|
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.
|
39
|
+
version: 0.1.18
|
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/
|
78
|
-
- crates/itsi_server/src/ruby_types/
|
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/
|
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/
|
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/
|
131
|
-
- crates/itsi_server/src/
|
132
|
-
- crates/itsi_server/src/
|
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/
|
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.
|
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
|
-
}
|