socketry / falcon Goto Github PK
View Code? Open in Web Editor NEWA high-performance web server for Ruby, supporting HTTP/1, HTTP/2 and TLS.
Home Page: https://socketry.github.io/falcon/
License: MIT License
A high-performance web server for Ruby, supporting HTTP/1, HTTP/2 and TLS.
Home Page: https://socketry.github.io/falcon/
License: MIT License
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.
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?
I think spaces is better for more developer.
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,
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.
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
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?
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)
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?
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?
Hello,
it would be nice if a changelog has been available. It's not easy to read all commits, and some summary of changes is always better than this.
I like the puma changelog https://github.com/puma/puma/blob/master/History.md
Is it possible to have in the falcon repository?
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'
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:
falcon/lib/falcon/adapters/rack.rb
Line 170 in c6e243c
Is this a missed method update in the hijack refactoring you've been doing, or has something else changed I'm not aware of?
The Rack specification says that the #gets
method should behave like IO#gets
, but currently it just retrieves the whole request body. I don't know who uses that method in the first place (I always use #read
), but I thought it would be good to make Falcon fully Rack-compliant.
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?
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.
The documentation regarding thread safety isn't sufficient and this sometimes causes Rails apps to deadlock.
As discussed here: #4
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.
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.
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.
To reproduce, I run falcon
with the following config.ru
:
https://gist.github.com/julik/477b0b13edbef798b34ba22cc99391e6
When the request gets processed a number of times, and I issue Ctrl+C in the terminal where Falcon is running, MRI crashes in enumerator.
https://gist.github.com/julik/c4dd842f035b0aa824fcc6ae7b01a56f
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 🤔
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.
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?
Any plan to add WebSocket support?
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?
The “Host” header is missing from the request headers when the application is served by Falcon.
This is likely due to async-http
stripping it away in https://github.com/socketry/async-http/blob/f8ead57a4b545aea69df312124b682f7762b7ee4/lib/async/http/protocol/http11.rb#L217
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
.
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.
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:
THX
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?
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.
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?
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
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?
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)
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.
Hi :)
Zero-downtime restart has always been a PITA in both Unicorn and Puma.
What's Falcon's story?
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".
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
I am not sure exactly why, but it seems like when there are multiple Set-Cookie
headers, only the first one gets through to the client.
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'
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).
#181
.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)
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 :
2.6.1
5.2.2
0.30.0
Thank you.
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)
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!
?
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'
I tried to load the interactive online tutorial in Chrome and Firefox on macOS, - both were failed to load, the windows were overlapped and the button"Start Scenario" had no effect:
There were no errors in the browser's console either. What is wrong with that?
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]
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.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.