U
    EZhh                     @   s  d dl Z d dlZd dl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-m.Z.m/Z/m0Z0m1Z1 e 2e3Z4da5dd Z6dddde% ddfddZ7d2ddZ8G dd dZ9G dd de*Z:G dd de)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'Z@G d(d) d)ZAG d*d+ d+ZBG d,d- d-ZCG d.d/ d/ZDG d0d1 d1ZEdS )3    N)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get_callbacksis_s3express_bucketc                 C   s@   t d kr<tj| }z|  W n tk
r6   Y d S X |a t S N)CRT_S3_PROCESS_LOCKawscrts3ZCrossProcessLockacquireRuntimeError)nameZcrt_lock r&   U/home/aprabhat/apps/x.techxrdev.in/venv/lib/python3.8/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k	rdt }|rN|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)Zca_filepathF) provided_throughput_target_bytesT)	bootstrapregionZcredential_provider	part_sizetls_modetls_connection_optionsZthroughput_target_gbpsZenable_s3express)r
   r	   r   r   ZENABLEDZDISABLEDr   Z&override_default_trust_store_from_pathZverify_peerr   Znew_connection_options_get_crt_throughput_target_gbpsr   )r,   Zcrt_credentials_providerZnum_threadsZtarget_throughputr-   Zuse_sslverifyZevent_loop_groupZhost_resolverr+   r/   r.   Ztls_ctx_optionsZclient_tls_optiontarget_gbpsr&   r&   r'   create_s3_crt_clientS   s8    4
r3   c                 C   sH   | d kr,t j }td| |d kr8d}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"   Z&get_recommended_throughput_target_gbpsloggerdebug)r*   r2   r&   r&   r'   r0      s    
 r0   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   sH   |dkrt  | _|| _t|| j| _|j| _g | _t	d| _
d| _dS )aF  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.
        N   r   )r   _osutil_crt_s3_clientS3ClientArgsCreator_s3_args_creatortranslate_crt_exception_crt_exception_translator_future_coordinators	threading	Semaphore
_semaphore_id_counter)selfZcrt_s3_clientcrt_request_serializerosutilr&   r&   r'   __init__   s     zCRTTransferManager.__init__c                 C   s   | S r   r&   rC   r&   r&   r'   	__enter__   s    zCRTTransferManager.__enter__c                 G   s   d}|rd}|  | d S )NFT	_shutdown)rC   exc_type	exc_valueargscancelr&   r&   r'   __exit__   s    zCRTTransferManager.__exit__c                 C   sN   |d kri }|d kri }|  || j | | t|||||d}| d|S )Nbucketkeyfileobj
extra_argssubscribersZ
get_object)_validate_all_known_argsALLOWED_DOWNLOAD_ARGS_validate_if_bucket_supportedr   _submit_transfer)rC   rQ   rR   rS   rT   rU   callargsr&   r&   r'   download   s    
zCRTTransferManager.downloadc                 C   sX   |d kri }|d kri }|  || j | | | | t|||||d}| d|S )NrP   Z
put_object)rV   ALLOWED_UPLOAD_ARGSrX   &_validate_checksum_algorithm_supportedr   rY   )rC   rS   rQ   rR   rT   rU   rZ   r&   r&   r'   upload   s    

zCRTTransferManager.uploadc                 C   sL   |d kri }|d kri }|  || j | | t||||d}| d|S )N)rQ   rR   rT   rU   Zdelete_object)rV   ALLOWED_DELETE_ARGSrX   r   rY   )rC   rQ   rR   rT   rU   rZ   r&   r&   r'   delete  s    
zCRTTransferManager.deleteFc                 C   s   |  | d S r   rI   rC   rN   r&   r&   r'   shutdown  s    zCRTTransferManager.shutdownc                 C   s<   | j r8| j D ]&\}}||}|rtd| dqd S )Nz'TransferManager methods do not support z+ resource. Use direct client calls instead.) VALIDATE_SUPPORTED_BUCKET_VALUES_UNSUPPORTED_BUCKET_PATTERNSitemsmatch
ValueError)rC   rQ   resourcepatternrf   r&   r&   r'   rX     s    

z0CRTTransferManager._validate_if_bucket_supportedc                 C   s0   |D ]&}||krt d| dd| qd S )NzInvalid extra_args key 'z', must be one of: z, )rg   join)rC   actualallowedkwargr&   r&   r'   rV   +  s
    z+CRTTransferManager._validate_all_known_argsc                 C   sH   | d}|d krd S ttjjj}| |krDtd| d| d S )NChecksumAlgorithmzChecksumAlgorithm: z* not supported. Supported algorithms are: )getlistr!   r"   S3ChecksumAlgorithm__members__upperrg   )rC   rT   checksum_algorithmZsupported_algorithmsr&   r&   r'   r]   3  s    
z9CRTTransferManager._validate_checksum_algorithm_supportedc                 C   s    | j D ]}| s|  qd S r   )r>   donerN   rC   coordinatorr&   r&   r'   _cancel_transfers>  s    
z$CRTTransferManager._cancel_transfersc                 C   s   | j D ]}|  qd S r   )r>   resultrv   r&   r&   r'   _finish_transfersC  s    
z$CRTTransferManager._finish_transfersc                 C   s   | j D ]}|  qd S r   )r>   %wait_until_on_done_callbacks_completerv   r&   r&   r'   _wait_transfers_doneG  s    
z'CRTTransferManager._wait_transfers_donec                 C   s\   |r|    z@z|   W n. tk
r6   |    Y n tk
rH   Y nX W 5 |   X d S r   )rx   r|   rz   KeyboardInterrupt	Exceptionra   r&   r&   r'   rJ   K  s    
zCRTTransferManager._shutdownc                 K   s   | j   d S r   )rA   releaserC   kwargsr&   r&   r'   _release_semaphoreX  s    z%CRTTransferManager._release_semaphorec              
   C   s   | j g}t| j| jd}t| j||d}tf |}t|}|| zD| j	  | j
|d}|  | j
|||||}	| jjf |	}
W nJ tk
r } z,||d | j
j|d|d}||d W 5 d }~X Y nX ||
 | j| |  jd7  _|S )	N)transfer_idexception_translator)metarw   ZqueuedTru   )after_subscribers)error   )r   CRTTransferCoordinatorrB   r=   CRTTransferMetaCRTTransferFutureAfterDoneHandlerappendrA   r#   r;   get_crt_callbackget_make_request_argsr9   Zmake_requestr~   set_exceptionset_s3_requestr>   )rC   request_type	call_argson_done_after_callsrw   
componentsfutureZ	afterdoneZ	on_queuedZcrt_callargsZcrt_s3_requesteon_doner&   r&   r'   rY   [  sL    



   
z#CRTTransferManager._submit_transfer)N)NN)NN)NN)F)F)__name__
__module____qualname__r   rW   r\   r_   rc   rd   rF   rH   rO   r[   r^   r`   rb   rX   rV   r]   rx   rz   r|   rJ   r   rY   r&   r&   r&   r'   r6      s.   
   




r6   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)rC   r   r   r&   r&   r'   rF     s    zCRTTransferMeta.__init__c                 C   s   | j S r   )r   rG   r&   r&   r'   r     s    zCRTTransferMeta.call_argsc                 C   s   | j S r   )r   rG   r&   r&   r'   r     s    zCRTTransferMeta.transfer_idc                 C   s   | j S r   )r   rG   r&   r&   r'   user_context  s    zCRTTransferMeta.user_context)NN)	r   r   r   __doc__rF   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k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)rC   r   rw   r&   r&   r'   rF     s    	zCRTTransferFuture.__init__c                 C   s   | j S r   )r   rG   r&   r&   r'   r     s    zCRTTransferFuture.metac                 C   s
   | j  S r   )r   ru   rG   r&   r&   r'   ru     s    zCRTTransferFuture.donec                 C   s   | j | d S r   )r   ry   rC   timeoutr&   r&   r'   ry     s    zCRTTransferFuture.resultc                 C   s   | j   d S r   )r   rN   rG   r&   r&   r'   rN     s    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)ru   r   r   r   rC   	exceptionr&   r&   r'   r     s
    zCRTTransferFuture.set_exception)NN)N)
r   r   r   rF   r   r   ru   ry   rN   r   r&   r&   r&   r'   r     s   


r   c                   @   s   e Zd Zdd Zdd ZdS )BaseCRTRequestSerializerc                 C   s   t ddS )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()NNotImplementedError)rC   transfer_typer   r&   r&   r'   serialize_http_request  s    z/BaseCRTRequestSerializer.serialize_http_requestc                 C   s   t dd S )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kri }| || |jf || _| 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_configZcreate_client_clientr   eventsregister_capture_http_request+_change_response_to_serialized_http_request_make_fake_http_response_remove_checksum_context)rC   sessionclient_kwargsr&   r&   r'   rF     s*    
 
 
 
 z%BotocoreCRTRequestSerializer.__init__c                 C   sP   d }|  r|  }d|kr$|d }ttd}|r<||}||d< d|d< d S )Nconfig)Zsignature_versionr"   service_name)Zget_default_client_configr   r   merge)rC   r   r   Zuser_provided_configZclient_configr&   r&   r'   r     s    

z3BotocoreCRTRequestSerializer._resolve_client_configc           	      C   s   t |j}|j}|jr&| d|j }g }|j D ]6\}}t|trV|||f q4||t|df q4t	j
|}t	j
j|j|||jd}|S )N?zutf-8)methodpathheadersZbody_stream)r   urlr   queryr   re   
isinstancestrr   r!   httpZHttpHeadersZHttpRequestr   body)	rC   Zaws_request	url_partsZcrt_pathZheaders_listr%   valueZcrt_headerscrt_requestr&   r&   r'   _crt_request_from_aws_request  s"    

z:BotocoreCRTRequestSerializer._crt_request_from_aws_requestc                 C   s   |  |}|jdd kr4t|j}|jd|j |jdd k	rP|jd |jdd krx|jd krx|j	dd |jdd k	r|jd |S )NhostzContent-MD5zContent-Length0zTransfer-Encoding)
r   r   ro   r   r   setnetlocremover   add)rC   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rC   requestr   r&   r&   r'   r   3  s    z2BotocoreCRTRequestSerializer._capture_http_requestc                 K   s   |d }|  |d< d S )Nr   HTTPRequest)prepare)rC   r   parsedr   r   r&   r&   r'   r   6  s    zHBotocoreCRTRequestSerializer._change_response_to_serialized_http_requestc                 K   s   t jd di tdS )N       )botocore
awsrequestZAWSResponseFakeRawResponser   r&   r&   r'   r   <  s    z5BotocoreCRTRequestSerializer._make_fake_http_responsec                 C   s&   t | j|f |j|jd|jd S )N)ZBucketKeyr   )getattrr   rQ   rR   rT   )rC   Zclient_methodr   r&   r&   r'   _get_botocore_http_requestD  s     z7BotocoreCRTRequestSerializer._get_botocore_http_requestc                 C   s   |  ||jj}| |}|S r   )r   r   r   r   )rC   r   r   r   r   r&   r&   r'   r   I  s     
z3BotocoreCRTRequestSerializer.serialize_http_requestc                 C   s    t |tjjr| |S d S d S r   )r   r!   r"   ZS3ResponseError _translate_crt_s3_response_errorr   r&   r&   r'   r<   P  s    
z4BotocoreCRTRequestSerializer.translate_crt_exceptionc                 C   s   |j }|dk rd S dd |jD }|j}|d k	rH| 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>]  s      zQBotocoreCRTRequestSerializer._translate_crt_s3_response_error.<locals>.<dictcomp>)r   status_coder   )shapeErrorZCode)operation_name)r   r   r   r   r   service_modelZoperation_modelZoutput_shaper   r   ZHeadersDictr   Z_response_parserparsero   
exceptionsZ	from_code)rC   Zs3_response_errorr   r   r   r   r   Zresponse_dictZparsed_responseZ
error_codeZerror_classr&   r&   r'   r   V  s(    

 z=BotocoreCRTRequestSerializer._translate_crt_s3_response_errorc                 K   s   | di }d|kr|d= d S )Nr   Zchecksum)ro   )rC   paramsr   request_contextr&   r&   r'   r   r  s    z5BotocoreCRTRequestSerializer._remove_checksum_context)N)r   r   r   rF   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q|V  q d S r   )read)rC   amtdecode_contentchunkr&   r&   r'   streamy  s    
zFakeRawResponse.stream)r   N)r   r   r   r   r&   r&   r&   r'   r   x  s   r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
BotocoreCRTCredentialsWrapperc                 C   s
   || _ d S r   )_resolved_credentials)rC   Zresolved_botocore_credentialsr&   r&   r'   rF     s    z&BotocoreCRTCredentialsWrapper.__init__c                 C   s   |    }t|j|j|jS r   )_get_credentialsZget_frozen_credentialsr   Z
access_keyZ
secret_keytoken)rC   credentialsr&   r&   r'   __call__  s      z&BotocoreCRTCredentialsWrapper.__call__c                 C   s
   t | S r   )r   Znew_delegaterG   r&   r&   r'   to_crt_credentials_provider  s    z9BotocoreCRTCredentialsWrapper.to_crt_credentials_providerc                 C   s   | j d krt | j S r   )r   r   rG   r&   r&   r'   r     s    
z.BotocoreCRTCredentialsWrapper._get_credentialsN)r   r   r   rF   r   r   r   r&   r&   r&   r'   r     s   r   c                   @   sl   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_requestr?   Lock_lock
_exception_crt_futureEvent_done_event)rC   r   
s3_requestr   r&   r&   r'   rF     s    
zCRTTransferCoordinator.__init__c                 C   s   | j S r   )r   rG   r&   r&   r'   r    s    z!CRTTransferCoordinator.s3_requestc                 C   s   | j   d S r   )r  r   rG   r&   r&   r'   set_done_callbacks_complete  s    z2CRTTransferCoordinator.set_done_callbacks_completec                 C   s   | j | d S r   )r  waitr   r&   r&   r'   r{     s    z<CRTTransferCoordinator.wait_until_on_done_callbacks_completeFc              	   C   s(   | j  |  r|r|| _W 5 Q R X d S r   )r   ru   r  )rC   r   r   r&   r&   r'   r     s    z$CRTTransferCoordinator.set_exceptionc                 C   s   | j r| j   d S r   )r   rN   rG   r&   r&   r'   rN     s    zCRTTransferCoordinator.cancelc              
   C   s   | j r| j zjz| j| W nT tk
rH   |   | j|  Y n, tk
rr } z| | W 5 d }~X Y nX W 5 | jrd | _X d S r   )r  r   r  ry   r}   rN   r~   handle_exception)rC   r   r   r&   r&   r'   ry     s     zCRTTransferCoordinator.resultc              
   C   sb   d }| j rJz|  |}W n0 tk
rH } ztjd|d W 5 d }~X Y nX |d k	rZ||n|d S )NzUnable to translate exception.)exc_info)r   r~   r4   r5   )rC   excZtranslated_excr   r&   r&   r'   r    s    z'CRTTransferCoordinator.handle_exceptionc                 C   s   | j d krdS | j  S )NF)r  ru   rG   r&   r&   r'   ru     s    
zCRTTransferCoordinator.donec                 C   s   || _ | j j| _d S r   )r   Zfinished_futurer  )rC   r  r&   r&   r'   r     s    z%CRTTransferCoordinator.set_s3_request)NNN)N)F)N)r   r   r   r   rF   r   r  r  r{   r   rN   ry   r  ru   r   r&   r&   r&   r'   r     s        




r   c                   @   s>   e Zd Zdd Zdd ZdddZdd	 Zd
d Zdd ZdS )r:   c                 C   s   || _ || _d S r   )_request_serializer	_os_utils)rC   rD   Zos_utilsr&   r&   r'   rF     s    zS3ClientArgsCreator.__init__c                 C   s(   t | d| | j}|||||g |dS )NZ_get_make_request_args_r   r   rw   r   on_done_before_callsr   )r   _default_get_make_request_args)rC   r   r   rw   r   r   Zrequest_args_handlerr&   r&   r'   r     s    z)S3ClientArgsCreator.get_make_request_argsNc                    s    fdd}|S )Nc                     sb   g }d k	r|7 }|t 7 } d k	r2| 7 }|D ]&}dkrR|| d d q6|| | q6d S )Nprogressr   )Zbytes_transferred)r   )rM   r   Zcallbacks_listcallbackr   before_subscriberscallback_typer   r&   r'   invoke_all_callbacks  s    zBS3ClientArgsCreator.get_crt_callback.<locals>.invoke_all_callbacksr&   )rC   r   r  r  r   r  r&   r  r'   r     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 s jdd	 }
t
jjt
jj|
 t
jjjd}	d jd	< | j| ||||d
}||d< |	|d< |S )NZContentLengthZBodyc                 3   s   | ]}| j kV  qd S r   )rT   )r   Zchecksum_argr   r&   r'   	<genexpr>  s   zHS3ClientArgsCreator._get_make_request_args_put_object.<locals>.<genexpr>rn   ZCRC32)	algorithmlocationzoverride-to-be-removedZ
ContentMD5r  send_filepathchecksum_config)r   rS   r   r  Zget_file_sizerT   anyr   poprs   r!   r"   S3ChecksumConfigrq   ZS3ChecksumLocationZTRAILERr  )rC   r   r   rw   r   r  r   r  Zdata_lenr  rt   make_request_argsr&   r  r'   !_get_make_request_args_put_object  s<    	 

z5S3ClientArgsCreator._get_make_request_args_put_objectc                 C   s   d }d }t jjdd}	t|jtrL|j}
| j|
}|t	||
|| j n
t
|j}| j||||||d}||d< ||d< |	|d< |S )NT)Zvalidate_responser  recv_filepathon_bodyr  )r!   r"   r  r   rS   r   r  Zget_temp_filenamer   RenameTempFileHandlerOnBodyFileObjWriterr  )rC   r   r   rw   r   r  r   r!  r"  r  Zfinal_filepathr  r&   r&   r'   !_get_make_request_args_get_object;  s6    	   
z5S3ClientArgsCreator._get_make_request_args_get_objectc           
      C   s   | j ||tt| tj| |d||| |dd}|d tjkrfddd |dD |d	< t	 }|
|j }	r|	d
 dkrttjdddd|d< |	d |_nt|jrttjddd|d< |S )Nru   r  )r   typer   Zon_progressr&   c                 s   s   | ]}|  V  qd S r   )title)r   xr&   r&   r'   r  x  s    zES3ClientArgsCreator._default_get_make_request_args.<locals>.<genexpr>_r   r,   *F)r  r,   use_double_uri_encodeshould_normalize_uri_pathZsigning_configresource_name)r  r,  r-  )r  r   r   r   rs   DEFAULTr   rj   split_S3ArnParamHandler
handle_arnrQ   r   r   ZV4_ASYMMETRICr   ZV4_S3EXPRESS)
rC   r   r   rw   r   r  r   r  Zarn_handlerZaccesspoint_arn_detailsr&   r&   r'   r  _  sP    
      





z2S3ClientArgsCreator._default_get_make_request_args)NN)	r   r   r   rF   r   r   r   r%  r  r&   r&   r&   r'   r:     s     
/$r:   c                   @   s   e Zd Zdd Zdd ZdS )r#  c                 C   s   || _ || _|| _|| _d S r   )r   _final_filename_temp_filenamer8   )rC   rw   Zfinal_filenameZtemp_filenamerE   r&   r&   r'   rF     s    zRenameTempFileHandler.__init__c              
   K   st   |d }|r| j | j nTz| j | j| j W n< tk
rn } z| j | j | j| W 5 d }~X Y nX d S )Nr   )r8   Zremove_filer4  Zrename_filer3  r~   r   r   )rC   r   r   r   r&   r&   r'   r     s     zRenameTempFileHandler.__call__Nr   r   r   rF   r   r&   r&   r&   r'   r#    s   r#  c                   @   s   e Zd Zdd Zdd ZdS )r   c                 C   s
   || _ d S r   )r   rv   r&   r&   r'   rF     s    zAfterDoneHandler.__init__c                 K   s   | j   d S r   )r   r  r   r&   r&   r'   r     s    zAfterDoneHandler.__call__Nr5  r&   r&   r&   r'   r     s   r   c                   @   s   e Zd Zdd Zdd ZdS )r$  c                 C   s
   || _ d S r   )_fileobj)rC   rS   r&   r&   r'   rF     s    zOnBodyFileObjWriter.__init__c                 K   s   | j | d S r   )r6  write)rC   r   r   r&   r&   r'   r     s    zOnBodyFileObjWriter.__call__Nr5  r&   r&   r&   r'   r$    s   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 )r1  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_parserrG   r&   r&   r'   rF     s    z_S3ArnParamHandler.__init__c                 C   s*   |  |}|d krd S |d dkr&|S d S )Nresource_typeZaccesspoint)_get_arn_details_from_bucketrC   rQ   arn_detailsr&   r&   r'   r2    s
    
z_S3ArnParamHandler.handle_arnc                 C   s6   z| j |}| | |W S  tk
r0   Y nX d S r   )r8  Z	parse_arn_add_resource_type_and_namer   r;  r&   r&   r'   r:    s    
z/_S3ArnParamHandler._get_arn_details_from_bucketc                 C   s4   | j |d }|r0|d|d< |d|d< d S )Nrh   r9  r.  )_RESOURCE_REGEXrf   group)rC   r<  rf   r&   r&   r'   r=    s    z._S3ArnParamHandler._add_resource_type_and_nameN)r   r   r   r   recompiler>  rF   r2  r:  r=  r&   r&   r&   r'   r1    s   	r1  )N)Floggingr@  r?   ior   Zawscrt.httpr!   Z	awscrt.s3Zbotocore.awsrequestr   Zbotocore.sessionZawscrt.authr   r   r   r   Z	awscrt.ior   r   r	   r
   r   r   r   r   r   Zbotocore.compatr   Zbotocore.configr   Zbotocore.exceptionsr   Zbotocore.utilsr   r   Zs3transfer.constantsr   r   Zs3transfer.exceptionsr   Zs3transfer.futuresr   r   Zs3transfer.managerr   Zs3transfer.utilsr   r   r   r   	getLoggerr   r4   r    r(   r3   r0   r6   r   r   r   r   r   r   r   r:   r#  r   r$  r1  r&   r&   r&   r'   <module>   s^   

U
 L& &	I :