]> glassweightruler.freedombox.rocks Git - waydroid.git/blobdiff - tools/helpers/http.py
props: Use subprocess for host getprop
[waydroid.git] / tools / helpers / http.py
index d05522b45564694782aa4b4cd9b1b14220454855..77ff719171987f21026f9d82478ce872f0cfe33f 100644 (file)
@@ -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, ""