o
    é’Ojlš  ã                   @   s>  d dl Z d dlZd dlZd dlmZ d dlmZ d dlZd dl	Zd dl
Zd dlZd dlmZmZmZmZ d dlmZmZmZmZmZ d dl	mZmZmZ d dlmZ d dlmZ d d	lmZ d d
l m!Z! d dl"m#Z#m$Z$ d dl%m&Z&m'Z' d dl(m)Z) d dl*m+Z+m,Z, d dl-m.Z. d dl/m0Z0m1Z1m2Z2m3Z3m4Z4 e  5e6¡Z7da8dd„ Z9dddde' ddfdd„Z:d8dd„Z;dd„ Z<G dd„ dƒZ=G dd„ de,ƒZ>G dd „ d e+ƒZ?G d!d"„ d"ƒZ@G d#d$„ d$e@ƒZAG d%d&„ d&eƒZBG d'd(„ d(ƒZCG d)d*„ d*ƒZDed+d,d-gƒZEG d.d/„ d/ƒZFG d0d1„ d1ƒZGG d2d3„ d3ƒZHG d4d5„ d5ƒZIG d6d7„ d7ƒZJdS )9é    N)Ú
namedtuple)ÚBytesIO)ÚAwsCredentialsÚAwsCredentialsProviderÚAwsSigningAlgorithmÚAwsSigningConfig)ÚClientBootstrapÚClientTlsContextÚDefaultHostResolverÚEventLoopGroupÚTlsContextOptions)ÚS3ClientÚS3RequestTlsModeÚS3RequestType)ÚUNSIGNED)Úurlsplit)ÚConfig)ÚNoCredentialsError)Ú	ArnParserÚInvalidArnException)ÚFULL_OBJECT_CHECKSUM_ARGSÚMB)ÚTransferNotDoneError)ÚBaseTransferFutureÚBaseTransferMeta)ÚTransferManager)ÚCallArgsÚOSUtilsÚcreate_nested_clientÚget_callbacksÚis_s3express_bucketc                 C   s>   t d u rtj | ¡}z| ¡  W n
 ty   Y d S w |a t S ©N)ÚCRT_S3_PROCESS_LOCKÚawscrtÚs3ÚCrossProcessLockÚacquireÚRuntimeError)ÚnameÚcrt_lock© r*   úT/var/www/html/pharmsmart-cdr-gen/venv/lib/python3.10/site-packages/s3transfer/crt.pyÚacquire_crt_s3_process_lock<   s   ür,   é   Tc              
   C   s†   t |ƒ}t|ƒ}t||ƒ}	d}
|rtjntj}|dur2tƒ }|r'|j|d� nd|_t	|ƒ}| 
¡ }
t|d�}t|	| ||||
|dd�S )a�  
    :type region: str
    :param region: The region used for signing

    :type crt_credentials_provider:
        Optional[awscrt.auth.AwsCredentialsProvider]
    :param crt_credentials_provider: CRT AWS credentials provider
        to use to sign requests. If not set, requests will not be signed.

    :type num_threads: Optional[int]
    :param num_threads: Number of worker threads generated. Default
        is the number of processors in the machine.

    :type target_throughput: Optional[int]
    :param target_throughput: Throughput target in bytes per second.
        By default, CRT will automatically attempt to choose a target
        throughput that matches the system's maximum network throughput.
        Currently, if CRT is unable to determine the maximum network
        throughput, a fallback target throughput of ``1_250_000_000`` bytes
        per second (which translates to 10 gigabits per second, or 1.16
        gibibytes per second) is used. To set a specific target
        throughput, set a value for this parameter.

    :type part_size: Optional[int]
    :param part_size: Size, in Bytes, of parts that files will be downloaded
        or uploaded in.

    :type use_ssl: boolean
    :param use_ssl: Whether or not to use SSL.  By default, SSL is used.
        Note that not all services support non-ssl connections.

    :type verify: Optional[boolean/string]
    :param verify: Whether or not to verify SSL certificates.
        By default SSL certificates are verified.  You can provide the
        following values:

        * False - do not validate SSL certificates.  SSL will still be
            used (unless use_ssl is False), but SSL certificates
            will not be verified.
        * path/to/cert/bundle.pem - A filename of the CA cert bundle to
            use. Specify this argument if you want to use a custom CA cert
            bundle instead of the default one on your system.
    N)Úca_filepathF)Ú provided_throughput_target_bytesT)Ú	bootstrapÚregionÚcredential_providerÚ	part_sizeÚtls_modeÚtls_connection_optionsÚthroughput_target_gbpsÚenable_s3express)r   r
   r   r   ÚENABLEDÚDISABLEDr   Ú&override_default_trust_store_from_pathÚverify_peerr	   Únew_connection_optionsÚ_get_crt_throughput_target_gbpsr   )r1   Úcrt_credentials_providerÚnum_threadsÚtarget_throughputr3   Úuse_sslÚverifyÚevent_loop_groupÚhost_resolverr0   r5   r4   Útls_ctx_optionsÚclient_tls_optionÚtarget_gbpsr*   r*   r+   Úcreate_s3_crt_clientU   s8   4
ÿÿÿørH   c                 C   sH   | d u rt j ¡ }t d|¡ |d u rd}n| d d }t d|¡ |S )Nz-Recommended CRT throughput target in gbps: %sg      $@r-   i Êš;z'Using CRT throughput target in gbps: %s)r#   r$   Ú&get_recommended_throughput_target_gbpsÚloggerÚdebug)r/   rG   r*   r*   r+   r=   ª   s   
ÿ€r=   c              	   C   sB   t j}ztt| d¡ƒ}t|ƒ}W || kS  ttfy    Y dS w )NÚ.F)r#   Ú__version__ÚmapÚintÚsplitÚtupleÚ	TypeErrorÚ
ValueError)Úminimum_versionÚcrt_version_strÚcrt_version_intsÚcrt_version_tupler*   r*   r+   Ú_has_minimum_crt_version¼   s   
þÿrX   c                   @   s¸   e Zd ZejZejZejZdZejZ	d$dd„Z	dd„ Z
dd„ Z	d$d	d
„Zd$dd„Zd$dd„Zd%dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd%dd„Zd d!„ Zd"d#„ ZdS )&ÚCRTTransferManagerTNc                 C   sJ   |du rt ƒ | _|| _t|| j|ƒ| _|j| _g | _t 	d¡| _
d| _dS )aì  A transfer manager interface for Amazon S3 on CRT s3 client.

        :type crt_s3_client: awscrt.s3.S3Client
        :param crt_s3_client: The CRT s3 client, handling all the
            HTTP requests and functions under then hood

        :type crt_request_serializer: s3transfer.crt.BaseCRTRequestSerializer
        :param crt_request_serializer: Serializer, generates unsigned crt HTTP
            request.

        :type osutil: s3transfer.utils.OSUtils
        :param osutil: OSUtils object to use for os-related behavior when
            using with transfer manager.

        :type config: s3transfer.manager.TransferConfig
        :param config: The transfer configuration to be used when
            making CRT S3 client requests.
        Né€   r   )r   Ú_osutilÚ_crt_s3_clientÚS3ClientArgsCreatorÚ_s3_args_creatorÚtranslate_crt_exceptionÚ_crt_exception_translatorÚ_future_coordinatorsÚ	threadingÚ	SemaphoreÚ
_semaphoreÚ_id_counter)ÚselfÚcrt_s3_clientÚcrt_request_serializerÚosutilÚconfigr*   r*   r+   Ú__init__Ï   s   ýÿ
zCRTTransferManager.__init__c                 C   s   | S r!   r*   ©rf   r*   r*   r+   Ú	__enter__ô   s   zCRTTransferManager.__enter__c                 G   s   d}|rd}|   |¡ d S )NFT©Ú	_shutdown)rf   Úexc_typeÚ	exc_valueÚargsÚcancelr*   r*   r+   Ú__exit__÷   s   zCRTTransferManager.__exit__c                 C   sN   |d u ri }|d u ri }|   || j¡ |  |¡ t|||||d�}|  d|¡S )N©ÚbucketÚkeyÚfileobjÚ
extra_argsÚsubscribersÚ
get_object)Ú_validate_all_known_argsÚALLOWED_DOWNLOAD_ARGSÚ_validate_if_bucket_supportedr   Ú_submit_transfer)rf   rv   rw   rx   ry   rz   Úcallargsr*   r*   r+   Údownloadý   s   
ûzCRTTransferManager.downloadc                 C   sX   |d u ri }|d u ri }|   || j¡ |  |¡ |  |¡ t|||||d�}|  d|¡S )Nru   Ú
put_object)r|   ÚALLOWED_UPLOAD_ARGSr~   Ú&_validate_checksum_algorithm_supportedr   r   )rf   rx   rv   rw   ry   rz   r€   r*   r*   r+   Úupload  s   

ûzCRTTransferManager.uploadc                 C   sL   |d u ri }|d u ri }|   || j¡ |  |¡ t||||d�}|  d|¡S )N)rv   rw   ry   rz   Údelete_object)r|   ÚALLOWED_DELETE_ARGSr~   r   r   )rf   rv   rw   ry   rz   r€   r*   r*   r+   Údelete   s   
üzCRTTransferManager.deleteFc                 C   s   |   |¡ d S r!   rn   ©rf   rs   r*   r*   r+   Úshutdown/  ó   zCRTTransferManager.shutdownc                 C   s@   | j r| j ¡ D ]\}}| |¡}|rtd|› d�ƒ‚qd S d S )Nz'TransferManager methods do not support z+ resource. Use direct client calls instead.)Ú VALIDATE_SUPPORTED_BUCKET_VALUESÚ_UNSUPPORTED_BUCKET_PATTERNSÚitemsÚmatchrS   )rf   rv   ÚresourceÚpatternr�   r*   r*   r+   r~   2  s   

ÿÿýz0CRTTransferManager._validate_if_bucket_supportedc                 C   s0   |D ]}||vrt d|› dd |¡› �ƒ‚qd S )NzInvalid extra_args key 'z', must be one of: z, )rS   Újoin)rf   ÚactualÚallowedÚkwargr*   r*   r+   r|   ?  s   ÿÿÿÿz+CRTTransferManager._validate_all_known_argsc                 C   sH   |  d¡}|d u rd S ttjjjƒ}| ¡ |vr"td|› d|› �ƒ‚d S )NÚChecksumAlgorithmzChecksumAlgorithm: z* not supported. Supported algorithms are: )ÚgetÚlistr#   r$   ÚS3ChecksumAlgorithmÚ__members__ÚupperrS   )rf   ry   Úchecksum_algorithmÚsupported_algorithmsr*   r*   r+   r„   G  s   
ÿÿÿz9CRTTransferManager._validate_checksum_algorithm_supportedc                 C   s    | j D ]
}| ¡ s| ¡  qd S r!   )ra   Údoners   ©rf   Úcoordinatorr*   r*   r+   Ú_cancel_transfersR  s
   
€þz$CRTTransferManager._cancel_transfersc                 C   ó   | j D ]}| ¡  qd S r!   )ra   ÚresultrŸ   r*   r*   r+   Ú_finish_transfersW  ó   

ÿz$CRTTransferManager._finish_transfersc                 C   r¢   r!   )ra   Ú%wait_until_on_done_callbacks_completerŸ   r*   r*   r+   Ú_wait_transfers_done[  r¥   z'CRTTransferManager._wait_transfers_donec                 C   sz   |r|   ¡  z1z|  ¡  W n ty   |   ¡  Y n ty"   Y nw W |  ¡  d S W |  ¡  d S W |  ¡  d S |  ¡  w r!   )r¡   r¤   ÚKeyboardInterruptÚ	Exceptionr§   r‰   r*   r*   r+   ro   _  s   ÿüüþzCRTTransferManager._shutdownc                 K   ó   | j  ¡  d S r!   )rd   Úrelease©rf   Úkwargsr*   r*   r+   Ú_release_semaphorel  r‹   z%CRTTransferManager._release_semaphorec              
   C   s  | j g}t| j| jd�}t| j|ƒ|dœ}td	i |¤Ž}t|ƒ}| |¡ z$| j 	¡  | j
 |d¡}|ƒ  | j
 |||||¡}	| jjd	i |	¤Ž}
W n& tyo } z| |d¡ | j
j|d|d�}||d� W Y d }~n
d }~ww | |
¡ | j |¡ |  jd7  _|S )
N)Útransfer_idÚexception_translator)Úmetar    ÚqueuedTrž   )Úafter_subscribers)Úerroré   r*   )r®   ÚCRTTransferCoordinatorre   r`   ÚCRTTransferMetaÚCRTTransferFutureÚAfterDoneHandlerÚappendrd   r&   r^   Úget_crt_callbackÚget_make_request_argsr\   Úmake_requestr©   Úset_exceptionÚset_s3_requestra   )rf   Úrequest_typeÚ	call_argsÚon_done_after_callsr    Ú
componentsÚfutureÚ	afterdoneÚ	on_queuedÚcrt_callargsÚcrt_s3_requestÚeÚon_doner*   r*   r+   r   o  sJ   þ
þ

ÿûÿ€û
z#CRTTransferManager._submit_transfer©NN©F)Ú__name__Ú
__module__Ú__qualname__r   r}   rƒ   r‡   rŒ   r�   rk   rm   rt   r�   r…   rˆ   rŠ   r~   r|   r„   r¡   r¤   r§   ro   r®   r   r*   r*   r*   r+   rY   Æ   s0    
ÿ%
ÿ



rY   c                   @   s>   e Zd ZdZddd„Zedd„ ƒZedd„ ƒZed	d
„ ƒZdS )r·   z*Holds metadata about the CRTTransferFutureNc                 C   s   || _ || _i | _d S r!   )Ú_transfer_idÚ
_call_argsÚ_user_context)rf   r¯   rÁ   r*   r*   r+   rk   œ  ó   
zCRTTransferMeta.__init__c                 C   ó   | j S r!   )rÑ   rl   r*   r*   r+   rÁ   ¡  ó   zCRTTransferMeta.call_argsc                 C   rÔ   r!   )rÐ   rl   r*   r*   r+   r¯   ¥  rÕ   zCRTTransferMeta.transfer_idc                 C   rÔ   r!   )rÒ   rl   r*   r*   r+   Úuser_context©  rÕ   zCRTTransferMeta.user_contextrË   )	rÍ   rÎ   rÏ   Ú__doc__rk   ÚpropertyrÁ   r¯   rÖ   r*   r*   r*   r+   r·   ™  s    


r·   c                   @   sD   e Zd Zddd„Zedd„ ƒZdd„ Zddd	„Zd
d„ Zdd„ Z	dS )r¸   Nc                 C   s    || _ |du rtƒ | _ || _dS )aZ  The future associated to a submitted transfer request via CRT S3 client

        :type meta: s3transfer.crt.CRTTransferMeta
        :param meta: The metadata associated to the transfer future.

        :type coordinator: s3transfer.crt.CRTTransferCoordinator
        :param coordinator: The coordinator associated to the transfer future.
        N)Ú_metar·   Ú_coordinator)rf   r±   r    r*   r*   r+   rk   ¯  s   	
zCRTTransferFuture.__init__c                 C   rÔ   r!   )rÙ   rl   r*   r*   r+   r±   ½  rÕ   zCRTTransferFuture.metac                 C   s
   | j  ¡ S r!   )rÚ   rž   rl   r*   r*   r+   rž   Á  ó   
zCRTTransferFuture.donec                 C   ó   | j  |¡ d S r!   )rÚ   r£   ©rf   Útimeoutr*   r*   r+   r£   Ä  ó   zCRTTransferFuture.resultc                 C   rª   r!   )rÚ   rs   rl   r*   r*   r+   rs   Ç  r‹   zCRTTransferFuture.cancelc                 C   s$   |   ¡ stdƒ‚| jj|dd� dS )z!Sets the exception on the future.z?set_exception can only be called once the transfer is complete.T)ÚoverrideN)rž   r   rÚ   r¾   ©rf   Ú	exceptionr*   r*   r+   r¾   Ê  s
   ÿzCRTTransferFuture.set_exceptionrË   r!   )
rÍ   rÎ   rÏ   rk   rØ   r±   rž   r£   rs   r¾   r*   r*   r*   r+   r¸   ®  s    


r¸   c                   @   ó   e Zd Zdd„ Zdd„ ZdS )ÚBaseCRTRequestSerializerc                 C   ó   t dƒ‚)al  Serialize CRT HTTP requests.

        :type transfer_type: string
        :param transfer_type: the type of transfer made,
            e.g 'put_object', 'get_object', 'delete_object'

        :type future: s3transfer.crt.CRTTransferFuture

        :rtype: awscrt.http.HttpRequest
        :returns: An unsigned HTTP request to be used for the CRT S3 client
        zserialize_http_request()©ÚNotImplementedError)rf   Útransfer_typerÄ   r*   r*   r+   Úserialize_http_requestÕ  s   z/BaseCRTRequestSerializer.serialize_http_requestc                 C   rå   )Nztranslate_crt_exception()ræ   rá   r*   r*   r+   r_   ã  s   z0BaseCRTRequestSerializer.translate_crt_exceptionN)rÍ   rÎ   rÏ   ré   r_   r*   r*   r*   r+   rä   Ô  s    rä   c                   @   sn   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )ÚBotocoreCRTRequestSerializerNc                 C   s„   || _ |du r	i }|  ||¡ t|fi |¤Ž| _| jjj d| j¡ | jjj d| j¡ | jjj d| j	¡ | jjj d| j
¡ dS )aÂ  Serialize CRT HTTP request using botocore logic
        It also takes into account configuration from both the session
        and any keyword arguments that could be passed to
        `Session.create_client()` when serializing the request.

        :type session: botocore.session.Session

        :type client_kwargs: Optional[Dict[str, str]])
        :param client_kwargs: The kwargs for the botocore
            s3 client initialization.
        Nzrequest-created.s3.*zafter-call.s3.*zbefore-send.s3.*zbefore-call.s3.*)Ú_sessionÚ_resolve_client_configr   Ú_clientr±   ÚeventsÚregisterÚ_capture_http_requestÚ+_change_response_to_serialized_http_requestÚ_make_fake_http_responseÚ_remove_checksum_context)rf   ÚsessionÚclient_kwargsr*   r*   r+   rk   è  s"   
ÿ
ÿ
ÿ
ÿz%BotocoreCRTRequestSerializer.__init__c                 C   sP   d }|  ¡ r
|  ¡ }d|v r|d }ttd�}|r| |¡}||d< d|d< d S )Nrj   )Úsignature_versionr$   Úservice_name)Úget_default_client_configr   r   Úmerge)rf   rô   rõ   Úuser_provided_configÚclient_configr*   r*   r+   rì     s   

z3BotocoreCRTRequestSerializer._resolve_client_configc           	      C   s”   t |jƒ}|j}|jr|› d|j› �}g }|j ¡ D ]\}}t|tƒr+| ||f¡ q| |t|dƒf¡ qt	j
 |¡}t	j
j|j|||jd�}|S )Nú?zutf-8)ÚmethodÚpathÚheadersÚbody_stream)r   Úurlrþ   Úqueryrÿ   rŽ   Ú
isinstanceÚstrrº   r#   ÚhttpÚHttpHeadersÚHttpRequestrý   Úbody)	rf   Úaws_requestÚ	url_partsÚcrt_pathÚheaders_listr(   ÚvalueÚcrt_headersÚcrt_requestr*   r*   r+   Ú_crt_request_from_aws_request  s"   

üz:BotocoreCRTRequestSerializer._crt_request_from_aws_requestc                 C   s˜   |   |¡}|j d¡d u rt|jƒ}|j d|j¡ |j d¡d ur(|j d¡ |j d¡d u r<|jd u r<|j 	dd¡ |j d¡d urJ|j d¡ |S )NÚhostzContent-MD5zContent-LengthÚ0zTransfer-Encoding)
r  rÿ   r—   r   r  ÚsetÚnetlocÚremover  Úadd)rf   Úbotocore_http_requestr  r
  r*   r*   r+   Ú_convert_to_crt_http_request)  s   


z9BotocoreCRTRequestSerializer._convert_to_crt_http_requestc                 K   s   ||j d< d S )NÚhttp_request)Úcontext©rf   Úrequestr­   r*   r*   r+   rð   G  r‹   z2BotocoreCRTRequestSerializer._capture_http_requestc                 K   s   |d }|  ¡ |d< d S )Nr  ÚHTTPRequest)Úprepare)rf   r  Úparsedr­   r  r*   r*   r+   rñ   J  s   zHBotocoreCRTRequestSerializer._change_response_to_serialized_http_requestc                 K   s   t j d di tdƒ¡S )NéÈ   ó    )ÚbotocoreÚ
awsrequestÚAWSResponseÚFakeRawResponser  r*   r*   r+   rò   P  s   üz5BotocoreCRTRequestSerializer._make_fake_http_responsec                 C   s&   t | j|ƒd|j|jdœ|j¤Žd S )N)ÚBucketÚKeyr  r*   )Úgetattrrí   rv   rw   ry   )rf   Úclient_methodrÁ   r*   r*   r+   Ú_get_botocore_http_requestX  s   ÿÿþz7BotocoreCRTRequestSerializer._get_botocore_http_requestc                 C   s   |   ||jj¡}|  |¡}|S r!   )r*  r±   rÁ   r  )rf   rè   rÄ   r  r  r*   r*   r+   ré   ]  s
   ÿ
z3BotocoreCRTRequestSerializer.serialize_http_requestc                 C   s   t |tjjƒr|  |¡S d S r!   )r  r#   r$   ÚS3ResponseErrorÚ _translate_crt_s3_response_errorrá   r*   r*   r+   r_   d  s   
z4BotocoreCRTRequestSerializer.translate_crt_exceptionc                 C   s    |j }|dk r	d S dd„ |jD ƒ}|j}|d ur$| jjj}| |¡j}nd }tj	 
|¡||jdœ}| jjj||d�}| di ¡ d¡}	| jj |	¡}
|
||d�S )	Ni-  c                 S   s   i | ]\}}||“qS r*   r*   )Ú.0ÚkÚvr*   r*   r+   Ú
<dictcomp>q  s    zQBotocoreCRTRequestSerializer._translate_crt_s3_response_error.<locals>.<dictcomp>)rÿ   Ústatus_coder  )ÚshapeÚErrorÚCode)Úoperation_name)r1  rÿ   r5  rí   r±   Úservice_modelÚoperation_modelÚoutput_shaper"  r#  ÚHeadersDictr  Ú_response_parserÚparser—   Ú
exceptionsÚ	from_code)rf   Ús3_response_errorr1  rÿ   r5  r6  r2  Úresponse_dictÚparsed_responseÚ
error_codeÚerror_classr*   r*   r+   r,  j  s&   

ýÿz=BotocoreCRTRequestSerializer._translate_crt_s3_response_errorc                 K   s"   |  di ¡}d|v r|d= d S d S )Nr  Úchecksum)r—   )rf   Úparamsr­   Úrequest_contextr*   r*   r+   ró   †  s   
ÿz5BotocoreCRTRequestSerializer._remove_checksum_contextr!   )rÍ   rÎ   rÏ   rk   rì   r  r  rð   rñ   rò   r*  ré   r_   r,  ró   r*   r*   r*   r+   rê   ç  s    
rê   c                   @   s   e Zd Zddd„ZdS )r%  é   Nc                 c   s   � 	 |   |¡}|sd S |V  qr!   )Úread)rf   ÚamtÚdecode_contentÚchunkr*   r*   r+   Ústream�  s   €
üzFakeRawResponse.stream)rF  N)rÍ   rÎ   rÏ   rK  r*   r*   r*   r+   r%  Œ  s    r%  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚBotocoreCRTCredentialsWrapperc                 C   ó
   || _ d S r!   )Ú_resolved_credentials)rf   Úresolved_botocore_credentialsr*   r*   r+   rk   –  rÛ   z&BotocoreCRTCredentialsWrapper.__init__c                 C   s   |   ¡  ¡ }t|j|j|jƒS r!   )Ú_get_credentialsÚget_frozen_credentialsr   Ú
access_keyÚ
secret_keyÚtoken)rf   Úcredentialsr*   r*   r+   Ú__call__™  s   ÿz&BotocoreCRTCredentialsWrapper.__call__c                 C   s
   t  | ¡S r!   )r   Únew_delegaterl   r*   r*   r+   Úto_crt_credentials_providerŸ  rÛ   z9BotocoreCRTCredentialsWrapper.to_crt_credentials_providerc                 C   s   | j d u rtƒ ‚| j S r!   )rN  r   rl   r*   r*   r+   rP  ¢  s   
z.BotocoreCRTCredentialsWrapper._get_credentialsN)rÍ   rÎ   rÏ   rk   rV  rX  rP  r*   r*   r*   r+   rL  •  s
    rL  c                   @   sn   e Zd ZdZ	ddd„Zedd„ ƒZdd„ Zdd	d
„Zddd„Z	dd„ Z
ddd„Zdd„ Zdd„ Zdd„ ZdS )r¶   z-A helper class for managing CRTTransferFutureNc                 C   s6   || _ || _|| _t ¡ | _d | _d | _t ¡ | _	d S r!   )
r¯   Ú_exception_translatorÚ_s3_requestrb   ÚLockÚ_lockÚ
_exceptionÚ_crt_futureÚEventÚ_done_event)rf   r¯   Ú
s3_requestr°   r*   r*   r+   rk   «  s   
zCRTTransferCoordinator.__init__c                 C   rÔ   r!   )rZ  rl   r*   r*   r+   ra  ¶  rÕ   z!CRTTransferCoordinator.s3_requestc                 C   rª   r!   )r`  r  rl   r*   r*   r+   Úset_done_callbacks_completeº  r‹   z2CRTTransferCoordinator.set_done_callbacks_completec                 C   rÜ   r!   )r`  ÚwaitrÝ   r*   r*   r+   r¦   ½  rß   z<CRTTransferCoordinator.wait_until_on_done_callbacks_completeFc                 C   sN   | j � |  ¡ r
|r|| _W d   ƒ d S W d   ƒ d S 1 s w   Y  d S r!   )r\  rž   r]  )rf   râ   rà   r*   r*   r+   r¾   À  s   þ"ÿz$CRTTransferCoordinator.set_exceptionc                 C   s   | j r
| j  ¡  d S d S r!   )rZ  rs   rl   r*   r*   r+   rs   Å  s   ÿzCRTTransferCoordinator.cancelc              
   C   s”   | j r| j ‚z<z| j |¡ W n( ty!   |  ¡  | j |¡ ‚  ty7 } z|  |¡ W Y d }~nd }~ww W | jrAd | _d S d S | jrId | _w r!   )r]  r^  r£   r¨   rs   r©   Úhandle_exceptionrZ  )rf   rÞ   rÉ   r*   r*   r+   r£   É  s"   €ÿ€

ÿzCRTTransferCoordinator.resultc              
   C   s^   d }| j r&z|   |¡}W n ty% } ztjd|d� W Y d }~nd }~ww |d ur-||‚|‚)NzUnable to translate exception.)Úexc_info)rY  r©   rJ   rK   )rf   ÚexcÚtranslated_excrÉ   r*   r*   r+   rd  Ø  s   €üz'CRTTransferCoordinator.handle_exceptionc                 C   s   | j d u rdS | j  ¡ S )NF)r^  rž   rl   r*   r*   r+   rž   ç  s   

zCRTTransferCoordinator.donec                 C   s   || _ | j j| _d S r!   )rZ  Úfinished_futurer^  )rf   ra  r*   r*   r+   r¿   ì  s   z%CRTTransferCoordinator.set_s3_request)NNNr!   rÌ   )rÍ   rÎ   rÏ   r×   rk   rØ   ra  rb  r¦   r¾   rs   r£   rd  rž   r¿   r*   r*   r*   r+   r¶   ¨  s    
ÿ



r¶   ÚCRTConfigParameterr(   Úmin_versionc                   @   sj   e Zd ZdeddƒiZddd„Zdd„ Zd	d
„ Zdd„ Zdd„ Z			ddd„Z
dd„ Zdd„ Zdd„ ZdS )r]   Úmax_active_connections_overrideÚmax_request_concurrency)r   é   r   Nc                 C   s   || _ || _|| _d S r!   )Ú_request_serializerÚ	_os_utilsÚ_config)rf   rh   Úos_utilsrj   r*   r*   r+   rk   û  rÓ   zS3ClientArgsCreator.__init__c                 C   s€   | j j| j jdœ}| j  d¡| j ju rd |d< | j  d¡| j ju r%d |d< t| d|› �ƒr9| t| d|› �ƒƒ ¡ |  |¡ |S )N)r3   rk  Úmultipart_chunksizer3   rl  rk  Ú_get_crt_options_)	rp  rr  rl  Úget_deep_attrÚUNSET_DEFAULTÚhasattrÚupdater(  Ú$_remove_param_if_not_min_crt_version)rf   rÀ   Ú
crt_configr*   r*   r+   Ú _get_crt_transfer_config_options   s&   þ
ÿÿ
ÿÿÿ
z4S3ClientArgsCreator._get_crt_transfer_config_optionsc                 C   s   d| j jiS )NÚmultipart_upload_threshold)rp  Úmultipart_thresholdrl   r*   r*   r+   Ú_get_crt_options_put_object  ó   z/S3ClientArgsCreator._get_crt_options_put_objectc              
   C   sœ   g }|D ]?}|| j vrq| j | }t|jƒrq| j |j¡| jjur>d dd„ |jD ƒ¡}t 	d|j› d|› d|j› d�¡ | 
|¡ q|D ]}||= qFd S )NrL   c                 s   s   � | ]}t |ƒV  qd S r!   )r  )r-  Úir*   r*   r+   Ú	<genexpr>*  s   € zKS3ClientArgsCreator._remove_param_if_not_min_crt_version.<locals>.<genexpr>zTransfer config parameter z requires minimum CRT version: z. z! will not be used in the request.)Ú_CRT_ARG_TO_CONFIG_PARAMrX   rj  rp  rt  r(   ru  r’   rJ   Úwarningrº   )rf   ry  Ú	to_removeÚrequest_argÚparamÚmin_ver_strr*   r*   r+   rx    s.   


ÿÿ
ÿþÿÿz8S3ClientArgsCreator._remove_param_if_not_min_crt_versionc                 C   s(   t | d|› �| jƒ}|||||g |d�S )NÚ_get_make_request_args_©rÀ   rÁ   r    rÄ   Úon_done_before_callsrÂ   )r(  Ú_default_get_make_request_args)rf   rÀ   rÁ   r    rÄ   rÂ   Úrequest_args_handlerr*   r*   r+   r¼   4  s   ýúz)S3ClientArgsCreator.get_make_request_argsc                    s   ‡ ‡‡‡fdd„}|S )Nc                     sf   g }ˆd ur
|ˆ7 }|t ˆˆƒ7 }ˆ d ur|ˆ 7 }|D ]}ˆdkr)|| d d� q|| i |¤Ž qd S )NÚprogressr   )Úbytes_transferred)r   )rr   r­   Úcallbacks_listÚcallback©r³   Úbefore_subscribersÚcallback_typerÄ   r*   r+   Úinvoke_all_callbacksL  s   ùzBS3ClientArgsCreator.get_crt_callback.<locals>.invoke_all_callbacksr*   )rf   rÄ   r’  r‘  r³   r“  r*   r�  r+   r»   E  s   z$S3ClientArgsCreator.get_crt_callbackc                    sÒ   d }t ˆ jtƒrˆ j}| j |¡}|ˆ jd< nˆ jˆ jd< d }	t‡ fdd„tD ƒƒsBˆ j dd¡ 	¡ }
t
jjt
jj|
 t
jjjd�}	dˆ jd	< | j|ˆ ||||d
�}||d< |	|d< | jd urg| |  |¡¡ |S )NÚContentLengthÚBodyc                 3   s   � | ]}|ˆ j v V  qd S r!   )ry   )r-  Úchecksum_arg©rÁ   r*   r+   r€  p  s
   € ÿ
ÿzHS3ClientArgsCreator._get_make_request_args_put_object.<locals>.<genexpr>r–   ÚCRC32)Ú	algorithmÚlocationzoverride-to-be-removedÚ
ContentMD5rˆ  Úsend_filepathÚchecksum_config)r  rx   r  ro  Úget_file_sizery   Úanyr   Úpopr›   r#   r$   ÚS3ChecksumConfigr™   ÚS3ChecksumLocationÚTRAILERrŠ  rp  rw  rz  )rf   rÀ   rÁ   r    rÄ   r‰  rÂ   rœ  Údata_lenr�  rœ   Úmake_request_argsr*   r—  r+   Ú!_get_make_request_args_put_object^  sF   	þÿþ
þ
ú
ÿz5S3ClientArgsCreator._get_make_request_args_put_objectc                 C   s¢   d }d }t jjdd�}	t|jtƒr&|j}
| j |
¡}| t	||
|| jƒ¡ nt
|jƒ}| j||||||d�}||d< ||d< |	|d< | jd urO| |  |¡¡ |S )NT)Úvalidate_responserˆ  Úrecv_filepathÚon_bodyr�  )r#   r$   r¡  r  rx   r  ro  Úget_temp_filenamerº   ÚRenameTempFileHandlerÚOnBodyFileObjWriterrŠ  rp  rw  rz  )rf   rÀ   rÁ   r    rÄ   r‰  rÂ   r¨  r©  r�  Úfinal_filepathr¥  r*   r*   r+   Ú!_get_make_request_args_get_object‘  s8   	
ÿÿ
ú
ÿz5S3ClientArgsCreator._get_make_request_args_get_objectc           
      C   sÎ   | j  ||¡tt| ¡ tjƒ|  |d||¡|  |d¡dœ}|d tjkr3d dd„ | d¡D ƒ¡|d	< t	ƒ }| 
|j¡ }	rV|	d
 dkrVttjdddd�|d< |	d |_|S t|jƒrettjddd�|d< |S )Nrž   rŒ  )r  ÚtyperÊ   Úon_progressr¯  Ú c                 s   s   � | ]}|  ¡ V  qd S r!   )Útitle)r-  Úxr*   r*   r+   r€  Ò  s   € 
ÿzES3ClientArgsCreator._default_get_make_request_args.<locals>.<genexpr>Ú_r5  r1   Ú*F)r™  r1   Úuse_double_uri_encodeÚshould_normalize_uri_pathÚsigning_configÚresource_name)r™  r¶  r·  )rn  ré   r(  r   r›   ÚDEFAULTr»   r’   rP   Ú_S3ArnParamHandlerÚ
handle_arnrv   r   r   ÚV4_ASYMMETRICr    ÚV4_S3EXPRESS)
rf   rÀ   rÁ   r    rÄ   r‰  rÂ   r¥  Úarn_handlerÚaccesspoint_arn_detailsr*   r*   r+   rŠ  ¹  sF   
ÿÿÿ
ö
ÿÿ
þ
ü
	
ø
ýz2S3ClientArgsCreator._default_get_make_request_argsr!   rË   )rÍ   rÎ   rÏ   ri  r�  rk   rz  r}  rx  r¼   r»   r¦  r®  rŠ  r*   r*   r*   r+   r]   ô  s     ÿÿ

û3(r]   c                   @   rã   )r«  c                 C   s   || _ || _|| _|| _d S r!   )rÚ   Ú_final_filenameÚ_temp_filenamer[   )rf   r    Úfinal_filenameÚtemp_filenameri   r*   r*   r+   rk   ñ  s   
zRenameTempFileHandler.__init__c              
   K   sx   |d }|r| j  | j¡ d S z| j  | j| j¡ W d S  ty; } z| j  | j¡ | j |¡ W Y d }~d S d }~ww )Nr´   )r[   Úremove_filerÂ  Úrename_filerÁ  r©   rÚ   r¾   )rf   r­   r´   rÉ   r*   r*   r+   rV  ÷  s   
ÿ€ýzRenameTempFileHandler.__call__N©rÍ   rÎ   rÏ   rk   rV  r*   r*   r*   r+   r«  ð  s    r«  c                   @   rã   )r¹   c                 C   rM  r!   )rÚ   rŸ   r*   r*   r+   rk     rÛ   zAfterDoneHandler.__init__c                 K   rª   r!   )rÚ   rb  r¬   r*   r*   r+   rV  
  r‹   zAfterDoneHandler.__call__NrÇ  r*   r*   r*   r+   r¹     ó    r¹   c                   @   rã   )r¬  c                 C   rM  r!   )Ú_fileobj)rf   rx   r*   r*   r+   rk     rÛ   zOnBodyFileObjWriter.__init__c                 K   rÜ   r!   )rÉ  Úwrite)rf   rJ  r­   r*   r*   r+   rV    rß   zOnBodyFileObjWriter.__call__NrÇ  r*   r*   r*   r+   r¬    rÈ  r¬  c                   @   s:   e Zd ZdZe d¡Zdd„ Zdd„ Zdd„ Z	d	d
„ Z
dS )r»  a  Partial port of S3ArnParamHandler from botocore.

    This is used to make a determination on MRAP accesspoints for signing
    purposes. This should be safe to remove once we properly integrate auth
    resolution from Botocore into the CRT transfer integration.
    zA^(?P<resource_type>accesspoint|outpost)[/:](?P<resource_name>.+)$c                 C   s   t ƒ | _d S r!   )r   Ú_arn_parserrl   r*   r*   r+   rk   "  r~  z_S3ArnParamHandler.__init__c                 C   s*   |   |¡}|d u rd S |d dkr|S d S )NÚresource_typeÚaccesspoint)Ú_get_arn_details_from_bucket©rf   rv   Úarn_detailsr*   r*   r+   r¼  %  s   
ÿz_S3ArnParamHandler.handle_arnc                 C   s2   z| j  |¡}|  |¡ |W S  ty   Y d S w r!   )rË  Ú	parse_arnÚ_add_resource_type_and_namer   rÏ  r*   r*   r+   rÎ  ,  s   
þz/_S3ArnParamHandler._get_arn_details_from_bucketc                 C   s8   | j  |d ¡}|r| d¡|d< | d¡|d< d S d S )Nr�   rÌ  r¹  )Ú_RESOURCE_REGEXr�   Úgroup)rf   rÐ  r�   r*   r*   r+   rÒ  5  s
   þz._S3ArnParamHandler._add_resource_type_and_nameN)rÍ   rÎ   rÏ   r×   ÚreÚcompilerÓ  rk   r¼  rÎ  rÒ  r*   r*   r*   r+   r»    s    ÿ	r»  r!   )KÚloggingrÕ  rb   Úcollectionsr   Úior   Úawscrt.httpr#   Ú	awscrt.s3Úbotocore.awsrequestr"  Úbotocore.sessionÚawscrt.authr   r   r   r   Ú	awscrt.ior   r	   r
   r   r   r   r   r   r   Úbotocore.compatr   Úbotocore.configr   Úbotocore.exceptionsr   Úbotocore.utilsr   r   Ús3transfer.constantsr   r   Ús3transfer.exceptionsr   Ús3transfer.futuresr   r   Ús3transfer.managerr   Ús3transfer.utilsr   r   r   r   r    Ú	getLoggerrÍ   rJ   r"   r,   rH   r=   rX   rY   r·   r¸   rä   rê   r%  rL  r¶   ri  r]   r«  r¹   r¬  r»  r*   r*   r*   r+   Ú<module>   sf   

ù
U
 T& &	I }