GithubHelp home page GithubHelp logo

socketry / falcon Goto Github PK

View Code? Open in Web Editor NEW
2.5K 48.0 77.0 2.32 MB

A high-performance web server for Ruby, supporting HTTP/1, HTTP/2 and TLS.

Home Page: https://socketry.github.io/falcon/

License: MIT License

Ruby 100.00%
ruby server http-server async falcon async-http asynchronous concurrent

falcon's Introduction

Falcon

Falcon is a multi-process, multi-fiber rack-compatible HTTP server built on top of async, async-io, async-container and async-http. Each request is executed within a lightweight fiber and can block on up-stream requests without stalling the entire server process. Falcon supports HTTP/1 and HTTP/2 natively.

Development Status

Motivation

Initially, when I developed async, I saw an opportunity to implement async-http: providing both client and server components. After experimenting with these ideas, I decided to build an actual web server for comparing and validating performance primarily out of interest. Falcon grew out of those experiments and permitted the ability to test existing real-world code on top of async.

Once I had something working, I saw an opportunity to simplify my development, testing and production environments, replacing production (Nginx+Passenger) and development (Puma) with Falcon. Not only does this simplify deployment, it helps minimize environment-specific bugs.

My long term vision for Falcon is to make a web application platform which trivializes server deployment. Ideally, a web application can fully describe all its components: HTTP servers, databases, periodic jobs, background jobs, remote management, etc. Currently, it is not uncommon for all these facets to be handled independently in platform specific ways. This can make it difficult to set up new instances as well as make changes to underlying infrastructure. I hope Falcon can address some of these issues in a platform agnostic way.

As web development is something I'm passionate about, having a server like Falcon is empowering.

Priority Business Support

Falcon can be an important part of your business or project, both improving performance and saving money. As such, priority business support is available to make every project a success. The support agreement will give you:

  • Direct support and assistance via Slack and email.
  • Advance notification of bugs and security issues.
  • Priority consideration of feature requests and bug reports.
  • Better software by funding development and testing.

Please visit Socketry.io to register and subscribe.

Usage

Please see the project documentation for more details.

  • Getting Started - This guide explains how to use Falcon for Ruby web application development.

  • Rails Integration - This guide explains how to host Rails applications with Falcon.

  • Deployment - This guide explains how to use Falcon in production environments.

  • Extended Features - This guide explains some of the extended features and functionality of Falcon.

  • Performance Tuning - This guide explains the performance characteristics of Falcon.

  • How It Works - This guide gives an overview of how Falcon handles an incoming web request.

Contributing

We welcome contributions to this project.

  1. Fork it.
  2. Create your feature branch (git checkout -b my-new-feature).
  3. Commit your changes (git commit -am 'Add some feature').
  4. Push to the branch (git push origin my-new-feature).
  5. Create new Pull Request.

Developer Certificate of Origin

This project uses the Developer Certificate of Origin. All contributors to this project must agree to this document to have their contributions accepted.

Contributor Covenant

This project is governed by the Contributor Covenant. All contributors and participants agree to abide by its terms.

falcon's People

Contributors

atitan avatar bryanp avatar claudiug avatar colby-swandale avatar danielevans avatar deepj avatar dependabot[bot] avatar ioquatix avatar janko avatar kyotee avatar madleech avatar mikelkew avatar nickjj avatar olleolleolle avatar phaedryx avatar picatz avatar pschrammel avatar santib avatar sean0628 avatar takkanm avatar tlatsas avatar trevorturk avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

falcon's Issues

WebSocket issue

Upgraded an application from Ruby 2.3 to 2.6 and at the same time moved from Falcon 0.23 to latest.

I get the following stack trace:

 4.51s    error: #<Falcon::Adapters::Rack:0x000055f07df105b8> [pid=20]
               |   NoMethodError: undefined method `hijack!' for #<Async::HTTP::Protocol::HTTP1::Request:0x000055f07df4e110>
               |   Did you mean?  hijack
               |                  hijack?
               |   → /app/vendor/ruby/2.6.0/gems/falcon-0.28.2/lib/falcon/adapters/rack.rb:170 in `block in call'
               |     /app/vendor/ruby/2.6.0/gems/async-websocket-0.8.0/lib/async/websocket/server.rb:46 in `open'
               |     falcon.ru:37 in `call'
               |     /app/vendor/ruby/2.6.0/gems/prometheus-client-0.9.0/lib/prometheus/middleware/exporter.rb:32 in `call'
               |     /app/vendor/ruby/2.6.0/gems/prometheus-client-0.9.0/lib/prometheus/middleware/collector.rb:38 in `block in call'
               |     /app/vendor/ruby/2.6.0/gems/prometheus-client-0.9.0/lib/prometheus/middleware/collector.rb:84 in `block in trace'
               |     /usr/local/lib/ruby/2.6.0/benchmark.rb:308 in `realtime'
               |     /app/vendor/ruby/2.6.0/gems/prometheus-client-0.9.0/lib/prometheus/middleware/collector.rb:84 in `trace'
               |     /app/vendor/ruby/2.6.0/gems/prometheus-client-0.9.0/lib/prometheus/middleware/collector.rb:38 in `call'
               |     /app/vendor/ruby/2.6.0/gems/falcon-0.28.2/lib/falcon/adapters/rack.rb:182 in `call'
               |     /app/vendor/ruby/2.6.0/gems/async-http-0.38.2/lib/async/http/middleware.rb:57 in `call'
               |     /app/vendor/ruby/2.6.0/gems/falcon-0.28.2/lib/falcon/adapters/rewindable.rb:61 in `call'
               |     /app/vendor/ruby/2.6.0/gems/async-http-0.38.2/lib/async/http/middleware.rb:57 in `call'
               |     /app/vendor/ruby/2.6.0/gems/async-http-0.38.2/lib/async/http/content_encoding.rb:44 in `call'
               |     /app/vendor/ruby/2.6.0/gems/async-http-0.38.2/lib/async/http/middleware.rb:57 in `call'
               |     /app/vendor/ruby/2.6.0/gems/async-http-0.38.2/lib/async/http/server.rb:61 in `block in accept'
               |     /app/vendor/ruby/2.6.0/gems/async-http-0.38.2/lib/async/http/protocol/http1/server.rb:55 in `each'
               |     /app/vendor/ruby/2.6.0/gems/async-http-0.38.2/lib/async/http/server.rb:50 in `accept'
               |     /app/vendor/ruby/2.6.0/gems/async-io-1.23.0/lib/async/io/socket.rb:100 in `block in accept_each'
               |     /app/vendor/ruby/2.6.0/gems/async-io-1.23.0/lib/async/io/socket.rb:135 in `block in accept'
               |     /app/vendor/ruby/2.6.0/gems/async-1.17.1/lib/async/task.rb:204 in `block in make_fiber'

Which links to this:

wrapper = request.hijack!

Is this a missed method update in the hijack refactoring you've been doing, or has something else changed I'm not aware of?

Zero-downtime restart

Hi :)

Zero-downtime restart has always been a PITA in both Unicorn and Puma.

What's Falcon's story?

Consider rescueing Async::TimeoutError in Falcon::Server

I've been having a spurious Async::TimeoutError in my logs whenever a TCP connection to the client is closed. After some digging I've monkey-patched Falcon::Server like this:

module Falcon
  class Server < Async::HTTP::Server
    def accept(peer, address, task: Task.current)
      begin
        super
      rescue Async::TimeoutError
        Async.logger.debug(self) {"Client #{address.inspect} disconnected: timeout"}
      end
    end
  end
end

Unless I am mixing something up. Async::TimeoutError should be rescued here.

Bind http by default in development env

So far Falcon binds https default, you have to bind http://localhost:$PORT explicitly otherwise you will get TLS error.

I think it would make trouble for newbies who want to try or using Falcon on development so I recommend we should bind http by default at least in development environment.

Option to suppress `server` response headers?

Currently the server seems to answer every request with the exact version of falcon that served the request: server: falcon/0.19.5. I do get that you guys are (rightfully!) proud of your work, but I would strongly prefer to not advertise that my application uses a specific version of your product. At the very least I see no reason to make things easier for automated malware frameworks in case of possible security issues. Maybe you could at least add an option to suppress the exact version?

Reasons for deleting Content-Length always?

I was wondering why Falcon was making the assumption that the Content-Length that is provded by the application is by definition incorrect? I do in fact have multiple applications where it is correct, and I don't need either chunked transfer encoding to be applied or the content length to be applied anew. Rack has a mechanism for it that if Content-Length is provided the ContentLength middleware is bypassed. Or (IMO) there should be a way to indicate to the server "Yes, I have a streaming response but it is not going to be endless, neither do I want chunked encoding to be applied on top".

There was a similar conundrum with puma/puma#711 (an incorrect assumption that if you are using hijack you will be doing a long response of arbitrary length) which has been resolved. There are usability concerns here of course but just silently delete()ing useful data the upstream app explicitly and deliberately sets is IMO not a nice thing to do.

falcon seems to require Rack ~> 2.0 despite what's in the gemspec

lib/falcon/adapters/rack.rb mentions Rack::RACK_VERSION, Rack::RACK_INPUT and many other constants that seem to have appeared in Rack 2.0. I was able to launch falcon by monkey-patching them on my Rails 4.2 project, but I'm not sure if it's the right solution. It seems like the gemspec needs to be updated.

Rack::Lint::LintError: rack.input #<Falcon::Adapters::Input:0x000055a9b437cbd0> does not respond to #rewind

Sorry for kind of combining two issues. I can overcome the first by putting falcon into Gemfile, but then I get a weird error.

First I tried to run falcon as:

$ gem install falcon
$ falcon serve
WARN: Unresolved specs during Gem::Specification.reset:
      rake (>= 0)
WARN: Clearing out unresolved specs.
Please report a bug if this causes problems.
/home/strzibny/.gem/ruby/gems/bootsnap-1.3.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require': cannot load such file -- async/container/forked (LoadError)
	from /home/strzibny/.gem/ruby/gems/activesupport-5.2.0/lib/active_support/dependencies.rb:283:in `block in require'
	from /home/strzibny/.gem/ruby/gems/activesupport-5.2.0/lib/active_support/dependencies.rb:249:in `load_dependency'
	from /home/strzibny/.gem/ruby/gems/activesupport-5.2.0/lib/active_support/dependencies.rb:283:in `require'
	from /home/strzibny/.gem/ruby/gems/falcon-0.18.4/lib/falcon/command/serve.rb:60:in `container_class'
	from /home/strzibny/.gem/ruby/gems/falcon-0.18.4/lib/falcon/command/serve.rb:80:in `run'
	from /home/strzibny/.gem/ruby/gems/falcon-0.18.4/lib/falcon/command/serve.rb:103:in `invoke'
	from /home/strzibny/.gem/ruby/gems/falcon-0.18.4/lib/falcon/command.rb:68:in `invoke'
	from /home/strzibny/.gem/ruby/gems/falcon-0.18.4/bin/falcon:26:in `<top (required)>'
	from /home/strzibny/bin/falcon:23:in `load'
	from /home/strzibny/bin/falcon:23:in `<main>'
[strzibny@strzibny benchmark-app]$ RACK_HANDLER=falcon rails server
Exiting
/home/strzibny/.gem/ruby/gems/bootsnap-1.3.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require': cannot load such file -- rack/handler/falcon (LoadError)
	from /home/strzibny/.gem/ruby/gems/activesupport-5.2.0/lib/active_support/dependencies.rb:283:in `block in require'
	from /home/strzibny/.gem/ruby/gems/activesupport-5.2.0/lib/active_support/dependencies.rb:249:in `load_dependency'
	from /home/strzibny/.gem/ruby/gems/activesupport-5.2.0/lib/active_support/dependencies.rb:283:in `require'
	from /home/strzibny/.gem/ruby/gems/rack-2.0.5/lib/rack/handler.rb:74:in `try_require'
	from /home/strzibny/.gem/ruby/gems/rack-2.0.5/lib/rack/handler.rb:16:in `get'
	from /home/strzibny/.gem/ruby/gems/rack-2.0.5/lib/rack/handler.rb:53:in `default'
	from /home/strzibny/.gem/ruby/gems/rack-2.0.5/lib/rack/server.rb:304:in `server'
	from /home/strzibny/.gem/ruby/gems/railties-5.2.0/lib/rails/commands/server/server_command.rb:105:in `use_puma?'
	from /home/strzibny/.gem/ruby/gems/railties-5.2.0/lib/rails/commands/server/server_command.rb:76:in `print_boot_information'
	from /home/strzibny/.gem/ruby/gems/railties-5.2.0/lib/rails/commands/server/server_command.rb:47:in `start'
	from /home/strzibny/.gem/ruby/gems/railties-5.2.0/lib/rails/commands/server/server_command.rb:147:in `block in perform'
	from /home/strzibny/.gem/ruby/gems/railties-5.2.0/lib/rails/commands/server/server_command.rb:142:in `tap'
	from /home/strzibny/.gem/ruby/gems/railties-5.2.0/lib/rails/commands/server/server_command.rb:142:in `perform'
	from /home/strzibny/.gem/ruby/gems/thor-0.20.0/lib/thor/command.rb:27:in `run'
	from /home/strzibny/.gem/ruby/gems/thor-0.20.0/lib/thor/invocation.rb:126:in `invoke_command'
	from /home/strzibny/.gem/ruby/gems/thor-0.20.0/lib/thor.rb:387:in `dispatch'
	from /home/strzibny/.gem/ruby/gems/railties-5.2.0/lib/rails/command/base.rb:65:in `perform'
	from /home/strzibny/.gem/ruby/gems/railties-5.2.0/lib/rails/command.rb:46:in `invoke'
	from /home/strzibny/.gem/ruby/gems/railties-5.2.0/lib/rails/commands.rb:18:in `<main>'
	from /home/strzibny/.gem/ruby/gems/bootsnap-1.3.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `require'
	from /home/strzibny/.gem/ruby/gems/bootsnap-1.3.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `block in require_with_bootsnap_lfi'
	from /home/strzibny/.gem/ruby/gems/bootsnap-1.3.0/lib/bootsnap/load_path_cache/loaded_features_index.rb:65:in `register'
	from /home/strzibny/.gem/ruby/gems/bootsnap-1.3.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:20:in `require_with_bootsnap_lfi'
	from /home/strzibny/.gem/ruby/gems/bootsnap-1.3.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:29:in `require'
	from /home/strzibny/.gem/ruby/gems/activesupport-5.2.0/lib/active_support/dependencies.rb:283:in `block in require'
	from /home/strzibny/.gem/ruby/gems/activesupport-5.2.0/lib/active_support/dependencies.rb:249:in `load_dependency'
	from /home/strzibny/.gem/ruby/gems/activesupport-5.2.0/lib/active_support/dependencies.rb:283:in `require'
	from /home/strzibny/Projects/benchmark-app/bin/rails:9:in `<top (required)>'
	from /home/strzibny/.gem/ruby/gems/spring-2.0.2/lib/spring/client/rails.rb:28:in `load'
	from /home/strzibny/.gem/ruby/gems/spring-2.0.2/lib/spring/client/rails.rb:28:in `call'
	from /home/strzibny/.gem/ruby/gems/spring-2.0.2/lib/spring/client/command.rb:7:in `call'
	from /home/strzibny/.gem/ruby/gems/spring-2.0.2/lib/spring/client.rb:30:in `run'
	from /home/strzibny/.gem/ruby/gems/spring-2.0.2/bin/spring:49:in `<top (required)>'
	from /home/strzibny/.gem/ruby/gems/spring-2.0.2/lib/spring/binstub.rb:31:in `load'
	from /home/strzibny/.gem/ruby/gems/spring-2.0.2/lib/spring/binstub.rb:31:in `<top (required)>'
	from /usr/share/rubygems/rubygems/core_ext/kernel_require.rb:68:in `require'
	from /usr/share/rubygems/rubygems/core_ext/kernel_require.rb:68:in `require'
	from /home/strzibny/Projects/benchmark-app/bin/spring:15:in `<top (required)>'
	from bin/rails:3:in `load'
	from bin/rails:3:in `<main>'

This does not work. Luckily adding it to Gemfile helped:

$ bundle exec rackup -s falcon -r falcon
Rack::Lint::LintError: rack.input #<Falcon::Adapters::Input:0x000055a9b437cbd0> does not respond to #rewind
	/home/strzibny/.gem/ruby/gems/rack-2.0.5/lib/rack/lint.rb:20:in `assert'
	/home/strzibny/.gem/ruby/gems/rack-2.0.5/lib/rack/lint.rb:347:in `block in check_input'
	/home/strzibny/.gem/ruby/gems/rack-2.0.5/lib/rack/lint.rb:346:in `each'
	/home/strzibny/.gem/ruby/gems/rack-2.0.5/lib/rack/lint.rb:346:in `check_input'
	/home/strzibny/.gem/ruby/gems/rack-2.0.5/lib/rack/lint.rb:291:in `check_env'
	/home/strzibny/.gem/ruby/gems/rack-2.0.5/lib/rack/lint.rb:43:in `_call'
	/home/strzibny/.gem/ruby/gems/rack-2.0.5/lib/rack/lint.rb:37:in `call'
	/home/strzibny/.gem/ruby/gems/rack-2.0.5/lib/rack/show_exceptions.rb:23:in `call'
	/home/strzibny/.gem/ruby/gems/rack-2.0.5/lib/rack/common_logger.rb:33:in `call'
	/home/strzibny/.gem/ruby/gems/rack-2.0.5/lib/rack/chunked.rb:54:in `call'
	/home/strzibny/.gem/ruby/gems/rack-2.0.5/lib/rack/content_length.rb:15:in `call'
	/home/strzibny/.gem/ruby/gems/falcon-0.18.4/lib/falcon/adapters/rack.rb:102:in `call'
	/home/strzibny/.gem/ruby/gems/async-http-0.30.3/lib/async/http/middleware.rb:53:in `call'
	/home/strzibny/.gem/ruby/gems/falcon-0.18.4/lib/falcon/adapters/rewindable.rb:59:in `call'
	/home/strzibny/.gem/ruby/gems/async-http-0.30.3/lib/async/http/middleware.rb:53:in `call'
	/home/strzibny/.gem/ruby/gems/async-http-0.30.3/lib/async/http/server.rb:54:in `block in accept'
	/home/strzibny/.gem/ruby/gems/async-http-0.30.3/lib/async/http/protocol/http11.rb:134:in `receive_requests'
	/home/strzibny/.gem/ruby/gems/async-http-0.30.3/lib/async/http/protocol/http1.rb:59:in `receive_requests'
	/home/strzibny/.gem/ruby/gems/async-http-0.30.3/lib/async/http/server.rb:49:in `accept'
	/home/strzibny/.gem/ruby/gems/async-io-1.15.2/lib/async/io/socket.rb:62:in `block in accept_each'
	/home/strzibny/.gem/ruby/gems/async-io-1.15.2/lib/async/io/socket.rb:95:in `block in accept'
	/home/strzibny/.gem/ruby/gems/async-1.10.1/lib/async/task.rb:74:in `block in initialize'


Streaming upload

Hi,
perhaps I missed something but is it possible to have a (perhaps not quite rack compliant) streaming upload?
Most ruby https servers stream to a file/StringIO and then pass that into the rack stack. This might be okay for small bodies but developing fileservers this way is a pain (local storages have to be huge and moving copying files is necessary).
So the question:

  1. is it possible?
  2. how?
  3. if not, what needs to be done (as far as I know hijack was invented for this kind of things)

THX

uninitialized constant Falcon::Command::Top::Logger

hi

Gemfile.lock

GEM
  remote: https://rubygems.org/
  specs:
    async (1.13.0)
      nio4r (~> 2.3)
      timers (~> 4.1)
    async-container (0.8.1)
      async (~> 1.0)
      async-io (~> 1.4)
    async-http (0.37.7)
      async (~> 1.6)
      async-io (~> 1.16)
      http-protocol (~> 0.10)
    async-io (1.17.2)
      async (~> 1.3)
    falcon (0.19.6)
      async-container (~> 0.8.0)
      async-http (~> 0.37.2)
      async-io (~> 1.9)
      http-protocol (~> 0.10.0)
      localhost (~> 1.1)
      rack (>= 1.0)
      samovar (~> 1.3)
    http-hpack (0.1.1)
    http-protocol (0.10.1)
      http-hpack (~> 0.1.0)
    localhost (1.1.4)
    mapping (1.1.1)
    mustermann (1.0.3)
    nio4r (2.3.1)
    rack (2.0.6)
    rack-protection (2.0.5)
      rack
    rainbow (3.0.0)
    samovar (1.9.1)
      mapping (~> 1.0)
      rainbow (>= 2.0, < 4.0)
    sinatra (2.0.5)
      mustermann (~> 1.0)
      rack (~> 2.0)
      rack-protection (= 2.0.5)
      tilt (~> 2.0)
    tilt (2.0.9)
    timers (4.2.0)

PLATFORMS
  ruby

DEPENDENCIES
  falcon
  sinatra

RUBY VERSION
   ruby 2.5.3p105

BUNDLED WITH
   1.17.2

config.ru

require 'sinatra/base'

class MyApp < Sinatra::Base
  get '/ololo' do
    'up'
  end
end

use MyApp
run lambda {|env| [404, {}, []]}

command

falcon serve

what do I do wrong?

Rails thread safety issues

The documentation regarding thread safety isn't sufficient and this sometimes causes Rails apps to deadlock.

Rails/Devise raises an invalid authenticity token on sign-in when running Falcon in HTTPS mode

Migrating from #24 becuase it's a different issue.

When I run my Rails application with the default HTTPS binding, attempts to sign in using Devise raises the following error:

Started POST "/users/sign_in" for 127.0.0.1 at 2018-10-24 17:14:29 -0700
Processing by Devise::SessionsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"QazbNOYd9lDBoUmbHYZusTlYsHbWPyNAuIVnxOnCQWJevfvlvIRYnYXgSSfhYT2PQGf5TR7SPULEx8NgOY5I3A==", "user"=>{"email"=>"[FILTERED]", "password"=>"[FILTERED]", "remember_me"=>"1"}, "commit"=>"Sign In"}
Can't verify CSRF token authenticity.
Completed 422 Unprocessable Entity in 2ms (ActiveRecord: 0.0ms)


Not notifying due to an invalid api_key

ActionController::InvalidAuthenticityToken - ActionController::InvalidAuthenticityToken:

Started POST "/__better_errors/442776df455fb9ec/variables" for 127.0.0.1 at 2018-10-24 17:14:30 -0700
E, [2018-10-24T17:14:30.162837 #25710] ERROR -- #<Async::IO::SSLServer:0x00005570c92b0c98>: Cannot send headers in state: closed (HTTP::Protocol::ProtocolError)
/home/xtagon/.asdf/installs/ruby/2.4.4/lib/ruby/gems/2.4.0/gems/http-protocol-0.6.1/lib/http/protocol/http2/stream.rb:170:in `send_headers'
/home/xtagon/.asdf/installs/ruby/2.4.4/lib/ruby/gems/2.4.0/gems/async-http-0.34.4/lib/async/http/protocol/http2/request.rb:99:in `send_response'
/home/xtagon/.asdf/installs/ruby/2.4.4/lib/ruby/gems/2.4.0/gems/async-http-0.34.4/lib/async/http/protocol/http2/server.rb:69:in `each'
/home/xtagon/.asdf/installs/ruby/2.4.4/lib/ruby/gems/2.4.0/gems/async-http-0.34.4/lib/async/http/server.rb:49:in `accept'
/home/xtagon/.asdf/installs/ruby/2.4.4/lib/ruby/gems/2.4.0/gems/async-io-1.16.1/lib/async/io/socket.rb:62:in `block in accept_each'
/home/xtagon/.asdf/installs/ruby/2.4.4/lib/ruby/gems/2.4.0/gems/async-io-1.16.1/lib/async/io/ssl_socket.rb:124:in `block in accept'
/home/xtagon/.asdf/installs/ruby/2.4.4/lib/ruby/gems/2.4.0/gems/async-1.10.3/lib/async/task.rb:74:in `block in initialize'

This only occurs if I'm using HTTPS with falcon serve, it does not occur when using HTTP with falcon serve nor when running in another server such as Puma. It also does not happen when running Falcon with RACK_HANDLER=falcon rails server.

Rails 5.1.6

Devise 4.5.0

Falcon 0.18.14

Benchmarking falcon alongside puma

Hi,

We are benchmarking some ruby framework here with puma as appserver

I have recetly discovered falcon and want to try it (as HTTP/2 is built-in)

I have compared the performance (disclaimer: on my local machine : 8 CPU / 16 G).

I have

Framework (Middleware) Average 50th percentile 90th percentile 99th percentile 99.9th percentile Standard deviation
puma roda (3.13) 2.64 ms 1.97 ms 5.25 ms 13.01 ms 100.45 ms 2818.67
puma rack-routing (0.0) 3.39 ms 2.36 ms 7.40 ms 17.56 ms 64.08 ms 3567.67
puma flame (4.18) 5.67 ms 4.10 ms 11.77 ms 29.84 ms 111.24 ms 6177.67
puma hanami (1.2) 6.08 ms 4.17 ms 13.95 ms 29.34 ms 105.11 ms 6288.67
puma sinatra (2.0) 7.37 ms 5.25 ms 16.31 ms 33.66 ms 101.11 ms 7176.00
puma rails (5.2) 26.17 ms 8.22 ms 79.53 ms 162.95 ms 327.13 ms 37267.33
falcon roda (3.13) 40.21 ms 39.66 ms 49.50 ms 88.35 ms 458.88 ms 18232.33
falcon rack-routing (0.0) 47.40 ms 45.06 ms 64.39 ms 90.61 ms 304.45 ms 14722.33
falcon flame (4.18) 61.00 ms 59.24 ms 78.09 ms 138.75 ms 479.34 ms 22420.33
falcon sinatra (2.0) 77.85 ms 74.01 ms 103.58 ms 154.22 ms 473.21 ms 25177.33
falcon hanami (1.2) 115.83 ms 111.39 ms 174.22 ms 247.65 ms 425.72 ms 45420.00
falcon rails (5.2) 243.92 ms 221.10 ms 316.00 ms 1030.75 ms 1805.75 ms 164609.00

What do you think ?

Regards,

NameError: uninitialized constant Rack::RACK_VERSION

When I run the following script:

run lambda {|env| [200, {}, ["Hello World"]]}

using

NIO4R_PURE=true falcon --verbose serve -c falcon.rb --threaded

Note: use it for testing falcon under Trufferuby

I got this issue under Ruby 2.5.3/Truffleruby 1.0.0-rc9 on macOS 10.14

D, [2018-11-06T20:52:24.014304 #38164] DEBUG -- Async::IO::Socket: Binding to #<Addrinfo: [::1]:9292 TCP (localhost)>
D, [2018-11-06T20:52:24.014689 #38164] DEBUG -- Async::IO::Socket: Binding to #<Addrinfo: 127.0.0.1:9292 TCP (localhost)>
D, [2018-11-06T20:52:24.014840 #38164] DEBUG -- <Async::Reactor:0x3fbf92cf4770 stopped=false>: Exiting run-loop because finished.
I, [2018-11-06T20:52:24.014951 #38164]  INFO -- : Falcon taking flight! Binding to #<Falcon::Endpoint https://localhost:9292/ {}> [Async::Container::Threaded with concurrency: 4]
I, [2018-11-06T20:52:24.015345 #38164]  INFO -- : Send `kill -USR1 38164` for detailed status :)
I, [2018-11-06T20:52:24.016304 #38164]  INFO -- : Send `kill -USR1 38164` for detailed status :)
I, [2018-11-06T20:52:24.015543 #38164]  INFO -- : Send `kill -USR1 38164` for detailed status :)
I, [2018-11-06T20:52:24.017282 #38164]  INFO -- : Send `kill -USR1 38164` for detailed status :)
E, [2018-11-06T20:52:33.333196 #38164] ERROR -- #<Async::IO::SSLServer:0x00007f7f259c8d20>: SSL_accept returned=1 errno=0 state=unknown state: sslv3 alert bad certificate (OpenSSL::SSL::SSLError)
~/.gem/ruby/2.5.3/gems/async-io-1.16.3/lib/async/io/generic.rb:128:in `accept_nonblock'
~/.gem/ruby/2.5.3/gems/async-io-1.16.3/lib/async/io/generic.rb:128:in `async_send'
~/.gem/ruby/2.5.3/gems/async-io-1.16.3/lib/async/io/generic.rb:47:in `block in wrap_blocking_method'
~/.gem/ruby/2.5.3/gems/async-io-1.16.3/lib/async/io/ssl_socket.rb:126:in `block in accept'
~/.gem/ruby/2.5.3/gems/async-1.10.3/lib/async/task.rb:74:in `block in initialize'
D, [2018-11-06T20:52:48.613432 #38164] DEBUG -- Async::HTTP::Protocol::HTTPS: Negotiating protocol "h2"...
D, [2018-11-06T20:52:48.615964 #38164] DEBUG -- #<Falcon::Server:0x00007f7f259c8e88>: Incoming connnection from #<Addrinfo: [::1]:50229 TCP> to #<Async::HTTP::Protocol::HTTP2::Server:0x00007f7f259aba18>
D, [2018-11-06T20:52:48.616093 #38164] DEBUG -- localhost:9292: GET / HTTP/2.0 from #<Addrinfo: [::1]:50229 TCP>
E, [2018-11-06T20:52:48.618435 #38164] ERROR -- : NameError: uninitialized constant Rack::RACK_VERSION
Did you mean?  RUBY_VERSION
	~/.gem/ruby/2.5.3/gems/falcon-0.19.2/lib/falcon/adapters/rack.rb:92:in `call'
	~/.gem/ruby/2.5.3/gems/async-http-0.37.0/lib/async/http/middleware.rb:57:in `call'
	~/.gem/ruby/2.5.3/gems/falcon-0.19.2/lib/falcon/adapters/rewindable.rb:61:in `call'
	~/.gem/ruby/2.5.3/gems/async-http-0.37.0/lib/async/http/middleware.rb:57:in `call'
	~/.gem/ruby/2.5.3/gems/async-http-0.37.0/lib/async/http/content_encoding.rb:44:in `call'
	~/.gem/ruby/2.5.3/gems/async-http-0.37.0/lib/async/http/middleware.rb:57:in `call'
	~/.gem/ruby/2.5.3/gems/falcon-0.19.2/lib/falcon/verbose.rb:50:in `call'
	~/.gem/ruby/2.5.3/gems/async-http-0.37.0/lib/async/http/middleware.rb:57:in `call'
	~/.gem/ruby/2.5.3/gems/async-http-0.37.0/lib/async/http/server.rb:63:in `block in accept'
	~/.gem/ruby/2.5.3/gems/async-http-0.37.0/lib/async/http/protocol/http2/server.rb:63:in `each'
	~/.gem/ruby/2.5.3/gems/async-http-0.37.0/lib/async/http/server.rb:52:in `accept'
	~/.gem/ruby/2.5.3/gems/async-io-1.16.3/lib/async/io/socket.rb:68:in `block in accept_each'
	~/.gem/ruby/2.5.3/gems/async-io-1.16.3/lib/async/io/ssl_socket.rb:128:in `block in accept'
	~/.gem/ruby/2.5.3/gems/async-1.10.3/lib/async/task.rb:74:in `block in initialize'

I used Firefox to open the "page".

Reuse port missing and breaking Linux binding

Somewhere between version 0.27.0 and 0.33.0 the --reuse-port option was removed, which is breaking binding on Linux as it is erroring with a port already in use error. However it is still in the README.

Have tried with --threaded, which I thought would work as I would think it is just using one process, but I'm still getting the same error.

Logs not printing to STDOUT

Apps with the rails_12factor gem / apps running on Heroku need to print logs to STDOUT - but falcon seems to be blocking this. On Heroku it dumps the logs only on exit. Can we have logging behaviour respected / flushed when the app is trying to log to STDOUT?

Fork Events

I'd like to register events handlers to be called before / after a process fork, so that things like database connections can be disconnected / reconnected properly. In Puma, I would use:

  • :before_worker_fork
  • :after_worker_fork

Not seeing a way to do the same thing with Falcon. Do you have any input on how to support?

API for instantiating server

Currently it appears most of the grunt work for producing a functioning falcon server resides in lib/falcon/command/serve.rb which is handled by a command line invocation library.

It would be extremely useful to have an API level interface for creating an instance of a falcon server similar to what's available in the likes of WEBrick for example

Rack::Handler::WEBrick.run(CustomRackApplication.new, Port: 3000, Logger: SomeCustomLogger)

Falcon for large edge includes (developing/applying IO strategy)

Thank you for exploring async in Ruby! We are currently looking at raising our throughput on our download servers (if you are curious there is a presentation about it here https://speakerdeck.com/julik/streaming-large-files-with-ruby - specifically see slide 16

[libCURL get to *FILE] -> [Ruby File object] -> [non-blocking sendfile + IO#wait when EAGAIN]

This is repeated multiple times to "splice" response bodies together and works really well except that one response served this way consumes an entire thread. Async and fibers seem to be a good way to approach this problem, and nio4r also seems to be a great option because I can leverage the ByteBuffer implementation and the IO reactor. But this is where the question obviously arises. In our scheme we have at the moment (see above) there are two elements which are crucial - that we download upstream data into a file buffer (in reality it is on a RAM filesystem) which is not in the Ruby heap. We then tell the kernel to write that file into the socket that services our client on the Puma side, and again no bytes enter the Ruby heap. In practice it means that we have next to no allocation overhead during streaming, regardless of the size of the workload / number of upstream requests we need to perform. nio4r supports this usage pattern if you use raw sockets and a ByteBuffer, from what I understood in the docs something like this

buf = ByteBuffer.new(capacity: 24*1024)
while ... do # check for EOF etc
  buf.read_from(file) # If I get a 0 as return value I could call task.yield here (unlinkely)
  buf.flip
  buf.write_to(socket)  # If I get a 0 as return value I could call task.yield here as well (very likely)
  buf.flip
end

This would allow reuse of the ByteBuffer and while not as efficient as sendfile()- it would become read(infd, buf, size); write(outfd, buf, size) it would still allow us to accomplish what we need (not introducing these heaps of data into the Ruby string heap).

I have taken a peek at the beers.rb example and what I could envision is something like this if I reproduce it:

def stream_through(output_body, task, url, headers_for_upstream)
  # Obtuse URL management is not nice :-(
  uri = URI(url)
  base_uri = uri.dup
  base_uri.path = ""
  base_uri.query = nil

  endpoint = Async::HTTP::URLEndpoint.parse(base_uri.to_s)
  client = Async::HTTP::Client.new(endpoint)
  request = Async::HTTP::Request.new(client.scheme, uri.hostname, "GET", uri.request_uri, headers_for_upstream)
  response = client.call(request)
  if (200..2006).cover?(response.status) && body = response.body
    while chunk = body.read
      output_body.write(chunk)
      task.yield # Inserted for completeness sake
    end
  end
  response.close
end

run do |env|
    known_content_length = ... # I do know it in advance
    remote_urls_to_splice = ... # as well as these
    
    current_task = Async::Task.current
    async_output_body = Async::HTTP::Body::Writable.new
    current_task.async do |task|
      remote_urls_to_splice.each do |url_string|
        stream_through(async_output_body, task, url_string, {})
      end
    ensure
      async_output_body.close
    end
    
    [200, {'Content-Length' => known_content_length}, async_output_body]
  end
end

The problem that we have is that this will work well when the data transfer is relatively low-volume (chats, websockets etc.). But for us it will immediately blow up the Ruby heap with strings, since Async::HTTP::Body::Writable from what I can see is basically a "messagebox" (channel) for Strings. Mem use will be probably similar to what you could achieve with Rack's #each on a streaming body yielding Strings (we tried, it is immense and the application doesn't fit in RAM very quickly). What I want to do instead is pass the lowest-level possible objects to the reactor and tell it "Dear reactor, please use this fixed buffer to copy N bytes from this fd to that fd, and if there is an EAGAIN yield and try again later". But if both my "upstream" response body and my writable server response body are messgeboxes for Strings this option doesn't actually exist right?

Strictly speaking - yes, I am looking for an alternative to a non-blocking splice(). I can have plain (no-SSL) upstreams if that makes the job easier, I can also omit the "buffer to file first" if the rest of the setup works well. Everything in the setup is strictly HTTP1.1 at this point and the previous implementation even used HTTP1.0 for simplicity's sake.

So the question is, I guess - is this kind of workload a fit for falcon? Is it a good fit for nio4r? I do have the feeling that orchestrating these large-volume IO ops with Ruby should be perfectly feasible but when I examine examples and involved collaborator modules all I see are Strings, Strings, Strings... (primarily async/http). Is there some kind of wrapper around the nio4r ByteBuffer maybe that I could use as the async response body instead maybe?..

Maybe somehow get access to the actual output socket Falcon sets up (a-la Rack hijack) and perform non-blocking IO on that socket manually via nio4r?

I believe this is intimately related to #7 among others.

Edit: or if there is something I could use to no-string-copy from the async-http client body to the writable body of my HTTP response that could work too 🤔

Odd deadlock issue in MRI.

I encountered this and it appears to be happening within the guts of MRI:

^_^ > falcon
I, [2018-10-08T17:56:11.143745 #3140]  INFO -- : Falcon taking flight! Binding to #<Falcon::Endpoint https://localhost:9292/ {}> [Async::Container::Forked with concurrency: 8]
I, [2018-10-08T17:56:11.147168 #3141]  INFO -- : Send `kill -USR1 3141` for detailed status :)
I, [2018-10-08T17:56:11.147407 #3142]  INFO -- : Send `kill -USR1 3142` for detailed status :)
I, [2018-10-08T17:56:11.147883 #3143]  INFO -- : Send `kill -USR1 3143` for detailed status :)
I, [2018-10-08T17:56:11.148314 #3144]  INFO -- : Send `kill -USR1 3144` for detailed status :)
I, [2018-10-08T17:56:11.149173 #3146]  INFO -- : Send `kill -USR1 3146` for detailed status :)
I, [2018-10-08T17:56:11.149353 #3145]  INFO -- : Send `kill -USR1 3145` for detailed status :)
I, [2018-10-08T17:56:11.150077 #3147]  INFO -- : Send `kill -USR1 3147` for detailed status :)
I, [2018-10-08T17:56:11.150695 #3148]  INFO -- : Send `kill -USR1 3148` for detailed status :)
^CTraceback (most recent call last):
	9: from /Users/samuel/.rvm/gems/ruby-2.5.1/gems/async-1.10.3/lib/async/task.rb:74:in `block in initialize'
	8: from /Users/samuel/.rvm/gems/ruby-2.5.1/gems/falcon-0.18.13/lib/falcon/command/serve.rb:110:in `block (2 levels) in run'
	7: from /Users/samuel/.rvm/gems/ruby-2.5.1/gems/async-io-1.16.1/lib/async/io/trap.rb:47:in `trap'
	6: from /Users/samuel/.rvm/gems/ruby-2.5.1/gems/async-io-1.16.1/lib/async/io/notification.rb:47:in `wait'
	5: from /Users/samuel/.rvm/gems/ruby-2.5.1/gems/async-io-1.16.1/lib/async/io/notification.rb:47:in `ensure in wait'
	4: from /Users/samuel/.rvm/gems/ruby-2.5.1/gems/async-1.10.3/lib/async/wrapper.rb:89:in `reactor='
	3: from /Users/samuel/.rvm/gems/ruby-2.5.1/gems/async-1.10.3/lib/async/wrapper.rb:193:in `cancel_monitor'
	2: from /Users/samuel/.rvm/gems/ruby-2.5.1/gems/async-1.10.3/lib/async/wrapper.rb:193:in `close'
	1: from /Users/samuel/.rvm/gems/ruby-2.5.1/gems/async-1.10.3/lib/async/wrapper.rb:193:in `deregister'
/Users/samuel/.rvm/gems/ruby-2.5.1/gems/async-1.10.3/lib/async/wrapper.rb:193:in `lock': deadlock; recursive locking (ThreadError)
> ruby --version
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin18]

Feature request: rename thread/processes names

It would be great to have the threads and/or processes renamed with something like puma does :

root@xxx:/etc/telegraf# ps faux | grep puma
root     12595  0.0  0.0  13084  1024 pts/4    S+   Sep29   0:00  |                       \_ grep puma
mastodo+ 23771  0.0  0.6 518752 106464 ?       Ssl  Sep20   0:44 puma 3.11.4 (tcp://0.0.0.0:3100) [live]
mastodo+ 23968  0.0  1.8 1173088 314728 ?      Sl   Sep20   7:11  \_ puma: cluster worker 0: 23771 [live]
mastodo+ 23983  0.0  1.4 857144 238300 ?       Sl   Sep20   6:49  \_ puma: cluster worker 1: 23771 [live]

Having that kind of thing with falcon would help monitoring/graphing individual processes.

Disable HTTPS

Is there a way you guys can allow running Falcon without HTTPS? I know your mission is to simplify the process but we'd still like to use Nginx to handle the HTTPS part.

Does it support ActionCable?

Hello, I was messing around with Falcon and I tried booting a Rails 5.2.0 application. I noticed that ActionCable websocket doesn't work, is it expected? Isn't Falcon compatible with ActionCable?

Caching retrieved content into a file

Currently Falcon::Adapters::Input saves read chunks into memory to make it rewindable. That doesn't work well for my use case, as I'm planning to run an app where the request body can potentially be hundreds of megabytes large, which can cause high memory usage.

I wanted to ask if you're open to caching read content into a Tempfile instead, like Unicorn and Passenger do with their TeeInput. I can make the necessary changes in that case.

No async task available when streaming http input to container using docker-api

Passing the raw http input stream from falcon to a docker container stdin through the docker-api module is causing an error to be raised in the async library.

This error does not occur if puma is used, however in that case it buffers the raw input to a file so the code path may be different.

Pre-reading the stream when using falcon and wrapping in a StringIO also eliminates the error, but both of these workarounds cause the entire stream to be read into memory, which is what I am trying to avoid.

The following error is generated (framework being used in Sinatra):

Excon::Error::Socket: No async task available! (RuntimeError)
      |    /usr/local/bundle/gems/async-1.15.1/lib/async/task.rb:143 in 'current'
      |    /usr/local/bundle/gems/async-1.15.1/lib/async/wrapper.rb:98 in 'wait_readable'
      |    /usr/local/bundle/gems/async-io-1.18.2/lib/async/io/generic.rb:145 in 'async_send'
      |    /usr/local/bundle/gems/async-io-1.18.2/lib/async/io/generic.rb:47 in 'block in wrap_blocking_method'
      |    /usr/local/bundle/gems/async-io-1.18.2/lib/async/io/stream.rb:195 in 'fill_read_buffer'
      |    /usr/local/bundle/gems/async-io-1.18.2/lib/async/io/stream.rb:76 in 'read_partial'
      |    /usr/local/bundle/gems/async-http-0.38.0/lib/async/http/body/fixed.rb:50 in 'read'
      |    /usr/local/bundle/gems/falcon-0.24.0/lib/falcon/adapters/input.rb:122 in 'read_next'
      |    /usr/local/bundle/gems/falcon-0.24.0/lib/falcon/adapters/input.rb:73 in 'read'
      |    /usr/local/bundle/gems/docker-api-1.34.2/lib/docker/util.rb:68 in 'copy_stream'
      |    /usr/local/bundle/gems/docker-api-1.34.2/lib/docker/util.rb:68 in 'block (2 levels) in hijack_for'

Difficult to immediately say if the problem is being caused in docker-api, falcon, one of the async library components or in the specific implementation I am using.

Please feel free to provide suggestions as to how I can best diagnose the root cause.

Thread-safety with falcon and sinatra

Hi. That's just a question, hope that's okay.

The Readme is saying that in Rails before 5.x, there will be limited performance and deadlocks because of the needed Lock-module. What's the compatibility situation with Sinatra (and other frameworks)? Will it also be necessary to specify something like config.threadsafe!?

Segfault when shutting down server in threaded mode ran with bundle exec

Steps to reproduce:

# config.ru
run -> (env) { [200, {}, []] }
# Gemfile
source "https://rubygems.org"

gem "falcon"
# Gemfile.lock
GEM
  remote: https://rubygems.org/
  specs:
    async (1.10.3)
      nio4r (~> 2.3)
      timers (~> 4.1)
    async-container (0.8.1)
      async (~> 1.0)
      async-io (~> 1.4)
    async-http (0.37.0)
      async (~> 1.6)
      async-io (~> 1.16)
      http-protocol (~> 0.9.0)
    async-io (1.16.4)
      async (~> 1.3)
    falcon (0.19.3)
      async-container (~> 0.8.0)
      async-http (~> 0.37.0)
      async-io (~> 1.9)
      http-protocol (~> 0.9.0)
      localhost (~> 1.1)
      rack (>= 1.0)
      samovar (~> 1.3)
    http-hpack (0.1.1)
    http-protocol (0.9.2)
      http-hpack (~> 0.1.0)
    localhost (1.1.4)
    mapping (1.1.1)
    nio4r (2.3.1)
    rack (2.0.6)
    rainbow (3.0.0)
    samovar (1.9.1)
      mapping (~> 1.0)
      rainbow (>= 2.0, < 4.0)
    timers (4.2.0)

PLATFORMS
  ruby

DEPENDENCIES
  falcon

BUNDLED WITH
   1.16.2
$ bundle exec falcon serve -b http://localhost:9292 --threaded
$ for run in {1..20}; do curl localhost:9292; done

Now when I send Ctrl-C to the falcon server, I get a segfault:

^C/Users/janko/.rbenv/versions/2.5.1/bin/bundle: [BUG] Segmentation fault at 0x0000700007faa4c0
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17]

-- Crash Report log information --------------------------------------------
   See Crash Report log file under the one of following:
     * ~/Library/Logs/DiagnosticReports
     * /Library/Logs/DiagnosticReports
   for more details.
Don't forget to include the above Crash Report log file in bug reports.

-- Control frame information -----------------------------------------------
c:0001 p:0000 s:0003 E:001190 (none) [FINISH]


-- Machine register context ------------------------------------------------
 rax: 0x00007f84ce40bdb0 rbx: 0x00000001057b4000 rcx: 0x0000000000000017
 rdx: 0x0000000000000003 rdi: 0x00007f84d0687058 rsi: 0x00007f84d0627d20
 rbp: 0x00007ffeeb5601e0 rsp: 0x00007ffeeb5601b0  r8: 0x0000000000002001
  r9: 0xcccccccccccccccd r10: 0x0000000000000001 r11: 0x000000010472d010
 r12: 0x0000700007faa4c0 r13: 0x3ffffffffffffff8 r14: 0x00007f84ce40c3b0
 r15: 0x0000000000000145 rip: 0x000000010472ce33 rfl: 0x0000000000010202

-- C level backtrace information -------------------------------------------
0   ruby                                0x0000000104892b47 rb_vm_bugreport + 135
1   ruby                                0x0000000104713268 rb_bug_context + 472
2   ruby                                0x0000000104803931 sigsegv + 81
3   libsystem_platform.dylib            0x00007fff6ef7bb3d _sigtramp + 29
4   ruby                                0x000000010472ce33 rb_gc_mark_machine_stack + 99
5   ruby                                0x0000000104881b69 rb_execution_context_mark + 137
6   ruby                                0x00000001046fab6b cont_mark + 27
7   ruby                                0x0000000104738f32 gc_mark_stacked_objects + 178
8   ruby                                0x00000001047383d2 gc_marks_rest + 50
9   ruby                                0x000000010472be17 rb_gc_call_finalizer_at_exit + 103
10  ruby                                0x000000010471cebe ruby_cleanup + 606
11  ruby                                0x000000010471d05f ruby_run_node + 63
12  ruby                                0x000000010469ff0f main + 79

-- Other runtime information -----------------------------------------------

* Loaded script: /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/bin/falcon

* Loaded features:

    0 enumerator.so
    1 thread.rb
    2 rational.so
    3 complex.so
    4 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/x86_64-darwin17/enc/encdb.bundle
    5 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/x86_64-darwin17/enc/trans/transdb.bundle
    6 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/x86_64-darwin17/rbconfig.rb
    7 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/compatibility.rb
    8 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/defaults.rb
    9 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/deprecate.rb
   10 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/errors.rb
   11 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/version.rb
   12 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/requirement.rb
   13 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/platform.rb
   14 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/basic_specification.rb
   15 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/stub_specification.rb
   16 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/util/list.rb
   17 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/x86_64-darwin17/stringio.bundle
   18 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/uri/rfc2396_parser.rb
   19 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/uri/rfc3986_parser.rb
   20 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/uri/common.rb
   21 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/uri/generic.rb
   22 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/uri/ftp.rb
   23 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/uri/http.rb
   24 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/uri/https.rb
   25 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/uri/ldap.rb
   26 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/uri/ldaps.rb
   27 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/uri/mailto.rb
   28 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/uri.rb
   29 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/specification.rb
   30 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/exceptions.rb
   31 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/dependency.rb
   32 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/core_ext/kernel_gem.rb
   33 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/monitor.rb
   34 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb
   35 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems.rb
   36 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/path_support.rb
   37 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/did_you_mean-1.2.0/lib/did_you_mean/version.rb
   38 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/did_you_mean-1.2.0/lib/did_you_mean/core_ext/name_error.rb
   39 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/did_you_mean-1.2.0/lib/did_you_mean/levenshtein.rb
   40 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/did_you_mean-1.2.0/lib/did_you_mean/jaro_winkler.rb
   41 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/did_you_mean-1.2.0/lib/did_you_mean/spell_checker.rb
   42 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/delegate.rb
   43 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/did_you_mean-1.2.0/lib/did_you_mean/spell_checkers/name_error_checkers/class_name_checker.rb
   44 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/did_you_mean-1.2.0/lib/did_you_mean/spell_checkers/name_error_checkers/variable_name_checker.rb
   45 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/did_you_mean-1.2.0/lib/did_you_mean/spell_checkers/name_error_checkers.rb
   46 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/did_you_mean-1.2.0/lib/did_you_mean/spell_checkers/method_name_checker.rb
   47 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/did_you_mean-1.2.0/lib/did_you_mean/spell_checkers/key_error_checker.rb
   48 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/did_you_mean-1.2.0/lib/did_you_mean/spell_checkers/null_checker.rb
   49 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/did_you_mean-1.2.0/lib/did_you_mean/formatters/plain_formatter.rb
   50 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/did_you_mean-1.2.0/lib/did_you_mean.rb
   51 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/bundler_version_finder.rb
   52 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/util.rb
   53 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/tsort.rb
   54 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/request_set/gem_dependency_api.rb
   55 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/request_set/lockfile/parser.rb
   56 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/request_set/lockfile/tokenizer.rb
   57 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/request_set/lockfile.rb
   58 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/request_set.rb
   59 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb
   60 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/molinillo/lib/molinillo/errors.rb
   61 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/set.rb
   62 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/action.rb
   63 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb
   64 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_vertex.rb
   65 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/delete_edge.rb
   66 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb
   67 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/set_payload.rb
   68 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/tag.rb
   69 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/log.rb
   70 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/vertex.rb
   71 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb
   72 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/molinillo/lib/molinillo/state.rb
   73 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb
   74 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/molinillo/lib/molinillo/delegates/resolution_state.rb
   75 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/molinillo/lib/molinillo/delegates/specification_provider.rb
   76 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/molinillo/lib/molinillo/resolution.rb
   77 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/molinillo/lib/molinillo/resolver.rb
   78 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/molinillo/lib/molinillo/modules/ui.rb
   79 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/molinillo/lib/molinillo.rb
   80 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/molinillo.rb
   81 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/activation_request.rb
   82 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/conflict.rb
   83 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/dependency_request.rb
   84 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/requirement_list.rb
   85 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/stats.rb
   86 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/set.rb
   87 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/api_set.rb
   88 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/composed_set.rb
   89 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/best_set.rb
   90 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/current_set.rb
   91 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/git_set.rb
   92 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/index_set.rb
   93 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/installer_set.rb
   94 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/lock_set.rb
   95 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/vendor_set.rb
   96 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/source_set.rb
   97 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/specification.rb
   98 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/spec_specification.rb
   99 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/api_specification.rb
  100 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/git_specification.rb
  101 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/index_specification.rb
  102 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/installed_specification.rb
  103 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/local_specification.rb
  104 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/lock_specification.rb
  105 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver/vendor_specification.rb
  106 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/resolver.rb
  107 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/source/git.rb
  108 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/source/installed.rb
  109 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/source/specific_file.rb
  110 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/source/local.rb
  111 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/source/lock.rb
  112 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/source/vendor.rb
  113 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/source.rb
  114 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/version.rb
  115 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/compatibility_guard.rb
  116 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/x86_64-darwin17/etc.bundle
  117 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/fileutils/lib/fileutils.rb
  118 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendored_fileutils.rb
  119 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/x86_64-darwin17/pathname.bundle
  120 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/pathname.rb
  121 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/errors.rb
  122 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/environment_preserver.rb
  123 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/plugin/api.rb
  124 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/plugin.rb
  125 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/gem_helpers.rb
  126 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/match_platform.rb
  127 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/rubygems_ext.rb
  128 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/user_interaction.rb
  129 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/config_file.rb
  130 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/rubygems_integration.rb
  131 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/constants.rb
  132 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/current_ruby.rb
  133 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/build_metadata.rb
  134 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler.rb
  135 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/cgi/core.rb
  136 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/x86_64-darwin17/cgi/escape.bundle
  137 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/cgi/util.rb
  138 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/cgi/cookie.rb
  139 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/cgi.rb
  140 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/thor/lib/thor/command.rb
  141 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb
  142 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/thor/lib/thor/core_ext/ordered_hash.rb
  143 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/thor/lib/thor/error.rb
  144 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/thor/lib/thor/invocation.rb
  145 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/thor/lib/thor/parser/argument.rb
  146 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb
  147 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/thor/lib/thor/parser/option.rb
  148 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/thor/lib/thor/parser/options.rb
  149 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/thor/lib/thor/parser.rb
  150 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/thor/lib/thor/shell.rb
  151 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb
  152 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/x86_64-darwin17/readline.bundle
  153 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/thor/lib/thor/line_editor/readline.rb
  154 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/thor/lib/thor/line_editor.rb
  155 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/thor/lib/thor/util.rb
  156 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/thor/lib/thor/base.rb
  157 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/thor/lib/thor.rb
  158 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendored_thor.rb
  159 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/friendly_errors.rb
  160 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/cli/common.rb
  161 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/settings.rb
  162 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/feature_flag.rb
  163 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/shared_helpers.rb
  164 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/ext/builder.rb
  165 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/yaml_serializer.rb
  166 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/cli/plugin.rb
  167 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/cli.rb
  168 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/thor/lib/thor/shell/basic.rb
  169 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/thor/lib/thor/shell/color.rb
  170 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/ui.rb
  171 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/ui/silent.rb
  172 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/ui/rg_proxy.rb
  173 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/ui/shell.rb
  174 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/cli/exec.rb
  175 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/source.rb
  176 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/source/path.rb
  177 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/source/git.rb
  178 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/source/rubygems.rb
  179 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/lockfile_parser.rb
  180 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/definition.rb
  181 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/dependency.rb
  182 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/ruby_dsl.rb
  183 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/dsl.rb
  184 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/source_list.rb
  185 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/source/metadata.rb
  186 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/lazy_specification.rb
  187 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/index.rb
  188 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/forwardable/impl.rb
  189 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/forwardable.rb
  190 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/spec_set.rb
  191 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb
  192 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb
  193 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb
  194 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb
  195 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb
  196 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb
  197 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb
  198 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb
  199 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb
  200 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb
  201 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb
  202 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb
  203 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb
  204 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb
  205 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/molinillo/lib/molinillo/state.rb
  206 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb
  207 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb
  208 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb
  209 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb
  210 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb
  211 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendor/molinillo/lib/molinillo.rb
  212 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/vendored_molinillo.rb
  213 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/resolver/spec_group.rb
  214 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/resolver.rb
  215 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/gem_version_promoter.rb
  216 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/source/gemspec.rb
  217 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/runtime.rb
  218 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/dep_proxy.rb
  219 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/remote_specification.rb
  220 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/stub_specification.rb
  221 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/endpoint_specification.rb
  222 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/ruby_version.rb
  223 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-1.16.2/lib/bundler/setup.rb
  224 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/x86_64-darwin17/socket.bundle
  225 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/x86_64-darwin17/io/wait.bundle
  226 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/socket.rb
  227 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-io-1.16.4/lib/async/io/address.rb
  228 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/x86_64-darwin17/fiber.bundle
  229 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-1.10.3/lib/async/node.rb
  230 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-1.10.3/lib/async/condition.rb
  231 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-1.10.3/lib/async/task.rb
  232 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/nio4r-2.3.1/lib/nio/version.rb
  233 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/nio4r-2.3.1/lib/nio4r_ext.bundle
  234 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/nio4r-2.3.1/lib/nio.rb
  235 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-1.10.3/lib/async/wrapper.rb
  236 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-io-1.16.4/lib/async/io/generic.rb
  237 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-io-1.16.4/lib/async/io/socket.rb
  238 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-io-1.16.4/lib/async/io/endpoint.rb
  239 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-io-1.16.4/lib/async/io/buffer.rb
  240 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-io-1.16.4/lib/async/io/stream.rb
  241 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/http-protocol-0.9.2/lib/http/protocol/error.rb
  242 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/http-protocol-0.9.2/lib/http/protocol/http1/connection.rb
  243 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/body/readable.rb
  244 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/body/buffered.rb
  245 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/body/reader.rb
  246 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/middleware.rb
  247 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/request.rb
  248 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/http-protocol-0.9.2/lib/http/protocol/headers.rb
  249 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/headers.rb
  250 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-1.10.3/lib/async/notification.rb
  251 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-1.10.3/lib/async/queue.rb
  252 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/body/writable.rb
  253 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/protocol/request.rb
  254 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/protocol/http1/request.rb
  255 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/response.rb
  256 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/protocol/response.rb
  257 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/protocol/http1/response.rb
  258 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/body/chunked.rb
  259 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/body/fixed.rb
  260 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/protocol/http1/connection.rb
  261 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/protocol/http1/client.rb
  262 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/protocol/http1/server.rb
  263 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/protocol/http1.rb
  264 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/protocol/http10.rb
  265 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/protocol/http11.rb
  266 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/http-protocol-0.9.2/lib/http/protocol/http2/frame.rb
  267 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/http-protocol-0.9.2/lib/http/protocol/http2/padded.rb
  268 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/http-protocol-0.9.2/lib/http/protocol/http2/data_frame.rb
  269 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/http-protocol-0.9.2/lib/http/protocol/http2/continuation_frame.rb
  270 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/http-protocol-0.9.2/lib/http/protocol/http2/priority_frame.rb
  271 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/http-protocol-0.9.2/lib/http/protocol/http2/headers_frame.rb
  272 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/http-protocol-0.9.2/lib/http/protocol/http2/reset_stream_frame.rb
  273 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/http-protocol-0.9.2/lib/http/protocol/http2/ping_frame.rb
  274 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/http-protocol-0.9.2/lib/http/protocol/http2/settings_frame.rb
  275 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/http-protocol-0.9.2/lib/http/protocol/http2/push_promise_frame.rb
  276 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/http-protocol-0.9.2/lib/http/protocol/http2/goaway_frame.rb
  277 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/http-protocol-0.9.2/lib/http/protocol/http2/window_update_frame.rb
  278 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/http-protocol-0.9.2/lib/http/protocol/http2/framer.rb
  279 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/http-protocol-0.9.2/lib/http/protocol/http2/flow_control.rb
  280 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/http-hpack-0.1.1/lib/http/hpack/huffman/machine.rb
  281 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/http-hpack-0.1.1/lib/http/hpack/huffman.rb
  282 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/http-hpack-0.1.1/lib/http/hpack/context.rb
  283 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/http-hpack-0.1.1/lib/http/hpack/compressor.rb
  284 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/http-hpack-0.1.1/lib/http/hpack/decompressor.rb
  285 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/http-protocol-0.9.2/lib/http/protocol/http2/connection.rb
  286 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/http-protocol-0.9.2/lib/http/protocol/http2/stream.rb
  287 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/protocol/http2/stream.rb
  288 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/protocol/http2/connection.rb
  289 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/protocol/http2/response.rb
  290 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/http-protocol-0.9.2/lib/http/protocol/http2/client.rb
  291 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/protocol/http2/client.rb
  292 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/protocol/http2/request.rb
  293 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/http-protocol-0.9.2/lib/http/protocol/http2/server.rb
  294 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/protocol/http2/server.rb
  295 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/protocol/http2.rb
  296 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/logger.rb
  297 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-1.10.3/lib/async/logger.rb
  298 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/pool.rb
  299 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/x86_64-darwin17/digest.bundle
  300 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/digest.rb
  301 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/x86_64-darwin17/openssl.bundle
  302 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/openssl/bn.rb
  303 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/openssl/pkey.rb
  304 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/openssl/cipher.rb
  305 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/openssl/config.rb
  306 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/openssl/digest.rb
  307 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/openssl/x509.rb
  308 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/openssl/buffering.rb
  309 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/x86_64-darwin17/io/nonblock.bundle
  310 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/openssl/ssl.rb
  311 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/openssl/pkcs5.rb
  312 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/openssl.rb
  313 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/protocol/https.rb
  314 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/protocol.rb
  315 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/server.rb
  316 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/middleware/builder.rb
  317 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/body/wrapper.rb
  318 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/x86_64-darwin17/zlib.bundle
  319 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/body/deflate.rb
  320 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/content_encoding.rb
  321 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-1.10.3/lib/async/clock.rb
  322 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/statistics.rb
  323 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/falcon-0.19.3/lib/falcon/verbose.rb
  324 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/body/rewindable.rb
  325 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/falcon-0.19.3/lib/falcon/adapters/rewindable.rb
  326 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/rack-2.0.6/lib/rack.rb
  327 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/body.rb
  328 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/falcon-0.19.3/lib/falcon/adapters/input.rb
  329 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/body/file.rb
  330 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/falcon-0.19.3/lib/falcon/adapters/output.rb
  331 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/falcon-0.19.3/lib/falcon/version.rb
  332 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/x86_64-darwin17/date_core.bundle
  333 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/date.rb
  334 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/time.rb
  335 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/falcon-0.19.3/lib/falcon/adapters/response.rb
  336 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/falcon-0.19.3/lib/falcon/adapters/rack.rb
  337 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/falcon-0.19.3/lib/falcon/server.rb
  338 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-io-1.16.4/lib/async/io/address_endpoint.rb
  339 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-io-1.16.4/lib/async/io/host_endpoint.rb
  340 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-io-1.16.4/lib/async/io/ssl_socket.rb
  341 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-io-1.16.4/lib/async/io/ssl_endpoint.rb
  342 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/url_endpoint.rb
  343 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/versions.rb
  344 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/exception.rb
  345 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/syntax_error.rb
  346 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/x86_64-darwin17/psych.bundle
  347 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/omap.rb
  348 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/set.rb
  349 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/class_loader.rb
  350 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/x86_64-darwin17/strscan.bundle
  351 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/scalar_scanner.rb
  352 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/nodes/node.rb
  353 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/nodes/stream.rb
  354 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/nodes/document.rb
  355 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/nodes/sequence.rb
  356 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/nodes/scalar.rb
  357 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/nodes/mapping.rb
  358 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/nodes/alias.rb
  359 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/nodes.rb
  360 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/streaming.rb
  361 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/visitors/visitor.rb
  362 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/visitors/to_ruby.rb
  363 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/visitors/emitter.rb
  364 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/handler.rb
  365 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/tree_builder.rb
  366 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/visitors/yaml_tree.rb
  367 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/json/ruby_events.rb
  368 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/visitors/json_tree.rb
  369 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/visitors/depth_first.rb
  370 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/visitors.rb
  371 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/parser.rb
  372 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/coder.rb
  373 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/core_ext.rb
  374 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/stream.rb
  375 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/json/yaml_events.rb
  376 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/json/tree_builder.rb
  377 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/json/stream.rb
  378 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych/handlers/document_stream.rb
  379 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/psych.rb
  380 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/yaml.rb
  381 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/localhost-1.1.4/lib/localhost/authority.rb
  382 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/falcon-0.19.3/lib/falcon/endpoint.rb
  383 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/timers-4.2.0/lib/timers/version.rb
  384 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/timers-4.2.0/lib/timers/interval.rb
  385 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/timers-4.2.0/lib/timers/timer.rb
  386 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/timers-4.2.0/lib/timers/events.rb
  387 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/timers-4.2.0/lib/timers/group.rb
  388 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/timers-4.2.0/lib/timers/wait.rb
  389 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/timers-4.2.0/lib/timers.rb
  390 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-1.10.3/lib/async/reactor.rb
  391 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-io-1.16.4/lib/async/io/notification.rb
  392 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-container-0.8.1/lib/async/container/threaded.rb
  393 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-container-0.8.1/lib/async/container.rb
  394 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-io-1.16.4/lib/async/io/trap.rb
  395 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-io-1.16.4/lib/async/io/shared_endpoint.rb
  396 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/samovar-1.9.1/lib/samovar/version.rb
  397 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/samovar-1.9.1/lib/samovar/table.rb
  398 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/samovar-1.9.1/lib/samovar/flags.rb
  399 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/samovar-1.9.1/lib/samovar/options.rb
  400 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/samovar-1.9.1/lib/samovar/nested.rb
  401 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/samovar-1.9.1/lib/samovar/one.rb
  402 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/samovar-1.9.1/lib/samovar/many.rb
  403 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/samovar-1.9.1/lib/samovar/split.rb
  404 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/mapping-1.1.1/lib/mapping/model.rb
  405 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/rainbow-3.0.0/lib/rainbow/string_utils.rb
  406 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/rainbow-3.0.0/lib/rainbow/x11_color_names.rb
  407 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/rainbow-3.0.0/lib/rainbow/color.rb
  408 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/rainbow-3.0.0/lib/rainbow/presenter.rb
  409 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/rainbow-3.0.0/lib/rainbow/null_presenter.rb
  410 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/rainbow-3.0.0/lib/rainbow/wrapper.rb
  411 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/rainbow-3.0.0/lib/rainbow/global.rb
  412 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/rainbow-3.0.0/lib/rainbow.rb
  413 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/samovar-1.9.1/lib/samovar/output.rb
  414 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/samovar-1.9.1/lib/samovar/failure.rb
  415 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/shellwords.rb
  416 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/samovar-1.9.1/lib/samovar/command/system.rb
  417 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/samovar-1.9.1/lib/samovar/command/track_time.rb
  418 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/samovar-1.9.1/lib/samovar/command.rb
  419 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/samovar-1.9.1/lib/samovar.rb
  420 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/rack-2.0.6/lib/rack/builder.rb
  421 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/optparse.rb
  422 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/2.5.0/fileutils.rb
  423 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/rack-2.0.6/lib/rack/server.rb
  424 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/falcon-0.19.3/lib/falcon/command/serve.rb
  425 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/body/streamable.rb
  426 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-http-0.37.0/lib/async/http/client.rb
  427 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/falcon-0.19.3/lib/falcon/proxy.rb
  428 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/falcon-0.19.3/lib/falcon/redirection.rb
  429 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-container-0.8.1/lib/async/container/forked.rb
  430 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/falcon-0.19.3/lib/falcon/hosts.rb
  431 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-container-0.8.1/lib/async/container/controller.rb
  432 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/falcon-0.19.3/lib/falcon/command/virtual.rb
  433 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/falcon-0.19.3/lib/falcon/command.rb
  434 /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/falcon-0.19.3/lib/falcon.rb

[NOTE]
You may have encountered a bug in the Ruby interpreter or extension libraries.
Bug reports are welcome.
For details: http://www.ruby-lang.org/bugreport.html

[IMPORTANT]
Don't forget to include the Crash Report log file under
DiagnosticReports directory in bug reports.

Abort trap: 6

Note that this only happens if I run the falcon serve with bundle exec.

Daemonize and start/stop service

So far, I'm only able to start the server with falcon serve.

Is there any way to daemonize it and point to a pidfile? And even better, is it possible to stop the server somehow sending the pidfile or state file?

One of the things that I like of puma is that it can be easily configured with monit using capistrano to automatically start and stop.

# Example of monit recipe for automatically start/stop puma
check process puma_app_production
  with pidfile "/var/www/app/shared/tmp/pids/puma.pid"
  # shorted for brevity
  start program = "bundle exec puma -C /var/www/app/shared/puma.rb --daemon'"
  stop program = "bundle exec pumactl -S /var/www/app/shared/tmp/pids/puma.state stop'"                                                                                                                                                                             

Since I added tus to the app, I'd like to implement something like this for falcon as well so I make sure the service is always on or if is not it starts itself.

I can't see to find a reliable way to keep the process up otherwise.

This seems to be like a basic requirement for production usage, so I may be well missing something out.

No shared cipher

Added to Gemfile and ran bundle exec falcon serve:

λ bundle exec falcon serve
DEPRECATION WARNING: You have Rails 2.3-style plugins in vendor/plugins! Support for these plugins will be removed in Rails 4.0. Move them out and bundle them in your Gemfile, or fold them in to your app as lib/myplugin/* and config/initializers/myplugin.rb. See the release notes for more on this: http://weblog.rubyonrails.org/2012/1/4/rails-3-2-0-rc2-has-been-released. (called from <top (required)> at /Users/sobrinho/Developer/omitted/config/environment.rb:5)
DEPRECATION WARNING: You have Rails 2.3-style plugins in vendor/plugins! Support for these plugins will be removed in Rails 4.0. Move them out and bundle them in your Gemfile, or fold them in to your app as lib/myplugin/* and config/initializers/myplugin.rb. See the release notes for more on this: http://weblog.rubyonrails.org/2012/1/4/rails-3-2-0-rc2-has-been-released. (called from <top (required)> at /Users/sobrinho/Developer/omitted/config/environment.rb:5)
Expected string default value for '--helper'; got true (boolean)
I, [2018-08-09T09:50:06.321984 #141]  INFO -- : Falcon taking flight! Binding to #<Falcon::Endpoint https://localhost:9292/ {:reuse_port=>true}> [Async::Container::Forked with concurrency: 4]
I, [2018-08-09T09:50:06.326142 #157]  INFO -- : Send `kill -USR1 157` for detailed status :)
I, [2018-08-09T09:50:06.326692 #159]  INFO -- : Send `kill -USR1 159` for detailed status :)
I, [2018-08-09T09:50:06.326987 #160]  INFO -- : Send `kill -USR1 160` for detailed status :)
I, [2018-08-09T09:50:06.328072 #161]  INFO -- : Send `kill -USR1 161` for detailed status :)
E, [2018-08-09T09:50:08.961224 #161] ERROR -- #<Async::IO::SSLServer:0x00007fb20551c520>: SSL_accept returned=1 errno=0 state=error: no shared cipher (OpenSSL::SSL::SSLError)
/Users/sobrinho/.rbenv/versions/2.3.6/lib/ruby/gems/2.3.0/gems/async-io-1.15.2/lib/async/io/generic.rb:128:in `accept_nonblock'
/Users/sobrinho/.rbenv/versions/2.3.6/lib/ruby/gems/2.3.0/gems/async-io-1.15.2/lib/async/io/generic.rb:128:in `async_send'
/Users/sobrinho/.rbenv/versions/2.3.6/lib/ruby/gems/2.3.0/gems/async-io-1.15.2/lib/async/io/generic.rb:47:in `block in wrap_blocking_method'
/Users/sobrinho/.rbenv/versions/2.3.6/lib/ruby/gems/2.3.0/gems/async-io-1.15.2/lib/async/io/ssl_socket.rb:118:in `block in accept'
/Users/sobrinho/.rbenv/versions/2.3.6/lib/ruby/gems/2.3.0/gems/async-1.10.1/lib/async/task.rb:74:in `block in initialize'
E, [2018-08-09T09:50:08.997884 #157] ERROR -- #<Async::IO::SSLServer:0x00007fb20551c520>: SSL_accept returned=1 errno=0 state=error: no shared cipher (OpenSSL::SSL::SSLError)
/Users/sobrinho/.rbenv/versions/2.3.6/lib/ruby/gems/2.3.0/gems/async-io-1.15.2/lib/async/io/generic.rb:128:in `accept_nonblock'
/Users/sobrinho/.rbenv/versions/2.3.6/lib/ruby/gems/2.3.0/gems/async-io-1.15.2/lib/async/io/generic.rb:128:in `async_send'
/Users/sobrinho/.rbenv/versions/2.3.6/lib/ruby/gems/2.3.0/gems/async-io-1.15.2/lib/async/io/generic.rb:47:in `block in wrap_blocking_method'
/Users/sobrinho/.rbenv/versions/2.3.6/lib/ruby/gems/2.3.0/gems/async-io-1.15.2/lib/async/io/ssl_socket.rb:118:in `block in accept'
/Users/sobrinho/.rbenv/versions/2.3.6/lib/ruby/gems/2.3.0/gems/async-1.10.1/lib/async/task.rb:74:in `block in initialize'
E, [2018-08-09T09:50:09.001011 #157] ERROR -- #<Async::IO::SSLServer:0x00007fb20551c520>: SSL_accept returned=1 errno=0 state=error: inappropriate fallback (OpenSSL::SSL::SSLError)
/Users/sobrinho/.rbenv/versions/2.3.6/lib/ruby/gems/2.3.0/gems/async-io-1.15.2/lib/async/io/generic.rb:128:in `accept_nonblock'
/Users/sobrinho/.rbenv/versions/2.3.6/lib/ruby/gems/2.3.0/gems/async-io-1.15.2/lib/async/io/generic.rb:128:in `async_send'
/Users/sobrinho/.rbenv/versions/2.3.6/lib/ruby/gems/2.3.0/gems/async-io-1.15.2/lib/async/io/generic.rb:47:in `block in wrap_blocking_method'
/Users/sobrinho/.rbenv/versions/2.3.6/lib/ruby/gems/2.3.0/gems/async-io-1.15.2/lib/async/io/ssl_socket.rb:118:in `block in accept'
/Users/sobrinho/.rbenv/versions/2.3.6/lib/ruby/gems/2.3.0/gems/async-1.10.1/lib/async/task.rb:74:in `block in initialize'

Legacy project using ruby 2.3 and rails 3.2.

Maybe related?

streaming responses

I tried to adapt code from beer.rb and run falcon from my ruby and not with falcon - can't get streaming responses to work, the following outputs just one "hello" before connection is closed:

class Chunk
  def call(env)
    task = Async::Task.current
    body = Async::HTTP::Body::Writable.new
    task.async do |task|
      10.times do
        body.write "hello"
        task.sleep 0.5
      end
    rescue Exception => ex
      p ex
    ensure
      body.close
    end

    [200 {'content-type' => 'text/html; charset=utf-8'}, body]
  end
end
rack_app = Rack::Builder.new do
  use Rack::CommonLogger

  map "/chunk" do
    run Chunk.new
  end
end

app = Falcon::Server.middleware rack_app, verbose: true

endpoint = Async::HTTP::URLEndpoint.parse "http://0.0.0.0:1234"
bound_endpoint = Async::Reactor.run do
  Async::IO::SharedEndpoint.bound(endpoint)
end.result

server = Falcon::Server.new(app, bound_endpoint, endpoint.protocol, endpoint.scheme)

Async::Reactor.run do
  server.run
  puts "serving..."
end

Streaming responses

tus-ruby-server that I would like to run Falcon on can also be used to download uploaded files. In this case tus-ruby-server returns the response body as an object that responds to #each and lazily retrieves the file content from a storage (either disk, AWS S3 etc), which allows the web server to stream the content into the response body.

However, when I was looking at the Falcon source code, and I noticed that it wraps the response body that Rack apps return in Async::HTTP::Body::Buffered, which will eagerly retrieve all the chunks of a lazy response body object into memory, and only then continue writing it into the TCP socket.

That's unfortunately not ideal for my use case. First, these files can potentially be very large (i.e. 1 GB), so having the whole content loaded would cause high memory usage. Second, if the remote file is on AWS S3, the end user would have to wait for Falcon to download the whole file from AWS S3 before it can start downloading it.

It would be ideal if chunks of the response body would be written to the socket as they're retrieved, especially since Falcon can do it efficiently due to the async framework (unlike Puma which would block the web worker). May I ask what is the reason for Falcon buffering the response body?

Flakey specs?

This was a one-off failure. Might be due to a clock/timing issue with certificate validity period.

Failures:
  1) Falcon::Server with SSL basic middleware client can get resource
     Failure/Error: response = client.get("/", {})
     
     OpenSSL::SSL::SSLError:
       SSL_connect returned=1 errno=0 state=error: certificate verify failed
     # ./vendor/bundle/ruby/2.4.0/gems/async-io-1.17.2/lib/async/io/generic.rb:128:in `connect_nonblock'
     # ./vendor/bundle/ruby/2.4.0/gems/async-io-1.17.2/lib/async/io/generic.rb:128:in `async_send'
     # ./vendor/bundle/ruby/2.4.0/gems/async-io-1.17.2/lib/async/io/generic.rb:47:in `block in wrap_blocking_method'
     # ./vendor/bundle/ruby/2.4.0/gems/async-io-1.17.2/lib/async/io/ssl_socket.rb:48:in `connect'
     # ./vendor/bundle/ruby/2.4.0/gems/async-io-1.17.2/lib/async/io/ssl_endpoint.rb:86:in `connect'
     # ./vendor/bundle/ruby/2.4.0/gems/async-http-0.37.6/lib/async/http/url_endpoint.rb:172:in `connect'
     # ./vendor/bundle/ruby/2.4.0/gems/async-http-0.37.6/lib/async/http/client.rb:117:in `block in make_pool'
     # ./vendor/bundle/ruby/2.4.0/gems/async-http-0.37.6/lib/async/http/pool.rb:127:in `create'
     # ./vendor/bundle/ruby/2.4.0/gems/async-http-0.37.6/lib/async/http/pool.rb:154:in `available_resource'�[0m
     # ./vendor/bundle/ruby/2.4.0/gems/async-http-0.37.6/lib/async/http/pool.rb:116:in `wait_for_resource'
     # ./vendor/bundle/ruby/2.4.0/gems/async-http-0.37.6/lib/async/http/pool.rb:58:in `acquire'
     # ./vendor/bundle/ruby/2.4.0/gems/async-http-0.37.6/lib/async/http/client.rb:80:in `call'
     # ./vendor/bundle/ruby/2.4.0/gems/async-http-0.37.6/lib/async/http/middleware.rb:36:in `block (2 levels) in <module:Methods>'
     # ./spec/falcon/ssl_server_spec.rb:63:in `block (3 levels) in <top (required)>'
     # ./spec/falcon/ssl_server_spec.rb:49:in `block (2 levels) in <top (required)>'
     # ./vendor/bundle/ruby/2.4.0/gems/async-rspec-1.12.0/lib/async/rspec/reactor.rb:55:in `block (2 levels) in run_example'
     # ./vendor/bundle/ruby/2.4.0/gems/async-1.11.0/lib/async/task.rb:74:in `block in initialize'

Finished in 2.78 seconds (files took 0.42983 seconds to load)
44 examples, 1 failure, 1 pending

Failed examples:

rspec ./spec/falcon/ssl_server_spec.rb:62 # Falcon::Server with SSL basic middleware client can get resource


Falcon::Server with SSL
  basic middleware
E, [2018-12-19T23:52:47.003806 #7979] ERROR -- #<Async::IO::SSLServer:0x0000000001e42d38>: SSL_accept returned=1 errno=0 state=unknown state: sslv3 alert bad certificate (OpenSSL::SSL::SSLError)
/home/travis/build/socketry/falcon/vendor/bundle/ruby/2.4.0/gems/async-io-1.17.2/lib/async/io/generic.rb:128:in `accept_nonblock'
/home/travis/build/socketry/falcon/vendor/bundle/ruby/2.4.0/gems/async-io-1.17.2/lib/async/io/generic.rb:128:in `async_send'
/home/travis/build/socketry/falcon/vendor/bundle/ruby/2.4.0/gems/async-io-1.17.2/lib/async/io/generic.rb:47:in `block in wrap_blocking_method'
/home/travis/build/socketry/falcon/vendor/bundle/ruby/2.4.0/gems/async-io-1.17.2/lib/async/io/ssl_socket.rb:126:in `block in accept'
/home/travis/build/socketry/falcon/vendor/bundle/ruby/2.4.0/gems/async-1.11.0/lib/async/task.rb:74:in `block in initialize'
E, [2018-12-19T23:52:47.005199 #7979] ERROR -- #<Async::IO::SSLServer:0x0000000001e42d38>: SSL_accept returned=1 errno=0 state=unknown state: sslv3 alert bad certificate (OpenSSL::SSL::SSLError)
/home/travis/build/socketry/falcon/vendor/bundle/ruby/2.4.0/gems/async-io-1.17.2/lib/async/io/generic.rb:128:in `accept_nonblock'
/home/travis/build/socketry/falcon/vendor/bundle/ruby/2.4.0/gems/async-io-1.17.2/lib/async/io/generic.rb:128:in `async_send'
/home/travis/build/socketry/falcon/vendor/bundle/ruby/2.4.0/gems/async-io-1.17.2/lib/async/io/generic.rb:47:in `block in wrap_blocking_method'
/home/travis/build/socketry/falcon/vendor/bundle/ruby/2.4.0/gems/async-io-1.17.2/lib/async/io/ssl_socket.rb:126:in `block in accept'
/home/travis/build/socketry/falcon/vendor/bundle/ruby/2.4.0/gems/async-1.11.0/lib/async/task.rb:74:in `block in initialize'
    client can get resource (FAILED - 1)

Falcon is tryng to make me authenticate using X.509 User certificate

Probably because my browser advertises itself as having local X.509 certificate that can be used as a way to authenticate, I get the browser dialog requesting to select a certificate to authenticate with.

There is probably a flag on the backend that needs to be toggled to not do that.

When I selected one of the existing certificates, this was the output from the terminal:

E, [2018-10-22T18:13:39.339422 #92506] ERROR -- #<Async::IO::SSLServer:0x0000000123a8ca40>: SSL_accept returned=1 errno=0 state=error: sslv3 alert bad certificate (OpenSSL::SSL::SSLError)
/Users/brodock/.rvm/gems/ruby-2.4.4/gems/async-io-1.16.1/lib/async/io/generic.rb:128:in `accept_nonblock'
/Users/brodock/.rvm/gems/ruby-2.4.4/gems/async-io-1.16.1/lib/async/io/generic.rb:128:in `async_send'
/Users/brodock/.rvm/gems/ruby-2.4.4/gems/async-io-1.16.1/lib/async/io/generic.rb:47:in `block in wrap_blocking_method'
/Users/brodock/.rvm/gems/ruby-2.4.4/gems/async-io-1.16.1/lib/async/io/ssl_socket.rb:122:in `block in accept'
/Users/brodock/.rvm/gems/ruby-2.4.4/gems/async-1.10.3/lib/async/task.rb:74:in `block in initialize'

Failure to run while using jruby (SocketError: use ServerSocket for servers)

Not sure if this is on purpose, but just wanted to throw this out here.

OpenSSL implementation doesn't support ALPN.
 2.09s    error: <Async::Task:0x7d0 failed> [pid=6]
               |   SocketError: use ServerSocket for servers (http://wiki.jruby.org/ServerSocket)
               |   → org/jruby/ext/socket/RubySocket.java:253 in `listen'
               |     /home/root/application/vendor/bundle/jruby/2.5.0/gems/async-io-1.23.1/lib/async/io/shared_endpoint.rb:30 in `block in bound'
               |     /home/root/application/vendor/bundle/jruby/2.5.0/gems/async-io-1.23.1/lib/async/io/endpoint.rb:104 in `block in bound'
               |     /home/root/application/vendor/bundle/jruby/2.5.0/gems/async-http-0.39.0/lib/async/http/url_endpoint.rb:193 in `block in each'
               |     /home/root/application/vendor/bundle/jruby/2.5.0/gems/async-io-1.23.1/lib/async/io/host_endpoint.rb:84 in `block in each'
               |     org/jruby/RubyArray.java:1792 in `each'
               |     /opt/jruby/lib/ruby/stdlib/socket.rb:229 in `foreach'
               |     /home/root/application/vendor/bundle/jruby/2.5.0/gems/async-io-1.23.1/lib/async/io/host_endpoint.rb:83 in `each'
               |     /home/root/application/vendor/bundle/jruby/2.5.0/gems/async-http-0.39.0/lib/async/http/url_endpoint.rb:192 in `each'
               |     /home/root/application/vendor/bundle/jruby/2.5.0/gems/async-io-1.23.1/lib/async/io/endpoint.rb:100 in `bound'
               |     /home/root/application/vendor/bundle/jruby/2.5.0/gems/async-io-1.23.1/lib/async/io/shared_endpoint.rb:29 in `bound'
               |     /home/root/application/vendor/bundle/jruby/2.5.0/gems/falcon-0.29.0/lib/falcon/command/serve.rb:111 in `block in run'
               |     /home/root/application/vendor/bundle/jruby/2.5.0/gems/async-1.17.1/lib/async/task.rb:204 in `block in make_fiber'
bundler: failed to load command: falcon (/home/root/application/vendor/bundle/jruby/2.5.0/bin/falcon)
SocketError: use ServerSocket for servers (http://wiki.jruby.org/ServerSocket)
  org/jruby/ext/socket/RubySocket.java:253:in `listen'
  /home/root/application/vendor/bundle/jruby/2.5.0/gems/async-io-1.23.1/lib/async/io/shared_endpoint.rb:30:in `block in bound'
  /home/root/application/vendor/bundle/jruby/2.5.0/gems/async-io-1.23.1/lib/async/io/endpoint.rb:104:in `block in bound'
  /home/root/application/vendor/bundle/jruby/2.5.0/gems/async-http-0.39.0/lib/async/http/url_endpoint.rb:193:in `block in each'
  /home/root/application/vendor/bundle/jruby/2.5.0/gems/async-io-1.23.1/lib/async/io/host_endpoint.rb:84:in `block in each'
  org/jruby/RubyArray.java:1792:in `each'
  /opt/jruby/lib/ruby/stdlib/socket.rb:229:in `foreach'
  /home/root/application/vendor/bundle/jruby/2.5.0/gems/async-io-1.23.1/lib/async/io/host_endpoint.rb:83:in `each'
  /home/root/application/vendor/bundle/jruby/2.5.0/gems/async-http-0.39.0/lib/async/http/url_endpoint.rb:192:in `each'
  /home/root/application/vendor/bundle/jruby/2.5.0/gems/async-io-1.23.1/lib/async/io/endpoint.rb:100:in `bound'
  /home/root/application/vendor/bundle/jruby/2.5.0/gems/async-io-1.23.1/lib/async/io/shared_endpoint.rb:29:in `bound'
  /home/root/application/vendor/bundle/jruby/2.5.0/gems/falcon-0.29.0/lib/falcon/command/serve.rb:111:in `block in run'
  /home/root/application/vendor/bundle/jruby/2.5.0/gems/async-1.17.1/lib/async/task.rb:204:in `block in make_fiber'

Falcon running out of file descriptors

In my quest of having Mastodon handle requests asynchronously, I have toyed with using Falcon instead of Puma, and making HTTP.rb use wrappers provided by async-io.
This seems to work reasonably well except the falcon processes eventually crash because it ran out of file descriptors. This may due to HTTP.rb leaking sockets, as hinted by socketry/async-io#13, but stopping the process because it couldn't accept one connection doesn't seem right.

Traceback (most recent call last):
	7: from /home/mastodon/live/vendor/bundle/ruby/2.5.0/gems/async-1.10.3/lib/async/task.rb:74:in `block in initialize'
	6: from /home/mastodon/live/vendor/bundle/ruby/2.5.0/gems/async-io-1.15.5/lib/async/io/shared_endpoint.rb:74:in `block (2 levels) in bind'
	5: from /home/mastodon/live/vendor/bundle/ruby/2.5.0/gems/async-io-1.15.5/lib/async/io/shared_endpoint.rb:102:in `block in accept'
	4: from /home/mastodon/live/vendor/bundle/ruby/2.5.0/gems/async-io-1.15.5/lib/async/io/socket.rb:61:in `accept_each'
	3: from /home/mastodon/live/vendor/bundle/ruby/2.5.0/gems/async-io-1.15.5/lib/async/io/socket.rb:86:in `accept'
	2: from /home/mastodon/live/vendor/bundle/ruby/2.5.0/gems/async-io-1.15.5/lib/async/io/generic.rb:128:in `async_send'
	1: from /usr/lib/ruby/2.5.0/socket.rb:593:in `accept_nonblock'
/usr/lib/ruby/2.5.0/socket.rb:593:in `__accept_nonblock': Too many open files - accept(2) (Errno::EMFILE)

Reduce memory usage

@janko-m:

If you're curious, this is what MemoryProfiler currently says about reading from the rack.input:

allocated memory by location
-----------------------------------
  26737873  /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-io-1.12.3/lib/async/io/stream.rb:209
  26593287  /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/falcon-0.17.5/lib/falcon/adapters/input.rb:81
   4249600  /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-io-1.12.3/lib/async/io/generic.rb:128
   1484800  /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-io-1.12.3/lib/async/io/generic.rb:47
    512000  /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-io-1.12.3/lib/async/io/stream.rb:186
    489447  /Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/falcon-0.17.5/lib/falcon/adapters/input.rb:80

(That's for a 50MB request body)

Here is the current implementation from Ruby of str_byte_substr:

static VALUE
str_byte_substr(VALUE str, long beg, long len, int empty)
{
    char *p, *s = RSTRING_PTR(str);
    long n = RSTRING_LEN(str);
    VALUE str2;

    if (beg > n || len < 0) return Qnil;
    if (beg < 0) {
	beg += n;
	if (beg < 0) return Qnil;
    }
    if (len > n - beg)
	len = n - beg;
    if (len <= 0) {
	if (!empty) return Qnil;
	len = 0;
	p = 0;
    }
    else
	p = s + beg;

    if (!STR_EMBEDDABLE_P(len, TERM_LEN(str)) && SHARABLE_SUBSTRING_P(beg, len, n)) {
	str2 = rb_str_new_frozen(str);
	str2 = str_new_shared(rb_obj_class(str2), str2);
	RSTRING(str2)->as.heap.ptr += beg;
	RSTRING(str2)->as.heap.len = len;
    }
    else {
	str2 = rb_str_new_with_class(str, p, len);
    }

    str_enc_copy(str2, str);

    if (RSTRING_LEN(str2) == 0) {
	if (!rb_enc_asciicompat(STR_ENC_GET(str)))
	    ENC_CODERANGE_SET(str2, ENC_CODERANGE_VALID);
	else
	    ENC_CODERANGE_SET(str2, ENC_CODERANGE_7BIT);
    }
    else {
	switch (ENC_CODERANGE(str)) {
	  case ENC_CODERANGE_7BIT:
	    ENC_CODERANGE_SET(str2, ENC_CODERANGE_7BIT);
	    break;
	  default:
	    ENC_CODERANGE_SET(str2, ENC_CODERANGE_UNKNOWN);
	    break;
	}
    }

    OBJ_INFECT_RAW(str2, str);

    return str2;
}

I'm trying to figure out what part of this is causing problems.

Unable to reload falcon through kill -HUP

Example:

[~/RailsPrjs/FXEnroll] (master) 0h19m $ falcon serve -b http://localhost:22222
 8.67s: #<Falcon::Endpoint http://localhost:22222/>
      | Falcon taking flight! Using Async::Container::Forked {:count=>4}
      | - To terminate: Ctrl-C or kill 40603
 8.68s: #<Async::Container::Forked::Instance:0x00007ffa1e2aa7b8>
      | - Per-process status: kill -USR1 40831
 8.69s: #<Async::Container::Forked::Instance:0x00007ffa1e29b970>
      | - Per-process status: kill -USR1 40832
 8.69s: #<Async::Container::Forked::Instance:0x00007ffa1e2ca5b8>
      | - Per-process status: kill -USR1 40833
  8.7s: #<Async::Container::Forked::Instance:0x00007ffa19f9d6a0>
      | - Per-process status: kill -USR1 40834

And try to send HUP signal

 kill -HUP 40603

Then

Hangup: 1

and won't restart.

Is it normal?

[README] Usage and integration with Rails

As described in README Integration with Rails section:

Alternatively run RACK_HANDLER=falcon rails server to start the server (at least, until rack#181 is merged).

  1. There is a typo in the PR number, - it should be #1181 instead of #181.
  2. If point 1 is correct, the indicated PR was merged on January 4 but running falcon serve still raises the error:
Traceback (most recent call last):
	32: from /Users/Serguei/.rvm/gems/ruby-2.6.1/bin/falcon:23:in `<main>'
	31: from /Users/Serguei/.rvm/gems/ruby-2.6.1/bin/falcon:23:in `load'
	30: from /Users/Serguei/.rvm/gems/ruby-2.6.1/gems/falcon-0.30.0/bin/falcon:26:in `<top (required)>'
	29: from /Users/Serguei/.rvm/gems/ruby-2.6.1/gems/falcon-0.30.0/lib/falcon/command.rb:32:in `call'
	28: from /Users/Serguei/.rvm/gems/ruby-2.6.1/gems/samovar-2.1.1/lib/samovar/command.rb:36:in `call'
	27: from /Users/Serguei/.rvm/gems/ruby-2.6.1/gems/falcon-0.30.0/lib/falcon/command.rb:71:in `call'
	26: from /Users/Serguei/.rvm/gems/ruby-2.6.1/gems/falcon-0.30.0/lib/falcon/command/serve.rb:150:in `call'
	25: from /Users/Serguei/.rvm/gems/ruby-2.6.1/gems/falcon-0.30.0/lib/falcon/command/serve.rb:106:in `run'
	24: from /Users/Serguei/.rvm/gems/ruby-2.6.1/gems/falcon-0.30.0/lib/falcon/command/serve.rb:71:in `load_app'
	23: from /Users/Serguei/.rvm/gems/ruby-2.6.1/gems/rack-2.0.7/lib/rack/builder.rb:40:in `parse_file'
	22: from /Users/Serguei/.rvm/gems/ruby-2.6.1/gems/rack-2.0.7/lib/rack/builder.rb:49:in `new_from_string'
	21: from /Users/Serguei/.rvm/gems/ruby-2.6.1/gems/rack-2.0.7/lib/rack/builder.rb:49:in `eval'
	20: from config.ru:in `<main>'
	19: from config.ru:in `new'
	18: from /Users/Serguei/.rvm/gems/ruby-2.6.1/gems/rack-2.0.7/lib/rack/builder.rb:55:in `initialize'
	17: from /Users/Serguei/.rvm/gems/ruby-2.6.1/gems/rack-2.0.7/lib/rack/builder.rb:55:in `instance_eval'
	16: from config.ru:3:in `block in <main>'
	15: from config.ru:3:in `require_relative'
	14: from /Users/Serguei/projects/decastore/decastore-api/config/environment.rb:2:in `<top (required)>'
	13: from /Users/Serguei/projects/decastore/decastore-api/config/environment.rb:2:in `require_relative'
	12: from /Users/Serguei/projects/decastore/decastore-api/config/application.rb:1:in `<top (required)>'
	11: from /Users/Serguei/projects/decastore/decastore-api/config/application.rb:1:in `require_relative'
	10: from /Users/Serguei/projects/decastore/decastore-api/config/boot.rb:3:in `<top (required)>'
	 9: from /Users/Serguei/.rvm/rubies/ruby-2.6.1/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
	 8: from /Users/Serguei/.rvm/rubies/ruby-2.6.1/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
	 7: from /Users/Serguei/.rvm/rubies/ruby-2.6.1/lib/ruby/site_ruby/2.6.0/bundler/setup.rb:10:in `<top (required)>'
	 6: from /Users/Serguei/.rvm/rubies/ruby-2.6.1/lib/ruby/site_ruby/2.6.0/bundler.rb:107:in `setup'
	 5: from /Users/Serguei/.rvm/rubies/ruby-2.6.1/lib/ruby/site_ruby/2.6.0/bundler/runtime.rb:26:in `setup'
	 4: from /Users/Serguei/.rvm/rubies/ruby-2.6.1/lib/ruby/site_ruby/2.6.0/bundler/runtime.rb:26:in `map'
	 3: from /Users/Serguei/.rvm/rubies/ruby-2.6.1/lib/ruby/2.6.0/forwardable.rb:230:in `each'
	 2: from /Users/Serguei/.rvm/rubies/ruby-2.6.1/lib/ruby/2.6.0/forwardable.rb:230:in `each'
	 1: from /Users/Serguei/.rvm/rubies/ruby-2.6.1/lib/ruby/site_ruby/2.6.0/bundler/runtime.rb:31:in `block in setup'
/Users/Serguei/.rvm/rubies/ruby-2.6.1/lib/ruby/site_ruby/2.6.0/bundler/runtime.rb:319:in `check_for_activated_spec!': You have already activated nio4r 2.3.1, but your Gemfile requires nio4r 2.3.0. Prepending `bundle exec` to your command may solve this. (Gem::LoadError)
  1. When started the server prepending with bundle exec falcon server -p 3000, it starts but in https mode:
bundle exec falcon serve -p 3000
 1.29s: #<Falcon::Endpoint https://localhost:3000/>
      | Falcon taking flight! Using Async::Container::Forked {:count=>8}
      | - To terminate: Ctrl-C or kill 28803
  1.3s: #<Async::Container::Forked::Instance:0x00007fbdca62dd80>
      | - Per-process status: kill -USR1 28805
  1.3s: #<Async::Container::Forked::Instance:0x00007fbdca62dd58>
      | - Per-process status: kill -USR1 28806
  1.3s: #<Async::Container::Forked::Instance:0x00007fbdca62dd30>
      | - Per-process status: kill -USR1 28807
  1.3s: #<Async::Container::Forked::Instance:0x00007fbdca62dd08>
      | - Per-process status: kill -USR1 28808
  1.3s: #<Async::Container::Forked::Instance:0x00007fbdca62dce0>
      | - Per-process status: kill -USR1 28809
  1.3s: #<Async::Container::Forked::Instance:0x00007fbdca62dcb8>
      | - Per-process status: kill -USR1 28810
  1.3s: #<Async::Container::Forked::Instance:0x00007fbdca62dc90>
      | - Per-process status: kill -USR1 28811
  1.3s: #<Async::Container::Forked::Instance:0x00007fbdca62dc68>
      | - Per-process status: kill -USR1 28812
...

In this case the front-end app cannot hit localhost:3000 anymore:

Async::Task:0x3fdee4c04f9c failed>
      |   OpenSSL::SSL::SSLError: SSL_accept returned=1 errno=0 state=error: wrong version number
      |   → /Users/Serguei/.rvm/gems/ruby-2.6.1/gems/async-io-1.23.1/lib/async/io/generic.rb:208 in `accept_nonblock'
      |     /Users/Serguei/.rvm/gems/ruby-2.6.1/gems/async-io-1.23.1/lib/async/io/generic.rb:208 in `async_send'
      |     /Users/Serguei/.rvm/gems/ruby-2.6.1/gems/async-io-1.23.1/lib/async/io/generic.rb:54 in `block in wrap_blocking_method'
      |     /Users/Serguei/.rvm/gems/ruby-2.6.1/gems/async-io-1.23.1/lib/async/io/ssl_socket.rb:139 in `block in accept'
      |     /Users/Serguei/.rvm/gems/ruby-2.6.1/gems/async-1.17.1/lib/async/task.rb:204 in `block in make_fiber'
55.34s: <Async::Task:0x3fdee7402f08 failed>
...

But if I start the server RACK_HANDLER=falcon rails server -e staging -p 3000 everything works as before withpuma.

Can you please clear a little bit the way to run it on a Rails API app?

I'm using :

  • Ruby 2.6.1
  • Rails 5.2.2
  • Falcon 0.30.0

Thank you.

ipv6 problem in docker container

When I try to run falcon serve in a docker container I get the following errors:

|  4.67s: Async::IO::Socket
|       | Binding to #<Addrinfo: 127.0.0.1:8000 TCP (localhost)>
|  4.67s: Async::IO::Socket
|       | Binding to #<Addrinfo: [::1]:8000 TCP (localhost)>
|  4.67s: <Async::Task:0x2ac88aea9e94 failed>
|       |  Errno::EADDRNOTAVAIL: Cannot assign requested address - bind(2) for [::1]:8000
|       |  → /usr/local/bundle/gems/async-io-1.20.0/lib/async/io/socket.rb:216 in `bind'
|       |    /usr/local/bundle/gems/async-io-1.20.0/lib/async/io/socket.rb:216 in `block in bind'
|       |    /usr/local/bundle/gems/async-io-1.20.0/lib/async/io/socket.rb:148 in `build'
|       |    /usr/local/bundle/gems/async-io-1.20.0/lib/async/io/socket.rb:207 in `bind'
|       |    /usr/local/bundle/gems/async-io-1.20.0/lib/async/io/address_endpoint.rb:43 in `bind'
|       |    /usr/local/bundle/gems/async-http-0.38.1/lib/async/http/url_endpoint.rb:172 in `bind'
|       |    /usr/local/bundle/gems/async-io-1.20.0/lib/async/io/shared_endpoint.rb:30 in `block in bound'
|       |    /usr/local/bundle/gems/async-http-0.38.1/lib/async/http/url_endpoint.rb:183 in `block in each'
|       |    /usr/local/bundle/gems/async-io-1.20.0/lib/async/io/host_endpoint.rb:75 in `block in each'
|       |    /usr/local/lib/ruby/2.6.0/socket.rb:227 in `each'
|       |    /usr/local/lib/ruby/2.6.0/socket.rb:227 in `foreach'
|       |    /usr/local/bundle/gems/async-io-1.20.0/lib/async/io/host_endpoint.rb:74 in `each'
|       |    /usr/local/bundle/gems/async-http-0.38.1/lib/async/http/url_endpoint.rb:182 in `each'
|       |    /usr/local/bundle/gems/async-io-1.20.0/lib/async/io/shared_endpoint.rb:29 in `bound'
|       |    /usr/local/bundle/gems/falcon-0.26.0/lib/falcon/command/serve.rb:111 in `block in run'
|       |    /usr/local/bundle/gems/async-1.15.5/lib/async/task.rb:199 in `block in make_fiber'
|  4.67s: <Async::Reactor:0x2ac88aea3990 stopped=false>
|       | Exiting run-loop because finished.
| /usr/local/bundle/gems/async-io-1.20.0/lib/async/io/socket.rb:216:in `bind': Cannot assign requested address - bind(2) for [::1]:8000 (Errno::EADDRNOTAVAIL)
| 	from /usr/local/bundle/gems/async-io-1.20.0/lib/async/io/socket.rb:216:in `block in bind'
| 	from /usr/local/bundle/gems/async-io-1.20.0/lib/async/io/socket.rb:148:in `build'
| 	from /usr/local/bundle/gems/async-io-1.20.0/lib/async/io/socket.rb:207:in `bind'
| 	from /usr/local/bundle/gems/async-io-1.20.0/lib/async/io/address_endpoint.rb:43:in `bind'
| 	from /usr/local/bundle/gems/async-http-0.38.1/lib/async/http/url_endpoint.rb:172:in `bind'
| 	from /usr/local/bundle/gems/async-io-1.20.0/lib/async/io/shared_endpoint.rb:30:in `block in bound'
| 	from /usr/local/bundle/gems/async-http-0.38.1/lib/async/http/url_endpoint.rb:183:in `block in each'
| 	from /usr/local/bundle/gems/async-io-1.20.0/lib/async/io/host_endpoint.rb:75:in `block in each'
| 	from /usr/local/lib/ruby/2.6.0/socket.rb:227:in `each'
| 	from /usr/local/lib/ruby/2.6.0/socket.rb:227:in `foreach'
| 	from /usr/local/bundle/gems/async-io-1.20.0/lib/async/io/host_endpoint.rb:74:in `each'
| 	from /usr/local/bundle/gems/async-http-0.38.1/lib/async/http/url_endpoint.rb:182:in `each'
| 	from /usr/local/bundle/gems/async-io-1.20.0/lib/async/io/shared_endpoint.rb:29:in `bound'
| 	from /usr/local/bundle/gems/falcon-0.26.0/lib/falcon/command/serve.rb:111:in `block in run'
| 	from /usr/local/bundle/gems/async-1.15.5/lib/async/task.rb:199:in `block in make_fiber'
exited with code 1

It appears that falcon tries to bind to [::1]:8000 and fails to do so (which makes sense since I've only exposed 127.0.0.1:8000 to the container.) Is there a way to disable ipv6?

The default https://localhost:9292 bind doesn't work on my machine

The by default Falcon binds on https://localhost:9292, and that doesn't work on my machine because it doesn't support SSL. This is using the simplest config.ru:

# config.ru
run -> (env) { [200, {}, []] }
$ falcon serve
I, [2018-11-10T18:07:25.960900 #82757]  INFO -- : Falcon taking flight! Binding to #<Falcon::Endpoint https://localhost:9292/ {}> [Async::Container::Forked with concurrency: 4]
I, [2018-11-10T18:07:25.965411 #82786]  INFO -- : Send `kill -USR1 82786` for detailed status :)
I, [2018-11-10T18:07:25.965867 #82787]  INFO -- : Send `kill -USR1 82787` for detailed status :)
I, [2018-11-10T18:07:25.966193 #82788]  INFO -- : Send `kill -USR1 82788` for detailed status :)
I, [2018-11-10T18:07:25.966607 #82789]  INFO -- : Send `kill -USR1 82789` for detailed status :)
E, [2018-11-10T18:07:29.155505 #82786] ERROR -- #<Async::IO::SSLServer:0x00007fb4ac1c2a10>: SSL_accept returned=1 errno=0 state=SSLv2/v3 read client hello A: http request (OpenSSL::SSL::SSLError)
/Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-io-1.16.4/lib/async/io/generic.rb:128:in `accept_nonblock'
/Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-io-1.16.4/lib/async/io/generic.rb:128:in `async_send'
/Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-io-1.16.4/lib/async/io/generic.rb:47:in `block in wrap_blocking_method'
/Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-io-1.16.4/lib/async/io/ssl_socket.rb:126:in `block in accept'
/Users/janko/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/async-1.10.3/lib/async/task.rb:74:in `block in initialize'
$ curl localhost:9292
curl: (56) Recv failure: Connection reset by peer

My environment:

$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17]

$ ruby -r openssl -e 'puts OpenSSL::VERSION, OpenSSL::OPENSSL_VERSION, OpenSSL::OPENSSL_LIBRARY_VERSION'
2.1.0
OpenSSL 1.0.2o  27 Mar 2018
OpenSSL 1.0.2p  14 Aug 2018

$ falcon -v
falcon v0.19.3

$ uname -a
Darwin Jankos-MacBook-Pro-2.local 18.0.0 Darwin Kernel Version 18.0.0: Wed Aug 22 20:13:40 PDT 2018; root:xnu-4903.201.2~1/RELEASE_X86_64 x86_64

use with sinatra and don't block

I'm using falcon with sinatra (set :server, %w[falcon] ) and trying to get it to handle multiple requests in a non blocking fashion.

I have this route:

get "/r/:name" do |name|
  r = R.do_all(name) # this is blocking for about a second
  r.to_json
end

I test it with:
ab -c 10 -n 10 http://localhost:4567/r/name
I would expect that to take about 1 second, but it takes about 10.

Is there something else I need to do to make it not block?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.