When the CLI cannot connect to the gateway, it prints an error message rather than...
authorAndrew Miller <amiller@dappervision.com>
Sat, 31 Mar 2012 22:53:45 +0000 (18:53 -0400)
committerBrian Warner <warner@lothar.com>
Tue, 4 Sep 2012 21:48:50 +0000 (14:48 -0700)
Signed-off-by: Andrew Miller <amiller@dappervision.com>
src/allmydata/scripts/common_http.py
src/allmydata/test/test_cli.py

index 66a6291cb5497e3ec89a60a990a5d2917525d860..7ffa41bddba37eb307eb3cf43ae6cb060d197cfa 100644 (file)
@@ -6,7 +6,7 @@ import allmydata # for __full_version__
 
 from allmydata.util.encodingutil import quote_output
 from allmydata.scripts.common import TahoeError
-
+from socket import error as socket_error
 
 # copied from twisted/web/client.py
 def parse_url(url, defaultPort=None):
@@ -58,8 +58,16 @@ def do_http(method, url, body=""):
     length = body.tell()
     body.seek(old)
     c.putheader("Content-Length", str(length))
-    c.endheaders()
 
+    try:
+        c.endheaders()
+    except socket_error, err:
+        class BadResponse(object):
+            status=-1
+            reason="Error trying to connect to %s: %s" % (url, err)
+            read=lambda _: ""
+        return BadResponse()
+        
     while True:
         data = body.read(8192)
         if not data:
index c88d00b3ae16c7a6c9334d90c5a1e389b5729d8d..e846a77ac8d46c2022bd56da6f96be5e8c232311 100644 (file)
@@ -13,6 +13,8 @@ from allmydata.immutable import upload
 from allmydata.interfaces import MDMF_VERSION, SDMF_VERSION
 from allmydata.mutable.publish import MutableData
 from allmydata.dirnode import normalize
+from allmydata.scripts.common_http import socket_error
+import allmydata.scripts.common_http
 from pycryptopp.publickey import ed25519
 
 # Test that the scripts can be imported.
@@ -3279,6 +3281,28 @@ class Errors(GridTestMixin, CLITestMixin, unittest.TestCase):
 
         return d
 
+    def test_broken_socket(self):
+        # When the http connection breaks (such as when node.url is overwritten
+        # by a confused user), a user friendly error message should be printed.
+        self.basedir = "cli/Errors/test_broken_socket"
+        self.set_up_grid()
+
+        # Simulate a connection error
+        endheaders = allmydata.scripts.common_http.httplib.HTTPConnection.endheaders
+        def _fix_endheaders(*args):
+            allmydata.scripts.common_http.httplib.HTTPConnection.endheaders = endheaders
+        def _socket_error(*args, **kwargs):
+            raise socket_error('test error')
+        allmydata.scripts.common_http.httplib.HTTPConnection.endheaders = _socket_error
+
+        d = self.do_cli("mkdir")
+        def _check_invalid((rc,stdout,stderr)):
+            self.failIfEqual(rc, 0)
+            self.failUnlessIn("Error trying to connect to http://127.0.0.1", stderr)
+        d.addCallback(_check_invalid)
+        d.addCallback(_fix_endheaders)
+        return d
+
 
 class Get(GridTestMixin, CLITestMixin, unittest.TestCase):
     def test_get_without_alias(self):