Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksey Lim <alsroot@sugarlabs.org>2013-10-13 10:56:15 (GMT)
committer Aleksey Lim <alsroot@sugarlabs.org>2013-10-13 10:56:15 (GMT)
commit0b6e646eaa79ccbd877d6e6f8ef5f3d2aea204e5 (patch)
tree00d99f33d7b99ef96894777a0eecc80d3da38043
parentae6215c625a8f520e74ee513a38448b6a99d7c09 (diff)
Postpone havy imports to speedup start on XO1
-rw-r--r--sugar_network/client/implementations.py4
-rw-r--r--sugar_network/client/routes.py4
-rw-r--r--sugar_network/toolkit/http.py62
3 files changed, 46 insertions, 24 deletions
diff --git a/sugar_network/client/implementations.py b/sugar_network/client/implementations.py
index 841fb5f..3cd59de 100644
--- a/sugar_network/client/implementations.py
+++ b/sugar_network/client/implementations.py
@@ -18,7 +18,6 @@
import os
import re
import sys
-import uuid
import time
import json
import random
@@ -326,10 +325,11 @@ class Routes(object):
def _activity_id_new():
+ from uuid import getnode
data = '%s%s%s' % (
time.time(),
random.randint(10000, 100000),
- uuid.getnode())
+ getnode())
return hashlib.sha1(data).hexdigest()
diff --git a/sugar_network/client/routes.py b/sugar_network/client/routes.py
index 0d869d0..9960b9d 100644
--- a/sugar_network/client/routes.py
+++ b/sugar_network/client/routes.py
@@ -25,7 +25,7 @@ from sugar_network.node.slave import SlaveRoutes
from sugar_network.toolkit import netlink, mountpoints
from sugar_network.toolkit.router import ACL, Request, Response, Router
from sugar_network.toolkit.router import route, fallbackroute
-from sugar_network.toolkit import zeroconf, coroutine, http, enforce
+from sugar_network.toolkit import zeroconf, coroutine, http, exception, enforce
# Top-level directory name to keep SN data on mounted devices
@@ -292,7 +292,7 @@ class ClientRoutes(model.FrontRoutes, implementations.Routes, journal.Routes):
_logger.debug('Retry %r on gateway error', url)
continue
except Exception:
- _logger.exception('Connection to %r failed', url)
+ exception(_logger, 'Connection to %r failed', url)
break
self._got_offline()
if not timeout:
diff --git a/sugar_network/toolkit/http.py b/sugar_network/toolkit/http.py
index 31f9e5a..859d7e4 100644
--- a/sugar_network/toolkit/http.py
+++ b/sugar_network/toolkit/http.py
@@ -19,14 +19,8 @@ import types
import logging
from os.path import join, dirname
-sys.path.insert(0, join(dirname(__file__), '..', 'lib', 'requests'))
-
-from requests import Session
-# pylint: disable-msg=W0611
-from requests.exceptions import SSLError, ConnectionError, HTTPError
-
from sugar_network import client, toolkit
-from sugar_network.toolkit import coroutine, enforce
+from sugar_network.toolkit import enforce
_REDIRECT_CODES = frozenset([301, 302, 303, 307, 308])
@@ -34,6 +28,10 @@ _REDIRECT_CODES = frozenset([301, 302, 303, 307, 308])
_logger = logging.getLogger('http')
+class ConnectionError(Exception):
+ pass
+
+
class Status(Exception):
status = None
@@ -110,22 +108,18 @@ def download(url, dst_path=None):
class Connection(object):
+ _Session = None
+ _SSLError = None
+ _ConnectionError = None
+
def __init__(self, api_url='', creds=None, trust_env=True, max_retries=0):
self.api_url = api_url
self._get_profile = None
- self._session = session = Session()
+ self._session = None
+ self._creds = creds
+ self._trust_env = trust_env
self._max_retries = max_retries
- session.stream = True
- session.trust_env = trust_env
- if client.no_check_certificate.value:
- session.verify = False
- if creds:
- uid, keyfile, self._get_profile = creds
- session.headers['X-SN-login'] = uid
- session.headers['X-SN-signature'] = _sign(keyfile, uid)
- session.headers['accept-language'] = toolkit.default_lang()
-
def __repr__(self):
return '<Connection api_url=%s>' % self.api_url
@@ -136,7 +130,8 @@ class Connection(object):
self.close()
def close(self):
- self._session.close()
+ if self._session is not None:
+ self._session.close()
def exists(self, path):
reply = self.request('GET', path, allowed=[404])
@@ -202,6 +197,9 @@ class Connection(object):
def request(self, method, path=None, data=None, headers=None, allowed=None,
params=None, **kwargs):
+ if self._session is None:
+ self._init()
+
if not path:
path = ['']
if not isinstance(path, basestring):
@@ -216,9 +214,11 @@ class Connection(object):
try:
reply = self._session.request(method, path, data=data,
headers=headers, params=params, **kwargs)
- except SSLError:
+ except Connection._SSLError:
_logger.warning('Use --no-check-certificate to avoid checks')
raise
+ except Connection._ConnectionError, error:
+ raise ConnectionError, error, sys.exc_info()[2]
if reply.status_code != 200:
if reply.status_code == 401:
enforce(method not in ('PUT', 'POST') or
@@ -319,6 +319,28 @@ class Connection(object):
else:
return reply.content
+ def _init(self):
+ if Connection._Session is None:
+ sys.path.insert(0,
+ join(dirname(__file__), '..', 'lib', 'requests'))
+ from requests import Session
+ from requests.exceptions import SSLError
+ from requests.exceptions import ConnectionError as _ConnectionError
+ Connection._Session = Session
+ Connection._SSLError = SSLError
+ Connection._ConnectionError = _ConnectionError
+
+ self._session = Connection._Session()
+ self._session.stream = True
+ self._session.trust_env = self._trust_env
+ if client.no_check_certificate.value:
+ self._session.verify = False
+ if self._creds:
+ uid, keyfile, self._get_profile = self._creds
+ self._session.headers['X-SN-login'] = uid
+ self._session.headers['X-SN-signature'] = _sign(keyfile, uid)
+ self._session.headers['accept-language'] = toolkit.default_lang()
+
class _Subscription(object):