the 413 detail is the sneaky part. Retry After being present and respect_retry_after_header being on are what let 413 get retried, and it only matters because 429 and 503 already sit in the forcelist, so trimming that list changes the answer.
also from reading the 2.8 source, a garbage Retry After value makes parse_retry_after raise InvalidHeader rather than falling back to exponential backoff like the flow suggests. the backoff schedule and the idempotency point look right to me. pinning urllib3 to 2 or newer seems needed since the sample uses backoff_max and backoff_jitter
the 413 detail is the sneaky part. Retry After being present and respect_retry_after_header being on are what let 413 get retried, and it only matters because 429 and 503 already sit in the forcelist, so trimming that list changes the answer.
also from reading the 2.8 source, a garbage Retry After value makes parse_retry_after raise InvalidHeader rather than falling back to exponential backoff like the flow suggests. the backoff schedule and the idempotency point look right to me. pinning urllib3 to 2 or newer seems needed since the sample uses backoff_max and backoff_jitter