diff options
author | Eric Wong <e@80x24.org> | 2016-06-03 19:41:46 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2016-06-05 22:44:20 +0000 |
commit | dcdeb4071ded73bcf4fd696b268bce7ee2021f5d (patch) | |
tree | 04f030190cebe7203cca5b9768cc983c744bff6e /lib/yahns/req_res.rb | |
parent | ae397abb9b85f4aec85bda17a2ff4b60372f1d08 (diff) | |
download | yahns-dcdeb4071ded73bcf4fd696b268bce7ee2021f5d.tar.gz |
Relying on @body.close in Yahns::WbufCommon#wbuf_close_common to resume reading the upstream response was too subtle and potentially racy. Instead use a new Yahns::WbufLite class which does exactly what we want for implementing this feature, and nothing more.
Diffstat (limited to 'lib/yahns/req_res.rb')
-rw-r--r-- | lib/yahns/req_res.rb | 25 |
1 files changed, 6 insertions, 19 deletions
diff --git a/lib/yahns/req_res.rb b/lib/yahns/req_res.rb index f585bd9..9bb8f35 100644 --- a/lib/yahns/req_res.rb +++ b/lib/yahns/req_res.rb @@ -7,8 +7,7 @@ require 'kcar' # gem install kcar require 'kgio' class Yahns::ReqRes < Kgio::Socket # :nodoc: - attr_writer :resbuf - attr_writer :paused + attr_accessor :resbuf attr_accessor :proxy_trailers attr_accessor :alive attr_reader :proxy_pass @@ -16,23 +15,11 @@ class Yahns::ReqRes < Kgio::Socket # :nodoc: def req_start(c, req, input, chunked, proxy_pass) @hdr = @resbuf = nil @yahns_client = c - @paused = false @rrstate = input ? [ req, input, chunked ] : req @proxy_pass = proxy_pass Thread.current[:yahns_queue].queue_add(self, Yahns::Queue::QEV_WR) end - def close - if @paused # called by wbuf_close_common as @body.close - @paused = false - # we must cleanup and set yahns_client state before queue_mod below: - @yahns_client.hijack_cleanup - Thread.current[:yahns_queue].queue_mod(self, Yahns::Queue::QEV_RD) - else - super - end - end - def yahns_step # yahns event loop entry point c = @yahns_client case req = @rrstate @@ -55,7 +42,7 @@ class Yahns::ReqRes < Kgio::Socket # :nodoc: # continue looping in middle "case @resbuf" loop when :wait_readable return rv # spurious wakeup - when nil then return c.proxy_err_response(502, self, nil, nil) + when nil then return c.proxy_err_response(502, self, nil) end # NOT looping here when String # continue reading trickled response headers from upstream @@ -63,15 +50,15 @@ class Yahns::ReqRes < Kgio::Socket # :nodoc: case rv = kgio_tryread(0x2000, buf) when String then res = req.headers(@hdr, resbuf << rv) and break when :wait_readable then return rv - when nil then return c.proxy_err_response(502, self, nil, nil) + when nil then return c.proxy_err_response(502, self, nil) end while true + @resbuf = false return c.proxy_response_start(res, resbuf, req, self) when Yahns::WbufCommon # streaming/buffering the response body - # we assign wbuf for rescue below: - return c.proxy_response_finish(req, wbuf = resbuf, self) + return c.proxy_response_finish(req, self) end while true # case @resbuf @@ -87,7 +74,7 @@ class Yahns::ReqRes < Kgio::Socket # :nodoc: when Errno::ECONNREFUSED, Errno::ECONNRESET, Errno::EPIPE e.set_backtrace([]) end - c.proxy_err_response(502, self, e, wbuf) + c.proxy_err_response(502, self, e) end def send_req_body_chunk(buf) |