diff options
Diffstat (limited to 'lib/unicorn/stream_input.rb')
-rw-r--r-- | lib/unicorn/stream_input.rb | 24 |
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 |