From 0b6e646eaa79ccbd877d6e6f8ef5f3d2aea204e5 Mon Sep 17 00:00:00 2001 From: Aleksey Lim Date: Sun, 13 Oct 2013 10:56:15 +0000 Subject: Postpone havy imports to speedup start on XO1 --- 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 '' % 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): -- cgit v0.9.1