+REGEX_RELEASE = re.compile(r'(\D*)(\d{4}|master)(\D*)')
+
+
+def _download_file(url, file_name, log):
+ """Download a file with input data.
+
+ :param url: URL to the file to download.
+ :param file_name: Name of file to download.
+ :param log: List of log messages.
+ :type url: str
+ :type file_name: str
+ :type log: list of tuples (severity, msg)
+ :returns: True if the download was successful, otherwise False.
+ :rtype: bool
+ """
+
+ def requests_retry_session(retries=3,
+ backoff_factor=0.3,
+ status_forcelist=(500, 502, 504)):
+ """
+
+ :param retries:
+ :param backoff_factor:
+ :param status_forcelist:
+ :returns:
+ """
+
+ retry = Retry(
+ total=retries,
+ read=retries,
+ connect=retries,
+ backoff_factor=backoff_factor,
+ status_forcelist=status_forcelist,
+ )
+ adapter = HTTPAdapter(max_retries=retry)
+ session = requests.Session()
+ session.mount('http://', adapter)
+ session.mount('https://', adapter)
+ return session
+
+ success = False
+ try:
+ log.append(("INFO", " Connecting to '{0}' ...".format(url)))
+ response = requests_retry_session().get(url, stream=True)
+ code = response.status_code
+ log.append(("INFO", " {0}: {1}".format(code, responses[code])))
+
+ if code != codes["OK"]:
+ url = url.replace("_info", "")
+ log.append(("INFO", " Connecting to '{0}' ...".format(url)))
+ response = requests_retry_session().get(url, stream=True)
+ code = response.status_code
+ log.append(("INFO", " {0}: {1}".format(code, responses[code])))
+ if code != codes["OK"]:
+ return False, file_name
+ file_name = file_name.replace("_info", "")
+
+ log.append(("INFO", " Downloading the file '{0}' to '{1}' ...".
+ format(url, file_name)))
+
+ with open(file_name, "wb") as file_handle:
+ for chunk in response.iter_content(chunk_size=CHUNK_SIZE):
+ if chunk:
+ file_handle.write(chunk)
+ success = True
+ except ConnectionError as err:
+ log.append(("ERROR", "Not possible to connect to '{0}'.".format(url)))
+ log.append(("DEBUG", repr(err)))
+ except HTTPError as err:
+ log.append(("ERROR", "Invalid HTTP response from '{0}'.".format(url)))
+ log.append(("DEBUG", repr(err)))
+ except TooManyRedirects as err:
+ log.append(("ERROR", "Request exceeded the configured number "
+ "of maximum re-directions."))
+ log.append(("DEBUG", repr(err)))
+ except Timeout as err:
+ log.append(("ERROR", "Request timed out."))
+ log.append(("DEBUG", repr(err)))
+ except RequestException as err:
+ log.append(("ERROR", "Unexpected HTTP request exception."))
+ log.append(("DEBUG", repr(err)))
+ except (IOError, ValueError, KeyError) as err:
+ log.append(("ERROR", "Download failed."))
+ log.append(("DEBUG", repr(err)))
+
+ log.append(("INFO", " Download finished."))
+ return success, file_name