From 3362dc51934c15fd944748e55ba4a470cc60d27d Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 18 Nov 2010 07:36:27 +0800 Subject: stream_input: read with zero length returns '' Any calls to read with an explicit zero length now returns an empty string. While not explicitly specified by Rack::Lint, this is for compatibility with StringIO and IO methods which are common in other web servers. --- lib/unicorn/stream_input.rb | 2 +- test/unit/test_stream_input.rb | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/unicorn/stream_input.rb b/lib/unicorn/stream_input.rb index 2c8e40a..ef8997e 100644 --- a/lib/unicorn/stream_input.rb +++ b/lib/unicorn/stream_input.rb @@ -60,7 +60,7 @@ class Unicorn::StreamInput @rbuf.replace('') end end - rv = nil if rv.empty? + rv = nil if rv.empty? && length != 0 end rv end diff --git a/test/unit/test_stream_input.rb b/test/unit/test_stream_input.rb index 20e048d..adf4571 100644 --- a/test/unit/test_stream_input.rb +++ b/test/unit/test_stream_input.rb @@ -129,6 +129,23 @@ class TestStreamInput < Test::Unit::TestCase assert_equal '', buf end + def test_read_zero + r = init_request('hello') + si = Unicorn::StreamInput.new(@rd, r) + assert_equal '', si.read(0) + buf = 'asdf' + rv = si.read(0, buf) + assert_equal rv.object_id, buf.object_id + assert_equal '', buf + assert_equal 'hello', si.read + assert_nil si.read(5) + assert_equal '', si.read(0) + buf = 'hello' + rv = si.read(0, buf) + assert_equal rv.object_id, buf.object_id + assert_equal '', rv + end + def init_request(body, size = nil) @parser = Unicorn::HttpParser.new body = body.to_s.freeze -- cgit v1.2.3-24-ge0c7