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.
Files changed (169) hide show
  1. checksums.yaml +4 -4
  2. data/Cargo.lock +124 -109
  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 +8 -10
  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 +124 -109
  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 +116 -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 +160 -101
  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 +326 -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
@@ -1,13 +1,13 @@
1
1
  PATH
2
2
  remote: ../../gems/scheduler
3
3
  specs:
4
- itsi-scheduler (0.1.11)
4
+ itsi-scheduler (0.1.17)
5
5
  rb_sys (~> 0.9.91)
6
6
 
7
7
  PATH
8
8
  remote: ../../gems/server
9
9
  specs:
10
- itsi-server (0.1.11)
10
+ itsi-server (0.1.17)
11
11
  rack (>= 1.6)
12
12
  rb_sys (~> 0.9.91)
13
13
 
@@ -88,6 +88,36 @@ GEM
88
88
  addressable (2.8.7)
89
89
  public_suffix (>= 2.0.2, < 7.0)
90
90
  ast (2.4.2)
91
+ async (2.23.1)
92
+ console (~> 1.29)
93
+ fiber-annotation
94
+ io-event (~> 1.9)
95
+ metrics (~> 0.12)
96
+ traces (~> 0.15)
97
+ async-container (0.24.0)
98
+ async (~> 2.22)
99
+ async-container-supervisor (0.5.1)
100
+ async-container (~> 0.22)
101
+ async-service
102
+ io-endpoint
103
+ memory-leak (~> 0.5)
104
+ async-http (0.87.0)
105
+ async (>= 2.10.2)
106
+ async-pool (~> 0.9)
107
+ io-endpoint (~> 0.14)
108
+ io-stream (~> 0.6)
109
+ metrics (~> 0.12)
110
+ protocol-http (~> 0.49)
111
+ protocol-http1 (~> 0.30)
112
+ protocol-http2 (~> 0.22)
113
+ traces (~> 0.10)
114
+ async-http-cache (0.4.5)
115
+ async-http (~> 0.56)
116
+ async-pool (0.10.3)
117
+ async (>= 1.25)
118
+ async-service (0.13.0)
119
+ async
120
+ async-container (~> 0.16)
91
121
  base64 (0.2.0)
92
122
  benchmark (0.4.0)
93
123
  bigdecimal (3.1.9)
@@ -108,6 +138,10 @@ GEM
108
138
  xpath (~> 3.2)
109
139
  concurrent-ruby (1.3.5)
110
140
  connection_pool (2.5.0)
141
+ console (1.30.2)
142
+ fiber-annotation
143
+ fiber-local (~> 1.1)
144
+ json
111
145
  crass (1.0.6)
112
146
  date (3.4.1)
113
147
  debug (1.10.0)
@@ -115,6 +149,23 @@ GEM
115
149
  reline (>= 0.3.8)
116
150
  drb (2.2.1)
117
151
  erubi (1.13.1)
152
+ falcon (0.51.1)
153
+ async
154
+ async-container (~> 0.20)
155
+ async-container-supervisor (~> 0.5.0)
156
+ async-http (~> 0.75)
157
+ async-http-cache (~> 0.4)
158
+ async-service (~> 0.10)
159
+ bundler
160
+ localhost (~> 1.1)
161
+ openssl (~> 3.0)
162
+ protocol-http (~> 0.31)
163
+ protocol-rack (~> 0.7)
164
+ samovar (~> 2.3)
165
+ fiber-annotation (0.2.0)
166
+ fiber-local (1.1.0)
167
+ fiber-storage
168
+ fiber-storage (1.0.0)
118
169
  globalid (1.2.1)
119
170
  activesupport (>= 6.1)
120
171
  i18n (1.14.7)
@@ -124,6 +175,9 @@ GEM
124
175
  activesupport (>= 6.0.0)
125
176
  railties (>= 6.0.0)
126
177
  io-console (0.8.0)
178
+ io-endpoint (0.15.2)
179
+ io-event (1.10.0)
180
+ io-stream (0.6.1)
127
181
  iodine (0.7.58)
128
182
  irb (1.15.1)
129
183
  pp (>= 0.6.0)
@@ -135,6 +189,7 @@ GEM
135
189
  json (2.10.2)
136
190
  language_server-protocol (3.17.0.4)
137
191
  lint_roller (1.1.0)
192
+ localhost (1.3.1)
138
193
  logger (1.6.6)
139
194
  loofah (2.24.0)
140
195
  crass (~> 1.0.2)
@@ -144,8 +199,11 @@ GEM
144
199
  net-imap
145
200
  net-pop
146
201
  net-smtp
202
+ mapping (1.1.1)
147
203
  marcel (1.0.4)
148
204
  matrix (0.4.2)
205
+ memory-leak (0.5.2)
206
+ metrics (0.12.2)
149
207
  mini_mime (1.1.5)
150
208
  minitest (5.25.5)
151
209
  msgpack (1.8.0)
@@ -175,6 +233,7 @@ GEM
175
233
  racc (~> 1.4)
176
234
  nokogiri (1.18.4-x86_64-linux-musl)
177
235
  racc (~> 1.4)
236
+ openssl (3.3.0)
178
237
  parallel (1.26.3)
179
238
  parser (3.3.7.1)
180
239
  ast (~> 2.4.1)
@@ -183,6 +242,16 @@ GEM
183
242
  pp (0.6.2)
184
243
  prettyprint
185
244
  prettyprint (0.2.0)
245
+ protocol-hpack (1.5.1)
246
+ protocol-http (0.49.0)
247
+ protocol-http1 (0.30.0)
248
+ protocol-http (~> 0.22)
249
+ protocol-http2 (0.22.1)
250
+ protocol-hpack (~> 1.4)
251
+ protocol-http (~> 0.47)
252
+ protocol-rack (0.11.2)
253
+ protocol-http (~> 0.43)
254
+ rack (>= 1.0)
186
255
  psych (5.2.3)
187
256
  date
188
257
  stringio
@@ -267,6 +336,9 @@ GEM
267
336
  rubocop-rails (>= 2.30)
268
337
  ruby-progressbar (1.13.0)
269
338
  rubyzip (2.4.1)
339
+ samovar (2.3.0)
340
+ console (~> 1.0)
341
+ mapping (~> 1.0)
270
342
  securerandom (0.4.1)
271
343
  selenium-webdriver (4.29.1)
272
344
  base64 (~> 0.2)
@@ -294,6 +366,7 @@ GEM
294
366
  stringio (3.1.5)
295
367
  thor (1.3.2)
296
368
  timeout (0.4.3)
369
+ traces (0.15.2)
297
370
  turbo-rails (2.0.13)
298
371
  actionpack (>= 7.1.0)
299
372
  railties (>= 7.1.0)
@@ -334,6 +407,7 @@ DEPENDENCIES
334
407
  brakeman
335
408
  capybara
336
409
  debug
410
+ falcon
337
411
  importmap-rails
338
412
  iodine
339
413
  itsi-scheduler!
@@ -1,10 +1,25 @@
1
1
  require "net/http"
2
+ require 'debug'
2
3
 
3
4
  class HomeController < ApplicationController
4
5
  def index
5
6
  render json: { message: "Hello, World!" }
6
7
  end
7
8
 
9
+ def do_send_file
10
+ file_path = Rails.root.join('app', 'controllers', 'home_controller.rb')
11
+ if File.exist?(file_path)
12
+ send_file file_path, type: 'text/plain', disposition: 'attachment'
13
+ else
14
+ render json: { error: 'File not found' }, status: :not_found
15
+ end
16
+ end
17
+
18
+ def do_send_data
19
+ data = "This is some sample data to send."
20
+ send_data data, filename: 'sample.txt', type: 'text/plain', disposition: 'attachment'
21
+ end
22
+
8
23
  def full_hijack
9
24
  io = request.env['rack.hijack'].call
10
25
  io.write("HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\n")
@@ -36,6 +36,7 @@ Rails.application.configure do
36
36
 
37
37
  # Don't care if the mailer can't send.
38
38
  config.action_mailer.raise_delivery_errors = false
39
+ config.action_dispatch.x_sendfile_header = "X-Sendfile"
39
40
 
40
41
  # Disable caching for Action Mailer templates even if Action Controller
41
42
  # caching is enabled.
@@ -35,6 +35,7 @@ Rails.application.configure do
35
35
  # Specifies the header that your server uses for sending files.
36
36
  # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for Apache
37
37
  # config.action_dispatch.x_sendfile_header = "X-Accel-Redirect" # for NGINX
38
+ config.action_dispatch.x_sendfile_header = "X-Sendfile"
38
39
 
39
40
  # Store uploaded files on the local file system (see config/storage.yml for options).
40
41
  config.active_storage.service = :local
@@ -13,6 +13,8 @@ Rails.application.routes.draw do
13
13
  root "home#index"
14
14
  get "io_party" => "home#io_party", as: :io_party
15
15
  get "chunked" => "home#chunked_encoding", as: :chunked_encoding
16
+ get "send_data" => "home#do_send_data", as: :send_data
17
+ get "send_file" => "home#do_send_file", as: :send_file
16
18
  get "full_hijack" => "home#full_hijack", as: :full_hijack
17
19
  get "stream" => "live#stream", as: :live_stream
18
20
  get "sse" => "live#sse", as: :sse
@@ -1,4 +1,3 @@
1
- require 'debug'
2
1
  require 'sinatra'
3
2
  require 'itsi/server'
4
3
 
@@ -0,0 +1 @@
1
+ ALL MY SECRETS ARE HERE!!
@@ -0,0 +1,25 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Hello World</title>
7
+ <style>
8
+ body {
9
+ display: flex;
10
+ justify-content: center;
11
+ align-items: center;
12
+ height: 100vh;
13
+ margin: 0;
14
+ font-family: Arial, sans-serif;
15
+ background-color: #f0f0f0;
16
+ }
17
+ h1 {
18
+ color: #333;
19
+ }
20
+ </style>
21
+ </head>
22
+ <body>
23
+ Not here!
24
+ </body>
25
+ </html>
@@ -0,0 +1,68 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>Error – Page Not Found</title>
7
+ <style>
8
+ :root {
9
+ --bg-color: #f0f2f5;
10
+ --text-color: #333;
11
+ --accent-color: #0052cc;
12
+ --link-color: #0052cc;
13
+ }
14
+ body {
15
+ margin: 0;
16
+ font-family: "Helvetica Neue", Arial, sans-serif;
17
+ background: var(--bg-color);
18
+ color: var(--text-color);
19
+ display: flex;
20
+ align-items: center;
21
+ justify-content: center;
22
+ min-height: 100vh;
23
+ padding: 2rem;
24
+ }
25
+ .error-container {
26
+ text-align: center;
27
+ max-width: 800px;
28
+ width: 100%;
29
+ }
30
+ h1 {
31
+ font-size: 5rem;
32
+ font-weight: 300;
33
+ margin-bottom: 0.5rem;
34
+ }
35
+ p {
36
+ font-size: 1.5rem;
37
+ line-height: 1.6;
38
+ margin-bottom: 2rem;
39
+ }
40
+ a {
41
+ font-size: 1rem;
42
+ text-decoration: none;
43
+ color: var(--link-color);
44
+ border-bottom: 1px solid transparent;
45
+ transition: border-color 0.2s ease-in-out;
46
+ }
47
+ a:hover {
48
+ border-color: var(--link-color);
49
+ }
50
+ @media (max-width: 480px) {
51
+ h1 {
52
+ font-size: 3.5rem;
53
+ }
54
+ p {
55
+ font-size: 1.2rem;
56
+ }
57
+ }
58
+ </style>
59
+ </head>
60
+ <body>
61
+ <div class="error-container">
62
+ <h1>404</h1>
63
+ <p>We’re sorry, but we couldn’t find the page you were looking for.</p>
64
+ <p><a href="/">Return Home</a></p>
65
+ <p><a href="javascript:history.back()">Go Back</a></p>
66
+ </div>
67
+ </body>
68
+ </html>
@@ -0,0 +1 @@
1
+ Hello World
Binary file
data/tasks.txt CHANGED
@@ -1,40 +1,30 @@
1
- Filters:
2
- - Implicit "/" location at the top.
3
- - gRPC (Handlers).
4
- - Read should be non-blocking.
5
- - Support fall through and graceful routing
6
- - Support gzip and compression flag
7
- - Add reflection support
8
- - Unary JSON support
9
- - Server tests, fix graceful shutdown.
10
- - Retest new JWT imp
1
+ -- Stretch goals:
2
+ - Single acceptor
3
+ - H3
4
+ - OpenAPI gen
5
+
6
+ Feature complete. Polish and Release (At Lake):
7
+ - Establish pattern for separate files for dsl feature, accumulated errors, ruby-dsl and "Did you mean" function.
8
+ - Always do dry-run before reloading app.
9
+ - More elegant route printing (middleware)
10
+ - Fix default config (make sane choices)
11
11
 
12
- Polish and Release (At Lake):
13
- -- Autoreload sugar
14
- -- Optimize gRPC and Hash creation for Rack
15
- -- Print routes
16
- -- Match routes
17
- -- Offer password hash generation, and load from files for basic auth, api key, jwt.
18
- -- Max body size (and potentially other safety timeouts)
19
- -- Better internal errors (Make clear when specific middleware fails)
20
- -- Fix server shutdown tests (Test on multi-thread)
21
12
  -- Feature breakdown. For each feature make sure we have
22
- --- Ultra robust config.
23
- --- Documentation
13
+ --- Clean Code
14
+ --- Ultra robust config, with sane and safe defaults.
15
+ --- Complete Documentation (Readme + Blog)
24
16
  --- Tests.
25
17
  --- Debug Logging
26
18
  --- Parameters for everything
27
19
  --- No unwrap
28
- -- Consider switch to Anyhow where appropriate (or make own errors cleaner)
29
- -- Script name comes from location in hierarchy instead of params.
30
- -- Request convenience functions (body JSON, body form-encoded)
31
- -- Add notes on: PGGSSENCMODE="disable"
20
+ --- Beautiful LSP and did you mean integration
32
21
 
33
22
  - Feature List:
34
23
  -- HTTP
35
24
  -- HTTP2
36
25
  -- TLS
37
26
  -- Websockets
27
+ -- Headers (Replace is equal to remove plus append)
38
28
  -- Hijack
39
29
  -- Callable
40
30
  -- Streaming Bodies
@@ -54,7 +44,7 @@ Polish and Release (At Lake):
54
44
  -- Rackup
55
45
  -- Rack inline
56
46
  -- Static assets
57
- -- Redirect
47
+ -- Redirect (HTTP to HTTPS!)
58
48
  -- Logging
59
49
  -- Cluster
60
50
  -- Single
@@ -62,16 +52,21 @@ Polish and Release (At Lake):
62
52
  -- Stream body
63
53
  -- Thread high/low
64
54
  -- Unix Sockets
55
+ -- Uneven request distribution (Retry central acceptor, core affinity)
56
+ -- Mini apps, one-file sites.
57
+ -- Lsp and Did you mean
58
+ -- Author Final default Itsi-file
59
+ -- Add notes on: PGGSSENCMODE="disable" and OBJC_DISABLE_INITIALIZE_FORK_SAFETY=
65
60
 
66
61
  Later:
62
+ - OTel
63
+ - Even faster Hash creation for Rack
64
+ - Image resizer
67
65
  - First class Rackless Websockets
68
- - Implement Simple Request timeout (non-fiber mode. Kill stuck threads. Default to nil)
69
- - Print out warning if we can detect a location block will never be hit.
70
- - Optimize: Avoid double encoding in compression filter if already compressed
71
- - Built in dashboard + Stats
72
- - Support Request timeout in Fiber scheduler mode
66
+ - Implement better Request timeouts (non-fiber mode. Kill stuck threads. Default to nil)
67
+ - Print out warning if we can detect that a location block will never be hit.
68
+ - Built in obs Dashboard + Stats
73
69
  - Support UDP
74
70
  - Support unix socket proxy
75
- -- Hunt down sporradic bad file desc during tests
76
71
  -- WASM pluggable middleware
77
- -- proto proxy
72
+ -- gRPC proxying