lib/falcon/hosts.rb in falcon-0.31.0 vs lib/falcon/hosts.rb in falcon-0.32.0
- old
+ new
@@ -67,36 +67,40 @@
Process::GID.change_privilege(stat.gid)
Process::UID.change_privilege(stat.uid)
end
+ def spawn(container)
+ container.spawn(name: self.name, restart: true) do |instance|
+ path = File.join(self.root, "falcon.rb")
+
+ assume_privileges(path)
+
+ instance.exec("bundle", "exec", path)
+ end
+ end
+
def run(container)
if @environment.include?(:server)
bound_endpoint = self.bound_endpoint
- container.run(count: 1, name: self.name) do |task, instance|
+ container.run(name: self.name, restart: true) do |task, instance|
Async.logger.info(self) {"Starting application server..."}
- if root = self.root
- Dir.chdir(root)
- end
-
server = @evaluator.server
- # Drop root privileges:
- assume_privileges(root)
-
server.run
task.children.each(&:wait)
end
end
end
end
class Hosts
DEFAULT_ALPN_PROTOCOLS = ['h2', 'http/1.1'].freeze
+ SERVER_CIPHERS = "EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5".freeze
def initialize(configuration)
@named = {}
@server_context = nil
@server_endpoint = nil
@@ -124,12 +128,16 @@
self.host_context(socket, hostname)
end
context.session_id_context = "falcon"
context.alpn_protocols = DEFAULT_ALPN_PROTOCOLS
- context.set_params
+ context.set_params(
+ ciphers: SERVER_CIPHERS,
+ verify_mode: OpenSSL::SSL::VERIFY_NONE,
+ )
+
context.setup
end
end
def host_context(socket, hostname)
@@ -158,27 +166,34 @@
Redirection.new(Falcon::BadRequest, @named, secure_endpoint)
end
def run(container = Async::Container::Forked.new, **options)
@named.each do |name, host|
- host.run(container)
+ host.spawn(container)
end
secure_endpoint = Async::HTTP::Endpoint.parse(options[:bind_secure], ssl_context: self.ssl_context)
insecure_endpoint = Async::HTTP::Endpoint.parse(options[:bind_insecure])
- container.run(count: 1, name: "Falcon Proxy") do |task, instance|
+ secure_endpoint_bound = insecure_endpoint_bound = nil
+
+ Async::Reactor.run do
+ secure_endpoint_bound = Async::IO::SharedEndpoint.bound(secure_endpoint)
+ insecure_endpoint_bound = Async::IO::SharedEndpoint.bound(insecure_endpoint)
+ end.wait
+
+ container.run(name: "Falcon Proxy", restart: true) do |task, instance|
proxy = self.proxy
- proxy_server = Falcon::Server.new(proxy, secure_endpoint)
+ proxy_server = Falcon::Server.new(proxy, secure_endpoint_bound, secure_endpoint.protocol, secure_endpoint.scheme)
proxy_server.run
end
- container.run(count: 1, name: "Falcon Redirector") do |task, instance|
+ container.run(name: "Falcon Redirector", restart: true) do |task, instance|
redirection = self.redirection(secure_endpoint)
- redirection_server = Falcon::Server.new(redirection, insecure_endpoint)
+ redirection_server = Falcon::Server.new(redirection, insecure_endpoint_bound, insecure_endpoint.protocol, insecure_endpoint.scheme)
redirection_server.run
end
return container