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>
This commit is contained in:
Nicholas Piggin 2025-03-12 23:00:01 +10:00 committed by Thomas Huth
parent a5e8299d1a
commit 7524e1b336

View file

@ -121,6 +121,20 @@ class Asset:
with tmp_cache_file.open("xb") as dst: with tmp_cache_file.open("xb") as dst:
with urllib.request.urlopen(self.url) as resp: with urllib.request.urlopen(self.url) as resp:
copyfileobj(resp, dst) 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 break
except FileExistsError: except FileExistsError:
self.log.debug("%s already exists, " self.log.debug("%s already exists, "