about summary refs log tree commit homepage
path: root/lib/unicorn/stream_input.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/unicorn/stream_input.rb')
-rw-r--r--lib/unicorn/stream_input.rb24
1 files changed, 14 insertions, 10 deletions
diff --git a/lib/unicorn/stream_input.rb b/lib/unicorn/stream_input.rb
index 2a05337..2c8e40a 100644
--- a/lib/unicorn/stream_input.rb
+++ b/lib/unicorn/stream_input.rb
@@ -43,15 +43,7 @@ class Unicorn::StreamInput
     length = args.shift
     rv = args.shift || ''
     if length.nil?
-      rv.replace(@rbuf)
-      @rbuf.replace('')
-      @socket or return rv
-      until eof?
-        @socket.kgio_read(@@io_chunk_size, @buf) or eof!
-        filter_body(@rbuf, @buf)
-        rv << @rbuf
-      end
-      @rbuf.replace('')
+      read_all(rv)
     else
       if length <= @rbuf.size
         rv.replace(@rbuf.slice(0, length))
@@ -85,7 +77,7 @@ class Unicorn::StreamInput
   def gets
     sep = $/
     if sep.nil?
-      rv = read
+      read_all(rv = '')
       return rv.empty? ? nil : rv
     end
     re = /\A(.*?#{Regexp.escape(sep)})/
@@ -141,6 +133,18 @@ private
     rv
   end
 
+  def read_all(dst)
+    dst.replace(@rbuf)
+    @socket or return
+    until eof?
+      @socket.kgio_read(@@io_chunk_size, @buf) or eof!
+      filter_body(@rbuf, @buf)
+      dst << @rbuf
+    end
+    ensure
+      @rbuf.replace('')
+  end
+
   def eof!
     # in case client only did a premature shutdown(SHUT_WR)
     # we do support clients that shutdown(SHUT_WR) after the