about summary refs log tree commit homepage
path: root/lib/mogilefs/mogilefs.rb
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2008-12-30 18:03:06 -0800
committerEric Wong <normalperson@yhbt.net>2008-12-30 18:21:28 -0800
commitdda46f246f93ac31512582767c402957fb2fbaa1 (patch)
treefdc8cfaf3496b2143577a4d307147318f5c9a916 /lib/mogilefs/mogilefs.rb
parente07b59855a61a4053810f72e5a9f2000d54964e5 (diff)
downloadmogilefs-client-dda46f246f93ac31512582767c402957fb2fbaa1.tar.gz
Correctly fail when we get non-200 HTTP responses and retry on
the next URI.
Diffstat (limited to 'lib/mogilefs/mogilefs.rb')
-rw-r--r--lib/mogilefs/mogilefs.rb13
1 files changed, 9 insertions, 4 deletions
diff --git a/lib/mogilefs/mogilefs.rb b/lib/mogilefs/mogilefs.rb
index 6a070fd..95d44f6 100644
--- a/lib/mogilefs/mogilefs.rb
+++ b/lib/mogilefs/mogilefs.rb
@@ -69,7 +69,7 @@ class MogileFS::MogileFS < MogileFS::Client
           sock = http_get_sock(URI.parse(path))
           return block_given? ? yield(sock) : sock.read
         rescue MogileFS::Timeout, Errno::ECONNREFUSED,
-               EOFError, SystemCallError
+               EOFError, SystemCallError, MogileFS::InvalidResponseError
           next
         end
       else
@@ -256,15 +256,20 @@ class MogileFS::MogileFS < MogileFS::Client
 
   protected
 
+    # given a URI, this returns a readable socket with ready data from the
+    # body of the response.
     def http_get_sock(uri)
       sock = Socket.mogilefs_new_request(uri.host, uri.port,
                                     "GET #{uri.request_uri} HTTP/1.0\r\n\r\n",
                                     @get_file_data_timeout)
       buf = sock.recv(4096, Socket::MSG_PEEK)
       head, body = buf.split(/\r\n\r\n/, 2)
-      head = sock.recv(head.size + 4, 0)
-
-      sock
+      if head =~ %r{\AHTTP/\d+\.\d+\s+200\s+}
+        sock.recv(head.size + 4, 0)
+        return sock
+      end
+      raise MogileFS::InvalidResponseError,
+            "GET on #{uri} returned: #{head.inspect}"
     end # def http_get_sock
 
 end