itsi-server 0.1.18 → 0.1.20

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 (175) hide show
  1. checksums.yaml +4 -4
  2. data/Cargo.lock +932 -382
  3. data/README.md +2 -0
  4. data/exe/itsi +5 -5
  5. data/ext/itsi_acme/Cargo.toml +86 -0
  6. data/ext/itsi_acme/examples/high_level.rs +63 -0
  7. data/ext/itsi_acme/examples/high_level_warp.rs +52 -0
  8. data/ext/itsi_acme/examples/low_level.rs +87 -0
  9. data/ext/itsi_acme/examples/low_level_axum.rs +66 -0
  10. data/ext/itsi_acme/src/acceptor.rs +81 -0
  11. data/ext/itsi_acme/src/acme.rs +354 -0
  12. data/ext/itsi_acme/src/axum.rs +86 -0
  13. data/ext/itsi_acme/src/cache.rs +39 -0
  14. data/ext/itsi_acme/src/caches/boxed.rs +80 -0
  15. data/ext/itsi_acme/src/caches/composite.rs +69 -0
  16. data/ext/itsi_acme/src/caches/dir.rs +106 -0
  17. data/ext/itsi_acme/src/caches/mod.rs +11 -0
  18. data/ext/itsi_acme/src/caches/no.rs +78 -0
  19. data/ext/itsi_acme/src/caches/test.rs +136 -0
  20. data/ext/itsi_acme/src/config.rs +172 -0
  21. data/ext/itsi_acme/src/https_helper.rs +69 -0
  22. data/ext/itsi_acme/src/incoming.rs +142 -0
  23. data/ext/itsi_acme/src/jose.rs +161 -0
  24. data/ext/itsi_acme/src/lib.rs +142 -0
  25. data/ext/itsi_acme/src/resolver.rs +59 -0
  26. data/ext/itsi_acme/src/state.rs +424 -0
  27. data/ext/itsi_server/Cargo.toml +7 -4
  28. data/ext/itsi_server/src/ruby_types/itsi_http_request.rs +2 -2
  29. data/ext/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +150 -19
  30. data/ext/itsi_server/src/ruby_types/itsi_server.rs +1 -0
  31. data/ext/itsi_server/src/server/binds/listener.rs +34 -29
  32. data/ext/itsi_server/src/server/binds/tls/locked_dir_cache.rs +2 -2
  33. data/ext/itsi_server/src/server/binds/tls.rs +1 -1
  34. data/ext/itsi_server/src/server/middleware_stack/middleware.rs +33 -28
  35. data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_jwt.rs +56 -3
  36. data/ext/itsi_server/src/server/middleware_stack/middlewares/csp.rs +179 -0
  37. data/ext/itsi_server/src/server/middleware_stack/middlewares/mod.rs +25 -2
  38. data/ext/itsi_server/src/server/middleware_stack/middlewares/ruby_app.rs +3 -3
  39. data/ext/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs +2 -1
  40. data/ext/itsi_server/src/server/middleware_stack/mod.rs +32 -34
  41. data/ext/itsi_server/src/server/serve_strategy/cluster_mode.rs +10 -4
  42. data/ext/itsi_server/src/server/serve_strategy/single_mode.rs +30 -7
  43. data/ext/itsi_server/src/server/thread_worker.rs +2 -2
  44. data/ext/itsi_server/src/services/static_file_server.rs +30 -28
  45. data/ext/itsi_tracing/src/lib.rs +39 -8
  46. data/lib/itsi/http_request.rb +1 -0
  47. data/lib/itsi/server/config/config_helpers.rb +93 -0
  48. data/lib/itsi/server/config/dsl.rb +98 -37
  49. data/lib/itsi/server/config/known_paths/KitchensinkDirectories.txt +2346 -0
  50. data/lib/itsi/server/config/known_paths/Randomfiles.txt +24 -0
  51. data/lib/itsi/server/config/known_paths/UnixDotfiles.txt +52 -0
  52. data/lib/itsi/server/config/known_paths/backdoors/ASP_CommonBackdoors.txt +29 -0
  53. data/lib/itsi/server/config/known_paths/backdoors/bot_control_panels.txt +1668 -0
  54. data/lib/itsi/server/config/known_paths/backdoors/shells.txt +1167 -0
  55. data/lib/itsi/server/config/known_paths/cgi/CGI_HTTP_POST.txt +7 -0
  56. data/lib/itsi/server/config/known_paths/cgi/CGI_HTTP_POST_Windows.txt +6 -0
  57. data/lib/itsi/server/config/known_paths/cgi/CGI_Microsoft.txt +79 -0
  58. data/lib/itsi/server/config/known_paths/cgi/CGI_XPlatform.txt +3948 -0
  59. data/lib/itsi/server/config/known_paths/cms/README.md +5 -0
  60. data/lib/itsi/server/config/known_paths/cms/drupal_plugins.txt +6320 -0
  61. data/lib/itsi/server/config/known_paths/cms/drupal_themes.txt +828 -0
  62. data/lib/itsi/server/config/known_paths/cms/joomla_plugins.txt +224 -0
  63. data/lib/itsi/server/config/known_paths/cms/joomla_themes.txt +30 -0
  64. data/lib/itsi/server/config/known_paths/cms/php-nuke.txt +2142 -0
  65. data/lib/itsi/server/config/known_paths/cms/wordpress.txt +1566 -0
  66. data/lib/itsi/server/config/known_paths/cms/wp_common_theme_files.txt +46 -0
  67. data/lib/itsi/server/config/known_paths/cms/wp_plugins.txt +13366 -0
  68. data/lib/itsi/server/config/known_paths/cms/wp_plugins_full.txt +68662 -0
  69. data/lib/itsi/server/config/known_paths/cms/wp_plugins_top225.txt +225 -0
  70. data/lib/itsi/server/config/known_paths/cms/wp_themes.readme +12 -0
  71. data/lib/itsi/server/config/known_paths/cms/wp_themes.txt +7336 -0
  72. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/3CharExtBrute.txt +17576 -0
  73. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/CommonWebExtensions.txt +80 -0
  74. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Backup.txt +14 -0
  75. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Common.txt +865 -0
  76. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Compressed.txt +186 -0
  77. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Mostcommon.txt +30 -0
  78. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Skipfish.txt +93 -0
  79. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/WordlistSkipfish.txt +1918 -0
  80. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/copy_of.txt +8 -0
  81. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-directories-lowercase.txt +56180 -0
  82. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-directories.txt +62290 -0
  83. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-extensions-lowercase.txt +2367 -0
  84. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-extensions.txt +2450 -0
  85. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-files-lowercase.txt +35323 -0
  86. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-files.txt +37037 -0
  87. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-words-lowercase.txt +107982 -0
  88. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-words.txt +119600 -0
  89. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-directories-lowercase.txt +26593 -0
  90. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-directories.txt +30009 -0
  91. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-extensions-lowercase.txt +1233 -0
  92. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-extensions.txt +1289 -0
  93. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-files-lowercase.txt +16243 -0
  94. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-files.txt +17128 -0
  95. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-words-lowercase.txt +56293 -0
  96. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-words.txt +63087 -0
  97. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-directories-lowercase.txt +17776 -0
  98. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-directories.txt +20122 -0
  99. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-extensions-lowercase.txt +914 -0
  100. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-extensions.txt +963 -0
  101. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-files-lowercase.txt +10848 -0
  102. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-files.txt +11424 -0
  103. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-words-lowercase.txt +38267 -0
  104. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-words.txt +43003 -0
  105. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/spanish.txt +445 -0
  106. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/test_demo.txt +36 -0
  107. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/upload_variants.txt +44 -0
  108. data/lib/itsi/server/config/known_paths/login-file-locations/Logins.txt +71 -0
  109. data/lib/itsi/server/config/known_paths/login-file-locations/cfm.txt +294 -0
  110. data/lib/itsi/server/config/known_paths/login-file-locations/html.txt +295 -0
  111. data/lib/itsi/server/config/known_paths/login-file-locations/jsp.txt +294 -0
  112. data/lib/itsi/server/config/known_paths/login-file-locations/php.txt +294 -0
  113. data/lib/itsi/server/config/known_paths/login-file-locations/windows-asp.txt +294 -0
  114. data/lib/itsi/server/config/known_paths/login-file-locations/windows-aspx.txt +294 -0
  115. data/lib/itsi/server/config/known_paths/password-file-locations/Passwords.txt +47 -0
  116. data/lib/itsi/server/config/known_paths/php/PHP.txt +30 -0
  117. data/lib/itsi/server/config/known_paths/php/PHP_CommonBackdoors.txt +5 -0
  118. data/lib/itsi/server/config/known_paths/proxy-conf.txt +31 -0
  119. data/lib/itsi/server/config/known_paths/tftp.txt +79 -0
  120. data/lib/itsi/server/config/known_paths/webservers-appservers/ADFS.txt +86 -0
  121. data/lib/itsi/server/config/known_paths/webservers-appservers/AdobeXML.txt +16 -0
  122. data/lib/itsi/server/config/known_paths/webservers-appservers/Apache.txt +101 -0
  123. data/lib/itsi/server/config/known_paths/webservers-appservers/ApacheTomcat.txt +47 -0
  124. data/lib/itsi/server/config/known_paths/webservers-appservers/Apache_Axis.txt +16 -0
  125. data/lib/itsi/server/config/known_paths/webservers-appservers/ColdFusion.txt +111 -0
  126. data/lib/itsi/server/config/known_paths/webservers-appservers/FatwireCMS.txt +390 -0
  127. data/lib/itsi/server/config/known_paths/webservers-appservers/Frontpage.txt +38 -0
  128. data/lib/itsi/server/config/known_paths/webservers-appservers/HP_System_Mgmt_Homepage.txt +239 -0
  129. data/lib/itsi/server/config/known_paths/webservers-appservers/HTTP_POST_Microsoft.txt +2 -0
  130. data/lib/itsi/server/config/known_paths/webservers-appservers/Hyperion.txt +578 -0
  131. data/lib/itsi/server/config/known_paths/webservers-appservers/IIS.txt +187 -0
  132. data/lib/itsi/server/config/known_paths/webservers-appservers/JBoss.txt +5 -0
  133. data/lib/itsi/server/config/known_paths/webservers-appservers/JRun.txt +13 -0
  134. data/lib/itsi/server/config/known_paths/webservers-appservers/JavaServlets_Common.txt +3 -0
  135. data/lib/itsi/server/config/known_paths/webservers-appservers/Joomla_exploitable.txt +1937 -0
  136. data/lib/itsi/server/config/known_paths/webservers-appservers/LotusNotes.txt +206 -0
  137. data/lib/itsi/server/config/known_paths/webservers-appservers/Netware.txt +18 -0
  138. data/lib/itsi/server/config/known_paths/webservers-appservers/Oracle9i.txt +60 -0
  139. data/lib/itsi/server/config/known_paths/webservers-appservers/OracleAppServer.txt +192 -0
  140. data/lib/itsi/server/config/known_paths/webservers-appservers/README.md +6 -0
  141. data/lib/itsi/server/config/known_paths/webservers-appservers/Ruby_Rails.txt +121 -0
  142. data/lib/itsi/server/config/known_paths/webservers-appservers/SAP.txt +463 -0
  143. data/lib/itsi/server/config/known_paths/webservers-appservers/Sharepoint.txt +1707 -0
  144. data/lib/itsi/server/config/known_paths/webservers-appservers/SiteMinder.txt +19 -0
  145. data/lib/itsi/server/config/known_paths/webservers-appservers/SunAppServerGlassfish.txt +51 -0
  146. data/lib/itsi/server/config/known_paths/webservers-appservers/SuniPlanet.txt +35 -0
  147. data/lib/itsi/server/config/known_paths/webservers-appservers/Vignette.txt +73 -0
  148. data/lib/itsi/server/config/known_paths/webservers-appservers/Weblogic.txt +160 -0
  149. data/lib/itsi/server/config/known_paths/webservers-appservers/Websphere.txt +366 -0
  150. data/lib/itsi/server/config/known_paths/wellknown-rfc5785.txt +30 -0
  151. data/lib/itsi/server/config/known_paths.rb +17 -0
  152. data/lib/itsi/server/config/middleware/_index.md +54 -0
  153. data/lib/itsi/server/config/middleware/log_requests.md +63 -0
  154. data/lib/itsi/server/config/middleware/log_requests.rb +33 -0
  155. data/lib/itsi/server/config/middleware.rb +9 -0
  156. data/lib/itsi/server/config/option.rb +9 -0
  157. data/lib/itsi/server/config/options/_index.md +36 -0
  158. data/lib/itsi/server/config/options/fiber_scheduler.md +35 -0
  159. data/lib/itsi/server/config/options/fiber_scheduler.rb +18 -0
  160. data/lib/itsi/server/config/options/threads.md +39 -0
  161. data/lib/itsi/server/config/options/threads.rb +17 -0
  162. data/lib/itsi/server/config/options/workers.md +43 -0
  163. data/lib/itsi/server/config/options/workers.rb +17 -0
  164. data/lib/itsi/server/config/typed_struct.rb +203 -0
  165. data/lib/itsi/server/config.rb +124 -30
  166. data/lib/itsi/server/signal_trap.rb +5 -1
  167. data/lib/itsi/server/typed_handlers/source_parser.rb +1 -1
  168. data/lib/itsi/server/version.rb +1 -1
  169. data/lib/itsi/server.rb +27 -6
  170. data/lib/ruby_lsp/itsi/addon.rb +64 -48
  171. metadata +141 -5
  172. data/CHANGELOG.md +0 -10
  173. data/CODE_OF_CONDUCT.md +0 -139
  174. data/LICENSE.txt +0 -21
  175. data/_index.md +0 -6
@@ -2,18 +2,25 @@ module Itsi
2
2
  class Server
3
3
  module Config
4
4
  class DSL
5
- attr_reader :parent, :children, :middleware, :controller_class, :routes, :methods, :protocols,
5
+ require_relative "config_helpers"
6
+ require_relative "option"
7
+ require_relative "middleware"
8
+
9
+ attr_reader :parent, :children, :middleware, :controller_class, :routes, :http_methods, :protocols,
6
10
  :hosts, :ports, :extensions, :content_types, :accepts, :options
7
11
 
8
12
  def self.evaluate(config = Itsi::Server::Config.config_file_path, &blk)
9
- new(routes: ["/"]) do
13
+ config = new(routes: ["/"]) do
10
14
  if blk
11
15
  instance_exec(&blk)
12
16
  else
13
17
  code = IO.read(config)
14
18
  instance_eval(code, config.to_s, 1)
15
19
  end
16
- end.options
20
+ end
21
+ [config.options, config.errors]
22
+ rescue Exception => e
23
+ [{}, [[e, e.backtrace[0]]]]
17
24
  end
18
25
 
19
26
  def initialize(
@@ -36,7 +43,7 @@ module Itsi
36
43
 
37
44
  @controller = controller
38
45
  @routes = Array(routes).flatten
39
- @methods = methods.map { |s| s.is_a?(Regexp) ? s : s.to_s }
46
+ @http_methods = methods.map { |s| s.is_a?(Regexp) ? s : s.to_s }
40
47
  @protocols = protocols.map { |s| s.is_a?(Regexp) ? s : s.to_s }
41
48
  @hosts = hosts.map { |s| s.is_a?(Regexp) ? s : s.to_s }
42
49
  @ports = ports.map { |s| s.is_a?(Regexp) ? s : s.to_s }
@@ -54,19 +61,30 @@ module Itsi
54
61
  end
55
62
  }
56
63
 
64
+ @errors = []
57
65
  instance_exec(&block)
58
66
  end
59
67
 
60
- def workers(workers)
61
- raise "Workers must be set at the root" unless @parent.nil?
62
-
63
- @options[:workers] = [workers.to_i, 1].max
68
+ def errors
69
+ @children.map(&:errors).flatten + @errors
64
70
  end
65
71
 
66
- def threads(threads)
67
- raise "Threads must be set at the root" unless @parent.nil?
72
+ Option.subclasses.each do |option|
73
+ option_name = option.option_name
74
+ define_method(option_name) do |*args, **kwargs, &blk|
75
+ @options[option_name] = option.new(self, *args, **kwargs, &blk).build!
76
+ rescue => e
77
+ @errors << [e, caller[1]]
78
+ end
79
+ end
68
80
 
69
- @options[:threads] = [threads.to_i, 1].max
81
+ Middleware.subclasses.each do |middleware|
82
+ middleware_name = middleware.middleware_name
83
+ define_method(middleware_name) do |*args, **kwargs, &blk|
84
+ @middleware[middleware_name] = middleware.new(@parent, *args, **kwargs, &blk).build!
85
+ rescue => e
86
+ @errors << [e, caller[1]]
87
+ end
70
88
  end
71
89
 
72
90
  def oob_gc_responses_threshold(threshold)
@@ -81,18 +99,24 @@ module Itsi
81
99
  @options[:log_level] = level.to_s
82
100
  end
83
101
 
84
- def log_format(format)
85
- raise "Log format must be set at the root" unless @parent.nil?
86
-
87
- @options[:log_format] = format.to_s
88
- end
89
-
90
102
  def log_target(target)
91
103
  raise "Log target must be set at the root" unless @parent.nil?
92
104
 
93
105
  @options[:log_target] = target.to_s
94
106
  end
95
107
 
108
+ def log_target_filters(target_filters)
109
+ raise "Log target filters must be set at the root" unless @parent.nil?
110
+
111
+ @options[:log_target_filters] = target_filters
112
+ end
113
+
114
+ def log_format(target)
115
+ raise "Log format must be set at the root" unless @parent.nil?
116
+
117
+ @options[:log_format] = target.to_s
118
+ end
119
+
96
120
  def get(route, app_proc = nil, nonblocking: false, &blk)
97
121
  endpoint(route, [:get], app_proc, nonblocking: nonblocking, &blk)
98
122
  end
@@ -113,7 +137,7 @@ module Itsi
113
137
  endpoint(route, [:patch], app_proc, nonblocking: nonblocking, &blk)
114
138
  end
115
139
 
116
- def endpoint(route, methods=[], app_proc = nil, nonblocking: false, &blk)
140
+ def endpoint(route=nil, methods=[], app_proc = nil, nonblocking: false, &blk)
117
141
  raise "You must provide either a block or an explicit handler for the endpoint" if app_proc.nil? && blk.nil?
118
142
 
119
143
  app_proc = @controller.method(app_proc).to_proc if app_proc.is_a?(Symbol)
@@ -138,15 +162,18 @@ module Itsi
138
162
  app_proc = Itsi::Server::TypedHandlers.handler_for(app_proc, params_schema)
139
163
  end
140
164
 
141
-
142
- if route && methods.any?
165
+ if route || http_methods.any?
143
166
  # For endpoints, it's usually assumed trailing slash and non-trailing slash behaviour is the same
144
167
  routes = route == "/" ? ["", "/"] : [route]
145
- location(*routes, methods: methods) do
168
+ location(*routes, methods: http_methods) do
146
169
  @middleware[:app] = { preloader: -> { app_proc }, nonblocking: nonblocking }
147
170
  end
148
171
  else
149
- @middleware[:app] = { preloader: -> { app_proc }, nonblocking: nonblocking }
172
+ app = { preloader: -> { app_proc }, nonblocking: nonblocking }
173
+ @middleware[:app] = app
174
+ location("*") do
175
+ @middleware[:app] = app
176
+ end
150
177
  end
151
178
  end
152
179
 
@@ -178,12 +205,21 @@ module Itsi
178
205
  end
179
206
 
180
207
  def run(app, sendfile: true, nonblocking: false, path_info: "/")
181
- @middleware[:app] = { preloader: -> { Itsi::Server::RackInterface.for(app) }, sendfile: sendfile, base_path: "^(?<base_path>#{paths_from_parent.gsub(/\.\*\)$/, ')')}).*$", path_info: path_info, nonblocking: nonblocking }
208
+ app_args = { preloader: -> { Itsi::Server::RackInterface.for(app) }, sendfile: sendfile, base_path: "^(?<base_path>#{paths_from_parent.gsub(/\.\*\)$/, ')')}).*$", path_info: path_info, nonblocking: nonblocking }
209
+ base_path = "^(?<base_path>#{paths_from_parent.gsub(/\.\*\)$/, ')')}).*$"
210
+ @middleware[:app] = app_args
211
+ location("*") do
212
+ @middleware[:app] = app_args
213
+ end
182
214
  end
183
215
 
184
216
  def rackup_file(rackup_file, nonblocking: false, sendfile: true, path_info: "/")
185
217
  raise "Rackup file #{rackup_file} doesn't exist" unless File.exist?(rackup_file)
186
- @middleware[:app] = { preloader: -> { Itsi::Server::RackInterface.for(rackup_file) }, sendfile: sendfile, base_path: "^(?<base_path>#{paths_from_parent.gsub(/\.\*\)$/, ')')}).*$", path_info: path_info, nonblocking: nonblocking }
218
+ app_args = { preloader: -> { Itsi::Server::RackInterface.for(rackup_file) }, sendfile: sendfile, base_path: "^(?<base_path>#{paths_from_parent.gsub(/\.\*\)$/, ')')}).*$", path_info: path_info, nonblocking: nonblocking }
219
+ @middleware[:app] = app_args
220
+ location("*") do
221
+ @middleware[:app] = app_args
222
+ end
187
223
  end
188
224
 
189
225
  def include(path)
@@ -191,6 +227,31 @@ module Itsi
191
227
  instance_eval(code, "#{path}.rb", 1)
192
228
  end
193
229
 
230
+ def reuse_address(reuse_address)
231
+ raise "reuse_address must be set at the root" unless @parent.nil?
232
+ @options[:reuse_address] = reuse_address
233
+ end
234
+
235
+ def reuse_port(reuse_port)
236
+ raise "reuse_port must be set at the root" unless @parent.nil?
237
+ @options[:reuse_port] = reuse_port
238
+ end
239
+
240
+ def listen_backlog(listen_backlog)
241
+ raise "listen_backlog must be set at the root" unless @parent.nil?
242
+ @options[:listen_backlog] = listen_backlog
243
+ end
244
+
245
+ def nodelay(nodelay)
246
+ raise "nodelay must be set at the root" unless @parent.nil?
247
+ @options[:nodelay] = nodelay
248
+ end
249
+
250
+ def recv_buffer_size(recv_buffer_size)
251
+ raise "recv_buffer_size must be set at the root" unless @parent.nil?
252
+ @options[:recv_buffer_size] = recv_buffer_size
253
+ end
254
+
194
255
  def bind(bind_str)
195
256
  raise "Bind must be set at the root" unless @parent.nil?
196
257
 
@@ -283,6 +344,11 @@ module Itsi
283
344
  @options[:shutdown_timeout] = shutdown_timeout.to_f
284
345
  end
285
346
 
347
+ def header_read_timeout(header_read_timeout)
348
+ raise "Header read timeout must be set at the root" unless @parent.nil?
349
+
350
+ @options[:header_read_timeout] = header_read_timeout.to_f
351
+ end
286
352
 
287
353
  def stream_body(stream_body)
288
354
  raise "Stream body must be set at the root" unless @parent.nil?
@@ -296,7 +362,7 @@ module Itsi
296
362
  @children << DSL.new(
297
363
  self,
298
364
  routes: routes,
299
- methods: Array(methods) | self.methods,
365
+ methods: Array(methods) | self.http_methods,
300
366
  protocols: Array(protocols) | self.protocols,
301
367
  hosts: Array(hosts) | self.hosts,
302
368
  ports: Array(ports) | self.ports,
@@ -314,9 +380,6 @@ module Itsi
314
380
  end
315
381
  end
316
382
 
317
- def log_requests(**args)
318
- @middleware[:log_requests] = args
319
- end
320
383
 
321
384
  def allow_list(**args)
322
385
  args[:allowed_patterns] = Array(args[:allowed_patterns]).map do |pattern|
@@ -345,7 +408,6 @@ module Itsi
345
408
  end
346
409
 
347
410
  def auth_basic(**args)
348
-
349
411
  if File.exist?(".itsi-credentials") && !args[:credential_file]
350
412
  args[:credential_file] = ".itsi-credentials"
351
413
  end
@@ -419,8 +481,12 @@ module Itsi
419
481
  @middleware[:etag] = args
420
482
  end
421
483
 
484
+ def csp(**args)
485
+ @middleware[:csp] = args
486
+ end
487
+
422
488
  def intrusion_protection(**args)
423
- args[:banned_url_patterns] = Array(args[:banned_url_patterns]).map do |pattern|
489
+ args[:banned_url_patterns] = Array(args[:banned_url_patterns]).flatten.map do |pattern|
424
490
  if pattern.is_a?(Regexp)
425
491
  pattern.source
426
492
  else
@@ -472,7 +538,7 @@ module Itsi
472
538
  result << deep_stringify_keys(
473
539
  {
474
540
  route: Regexp.new("^#{route_options}/?$"),
475
- methods: @methods.any? ? @methods : nil,
541
+ methods: @http_methods.any? ? @http_methods : nil,
476
542
  protocols: @protocols.any? ? @protocols : nil,
477
543
  hosts: @hosts.any? ? @hosts : nil,
478
544
  ports: @ports.any? ? @ports : nil,
@@ -522,11 +588,6 @@ module Itsi
522
588
  end
523
589
 
524
590
  def effective_middleware
525
- merged = merge_ancestor_middleware
526
- merged.map { |k, v| { type: k.to_s, parameters: v } }
527
- end
528
-
529
- def merge_ancestor_middleware
530
591
  chain = []
531
592
  node = self
532
593
  while node
@@ -545,7 +606,7 @@ module Itsi
545
606
  merged[k] = v
546
607
  end
547
608
  end
548
- merged
609
+ deep_stringify_keys(merged)
549
610
  end
550
611
 
551
612
  def deep_stringify_keys(obj)