Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDipankar 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)
commitba20b1c4e037814bc10e5cb32ac53c8feee7aa2d (patch)
tree7b7e945a2d5bf42dc596c826afb12f4d3e6bd086
parentc2bb0475096a0f2ce27270c6d02a18c81118ce18 (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.py27
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.'))