
    DhV                        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 jR                  e*      Z+ G d d      Z,dddez  dz  dez  ddfdZ- G d d      Z. G d de$      Z/ G d de#      Z0 G d d      Z1 G d de1      Z2 G d de      Z3 G d  d!      Z4 G d" d#      Z5 G d$ d%      Z6 G d& d'      Z7y)(    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                       e Zd Zd Zd Zd Zy)CRTCredentialProviderAdapterc                 R    || _         d | _        t        j                         | _        y N)_botocore_credential_provider_loaded_credentials	threadingLock_lock)selfbotocore_credential_providers     p/var/www/fastuser/data/www/generator.snapmosaic.io/flask_app/venv/lib/python3.12/site-packages/s3transfer/crt.py__init__z%CRTCredentialProviderAdapter.__init__+   s     -I*#' ^^%
    c                     | j                         j                         }t        |j                  |j                  |j
                        S r   )_get_credentialsget_frozen_credentialsr   
access_key
secret_keytoken)r#   credentialss     r%   __call__z%CRTCredentialProviderAdapter.__call__0   s?    ++-DDF""K$:$:K<M<M
 	
r'   c                     | j                   5  | j                  -| j                  j                         }|
t	               || _        | j                  cd d d        S # 1 sw Y   y xY wr   )r"   r   r   load_credentialsr   )r#   loaded_credss     r%   r)   z-CRTCredentialProviderAdapter._get_credentials6   sc    ZZ 	,''/66GGI   ',..+7(++	, 	, 	,s   AAA%N)__name__
__module____qualname__r&   r/   r)    r'   r%   r   r   *   s    &

	,r'   r         Tc           	         t        |      }t        |      }t        ||      }	d}
d}|rt        j                  nt        j
                  }|At               }|r|j                  |       nd|_        t        |      }|j                         }|r t        |      }t        j                  |      }
|dz  t        z  }t        |	| |
||||      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)ca_filepathFr8   )	bootstrapregioncredential_provider	part_sizetls_modetls_connection_optionsthroughput_target_gbps)r	   r   r   r   ENABLEDDISABLEDr
   &override_default_trust_store_from_pathverify_peerr   new_connection_optionsr   r   new_delegater   r   )r<   r$   num_threadstarget_throughputr>   use_sslverifyevent_loop_grouphost_resolverr;   providerr@   r?   tls_ctx_optionsclient_tls_optioncredentails_provider_adaptertarget_gbpss                    r%   create_s3_crt_clientrS   B   s    ^ &k2'(89M 0-@IH! %,  1A1J1J  +-BB" C  +0O',_=!2!I!I!K#'C((
$ *66(
 $a'",K$5* r'   c                   h    e Zd ZddZd Zd Z	 ddZddZddZddZ	d	 Z
d
 Zd ZddZd Zd Zy)CRTTransferManagerNc                     |t               | _        || _        t        || j                        | _        g | _        t        j                  d      | _        d| _	        y)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#   crt_s3_clientcrt_request_serializerosutils       r%   r&   zCRTTransferManager.__init__   sT     >"9DL+ 3"DLL!
 %'!#--c2r'   c                     | S r   r6   r#   s    r%   	__enter__zCRTTransferManager.__enter__   s    r'   c                 2    d}|rd}| j                  |       y )NFT	_shutdown)r#   exc_type	exc_valueargscancels        r%   __exit__zCRTTransferManager.__exit__   s    Fvr'   c                 V    |i }|i }t        |||||      }| j                  d|      S )Nbucketkeyfileobj
extra_argssubscribers
get_objectr   _submit_transfer)r#   rp   rq   rr   rs   rt   callargss          r%   downloadzCRTTransferManager.download   sH     JK!#
 $$\8<<r'   c                 V    |i }|i }t        |||||      }| j                  d|      S )Nro   
put_objectrv   )r#   rr   rp   rq   rs   rt   rx   s          r%   uploadzCRTTransferManager.upload   sF    JK!#
 $$\8<<r'   c                 T    |i }|i }t        ||||      }| j                  d|      S )N)rp   rq   rs   rt   delete_objectrv   )r#   rp   rq   rs   rt   rx   s         r%   deletezCRTTransferManager.delete   sC    JK!#	
 $$_h??r'   c                 &    | j                  |       y r   rg   r#   rl   s     r%   shutdownzCRTTransferManager.shutdown   s    vr'   c                 h    | j                   D ]#  }|j                         r|j                          % y r   )r\   donerl   r#   coordinators     r%   _cancel_transfersz$CRTTransferManager._cancel_transfers   s/    44 	%K##%""$	%r'   c                 F    | j                   D ]  }|j                           y r   )r\   resultr   s     r%   _finish_transfersz$CRTTransferManager._finish_transfers   s#    44 	!K 	!r'   c                 F    | j                   D ]  }|j                           y r   )r\   %wait_until_on_done_callbacks_completer   s     r%   _wait_transfers_donez'CRTTransferManager._wait_transfers_done   s%    44 	@K==?	@r'   c                     |r| j                          	 | j                          | j	                          y # t        $ r | j                          Y ,t        $ r Y 6w xY w# | j	                          w xY wr   )r   r   KeyboardInterrupt	Exceptionr   r   s     r%   rh   zCRTTransferManager._shutdown   sg    ""$	(""$ %%' ! 	%""$ 		 %%'s-   5 AA AA AA A0c                 8    | j                   j                          y r   )r^   releaser#   kwargss     r%   _release_semaphorez%CRTTransferManager._release_semaphore  s    !r'   c                    | j                   g}t        | j                        }t        | j                  |      |d}t	        d	i |}t        |      }|j                  |       	 | j                  j                          | j                  j                  |d      } |        | j                  j                  |||||      }	 | j                  j                  d	i |	}
|j                  |
       | j"                  j                  |       | xj                  dz  c_        |S # t        $ rC}|j!                  |d       | j                  j                  |d|      } ||       Y d }~yd }~ww xY w)
N)transfer_id)metar   queuedTr   )after_subscribers)error   r6   )r   CRTTransferCoordinatorr_   CRTTransferMetaCRTTransferFutureAfterDoneHandlerappendr^   acquirer[   get_crt_callbackget_make_request_argsrY   make_requestset_s3_requestr   set_exceptionr\   )r#   request_type	call_argson_done_after_callsr   
componentsfuture	afterdone	on_queuedcrt_callargscrt_s3_requesteon_dones                r%   rw   z#CRTTransferManager._submit_transfer  sg   #667,9I9IJ#D$4$4i@&

 #0Z0$[1	""9-	7OO##%-->>I K00FF#L >T00==MMN &&~6!!((5A  	%%a.++<<2E = G !	s   %A8D   	E,)9E''E,r   NNF)r3   r4   r5   r&   re   rm   ry   r|   r   r   r   r   r   rh   r   rw   r6   r'   r%   rU   rU      sL    4 BF= =@%
!@("$r'   rU   c                   H    e Zd ZdZddZed        Zed        Zed        Zy)r   z*Holds metadata about the CRTTransferFutureNc                 .    || _         || _        i | _        y r   )_transfer_id
_call_args_user_context)r#   r   r   s      r%   r&   zCRTTransferMeta.__init__1  s    '#r'   c                     | j                   S r   )r   rd   s    r%   r   zCRTTransferMeta.call_args6  s    r'   c                     | j                   S r   )r   rd   s    r%   r   zCRTTransferMeta.transfer_id:  s       r'   c                     | j                   S r   )r   rd   s    r%   user_contextzCRTTransferMeta.user_context>  s    !!!r'   r   )	r3   r4   r5   __doc__r&   propertyr   r   r   r6   r'   r%   r   r   .  sF    4 
   ! ! " "r'   r   c                   >    e Zd ZddZed        Zd Zd	dZd Zd Z	y)
r   Nc                 B    || _         |t               | _         || _        y)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)r#   r   r   s      r%   r&   zCRTTransferFuture.__init__D  s"     
<(*DJ'r'   c                     | j                   S r   )r   rd   s    r%   r   zCRTTransferFuture.metaR  s    zzr'   c                 6    | j                   j                         S r   )r   r   rd   s    r%   r   zCRTTransferFuture.doneV  s      %%''r'   c                 :    | j                   j                  |       y r   )r   r   r#   timeouts     r%   r   zCRTTransferFuture.resultY  s      )r'   c                 8    | j                   j                          y r   )r   rl   rd   s    r%   rl   zCRTTransferFuture.cancel\  s      "r'   c                 t    | j                         st        d      | j                  j                  |d       y)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   )r#   	exceptions     r%   r   zCRTTransferFuture.set_exception_  s8    yy{&  	''	D'Ar'   r   r   )
r3   r4   r5   r&   r   r   r   r   rl   r   r6   r'   r%   r   r   C  s0    (  (*#Br'   r   c                       e Zd Zd Zy)BaseCRTRequestSerializerc                     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)r#   transfer_typer   s      r%   serialize_http_requestz/BaseCRTRequestSerializer.serialize_http_requestj  s     ""<==r'   N)r3   r4   r5   r   r6   r'   r%   r   r   i  s    >r'   r   c                   D    e Zd ZddZd Zd Zd Zd Zd Zd Z	d	 Z
d
 Zy)BotocoreCRTRequestSerializerNc                    || _         |i }| j                  ||        |j                  di || _        | j                  j                  j
                  j                  d| j                         | j                  j                  j
                  j                  d| j                         | j                  j                  j
                  j                  d| j                         y)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.*r6   )
_session_resolve_client_configcreate_client_clientr   eventsregister_capture_http_request+_change_response_to_serialized_http_request_make_fake_http_response)r#   sessionclient_kwargss      r%   r&   z%BotocoreCRTRequestSerializer.__init__z  s       M##G];,w,,=}=  ))"D$>$>	
 	  ))tOO	
 	  )) = =	
r'   c                     d }|j                         r|j                         }d|v r|d   }t        t              }|r|j                  |      }||d<   d|d<   y )Nconfig)signature_versions3service_name)get_default_client_configr   r   merge)r#   r   r   user_provided_configclient_configs        r%   r   z3BotocoreCRTRequestSerializer._resolve_client_config  sg    #,,.#*#D#D#F }$#0#: :066}EM"/h(,n%r'   c                 p   t        |j                        }|j                  }|j                  r| d|j                   }g }|j                  j                         D ]F  \  }}t        |t              r|j                  ||f       *|j                  |t        |d      f       H t        j                  j                  |      }d }|j                  r8t        |j                  d      r|j                  }nt        |j                        }t        j                  j                  |j                   |||      }	|	S )N?zutf-8seek)methodpathheadersbody_stream)r   urlr   queryr   items
isinstancestrr   awscrthttpHttpHeadersbodyhasattrr   HttpRequestr   )
r#   aws_request	url_partscrt_pathheaders_listnamevaluecrt_headerscrt_body_streamcrt_requests
             r%   _crt_request_from_aws_requestz:BotocoreCRTRequestSerializer._crt_request_from_aws_request  s   [__-	>>??"1Y__$56H&..446 	AKD%%%##T5M2##T3ug+>$?@		A kk--l;{''0"-"2"2")+*:*:";kk--%%'	 . 
 r'   c                 @   | j                  |      }|j                  j                  d      ;t        |j                        }|j                  j                  d|j                         |j                  j                  d      |j                  j                  d       |S )NhostzContent-MD5)r  r   getr   r   setnetlocremove)r#   botocore_http_requestr  r   s       r%   _convert_to_crt_http_requestz9BotocoreCRTRequestSerializer._convert_to_crt_http_request  s    889NO""6*2 !6!:!:;I##FI,<,<=""=1=&&}5r'   c                 "    ||j                   d<   y )Nhttp_request)contextr#   requestr   s      r%   r   z2BotocoreCRTRequestSerializer._capture_http_request  s    *1'r'   c                 4    |d   }|j                         |d<   y )Nr  HTTPRequest)prepare)r#   r  parsedr   r  s        r%   r   zHBotocoreCRTRequestSerializer._change_response_to_serialized_http_request  s     .) ' 1}r'   c                 X    t         j                  j                  d di t        d            S )N   r'   )botocore
awsrequestAWSResponseFakeRawResponser  s      r%   r   z5BotocoreCRTRequestSerializer._make_fake_http_response  s,    ""..C 	
 	
r'   c                      t        | j                  |      d|j                  |j                  d|j                  d   S )N)BucketKeyr  r6   )getattrr   rp   rq   rs   )r#   client_methodr   s      r%   _get_botocore_http_requestz7BotocoreCRTRequestSerializer._get_botocore_http_request  sF    3wt||]3 
##
:C:N:N

 	r'   c                 t    | j                  ||j                  j                        }| j                  |      }|S r   )r"  r   r   r  )r#   r   r   r  r  s        r%   r   z3BotocoreCRTRequestSerializer.serialize_http_request  s;     $ ? ?6;;00!
 778MNr'   r   )r3   r4   r5   r&   r   r  r  r   r   r   r"  r   r6   r'   r%   r   r   y  s/    
6-:	22

r'   r   c                       e Zd ZddZy)r  Nc              #   >   K   	 | j                  |      }|sy | wr   )read)r#   amtdecode_contentchunks       r%   streamzFakeRawResponse.stream  s&     IIcNEK	 s   )i   N)r3   r4   r5   r*  r6   r'   r%   r  r    s    r'   r  c                   X    e Zd ZdZddZed        Zd ZddZddZ	d Z
dd	Zd
 Zd Zy)r   z-A helper class for managing CRTTransferFutureNc                     || _         || _        t        j                         | _        d | _        d | _        t        j                         | _        y r   )	r   _s3_requestr    r!   r"   
_exception_crt_futureEvent_done_event)r#   r   
s3_requests      r%   r&   zCRTTransferCoordinator.__init__  s>    &%^^%
$??,r'   c                     | j                   S r   )r-  rd   s    r%   r2  z!CRTTransferCoordinator.s3_request  s    r'   c                 8    | j                   j                          y r   )r1  r	  rd   s    r%   set_done_callbacks_completez2CRTTransferCoordinator.set_done_callbacks_complete   s    r'   c                 :    | j                   j                  |       y r   )r1  waitr   s     r%   r   z<CRTTransferCoordinator.wait_until_on_done_callbacks_complete  s    g&r'   c                 x    | j                   5  | j                         r|r|| _        d d d        y # 1 sw Y   y xY wr   )r"   r   r.  )r#   r   r   s      r%   r   z$CRTTransferCoordinator.set_exception  s0    ZZ 	,99;("+	, 	, 	,s   09c                 R    | j                   r| j                   j                          y y r   )r-  rl   rd   s    r%   rl   zCRTTransferCoordinator.cancel  s"    ##% r'   c                 l   | j                   r| j                   	 | j                  j                  |       	 | j
                  rd | _        | j                  j                  |       y # t        $ r | j	                           w xY w# | j
                  rd | _        | j                  j                  |       w xY wr   )r.  r/  r   r   rl   r-  r   s     r%   r   zCRTTransferCoordinator.result  s    ??//!	-##G,
 #' ##G, ! 	KKM	 #' ##G,s   A% %B  B 0B3c                 P    | j                   y| j                   j                         S )NF)r/  r   rd   s    r%   r   zCRTTransferCoordinator.done  s&    #$$&&r'   c                 H    || _         | j                   j                  | _        y r   )r-  finished_futurer/  )r#   r2  s     r%   r   z%CRTTransferCoordinator.set_s3_request!  s    %++;;r'   r   r   r   )r3   r4   r5   r   r&   r   r2  r5  r   r   rl   r   r   r   r6   r'   r%   r   r     sA    7-    ',
&-'
<r'   r   c                   $    e Zd Zd Zd Z	 	 ddZy)rZ   c                      || _         || _        y r   )_request_serializer	_os_utils)r#   ra   os_utilss      r%   r&   zS3ClientArgsCreator.__init__'  s    #9 !r'   c           
      P   d }d }t        t        |j                         t        j                        }g }	|t        j                  k(  rQ|j
                  }
| j                  j                  |
      }t        ||
|| j                        }|	j                  |       nI|t        j                  k(  r6|j
                  }| j                  j                  |      }||j                  d<   | j                  j                  ||      }||||| j                  |d|	|      | j                  |d      dS )NContentLengthr   progress)r  typerecv_filepathsend_filepathr   on_progress)r   r   upperDEFAULT
GET_OBJECTrr   rA  get_temp_filenameRenameTempFileHandlerr   
PUT_OBJECTget_file_sizers   r@  r   r   )r#   r   r   r   r   r   rG  rH  s3_meta_request_typeon_done_before_callsfinal_filepathfile_ondone_calldata_lenr  s                 r%   r   z)S3ClientArgsCreator.get_make_request_args+  s(    &<--/1F1F 
  "=#;#;;&..N NN<<^LM4^]DNN  !''(89!]%=%==%--M~~33MBH4<I  1..EE&

 #(**,, 46I  00D	
 		
r'   Nc                     fd}|S )Nc                      g }|z  }|t              z  }|z  }|D ]  }dk(  r || d           || i |  y )NrE  r   )bytes_transferred)r   )rk   r   callbacks_listcallbackr   before_subscriberscallback_typer   s       r%   invoke_all_callbackszBS3ClientArgsCreator.get_crt_callback.<locals>.invoke_all_callbacksV  sm    N!-"44mFMBBN ,"33* . !J.tAw7d-f-.r'   r6   )r#   r   r\  r[  r   r]  s    ```` r%   r   z$S3ClientArgsCreator.get_crt_callbackO  s    	.  $#r'   r   )r3   r4   r5   r&   r   r   r6   r'   r%   rZ   rZ   &  s    ""
P  $r'   rZ   c                       e Zd Zd Zd Zy)rN  c                 <    || _         || _        || _        || _        y r   )r   _final_filename_temp_filenamerX   )r#   r   final_filenametemp_filenamerb   s        r%   r&   zRenameTempFileHandler.__init__j  s!    '-+r'   c                 l   |d   }|r&| j                   j                  | j                         y 	 | j                   j                  | j                  | j                         y # t
        $ rJ}| j                   j                  | j                         | j                  j                  |       Y d }~y d }~ww xY w)Nr   )rX   remove_filera  rename_filer`  r   r   r   )r#   r   r   r   s       r%   r/   zRenameTempFileHandler.__call__p  s    wLL$$T%8%893(('')=)=  3(()<)<=!!//223s   0A   	B3)A B..B3Nr3   r4   r5   r&   r/   r6   r'   r%   rN  rN  i  s    3r'   rN  c                       e Zd Zd Zd Zy)r   c                     || _         y r   )r   r   s     r%   r&   zAfterDoneHandler.__init__  s
    'r'   c                 8    | j                   j                          y r   )r   r5  r   s     r%   r/   zAfterDoneHandler.__call__  s    557r'   Nrg  r6   r'   r%   r   r     s    (8r'   r   )8loggingr    ior   awscrt.httpr   botocore.awsrequestr  botocore.sessionawscrt.authr   r   	awscrt.ior   r   r   r	   r
   	awscrt.s3r   r   r   r   botocore.compatr   botocore.configr   botocore.exceptionsr   s3transfer.constantsr   r   s3transfer.exceptionsr   s3transfer.futuresr   r   s3transfer.utilsr   r   r   	getLoggerr3   loggerr   rS   rU   r   r   r   r   r  r   rZ   rN  r   r6   r'   r%   <module>r|     s	         >  @ ?  $ " 2 ' 6 C = =			8	$, ,4 "&"fqj"fSlS Sl"& "*#B* #BL> > l#; l^g 2< 2<j@$ @$F3 3,8 8r'   