From 83654fb4c903120d07306e56d007c1e0b7c196f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=BCttler?= Date: Mon, 18 May 2026 05:06:42 +0200 Subject: [PATCH] fix: re-initialize resumable upload URL on each retry attempt The resumable upload URL returned by Google Play is session-specific and expires after a failed attempt. Retrying with the same URL always fails. Also broadens the caught exception from HTTPError to RequestException so timeouts and connection errors are retried too. --- scripts/deploy_playstore.py | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/scripts/deploy_playstore.py b/scripts/deploy_playstore.py index 16e3d96..921296a 100755 --- a/scripts/deploy_playstore.py +++ b/scripts/deploy_playstore.py @@ -31,24 +31,25 @@ def _upload_aab(session: AuthorizedSession, edit_id: str) -> int: """Resumable upload of the AAB. Returns the version code.""" file_size = os.path.getsize(AAB_PATH) - init_resp = session.post( - f"{_UPLOAD_BASE}/{PACKAGE_NAME}/edits/{edit_id}/bundles", - params={"uploadType": "resumable"}, - headers={ - "X-Upload-Content-Type": "application/octet-stream", - "X-Upload-Content-Length": str(file_size), - }, - json={}, - timeout=30, - ) - init_resp.raise_for_status() - upload_url = init_resp.headers["Location"] - with open(AAB_PATH, "rb") as f: data = f.read() last_exc = None for attempt in range(_MAX_UPLOAD_ATTEMPTS): + # Each attempt needs a fresh resumable upload URL — the previous URL expires on failure. + init_resp = session.post( + f"{_UPLOAD_BASE}/{PACKAGE_NAME}/edits/{edit_id}/bundles", + params={"uploadType": "resumable"}, + headers={ + "X-Upload-Content-Type": "application/octet-stream", + "X-Upload-Content-Length": str(file_size), + }, + json={}, + timeout=30, + ) + init_resp.raise_for_status() + upload_url = init_resp.headers["Location"] + try: upload_resp = session.put( upload_url, @@ -61,7 +62,7 @@ def _upload_aab(session: AuthorizedSession, edit_id: str) -> int: ) upload_resp.raise_for_status() return upload_resp.json()["versionCode"] - except requests.HTTPError as exc: + except requests.RequestException as exc: last_exc = exc if attempt < _MAX_UPLOAD_ATTEMPTS - 1: delay = 10 * (2 ** attempt)