falcon 0.48.3 → 0.48.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/bake/falcon/supervisor.rb +2 -2
  4. data/bin/falcon +1 -1
  5. data/bin/falcon-host +1 -1
  6. data/lib/falcon/command/host.rb +4 -4
  7. data/lib/falcon/command/paths.rb +1 -1
  8. data/lib/falcon/command/proxy.rb +5 -5
  9. data/lib/falcon/command/redirect.rb +6 -6
  10. data/lib/falcon/command/serve.rb +21 -21
  11. data/lib/falcon/command/supervisor.rb +10 -10
  12. data/lib/falcon/command/top.rb +19 -19
  13. data/lib/falcon/command/virtual.rb +6 -6
  14. data/lib/falcon/command.rb +2 -2
  15. data/lib/falcon/configuration.rb +1 -1
  16. data/lib/falcon/endpoint.rb +3 -3
  17. data/lib/falcon/environment/application.rb +3 -3
  18. data/lib/falcon/environment/lets_encrypt_tls.rb +3 -3
  19. data/lib/falcon/environment/proxy.rb +5 -5
  20. data/lib/falcon/environment/rack.rb +3 -3
  21. data/lib/falcon/environment/rackup.rb +3 -3
  22. data/lib/falcon/environment/redirect.rb +2 -2
  23. data/lib/falcon/environment/self_signed_tls.rb +3 -3
  24. data/lib/falcon/environment/server.rb +4 -4
  25. data/lib/falcon/environment/supervisor.rb +3 -3
  26. data/lib/falcon/environment/tls.rb +2 -2
  27. data/lib/falcon/environment/virtual.rb +2 -2
  28. data/lib/falcon/middleware/proxy.rb +23 -20
  29. data/lib/falcon/middleware/redirect.rb +7 -5
  30. data/lib/falcon/middleware/validate.rb +26 -0
  31. data/lib/falcon/middleware/verbose.rb +7 -9
  32. data/lib/falcon/proxy_endpoint.rb +1 -1
  33. data/lib/falcon/rackup/handler.rb +5 -7
  34. data/lib/falcon/server.rb +16 -11
  35. data/lib/falcon/service/server.rb +3 -3
  36. data/lib/falcon/service/supervisor.rb +7 -7
  37. data/lib/falcon/service/virtual.rb +4 -4
  38. data/lib/falcon/version.rb +1 -1
  39. data/lib/rack/handler/falcon.rb +11 -5
  40. data/lib/rackup/handler/falcon.rb +10 -4
  41. data/license.md +4 -2
  42. data/readme.md +4 -0
  43. data/releases.md +4 -0
  44. data.tar.gz.sig +0 -0
  45. metadata +13 -15
  46. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7402cf048a80de8e1c357956b59f0f2838ac727a8982e08a6f55724b74bf77da
4
- data.tar.gz: 1e068e76060caf2dc6812e99a49e2559f6c2d0c36b9da6629fc43c25b434b6fd
3
+ metadata.gz: 8ef2381f9e160ea759eb3514031d4503c04f757b0678b5d7ad3342392a55bc5b
4
+ data.tar.gz: 688e89fbbf7b410fa3be7bb9d570e2d6047b750bae36237a17b6837766eefbd7
5
5
  SHA512:
6
- metadata.gz: 3e36ef9ebb0e04a9cd5fb7acf4f6a0e3c4347cafe24a87a5c4768f6a4ad5a18623419fbc87130fd60f3aa318a2c00a40e8b87ca4199087a7780274b08178d4a6
7
- data.tar.gz: d12353d67f5f3f5ffcb931496996cc6beab8f00fa1e5363a712829963426b52e7379a5084e1133cca498ee720824c59e698a8366cee4e21f2ceaed95a668d796
6
+ metadata.gz: 7d183d3ea35bebecc7df5c360c20cda41fcf1e6b126f287d4dd9387d8911d0a24ef7b20221945efa9acd7451d9e9b053bef326bd9a53a0e55756fc283d427402
7
+ data.tar.gz: d9261f7e20b4d95d6519e1c70a70c34f0f243207ea72bbe8b9d340414b00ba73542229cc5c5d2a0054cef624fa0f1ff413bbb3580a27d610cbf46587459c43b0
checksums.yaml.gz.sig CHANGED
Binary file
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2020-2023, by Samuel Williams.
4
+ # Copyright, 2020-2025, by Samuel Williams.
5
5
 
6
6
  def restart
7
- require_relative '../../lib/falcon/command/supervisor'
7
+ require_relative "../../lib/falcon/command/supervisor"
8
8
 
9
9
  Falcon::Command::Supervisor["restart"].call
10
10
  end
data/bin/falcon CHANGED
@@ -21,7 +21,7 @@
21
21
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
22
  # THE SOFTWARE.
23
23
 
24
- require_relative '../lib/falcon/command'
24
+ require_relative "../lib/falcon/command"
25
25
 
26
26
  begin
27
27
  Falcon::Command.call
data/bin/falcon-host CHANGED
@@ -21,7 +21,7 @@
21
21
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
22
  # THE SOFTWARE.
23
23
 
24
- require_relative '../lib/falcon/command/host'
24
+ require_relative "../lib/falcon/command/host"
25
25
 
26
26
  begin
27
27
  Falcon::Command::Host.call
@@ -3,11 +3,11 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2019-2024, by Samuel Williams.
5
5
 
6
- require_relative 'paths'
7
- require_relative '../version'
6
+ require_relative "paths"
7
+ require_relative "../version"
8
8
 
9
- require 'samovar'
10
- require 'async/service/controller'
9
+ require "samovar"
10
+ require "async/service/controller"
11
11
 
12
12
  module Falcon
13
13
  module Command
@@ -3,7 +3,7 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2020-2024, by Samuel Williams.
5
5
 
6
- require_relative '../configuration'
6
+ require_relative "../configuration"
7
7
 
8
8
  module Falcon
9
9
  module Command
@@ -3,10 +3,10 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2020-2024, by Samuel Williams.
5
5
 
6
- require_relative '../environment/proxy'
7
- require_relative 'paths'
6
+ require_relative "../environment/proxy"
7
+ require_relative "paths"
8
8
 
9
- require 'samovar'
9
+ require "samovar"
10
10
 
11
11
  module Falcon
12
12
  module Command
@@ -19,9 +19,9 @@ module Falcon
19
19
  # The command line options.
20
20
  # @attribute [Samovar::Options]
21
21
  options do
22
- option '--bind <address>', "Bind to the given hostname/address", default: "https://[::]:443"
22
+ option "--bind <address>", "Bind to the given hostname/address", default: "https://[::]:443"
23
23
 
24
- option '-t/--timeout <duration>', "Specify the maximum time to wait for non-blocking operations.", type: Float, default: nil
24
+ option "-t/--timeout <duration>", "Specify the maximum time to wait for non-blocking operations.", type: Float, default: nil
25
25
  end
26
26
 
27
27
  # One or more paths to the configuration files.
@@ -3,10 +3,10 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2020-2024, by Samuel Williams.
5
5
 
6
- require_relative '../environment/redirect'
7
- require_relative 'paths'
6
+ require_relative "../environment/redirect"
7
+ require_relative "paths"
8
8
 
9
- require 'samovar'
9
+ require "samovar"
10
10
 
11
11
  module Falcon
12
12
  module Command
@@ -16,10 +16,10 @@ module Falcon
16
16
  # The command line options.
17
17
  # @attribute [Samovar::Options]
18
18
  options do
19
- option '--bind <address>', "Bind to the given hostname/address", default: "http://[::]:80"
20
- option '--redirect <address>', "Redirect using this address as a template.", default: "https://[::]:443"
19
+ option "--bind <address>", "Bind to the given hostname/address", default: "http://[::]:80"
20
+ option "--redirect <address>", "Redirect using this address as a template.", default: "https://[::]:443"
21
21
 
22
- option '-t/--timeout <duration>', "Specify the maximum time to wait for non-blocking operations.", type: Float, default: nil
22
+ option "-t/--timeout <duration>", "Specify the maximum time to wait for non-blocking operations.", type: Float, default: nil
23
23
  end
24
24
 
25
25
  # One or more paths to the configuration files.
@@ -4,15 +4,15 @@
4
4
  # Copyright, 2018-2024, by Samuel Williams.
5
5
  # Copyright, 2018, by Mitsutaka Mimura.
6
6
 
7
- require_relative '../server'
8
- require_relative '../endpoint'
9
- require_relative '../configuration'
10
- require_relative '../service/server'
11
- require_relative '../environment/rackup'
7
+ require_relative "../server"
8
+ require_relative "../endpoint"
9
+ require_relative "../configuration"
10
+ require_relative "../service/server"
11
+ require_relative "../environment/rackup"
12
12
 
13
- require 'async/container'
14
- require 'async/http/client'
15
- require 'samovar'
13
+ require "async/container"
14
+ require "async/http/client"
15
+ require "samovar"
16
16
 
17
17
  module Falcon
18
18
  module Command
@@ -25,26 +25,26 @@ module Falcon
25
25
  # The command line options.
26
26
  # @attribute [Samovar::Options]
27
27
  options do
28
- option '-b/--bind <address>', "Bind to the given hostname/address.", default: "https://localhost:9292"
28
+ option "-b/--bind <address>", "Bind to the given hostname/address.", default: "https://localhost:9292"
29
29
 
30
- option '-p/--port <number>', "Override the specified port.", type: Integer
31
- option '-h/--hostname <hostname>', "Specify the hostname which would be used for certificates, etc."
32
- option '-t/--timeout <duration>', "Specify the maximum time to wait for non-blocking operations.", type: Float, default: nil
30
+ option "-p/--port <number>", "Override the specified port.", type: Integer
31
+ option "-h/--hostname <hostname>", "Specify the hostname which would be used for certificates, etc."
32
+ option "-t/--timeout <duration>", "Specify the maximum time to wait for non-blocking operations.", type: Float, default: nil
33
33
 
34
- option '-c/--config <path>', "Rackup configuration file to load.", default: 'config.ru'
35
- option '--preload <path>', "Preload the specified path before creating containers."
34
+ option "-c/--config <path>", "Rackup configuration file to load.", default: "config.ru"
35
+ option "--preload <path>", "Preload the specified path before creating containers."
36
36
 
37
- option '--cache', "Enable the response cache."
37
+ option "--cache", "Enable the response cache."
38
38
 
39
- option '--forked | --threaded | --hybrid', "Select a specific parallelism model.", key: :container, default: :forked
39
+ option "--forked | --threaded | --hybrid", "Select a specific parallelism model.", key: :container, default: :forked
40
40
 
41
- option '-n/--count <count>', "Number of instances to start.", default: Async::Container.processor_count, type: Integer
41
+ option "-n/--count <count>", "Number of instances to start.", default: Async::Container.processor_count, type: Integer
42
42
 
43
- option '--forks <count>', "Number of forks (hybrid only).", type: Integer
44
- option '--threads <count>', "Number of threads (hybrid only).", type: Integer
43
+ option "--forks <count>", "Number of forks (hybrid only).", type: Integer
44
+ option "--threads <count>", "Number of threads (hybrid only).", type: Integer
45
45
 
46
- option '--[no]-restart', "Enable/disable automatic restart.", default: true
47
- option '--graceful-stop <timeout>', "Duration to wait for graceful stop.", type: Float, default: 1.0
46
+ option "--[no]-restart", "Enable/disable automatic restart.", default: true
47
+ option "--graceful-stop <timeout>", "Duration to wait for graceful stop.", type: Float, default: 1.0
48
48
  end
49
49
 
50
50
  def container_options
@@ -3,12 +3,12 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2019-2024, by Samuel Williams.
5
5
 
6
- require 'samovar'
7
- require 'async'
8
- require 'json'
6
+ require "samovar"
7
+ require "async"
8
+ require "json"
9
9
 
10
- require 'io/endpoint/unix_endpoint'
11
- require 'io/stream'
10
+ require "io/endpoint/unix_endpoint"
11
+ require "io/stream"
12
12
 
13
13
  module Falcon
14
14
  module Command
@@ -30,7 +30,7 @@ module Falcon
30
30
 
31
31
  # Send the restart message to the supervisor.
32
32
  def call(stream)
33
- stream.puts({please: 'restart'}.to_json, separator: "\0")
33
+ stream.puts({please: "restart"}.to_json, separator: "\0")
34
34
  end
35
35
  end
36
36
 
@@ -40,7 +40,7 @@ module Falcon
40
40
 
41
41
  # Send the metrics message to the supervisor and print the results.
42
42
  def call(stream)
43
- stream.puts({please: 'metrics'}.to_json, separator: "\0", chomp: true)
43
+ stream.puts({please: "metrics"}.to_json, separator: "\0", chomp: true)
44
44
  response = JSON.parse(stream.read_until("\0"), symbolize_names: true)
45
45
 
46
46
  $stdout.puts response
@@ -51,9 +51,9 @@ module Falcon
51
51
  # @name nested
52
52
  # @attribute [Command]
53
53
  nested :command, {
54
- 'restart' => Restart,
55
- 'metrics' => Metrics,
56
- }, default: 'metrics'
54
+ "restart" => Restart,
55
+ "metrics" => Metrics,
56
+ }, default: "metrics"
57
57
 
58
58
  # The endpoint the supervisor is bound to.
59
59
  def endpoint
@@ -3,16 +3,16 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2020-2024, by Samuel Williams.
5
5
 
6
- require_relative 'serve'
7
- require_relative 'host'
8
- require_relative 'virtual'
9
- require_relative 'proxy'
10
- require_relative 'redirect'
11
- require_relative 'supervisor'
6
+ require_relative "serve"
7
+ require_relative "host"
8
+ require_relative "virtual"
9
+ require_relative "proxy"
10
+ require_relative "redirect"
11
+ require_relative "supervisor"
12
12
 
13
- require_relative '../version'
13
+ require_relative "../version"
14
14
 
15
- require 'samovar'
15
+ require "samovar"
16
16
 
17
17
  module Falcon
18
18
  module Command
@@ -23,23 +23,23 @@ module Falcon
23
23
  # The command line options.
24
24
  # @attribute [Samovar::Options]
25
25
  options do
26
- option '--verbose | --quiet', "Verbosity of output for debugging.", key: :logging
27
- option '-h/--help', "Print out help information."
28
- option '-v/--version', "Print out the application version."
29
- option '-e/--encoding', "Specify the default external encoding of the server.", default: "UTF-8"
26
+ option "--verbose | --quiet", "Verbosity of output for debugging.", key: :logging
27
+ option "-h/--help", "Print out help information."
28
+ option "-v/--version", "Print out the application version."
29
+ option "-e/--encoding", "Specify the default external encoding of the server.", default: "UTF-8"
30
30
  end
31
31
 
32
32
  # The nested command to execute.
33
33
  # @name nested
34
34
  # @attribute [Command]
35
35
  nested :command, {
36
- 'serve' => Serve,
37
- 'host' => Host,
38
- 'virtual' => Virtual,
39
- 'proxy' => Proxy,
40
- 'redirect' => Redirect,
41
- 'supervisor' => Supervisor,
42
- }, default: 'serve'
36
+ "serve" => Serve,
37
+ "host" => Host,
38
+ "virtual" => Virtual,
39
+ "proxy" => Proxy,
40
+ "redirect" => Redirect,
41
+ "supervisor" => Supervisor,
42
+ }, default: "serve"
43
43
 
44
44
  # Whether verbose logging is enabled.
45
45
  # @returns [Boolean]
@@ -3,11 +3,11 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2018-2024, by Samuel Williams.
5
5
 
6
- require 'async/service'
6
+ require "async/service"
7
7
 
8
- require_relative '../environment/virtual'
8
+ require_relative "../environment/virtual"
9
9
 
10
- require 'samovar'
10
+ require "samovar"
11
11
 
12
12
  module Falcon
13
13
  module Command
@@ -20,10 +20,10 @@ module Falcon
20
20
  # The command line options.
21
21
  # @attribute [Samovar::Options]
22
22
  options do
23
- option '--bind-insecure <address>', "Bind redirection to the given hostname/address", default: "http://[::]:80"
24
- option '--bind-secure <address>', "Bind proxy to the given hostname/address", default: "https://[::]:443"
23
+ option "--bind-insecure <address>", "Bind redirection to the given hostname/address", default: "http://[::]:80"
24
+ option "--bind-secure <address>", "Bind proxy to the given hostname/address", default: "https://[::]:443"
25
25
 
26
- option '-t/--timeout <duration>', "Specify the maximum time to wait for non-blocking operations.", type: Float, default: 30
26
+ option "-t/--timeout <duration>", "Specify the maximum time to wait for non-blocking operations.", type: Float, default: 30
27
27
  end
28
28
 
29
29
  # One or more paths to the configuration files.
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2017-2023, by Samuel Williams.
4
+ # Copyright, 2017-2025, by Samuel Williams.
5
5
  # Copyright, 2018, by Mitsutaka Mimura.
6
6
 
7
- require_relative 'command/top'
7
+ require_relative "command/top"
8
8
 
9
9
  module Falcon
10
10
  module Command
@@ -4,7 +4,7 @@
4
4
  # Copyright, 2019-2024, by Samuel Williams.
5
5
  # Copyright, 2019, by Sho Ito.
6
6
 
7
- require 'async/service'
7
+ require "async/service"
8
8
 
9
9
  module Falcon
10
10
  # Manages environments which describes how to host a specific application.
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2018-2023, by Samuel Williams.
4
+ # Copyright, 2018-2025, by Samuel Williams.
5
5
 
6
- require 'async/http/endpoint'
7
- require 'localhost/authority'
6
+ require "async/http/endpoint"
7
+ require "localhost/authority"
8
8
 
9
9
  module Falcon
10
10
  # An HTTP-specific endpoint which adds localhost TLS.
@@ -4,8 +4,8 @@
4
4
  # Copyright, 2019-2024, by Samuel Williams.
5
5
  # Copyright, 2020, by Daniel Evans.
6
6
 
7
- require_relative 'server'
8
- require_relative '../proxy_endpoint'
7
+ require_relative "server"
8
+ require_relative "../proxy_endpoint"
9
9
 
10
10
  module Falcon
11
11
  module Environment
@@ -22,7 +22,7 @@ module Falcon
22
22
  # The scheme to use to communicate with the application.
23
23
  # @returns [String]
24
24
  def scheme
25
- 'https'
25
+ "https"
26
26
  end
27
27
 
28
28
  # The protocol to use to communicate with the application.
@@ -3,8 +3,8 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2020-2024, by Samuel Williams.
5
5
 
6
- require_relative 'tls'
7
- require_relative '../environment'
6
+ require_relative "tls"
7
+ require_relative "../environment"
8
8
 
9
9
  module Falcon
10
10
  module Environment
@@ -13,7 +13,7 @@ module Falcon
13
13
  # The Lets Encrypt certificate store path.
14
14
  # @parameter [String]
15
15
  def lets_encrypt_root
16
- '/etc/letsencrypt/live'
16
+ "/etc/letsencrypt/live"
17
17
  end
18
18
 
19
19
  # The public certificate path.
@@ -3,10 +3,10 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2020-2024, by Samuel Williams.
5
5
 
6
- require_relative 'server'
7
- require_relative '../tls'
8
- require_relative '../middleware/proxy'
9
- require_relative '../environment'
6
+ require_relative "server"
7
+ require_relative "../tls"
8
+ require_relative "../middleware/proxy"
9
+ require_relative "../environment"
10
10
 
11
11
  module Falcon
12
12
  module Environment
@@ -43,7 +43,7 @@ module Falcon
43
43
  Console.info(self) {"Proxying #{self.url} to #{evaluator.authority} using #{evaluator.endpoint}"}
44
44
  hosts[evaluator.authority] = evaluator
45
45
 
46
- if RUBY_VERSION < '3.1'
46
+ if RUBY_VERSION < "3.1"
47
47
  # Ensure the SSL context is set up before forking - it's buggy on Ruby < 3.1:
48
48
  evaluator.ssl_context
49
49
  end
@@ -3,9 +3,9 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2024, by Samuel Williams.
5
5
 
6
- require_relative 'application'
7
- require_relative 'rackup'
8
- require_relative '../environment'
6
+ require_relative "application"
7
+ require_relative "rackup"
8
+ require_relative "../environment"
9
9
 
10
10
  module Falcon
11
11
  module Environment
@@ -3,15 +3,15 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2020-2024, by Samuel Williams.
5
5
 
6
- require 'rack/builder'
7
- require_relative '../server'
6
+ require "rack/builder"
7
+ require_relative "../server"
8
8
 
9
9
  module Falcon
10
10
  module Environment
11
11
  # Provides an environment for hosting loading a Rackup `config.ru` file.
12
12
  module Rackup
13
13
  def rackup_path
14
- File.expand_path('config.ru', root)
14
+ File.expand_path("config.ru", root)
15
15
  end
16
16
 
17
17
  def rack_app
@@ -3,8 +3,8 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2020-2024, by Samuel Williams.
5
5
 
6
- require_relative 'server'
7
- require_relative '../middleware/redirect'
6
+ require_relative "server"
7
+ require_relative "../middleware/redirect"
8
8
 
9
9
  module Falcon
10
10
  module Environment
@@ -3,9 +3,9 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2019-2024, by Samuel Williams.
5
5
 
6
- require 'localhost/authority'
7
- require_relative 'tls'
8
- require_relative '../environment'
6
+ require "localhost/authority"
7
+ require_relative "tls"
8
+ require_relative "../environment"
9
9
 
10
10
  module Falcon
11
11
  module Environment
@@ -3,11 +3,11 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2020-2024, by Samuel Williams.
5
5
 
6
- require 'async/service/generic'
7
- require 'async/http/endpoint'
6
+ require "async/service/generic"
7
+ require "async/http/endpoint"
8
8
 
9
- require_relative '../service/server'
10
- require_relative '../server'
9
+ require_relative "../service/server"
10
+ require_relative "../server"
11
11
 
12
12
  module Falcon
13
13
  module Environment
@@ -3,10 +3,10 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2019-2024, by Samuel Williams.
5
5
 
6
- require_relative '../service/supervisor'
7
- require_relative '../environment'
6
+ require_relative "../service/supervisor"
7
+ require_relative "../environment"
8
8
 
9
- require 'io/endpoint/unix_endpoint'
9
+ require "io/endpoint/unix_endpoint"
10
10
 
11
11
  module Falcon
12
12
  module Environment
@@ -3,8 +3,8 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2019-2024, by Samuel Williams.
5
5
 
6
- require_relative '../tls'
7
- require_relative '../environment'
6
+ require_relative "../tls"
7
+ require_relative "../environment"
8
8
 
9
9
  module Falcon
10
10
  module Environment
@@ -3,9 +3,9 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2024, by Samuel Williams.
5
5
 
6
- require_relative 'configured'
6
+ require_relative "configured"
7
7
 
8
- require_relative '../service/virtual'
8
+ require_relative "../service/virtual"
9
9
 
10
10
  module Falcon
11
11
  module Environment
@@ -3,12 +3,12 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2018-2024, by Samuel Williams.
5
5
 
6
- require 'async/http/client'
7
- require 'protocol/http/headers'
8
- require 'protocol/http/middleware'
6
+ require "async/http/client"
7
+ require "protocol/http/headers"
8
+ require "protocol/http/middleware"
9
9
 
10
- require 'console/event/failure'
11
- require 'traces/provider'
10
+ require "console/event/failure"
11
+ require "traces/provider"
12
12
 
13
13
  module Falcon
14
14
  module Middleware
@@ -25,21 +25,21 @@ module Falcon
25
25
  # A HTTP middleware for proxying requests to a given set of hosts.
26
26
  # Typically used for implementing virtual servers.
27
27
  class Proxy < Protocol::HTTP::Middleware
28
- FORWARDED = 'forwarded'
29
- X_FORWARDED_FOR = 'x-forwarded-for'
30
- X_FORWARDED_PROTO = 'x-forwarded-proto'
28
+ FORWARDED = "forwarded"
29
+ X_FORWARDED_FOR = "x-forwarded-for"
30
+ X_FORWARDED_PROTO = "x-forwarded-proto"
31
31
 
32
- VIA = 'via'
33
- CONNECTION = 'connection'
32
+ VIA = "via"
33
+ CONNECTION = "connection"
34
34
 
35
35
  # HTTP hop headers which *should* not be passed through the proxy.
36
36
  HOP_HEADERS = [
37
- 'connection',
38
- 'keep-alive',
39
- 'public',
40
- 'proxy-authenticate',
41
- 'transfer-encoding',
42
- 'upgrade',
37
+ "connection",
38
+ "keep-alive",
39
+ "public",
40
+ "proxy-authenticate",
41
+ "transfer-encoding",
42
+ "upgrade",
43
43
  ]
44
44
 
45
45
  # Initialize the proxy middleware.
@@ -78,7 +78,7 @@ module Falcon
78
78
  # @returns [Service::Proxy]
79
79
  def lookup(request)
80
80
  # Trailing dot and port is ignored/normalized.
81
- if authority = request.authority&.sub(/(\.)?(:\d+)?$/, '')
81
+ if authority = request.authority&.sub(/(\.)?(:\d+)?$/, "")
82
82
  return @hosts[authority]
83
83
  end
84
84
  end
@@ -119,7 +119,7 @@ module Falcon
119
119
  end
120
120
 
121
121
  unless forwarded.empty?
122
- request.headers.add(FORWARDED, forwarded.join(';'))
122
+ request.headers.add(FORWARDED, forwarded.join(";"))
123
123
  end
124
124
 
125
125
  request.headers.add(VIA, "#{request.version} #{self.class}")
@@ -145,16 +145,19 @@ module Falcon
145
145
  end
146
146
  rescue => error
147
147
  Console::Event::Failure.for(error).emit(self)
148
- return Protocol::HTTP::Response[502, {'content-type' => 'text/plain'}, [error.class.name]]
148
+ return Protocol::HTTP::Response[502, {"content-type" => "text/plain"}, [error.class.name]]
149
149
  end
150
150
 
151
151
  Traces::Provider(self) do
152
152
  def call(request)
153
153
  attributes = {
154
154
  "authority" => request.authority,
155
+ "method" => request.method,
156
+ "path" => request.path,
157
+ "version" => request.version,
155
158
  }
156
159
 
157
- Traces.trace('falcon.middleware.proxy.call', attributes: attributes) do
160
+ Traces.trace("falcon.middleware.proxy.call", attributes: attributes) do
158
161
  super
159
162
  end
160
163
  end
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2018-2023, by Samuel Williams.
4
+ # Copyright, 2018-2024, by Samuel Williams.
5
5
 
6
- require 'async/http/client'
6
+ require "async/http/client"
7
7
 
8
8
  module Falcon
9
9
  module Middleware
@@ -35,7 +35,7 @@ module Falcon
35
35
  # @parameter request [Protocol::HTTP::Request]
36
36
  def lookup(request)
37
37
  # Trailing dot and port is ignored/normalized.
38
- if authority = request.authority&.sub(/(\.)?(:\d+)?$/, '')
38
+ if authority = request.authority&.sub(/(\.)?(:\d+)?$/, "")
39
39
  return @hosts[authority]
40
40
  end
41
41
  end
@@ -50,7 +50,9 @@ module Falcon
50
50
  location = "#{@endpoint.scheme}://#{host.authority}:#{@endpoint.port}#{request.path}"
51
51
  end
52
52
 
53
- return Protocol::HTTP::Response[301, [['location', location]], []]
53
+ Console.info(self, "Redirecting incoming request...", request: request, location: location)
54
+
55
+ return Protocol::HTTP::Response[301, [["location", location]], []]
54
56
  else
55
57
  super
56
58
  end
@@ -58,7 +60,7 @@ module Falcon
58
60
 
59
61
  Traces::Provider(self) do
60
62
  def call(request)
61
- Traces.trace('falcon.middleware.redirect.call', attributes: {authority: request.authority}) do
63
+ Traces.trace("falcon.middleware.redirect.call", attributes: {authority: request.authority}) do
62
64
  super
63
65
  end
64
66
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Released under the MIT License.
4
+ # Copyright, 2025, by Samuel Williams.
5
+
6
+ module Falcon
7
+ module Middleware
8
+ # A HTTP middleware for validating incoming requests.
9
+ class Validate < Protocol::HTTP::Middleware
10
+ # Initialize the validate middleware.
11
+ # @parameter app [Protocol::HTTP::Middleware] The middleware to wrap.
12
+ def initialize(app)
13
+ super(app)
14
+ end
15
+
16
+ # Validate the incoming request.
17
+ def call(request)
18
+ unless request.path.start_with?("/")
19
+ return Protocol::HTTP::Response[400, {}, ["Invalid request path!"]]
20
+ end
21
+
22
+ return super
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2018-2023, by Samuel Williams.
4
+ # Copyright, 2018-2025, by Samuel Williams.
5
5
 
6
- require 'console'
7
- require 'async/http/statistics'
6
+ require "console"
7
+ require "async/http/statistics"
8
8
 
9
9
  module Falcon
10
10
  module Middleware
@@ -13,7 +13,7 @@ module Falcon
13
13
  # Initialize the verbose middleware.
14
14
  # @parameter app [Protocol::HTTP::Middleware] The middleware to wrap.
15
15
  # @parameter logger [Console::Logger] The logger to use.
16
- def initialize(app, logger = Console.logger)
16
+ def initialize(app, logger = Console)
17
17
  super(app)
18
18
 
19
19
  @logger = logger
@@ -24,7 +24,7 @@ module Falcon
24
24
  task = Async::Task.current
25
25
  address = request.remote_address
26
26
 
27
- @logger.info(request) {"Headers: #{request.headers.to_h} from #{address.inspect}"}
27
+ @logger.info(request, "-> #{request.method} #{request.path}", headers: request.headers.to_h, address: address.inspect)
28
28
 
29
29
  task.annotate("#{request.method} #{request.path} from #{address.inspect}")
30
30
  end
@@ -37,10 +37,8 @@ module Falcon
37
37
 
38
38
  response = super
39
39
 
40
- statistics.wrap(response) do |statistics, error|
41
- @logger.info(request) {"Responding with: #{response.status} #{response.headers.to_h}; #{statistics.inspect}"}
42
-
43
- @logger.error(request) {"#{error.class}: #{error.message}"} if error
40
+ statistics.wrap(response) do |body, error|
41
+ @logger.info(request, "<- #{request.method} #{request.path}", headers: response.headers.to_h, status: response.status, body: body.inspect, error: error)
44
42
  end
45
43
 
46
44
  return response
@@ -3,7 +3,7 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2019-2024, by Samuel Williams.
5
5
 
6
- require 'io/endpoint/unix_endpoint'
6
+ require "io/endpoint/unix_endpoint"
7
7
 
8
8
  module Falcon
9
9
  # An endpoint suitable for proxing requests, typically via a unix pipe.
@@ -1,14 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2024, by Samuel Williams.
4
+ # Copyright, 2024-2025, by Samuel Williams.
5
5
 
6
- require 'rackup/handler'
6
+ require_relative "../../falcon"
7
7
 
8
- require_relative '../../falcon'
9
-
10
- require 'kernel/sync'
11
- require 'io/endpoint/host_endpoint'
8
+ require "kernel/sync"
9
+ require "io/endpoint/host_endpoint"
12
10
 
13
11
  module Falcon
14
12
  module Rackup
@@ -25,7 +23,7 @@ module Falcon
25
23
  # Generate an endpoint for the given `rackup` options.
26
24
  # @returns [::IO::Endpoint::HostEndpoint]
27
25
  def self.endpoint_for(**options)
28
- host = options[:Host] || 'localhost'
26
+ host = options[:Host] || "localhost"
29
27
  port = Integer(options[:Port] || 9292)
30
28
 
31
29
  return ::IO::Endpoint.tcp(host, port)
data/lib/falcon/server.rb CHANGED
@@ -1,38 +1,43 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2017-2023, by Samuel Williams.
4
+ # Copyright, 2017-2025, by Samuel Williams.
5
5
 
6
- require 'async/http/server'
6
+ require "async/http/server"
7
7
 
8
- require 'protocol/http/middleware/builder'
9
- require 'protocol/http/content_encoding'
8
+ require "protocol/http/middleware/builder"
9
+ require "protocol/http/content_encoding"
10
10
 
11
- require 'async/http/cache'
12
-
13
- require_relative 'middleware/verbose'
14
- require 'protocol/rack'
11
+ require "async/http/cache"
12
+ require_relative "middleware/verbose"
13
+ require_relative "middleware/validate"
14
+ require "protocol/rack"
15
15
 
16
16
  module Falcon
17
17
  # A server listening on a specific endpoint, hosting a specific middleware.
18
18
  class Server < Async::HTTP::Server
19
19
  # Wrap a rack application into a middleware suitable the server.
20
20
  # @parameter rack_app [Proc | Object] A rack application/middleware.
21
- # @parameter verbose [Boolean] Whether to add the {Verbose} middleware.
21
+ # @parameter validate [Boolean] Whether to add the {Middleware::Validate} middleware.
22
+ # @parameter verbose [Boolean] Whether to add the {Middleware::Verbose} middleware.
22
23
  # @parameter cache [Boolean] Whether to add the {Async::HTTP::Cache} middleware.
23
- def self.middleware(rack_app, verbose: false, cache: true)
24
+ def self.middleware(rack_app, verbose: false, validate: true, cache: true)
24
25
  ::Protocol::HTTP::Middleware.build do
25
26
  if verbose
26
27
  use Middleware::Verbose
27
28
  end
28
29
 
30
+ if validate
31
+ use Middleware::Validate
32
+ end
33
+
29
34
  if cache
30
35
  use Async::HTTP::Cache::General
31
36
  end
32
37
 
33
38
  use ::Protocol::HTTP::ContentEncoding
34
- use ::Protocol::Rack::Adapter
35
39
 
40
+ use ::Protocol::Rack::Adapter
36
41
  run rack_app
37
42
  end
38
43
  end
@@ -4,10 +4,10 @@
4
4
  # Copyright, 2019-2024, by Samuel Williams.
5
5
  # Copyright, 2020, by Daniel Evans.
6
6
 
7
- require 'async/service/generic'
8
- require 'async/http/endpoint'
7
+ require "async/service/generic"
8
+ require "async/http/endpoint"
9
9
 
10
- require_relative '../server'
10
+ require_relative "../server"
11
11
 
12
12
  module Falcon
13
13
  module Service
@@ -3,13 +3,13 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2019-2024, by Samuel Williams.
5
5
 
6
- require 'process/metrics'
7
- require 'json'
6
+ require "process/metrics"
7
+ require "json"
8
8
 
9
- require 'async/service/generic'
9
+ require "async/service/generic"
10
10
 
11
- require 'io/endpoint/bound_endpoint'
12
- require 'io/stream'
11
+ require "io/endpoint/bound_endpoint"
12
+ require "io/stream"
13
13
 
14
14
  module Falcon
15
15
  module Service
@@ -50,9 +50,9 @@ module Falcon
50
50
  # @parameter message [Hash] The decoded message.
51
51
  def handle(message)
52
52
  case message[:please]
53
- when 'restart'
53
+ when "restart"
54
54
  self.do_restart(message)
55
- when 'metrics'
55
+ when "metrics"
56
56
  self.do_metrics(message)
57
57
  end
58
58
  end
@@ -3,7 +3,7 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2020-2024, by Samuel Williams.
5
5
 
6
- require 'async/service/generic'
6
+ require "async/service/generic"
7
7
 
8
8
  module Falcon
9
9
  module Service
@@ -18,14 +18,14 @@ module Falcon
18
18
  def assume_privileges(path)
19
19
  # Process.exec / Process.spawn don't replace the environment but instead update it, so we need to clear out any existing BUNDLE_ variables using `nil` values, which will cause them to be removed from the child environment:
20
20
  env = ENV.to_h do |key, value|
21
- if key.start_with?('BUNDLE_')
21
+ if key.start_with?("BUNDLE_")
22
22
  [key, nil]
23
23
  else
24
24
  [key, value]
25
25
  end
26
26
  end
27
27
 
28
- env['PWD'] = File.dirname(path)
28
+ env["PWD"] = File.dirname(path)
29
29
 
30
30
  stat = File.stat(path)
31
31
 
@@ -33,7 +33,7 @@ module Falcon
33
33
  Process::UID.change_privilege(stat.uid)
34
34
 
35
35
  home = Etc.getpwuid(stat.uid).dir
36
- env['HOME'] = home
36
+ env["HOME"] = home
37
37
 
38
38
  return env
39
39
  end
@@ -4,5 +4,5 @@
4
4
  # Copyright, 2017-2024, by Samuel Williams.
5
5
 
6
6
  module Falcon
7
- VERSION = "0.48.3"
7
+ VERSION = "0.48.5"
8
8
  end
@@ -1,16 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2017-2024, by Samuel Williams.
4
+ # Copyright, 2017-2025, by Samuel Williams.
5
5
  # Copyright, 2019, by Bryan Powell.
6
6
 
7
- require 'rack/handler'
7
+ require "rack/handler"
8
8
 
9
- require_relative '../../falcon/rackup/handler'
9
+ require_relative "../../falcon/rackup/handler"
10
+
11
+ # Generally speaking, you should not require this file directly, or assume the existance of the `Rack::Handler::Falcon` constant. Instead, use `Rack::Handler.get(:falcon)` to load and access the handler.
10
12
 
11
13
  module Rack
12
14
  module Handler
13
- Falcon = ::Falcon::Rackup::Handler
14
- register :falcon, Falcon
15
+ # Rack (v2) expects the constant to be in the `Rack::Handler` namespace, so we define a new handler class in the `Rack::Handler` namespace that inherits from `Falcon::Rackup::Handler`.
16
+ class Falcon < ::Falcon::Rackup::Handler
17
+ end
18
+
19
+ # Rack (v2) expects a string for the handler constant name. `Falcon.to_s` returns a more human friendly name, so we explicitly pass `Falcon.name` to `register` to ensure Rack can find the handler using the registered name.
20
+ register :falcon, Falcon.name
15
21
  end
16
22
  end
@@ -1,15 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2023-2024, by Samuel Williams.
4
+ # Copyright, 2023-2025, by Samuel Williams.
5
5
 
6
- require 'rackup/handler'
6
+ require "rackup/handler"
7
7
 
8
- require_relative '../../falcon/rackup/handler'
8
+ require_relative "../../falcon/rackup/handler"
9
+
10
+ # Generally speaking, you should not require this file directly, or assume the existance of the `Rackup::Handler::Falcon` constant. Instead, use `Rackup::Handler.get(:falcon)` to load and access the handler.
9
11
 
10
12
  module Rackup
11
13
  module Handler
12
- Falcon = ::Falcon::Rackup::Handler
14
+ # Sinatra (and possibly others) try to extract the name using the final part of the class path, so we define a new class in the `Rack::Handler` namespace that inherits from `Falcon::Rackup::Handler`, that follows that convention.
15
+ class Falcon < ::Falcon::Rackup::Handler
16
+ end
17
+
18
+ # Rack (v3) expects a class for the handler constant, so we explicitly pass `Falcon` to `register` to ensure Rack can find the handler using the registered name.
13
19
  register :falcon, Falcon
14
20
  end
15
21
  end
data/license.md CHANGED
@@ -1,16 +1,18 @@
1
1
  # MIT License
2
2
 
3
- Copyright, 2017-2024, by Samuel Williams.
3
+ Copyright, 2017-2025, by Samuel Williams.
4
4
  Copyright, 2018, by Kent Gruber.
5
5
  Copyright, 2018, by Janko Marohnić.
6
6
  Copyright, 2018, by Tad Thorley.
7
7
  Copyright, 2018, by Mitsutaka Mimura.
8
8
  Copyright, 2018, by Kyle Tam.
9
9
  Copyright, 2018, by Claudiu Garba.
10
+ Copyright, 2018, by Martin Hrdlicka.
10
11
  Copyright, 2019, by Bryan Powell.
11
12
  Copyright, 2019, by Sh Lin.
12
13
  Copyright, 2019, by Sho Ito.
13
14
  Copyright, 2019, by Colby Swandale.
15
+ Copyright, 2019-2024, by dependabot[bot].
14
16
  Copyright, 2020, by Daniel Evans.
15
17
  Copyright, 2020, by Mikel Kew.
16
18
  Copyright, 2020, by Michael Adams.
@@ -20,9 +22,9 @@ Copyright, 2023, by Nick Janetakis.
20
22
  Copyright, 2024, by Peter Schrammel.
21
23
  Copyright, 2024, by Santiago Bartesaghi.
22
24
  Copyright, 2024, by Trevor Turk.
23
- Copyright, 2024, by dependabot[bot].
24
25
  Copyright, 2024, by Adam Daniels.
25
26
  Copyright, 2024, by Stefan Buhrmester.
27
+ Copyright, 2024, by Ismael Celis.
26
28
 
27
29
  Permission is hereby granted, free of charge, to any person obtaining a copy
28
30
  of this software and associated documentation files (the "Software"), to deal
data/readme.md CHANGED
@@ -45,6 +45,10 @@ Please see the [project documentation](https://socketry.github.io/falcon/) for m
45
45
 
46
46
  Please see the [project releases](https://socketry.github.io/falcon/releases/index) for all releases.
47
47
 
48
+ ### v0.48.4
49
+
50
+ - Improve compatibility of rackup handler w.r.t. sinatra.
51
+
48
52
  ### v0.47.8
49
53
 
50
54
  - Fix Falcon Supervisor implementation: due to invalid code, it was unable to start.
data/releases.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Releases
2
2
 
3
+ ## v0.48.4
4
+
5
+ - Improve compatibility of rackup handler w.r.t. sinatra.
6
+
3
7
  ## v0.47.8
4
8
 
5
9
  - Fix Falcon Supervisor implementation: due to invalid code, it was unable to start.
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,10 +1,11 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: falcon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.48.3
4
+ version: 0.48.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
+ - dependabot[bot]
8
9
  - Janko Marohnić
9
10
  - Bryan Powell
10
11
  - Trevor Turk
@@ -16,7 +17,9 @@ authors:
16
17
  - Adam Daniels
17
18
  - Colby Swandale
18
19
  - Daniel Evans
20
+ - Ismael Celis
19
21
  - Kent Gruber
22
+ - Martin Hrdlicka
20
23
  - Michael Adams
21
24
  - Mikel Kew
22
25
  - Nick Janetakis
@@ -26,8 +29,6 @@ authors:
26
29
  - Stefan Buhrmester
27
30
  - Tad Thorley
28
31
  - Tasos Latsas
29
- - dependabot[bot]
30
- autorequire:
31
32
  bindir: bin
32
33
  cert_chain:
33
34
  - |
@@ -59,7 +60,7 @@ cert_chain:
59
60
  Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
60
61
  voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
61
62
  -----END CERTIFICATE-----
62
- date: 2024-10-15 00:00:00.000000000 Z
63
+ date: 2025-01-28 00:00:00.000000000 Z
63
64
  dependencies:
64
65
  - !ruby/object:Gem::Dependency
65
66
  name: async
@@ -174,33 +175,33 @@ dependencies:
174
175
  - !ruby/object:Gem::Version
175
176
  version: '3.0'
176
177
  - !ruby/object:Gem::Dependency
177
- name: protocol-http
178
+ name: process-metrics
178
179
  requirement: !ruby/object:Gem::Requirement
179
180
  requirements:
180
181
  - - "~>"
181
182
  - !ruby/object:Gem::Version
182
- version: '0.31'
183
+ version: '0.2'
183
184
  type: :runtime
184
185
  prerelease: false
185
186
  version_requirements: !ruby/object:Gem::Requirement
186
187
  requirements:
187
188
  - - "~>"
188
189
  - !ruby/object:Gem::Version
189
- version: '0.31'
190
+ version: '0.2'
190
191
  - !ruby/object:Gem::Dependency
191
- name: process-metrics
192
+ name: protocol-http
192
193
  requirement: !ruby/object:Gem::Requirement
193
194
  requirements:
194
195
  - - "~>"
195
196
  - !ruby/object:Gem::Version
196
- version: '0.2'
197
+ version: '0.31'
197
198
  type: :runtime
198
199
  prerelease: false
199
200
  version_requirements: !ruby/object:Gem::Requirement
200
201
  requirements:
201
202
  - - "~>"
202
203
  - !ruby/object:Gem::Version
203
- version: '0.2'
204
+ version: '0.31'
204
205
  - !ruby/object:Gem::Dependency
205
206
  name: protocol-rack
206
207
  requirement: !ruby/object:Gem::Requirement
@@ -229,8 +230,6 @@ dependencies:
229
230
  - - "~>"
230
231
  - !ruby/object:Gem::Version
231
232
  version: '2.3'
232
- description:
233
- email:
234
233
  executables:
235
234
  - falcon
236
235
  - falcon-host
@@ -268,6 +267,7 @@ files:
268
267
  - lib/falcon/environment/virtual.rb
269
268
  - lib/falcon/middleware/proxy.rb
270
269
  - lib/falcon/middleware/redirect.rb
270
+ - lib/falcon/middleware/validate.rb
271
271
  - lib/falcon/middleware/verbose.rb
272
272
  - lib/falcon/proxy_endpoint.rb
273
273
  - lib/falcon/rackup/handler.rb
@@ -289,7 +289,6 @@ licenses:
289
289
  metadata:
290
290
  documentation_uri: https://socketry.github.io/falcon/
291
291
  source_code_uri: https://github.com/socketry/falcon.git
292
- post_install_message:
293
292
  rdoc_options: []
294
293
  require_paths:
295
294
  - lib
@@ -304,8 +303,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
304
303
  - !ruby/object:Gem::Version
305
304
  version: '0'
306
305
  requirements: []
307
- rubygems_version: 3.5.11
308
- signing_key:
306
+ rubygems_version: 3.6.2
309
307
  specification_version: 4
310
308
  summary: A fast, asynchronous, rack-compatible web server.
311
309
  test_files: []
metadata.gz.sig CHANGED
Binary file