o dV@sddlZddlZddlmZddlZddlZddlZddl m Z m Z ddl m Z mZmZmZmZddlmZmZmZddlmZddlmZddlmZdd lmZdd lmZmZdd l m!Z!dd l"m#Z#m$Z$dd l%m&Z&m'Z'm(Z(e)e*Z+GdddZ,dddeddeddfddZ-GdddZ.Gddde$Z/Gddde#Z0GdddZ1Gddde1Z2Gdd d eZ3Gd!d"d"Z4Gd#d$d$Z5Gd%d&d&Z6Gd'd(d(Z7dS))N)BytesIO)AwsCredentialsAwsCredentialsProvider)ClientBootstrapClientTlsContextDefaultHostResolverEventLoopGroupTlsContextOptions)S3ClientS3RequestTlsMode S3RequestType)UNSIGNED)urlsplit)Config)NoCredentialsError)GBMB)TransferNotDoneError)BaseTransferFutureBaseTransferMeta)CallArgsOSUtils get_callbacksc@s$eZdZddZddZddZdS)CRTCredentialProviderAdaptercCs||_d|_t|_dSN)_botocore_credential_provider_loaded_credentials threadingLock_lock)selfbotocore_credential_providerr"i/private/var/folders/v1/_jykv66s6qd26_69j1njbrl80000gr/T/pip-target-p1gutpg6/lib/python/s3transfer/crt.py__init__+sz%CRTCredentialProviderAdapter.__init__cCs|}t|j|j|jSr)_get_credentialsZget_frozen_credentialsrZ access_keyZ secret_keytoken)r credentialsr"r"r#__call__0s  z%CRTCredentialProviderAdapter.__call__cCsX|j|jdur|j}|durt||_|jWdS1s%wYdSr)rrrZload_credentialsr)r Z loaded_credsr"r"r#r%6s $z-CRTCredentialProviderAdapter._get_credentialsN)__name__ __module__ __qualname__r$r(r%r"r"r"r#r*s rTc Cst|}t|}t||} d} d} |rtjntj} |dur4t} |r)| j|dnd| _t | }| } |r?t |}t |} |dt}t| || || | |dS)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-) bootstrapregionZcredential_provider part_sizetls_modetls_connection_optionsZthroughput_target_gbps)rrrr ZENABLEDZDISABLEDr Z&override_default_trust_store_from_pathZ verify_peerrZnew_connection_optionsrrZ new_delegaterr )r/r!Z num_threadsZtarget_throughputr0Zuse_sslverifyZevent_loop_groupZ host_resolverr.providerr2r1Ztls_ctx_optionsZclient_tls_optionZcredentails_provider_adapterZ target_gbpsr"r"r#create_s3_crt_clientBsB/  r5c@seZdZdddZddZddZ ddd Zdd d Zdd d ZdddZ ddZ ddZ ddZ dddZ ddZddZdS) CRTTransferManagerNcCs@|durt|_||_t||j|_g|_td|_d|_ dS)aFA 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. Nr) r_osutil_crt_s3_clientS3ClientArgsCreator_s3_args_creator_future_coordinatorsr Semaphore _semaphore _id_counter)r Z crt_s3_clientcrt_request_serializerosutilr"r"r#r$s  zCRTTransferManager.__init__cCs|Srr"r r"r"r# __enter__szCRTTransferManager.__enter__cGsd}|rd}||dS)NFT _shutdown)r exc_type exc_valueargscancelr"r"r#__exit__szCRTTransferManager.__exit__cCs6|duri}|dur i}t|||||d}|d|S)Nbucketkeyfileobj extra_args subscribersZ get_objectr_submit_transfer)r rLrMrNrOrPcallargsr"r"r#downloads zCRTTransferManager.downloadcCs6|duri}|dur i}t|||||d}|d|S)NrKZ put_objectrQ)r rNrLrMrOrPrSr"r"r#uploads zCRTTransferManager.uploadcCs4|duri}|dur i}t||||d}|d|S)N)rLrMrOrPZ delete_objectrQ)r rLrMrOrPrSr"r"r#deletes zCRTTransferManager.deleteFcCs||dSrrDr rIr"r"r#shutdownzCRTTransferManager.shutdowncCs |jD] }|s |qdSr)r<donerIr coordinatorr"r"r#_cancel_transferss z$CRTTransferManager._cancel_transferscC|jD]}|qdSr)r<resultr[r"r"r#_finish_transfers  z$CRTTransferManager._finish_transferscCr^r)r<%wait_until_on_done_callbacks_completer[r"r"r#_wait_transfers_doneraz'CRTTransferManager._wait_transfers_donecCsz|r|z1z|Wnty|Ynty"YnwW|dSW|dSW|dS|wr)r]r`KeyboardInterrupt ExceptionrcrWr"r"r#rEs      zCRTTransferManager._shutdowncK|jdSr)r>releaser kwargsr"r"r#_release_semaphorerYz%CRTTransferManager._release_semaphorec Cs|jg}t|jd}t|j||d}td i|}t|}||z$|j|j |d}||j |||||} |j j d i| } Wn&tym} z|| d|j j |d|d} | | dWYd} ~ n d} ~ ww|| |j||jd7_|S) N) transfer_id)metar\ZqueuedTrZ)after_subscribers)errorr")rjCRTTransferCoordinatorr?CRTTransferMetaCRTTransferFutureAfterDoneHandlerappendr>acquirer;get_crt_callbackget_make_request_argsr9Z make_requestre set_exceptionset_s3_requestr<) r request_type call_argson_done_after_callsr\ componentsfutureZ afterdoneZ on_queuedZ crt_callargsZcrt_s3_requesteon_doner"r"r#rRsD       z#CRTTransferManager._submit_transferrNNF)r)r*r+r$rCrJrTrUrVrXr]r`rcrErjrRr"r"r"r#r6s      r6c@s>eZdZdZd ddZeddZeddZed d ZdS) rqz*Holds metadata about the CRTTransferFutureNcCs||_||_i|_dSr) _transfer_id _call_args _user_context)r rkr{r"r"r#r$1s zCRTTransferMeta.__init__cC|jSr)rrBr"r"r#r{6zCRTTransferMeta.call_argscCrr)rrBr"r"r#rk:rzCRTTransferMeta.transfer_idcCrr)rrBr"r"r# user_context>rzCRTTransferMeta.user_contextr) r)r*r+__doc__r$propertyr{rkrr"r"r"r#rq.s   rqc@sDeZdZdddZeddZddZddd Zd d Zd d Z dS)rrNcCs ||_|dur t|_||_dS)aZThe 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)_metarq _coordinator)r rlr\r"r"r#r$Ds  zCRTTransferFuture.__init__cCrr)rrBr"r"r#rlRrzCRTTransferFuture.metacCs |jSr)rrZrBr"r"r#rZV zCRTTransferFuture.donecC|j|dSr)rr_r timeoutr"r"r#r_YzCRTTransferFuture.resultcCrfr)rrIrBr"r"r#rI\rYzCRTTransferFuture.cancelcCs$|std|jj|dddS)z!Sets the exception on the future.z?set_exception can only be called once the transfer is complete.T)overrideN)rZrrrx)r exceptionr"r"r#rx_s zCRTTransferFuture.set_exceptionrr) r)r*r+r$rrlrZr_rIrxr"r"r"r#rrCs    rrc@seZdZddZdS)BaseCRTRequestSerializercCstd)alSerialize 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 zserialize_http_request())NotImplementedError)r transfer_typer~r"r"r#serialize_http_requestjs z/BaseCRTRequestSerializer.serialize_http_requestN)r)r*r+rr"r"r"r#ris rc@sVeZdZdddZddZddZdd Zd d Zd d ZddZ ddZ ddZ dS)BotocoreCRTRequestSerializerNcCsp||_|dur i}||||jdi||_|jjjd|j|jjjd|j|jjjd|j dS)aSerialize 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. Nzrequest-created.s3.*zafter-call.s3.*zbefore-send.s3.*r") _session_resolve_client_configZ create_client_clientrleventsregister_capture_http_request+_change_response_to_serialized_http_request_make_fake_http_response)r session client_kwargsr"r"r#r$zs     z%BotocoreCRTRequestSerializer.__init__cCsPd}|r |}d|vr|d}ttd}|r||}||d<d|d<dS)Nconfig)Zsignature_versionZs3Z service_name)Zget_default_client_configrr merge)r rrZuser_provided_configZ client_configr"r"r#rs   z3BotocoreCRTRequestSerializer._resolve_client_configc Cst|j}|j}|jr|d|j}g}|jD]\}}t|tr+|||fq||t|dfqt j |}d}|j rPt |j drK|j }nt|j }t j j|j|||d} | S)N?zutf-8seek)methodpathheadersZ body_stream)rurlrqueryritems isinstancestrrtawscrthttpZ HttpHeadersbodyhasattrrZ HttpRequestr) r Z aws_request url_partsZcrt_pathZ headers_listnamevalueZ crt_headersZcrt_body_stream crt_requestr"r"r#_crt_request_from_aws_requests,     z:BotocoreCRTRequestSerializer._crt_request_from_aws_requestcCsT||}|jddurt|j}|jd|j|jddur(|jd|S)Nhostz Content-MD5)rrgetrrsetnetlocremove)r botocore_http_requestrrr"r"r#_convert_to_crt_http_requests   z9BotocoreCRTRequestSerializer._convert_to_crt_http_requestcKs||jd<dS)N http_request)contextr requestrir"r"r#rrYz2BotocoreCRTRequestSerializer._capture_http_requestcKs|d}||d<dS)Nr HTTPRequest)prepare)r rparsedrirr"r"r#rszHBotocoreCRTRequestSerializer._change_response_to_serialized_http_requestcKstjdditdS)N)botocoreZ awsrequestZ AWSResponseFakeRawResponserr"r"r#rs z5BotocoreCRTRequestSerializer._make_fake_http_responsecCs&t|j|d|j|jd|jdS)N)ZBucketKeyrr")getattrrrLrMrO)r Z client_methodr{r"r"r#_get_botocore_http_requests z7BotocoreCRTRequestSerializer._get_botocore_http_requestcCs|||jj}||}|Sr)rrlr{r)r rr~rrr"r"r#rs  z3BotocoreCRTRequestSerializer.serialize_http_requestr) r)r*r+r$rrrrrrrrr"r"r"r#rys    rc@seZdZdddZdS)rNccs ||}|s dS|Vqr)read)r amtdecode_contentchunkr"r"r#streams zFakeRawResponse.stream)rN)r)r*r+rr"r"r"r#rsrc@sdeZdZdZdddZeddZddZdd d Zdd d Z ddZ dddZ ddZ ddZ dS)rpz-A helper class for managing CRTTransferFutureNcCs0||_||_t|_d|_d|_t|_dSr) rk _s3_requestrrr _exception _crt_futureEvent _done_event)r rk s3_requestr"r"r#r$s  zCRTTransferCoordinator.__init__cCrr)rrBr"r"r#rrz!CRTTransferCoordinator.s3_requestcCrfr)rrrBr"r"r#set_done_callbacks_completerYz2CRTTransferCoordinator.set_done_callbacks_completecCrr)rwaitrr"r"r#rbrz|j}|j |} | |j d<|j ||} | |||||d| |||ddS)NZ ContentLengthrZprogress)rtype recv_filepath send_filepathrZ on_progress)rr upperDEFAULTZ GET_OBJECTrNrZget_temp_filenameRenameTempFileHandlerrtZ PUT_OBJECTZ get_file_sizerOrrrv)r rzr{r\r~r|rrZs3_meta_request_typeZon_done_before_callsZfinal_filepathZfile_ondone_calldata_lenrr"r"r#rw+s:         z)S3ClientArgsCreator.get_make_request_argsNcsfdd}|S)Ncsfg}dur |7}|t7}dur|7}|D]}dkr)||ddq||i|qdS)Nrr)Zbytes_transferred)r)rHriZcallbacks_listcallbackrmbefore_subscribers callback_typer~r"r#invoke_all_callbacksVszBS3ClientArgsCreator.get_crt_callback..invoke_all_callbacksr")r r~rrrmrr"rr#rvOsz$S3ClientArgsCreator.get_crt_callbackr)r)r*r+r$rwrvr"r"r"r#r:&s (r:c@eZdZddZddZdS)rcCs||_||_||_||_dSr)r_final_filename_temp_filenamer8)r r\Zfinal_filenameZ temp_filenamerAr"r"r#r$js zRenameTempFileHandler.__init__c Ksx|d}|r|j|jdSz |j|j|jWdSty;}z|j|j|j|WYd}~dSd}~ww)Nrn)r8Z remove_filerZ rename_filerrerrx)r rirnrr"r"r#r(ps zRenameTempFileHandler.__call__Nr)r*r+r$r(r"r"r"r#ris rc@r)rscCs ||_dSr)rr[r"r"r#r$rzAfterDoneHandler.__init__cKrfr)rrrhr"r"r#r(rYzAfterDoneHandler.__call__Nrr"r"r"r#rss rs)8loggingriorZ awscrt.httprZbotocore.awsrequestrZbotocore.sessionZ awscrt.authrrZ awscrt.iorrrrr Z awscrt.s3r r r r Zbotocore.compatrZbotocore.configrZbotocore.exceptionsrZs3transfer.constantsrrZs3transfer.exceptionsrZs3transfer.futuresrrZs3transfer.utilsrrr getLoggerr)loggerrr5r6rqrrrrrrpr:rrsr"r"r"r#sJ          V&o 5C