about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2016-07-04 10:12:01 +0000
committerEric Wong <e@80x24.org>2016-07-04 10:20:42 +0000
commit148251ee69d1613213e9a87c2fd81d4f7c0cc16b (patch)
tree4bf81861d04da11c7876b6c26abfbba1ba6408a3
parentb01adb35fddb5d3b9736d54d69c4304fbdfc599b (diff)
downloadyahns-148251ee69d1613213e9a87c2fd81d4f7c0cc16b.tar.gz
When breaking early out of the upstream response body loop, we
must ensure we know we've hit the parser body EOF and preserve
the buffer for trailer parsing.  Otherwise, reentering
proxy_read_body will put us in a bad state and corrupt
responses.

This is a critical bugfix which only affects users of
the soon-to-be-released "proxy_buffering: false" feature
of proxy_pass.
-rw-r--r--lib/yahns/proxy_http_response.rb5
1 files changed, 4 insertions, 1 deletions
diff --git a/lib/yahns/proxy_http_response.rb b/lib/yahns/proxy_http_response.rb
index 316c310..0ca2c34 100644
--- a/lib/yahns/proxy_http_response.rb
+++ b/lib/yahns/proxy_http_response.rb
@@ -167,7 +167,10 @@ module Yahns::HttpResponse # :nodoc:
       end
       wbuf = proxy_write(wbuf, tmp, req_res)
       chunk.clear if chunk
-      return proxy_unbuffer(wbuf) if Yahns::WbufLite === wbuf
+      if Yahns::WbufLite === wbuf
+        req_res.proxy_trailers = [ rbuf.dup, tip ] if chunk && kcar.body_eof?
+        return proxy_unbuffer(wbuf)
+      end
     when nil # EOF
       # HTTP/1.1 upstream, unexpected premature EOF:
       msg = "upstream EOF (#{len} bytes left)" if len