22
33import os
44import re
5- import time
65from typing import (
76 Any ,
87 BinaryIO ,
@@ -718,7 +717,12 @@ def http_request(
718717 send_data = self ._backend .prepare_send_data (files , post_data , raw )
719718 opts ["headers" ]["Content-type" ] = send_data .content_type
720719
721- cur_retries = 0
720+ retry = utils .Retry (
721+ max_retries = max_retries ,
722+ obey_rate_limit = obey_rate_limit ,
723+ retry_transient_errors = retry_transient_errors ,
724+ )
725+
722726 while True :
723727 try :
724728 result = self ._backend .http_request (
@@ -733,46 +737,17 @@ def http_request(
733737 ** opts ,
734738 )
735739 except (requests .ConnectionError , requests .exceptions .ChunkedEncodingError ):
736- if retry_transient_errors and (
737- max_retries == - 1 or cur_retries < max_retries
738- ):
739- wait_time = 2 ** cur_retries * 0.1
740- cur_retries += 1
741- time .sleep (wait_time )
740+ if retry .handle_retry ():
742741 continue
743-
744742 raise
745743
746744 self ._check_redirects (result .response )
747745
748746 if 200 <= result .status_code < 300 :
749747 return result .response
750748
751- def should_retry () -> bool :
752- if result .status_code == 429 and obey_rate_limit :
753- return True
754-
755- if not retry_transient_errors :
756- return False
757- if result .status_code in gitlab .const .RETRYABLE_TRANSIENT_ERROR_CODES :
758- return True
759- if result .status_code == 409 and "Resource lock" in result .reason :
760- return True
761-
762- return False
763-
764- if should_retry ():
765- # Response headers documentation:
766- # https://docs.gitlab.com/ee/user/admin_area/settings/user_and_ip_rate_limits.html#response-headers
767- if max_retries == - 1 or cur_retries < max_retries :
768- wait_time = 2 ** cur_retries * 0.1
769- if "Retry-After" in result .headers :
770- wait_time = int (result .headers ["Retry-After" ])
771- elif "RateLimit-Reset" in result .headers :
772- wait_time = int (result .headers ["RateLimit-Reset" ]) - time .time ()
773- cur_retries += 1
774- time .sleep (wait_time )
775- continue
749+ if retry .handle_retry_on_status (result ):
750+ continue
776751
777752 error_message = result .content
778753 try :
0 commit comments