From 0af6dc8eea5fcff46fd672a3e2bed8fdcc4ba9cc Mon Sep 17 00:00:00 2001 From: Tomas Groth Date: Sun, 23 Nov 2014 20:52:16 +0000 Subject: [PATCH] Always retry on connection failure. --- openlp/core/ui/firsttimeform.py | 58 +++++++++++++++++++++------------ openlp/core/utils/__init__.py | 34 ++++++++++++++----- 2 files changed, 62 insertions(+), 30 deletions(-) diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index 0688681a1..7713aa948 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -45,7 +45,7 @@ from openlp.core.common import Registry, RegistryProperties, AppLocation, Settin translate, clean_button_text, trace_error_handler from openlp.core.lib import PluginStatus, build_icon from openlp.core.lib.ui import critical_error_message_box -from openlp.core.utils import get_web_page +from openlp.core.utils import get_web_page, CONNECTION_RETRIES, CONNECTION_TIMEOUT from .firsttimewizard import UiFirstTimeWizard, FirstTimePage log = logging.getLogger(__name__) @@ -304,23 +304,30 @@ class FirstTimeForm(QtGui.QWizard, UiFirstTimeWizard, RegistryProperties): """ block_count = 0 block_size = 4096 - try: - url_file = urllib.request.urlopen(url, timeout=30) - filename = open(f_path, "wb") - # Download until finished or canceled. - while not self.was_download_cancelled: - data = url_file.read(block_size) - if not data: - break - filename.write(data) - block_count += 1 - self._download_progress(block_count, block_size) - filename.close() - except ConnectionError: - trace_error_handler(log) - filename.close() - os.remove(f_path) - return False + retries = 0 + while True: + try: + url_file = urllib.request.urlopen(url, timeout=CONNECTION_TIMEOUT) + filename = open(f_path, "wb") + # Download until finished or canceled. + while not self.was_download_cancelled: + data = url_file.read(block_size) + if not data: + break + filename.write(data) + block_count += 1 + self._download_progress(block_count, block_size) + filename.close() + except ConnectionError: + trace_error_handler(log) + filename.close() + os.remove(f_path) + if retries > CONNECTION_RETRIES: + return False + else: + retries += 1 + continue + break # Delete file if cancelled, it may be a partial file. if self.was_download_cancelled: os.remove(f_path) @@ -343,9 +350,18 @@ class FirstTimeForm(QtGui.QWizard, UiFirstTimeWizard, RegistryProperties): :param url: The URL of the file we want to download. """ - site = urllib.request.urlopen(url, timeout=30) - meta = site.info() - return int(meta.get("Content-Length")) + retries = 0 + while True: + try: + site = urllib.request.urlopen(url, timeout=CONNECTION_TIMEOUT) + meta = site.info() + return int(meta.get("Content-Length")) + except ConnectionException: + if retries > CONNECTION_RETRIES: + raise + else: + retries += 1 + continue def _download_progress(self, count, block_size): """ diff --git a/openlp/core/utils/__init__.py b/openlp/core/utils/__init__.py index 8f032cd7d..87dfc48cb 100644 --- a/openlp/core/utils/__init__.py +++ b/openlp/core/utils/__init__.py @@ -91,6 +91,8 @@ USER_AGENTS = { 'Mozilla/5.0 (X11; NetBSD amd64; rv:18.0) Gecko/20130120 Firefox/18.0' ] } +CONNECTION_TIMEOUT = 30 +CONNECTION_RETRIES = 2 class VersionThread(QtCore.QThread): @@ -250,10 +252,17 @@ def check_latest_version(current_version): req = urllib.request.Request('http://www.openlp.org/files/version.txt') req.add_header('User-Agent', 'OpenLP/%s' % current_version['full']) remote_version = None - try: - remote_version = str(urllib.request.urlopen(req, None).read().decode()).strip() - except IOError: - log.exception('Failed to download the latest OpenLP version file') + retries = 0 + while True: + try: + remote_version = str(urllib.request.urlopen(req, None, timeout=CONNECTION_TIMEOUT).read().decode()).strip() + except ConnectionException: + if retries > CONNECTION_RETRIES: + log.exception('Failed to download the latest OpenLP version file') + else: + retries += 1 + continue + break if remote_version: version_string = remote_version return version_string @@ -389,11 +398,18 @@ def get_web_page(url, header=None, update_openlp=False): req.add_header(header[0], header[1]) page = None log.debug('Downloading URL = %s' % url) - try: - page = urllib.request.urlopen(req, timeout=30) - log.debug('Downloaded URL = %s' % page.geturl()) - except (urllib.error.URLError, ConnectionError): - log.exception('The web page could not be downloaded') + retries = 0 + while True: + try: + page = urllib.request.urlopen(req, timeout=CONNECTION_TIMEOUT) + log.debug('Downloaded URL = %s' % page.geturl()) + except (urllib.error.URLError, ConnectionError): + if retries > CONNECTION_RETRIES: + log.exception('The web page could not be downloaded') + raise + else: + continue + break if not page: return None if update_openlp: