about summary refs log tree commit homepage
path: root/lib/mogilefs/mogilefs.rb
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2009-03-24 18:56:50 -0700
committerEric Wong <normalperson@yhbt.net>2009-03-24 19:18:24 -0700
commitc07be896889f13235bda1bd32983261e73513a70 (patch)
tree073f5a3741b84576088eb1d332ddd5f50bfb0fe9 /lib/mogilefs/mogilefs.rb
parenta69925d4b4671fe65e54e34a009e17fb1fa47700 (diff)
downloadmogilefs-client-c07be896889f13235bda1bd32983261e73513a70.tar.gz
This adds a sysread_full utility method with configurable
timeouts.  Individual reads can be timed out as well as
the entire sysread_full call.
Diffstat (limited to 'lib/mogilefs/mogilefs.rb')
-rw-r--r--lib/mogilefs/mogilefs.rb14
1 files changed, 3 insertions, 11 deletions
diff --git a/lib/mogilefs/mogilefs.rb b/lib/mogilefs/mogilefs.rb
index c7c33ed..14fc0c2 100644
--- a/lib/mogilefs/mogilefs.rb
+++ b/lib/mogilefs/mogilefs.rb
@@ -71,17 +71,8 @@ class MogileFS::MogileFS < MogileFS::Client
       when /^http:\/\// then
         begin
           sock = http_get_sock(URI.parse(path))
-          return( if block_given?
-                    yield(sock)
-                  else
-                    begin
-                      sock.read
-                    rescue Errno::EAGAIN
-                      IO.select([sock])
-                      retry
-                    end
-                  end )
-          # return block_given? ? yield(sock) : sock.read
+          return yield(sock) if block_given?
+          return sysread_full(sock, sock.mogilefs_size, @get_file_data_timeout)
         rescue MogileFS::Timeout, Errno::ECONNREFUSED,
                EOFError, SystemCallError, MogileFS::InvalidResponseError
           next
@@ -288,6 +279,7 @@ class MogileFS::MogileFS < MogileFS::Client
       buf = sock.recv(4096, Socket::MSG_PEEK)
       head, body = buf.split(/\r\n\r\n/, 2)
       if head =~ HTTP_200_OK
+        sock.mogilefs_size = head[/^Content-Length:\s*(\d+)/i, 1].to_i
         sock.recv(head.size + 4, 0)
         return sock
       end