U
    ÓZjžV  ã                   @   s¶  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	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! d dl"m#Z#m$Z$ d dl%m&Z&m'Z'm(Z( e  )e*¡Z+G dd„ dƒZ,ddde d de ddfdd„Z-G dd„ dƒZ.G dd„ de$ƒZ/G dd„ de#ƒZ0G dd„ dƒZ1G dd„ de1ƒZ2G dd „ d eƒZ3G d!d"„ d"ƒZ4G d#d$„ d$ƒZ5G d%d&„ d&ƒZ6G d'd(„ d(ƒZ7dS ))é    N)ÚBytesIO)ÚAwsCredentialsÚAwsCredentialsProvider)ÚClientBootstrapÚClientTlsContextÚDefaultHostResolverÚEventLoopGroupÚTlsContextOptions)ÚS3ClientÚS3RequestTlsModeÚS3RequestType)ÚUNSIGNED)Úurlsplit)ÚConfig)ÚNoCredentialsError)ÚGBÚMB)ÚTransferNotDoneError)ÚBaseTransferFutureÚBaseTransferMeta)ÚCallArgsÚOSUtilsÚget_callbacksc                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚCRTCredentialProviderAdapterc                 C   s   || _ d | _t ¡ | _d S ©N)Ú_botocore_credential_providerÚ_loaded_credentialsÚ	threadingÚLockÚ_lock)ÚselfÚbotocore_credential_provider© r"   úQ/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/s3transfer/crt.pyÚ__init__+   s    z%CRTCredentialProviderAdapter.__init__c                 C   s   |   ¡  ¡ }t|j|j|jƒS r   )Ú_get_credentialsZget_frozen_credentialsr   Z
access_keyZ
secret_keyÚtoken)r    Úcredentialsr"   r"   r#   Ú__call__0   s      ÿz%CRTCredentialProviderAdapter.__call__c              
   C   sL   | j �< | jd kr0| j ¡ }|d kr*tƒ ‚|| _| jW  5 Q R £ S Q R X d S r   )r   r   r   Zload_credentialsr   )r    Zloaded_credsr"   r"   r#   r%   6   s    
ÿz-CRTCredentialProviderAdapter._get_credentialsN)Ú__name__Ú
__module__Ú__qualname__r$   r(   r%   r"   r"   r"   r#   r   *   s   r   é   é   Tc              	   C   s    t |ƒ}t|ƒ}t||ƒ}	d}
d}|r,tjntj}|dk	rhtƒ }|rR|j|d� nd|_t	|ƒ}| 
¡ }|r~t|ƒ}t |¡}
|d t }t|	| |
||||d�S )aî  
    :type region: str
    :param region: The region used for signing

    :type botocore_credential_provider:
        Optional[botocore.credentials.CredentialResolver]
    :param botocore_credential_provider: Provide credentials for CRT
        to sign the request if not set, the request 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.
        Default is 0.625 GB/s (which translates to 5 Gb/s).

    :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_filepathFr-   )Ú	bootstrapÚregionZcredential_providerÚ	part_sizeÚtls_modeÚtls_connection_optionsZthroughput_target_gbps)r   r   r   r   ZENABLEDZDISABLEDr	   Z&override_default_trust_store_from_pathZverify_peerr   Znew_connection_optionsr   r   Znew_delegater   r
   )r/   r!   Znum_threadsZtarget_throughputr0   Zuse_sslÚverifyZevent_loop_groupZhost_resolverr.   Úproviderr2   r1   Ztls_ctx_optionsZclient_tls_optionZcredentails_provider_adapterZtarget_gbpsr"   r"   r#   Úcreate_s3_crt_clientB   sB    /
ÿÿÿÿùr5   c                   @   s€   e Zd 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d„Zdd„ Zdd„ ZdS )#ÚCRTTransferManagerNc                 C   s@   |dkrt ƒ | _|| _t|| 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Ú_future_coordinatorsr   Ú	SemaphoreÚ
_semaphoreÚ_id_counter)r    Zcrt_s3_clientÚcrt_request_serializerÚosutilr"   r"   r#   r$   ™   s     ÿzCRTTransferManager.__init__c                 C   s   | S r   r"   ©r    r"   r"   r#   Ú	__enter__³   s    zCRTTransferManager.__enter__c                 G   s   d}|rd}|   |¡ d S )NFT©Ú	_shutdown)r    Úexc_typeÚ	exc_valueÚargsÚcancelr"   r"   r#   Ú__exit__¶   s    zCRTTransferManager.__exit__c                 C   s6   |d kri }|d kri }t |||||d�}|  d|¡S )N©ÚbucketÚkeyÚfileobjÚ
extra_argsÚsubscribersZ
get_object©r   Ú_submit_transfer)r    rL   rM   rN   rO   rP   Úcallargsr"   r"   r#   Údownload¼   s    ûzCRTTransferManager.downloadc                 C   s6   |d kri }|d kri }t |||||d�}|  d|¡S )NrK   Z
put_objectrQ   )r    rN   rL   rM   rO   rP   rS   r"   r"   r#   ÚuploadÌ   s    ûzCRTTransferManager.uploadc                 C   s4   |d kri }|d kri }t ||||d�}|  d|¡S )N)rL   rM   rO   rP   Zdelete_objectrQ   )r    rL   rM   rO   rP   rS   r"   r"   r#   ÚdeleteÚ   s    üzCRTTransferManager.deleteFc                 C   s   |   |¡ d S r   rD   ©r    rI   r"   r"   r#   Úshutdownç   s    zCRTTransferManager.shutdownc                 C   s    | j D ]}| ¡ s| ¡  qd S r   )r<   ÚdonerI   ©r    Úcoordinatorr"   r"   r#   Ú_cancel_transfersê   s    
z$CRTTransferManager._cancel_transfersc                 C   s   | j D ]}| ¡  qd S r   )r<   ÚresultrZ   r"   r"   r#   Ú_finish_transfersï   s    
z$CRTTransferManager._finish_transfersc                 C   s   | j D ]}| ¡  qd S r   )r<   Ú%wait_until_on_done_callbacks_completerZ   r"   r"   r#   Ú_wait_transfers_doneó   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   )r\   r`   r^   ÚKeyboardInterruptÚ	ExceptionrW   r"   r"   r#   rE   ÷   s    
zCRTTransferManager._shutdownc                 K   s   | j  ¡  d S r   )r>   Úrelease©r    Úkwargsr"   r"   r#   Ú_release_semaphore  s    z%CRTTransferManager._release_semaphorec              
   C   sú   | j g}t| 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)Úmetar[   ZqueuedTrY   )Úafter_subscribers)Úerroré   )rf   ÚCRTTransferCoordinatorr?   ÚCRTTransferMetaÚCRTTransferFutureÚAfterDoneHandlerÚappendr>   Úacquirer;   Úget_crt_callbackÚget_make_request_argsr9   Zmake_requestrb   Úset_exceptionÚset_s3_requestr<   )r    Úrequest_typeÚ	call_argsÚon_done_after_callsr[   Ú
componentsÚfutureZ	afterdoneZ	on_queuedZcrt_callargsZcrt_s3_requestÚeÚon_doner"   r"   r#   rR     sF    
þ


 ÿû  ÿ
z#CRTTransferManager._submit_transfer)N)NN)NN)NN)F)F)r)   r*   r+   r$   rC   rJ   rT   rU   rV   rX   r\   r^   r`   rE   rf   rR   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 )rm   z*Holds metadata about the CRTTransferFutureNc                 C   s   || _ || _i | _d S r   )Ú_transfer_idÚ
_call_argsÚ_user_context)r    rg   rw   r"   r"   r#   r$   1  s    zCRTTransferMeta.__init__c                 C   s   | j S r   )r~   rB   r"   r"   r#   rw   6  s    zCRTTransferMeta.call_argsc                 C   s   | j S r   )r}   rB   r"   r"   r#   rg   :  s    zCRTTransferMeta.transfer_idc                 C   s   | j S r   )r   rB   r"   r"   r#   Úuser_context>  s    zCRTTransferMeta.user_context)NN)	r)   r*   r+   Ú__doc__r$   Úpropertyrw   rg   r€   r"   r"   r"   r#   rm   .  s   


rm   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 )rn   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)Ú_metarm   Ú_coordinator)r    rh   r[   r"   r"   r#   r$   D  s    	zCRTTransferFuture.__init__c                 C   s   | j S r   )rƒ   rB   r"   r"   r#   rh   R  s    zCRTTransferFuture.metac                 C   s
   | j  ¡ S r   )r„   rY   rB   r"   r"   r#   rY   V  s    zCRTTransferFuture.donec                 C   s   | j  |¡ d S r   )r„   r]   ©r    Útimeoutr"   r"   r#   r]   Y  s    zCRTTransferFuture.resultc                 C   s   | j  ¡  d S r   )r„   rI   rB   r"   r"   r#   rI   \  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)rY   r   r„   rt   )r    Ú	exceptionr"   r"   r#   rt   _  s
    ÿzCRTTransferFuture.set_exception)NN)N)
r)   r*   r+   r$   r‚   rh   rY   r]   rI   rt   r"   r"   r"   r#   rn   C  s   


rn   c                   @   s   e Z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)r    Útransfer_typerz   r"   r"   r#   Úserialize_http_requestj  s    z/BaseCRTRequestSerializer.serialize_http_requestN)r)   r*   r+   rŒ   r"   r"   r"   r#   r‰   i  s   r‰   c                   @   sV   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S )ÚBotocoreCRTRequestSerializerNc                 C   sl   || _ |dkri }|  ||¡ |jf |Ž| _| 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.*)
Ú_sessionÚ_resolve_client_configZcreate_clientÚ_clientrh   ÚeventsÚregisterÚ_capture_http_requestÚ+_change_response_to_serialized_http_requestÚ_make_fake_http_response)r    ÚsessionÚclient_kwargsr"   r"   r#   r$   z  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_versionZs3Úservice_name)Zget_default_client_configr   r   Úmerge)r    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
 |¡}d }|jr t|jdƒr–|j}n
t|jƒ}t	j
j|j|||d�}	|	S )Nú?zutf-8Úseek)ÚmethodÚpathÚheadersZbody_stream)r   Úurlrž   ÚqueryrŸ   ÚitemsÚ
isinstanceÚstrrp   ÚawscrtÚhttpZHttpHeadersÚbodyÚhasattrr   ZHttpRequestr�   )
r    Zaws_requestÚ	url_partsZcrt_pathZheaders_listÚnameÚvalueZcrt_headersZcrt_body_streamÚcrt_requestr"   r"   r#   Ú_crt_request_from_aws_request¢  s,    


üz:BotocoreCRTRequestSerializer._crt_request_from_aws_requestc                 C   sT   |   |¡}|j d¡d kr4t|jƒ}|j d|j¡ |j d¡d k	rP|j d¡ |S )NÚhostzContent-MD5)r­   rŸ   Úgetr   r    ÚsetÚnetlocÚremove)r    Ú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©r    Úrequestre   r"   r"   r#   r“   Ê  s    z2BotocoreCRTRequestSerializer._capture_http_requestc                 K   s   |d }|  ¡ |d< d S )Nrµ   ÚHTTPRequest)Úprepare)r    r¶   Úparsedre   r¸   r"   r"   r#   r”   Í  s    zHBotocoreCRTRequestSerializer._change_response_to_serialized_http_requestc                 K   s   t j d di tdƒ¡S )NéÈ   ó    )ÚbotocoreZ
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�   rL   rM   rO   )r    Zclient_methodrw   r"   r"   r#   Ú_get_botocore_http_requestÛ  s     ÿÿþz7BotocoreCRTRequestSerializer._get_botocore_http_requestc                 C   s   |   ||jj¡}|  |¡}|S r   )rÂ   rh   rw   r´   )r    r‹   rz   r³   r¬   r"   r"   r#   rŒ   à  s     ÿ
z3BotocoreCRTRequestSerializer.serialize_http_request)N)r)   r*   r+   r$   r�   r­   r´   r“   r”   r•   rÂ   rŒ   r"   r"   r"   r#   r�   y  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)r    ÚamtÚdecode_contentÚchunkr"   r"   r#   Ústreamé  s    
zFakeRawResponse.stream)rÃ   N)r)   r*   r+   rÈ   r"   r"   r"   r#   r¿   è  s   r¿   c                   @   sd   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S )rl   z-A helper class for managing CRTTransferFutureNc                 C   s0   || _ || _t ¡ | _d | _d | _t ¡ | _d S r   )	rg   Ú_s3_requestr   r   r   Ú
_exceptionÚ_crt_futureÚEventÚ_done_event)r    rg   Ú
s3_requestr"   r"   r#   r$   ô  s    
zCRTTransferCoordinator.__init__c                 C   s   | j S r   )rÉ   rB   r"   r"   r#   rÎ   ü  s    z!CRTTransferCoordinator.s3_requestc                 C   s   | j  ¡  d S r   )rÍ   r°   rB   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   rY   rÊ   )r    rˆ   r‡   r"   r"   r#   rt     s    z$CRTTransferCoordinator.set_exceptionc                 C   s   | j r| j  ¡  d S r   )rÉ   rI   rB   r"   r"   r#   rI     s    zCRTTransferCoordinator.cancelc              	   C   s`   | j r| j ‚z4z| j |¡ W n tk
r<   |  ¡  ‚ Y nX W 5 | jrNd | _| j |¡ X d S r   )rÊ   rÉ   rË   r]   ra   rI   r…   r"   r"   r#   r]     s    zCRTTransferCoordinator.resultc                 C   s   | j d krdS | j  ¡ S )NF)rË   rY   rB   r"   r"   r#   rY     s    
zCRTTransferCoordinator.donec                 C   s   || _ | j j| _d S r   )rÉ   Zfinished_futurerË   )r    rÎ   r"   r"   r#   ru   !  s    z%CRTTransferCoordinator.set_s3_request)NN)N)F)N)r)   r*   r+   r�   r$   r‚   rÎ   rÏ   r_   rt   rI   r]   rY   ru   r"   r"   r"   r#   rl   ñ  s   




rl   c                   @   s&   e Zd Zdd„ Zdd„ Zddd„ZdS )	r:   c                 C   s   || _ || _d S r   )Ú_request_serializerÚ	_os_utils)r    r@   Zos_utilsr"   r"   r#   r$   '  s    zS3ClientArgsCreator.__init__c              
   C   s°   d }d }t t| ¡ tjƒ}g }	|tjkrV|j}
| j |
¡}t||
|| jƒ}|	 	|¡ n&|tj
kr||j}| j |¡}||jd< | j ||¡}|||||  |d|	|¡|  |d¡dœS )NZContentLengthrY   Úprogress)r¸   ÚtypeÚrecv_filepathÚsend_filepathr|   Zon_progress)rÁ   r   ÚupperÚDEFAULTZ
GET_OBJECTrN   rÒ   Zget_temp_filenameÚRenameTempFileHandlerrp   Z
PUT_OBJECTZget_file_sizerO   rÑ   rŒ   rr   )r    rv   rw   r[   rz   rx   rÕ   rÖ   Zs3_meta_request_typeZon_done_before_callsZfinal_filepathZfile_ondone_callZdata_lenr¬   r"   r"   r#   rs   +  sL      ÿ
   ÿ

 ÿ   ÿ
ø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 )NrÓ   r   )Zbytes_transferred)r   )rH   re   Zcallbacks_listÚcallback©ri   Úbefore_subscribersÚcallback_typerz   r"   r#   Úinvoke_all_callbacksV  s    zBS3ClientArgsCreator.get_crt_callback.<locals>.invoke_all_callbacksr"   )r    rz   rÝ   rÜ   ri   rÞ   r"   rÛ   r#   rr   O  s    z$S3ClientArgsCreator.get_crt_callback)NN)r)   r*   r+   r$   rs   rr   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   )r    r[   Zfinal_filenameZtemp_filenamerA   r"   r"   r#   r$   j  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 )Nrj   )r8   Zremove_filerà   Zrename_filerß   rb   r„   rt   )r    re   rj   r{   r"   r"   r#   r(   p  s     ÿzRenameTempFileHandler.__call__N©r)   r*   r+   r$   r(   r"   r"   r"   r#   rÙ   i  s   rÙ   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ro   c                 C   s
   || _ d S r   )r„   rZ   r"   r"   r#   r$   €  s    zAfterDoneHandler.__init__c                 K   s   | j  ¡  d S r   )r„   rÏ   rd   r"   r"   r#   r(   ƒ  s    zAfterDoneHandler.__call__Nrá   r"   r"   r"   r#   ro     s   ro   )8Úloggingr   Úior   Zawscrt.httpr¥   Zbotocore.awsrequestr¾   Zbotocore.sessionZawscrt.authr   r   Z	awscrt.ior   r   r   r   r	   Z	awscrt.s3r
   r   r   r   Zbotocore.compatr   Zbotocore.configr   Zbotocore.exceptionsr   Zs3transfer.constantsr   r   Zs3transfer.exceptionsr   Zs3transfer.futuresr   r   Zs3transfer.utilsr   r   r   Ú	getLoggerr)   Úloggerr   r5   r6   rm   rn   r‰   r�   r¿   rl   r:   rÙ   ro   r"   r"   r"   r#   Ú<module>   sH   

ù
V &o	5C