socketry / nio4r

Cross-platform asynchronous I/O primitives for scalable network clients and servers.
Other
967 stars 86 forks source link

Suspected regression on Ruby 2.6.x #261

Closed jasl closed 3 years ago

jasl commented 3 years ago

After 2.5.5 released, I found CocoaPods CI on macOS-bundled Ruby (Ruby 2.6.3) tests failed (see https://github.com/CocoaPods/Core/runs/1842161833?check_suite_focus=true#step:7:1645)

Bacon::Error: unexpected invocation: call(#<Async::Task:0x3d90 (failed)>, {:severity=>:error})
    /Users/runner/work/Core/Core/vendor/bundle/ruby/2.7.0/gems/console-1.10.1/lib/console/filter.rb:40:in `block (3 levels) in []': #versions - raises cumulative error when concurrent requests have errors
    /Users/runner/work/Core/Core/vendor/bundle/ruby/2.7.0/gems/async-http-0.54.1/lib/async/http/client.rb:86:in `close'
    /Users/runner/work/Core/Core/vendor/bundle/ruby/2.7.0/gems/webmock-3.11.1/lib/webmock/http_lib_adapters/async_http_client_adapter.rb:87:in `close'
    /Users/runner/work/Core/Core/vendor/bundle/ruby/2.7.0/gems/async-http-0.54.1/lib/async/http/internet.rb:65:in `each'
    /Users/runner/work/Core/Core/vendor/bundle/ruby/2.7.0/gems/async-http-0.54.1/lib/async/http/internet.rb:65:in `close'
    /Users/runner/work/Core/Core/lib/cocoapods-core/cdn_source.rb:161:in `ensure in versions'
    /Users/runner/work/Core/Core/lib/cocoapods-core/cdn_source.rb:161:in `versions'
    spec/cdn_source_spec.rb:291:in `block (4 levels) in <module:Pod>'
    spec/cdn_source_spec.rb:290:in `block (3 levels) in <module:Pod>'
    /Users/runner/work/Core/Core/spec/spec_helper.rb:104:in `call'
    /Users/runner/work/Core/Core/spec/spec_helper.rb:104:in `block in <class:Context>'
    spec/cdn_source_spec.rb:279:in `block (2 levels) in <module:Pod>'
    spec/cdn_source_spec.rb:130:in `block in <module:Pod>'
    spec/cdn_source_spec.rb:14:in `<module:Pod>'
    spec/cdn_source_spec.rb:13:in `<top (required)>'
    /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/cli/exec.rb:63:in `load'
    /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/cli/exec.rb:63:in `kernel_load'
    /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/cli/exec.rb:28:in `run'
    /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/cli.rb:494:in `exec'
    /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
    /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
    /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'
    /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/cli.rb:30:in `dispatch'
    /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start'
    /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/cli.rb:24:in `start'
    /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/exe/bundle:49:in `block in <top (required)>'
    /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/friendly_errors.rb:130:in `with_friendly_errors'
    /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/exe/bundle:37:in `<top (required)>'
    /usr/local/lib/ruby/gems/2.7.0/bin/bundle:23:in `load'
    /usr/local/lib/ruby/gems/2.7.0/bin/bundle:23:in `<main>'

It triggers here https://github.com/jasl/Core/blob/replace-typhoeus-to-async-http/lib/cocoapods-core/cdn_source.rb#L161 a normal http_client.close then goes into async-http https://github.com/socketry/async-http/blob/master/lib/async/http/client.rb#L86

It also reproducible on Ruby 2.6.5 (built via RVM), so I think it affect all x86 macOS Ruby 2.6.x.

Pure Ruby implemetation (by IO4R_PURE=true) works well

jasl commented 3 years ago

Update: nio4r 2.5.5 breaks async-http

jasl@localhost:~/Workspaces/Ruby/async-http on master$ ruby -v
ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-darwin19]
jasl@localhost:~/Workspaces/Ruby/async-http on master$ bundle exec rspec
...

Failures:

  1) Async::HTTP::Client can fetch remote resource
     Got 0 failures and 2 other errors:

     1.1) Failure/Error: endpoint.connect(&block)

          Async::Stop:
            Async::Stop
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/task.rb:66:in `yield'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/wrapper.rb:233:in `wait_for'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/wrapper.rb:139:in `wait_writable'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/generic.rb:222:in `async_send'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/socket.rb:52:in `connect'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/socket.rb:135:in `connect'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/host_endpoint.rb:59:in `block in connect'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/host_endpoint.rb:57:in `connect'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/ssl_endpoint.rb:92:in `connect'
          # ./lib/async/http/endpoint.rb:201:in `connect'
          # ./lib/async/http/client.rb:157:in `block in make_pool'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:201:in `create_resource'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:230:in `block in available_resource'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/semaphore.rb:80:in `acquire'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:211:in `available_resource'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:184:in `wait_for_resource'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:79:in `acquire'
          # ./lib/async/http/client.rb:104:in `call'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/protocol-http-0.21.0/lib/protocol/http/methods.rb:55:in `block (2 levels) in <class:Methods>'
          # ./spec/async/http/client/google_spec.rb:31:in `block (2 levels) in <top (required)>'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:92:in `block (3 levels) in <module:RSpec>'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:61:in `block (2 levels) in run_in_reactor'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/task.rb:265:in `block in make_fiber'

     1.2) Failure/Error: raise TimeoutError, "run time exceeded duration #{duration}s:\r\n#{buffer.string}"

          Async::TimeoutError:
            run time exceeded duration 5s:
            #<Async::Reactor:0x3fc3bdc0fd1c 2 children (running)>
                #<Async::Task:0x3fc3bdc15898 timer task duration=5 (running)>
                #<Async::Task:0x3fc3bdc29a00 RSpec::ExampleGroups::AsyncHTTPClient (running)>
                    #<Async::Task:0x3fc3bdc3939c connecting to #<Addrinfo: 75.126.115.192:443 TCP (www.google.com)> (running)>
                        #<Async::Task:0x3fc3b5c1b840 transient (running)>
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:51:in `block in run_in_reactor'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/task.rb:265:in `block in make_fiber'

  2) Async::HTTP::Protocol::HTTP10 behaves like Async::HTTP::Proxy proxied client can get insecure website
     Got 0 failures and 2 other errors:
     Shared Example Group: Async::HTTP::Proxy called from ./spec/async/http/proxy_spec.rb:254

     2.1) Failure/Error: @stream.read_until(CRLF) or raise EOFError, "Could not read line!"

          Async::Stop:
            Async::Stop
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/task.rb:66:in `yield'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/wrapper.rb:233:in `wait_for'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/wrapper.rb:124:in `wait_readable'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/generic.rb:220:in `async_send'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/generic.rb:69:in `block in wrap_blocking_method'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/stream.rb:261:in `fill_read_buffer'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/stream.rb:131:in `read_until'
          # ./lib/async/http/protocol/http1/connection.rb:56:in `read_line'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/protocol-http1-0.13.2/lib/protocol/http1/connection.rb:201:in `read_response'
          # ./lib/async/http/protocol/http1/response.rb:31:in `read'
          # ./lib/async/http/protocol/http1/client.rb:75:in `call'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/protocol-http-0.21.0/lib/protocol/http/request.rb:53:in `call'
          # ./lib/async/http/client.rb:143:in `make_response'
          # ./lib/async/http/client.rb:106:in `call'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/protocol-http-0.21.0/lib/protocol/http/methods.rb:55:in `block (2 levels) in <class:Methods>'
          # ./spec/async/http/proxy_spec.rb:190:in `block (3 levels) in <top (required)>'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:92:in `block (3 levels) in <module:RSpec>'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:61:in `block (2 levels) in run_in_reactor'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/task.rb:265:in `block in make_fiber'

     2.2) Failure/Error: raise TimeoutError, "run time exceeded duration #{duration}s:\r\n#{buffer.string}"

          Async::TimeoutError:
            run time exceeded duration 10s:
            #<Async::Reactor:0x3fc3bdc15eb0 2 children (running)>
                #<Async::Task:0x3fc3b5c13b54 timer task duration=10 (running)>
                #<Async::Task:0x3fc3ce073880 RSpec::ExampleGroups::AsyncHTTPProtocolHTTP10_2::BehavesLikeAsyncHTTPProxy::ProxiedClient_2 (running)>
                    #<Async::Task:0x3fc3ddc1c45c connected to #<Addrinfo: 127.0.0.1:9294 TCP> [fd=15] (running)>
                        #<Async::Task:0x3fc3d5c1329c (complete)>
                            #<Async::Task:0x3fc3e60188dc accepting connections #<Addrinfo: 127.0.0.1:9294 TCP> [fd=14] (running)>
                                #<Async::Task:0x3fc3f60ada08 connecting to #<Addrinfo: 75.126.115.192:80 TCP (www.google.com)> (running)>
                        #<Async::Task:0x3fc3f6090cf0 transient (running)>
                        #<Async::Task:0x3fc3f6099a80 transient (running)>
                        #<Async::Task:0x3fc3f60a054c Tunnelling body. (running)>
                        #<Async::Task:0x3fc3ce08fdc8 transient Async::HTTP::Body::Pipe writer. (running)>
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:51:in `block in run_in_reactor'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/task.rb:265:in `block in make_fiber'

  3) Async::HTTP::Protocol::HTTP10 behaves like Async::HTTP::Proxy proxied client can get secure website
     Got 0 failures and 2 other errors:
     Shared Example Group: Async::HTTP::Proxy called from ./spec/async/http/proxy_spec.rb:254

     3.1) Failure/Error: endpoint.connect(&block)

          Async::Stop:
            Async::Stop
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/task.rb:66:in `yield'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/wrapper.rb:233:in `wait_for'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/wrapper.rb:124:in `wait_readable'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/generic.rb:220:in `async_send'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/generic.rb:62:in `block in wrap_blocking_method'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/ssl_socket.rb:47:in `connect'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/ssl_endpoint.rb:92:in `connect'
          # ./lib/async/http/endpoint.rb:201:in `connect'
          # ./lib/async/http/client.rb:157:in `block in make_pool'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:201:in `create_resource'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:230:in `block in available_resource'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/semaphore.rb:80:in `acquire'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:211:in `available_resource'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:184:in `wait_for_resource'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:79:in `acquire'
          # ./lib/async/http/client.rb:104:in `call'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/protocol-http-0.21.0/lib/protocol/http/methods.rb:55:in `block (2 levels) in <class:Methods>'
          # ./spec/async/http/proxy_spec.rb:207:in `block (3 levels) in <top (required)>'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:92:in `block (3 levels) in <module:RSpec>'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:61:in `block (2 levels) in run_in_reactor'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/task.rb:265:in `block in make_fiber'

     3.2) Failure/Error: raise LeakError, @monitors.values

          Async::Debug::LeakError:
            Trying to close selector with active monitors: [#<Async::Debug::Monitor io=#<OpenSSL::SSL::SSLSocket:0x00007f879c11ef60 @context=#<OpenSSL::SSL::SSLContext:0x00007f87eb826bd8 @max_proto_version=nil, @min_proto_version=769, @verify_mode=1, @verify_hostname=true, @cert_store=#<OpenSSL::X509::Store:0x00007f875d1b26a0 @verify_callback=nil, @error=nil, @error_string=nil, @chain=nil, @time=nil>, @alpn_protocols=["h2", "http/1.1", "http/1.0"]>, @io=#<Socket:fd 19>, @eof=false, @rbuffer="", @sync=true, @sync_close=true, @hostname="www.google.com"> interests=nil readiness=nil>]! This may cause your socket or file descriptor to leak.
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/debug/selector.rb:78:in `close'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/reactor.rb:315:in `close'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:95:in `ensure in block (2 levels) in <module:RSpec>'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:95:in `block (2 levels) in <module:RSpec>'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/rspec-files-1.1.0/lib/rspec/files/leaks.rb:47:in `block (2 levels) in <module:Files>'
          # ------------------
          # --- Caused by: ---
          # Async::TimeoutError:
          #   run time exceeded duration 10s:
          #   #<Async::Reactor:0x3fc3bdc0e020 2 children (running)>
          #     #<Async::Task:0x3fc3b5c0e564 timer task duration=10 (running)>
          #     #<Async::Task:0x3fc3ce04bd08 RSpec::ExampleGroups::AsyncHTTPProtocolHTTP10_2::BehavesLikeAsyncHTTPProxy::ProxiedClient_2 (running)>
          #         #<Async::Task:0x3fc3ce073560 connected to #<Addrinfo: 127.0.0.1:9294 TCP> [fd=15] (running)>
          #             #<Async::Task:0x3fc3f6088a8c (complete)>
          #                 #<Async::Task:0x3fc3d5c1f808 accepting connections #<Addrinfo: 127.0.0.1:9294 TCP> [fd=14] (running)>
          #                     #<Async::Task:0x3fc3f60a5498 connecting to #<Addrinfo: 75.126.115.192:443 TCP (www.google.com)> (running)>
          #             #<Async::Task:0x3fc3f5c1a1a8 transient (running)>
          #             #<Async::Task:0x3fc3f60959e4 transient (running)>
          #             #<Async::Task:0x3fc3f60a158c Tunnelling body. (running)>
          #             #<Async::Task:0x3fc3ce08a4a4 transient Async::HTTP::Body::Pipe writer. (running)>
          #   /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:51:in `block in run_in_reactor'

  4) Async::HTTP::Protocol::HTTP10 behaves like Async::HTTP::Proxy proxied client authorization header required request includes headers succeeds
     Got 0 failures and 2 other errors:
     Shared Example Group: Async::HTTP::Proxy called from ./spec/async/http/proxy_spec.rb:254

     4.1) Failure/Error: endpoint.connect(&block)

          Async::Stop:
            Async::Stop
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/task.rb:66:in `yield'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/wrapper.rb:233:in `wait_for'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/wrapper.rb:124:in `wait_readable'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/generic.rb:220:in `async_send'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/generic.rb:62:in `block in wrap_blocking_method'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/ssl_socket.rb:47:in `connect'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/ssl_endpoint.rb:92:in `connect'
          # ./lib/async/http/endpoint.rb:201:in `connect'
          # ./lib/async/http/client.rb:157:in `block in make_pool'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:201:in `create_resource'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:230:in `block in available_resource'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/semaphore.rb:80:in `acquire'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:211:in `available_resource'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:184:in `wait_for_resource'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:79:in `acquire'
          # ./lib/async/http/client.rb:104:in `call'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/protocol-http-0.21.0/lib/protocol/http/methods.rb:55:in `block (2 levels) in <class:Methods>'
          # ./spec/async/http/proxy_spec.rb:227:in `block (5 levels) in <top (required)>'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:92:in `block (3 levels) in <module:RSpec>'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:61:in `block (2 levels) in run_in_reactor'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/task.rb:265:in `block in make_fiber'

     4.2) Failure/Error: raise LeakError, @monitors.values

          Async::Debug::LeakError:
            Trying to close selector with active monitors: [#<Async::Debug::Monitor io=#<OpenSSL::SSL::SSLSocket:0x00007f879c11c0a8 @context=#<OpenSSL::SSL::SSLContext:0x00007f87eb825198 @max_proto_version=nil, @min_proto_version=769, @verify_mode=1, @verify_hostname=true, @cert_store=#<OpenSSL::X509::Store:0x00007f875d1b26a0 @verify_callback=nil, @error=nil, @error_string=nil, @chain=nil, @time=nil>, @alpn_protocols=["h2", "http/1.1", "http/1.0"]>, @io=#<Socket:fd 19>, @eof=false, @rbuffer="", @sync=true, @sync_close=true, @hostname="www.google.com"> interests=nil readiness=nil>]! This may cause your socket or file descriptor to leak.
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/debug/selector.rb:78:in `close'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/reactor.rb:315:in `close'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:95:in `ensure in block (2 levels) in <module:RSpec>'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:95:in `block (2 levels) in <module:RSpec>'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/rspec-files-1.1.0/lib/rspec/files/leaks.rb:47:in `block (2 levels) in <module:Files>'
          # ------------------
          # --- Caused by: ---
          # Async::TimeoutError:
          #   run time exceeded duration 10s:
          #   #<Async::Reactor:0x3fc3bdc0e020 2 children (running)>
          #     #<Async::Task:0x3fc3b5c0e564 timer task duration=10 (running)>
          #     #<Async::Task:0x3fc3ce04bd08 RSpec::ExampleGroups::AsyncHTTPProtocolHTTP10_2::BehavesLikeAsyncHTTPProxy::ProxiedClient_2::AuthorizationHeaderRequired::RequestIncludesHeaders (running)>
          #         #<Async::Task:0x3fc3ce073560 connected to #<Addrinfo: 127.0.0.1:9294 TCP> [fd=15] (running)>
          #             #<Async::Task:0x3fc3f6088c1c (complete)>
          #                 #<Async::Task:0x3fc3d5c1b8c0 accepting connections #<Addrinfo: 127.0.0.1:9294 TCP> [fd=14] (running)>
          #                     #<Async::Task:0x3fc3f60a50ec connecting to #<Addrinfo: 75.126.115.192:443 TCP (www.google.com)> (running)>
          #             #<Async::Task:0x3fc3f6091e0c transient (running)>
          #             #<Async::Task:0x3fc3f6095660 transient (running)>
          #             #<Async::Task:0x3fc3f60a0bdc Tunnelling body. (running)>
          #             #<Async::Task:0x3fc3ae83415c transient Async::HTTP::Body::Pipe writer. (running)>
          #   /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:51:in `block in run_in_reactor'

  5) Async::HTTP::Protocol::HTTP11 behaves like Async::HTTP::Proxy proxied client can get insecure website
     Got 0 failures and 2 other errors:
     Shared Example Group: Async::HTTP::Proxy called from ./spec/async/http/proxy_spec.rb:258

     5.1) Failure/Error: @stream.read_until(CRLF) or raise EOFError, "Could not read line!"

          Async::Stop:
            Async::Stop
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/task.rb:66:in `yield'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/wrapper.rb:233:in `wait_for'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/wrapper.rb:124:in `wait_readable'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/generic.rb:220:in `async_send'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/generic.rb:69:in `block in wrap_blocking_method'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/stream.rb:261:in `fill_read_buffer'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/stream.rb:131:in `read_until'
          # ./lib/async/http/protocol/http1/connection.rb:56:in `read_line'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/protocol-http1-0.13.2/lib/protocol/http1/connection.rb:201:in `read_response'
          # ./lib/async/http/protocol/http1/response.rb:31:in `read'
          # ./lib/async/http/protocol/http1/client.rb:75:in `call'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/protocol-http-0.21.0/lib/protocol/http/request.rb:53:in `call'
          # ./lib/async/http/client.rb:143:in `make_response'
          # ./lib/async/http/client.rb:106:in `call'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/protocol-http-0.21.0/lib/protocol/http/methods.rb:55:in `block (2 levels) in <class:Methods>'
          # ./spec/async/http/proxy_spec.rb:190:in `block (3 levels) in <top (required)>'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:92:in `block (3 levels) in <module:RSpec>'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:61:in `block (2 levels) in run_in_reactor'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/task.rb:265:in `block in make_fiber'

     5.2) Failure/Error: raise TimeoutError, "run time exceeded duration #{duration}s:\r\n#{buffer.string}"

          Async::TimeoutError:
            run time exceeded duration 10s:
            #<Async::Reactor:0x3fc3bdc15be0 2 children (running)>
                #<Async::Task:0x3fc3b5c13b54 timer task duration=10 (running)>
                #<Async::Task:0x3fc3ce07719c RSpec::ExampleGroups::AsyncHTTPProtocolHTTP11_2::BehavesLikeAsyncHTTPProxy::ProxiedClient_2 (running)>
                    #<Async::Task:0x3fc3f60759f0 connected to #<Addrinfo: 127.0.0.1:9294 TCP> [fd=15] (running)>
                        #<Async::Task:0x3fc3d5c12040 (complete)>
                            #<Async::Task:0x3fc3f5c17c14 accepting connections #<Addrinfo: 127.0.0.1:9294 TCP> [fd=14] (running)>
                                #<Async::Task:0x3fc3f60b5514 connecting to #<Addrinfo: 75.126.115.192:80 TCP (www.google.com)> (running)>
                        #<Async::Task:0x3fc3f6099bd4 transient (running)>
                        #<Async::Task:0x3fc3f609dc84 transient (running)>
                        #<Async::Task:0x3fc3f60ada1c Tunnelling body. (running)>
                        #<Async::Task:0x3fc3ce092e24 transient Async::HTTP::Body::Pipe writer. (running)>
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:51:in `block in run_in_reactor'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/task.rb:265:in `block in make_fiber'

  6) Async::HTTP::Protocol::HTTP11 behaves like Async::HTTP::Proxy proxied client can get secure website
     Got 0 failures and 2 other errors:
     Shared Example Group: Async::HTTP::Proxy called from ./spec/async/http/proxy_spec.rb:258

     6.1) Failure/Error: endpoint.connect(&block)

          Async::Stop:
            Async::Stop
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/task.rb:66:in `yield'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/wrapper.rb:233:in `wait_for'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/wrapper.rb:124:in `wait_readable'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/generic.rb:220:in `async_send'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/generic.rb:62:in `block in wrap_blocking_method'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/ssl_socket.rb:47:in `connect'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/ssl_endpoint.rb:92:in `connect'
          # ./lib/async/http/endpoint.rb:201:in `connect'
          # ./lib/async/http/client.rb:157:in `block in make_pool'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:201:in `create_resource'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:230:in `block in available_resource'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/semaphore.rb:80:in `acquire'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:211:in `available_resource'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:184:in `wait_for_resource'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:79:in `acquire'
          # ./lib/async/http/client.rb:104:in `call'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/protocol-http-0.21.0/lib/protocol/http/methods.rb:55:in `block (2 levels) in <class:Methods>'
          # ./spec/async/http/proxy_spec.rb:207:in `block (3 levels) in <top (required)>'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:92:in `block (3 levels) in <module:RSpec>'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:61:in `block (2 levels) in run_in_reactor'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/task.rb:265:in `block in make_fiber'

     6.2) Failure/Error: raise LeakError, @monitors.values

          Async::Debug::LeakError:
            Trying to close selector with active monitors: [#<Async::Debug::Monitor io=#<OpenSSL::SSL::SSLSocket:0x00007f879c125b80 @context=#<OpenSSL::SSL::SSLContext:0x00007f87eb82c650 @max_proto_version=nil, @min_proto_version=769, @verify_mode=1, @verify_hostname=true, @cert_store=#<OpenSSL::X509::Store:0x00007f875d1b26a0 @verify_callback=nil, @error=nil, @error_string=nil, @chain=nil, @time=nil>, @alpn_protocols=["h2", "http/1.1", "http/1.0"]>, @io=#<Socket:fd 19>, @eof=false, @rbuffer="", @sync=true, @sync_close=true, @hostname="www.google.com"> interests=nil readiness=nil>]! This may cause your socket or file descriptor to leak.
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/debug/selector.rb:78:in `close'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/reactor.rb:315:in `close'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:95:in `ensure in block (2 levels) in <module:RSpec>'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:95:in `block (2 levels) in <module:RSpec>'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/rspec-files-1.1.0/lib/rspec/files/leaks.rb:47:in `block (2 levels) in <module:Files>'
          # ------------------
          # --- Caused by: ---
          # Async::TimeoutError:
          #   run time exceeded duration 10s:
          #   #<Async::Reactor:0x3fc3bdc15eb0 2 children (running)>
          #     #<Async::Task:0x3fc3b5c0e1a4 timer task duration=10 (running)>
          #     #<Async::Task:0x3fc3ce06e13c RSpec::ExampleGroups::AsyncHTTPProtocolHTTP11_2::BehavesLikeAsyncHTTPProxy::ProxiedClient_2 (running)>
          #         #<Async::Task:0x3fc3ce076ff8 connected to #<Addrinfo: 127.0.0.1:9294 TCP> [fd=15] (running)>
          #             #<Async::Task:0x3fc3f608cc04 (complete)>
          #                 #<Async::Task:0x3fc3e6011028 accepting connections #<Addrinfo: 127.0.0.1:9294 TCP> [fd=14] (running)>
          #                     #<Async::Task:0x3fc3f60b1298 connecting to #<Addrinfo: 75.126.115.192:443 TCP (www.google.com)> (running)>
          #             #<Async::Task:0x3fc3f6095bc4 transient (running)>
          #             #<Async::Task:0x3fc3f609933c transient (running)>
          #             #<Async::Task:0x3fc3f60a54e8 Tunnelling body. (running)>
          #             #<Async::Task:0x3fc3ce0936e4 transient Async::HTTP::Body::Pipe writer. (running)>
          #   /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:51:in `block in run_in_reactor'

  7) Async::HTTP::Protocol::HTTP11 behaves like Async::HTTP::Proxy proxied client authorization header required request includes headers succeeds
     Got 0 failures and 2 other errors:
     Shared Example Group: Async::HTTP::Proxy called from ./spec/async/http/proxy_spec.rb:258

     7.1) Failure/Error: endpoint.connect(&block)

          Async::Stop:
            Async::Stop
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/task.rb:66:in `yield'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/wrapper.rb:233:in `wait_for'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/wrapper.rb:124:in `wait_readable'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/generic.rb:220:in `async_send'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/generic.rb:62:in `block in wrap_blocking_method'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/ssl_socket.rb:47:in `connect'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/ssl_endpoint.rb:92:in `connect'
          # ./lib/async/http/endpoint.rb:201:in `connect'
          # ./lib/async/http/client.rb:157:in `block in make_pool'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:201:in `create_resource'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:230:in `block in available_resource'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/semaphore.rb:80:in `acquire'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:211:in `available_resource'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:184:in `wait_for_resource'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:79:in `acquire'
          # ./lib/async/http/client.rb:104:in `call'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/protocol-http-0.21.0/lib/protocol/http/methods.rb:55:in `block (2 levels) in <class:Methods>'
          # ./spec/async/http/proxy_spec.rb:227:in `block (5 levels) in <top (required)>'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:92:in `block (3 levels) in <module:RSpec>'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:61:in `block (2 levels) in run_in_reactor'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/task.rb:265:in `block in make_fiber'

     7.2) Failure/Error: raise LeakError, @monitors.values

          Async::Debug::LeakError:
            Trying to close selector with active monitors: [#<Async::Debug::Monitor io=#<OpenSSL::SSL::SSLSocket:0x00007f879c125478 @context=#<OpenSSL::SSL::SSLContext:0x00007f87eb836e20 @max_proto_version=nil, @min_proto_version=769, @verify_mode=1, @verify_hostname=true, @cert_store=#<OpenSSL::X509::Store:0x00007f875d1b26a0 @verify_callback=nil, @error=nil, @error_string=nil, @chain=nil, @time=nil>, @alpn_protocols=["h2", "http/1.1", "http/1.0"]>, @io=#<Socket:fd 19>, @eof=false, @rbuffer="", @sync=true, @sync_close=true, @hostname="www.google.com"> interests=nil readiness=nil>]! This may cause your socket or file descriptor to leak.
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/debug/selector.rb:78:in `close'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/reactor.rb:315:in `close'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:95:in `ensure in block (2 levels) in <module:RSpec>'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:95:in `block (2 levels) in <module:RSpec>'
          # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/rspec-files-1.1.0/lib/rspec/files/leaks.rb:47:in `block (2 levels) in <module:Files>'
          # ------------------
          # --- Caused by: ---
          # Async::TimeoutError:
          #   run time exceeded duration 10s:
          #   #<Async::Reactor:0x3fc3bdc15eb0 2 children (running)>
          #     #<Async::Task:0x3fc3b5c0e1a4 timer task duration=10 (running)>
          #     #<Async::Task:0x3fc3ce06e13c RSpec::ExampleGroups::AsyncHTTPProtocolHTTP11_2::BehavesLikeAsyncHTTPProxy::ProxiedClient_2::AuthorizationHeaderRequired::RequestIncludesHeaders (running)>
          #         #<Async::Task:0x3fc3ce076ff8 connected to #<Addrinfo: 127.0.0.1:9294 TCP> [fd=15] (running)>
          #             #<Async::Task:0x3fc3f608cc40 (complete)>
          #                 #<Async::Task:0x3fc3e6011564 accepting connections #<Addrinfo: 127.0.0.1:9294 TCP> [fd=14] (running)>
          #                     #<Async::Task:0x3fc3f60b5bcc connecting to #<Addrinfo: 75.126.115.192:443 TCP (www.google.com)> (running)>
          #             #<Async::Task:0x3fc3f6095854 transient (running)>
          #             #<Async::Task:0x3fc3f6098e8c transient (running)>
          #             #<Async::Task:0x3fc3f60a518c Tunnelling body. (running)>
          #             #<Async::Task:0x3fc3ce093040 transient Async::HTTP::Body::Pipe writer. (running)>
          #   /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:51:in `block in run_in_reactor'

  8) Async::HTTP::Protocol::HTTP2 behaves like Async::HTTP::Proxy proxied client can get insecure website
     Failure/Error: @stream.read_until(CRLF) or raise EOFError, "Could not read line!"

     EOFError:
       Could not read line!
     Shared Example Group: Async::HTTP::Proxy called from ./spec/async/http/proxy_spec.rb:262
     # ./lib/async/http/protocol/http1/connection.rb:56:in `read_line'
     # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/protocol-http1-0.13.2/lib/protocol/http1/connection.rb:201:in `read_response'
     # ./lib/async/http/protocol/http1/response.rb:31:in `read'
     # ./lib/async/http/protocol/http1/client.rb:75:in `call'
     # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/protocol-http-0.21.0/lib/protocol/http/request.rb:53:in `call'
     # ./lib/async/http/client.rb:143:in `make_response'
     # ./lib/async/http/client.rb:106:in `call'
     # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/protocol-http-0.21.0/lib/protocol/http/methods.rb:55:in `block (2 levels) in <class:Methods>'
     # ./spec/async/http/proxy_spec.rb:190:in `block (3 levels) in <top (required)>'
     # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:92:in `block (3 levels) in <module:RSpec>'
     # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:61:in `block (2 levels) in run_in_reactor'
     # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/task.rb:265:in `block in make_fiber'

  9) Async::HTTP::Protocol::HTTP2 behaves like Async::HTTP::Proxy proxied client can get secure website
     Failure/Error: endpoint.connect(&block)

     OpenSSL::SSL::SSLError:
       SSL_connect SYSCALL returned=5 errno=0 state=SSLv3/TLS write client hello
     Shared Example Group: Async::HTTP::Proxy called from ./spec/async/http/proxy_spec.rb:262
     # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/generic.rb:216:in `connect_nonblock'
     # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/generic.rb:216:in `async_send'
     # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/generic.rb:62:in `block in wrap_blocking_method'
     # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/ssl_socket.rb:47:in `connect'
     # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/ssl_endpoint.rb:92:in `connect'
     # ./lib/async/http/endpoint.rb:201:in `connect'
     # ./lib/async/http/client.rb:157:in `block in make_pool'
     # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:201:in `create_resource'
     # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:230:in `block in available_resource'
     # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/semaphore.rb:80:in `acquire'
     # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:211:in `available_resource'
     # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:184:in `wait_for_resource'
     # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:79:in `acquire'
     # ./lib/async/http/client.rb:104:in `call'
     # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/protocol-http-0.21.0/lib/protocol/http/methods.rb:55:in `block (2 levels) in <class:Methods>'
     # ./spec/async/http/proxy_spec.rb:207:in `block (3 levels) in <top (required)>'
     # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:92:in `block (3 levels) in <module:RSpec>'
     # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:61:in `block (2 levels) in run_in_reactor'
     # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/task.rb:265:in `block in make_fiber'

  10) Async::HTTP::Protocol::HTTP2 behaves like Async::HTTP::Proxy proxied client authorization header required request includes headers succeeds
      Failure/Error: endpoint.connect(&block)

      OpenSSL::SSL::SSLError:
        SSL_connect SYSCALL returned=5 errno=0 state=SSLv3/TLS write client hello
      Shared Example Group: Async::HTTP::Proxy called from ./spec/async/http/proxy_spec.rb:262
      # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/generic.rb:216:in `connect_nonblock'
      # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/generic.rb:216:in `async_send'
      # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/generic.rb:62:in `block in wrap_blocking_method'
      # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/ssl_socket.rb:47:in `connect'
      # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-io-1.30.1/lib/async/io/ssl_endpoint.rb:92:in `connect'
      # ./lib/async/http/endpoint.rb:201:in `connect'
      # ./lib/async/http/client.rb:157:in `block in make_pool'
      # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:201:in `create_resource'
      # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:230:in `block in available_resource'
      # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/semaphore.rb:80:in `acquire'
      # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:211:in `available_resource'
      # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:184:in `wait_for_resource'
      # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-pool-0.3.3/lib/async/pool/controller.rb:79:in `acquire'
      # ./lib/async/http/client.rb:104:in `call'
      # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/protocol-http-0.21.0/lib/protocol/http/methods.rb:55:in `block (2 levels) in <class:Methods>'
      # ./spec/async/http/proxy_spec.rb:227:in `block (5 levels) in <top (required)>'
      # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:92:in `block (3 levels) in <module:RSpec>'
      # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-rspec-1.15.0/lib/async/rspec/reactor.rb:61:in `block (2 levels) in run_in_reactor'
      # /Users/jasl/.rvm/gems/ruby-2.6.5/gems/async-1.28.5/lib/async/task.rb:265:in `block in make_fiber'

Finished in 1 minute 39.01 seconds (files took 0.83916 seconds to load)
188 examples, 10 failures

Failed examples:

rspec ./spec/async/http/client/google_spec.rb:30 # Async::HTTP::Client can fetch remote resource
rspec './spec/async/http/proxy_spec.rb[1:1:5:1]' # Async::HTTP::Protocol::HTTP10 behaves like Async::HTTP::Proxy proxied client can get insecure website
rspec './spec/async/http/proxy_spec.rb[1:1:5:2]' # Async::HTTP::Protocol::HTTP10 behaves like Async::HTTP::Proxy proxied client can get secure website
rspec './spec/async/http/proxy_spec.rb[1:1:5:3:1:1]' # Async::HTTP::Protocol::HTTP10 behaves like Async::HTTP::Proxy proxied client authorization header required request includes headers succeeds
rspec './spec/async/http/proxy_spec.rb[2:1:5:1]' # Async::HTTP::Protocol::HTTP11 behaves like Async::HTTP::Proxy proxied client can get insecure website
rspec './spec/async/http/proxy_spec.rb[2:1:5:2]' # Async::HTTP::Protocol::HTTP11 behaves like Async::HTTP::Proxy proxied client can get secure website
rspec './spec/async/http/proxy_spec.rb[2:1:5:3:1:1]' # Async::HTTP::Protocol::HTTP11 behaves like Async::HTTP::Proxy proxied client authorization header required request includes headers succeeds
rspec './spec/async/http/proxy_spec.rb[3:1:5:1]' # Async::HTTP::Protocol::HTTP2 behaves like Async::HTTP::Proxy proxied client can get insecure website
rspec './spec/async/http/proxy_spec.rb[3:1:5:2]' # Async::HTTP::Protocol::HTTP2 behaves like Async::HTTP::Proxy proxied client can get secure website
rspec './spec/async/http/proxy_spec.rb[3:1:5:3:1:1]' # Async::HTTP::Protocol::HTTP2 behaves like Async::HTTP::Proxy proxied client authorization header required request includes headers succeeds
ioquatix commented 3 years ago

I'll check what is going on. There are many issue with Ruby 3, including async-io. I'm trying to work through it.

ioquatix commented 3 years ago

Can you please try the latest releases (bundle update) and see if this is still an issue? I tried to reproduce and couldn't with latest versions.

ioquatix commented 3 years ago

Ohhh, this is on macOS only - okay I'll try it there.

ioquatix commented 3 years ago

Can you please try the latest release and report back?

jasl commented 3 years ago
1281 specifications (2330 requirements), 0 failures, 0 errors

--------------------------------------------------------------------------------
Checking code style...
--------------------------------------------------------------------------------

warning: parser/current is loading parser/ruby26, which recognizes
warning: 2.6.6-compliant syntax, but you are running 2.6.3.
warning: please see https://github.com/whitequark/parser#compatibility-with-ruby-mri.
Running RuboCop...
Inspecting 81 files
.................................................................................

81 files inspected, no offenses detected
Warning: the running version of Bundler (2.2.5) is older than the version that created the lockfile (2.2.8). We suggest you to upgrade to the version that created the lockfile by running `gem install bundler:2.2.8`.
jasl@localhost:~/Workspaces/Ruby/Core on replace-typhoeus-to-async-http$ ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [universal.arm64e-darwin20]
jasl@localhost:~/Workspaces/Ruby/Core on replace-typhoeus-to-async-http$ bundle list | grep nio4r
Warning: the running version of Bundler (2.2.5) is older than the version that created the lockfile (2.2.8). We suggest you to upgrade to the version that created the lockfile by running `gem install bundler:2.2.8`.
  * nio4r (2.5.7)

It works, thank you!

ioquatix commented 3 years ago

Thanks for the detailed response!