diff options
author | Eric Wong <normalperson@yhbt.net> | 2010-07-08 05:14:55 +0000 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2010-07-08 05:23:35 +0000 |
commit | 1cd698f8c7938b1f19e9ba091708cb4515187939 (patch) | |
tree | 65c8f20247c74e10f65982c6d2d878f37632fd45 /lib/unicorn/tee_input.rb | |
parent | 98c51edf8b6f031a655a93b52808c9f9b78fb6fa (diff) | |
download | unicorn-1cd698f8c7938b1f19e9ba091708cb4515187939.tar.gz |
Different threads may change $/ during execution, so cache it at function entry to a local variable for safety. $/ may also be of a non-binary encoding, so rely on Rack::Utils.bytesize to portably capture the correct size. Our string slicing is always safe from 1.9 encoding: both our socket and backing temporary file are opened in binary mode, so we'll always be dealing with binary strings in this class (in accordance to the Rack spec).
Diffstat (limited to 'lib/unicorn/tee_input.rb')
-rw-r--r-- | lib/unicorn/tee_input.rb | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/lib/unicorn/tee_input.rb b/lib/unicorn/tee_input.rb index d1d273d..c0f916e 100644 --- a/lib/unicorn/tee_input.rb +++ b/lib/unicorn/tee_input.rb @@ -119,7 +119,7 @@ class Unicorn::TeeInput < Struct.new(:socket, :req, :parser, # unlike IO#gets. def gets socket or return tmp.gets - nil == $/ and return read + sep = $/ or return read orig_size = tmp.size if tmp.pos == orig_size @@ -127,8 +127,9 @@ class Unicorn::TeeInput < Struct.new(:socket, :req, :parser, tmp.seek(orig_size) end + sep_size = Rack::Utils.bytesize(sep) line = tmp.gets # cannot be nil here since size > pos - $/ == line[-$/.size, $/.size] and return line + sep == line[-sep_size, sep_size] and return line # unlikely, if we got here, then tmp is at EOF begin @@ -136,7 +137,7 @@ class Unicorn::TeeInput < Struct.new(:socket, :req, :parser, tee(@@io_chunk_size, buf2) or break tmp.seek(orig_size) line << tmp.gets - $/ == line[-$/.size, $/.size] and return line + sep == line[-sep_size, sep_size] and return line # tmp is at EOF again here, retry the loop end while true |