Browse Source

Do proper backoff for a 429.

Joe Clarke 8 months ago
parent
commit
c62285cffd
1 changed files with 13 additions and 6 deletions
  1. 13 6
      automation/spark/sparker.py

+ 13 - 6
automation/spark/sparker.py

@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2017-2019  Joe Clarke <jclarke@cisco.com>
+# Copyright (c) 2017-2023  Joe Clarke <jclarke@cisco.com>
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -75,17 +75,24 @@ class Sparker(object):
                 response = requests.request(*args, **kwargs)
                 response.raise_for_status()
                 return response
-            except Exception:
-                if (response.status_code != 429 and response.status_code != 503 and response.status_code != 400) or i == Sparker.RETRIES:
-                    return response
+            except requests.HTTPError as e:
+                if (
+                    e.response.status_code != 429 and e.response.status_code != 503 and e.response.status_code != 400
+                ) or i == Sparker.RETRIES:
+                    return e.response
 
-                if response.status_code == 400:
+                if e.response.status_code == 400:
                     print("XXX: Body is {}".format(response.text))
-                    return response
+                    return e.response
+
+                if e.response.status_code == 429:
+                    backoff = int(e.response.headers.get("retry-after"))
 
                 time.sleep(backoff)
                 backoff *= 2
                 i += 1
+            except Exception:
+                return None
 
     @staticmethod
     def _get_items_pages(*args, **kwargs):