From 1d58dd2cc668d0754f2d7b5f51c63640a9d0e291 Mon Sep 17 00:00:00 2001 From: Sindre Stephansen Date: Wed, 28 Dec 2022 12:42:00 +0100 Subject: [PATCH] Handle HTTP error 419 --- update-poms.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/update-poms.py b/update-poms.py index 5bde149..91cbf3a 100755 --- a/update-poms.py +++ b/update-poms.py @@ -1,6 +1,7 @@ #!/bin/python3 import re +import random import argparse import logging import asyncio @@ -30,6 +31,10 @@ done_lock = asyncio.Lock() num_workers = 50 +class TooManyRequestsException(Exception): + pass + + class PackagePOM: def __init__(self, package: 'Package', pom: str): logger.debug(f'{package}: Parsing POM') @@ -199,6 +204,8 @@ class Package: logger.debug(f'{self}: {extension} downloaded') return await response.text() break + elif response.status == 429: + raise TooManyRequestsException() else: logger.debug(f'{self}: HTTP error {response.status} from mirror {mirror}') else: @@ -250,6 +257,8 @@ class Package: logger.warning(f'{self}: No matching packages found') self._verified = False + elif response.status == 429: + raise TooManyRequestsException() else: self._verified = False logger.warning(f'{self}: HTTP error {response.status} downloading pom') @@ -322,7 +331,15 @@ async def download(package: Package, queue: asyncio.Queue) -> None: async def worker(queue: asyncio.Queue) -> None: while True: package = await queue.get() - await download(package, queue) + + while True: + try: + await download(package, queue) + break + except TooManyRequestsException: + logger.info('Too many requests. Delaying next attempt') + await asyncio.sleep(3*random.random() + 0.2) + queue.task_done()