Commit 7524e1b336 for qemu.org

commit 7524e1b33679dc1356e8bb4efdd18e83fc50f5cc
Author: Nicholas Piggin <npiggin@gmail.com>
Date:   Wed Mar 12 23:00:01 2025 +1000

    tests/functional/asset: Verify downloaded size

    If the server provides a Content-Length header, use that to verify the
    size of the downloaded file. This catches cases where the connection
    terminates early, and gives the opportunity to retry. Without this, the
    checksum will likely mismatch and fail without retry.

    Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
    Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
    Message-ID: <20250312130002.945508-3-npiggin@gmail.com>
    Signed-off-by: Thomas Huth <thuth@redhat.com>

diff --git a/tests/functional/qemu_test/asset.py b/tests/functional/qemu_test/asset.py
index 27dd839e70..6bbfb9e1ca 100644
--- a/tests/functional/qemu_test/asset.py
+++ b/tests/functional/qemu_test/asset.py
@@ -121,6 +121,20 @@ def fetch(self):
                 with tmp_cache_file.open("xb") as dst:
                     with urllib.request.urlopen(self.url) as resp:
                         copyfileobj(resp, dst)
+                        length_hdr = resp.getheader("Content-Length")
+
+                # Verify downloaded file size against length metadata, if
+                # available.
+                if length_hdr is not None:
+                    length = int(length_hdr)
+                    fsize = tmp_cache_file.stat().st_size
+                    if fsize != length:
+                        self.log.error("Unable to download %s: "
+                                       "connection closed before "
+                                       "transfer complete (%d/%d)",
+                                       self.url, fsize, length)
+                        tmp_cache_file.unlink()
+                        continue
                 break
             except FileExistsError:
                 self.log.debug("%s already exists, "