X-Git-Url: https://glassweightruler.freedombox.rocks/gitweb/waydroid.git/blobdiff_plain/1f0393876d891d0e32a995d0bf7259cc6505afdc..20d3c5e2cf4fd91e35205a1abfae24456c05fc2e:/tools/helpers/http.py diff --git a/tools/helpers/http.py b/tools/helpers/http.py index d05522b..77ff719 100644 --- a/tools/helpers/http.py +++ b/tools/helpers/http.py @@ -1,13 +1,14 @@ # 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, @@ -26,6 +27,14 @@ 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"]) @@ -44,6 +53,7 @@ def download(args, url, prefix, cache=True, loglevel=logging.INFO, 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: @@ -51,19 +61,18 @@ def download(args, url, prefix, cache=True, loglevel=logging.INFO, 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) @@ -74,16 +83,7 @@ def retrieve(url, headers=None, allow_404=False): 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, ""