B \5@s$ddlZddlZddlZddlmZddlmZmZmZm Z m Z e e Z de e eegiZddZddZd%d d Zd&d d Zd'd dZddZddZddZGdddeZGdddeZGdddeZGdddeZGdddeZGdd d eZGd!d"d"eZGd#d$d$eZdS)(N)crc32) ChecksumErrorEndpointConnectionErrorReadTimeoutErrorConnectionErrorConnectionClosedErrorZGENERAL_CONNECTION_ERRORcCs:|dkrt}n|dkr&td||||d}|S)a1Calculate time to sleep based on exponential function. The format is:: base * growth_factor ^ (attempts - 1) If ``base`` is set to 'rand' then a random number between 0 and 1 will be used as the base. Base must be greater than 0, otherwise a ValueError will be raised. Zrandrz0The 'base' param must be greater than 0, got: %s)random ValueError)base growth_factorattemptsZ time_to_sleepr9/tmp/pip-build-uw_ogi45/botocore/botocore/retryhandler.pydelay_exponential's  rcCstjt||dS)zCreate an exponential delay function based on the attempts. This is used so that you only have to pass it the attempts parameter to calculate the delay. )r r ) functoolspartialr)r r rrr!create_exponential_delay_function=srcCs$t||d}t||d}t||dS)N)operation_name)checkeraction) create_checker_from_retry_configcreate_retry_action_from_config RetryHandler)configrrrrrrcreate_retry_handlerHs   rcCs0|dd}|ddkr,t|d|ddSdS)N __default__delaytypeZ exponentialr r )r r )r)rrZ delay_configrrrrPs   rc Csg}d}g}d|krn|ddg}|dd}x<|D]4}||}|t|t|}|dk r6||q6W|dk r||dk r||d} x<| D]4}|t| |t| |}|dk r||qWt|dkrt|d|dSt|} t| |t|dSdS)Nrpolicies max_attemptsrr)r )r retryable_exceptions) getappend_create_single_checker_extract_retryable_exceptionextendlenMaxAttemptsDecorator MultiCheckertuple) rrcheckersr r!rkeyZcurrent_configZretry_exceptionZoperation_policiesZ multi_checkerrrrr\s4      rcCs2d|dkrt|ddSd|dkr.tSdS)Nresponse applies_when socket_errors)_create_single_response_checkerExceptionRaiser)rrrrr${s   r$cCs^d|krt|d|dd}nr r-caught_exceptionkwargsresultrrr__call__s   zRetryHandler.__call__N)__name__ __module__ __qualname____doc__r?rErrrrrs rc@s(eZdZdZddZddZddZdS) BaseCheckerzBase class for retry checkers. Each class is responsible for checking a single criteria that determines whether or not a retry should not happen. cCs4|dk r|||S|dk r(|||StddS)aDetermine if retry criteria matches. Note that either ``response`` is not None and ``caught_exception`` is None or ``response`` is None and ``caught_exception`` is not None. :type attempt_number: int :param attempt_number: The total number of times we've attempted to send the request. :param response: The HTTP response (if one was received). :type caught_exception: Exception :param caught_exception: Any exception that was caught while trying to send the HTTP response. :return: True, if the retry criteria matches (and therefore a retry should occur. False if the criteria does not match. Nz,Both response and caught_exception are None.)_check_response_check_caught_exceptionr )r>attempt_numberr-rBrrrrEs  zBaseChecker.__call__cCsdS)Nr)r>rMr-rrrrKszBaseChecker._check_responsecCsdS)Nr)r>rMrBrrrrLsz#BaseChecker._check_caught_exceptionN)rFrGrHrIrErKrLrrrrrJsrJc@s*eZdZdZd ddZddZddZdS) r(aAllow retries up to a maximum number of attempts. This will pass through calls to the decorated retry checker, provided that the number of attempts does not exceed max_attempts. It will also catch any retryable_exceptions passed in. Once max_attempts has been exceeded, then False will be returned or the retryable_exceptions that was previously being caught will be raised. NcCs||_||_||_dS)N)r< _max_attempts_retryable_exceptions)r>rr r!rrrr?szMaxAttemptsDecorator.__init__cCs^||||}|rV||jkrP|dk r@d|dkr@d|ddd<td|dS|SndSdS)NZResponseMetadatarTZMaxAttemptsReachedz0Reached the maximum number of retry attempts: %sF) _should_retryrNr@rA)r>rMr-rBZ should_retryrrrrEs zMaxAttemptsDecorator.__call__c Csh|jrV||jkrVy||||S|jk rR}ztjd|dddSd}~XYqdXn||||SdS)Nz,retry needed, retryable exception caught: %sT)exc_info)rOrNr<r@rA)r>rMr-rBerrrrP s  z"MaxAttemptsDecorator._should_retry)N)rFrGrHrIr?rErPrrrrr(s  r(c@seZdZddZddZdS)r7cCs ||_dS)N) _status_code)r>r2rrrr?szHTTPStatusCodeChecker.__init__cCs*|dj|jkr"td|jdSdSdS)Nrz5retry needed: retryable HTTP status code received: %sTF)r2rSr@rA)r>rMr-rrrrKs z%HTTPStatusCodeChecker._check_responseN)rFrGrHr?rKrrrrr7sr7c@seZdZddZddZdS)r6cCs||_||_dS)N)rS _error_code)r>r2r3rrrr?'sz ServiceErrorCodeChecker.__init__cCsJ|dj|jkrF|ddid}||jkrFtd|j|jdSdS)NrrErrorZCodez>retry needed: matching HTTP status and error code seen: %s, %sTF)r2rSr"rTr@rA)r>rMr-Zactual_error_coderrrrK+s  z'ServiceErrorCodeChecker._check_responseN)rFrGrHr?rKrrrrr6&sr6c@seZdZddZddZdS)r)cCs ||_dS)N) _checkers)r>r+rrrr?7szMultiChecker.__init__cCs(x"|jD]}||||}|r|SqWdS)NF)rV)r>rMr-rBrZchecker_responserrrrE:s  zMultiChecker.__call__N)rFrGrHr?rErrrrr)6sr)c@seZdZddZddZdS)r8cCs ||_dS)N) _header_name)r>r5rrrr?DszCRC32Checker.__init__cCst|d}|j|j}|dkr.td|jnBt|djd@}|t|ksptdt||tdt||ddS)Nrz?crc32 check skipped, the %s header is not in the http response.lz>retry needed: crc32 check failed, expected != actual: %s != %sr)Z checksum_typeZexpected_checksumZactual_checksum) headersr"rWr@rArcontentintr)r>rMr- http_responseZ expected_crcZ actual_crc32rrrrKHs   zCRC32Checker._check_responseN)rFrGrHr?rKrrrrr8Csr8c@seZdZdZddZdS)r1z`Raise any caught exceptions. This class will raise any non None ``caught_exception``. cCs|dS)Nr)r>rMrBrrrrL_sz'ExceptionRaiser._check_caught_exceptionN)rFrGrHrIrLrrrrr1Ysr1)N)N)N) r rloggingbinasciirZbotocore.exceptionsrrrrr getLoggerrFr@r9rrrrrr$r0r%objectrrJr(r7r6r)r8r1rrrrs0      ,.