* temporary workaround for https://bugs.ruby-lang.org/issues/13632
Purging interrupt queue if IOError was caught.
* fixing only if mri
* optimization to avoid redundant checks in empty queue
* scoping fix to only affected versions
* serving ruby version from mkmf
* safe invoking for the workaround
* switching to preprocessor vars
* purging queue on runtime error
* rubocop fix
* covering workaround
* improving names
* styling
* rubocop fixes
* improved test reporting
* wording
* condition
* improving comment
* bugfix moved to separate gem: https://rubygems.org/gems/stopgap_13632
* using stopgap_13632 in gemfile to fix the builds
* requiring stopgap for tests
Otherwise I continuously get the error
```
Error in reactor loop escaped: uninitialized constant
Puma::MiniSSL::SSLError (NameError)
/path/to/puma-2.12.2-java/lib/puma/reactor.rb:72:in `block in run_internal'
/path/to/puma-2.12.2-java/lib/puma/reactor.rb:41:in `each'
/path/to/puma-2.12.2-java/lib/puma/reactor.rb:41:in `run_internal'
/path/to/puma-2.12.2-java/lib/puma/reactor.rb:137:in `block in run_in_thread'
```
It does not seem to affect functionality but it's annoying.
Previously, the app thread would be in charge of reading the request
directly from the client. This resulted in a set of slow clients being
able to completely starve the app thread pool and prevent any further
connections from being handled.
This new organization uses a seperate reactor thread that is in charge
of responding when a client has more data, buffering the data and
attempting to parse the data. When the data represents a fully realized
request, only then is it handed to the app thread pool. This means we
trust apps to not starve the pool, but don't trust clients.