We don't want to wait on GC to reap sockets on errors,
generational GC in Ruby is less aggressive about reaping
long-lived objects such as long-lived HTTP connections.
---
lib/yahns/proxy_http_response.rb | 7 ++++++-
lib/yahns/proxy_pass.rb | 5 +++--
2 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/lib/yahns/proxy_http_response.rb b/lib/yahns/proxy_http_response.rb
index 3462e40..c5e7be5 100644
--- a/lib/yahns/proxy_http_response.rb
+++ b/lib/yahns/proxy_http_response.rb
@@ -43,7 +43,12 @@ def proxy_err_response(code, req_res, exc, wbuf)
Rack::Utils::HTTP_STATUS_CODES[code]}\r\n\r\n") rescue nil
shutdown rescue nil
- req_res.shutdown rescue nil
+ @input = @input.close if @input
+
+ # this is safe ONLY because we are in an :ignore state after
+ # Fdmap#forget when we got hijacked:
+ close
+
nil # signal close of req_res from yahns_step in yahns/proxy_pass.rb
ensure
wbuf.wbuf_abort if wbuf
diff --git a/lib/yahns/proxy_pass.rb b/lib/yahns/proxy_pass.rb
index 511db02..148957b 100644
--- a/lib/yahns/proxy_pass.rb
+++ b/lib/yahns/proxy_pass.rb
@@ -63,7 +63,8 @@ def yahns_step # yahns event loop entry point
when Yahns::WbufCommon # streaming/buffering the response body
- return c.proxy_response_finish(req, resbuf, self)
+ # we assign wbuf for rescue below:
+ return c.proxy_response_finish(req, wbuf = resbuf, self)
end while true # case @resbuf
@@ -79,7 +80,7 @@ def yahns_step # yahns event loop entry point
when Errno::ECONNREFUSED, Errno::ECONNRESET, Errno::EPIPE
e.set_backtrace([])
end
- c.proxy_err_response(502, self, e, nil)
+ c.proxy_err_response(502, self, e, wbuf)
end
# returns :wait_readable if complete, :wait_writable if not
--
EW
--
unsubscribe: [email protected]
archive: https://yhbt.net/yahns-public/