From 8a3f48341248b919b5c4816bf4f7079eb35d6882 Mon Sep 17 00:00:00 2001 From: Matthew Draper Date: Tue, 28 Feb 2012 23:39:09 +1030 Subject: Don't stop reading too early. Leave size unchanged, so it's available for easy comparison with buf.bytesize. [ew: added test case] Acked-by: Eric Wong --- lib/mogilefs/socket_common.rb | 4 ++-- test/socket_test.rb | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/mogilefs/socket_common.rb b/lib/mogilefs/socket_common.rb index a716d35..5ba8c10 100644 --- a/lib/mogilefs/socket_common.rb +++ b/lib/mogilefs/socket_common.rb @@ -44,9 +44,9 @@ module MogileFS::SocketCommon def read(size, buf = "", timeout = 5) timed_read(size, buf, timeout) or return # nil/EOF - while (size -= buf.bytesize) > 0 + while (remaining = size - buf.bytesize) > 0 tmp ||= "" - timed_read(size, tmp, timeout) or return buf # truncated + timed_read(remaining, tmp, timeout) or return buf # truncated buf << tmp end diff --git a/test/socket_test.rb b/test/socket_test.rb index c4dcf02..e217da5 100644 --- a/test/socket_test.rb +++ b/test/socket_test.rb @@ -95,4 +95,18 @@ module SocketTest accepted.close assert_nil sock.timed_gets end + + def test_read_in_full + sock = MogileFS::Socket.tcp(@host, @port) + accepted = @srv.accept + thr = Thread.new do + accepted.write "HELLO" + sleep 0.1 + accepted.write " " + sleep 0.1 + accepted.write "WORLD!!!" + end + buf = sock.read("HELLO WORLD!!!".bytesize) + assert_equal "HELLO WORLD!!!", buf + end end -- cgit v1.2.3-24-ge0c7