# Copyright 2021 Oliver Smith
# SPDX-License-Identifier: GPL-3.0-or-later
import hashlib
-import json
import logging
import os
import shutil
+import threading
import urllib.request
import tools.helpers.run
+import time
def download(args, url, prefix, cache=True, loglevel=logging.INFO,
with a 404 Not Found error. Only display a warning on
stdout (no matter if loglevel is changed).
:returns: path to the downloaded file in the cache or None on 404 """
+
+ # Show progress while downloading
+ downloadEnded = False
+ def progress(totalSize, destinationPath):
+ while not downloadEnded:
+ print("[Downloading] {}/{}".format(os.path.getsize(destinationPath), totalSize), end='\r')
+ time.sleep(.01)
+
# Create cache folder
if not os.path.exists(args.work + "/cache_http"):
tools.helpers.run.user(args, ["mkdir", "-p", args.work + "/cache_http"])
try:
with urllib.request.urlopen(url) as response:
with open(path, "wb") as handle:
+ threading.Thread(target=progress, args=(response.headers.get('content-length'), path)).start()
shutil.copyfileobj(response, handle)
# Handle 404
except urllib.error.HTTPError as e:
logging.warning("WARNING: file not found: " + url)
return None
raise
+ downloadEnded = True
# Return path in cache
return path
-def retrieve(url, headers=None, allow_404=False):
+def retrieve(url, headers=None):
""" Fetch the content of a URL and returns it as string.
:param url: the http(s) address of to the resource to fetch
:param headers: dict of HTTP headers to use
- :param allow_404: do not raise an exception when the server responds
- with a 404 Not Found error. Only display a warning
- :returns: str with the content of the response
+ :returns: status and str with the content of the response
"""
# Download the file
logging.verbose("Retrieving " + url)
req = urllib.request.Request(url, headers=headers)
try:
with urllib.request.urlopen(req) as response:
- return response.read()
+ return 200, response.read()
# Handle 404
except urllib.error.HTTPError as e:
- if e.code == 404 and allow_404:
- logging.warning("WARNING: failed to retrieve content from: " + url)
- return None
- raise
-
-
-def retrieve_json(*args, **kwargs):
- """ Fetch the contents of a URL, parse it as JSON and return it. See
- retrieve() for the list of all parameters. """
- return json.loads(retrieve(*args, **kwargs))
+ return e.code, ""