diff options
author | Dipankar Patro <dipankar@seeta.in> | 2010-09-20 14:45:59 (GMT) |
---|---|---|
committer | Tomeu Vizoso <tomeu.vizoso@collabora.co.uk> | 2010-10-15 16:57:44 (GMT) |
commit | ba20b1c4e037814bc10e5cb32ac53c8feee7aa2d (patch) | |
tree | 7b7e945a2d5bf42dc596c826afb12f4d3e6bd086 | |
parent | c2bb0475096a0f2ce27270c6d02a18c81118ce18 (diff) |
Time out on registration process to prevent indefinite UI hang (SL#2289)
Registration with the school server is currently done synchronously.
To prevent the UI from hanging indefinitely, if the school server is reachable
but unresponsive, we add an explicit timeout.
Reviewed-By: Sascha Silbe <sascha-pgp@silbe.org>
Reviewed-By: James Cameron <quozl@laptop.org>
-rw-r--r-- | src/jarabe/desktop/schoolserver.py | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/src/jarabe/desktop/schoolserver.py b/src/jarabe/desktop/schoolserver.py index ab9b68a..f79711e 100644 --- a/src/jarabe/desktop/schoolserver.py +++ b/src/jarabe/desktop/schoolserver.py @@ -16,8 +16,9 @@ import logging from gettext import gettext as _ -from xmlrpclib import ServerProxy, Error +import xmlrpclib import socket +import httplib import os from string import ascii_uppercase import random @@ -30,6 +31,7 @@ from sugar import env from sugar.profile import get_profile REGISTER_URL = 'http://schoolserver:8080/' +REGISTER_TIMEOUT = 8 def generate_serial_number(): """ Generates a serial number based on 3 random uppercase letters @@ -76,6 +78,25 @@ def store_identifiers(serial_number, uuid, backup_url): class RegisterError(Exception): pass + +class TimeoutHTTP(httplib.HTTP): + + def __init__(self, host='', port=None, strict=None, timeout=None): + if port == 0: + port = None + # FIXME: Depending on undocumented internals that can break between + # Python releases. Please have a look at SL #2350 + self._setup(self._connection_class(host, + port, strict, timeout=REGISTER_TIMEOUT)) + + +class TimeoutTransport(xmlrpclib.Transport): + + def make_connection(self, host): + host, extra_headers, x509 = self.get_host_info(host) + return TimeoutHTTP(host, timeout=REGISTER_TIMEOUT) + + def register_laptop(url=REGISTER_URL): profile = get_profile() @@ -99,10 +120,10 @@ def register_laptop(url=REGISTER_URL): nick = client.get_string('/desktop/sugar/user/nick') - server = ServerProxy(url) + server = xmlrpclib.ServerProxy(url, TimeoutTransport()) try: data = server.register(sn, nick, uuid_, profile.pubkey) - except (Error, TypeError, socket.error): + except (xmlrpclib.Error, TypeError, socket.error): logging.exception('Registration: cannot connect to server') raise RegisterError(_('Cannot connect to the server.')) |