Odd, so using IO#wait_*able methods doesn't work for you, but
IO.select does?  Can you try the following patch?

It's basically your patch with "writable" spelled correctly:

```
diff --git a/lib/webrick/server.rb b/lib/webrick/server.rb
index 2d678273e5..25d507b67d 100644
--- a/lib/webrick/server.rb
+++ b/lib/webrick/server.rb
@@ -299,8 +299,10 @@ def start_thread(sock, &block)
               # we must call OpenSSL::SSL::SSLSocket#accept_nonblock until
               # it stop returning wait_* symbols:
               case ret = sock.accept_nonblock(exception: false)
-              when :wait_readable, :wait_writable
-                sock.to_io.__send__(ret)
+              when :wait_readable
+                IO.select([sock])
+              when :wait_writable
+                IO.select(nil, [sock])
               else
                 break
               end while true
```

I guess your original didn't loop on "while true", either, but
it really should (to properly finish the negotiation).  There's
also no need to call .to_io with IO.select, as it's already done
transparently.

(The reason I favor IO#wait_readable and IO#wait_writable is
 it is optimized under Linux)

I won't be using proprietary services like GitHub, so I'll let
you handle the testing.  Can you repeat this failure on a local
machine or using something like ssh?

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>