o
    Ďil                     @   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*   J/home/jeff/fluffinator/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    sD   




	

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 }