Teach Socket how to read_nonblock
git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@668996 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/rb/lib/thrift/transport/socket.rb b/lib/rb/lib/thrift/transport/socket.rb
index 37dda9b..818d329 100644
--- a/lib/rb/lib/thrift/transport/socket.rb
+++ b/lib/rb/lib/thrift/transport/socket.rb
@@ -39,13 +39,17 @@
end
end
- def read(sz)
+ def read(sz, nonblock=false)
begin
- data = @handle.recv(sz)
- rescue StandardError
- raise TransportException.new(TransportException::NOT_OPEN)
+ if nonblock
+ data = @handle.read_nonblock(sz)
+ else
+ data = @handle.read(sz)
+ end
+ rescue StandardError => e
+ raise TransportException.new(TransportException::NOT_OPEN, e.message)
end
- if (data.length == 0)
+ if (data.nil? or data.length == 0)
raise TransportException.new(TransportException::UNKNOWN, "Socket: Could not read #{sz} bytes from #{@host}:#{@port}")
end
data
diff --git a/lib/rb/spec/socket_spec.rb b/lib/rb/spec/socket_spec.rb
index b6e2a14..cfd7c7b 100644
--- a/lib/rb/spec/socket_spec.rb
+++ b/lib/rb/spec/socket_spec.rb
@@ -49,21 +49,21 @@
it "should raise an error when it cannot read from the handle" do
TCPSocket.should_receive(:new).and_return(@handle)
@socket.open
- @handle.should_receive(:recv).with(17).and_raise(StandardError)
+ @handle.should_receive(:read).with(17).and_raise(StandardError)
lambda { @socket.read(17) }.should raise_error(TransportException) { |e| e.type.should == TransportException::NOT_OPEN }
end
it "should raise an error when it reads no data from the handle" do
TCPSocket.should_receive(:new).and_return(@handle)
@socket.open
- @handle.should_receive(:recv).with(17).and_return("")
+ @handle.should_receive(:read).with(17).and_return("")
lambda { @socket.read(17) }.should raise_error(TransportException, "Socket: Could not read 17 bytes from localhost:9090")
end
it "should return the data read when reading from the handle works" do
TCPSocket.should_receive(:new).and_return(@handle)
@socket.open
- @handle.should_receive(:recv).with(17).and_return("test data")
+ @handle.should_receive(:read).with(17).and_return("test data")
@socket.read(17).should == "test data"
end