o QaZ>m?Z?z`ddl@mAZAddlBZBz eBjCddZDddZEWnGeFy=zeBGeBjHZDeDIddZEWneJy:eBjCeBjHdZDddZEYnwYneJyTeBGeBjHZDeDId dZEYnwWn/eeKfyZLz eMeLZNd!eNvrmd"ZOnd#eNZOeOd$7ZOd%aPd&dZEWYdZL[LndZL[Lwwd'd(ZQd)ZRd*ZSgZTGd+d,d,eUZVGd-d.d.eUZWeTXd.d/d0ZYd1d2ZZdS)3)absolute_importdivisionN)saxutils)timeout)debuginfowarningerror)ST_SIZE)urlparse) encodestring) encodebytes)md5)getListFromXmlgetTextFromXmlgetRootTagNamedecode_from_s3 encode_to_s3s3_quote)convertHeaderTupleListToDict hash_file_md5 unicodise deunicodisecheck_bucket_namecheck_bucket_name_dns_supportgetHostnameFromBucketcalculateChecksum) SortedDict) AccessLog)ACLGranteeLogDelivery)BidirMap)Config)*)MultiPartUpload)S3Uri)ConnMan)sign_request_v2sign_request_v4checksum_sha256_filechecksum_sha256_bufferformat_param_str) ArgumentErrorT)mimecC t|SN)magic_ from_filefiler5'/usr/lib/python3/dist-packages/S3/S3.pymime_magic_fileC r7c Cs4zt|WStttfytt|YSwr0)r1r4UnicodeDecodeErrorUnicodeEncodeErrorr-rr3r5r5r6r7Ps  )flagscCr/r0)r1 id_filenamer3r5r5r6r7Zr8cCstt|Sr0)r1r4rr3r5r5r6r7csmagicz%Module python-magic is not available.z'Module python-magic can't be used (%s).z. Guessing MIME types based on file extensions.FcCststtdat|dS)NTr) magic_warnedr magic_message mimetypes guess_typer3r5r5r6r7nscCsjdd}||}|dur-t|tr-d|vr)|d\}}|tdd}||f}n|df}|dur3d}|S)NcSs t|}|Sr0)r7)r4 magictyper5r5r6 _mime_magicwszmime_magic.._mime_magic;charsetNN) isinstancestrsplitlen)r4rCresultmimetyperEr5r5r6 mime_magicus  rMic@sFeZdZiZiZdddZddZddZdd Zd d Z d d Z dS) S3RequestNcCsn||_t|pidd|_t|jjjdkr#|jj|jjj|jd<||_||_|p,i|_ ||_ | dS)NT ignore_caserzx-amz-security-token) s3rheadersrJconfig access_token role_refreshresource method_stringparamsbodyrequester_pays)selfrRrXrWrSrZrYr5r5r6__init__s   zS3Request.__init__cCs*|jjjr|jdvrd|jd<dSdSdS)N)GETPOSTPUTHEAD requesterzx-amz-request-payer)rRrTr[rXrSr\r5r5r6r[szS3Request.requester_payscCs,d|jvr |jd=tdt|jd<dS)Ndatez%a, %d %b %Y %H:%M:%S +0000z x-amz-date)rStimestrftimegmtimercr5r5r6update_timestamps zS3Request.update_timestampcCs&|jjrdS|jjjs|jjrdSdS)NFT)rRendpoint_requires_signature_v4rT signature_v2fallback_to_signature_v2rcr5r5r6use_signature_v2s zS3Request.use_signature_v2cCs|jd}|r,td|rd||jdf}n|jd}t|j||j|j|_dStd|j |jd}|rb|t j vrLt j |d d|rX|t j vrbt tj|sbd||jdf}n|jd}t j|jdtj}t|j|||j||j|j|_dS)NbucketzUsing signature v2/%s%surizUsing signature v4%s.)rWgetrlrr(rXrYrSrR get_hostnamerO redir_map startswithrr# host_bucket region_mapbucket_locationr)rZ)r\ bucket_name resource_urihostname bucket_regionr5r5r6signs,        zS3Request.signcCsT||t|j}t|dddd|d<|dt|j7<|j||jfS)NroFTquote_backslashesunicode_output) rhr}dictrWrr,rYrXrS)r\rWr5r5r6 get_triplets  zS3Request.get_tripletr0) __name__ __module__ __qualname__rwrtr]r[rhrlr}rr5r5r5r6rOs   !rOc@s\eZdZedddddddZedd d d d d ZedededBededBededBededBededBededBededBededBededBededBd ZddddZdZddZ d d!Z d"d#Z d$d%Z dd'd(Z d)d*Zdd,d-Zdd.d/Zdd0d1Zdd2d3Zd4d5Zdd7d8Zd9d:Zd;d<Zdd=d>Zdd?d@ZddAdBZddCdDZddEdFZdGdHZdIdJZdKdLZddMdNZdOdPZ ddRdSZ!ddTdUZ"dVdWZ#dXdYZ$dZd[Z%d\d]Z&d^d_Z' & 6dd`daZ( & QddbdcZ) & QddddeZ*dfdgZ+dhdiZ,djdkZ-dldmZ.dndoZ/dpdqZ0drdsZ1dtduZ2dvdwZ3dxdyZ4dzd{Z5d|d}Z6d~dZ7dddZ8dddZ9dddZ: & +dddZ; & +dddZddZ?dddZ@dddZAddZBddZCddZDddZEddZFefddZGdddZHdQdedd+d&fddZIdddZJ QdddZKdefddZLd&S)S3rrN)r^r`raDELETEr_MASKiiii)SERVICEBUCKETOBJECTBATCHrrrr^rr`rrrar_r) UNDFINEDLIST_ALL_BUCKETS BUCKET_CREATE BUCKET_LIST BUCKET_DELETE OBJECT_PUT OBJECT_GET OBJECT_HEAD OBJECT_DELETE OBJECT_POST BATCH_DELETEzBucket '%s' does not existz Access to bucket '%s' was deniedzBucket '%s' already exists) NoSuchBucket AccessDeniedBucketAlreadyExistscCs||_d|_d|_d|_dSNF)rTrkriexpect_continue_not_supported)r\rTr5r5r6r]s z S3.__init__cCs(d}|jjdkr |jjS|jjrd}|S)NSTANDARDrpREDUCED_REDUNDANCY)rT storage_classreduced_redundancy)r\clsr5r5r6r s  zS3.storage_classcCs|r |tjvr tj|}n|rt|jj|rt|}n|jj}|jjr1| dr0|dd}n | dr<|dd}t d||f|S)Nz:443z:80zget_hostname(%s): %s) rOrtrrTrvr host_baselower use_httpsendswithr)r\rmhostr5r5r6rss       zS3.get_hostnamecCs|tj|<dSr0)rrOrt)r\rmredir_hostnamer5r5r6 set_hostname,szS3.set_hostnameNcCs|d}|r2|tjvrtj|dd|r$|tjvr2t|jj|s2dt|ddd|df}n|d}|r>d ||f}|jjdkrQ|jj sQd | ||f}t d ||S) NrmrprqrnFTr~roz%s%sz http://%s%szformat_uri(): ) rrrOrtrurrTrvr proxy_hostrrsr)r\rW base_pathryror5r5r6 format_uri/s(      z S3.format_uricCs*|d}||}t|dd|d<|S)NrdataBucketlist)create_request send_requestr)r\requestresponser5r5r6list_all_bucketsDs  zS3.list_all_bucketsc CsZg}g}||||||D]\}} } || || q i} || d<|| d<|| d<| S)Nrcommon_prefixes truncated)bucket_list_streamingextend) r\rmprefix recursive uri_paramslimit item_listprefixesrdirsobjectsrr5r5r6 bucket_listJs  zS3.bucket_listc#sDdd}dd}dd}fdd} |r|pi}d } g} d } d } |}| r|||||||d }|d }| t|7} | t|7} || | krT|| | }|d } | r|d ksf| | |kr|rr| d ||d <n|r}|d d|d <nd||fVdStd|d n| ||fVdS| ||fV| s'dSdS)ze Generator that produces , pairs of groups of content of a specified bucket. cSst|dpd}|dkS)N.//IsTruncatedfalse)rr)r is_truncatedr5r5r6_list_truncatedYs z1S3.bucket_list_streaming.._list_truncatedcS t|dS)NContentsrrr5r5r6 _get_contents^r8z/S3.bucket_list_streaming.._get_contentscSr)NCommonPrefixesrrr5r5r6_get_common_prefixesar8z6S3.bucket_list_streaming.._get_common_prefixescstddp |ddS)Nr NextMarkerrKey)r)r current_listrr5r6_get_next_markerdsz2S3.bucket_list_streaming.._get_next_markerTrrrmarkerPrefixFListing continues after '%s'N)copybucket_list_noparserJr)r\rmrrrrrrrrrr num_objects num_prefixesmax_keysrcurrent_prefixesr5rr6rWsH              zS3.bucket_list_streamingcCs^|duri}|r ||d<|jjs|sd|d<|dkr t||d<|jd||d}||}|S)Nr/ delimiterrzmax-keysrrmr)rTrrHrr)r\rmrrrrrrr5r5r6rs   zS3.bucket_list_noparsecCstdd}|r ||d}|rE|dkrE|dkrE|}|dkr.|}d}||7}|d7}td |t|dd nt|d d |jjrSd |d <|j d|||d}| |}|S)NTrPrpUS us-east-1EUz/z1zbucket_location: ) dns_strictF public-read x-amz-aclr)rmrSrZ) rupdatestripupperrrrrT acl_publicrr)r\rmrx extra_headersrSrZrrr5r5r6 bucket_creates&  $    zS3.bucket_createcC|jd|d}||}|S)Nr)rmrr)r\rmrrr5r5r6 bucket_delete zS3.bucket_deleteFc Cs<|}|jd|ddid}tj|d}tj|d}z?|r1|r%|s1|jjtj|<dtj|<||}W||vrA|tj|<n |tjvrJtj|=||vrT|tj|<n1|tjvr]tj|=n'||vrh|tj|<n |tjvrqtj|=||vr{|tj|<w|tjvrtj|=wt |dd}|r|dvrd}|S|d krd }|S) NrlocationrrprrLocationConstraint)rprrz eu-west-1) rmrrOrtrrrwrTrrr) r\roforce_us_defaultrmrsaved_redir_mapsaved_region_maprrr5r5r6get_bucket_locationsH             zS3.get_bucket_locationcCsL|jd|ddid}||}|dd}|r"t|dd}|Sd}|S)NrrequestPaymentrrrpPayer)rrmrrrr)r\rorr resp_datapayerr5r5r6get_bucket_requester_payss   zS3.get_bucket_requester_paysc CsVi}|||d<z |||d<W|Sty*}z d|d<WYd}~|Sd}~ww)Nzbucket-locationzrequester-pays)rrS3Error)r\rorer5r5r6 bucket_infoszS3.bucket_infoc Cs|}|jd|ddid}z*||}t|dd|d<t|dd|d<|jj|||d |d <|WStyU}z|jd krPt d WYd}~dSd}~ww) Nrwebsiterrz.//IndexDocument//Suffixindex_documentz.//ErrorDocument//Keyerror_document)rmrwebsite_endpointzICould not get /?website - website probably not configured for this bucket) rmrrrrTrrrstatusr)r\rorxrmrrrr5r5r6 website_infos(   zS3.website_infocCs|}d}|d7}|d|jj7}|d7}|jjr*|d7}|d|jj7}|d7}|d7}|jd ||d did }||}td ||S) NzFz z %sz z z %sz zrrrmrZrReceived response '%s')rmrT website_index website_errorrrr)r\rorxrmrZrrr5r5r6website_creates    zS3.website_createcCsN|}|jd|ddid}||}td||ddkr%td||S)Nrrrr r zExpected status 204: %s)rmrrrS3ResponseErrorr\rorxrmrrr5r5r6website_deletes    zS3.website_deletec Cs|}|jd|ddid}z||}Wn-tyB}z!|jdkr-tdWYd}~dS|jdkr=tdWYd}~dSd}~wwt|d}|d krTtd |dSt|dd |d <t|dd |d<t|dd|d<|S)Nr lifecyclerrzMCould not get /?lifecycle - lifecycle probably not configured for this bucketzKCould not get /?lifecycle - lifecycle support not implemented by the serverrLifecycleConfigurationz7Could not get /?lifecycle - unexpected xml response: %sz.//Rule//Prefixrz.//Rule//Expiration//Daterdz.//Rule//Expiration//Daysdays)rmrrrr rrr)r\rorxrmrrr root_tag_namer5r5r6expiration_infos@   zS3.expiration_infocCs|jjr |jjr td|jjs/|jjs/|jjrtdtd|}|jd|ddid}n||}| |}td||S)Nz+Expect either --expiry-day or --expiry-datezdel bucket lifecyclerrrr ) rT expiry_date expiry_daysParameterError expiry_prefixrrmr_expiration_setrrr5r5r6expiration_set=s   zS3.expiration_setcCstdd}|d7}|d|jj7}|d7}|d7}|jjr'|d|jj7}n |jjr3|d|jj7}|d 7}|d 7}|d 7}td d }t||d<|}|jd|||ddid}|S)Nzput bucket lifecyclezz z %sz Enabledz z %sz %sz z zTrP content-md5rrrmrSrZr) rrTrrrrcompute_content_md5rmr)r\rorZrSrmrr5r5r6rMs*  zS3._expiration_setcCs|jj}d}|dkr|jjstd|jjr6|jjr$ttjt |}|jj r/t |\}}nt |\}}|s<|jj}||fS)N-zRYou must specify --mime-type or --default-mime-type for files uploaded from stdin.)rTdefault_mime_typerguess_mime_typefollow_symlinksrospathrealpathruse_mime_magicrMr@rAr\filename content_typecontent_charsetr5r5r6_guess_content_typedszS3._guess_content_typecCs,|jj}|s |jj}|d|jj7}|S)N ; charset=)rT mime_typer$encodingr)r\r-r5r5r6stdin_content_typevs zS3.stdin_content_typecCsb|jj}d}|dkr|S|s||\}}|s|jj}|||r/|dur/|d|}|S)Nr#r0)rTr1r3r/r2r add_encodingr+r5r5r6r-~s  zS3.content_typecCs^d|vrdS|jjd}|ddkrdS|dd}t|dkr#dS|d}||vr-d SdS) Nzcharset=F,rrp.rNrT)rTadd_encoding_extsrIrsplitrJ)r\r,r-extspartsextr5r5r6r4s   zS3.add_encodingrpc Cs|jdkr td|j|dkrtjt|stdz,|dkr2tjt j ddd}d|_ d }ntjt|dd }||_ t t|t}Wnttfy]}ztd |jd}~wwtd d }|rj|||jjrrd|d<|jjrd|d<|jj|d<|j|d|d<|jjrd|d<||d<d} |jjs|dkrtd|jjr||jjtks|dkrd } ||jj|jjtkrtd|jj|jjf| r||||||S|jj r6z|!|} Wn t"yd} Ynw| dur6t#| dd} | dd$d} || kr-t%d|d ||jj&} | | kr#t'd|dSt'd| | |fn t'd | ||ft(||d<|j)d!||d"}||*|d#}|+|||}|S)$NrR Expected URI type 's3', got '%s'r#zNot a regular filerbF)modeclosefdzr)r>%sTrPAES256x-amz-server-side-encryptionaws:kms+x-amz-server-side-encryption-aws-kms-key-id)r, content-typerrx-amz-storage-classz2Multi-part upload is required to upload from stdinzZChunk size %d MB results in more than %d chunks. Please increase --multipart-chunk-size-mbrScontent-lengthetag"'rpz,Put: size and md5sum match for %s, skipping.zBMultiPart: checksum (%s vs %s) does not match for %s, reuploading.z>MultiPart: size (%d vs %d) does not match for %s, reuploading.rrorSsource destinationextra),type ValueErrorr'r(isfilerInvalidFileErrorioopensysstdinfileno stream_namestatr IOErrorOSErrorstrerrorrrrTserver_side_encryptionkms_keyr-rrenable_multipartrmultipart_chunk_size_mbSIZE_1MBmultipart_max_chunkssend_file_multipart put_continue object_info Exceptionintrr send_chunkrrHrro send_file)r\r,ror extra_label src_streamsizerrS multipartr remote_sizeremote_checksumchecksumrlabelsrr5r5r6 object_puts            z S3.object_putc CsJ|jdkr td|j|jd|d}|||d}|||||}|S)NrRr<rrorK)rOrPrro recv_file) r\rostream dest_namestart_positionrjrrqrr5r5r6 object_gets z S3.object_getcs fddD}||dS)z" Batch delete given a remote_list csg|]}|dqS)object_uri_strr5).0item remote_listr5r6 sz*S3.object_batch_delete..N)object_batch_delete_uri_strs)r\r}urisr5r|r6object_batch_deleteszS3.object_batch_deletec Csvdd}|}t|dkrtdt|d}|||}tt|dddd}|jd |||d d id }||}|S) z* Batch delete given a list of object uris cSsd}|D]3}t|}|jdkrtd|j|s td|||kr*tdt|}|d|7}q|d7}t|}|S)Nz.rRr<zURI '%s' has no objectz2The batch should contain keys from the same bucketz%sz ) r&rOrP has_objectrmrescapeobjectr)rmkey_listrZkeyrorr5r5r6compose_batch_del_xmls   z>S3.object_batch_delete_uri_strs..compose_batch_del_xmlrzKey list is emptyapplication/xml)r rETrPrdeleteNr!)rJrPr&rmrr"rr) r\rrbatchrm request_bodyrSrrr5r5r6rs"   zS3.object_batch_delete_uri_strscCs4|jdkr td|j|jd|d}||}|S)NrRr<rrs)rOrPrrr\rorrr5r5r6 object_delete"s  zS3.object_deletecCs|jdkr td|j|jjdkrtd|jjdvr tdd}|d|jj7}|d 7}|d |jj7}|d 7}|d 7}|jd ||ddid}||}td||S)NrRr<rz*You must restore a file for 1 or more days)Standard ExpeditedBulkz7Valid restoration priorities: bulk, standard, expeditedz@z %sz z %sz zrrestorerorZrr ) rOrPrT restore_daysrrestore_priorityrrr)r\rorZrrr5r5r6object_restore)s$      zS3.object_restorecCs4gd}||jjD] }||vr||=q |S)N) rdrGz last-modifiedr zx-amz-version-idzx-amz-delete-markerz accept-ranges connectionrHserverz x-amz-id-2zx-amz-request-idrF)rTremove_headersr)r\rS to_removehr5r5r6_sanitize_headers<s   zS3._sanitize_headersc Cs|jdkr td|j|jdkrtd|j|jjdurAz||}Wnty@}z|jdkr4|d}WYd}~nd}~wwd} d} |sK|jjrMd}|r^||} | d} t | d}|jj r| } |durw||} | d} t | d}||urt j t } n|jjt } || kr| dur||} | d} t | d}| } d} | r|| t| dd } ntdd } |jjrd | d <|| d <|jjrd | d<|jjrd| d<|jj| d<|r| ||jjr|jj| d<|sd| d<nd| d<| r||||| |}ntd||fddd| d<|jd|| d}||}|dr:t|ddkr:d|d<tdt||jjdurj|rjz |||W|Styi}z|jdkr^|WYd}~|Sd}~ww|S)a Remote copy an object and eventually set metadata Note: A little memo description of the nightmare for performance here: ** FOR AWS, 2 cases: - COPY will copy the metadata of the source to dest, but you can't modify them. Any additional header will be ignored anyway. - REPLACE will set the additional metadata headers that are provided but will not copy any of the source headers. So, to add to existing meta during copy, you have to do an object_info to get original source headers, then modify, then use REPLACE for the copy operation. ** For Minio and maybe other implementations: - if additional headers are sent, they will be set to the destination on top of source original meta in all cases COPY and REPLACE. It is a nice behavior except that it is different of the aws one. As it was still too easy, there is another catch: In all cases, for multipart copies, metadata data are never copied from the source. rRr<NrFTrSrGrPrrrFrArBrCrDrECOPYzx-amz-metadata-directiveREPLACEz/%s/%sr~zx-amz-copy-sourcerrJrErrorr zHServer error during the COPY operation. Overwrite response status to 500)rOrPrTrget_aclrr r1rergr_r%MAX_CHUNK_SIZE_MBramultipart_copy_chunk_size_mbrrrr]r^rcopy_file_multipartrrmrrrrr set_acl)r\src_uridst_urirsrc_sizerj replace_metaaclexcrmrSsrc_info src_headers thresholdrrr5r5r6 object_copyVs                        zS3.object_copycCs|j|||||ddS)NT)r)r)r\rrrrrjr5r5r6 object_modifys zS3.object_modifycCs`||||||}td||f|drt|ddvr)||td||Std||S)NzObject %s copied to %sr)CopyObjectResultCompleteMultipartUploadResultzObject '%s' deletedzGObject '%s' NOT deleted because of an unexpected response data content.)rrrrr)r\rrrrrj response_copyr5r5r6 object_moves    zS3.object_movecCr)Nrrsrrr5r5r6rerzS3.object_infocCsP|r|jd|ddid}n |jd|ddid}||}t|d}|S)Nrrrorrrr)rrrmrr )r\rorrrr5r5r6rs   z S3.get_aclcCstd|}td||ftddidd}|r%|jd|||ddid }n|jd |||ddid }||}|S) Nr@zset_acl(%s): acl-xml: %srErTrPrrrorSrZrrr!)rrrrrmr)r\rorrZrSrrr5r5r6rs  z S3.set_aclcC.|jd|ddid}||}t|dS)Nrpolicyrrrrmrrrr5r5r6 get_policy$   z S3.get_policycCs8tdd}d|d<|jd|||ddid}||}|S)NTrPzapplication/jsonrErrr)rrrr\rorrSrrr5r5r6 set_policy*s  z S3.set_policycC.|jd|ddid}td|||}|S)Nrrrzdelete_policy(%s)rrrrr5r5r6 delete_policy4   zS3.delete_policycCr)Nrcorsrrrrr5r5r6get_cors;rz S3.get_corscCsDtdd}d|d<t||d<|jd|||ddid}||}|S) NTrPrrEr rrr)rr"rr)r\rorrSrrr5r5r6set_corsAs   z S3.set_corscCr)Nrrrzdelete_cors(%s)rrr5r5r6 delete_corsLrzS3.delete_corscCsLtdd}t||d<|jd|||ddid}td||f||}|S)NTrPr rrrz(set_lifecycle_policy(%s): policy-xml: %s)rr"rrrrr5r5r6set_lifecycle_policySs   zS3.set_lifecycle_policycCs\tdd}d|d<d}|jjr|d7}n|d7}|d7}|jd ||d did }||}|S) NTrPrrEzN zRequester zBucketOwner z rrr)rrTr[rr)r\rorSrZrrr5r5r6 set_payer]s    z S3.set_payercCsB|jd|ddid}td|||}td|d|S)Nrrrzget_lifecycle_policy(%s)z%s: Got Lifecycle Policyr )rrmrrrr5r5r6get_lifecycle_policyks   zS3.get_lifecycle_policycCr)Nrrrzdelete_lifecycle_policy(%s)rrr5r5r6delete_lifecycle_policytrzS3.delete_lifecycle_policycCs*g}||||D] \}}||q |Sr0)get_multipart_streamingr)r\rorr upload_listruploadsr5r5r6 get_multipart{s zS3.get_multipartccs6|r|pi}|}d}d}|}d|d<|r|j|d||d}|d} t| d} |t| 7}||kr9||}t| d} | rF| dkrHd }|r|d ksR||kr| ryt| d } | sa| d d } | |d <t| d} | rq| |d<nd|vrx|d=nd | fVdStd|d n|| fVdS|| fV|sdSdS)NTrr)rrrrUploadrrFr NextKeyMarkerr KeyMarkerNextUploadIdMarkerUploadIdMarkerr)rrmrrrJrrr)r\rorrrmrrrrxml_datar xml_truncatednext_keyupload_id_markerr5r5r6rsX          zS3.get_multipart_streamingcCs,g}|||||D] \}}||q |Sr0)list_multipart_streamingr)r\ro upload_idrr part_listrr:r5r5r6list_multiparts zS3.list_multipartc cs|r|pi}d}d}|}|r}|||||}|d} t| d} |t| 7}||kr0||}t| d} | r=| dkr?d}|rt|dksI||krm| r]t| d } | sX| dd } | |d <nd| fVdStd |d n|| fVdS|| fV|sdSdS) NTrrPartrrFrNextPartNumberMarker PartNumberzpart-number-markerz!Listing continues after Part '%s')rlist_multipart_noparserrJrrr) r\rorrrrr max_partsrrrrnext_part_numberr5r5r6rsF         zS3.list_multipart_streamingcCsF|duri}|dkrt||d<||d<|jd||d}||}|S)Nrz max-partsuploadIdrr)rHrr)r\rorrrrrr5r5r6rs  zS3.list_multipart_noparsecCs"|jd|d|id}||}|S)Nrrrr)r\roidrrr5r5r6abort_multiparts  zS3.abort_multipartcCs2|jd|ddid}||}t|d}|S)Nrloggingrr)rrmrr)r\rorr accesslogr5r5r6 get_accesslogs   zS3.get_accesslogcCs^||}td||f|td|tdtd||f|||dS)NzCurrent ACL(%s): %sREAD_ACPWRITEzUpdated ACL(%s): %s)rrro appendGranteer!r)r\rorr5r5r6set_accesslog_acls zS3.set_accesslog_aclc Cst}|r||||n|d|}td||f|jd||ddid}z ||}W||fStyi} z&| j ddkr[t d| t d |||}nWYd} ~ ||fSd} ~ ww) Nr@z$set_accesslog(%s): accesslog-xml: %srrr CodeInvalidTargetBucketForLoggingz.Setting up log-delivery ACL for target bucket.zs3://%s) r enableLogging setAclPublicdisableLoggingrrrmrrrrr&) r\roenablelog_target_prefix_urirrrZrrrr5r5r6 set_accesslogs.      zS3.set_accesslogc Csddd}|r|s |rtd|r|}|r|pd}|r-||d<|r-d||d<tjtj|tjd@} t|| ||||} t d|d| S)Nr)rmroz>Both 'uri' and either 'bucket' or 'object' parameters suppliedrmrorzCreateRequest: resource[uri]=%s) rPrmrrr http_methodsgetkey operationsrOr) r\ operationrormrrSrZrrWrXrr5r5r6r(s   zS3.create_requestcCs|j|ddS)Nr) _max_retries)r\retriesr5r5r6 _fail_wait>sz S3._fail_waitc Os.|dd}d|vr?t|ddkr?t|dd}t|dd}|||td||r8|tj|<td|||i|S|jd kr|dd } | r| d rY| d d} n | d rd| dd} t d | j } |j d}||| td| |r|tj|<td|||i|St d|t |)NrSzx-amz-bucket-regionrrz .//Bucketz .//EndpointzRedirected to: %szRedirected to region: %srarzhttp://zhttps://rrmzRedirection error: No info provided by the server to where should be forwarded the request (HEAD request). (Hint target region: %s))rrrJrrrrOrwrXrur r{rWrr) r\rrfnargskwargs redir_region redir_bucketr location_urlr5r5r6_http_redirection_handlerBs6              zS3._http_redirection_handlerc Osd|vrvt|ddkrvt|dd}|dkr|*tj+|j_,| dkrt-|jj.| }|dkrU|*|}n|}|s^t/d|jj0dkrit }|1||j2||jjr|j1t3|d| t3|8} |}|jj0dkrt |}t4||jj0} t5| ||}|rt t-||jj6| dksC|7}!|j'}i}"|j(|"d<|j8|"d<t9|:|"d<|*|"d<| |"d<t;|t|"Wnty}zd}~wt/y}z |jjr |d d}~wty}z|jjr$|d |rd}#t?|dr?|j@r?|j@t@jAt@jBt@jCfvsMdtD|vsMdtD|vrtE|tFsz'|j'}i}"|j(|"d<|j8|"d<t9|:|"d<|*|"d<| |"d<d}#WntytGdYnw|#std|d |ftd ||t ||| ||||||d ||| WYd}~Snt||t8|7}|jjrO| j>t8|d!||kst?| Wnt@ycttfy}zq|jjrw| dt |dr|j!r|j!t!j"t!j#t!j$fvsdt%|vsdt%|vrt&|t'st(| |rt)d|d|ft)d|*|t+|*||,|||||dWYd}~St-d|dd}~ww|At}|jjr| >| d"|d  d#d$Bd%}d&|d vrz|d d'}Wn tCyYnwd(|vr^|dkr/|D|d'<n/ztE| |d'<Wn&ty]}z|j!t!jFkrOt)d)| |ft)d*WYd}~nd}~ww| d'|k|d+<|| |d,<||d-<|d,rt<|d-|d,ptrJ recv_chunkr\rr^writerr)r[flushrKeyErrorrarENOENT)r\rrurqrwrrXrWrSr,rCrfr7rhrr8r9rr:rirdrer>r this_chunkrnrprqrtrvr5r5r6rtLsF           "                        "     ,( z S3.recv_filer0)NNNrrF)F)Nrp)rrp)NNrpF)NNrp)Nrr)NNNNrpN)r)rp)Mrrrr"rtargetsrcodesrr]rrsrrrrrrrrrrrr rrrrrr/r3r-r4rrrxrrrrrrrrrerrrrrrrrrrrrrrrrrrrrrrrrr r rrrDrircrrtr5r5r5r6rs     4  !      W         6  +    %*  f  ~ rcCs.i}|dD] }|d\}}|||<q|S)Nr:)rI) attrs_headerr9attrrvalr5r5r6r(s  r(cCs@tt|}t|}t|}|ddkr|dd}t|S)Nr r)rrr digestr)rZm base64md5r5r5r6r"s    r")[ __future__rrrUr'rerr@rSr,xml.saxrsocketrr2rrrrr rYr r ImportError urllib.parsebase64r r rUhashlibr BaseUtilsrrrrrrUtilsrrrrrrrrrrr r!r"r# Exceptions MultiPartr%r&r'Cryptor(r)r*r+r,ctypesr-r=Magicr1r7 TypeErrorrT MAGIC_MIMEloadAttributeErrorr[rrH error_strr?r>rMrWra__all__rrOrappendr(r"r5r5r5r6s       (                 P >