about summary refs log tree commit homepage
path: root/lib/rainbows/revactor/tee_input.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rainbows/revactor/tee_input.rb')
-rw-r--r--lib/rainbows/revactor/tee_input.rb11
1 files changed, 11 insertions, 0 deletions
diff --git a/lib/rainbows/revactor/tee_input.rb b/lib/rainbows/revactor/tee_input.rb
index b34931f..fb7fa42 100644
--- a/lib/rainbows/revactor/tee_input.rb
+++ b/lib/rainbows/revactor/tee_input.rb
@@ -32,10 +32,21 @@ module Rainbows
           end
         end
         finalize_input
+        rescue EOFError
+          # in case client only did a premature shutdown(SHUT_WR)
+          # we do support clients that shutdown(SHUT_WR) after the
+          # _entire_ request has been sent, and those will not have
+          # raised EOFError on us.
+          socket.close if socket
+          raise Unicorn::ClientShutdown, "bytes_read=#{@tmp.size}", []
       end
 
       def finalize_input
         while parser.trailers(req, buf).nil?
+          # Don't worry about raising ClientShutdown here on EOFError, tee()
+          # will catch EOFError when app is processing it, otherwise in
+          # initialize we never get any chance to enter the app so the
+          # EOFError will just get trapped by Unicorn and not the Rack app
           buf << socket.read
         end
         self.socket = nil