HEX
Server: Apache
System: Linux zacp120.webway.host 4.18.0-553.50.1.lve.el8.x86_64 #1 SMP Thu Apr 17 19:10:24 UTC 2025 x86_64
User: govancoz (1003)
PHP: 8.3.26
Disabled: exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname
Upload Files
File: //lib/python3.6/site-packages/S3/__pycache__/S3.cpython-36.opt-1.pyc
3

��wel�� @sddlmZmZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZddlm
ZddlmZmZmZmZddlmZmZmZmZyddlmZWn ek
r�ddlmZYnXddlZdd	lmZmZm Z m!Z!m"Z"m#Z#m$Z$dd
l%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ddl,m,Z,ddl-m-Z-dd
l.m.Z.m/Z/ddl0m0Z0ddl1m1Z1ddl2Tddl3m4Z4ddl5m5Z5ddl6m6Z6ddl7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?y�ddl@mAZAddlBZByeBjCdd�ZDdd�ZEWn�eFk
�r4y eBjGeBjH�ZDeDjI�dd�ZEWn,eJk
�r.eBjCeBjHd�ZDdd�ZEYnXYn2eJk
�rdeBjGeBjH�ZDeDjI�dd�ZEYnXWn\eeKfk
�r�ZLz:eMeL�ZNdeNk�r�dZOnd eNZOeOd!7ZOd"aPd#d�ZEWYddZL[LXnXd$d%�ZQd&ZRd.ZSgZTGd(d)�d)eU�ZVGd*d+�d+eU�ZWeTjXd+�d,d-�ZYdS)/�)�absolute_import�divisionN)�saxutils)�timeout)�debug�info�warning�error)�ST_SIZE�ST_MODE�S_ISDIR�S_ISREG)�urlparse�)�getListFromXml�getTextFromXml�getRootTagName�decode_from_s3�encode_to_s3�md5�s3_quote)�convertHeaderTupleListToDict�	unicodise�deunicodise�check_bucket_name�check_bucket_name_dns_support�getHostnameFromBucket)�
SortedDict)�	AccessLog)�ACL�GranteeLogDelivery)�BidirMap)�Config)�*)�MultiPartUpload)�S3Uri)�ConnMan)�sign_request_v2�sign_request_v4�checksum_sha256_file�checksum_sha256_buffer�generate_content_md5�
hash_file_md5�calculateChecksum�format_param_str)�
ArgumentErrorT)ZmimecCs
tj|�S)N)�magic_Z	from_file)�file�r2�/usr/lib/python3.6/S3.py�mime_magic_file<sr4c
Cs4y
tj|�Stttfk
r.tjt|��SXdS)N)r0r1�UnicodeDecodeError�UnicodeEncodeErrorr/r)r1r2r2r3r4Is
)�flagscCs
tj|�S)N)r0Zid_filename)r1r2r2r3r4SscCstjt|��S)N)r0r1r)r1r2r2r3r4\s�magicz%Module python-magic is not available.z'Module python-magic can't be used (%s).z. Guessing MIME types based on file extensions.FcCststt�datj|�dS)NTr)�magic_warnedr�
magic_message�	mimetypes�
guess_type)r1r2r2r3r4gscCsjdd�}||�}|dk	rZt|t�rZd|krR|jd�\}}|td�d�}||f}n|df}|dkrfd}|S)NcSst|�}|S)N)r4)r1Z	magictyper2r2r3�_mime_magicpszmime_magic.<locals>._mime_magic�;�charset)NN)�
isinstance�str�split�len)r1r=�resultZmimetyper?r2r2r3�
mime_magicns

rE�ic@sFeZdZiZiZddd�Zdd�Zdd�Zdd	�Zd
d�Z	dd
�Z
dS)�	S3RequestNcCsn||_t|pidd�|_t|jjj�dkrF|jjj�|jjj|jd<||_||_|pXi|_	||_
|j�dS)NT)�ignore_caserzx-amz-security-token)�s3r�headersrC�configZaccess_tokenZrole_refresh�resource�
method_string�params�body�requester_pays)�selfrIrMrLrJrOrNr2r2r3�__init__�s
zS3Request.__init__cCs"|jjjr|jdkrd|jd<dS)N�GET�POST�PUT�HEADZ	requesterzx-amz-request-payer)rSrTrUrV)rIrKrPrMrJ)rQr2r2r3rP�szS3Request.requester_payscCs,d|jkr|jd=tjdtj��|jd<dS)N�datez%a, %d %b %Y %H:%M:%S +0000z
x-amz-date)rJ�timeZstrftimeZgmtime)rQr2r2r3�update_timestamp�s
zS3Request.update_timestampcCs&|jjrdS|jjjs|jjr"dSdS)NFT)rI�endpoint_requires_signature_v4rKZsignature_v2�fallback_to_signature_v2)rQr2r2r3�use_signature_v2�s
zS3Request.use_signature_v2cCs
|jjd�}|j�rVtd�|r4d||jdf}n
|jd}t|j||j|j�|_n�td�|jj	|jd�}|r�|t
jkr�t
jj|d�jd|�s�|t
jkr�t
t�j|�r�d||jdf}n
|jd}t
jj|jdt�j�}t|j|||j||j|j�|_dS)N�bucketzUsing signature v2z/%s%s�urizUsing signature v4�z%s.)rL�getr\rr'rMrNrJrI�get_hostnamerG�	redir_map�
startswithrr"�host_bucket�
region_map�bucket_locationr(rO)rQ�bucket_name�resource_uri�hostnameZ
bucket_regionr2r2r3�sign�s&



zS3Request.signcCsT|j�|j�t|j�}t|dddd�|d<|dt|j�7<|j||jfS)Nr^FT)�quote_backslashes�unicode_output)	rYrj�dictrLrr.rNrMrJ)rQrLr2r2r3�get_triplet�s
zS3Request.get_triplet)N)�__name__�
__module__�__qualname__rerbrRrPrYr\rjrnr2r2r2r3rG�s
	!rGc@s�eZdZeddddddd�Zedd	d
ddd
�ZedededBededBededBededBededBededBededBededBededBededBd�Zdddd�Zdd�Zdd �Z	d!d"�Z
d#d$�Zd�d&d'�Zd(d)�Z
d�d*d+�Zd�d,d-�Zd�d.d/�Zd�d0d1�Zd2d3�Zd�d5d6�Zd7d8�Zd9d:�Zd;d<�Zd=d>�Zd?d@�ZdAdB�Zd�dCdD�Zd�dEdF�Zd�dGdH�Zd�dIdJ�Zd�dKdL�ZdMdN�ZdOdP�Z dQdR�Z!d�dSdT�Z"dUdV�Z#d�dXdY�Z$d�dZd[�Z%d\d]�Z&d^d_�Z'd`da�Z(dbdc�Z)ddde�Z*d�dfdg�Z+d�dhdi�Z,d�djdk�Z-dldm�Z.dndo�Z/dpdq�Z0drds�Z1dtdu�Z2dvdw�Z3dxdy�Z4dzd{�Z5d|d}�Z6d~d�Z7d�d��Z8d�d��Z9d�d��Z:d�d��Z;d�d��Z<d�d��Z=d�d��Z>d�d��Z?d�d��Z@d�d��ZAd�d��ZBd�d��ZCd�d��ZDd�d�d��ZEd�d�d��ZFd�d�d��ZGd�d�d��ZHd�d�d��ZId�d��ZJd�d��ZKd�d��ZLd�d�d��ZMd�d�d��ZNd�d��ZOd�d��ZPd�d��ZQd�d��ZRd�d��ZSd�d�d��ZTd�d�d��ZUd�d�d��ZVd�d�d��ZWd�d�d��ZXd�d�dÄZYd%S)��S3rrF����)rSrUrV�DELETErT�MASK�iiii)�SERVICE�BUCKET�OBJECT�BATCHrxrrzrSr{rUrwr|rVrTr})Z	UNDEFINED�LIST_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)ZNoSuchBucket�AccessDeniedZBucketAlreadyExistscCs||_d|_d|_d|_dS)NF)rKr[rZ�expect_continue_not_supported)rQrKr2r2r3rR�szS3.__init__cCs(d}|jjdkr|jjS|jjr$d}|S)NZSTANDARDr_ZREDUCED_REDUNDANCY)rK�
storage_classZreduced_redundancy)rQ�clsr2r2r3r�szS3.storage_classcCs�|r|tjkrtj|}n(|r6t|jj|�r6t|�}n|jjj�}|jjrb|j	d�rx|dd�}n|j	d�rx|dd�}t
d||f�|S)Nz:443rsz:80�zget_hostname(%s): %s������)rGrbrrKrdr�	host_base�lower�	use_https�endswithr)rQr]�hostr2r2r3ra
s


zS3.get_hostnamecCs|j�tj|<dS)N)r�rGrb)rQr]�redir_hostnamer2r2r3�set_hostname"szS3.set_hostnameNcCs�|jd�}|rh|tjkr2tjj|d�jd|�sL|tjkrht|jj|�rhdt|ddd�|df}n|d}|r�d	||f}|jjdkr�|jj	r�d
|j
|�|f}td|�|S)Nr]r_z%s.z/%s%sFT)rkrlr^z%s%szhttp://%s%szformat_uri(): )r`rGrbrcrrKrdrZ
proxy_hostr�rar)rQrL�	base_pathrgr^r2r2r3�
format_uri%s 


z
S3.format_uricCs*|jd�}|j|�}t|dd�|d<|S)Nr~�dataZBucket�list)�create_request�send_requestr)rQ�request�responser2r2r3�list_all_buckets:s

zS3.list_all_bucketscCs^g}g}x4|j|||||�D]\}}	}
|j|
�|j|	�qWi}||d<||d<||d<|S)Nr�Zcommon_prefixes�	truncated)�bucket_list_streaming�extend)rQr]�prefix�	recursive�
uri_params�limitZ	item_list�prefixesr��dirsZobjectsr�r2r2r3�bucket_list@s
zS3.bucket_listc#sJdd�}dd�}dd�}�fdd�}	|r0|j�p2i}d	}
g}d
}d
}
|}x�|
�rD|j|||||��|�d�}|�d�}|t|�7}|
t|�7}
|||
kr�|||
}|�d�}
|
�r6|dks�||
|k�r(|r�|	�d|d
�|d<n*|�r|	�d|d�|d<nd||fVPtd|d�n|
||fVP|
||fVqJWdS)ze Generator that produces <dir_list>, <object_list> pairs of groups of content of a specified bucket. cSst|d�pd}|j�dkS)Nz.//IsTruncated�false)rr�)r�Zis_truncatedr2r2r3�_list_truncatedOsz1S3.bucket_list_streaming.<locals>._list_truncatedcSs
t|d�S)NZContents)r)r�r2r2r3�
_get_contentsTsz/S3.bucket_list_streaming.<locals>._get_contentscSs
t|d�S)NZCommonPrefixes)r)r�r2r2r3�_get_common_prefixesWsz6S3.bucket_list_streaming.<locals>._get_common_prefixescst�dd�p|d|S)Nr�Z
NextMarkerr���)r)r�Zcurrent_elts�key)r�r2r3�_get_next_markerZsz2S3.bucket_list_streaming.<locals>._get_next_markerTrr�r�KeyZmarkerZPrefixFzListing continues after '%s'Nr�)�copy�bucket_list_noparserCr)rQr]r�r�r�r�r�r�r�r�r�r��num_objectsZnum_prefixes�max_keysZcurrent_listZcurrent_prefixesr2)r�r3r�Ms@
zS3.bucket_list_streamingcCsr|dkri}|r||d<|jjr0|r0d|d<|d
krDt|�|d<|jjrTd|d<|jd||d	�}|j|�}|S)Nr��/Z	delimiterrzmax-keys�truezallow-unorderedr�)r]r�r�)rKr�rAZlist_allow_unorderedr�r�)rQr]r�r�r�r�r�r�r2r2r3r��s
zS3.bucket_list_noparsecCs�tdd�}|r|j|�d}|r�|j�j�dkr�|j�j�dkr�|j�}|j�dkr\|j�}d}||7}|d7}td	|�t|dd
�nt|dd
�|jjr�d|d
<d|d<|j	d|||d�}|j
|�}|S)NT)rHr_�USz	us-east-1�EUz/<CreateBucketConfiguration><LocationConstraint>z1</LocationConstraint></CreateBucketConfiguration>zbucket_location: )Z
dns_strictFzpublic-readz	x-amz-aclZObjectWriterzx-amz-object-ownershipr)r]rJrO)r�update�strip�upperr�rrrK�
acl_publicr�r�)rQr]rf�
extra_headersrJrOr�r�r2r2r3�
bucket_create�s(

$
zS3.bucket_createcCs|jd|d�}|j|�}|S)Nr�)r])r�r�)rQr]r�r�r2r2r3�
bucket_delete�s
zS3.bucket_deleteFc	Cs�|j�}|jd|j�ddid�}tjj|d�}tjj|d�}z4|rd|oH|rd|jjtj|<dtj|<|j|�}Wd||kr�|tj|<n|tjkr�tj|=||kr�|tj|<n|tjkr�tj|=Xt	|dd�}|s�|dkr�d}n|d	kr�d
}|S)Nr��location)r]r�r_z	us-east-1r�ZLocationConstraintr�r�z	eu-west-1)r_r�)
r]r�rGrbr`rerKr�r�r)	rQr^�force_us_defaultr]r�Zsaved_redir_mapZsaved_region_mapr�r�r2r2r3�get_bucket_location�s0



zS3.get_bucket_locationcCsF|jd|j�ddid�}|j|�}|jdd�}|r>t|d�}nd}|S)Nr��requestPayment)r]r�r�r_ZPayer)r�r]r�r`r)rQr^r�r��	resp_dataZpayerr2r2r3�get_bucket_requester_pays�s
zS3.get_bucket_requester_payscCsTtdd�}d}||}td|�t|�|d<|jd|||ddid�}|j|�}|S)	NT)rHz�<OwnershipControls xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Rule><ObjectOwnership>%s</ObjectOwnership></Rule></OwnershipControls>zset_bucket_ownership(%s)zcontent-md5r�ownershipControls)r^rJrOr�)rrr+r�r�)rQr^�	ownershiprJrOr�r�r2r2r3�set_bucket_ownership�s

zS3.set_bucket_ownershipcCsF|jd|j�ddid�}|j|�}|jdd�}|r>t|d�}nd}|S)Nr�r�)r]r�r�r_z.//Rule//ObjectOwnership)r�r]r�r`r)rQr^r�r�r�r�r2r2r3�get_bucket_ownership�s
zS3.get_bucket_ownershipc	Cs�tdd�}d}x2dD]*}|j|d�r(d	p*d
}|d|||f7}qW|d7}td
|�t|�|d<|jd|||ddid�}|j|�}|S)NT)rHzP<PublicAccessBlockConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">�BlockPublicAcls�IgnorePublicAcls�BlockPublicPolicy�RestrictPublicBucketsFr�r�z<%s>%s</%s>z!</PublicAccessBlockConfiguration>z"set_bucket_public_access_block(%s)zcontent-md5r�publicAccessBlock)r^rJrOr�)r�r�r�r�)rr`rr+r�r�)	rQr^r7rJrO�tag�valr�r�r2r2r3�set_bucket_public_access_block�s


z!S3.set_bucket_public_access_blockcCsr|jd|j�ddid�}|j|�}|jdd�}|rjt|d�dkt|d�dkt|d	�dkt|d
�dkd�}ni}|S)Nr�r�)r]r�r�r_r�r�r�r�r�)r�r�r�r�)r�r]r�r`r)rQr^r�r�r�r7r2r2r3�get_bucket_public_access_blocks
z!S3.get_bucket_public_access_blockcCs�i}|j|�|d<xdd|jfd|jfd|jffD]D\}}y||�||<Wq0tk
rr}zd||<WYdd}~Xq0Xq0Wy|j|�|d<Wn*tk
r�}zi|d<WYdd}~XnX|S)Nzbucket-locationzrequester-pays�
versioningr�zpublic-access-block)r�r��get_versioningr��S3Errorr�)rQr^r�r��func�er2r2r3�bucket_infos
zS3.bucket_infocCs�|j�}|jd|ddid�}yR|j|�}t|dd�|d<t|dd�|d<|jj|j�|j|�d	�|d
<|Stk
r�}z|jdkr�t	d�dS�WYdd}~XnXdS)
Nr��website)r]r�r�z.//IndexDocument//SuffixZindex_documentz.//ErrorDocument//KeyZerror_document)r]r��website_endpointi�zICould not get /?website - website probably not configured for this bucket)
r]r�r�rrKr�r�r��statusr)rQr^rfr]r�r�r�r2r2r3�website_info/s 

zS3.website_infocCs�|j�}d}|d7}|d|jj7}|d7}|jjrT|d7}|d|jj7}|d7}|d7}|jd	||d
did�}|j|�}td|�|S)
NzF<WebsiteConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">z  <IndexDocument>z    <Suffix>%s</Suffix>z  </IndexDocument>z  <ErrorDocument>z    <Key>%s</Key>z  </ErrorDocument>z</WebsiteConfiguration>rr�)r]rOr�zReceived response '%s')r]rKZ
website_indexZ
website_errorr�r�r)rQr^rfr]rOr�r�r2r2r3�website_createBs

zS3.website_createcCsN|j�}|jd|ddid�}|j|�}td|�|ddkrJtd|��|S)Nr�r�)r]r�zReceived response '%s'r���zExpected status 204: %s)r]r�r�r�S3ResponseError)rQr^rfr]r�r�r2r2r3�website_deleteUs
zS3.website_deletecCs�|j�}|jd|ddid�}y|j|�}WnPtk
rz}z4|jdkrRtd�dS|jdkrhtd�dS�WYdd}~XnXt|d�}|d	kr�td
|�dSt|dd�|d<t|dd
�|d<t|dd�|d<|S)Nr��	lifecycle)r]r�i�zMCould not get /?lifecycle - lifecycle probably not configured for this bucketi�zKCould not get /?lifecycle - lifecycle support not implemented by the serverr�ZLifecycleConfigurationz7Could not get /?lifecycle - unexpected xml response: %sz.//Rule//Prefixr�z.//Rule//Expiration//DaterWz.//Rule//Expiration//DaysZdays)r]r�r�r�r�rrr)rQr^rfr]r�r�r�Z
root_tag_namer2r2r3�expiration_infobs2




zS3.expiration_infocCs�|jjr|jjrtd��|jjp&|jjs^|jjr8td��td�|j�}|jd|ddid�}n
|j|�}|j	|�}td|�|S)Nz+Expect either --expiry-day or --expiry-datezdel bucket lifecycler�r�)r]r�zReceived response '%s')
rK�expiry_date�expiry_days�ParameterError�
expiry_prefixrr]r��_expiration_setr�)rQr^rfr]r�r�r2r2r3�expiration_set�s

zS3.expiration_setcCs�td�d}|d7}|d7}|d|jj7}|d7}|d7}|d7}|jjr^|d	|jj7}n|jjrv|d
|jj7}|d7}|d7}|d
7}tdd�}t|�|d<|j�}|jd|||ddid�}|S)Nzput bucket lifecyclez<LifecycleConfiguration>z  <Rule>z    <Filter>z      <Prefix>%s</Prefix>z
    </Filter>z    <Status>Enabled</Status>z    <Expiration>z      <Date>%s</Date>z      <Days>%s</Days>z    </Expiration>z	  </Rule>z</LifecycleConfiguration>T)rHzcontent-md5rr�)r]rJrOr�)	rrKr�r�r�rr+r]r�)rQr^rOrJr]r�r2r2r3r��s,
zS3._expiration_setcCs�|jj}d}|dkr&|jjr&td��|jjrn|jjrJttjjt	|���}|jj
r`t|�\}}ntj
|�\}}|sz|jj}||fS)N�-zRYou must specify --mime-type or --default-mime-type for files uploaded from stdin.)rK�default_mime_typer�Zguess_mime_type�follow_symlinksr�os�path�realpathrZuse_mime_magicrEr;r<)rQ�filename�content_type�content_charsetr2r2r3�_guess_content_type�szS3._guess_content_typecCs,|jj}|s|jj}|d|jjj�7}|S)Nz
; charset=)rK�	mime_typer��encodingr�)rQr�r2r2r3�stdin_content_type�s
zS3.stdin_content_typecCsl|jj}d}|dkr|j�S|r&d}n|s8|j|�\}}|sH|jjj�}|j||�rh|dk	rh|d|}|S)Nr�zapplication/x-directoryz
; charset=)rKr�r�r�r�r��add_encoding)rQr��is_dirr�r�r2r2r3r��szS3.content_typecCsbd|krdS|jjjd�}|ddkr*dS|jdd�}t|�dkrFdS|d}||krZd	SdSdS)
Nzcharset=F�,rr_�.rFrT)rKZadd_encoding_extsrB�rsplitrC)rQr�r�Zexts�partsZextr2r2r3r��szS3.add_encodingr_cCs�|jdkrtd|j��y�d}d}|dkrLd}tjtjj�ddd�}d	|_ndd}t|�}	t	j
|	�}
|
t}t|�r�d}tj
d
�}n(t|�s�td��ntj|	dd�}|
t}||_Wn4ttfk
r�}ztd
|j��WYdd}~XnXtdd�}
|�r|
j|�|jj�rd|
d<|jj�r2d|
d<|jj|
d<|j||d�|
d<|jj�rVd|
d<|j�|
d<d}|jj�r�|�r�td��|jj�r�||jjtk�s�|�r�d}||jj |jjtk�r�td|jj|jj f��|�r�|j!||
|||�S|jj"�r�y|j#|�}Wnt$k
�r"d}YnX|dk	�r�t%|dd�}|ddj&d�}||k�r�t'd|d||jj(�}||k�r�t)d|�dSt)d |||f�nt)d!|||f�t*|�|
d<|j+d"||
d#�}||j,�|d$�}|j-|||�}|S)%NrIz Expected URI type 's3', got '%s'Frr�T�rb)�mode�closefdz<stdin>�zNot a regular file)r�z%s)rH�AES256zx-amz-server-side-encryptionzaws:kmsz+x-amz-server-side-encryption-aws-kms-key-id)r�r�zcontent-typezpublic-readz	x-amz-aclzx-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-mbrJzcontent-length�etagz"'r_z,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.r�)r^rJ)�source�destination�extra).�type�
ValueError�io�open�sys�stdin�fileno�stream_namerr��statrr�BytesIOr
�InvalidFileErrorr
�IOError�OSError�strerrorrr�rK�server_side_encryption�kms_keyr�r�r��enable_multipartr�Zmultipart_chunk_size_mb�SIZE_1MBZmultipart_max_chunks�send_file_multipartZput_continue�object_info�	Exception�intr�r-�
send_chunkrrAr�r^�	send_file)rQr�r^r��extra_labelr��sizeZ	is_streamZ
src_streamZfilename_bytesr
r�r�rJ�	multipartrZremote_sizeZremote_checksumZchecksumr��labelsr�r2r2r3�
object_put�s�



 










z
S3.object_putc	CsJ|jdkrtd|j��|jd|d�}|j�||d�}|j||||�}|S)NrIz Expected URI type 's3', got '%s'r�)r^)rrr)rrr�r^�	recv_file)	rQr^�streamZ	dest_name�start_positionrr�r r�r2r2r3�
object_getOs
z
S3.object_getcs�fdd��D�}|j|�S)z" Batch delete given a remote_list csg|]}�|d�qS)Zobject_uri_strr2)�.0�item)�remote_listr2r3�
<listcomp>Ysz*S3.object_batch_delete.<locals>.<listcomp>)�object_batch_delete_uri_strs)rQr(�urisr2)r(r3�object_batch_deleteWszS3.object_batch_deletec	Csvdd�}|}t|�dkr td��t|d�j�}|||�}tt|�dd�dd�}|jd	|||d
did�}|j|�}|S)
z* Batch delete given a list of object uris cSs�d}xn|D]f}t|�}|jdkr.td|j��|j�sBtd|��|j�|krVtd��tj|j��}|d|7}q
W|d7}t|�}|S)Nz.<?xml version="1.0" encoding="UTF-8"?><Delete>rIz Expected URI type 's3', got '%s'zURI '%s' has no objectz2The batch should contain keys from the same bucketz<Object><Key>%s</Key></Object>z	</Delete>)	r%rr�
has_objectr]r�escape�objectr)r]Zkey_listrOr�r^r/r2r2r3�compose_batch_del_xml^s

z>S3.object_batch_delete_uri_strs.<locals>.compose_batch_del_xmlrzKey list is emptyzapplication/xml)zcontent-md5zcontent-typeT)rHr��deleteN)r]rJrOr�)rCrr%r]rr+r�r�)	rQr+r0Zbatchr]Zrequest_bodyrJr�r�r2r2r3r*\s

zS3.object_batch_delete_uri_strscCs4|jdkrtd|j��|jd|d�}|j|�}|S)NrIz Expected URI type 's3', got '%s'r�)r^)rrr�r�)rQr^r�r�r2r2r3�
object_delete{s


zS3.object_deletecCs�|jdkrtd|j��|jjdkr,td��|jjdkr@td��d	}|d
|jj7}|d7}|d|jj7}|d
7}|d7}|jd||ddid�}|j|�}td|�|S)NrIz Expected URI type 's3', got '%s'rz*You must restore a file for 1 or more days�Standard�	Expedited�Bulkz7Valid restoration priorities: bulk, standard, expeditedz@<RestoreRequest xmlns="http://s3.amazonaws.com/doc/2006-03-01/">z  <Days>%s</Days>z  <GlacierJobParameters>z    <Tier>%s</Tier>z  </GlacierJobParameters>z</RestoreRequest>r�Zrestore)r^rOr�zReceived response '%s')r3r4r5)	rrrKZrestore_daysr�Zrestore_priorityr�r�r)rQr^rOr�r�r2r2r3�object_restore�s"


zS3.object_restorecCsPddddddddd	d
ddd
dg}x*||jjD]}|j�|kr.||j�=q.W|S)NrWzcontent-lengthz
last-modifiedzcontent-md5zx-amz-version-idzx-amz-delete-markerz
accept-rangesZ
connectionrZserverz
x-amz-id-2zx-amz-request-idzcf-rayzx-amz-storage-class)rKZremove_headersr�)rQrJZ	to_remove�hr2r2r3�_sanitize_headers�s$zS3._sanitize_headerscCs�|jdkrtd|j��|jdkr0td|j��|jjdkr�y|j|�}Wn4tk
r~}z|jdkrj|�d}WYdd}~XnXd}	d}
|s�|jjr�d}|r�|j|�}|d}
t	|
d�}|jj
�rJ|
}|dkr�|j|�}|d}t	|d�}||k�rtjt
}
n|jjt
}
||
k�rJ|dk�rB|j|�}|d}t	|d�}|}
d}	|
�rh|j|
�t|
dd	�}
n
tdd	�}
|jj�r�d
|
d<|j�|
d<|jj�r�d
|
d<|jj�r�d|
d<|jj|
d<|�r�|
j|�|jj�r�|jj|
d<|�s�d|
d<nd|
d<|	�r|j||||
|�}n<td|j�|j�fddd�|
d<|jd||
d�}|j|�}|d�r�t|d�dk�r�d|d<td�t|��|jjdk�r�|�r�y|j||�Wn4tk
�r�}z|jdk�r�|�WYdd}~XnX|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.
        rIz Expected URI type 's3', got '%s'Ni�FTrJzcontent-length)rHzpublic-readz	x-amz-aclzx-amz-storage-classrzx-amz-server-side-encryptionzaws:kmsz+x-amz-server-side-encryption-aws-kms-key-idzcontent-typeZCOPYzx-amz-metadata-directiveZREPLACEz/%s/%s)rkrlzx-amz-copy-sourcer�)r^rJr��Errori�r�zHServer error during the COPY operation. Overwrite response status to 500)rrrKr��get_aclr�r�r�rrrr$ZMAX_CHUNK_SIZE_MBrZmultipart_copy_chunk_size_mbr8rr�rrr��copy_file_multipartrr]r/r�r�rr	�set_acl)rQ�src_uri�dst_urir��src_sizer�replace_meta�acl�excrrJZsrc_infoZsrc_headersZ	thresholdr�r�r2r2r3�object_copy�s�




















zS3.object_copycCs|j|||||dd�S)NT)r@)rC)rQr=r>r�r?rr2r2r3�
object_modifyHszS3.object_modifycCs`|j|||||�}td||f�|ds<t|d�dkrR|j|�td|�n
td|�|S)NzObject %s copied to %sr��CopyObjectResult�CompleteMultipartUploadResultzObject '%s' deletedzGObject '%s' NOT deleted because of an unexpected response data content.)rErF)rCrrr2r)rQr=r>r�r?rZ
response_copyr2r2r3�object_moveNs



zS3.object_movecCsl|jd|d�}y|j|�}WnJtk
rf}z.|jdkrR|jrRd|_d|_||_|�WYdd}~XnX|S)Nr�)r^i�Z	NoSuchKeyz!The specified key does not exist.)r�r�r�r��code�messagerL)rQr^r�r�rBr2r2r3r]szS3.object_infocCsP|j�r|jd|ddid�}n|jd|j�ddid�}|j|�}t|d�}|S)Nr�rA)r^r�r�)r]r�r�)r-r�r]r�r)rQr^r�r�rAr2r2r3r:ls
z
S3.get_aclcCstd|}td||f�tddidd�}|j�rJ|jd|||ddid	�}n|jd
|j�||ddid�}|j|�}|S)Nz%szset_acl(%s): acl-xml: %szcontent-typezapplication/xmlT)rHr�rA)r^rJrOr�r)r]rJrOr�)rrr-r�r]r�)rQr^rArOrJr�r�r2r2r3r<xs
z
S3.set_aclcCsptdd�}|dkrdnd}d}|d|7}|d7}td|�t|�|d	<|jd
|||ddid�}|j|�}|S)
NT)rHZEnabledZ	SuspendedzI<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">z<Status>%s</Status>z</VersioningConfiguration>zset_versioning(%s)zcontent-md5rr�)r^rJrOr�)rrr+r�r�)rQr^ZenabledrJr�rOr�r�r2r2r3�set_versioning�s

zS3.set_versioningcCs,|jd|ddid�}|j|�}t|dd�S)Nr�r�)r^r�r�ZStatus)r�r�r)rQr^r�r�r2r2r3r��s
zS3.get_versioningcCs.|jd|j�ddid�}|j|�}t|d�S)Nr��policy)r]r�r�)r�r]r�r)rQr^r�r�r2r2r3�
get_policy�s
z
S3.get_policycCs\d}|d|7}|d7}tdd�}d|d<t|�|d<|jd	|||d
did�}|j|�}|S)Nz;<LegalHold xmlns="http://s3.amazonaws.com/doc/2006-03-01/">z<Status>%s</Status>z</LegalHold>T)rHzapplication/xmlzcontent-typezcontent-md5r�z
legal-hold)r^rJrOr�)rr+r�r�)rQr^Zlegal_hold_statusrOrJr�r�r2r2r3�set_object_legal_hold�s

zS3.set_object_legal_holdcCshd}|d|7}|d|7}|d7}tdd�}d|d<t|�|d	<|jd
|||ddid�}|j|�}|S)
Nz;<Retention xmlns="http://s3.amazonaws.com/doc/2006-03-01/">z<Mode>%s</Mode>z%<RetainUntilDate>%s</RetainUntilDate>z</Retention>T)rHzapplication/xmlzcontent-typezcontent-md5r�Z	retention)r^rJrOr�)rr+r�r�)rQr^r�Zretain_until_daterOrJr�r�r2r2r3�set_object_retention�s

zS3.set_object_retentioncCs8tdd�}d|d<|jd|||ddid�}|j|�}|S)NT)rHzapplication/jsonzcontent-typerrK)r^rJrOr�)rr�r�)rQr^rKrJr�r�r2r2r3�
set_policy�s

z
S3.set_policycCs.|jd|ddid�}td|�|j|�}|S)Nr�rK)r^r�zdelete_policy(%s))r�rr�)rQr^r�r�r2r2r3�
delete_policy�s

zS3.delete_policycCs.|jd|j�ddid�}|j|�}t|d�S)Nr��cors)r]r�r�)r�r]r�r)rQr^r�r�r2r2r3�get_cors�s
zS3.get_corscCsDtdd�}d|d<t|�|d<|jd|||ddid�}|j|�}|S)	NT)rHzapplication/xmlzcontent-typezcontent-md5rrQ)r^rJrOr�)rr+r�r�)rQr^rQrJr�r�r2r2r3�set_cors�s

zS3.set_corscCs.|jd|ddid�}td|�|j|�}|S)Nr�rQ)r^r�zdelete_cors(%s))r�rr�)rQr^r�r�r2r2r3�delete_cors�s

zS3.delete_corscCsLtdd�}t|�|d<|jd|||ddid�}td||f�|j|�}|S)NT)rHzcontent-md5rr�)r^rJrOr�z(set_lifecycle_policy(%s): policy-xml: %s)rr+r�rr�)rQr^rKrJr�r�r2r2r3�set_lifecycle_policy�s

zS3.set_lifecycle_policycCs\tdd�}d|d<d}|jjr(|d7}n|d7}|d7}|jd	||d
did�}|j|�}|S)NT)rHzapplication/xmlzcontent-typezN<RequestPaymentConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
z<Payer>Requester</Payer>
z<Payer>BucketOwner</Payer>
z</RequestPaymentConfiguration>
rr�)r^rOr�)rrKrPr�r�)rQr^rJrOr�r�r2r2r3�	set_payer�s



zS3.set_payercCsB|jd|j�ddid�}td|�|j|�}td|d�|S)Nr�r�)r]r�zget_lifecycle_policy(%s)z%s: Got Lifecycle Policyr�)r�r]rr�)rQr^r�r�r2r2r3�get_lifecycle_policys
zS3.get_lifecycle_policycCs.|jd|ddid�}td|�|j|�}|S)Nr�r�)r^r�zdelete_lifecycle_policy(%s))r�rr�)rQr^r�r�r2r2r3�delete_lifecycle_policy	s

zS3.delete_lifecycle_policycCsPtdd�}|jjrd|d<|jd|||ddid�}td||f�|j|�}|S)	NT)rH�Truez!x-amz-skip-destination-validationr�notification)r^rJrOr�z+set_notification_policy(%s): policy-xml: %s)rrKZskip_destination_validationr�rr�)rQr^rKrJr�r�r2r2r3�set_notification_policys

zS3.set_notification_policycCsB|jd|j�ddid�}td|�|j|�}td|d�|S)Nr�rZ)r]r�zget_notification_policy(%s)z%s: Got notification Policyr�)r�r]rr�)rQr^r�r�r2r2r3�get_notification_policys
zS3.get_notification_policycCsd}|j||�S)Nz7<NotificationConfiguration></NotificationConfiguration>)r[)rQr^Zempty_configr2r2r3�delete_notification_policy$szS3.delete_notification_policyc	Cs�|jdkrtd|j��d}|d7}x8|D]0\}}|d7}|d|7}|d|7}|d7}q*W|d	7}|d
7}tdd�}t|�|d
<|j�r�|jd|||ddid�}n|jd|j�||ddid�}td||f�|j|�}|S)NrIz Expected URI type 's3', got '%s'z9<Tagging xmlns="http://s3.amazonaws.com/doc/2006-03-01/">z<TagSet>z<Tag>z    <Key>%s</Key>z    <Value>%s</Value>z</Tag>z	</TagSet>z
</Tagging>T)rHzcontent-md5r��tagging)r^rJrOr�r)r]rJrOr�zset_tagging(%s): tagset-xml: %s)	rrrr+r-r�r]rr�)	rQr^�tagsetsrOr�r�rJr�r�r2r2r3�set_tagging(s.


zS3.set_taggingcCsr|j�r|jd|ddid�}n|jd|j�ddid�}td|�|j|�}|d}t|d�}td	|d
�|S)Nr�r^)r^r�r�)r]r�zget_tagging(%s)r�ZTagz%s: Got object taggingr�)r-r�r]rr�r)rQr^r�r��xml_datar_r2r2r3�get_taggingBs

zS3.get_taggingcCsP|j�r|jd|ddid�}n|jd|j�ddid�}td|�|j|�}|S)Nr�r^)r^r�r�)r]r�zdelete_tagging(%s))r-r�r]rr�)rQr^r�r�r2r2r3�delete_taggingQs
zS3.delete_taggingcCs.g}x$|j|||�D]\}}|j|�qW|S)N)�get_multipart_streamingr�)rQr^r�r��upload_listr��uploadsr2r2r3�
get_multipart\szS3.get_multipartccs<|r|j�pi}|j�}d}d}|}d|d<�x|�r6|j|d||d�}|d}	t|	d�}
|t|
�7}||krv||}t|	d�}|s�|j�dkr�d	}|�r*|dks�||k�r|
�rt|	d�}|s�|
dd}||d
<t|	d�}
|
r�|
|d<nd|k�r|d=nd	|
fVPtd|d
�n||
fVP||
fVq0WdS)NTrrf)r�r�r�r�ZUploadz.//IsTruncatedr�FrZ
NextKeyMarkerr�Z	KeyMarkerZNextUploadIdMarkerZUploadIdMarkerzListing continues after '%s'r�r�)r�r]r�rrCrr�r)rQr^r�r�r]r�r�r�r�rare�
xml_truncatedZnext_keyZupload_id_markerr2r2r3rdesL







zS3.get_multipart_streamingcCs0g}x&|j||||�D]\}}|j|�qW|S)N)�list_multipart_streamingr�)rQr^�	upload_idr�r��	part_listr�r�r2r2r3�list_multipart�szS3.list_multipartc
cs�|r|j�pi}d}d}|}x�|r�|j||||�}|d}	t|	d�}
|t|
�7}||kr`||}t|	d�}|s||j�dkr�d}|r�|d
ks�||kr�|
r�t|	d	�}|s�|
dd
}||d<nd|
fVPtd|d�n||
fVP||
fVqWdS)NTrr�ZPartz.//IsTruncatedr�FrZNextPartNumberMarkerZ
PartNumberzpart-number-markerz!Listing continues after Part '%s'r�r�)r��list_multipart_noparserrCrr�r)
rQr^rjr�r�r�r��	max_partsr�rarkrhZnext_part_numberr2r2r3ri�s<




zS3.list_multipart_streamingcCsF|dkri}|dkr t|�|d<||d<|jd||d�}|j|�}|S)Nrz	max-parts�uploadIdr�)r^r�r�)rAr�r�)rQr^rjr�rnr�r�r2r2r3rm�s
zS3.list_multipart_noparsecCs"|jd|d|id�}|j|�}|S)Nr�ro)r^r�)r�r�)rQr^�idr�r�r2r2r3�abort_multipart�s
zS3.abort_multipartcCs2|jd|j�ddid�}|j|�}t|d�}|S)Nr��logging)r]r�r�)r�r]r�r)rQr^r�r��	accesslogr2r2r3�
get_accesslog�s

zS3.get_accesslogcCs^|j|�}td|j�|f�|jtd��|jtd��td|j�|f�|j||�dS)NzCurrent ACL(%s): %sZREAD_ACPZWRITEzUpdated ACL(%s): %s)r:rr^Z
appendGranteer r<)rQr^rAr2r2r3�set_accesslog_acl�s
zS3.set_accesslog_aclc
Cs�t�}|r |j|�|j|�n|j�d|}td||f�|jd|j�|ddid�}y|j|�}Wn\tk
r�}	z@|	j	ddkr�t	d�|j
td	|j���|j|�}n�WYdd}	~	XnX||fS)
Nz%sz$set_accesslog(%s): accesslog-xml: %srrr)r]rOr��CodeZInvalidTargetBucketForLoggingz.Setting up log-delivery ACL for target bucket.zs3://%s)rZ
enableLoggingZsetAclPublicZdisableLoggingrr�r]r�r�rrur%)
rQr^�enableZlog_target_prefix_urir�rsrOr�r�r�r2r2r3�
set_accesslog�s$
zS3.set_accesslogcCs�ddd�}|r|s|rtd��|r>|j�}|j�r:|j�p<d}|rZ||d<|rZd||d<tjjtj|tjd@�}	t||	||||�}
t	d|d�|
S)Nr�)r]r^z>Both 'uri' and either 'bucket' or 'object' parameters suppliedr]r^rxzCreateRequest: resource[uri]=%s)
rr]r-r/rr�http_methodsZgetkey�
operationsrGr)rQZ	operationr^r]r/rJrOr�rLrMr�r2r2r3r�	s
zS3.create_requestcCs|jj|ddS)Nrr�)rK�max_retries)rQ�retriesr2r2r3�
_fail_waitsz
S3._fail_waitc
Os0|djd�}d|krzt|d�dkrzt|dd�}t|dd�}|j||�td|�|rp|tj|<td|�|||�S|jd	k�r$|djd
�}	|	�r|	jd�r�|	dd�}	n|	jd
�r�|	dd�}	t	d
|	�j
}	|jd}|j||	�td|	�|�r|tj|<td|�|||�Std|�t
|��dS)NrJzx-amz-bucket-regionr�rz	.//Bucketz.//EndpointzRedirected to: %szRedirected to region: %srVr�zhttp://�zhttps://rtr]z�Redirection error: No info provided by the server to where should be forwarded the request (HEAD request). (Hint target region: %s))r`rCrr�rrGrerMrcrrirLrr�)
rQr�r��fn�args�kwargsZredir_regionZredir_bucketr�Zlocation_urlr2r2r3�_http_redirection_handler#s6











zS3._http_redirection_handlerc	Osd|kr�t|d�dkr�t|dd�}|dkrrt|dd�}|dk	rh|tj|jd<td|�|||�Std	�nj|d
kr�t|dd�}|dkr�td
�d|_|||�Sn2|dkr�|j	�r�|j
r�td�d|_
|||�Sn,|j	�o�|j
�r
td�d|_
|||�SdS)zR
        Returns None if no handler available for the specific error code
        r�rrvZAuthorizationHeaderMalformedZRegionNr]zForwarding request to %szVCould not determine bucket the location. Please consider using the --region parameter.ZInvalidRequest�Messagez\The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.zEndpoint requires signature v4TZInvalidArgumentzFalling back to signature v2)rCrrGrerLrrrrZr\r[)	rQr�r�rr�r��failureCode�regionrIr2r2r3�_http_400_handlerHs2



zS3._http_400_handlercOszd|krnt|d�dkrnt|dd�}|dkrnt|dd�}|dkrn|j�rn|jrntd�d|_|||�St|��dS)	Nr�rrvr�r�z=AWS authentication requires a valid Date or x-amz-date headerzFalling back to signature v2T)rCrr\r[rr�)rQr�r�rr�r�r�rIr2r2r3�_http_403_handlerrs
zS3._http_403_handlercCs�|jjd�r�|j�r�tjj|jdt�j�dkr�td�yFtd|jd�}|j	|dd�}|dk	rt|tj|jd<td|�Wn4t
k
r�}ztd	|�td
�WYdd}~XnXdS)a?Get and update region for the request if needed.

        Signature v4 needs the region of the bucket or the request will fail
        with the indication of the correct region.
        We are trying to avoid this failure by pre-emptively getting the
        correct region to use, if not provided by the user.
        r]r�z====== SEND Inner request to determine the bucket region =====zs3://T)r�NzE===== SUCCESS Inner request to determine the bucket region (%r) =====z,getlocation inner request failure reason: %sz?===== FAILED Inner request to determine the bucket region =====)rLr`r\rGrer"rfrr%r�r)rQr�Zs3_urir�rBr2r2r3�update_region_inner_request�s

zS3.update_region_inner_requestcCs�|dkr|jj}|j|�t|j�|_|j}|j�\}}}i}td�d}y�tj	|j
|d��}|j||j�}td|||t
|jp�d�f�|jj|||j|�|jj�}	|	j|d<|	j|d<t|	j��|d<|	j�|d<d	|dkr�t|dd	�}
|
|d
<tj|�W�n2ttfk
�r*�Y�nttfk
�r }z�tdtj|��t|d��r~|j�r~|jtj tj!tj"fk�s�d
t#|�k�s�dt#|�k�r�t$|t%��r��tj&|�|�rt'd|d|f�t'd|j(|��t)j*|j(|��|j+||d�St,d|d��WYdd}~Xn tdtj|���YnXtdtj|��|dd#k�rr|j-|||j+|�S|ddk�r|j.|||j+|�}|�r�|St/|�}
|�r�|
j0d$k�r�t'd|d|
f�t'd|j(|��t)j*|j(|��|j+||d�S|
�|ddk�r |j1|||j+|�S|ddk�r6t/|��|ddk�sR|ddk�r�t/|�}|ddk�rld }|�r�t'd|d|f�t'd|j(|��t)j*|j(|��|j+||d�S|�|dd!k�s�|dd"k�r�t/|��|S)%Nz"Processing request, please wait...r]zESending request method_string=%r, uri=%r, headers=%r, body=(%i bytes)r_r��reasonrJr�zx-amz-meta-s3cmd-attrszs3cmd-attrsz
Response:
�errnoz[Errno 104]z
[Errno 32]z Retrying failed request: %s (%s)r^zWaiting %d sec...rzRequest failed for: %s�-�3i��	BadDigest�OperationAborted�TokenRefreshRequired�RequestTimeouti�i�i�i�i�r��i+)r�r�)r�r�r�r�)2rKr{r�rrOrJrnrr&r`rar�r�rC�cr��getresponser�r�r�
getheaders�read�parse_attrs_header�putZ
S3SSLErrorZS3SSLCertificateErrorrr�pprint�pformat�hasattrr��EPIPE�
ECONNRESET�	ETIMEDOUTrAr@�SocketTimeoutException�closerr}rX�sleepr�ZS3RequestErrorr�r�r�rHr�)rQr�r|rJrMrLr��connr^�
http_response�attrsr��
handler_fn�errr2r2r3r��s�




 
zS3.send_requestcCs�|jjstd�|j|�Sd|kr*d|d<|jj||�}y|j|�}Wn.tk
rt}z|jd��WYdd}~XnX|j|d�|jd�|S)zrWrapper around send_request for slow requests.

        To be able to show progression for small requests
        z$Sending slow request, please wait...�actionr��failedN)�current_position�done)rK�progress_meterrr��progress_classrr�r�)rQr�r Zoperation_size�progressr�rBr2r2r3�send_request_with_progresss


zS3.send_request_with_progressc
).CsN	|dkr|jj}|j|�|	dkr*|jj}	|jr8|	r8d}	|j}
t|
d�}}|j}
|jjrtd|d<|jj	||�}nt
d|
�tj�}|r�t|||�}nt
|||�}||_|	r�|s�d}	nd|
d<|j�\}}}
yhtj|j|d��}|jj||j||j��x,|
j�D] }|jjt|�t|
|���qW|jj�Wn�tk
�r^}z�WYdd}~Xn�tk
�r�}z�|jj�r�|jd	�|�r�td
|d|f�td|j|��tj |j|��|j!||||||d
||�St"d|d��WYdd}~XnX|dk�r|j#|�t$�}�y�d}|	�rxt%j%|jj&gggt'�\}}}|�rT|jj(�}n$|�rx|�rxtdt'�d|_d}	|	�s�|�r�|j)tj*k�r�|�r�|j+�tj,|j_-x�|dk�r�t.|jj/|�}|dk�r�|j+|�}n|}|�s�t0d��|jj1dk�rtj�}|j2|�|jj3|�|jj�r4|j2t4|�d�|t4|�8}|}|jj1dk�r|tj�|}t5|�|jj1} t6| ||�}|�r�tj t.||jj7���q�W|j8�}!|jj(�}i}"|j)|"d<|j9|"d<t:|j;��|"d<|j+�|"d<||"d<tj<|�t=dt>j?|"��W�n�tk
�r2}z�WYdd}~X�n�t0k
�rl}z|jj�rX|jd	��WYdd}~X�n�tk
�r�}�zd|jj�r�|jd	�|�r�d}#t@|d��r�|jA�r�|jAtAjBtAjCtAjDfk�s�dtE|�k�s�dtE|�k�rbtF|tG��rbyN|jj(�}i}"|j)|"d<|j9|"d<t:|j;��|"d<|j+�|"d<||"d<d}#Wntk
�r`tHd�YnX|#�s�td|d|f�td|j|��tj |j|��|j!||||||d
|||	�	Sn t=d |
|f�t"d|d��WYdd}~XnXtj�}$|$||"d!<|"d!�r$t5|"d�|"d!�p*t5dC�|"d"<|jj�rL|j2�|jd#�|"ddDk�rz|jI||"|j!|||||||	d&�
S|"dd'k�r�|jJ||"|j!|||||||	d&�
}%|%�r�|%StK|"�}&|&jLdEk�r�|&�|"dd,k�r�|jM||"|j!|||||||	d&�
S|"dd-k�r2|�r2d|_|j!||||||d
||dd.�	Sd/|"dk�rLd|"dd/<|"dd0k�sh|"dd1k�r�d}'|"dd2k�r�d}'|"dd3k�r�|�r�|d4�p�d5}n|"dd6k�rd}'nN|"dd7k�r�d}'|�r�|d4�p�d5}n&|"dd'k�rtK|"�}&|&jLdFk�rd}'tK|"�}&|'�r�|�r~td|d|&f�|�r>td8|�td|j|��tj |j|��|j!||||||d
|||	�	Std9|
�t"d:|&��|&�t=d;|!|"djd/d�jNd<�f�|"djd/d�jNd<�}(d=|(k�	rJ|(|j8�k�	rJ|"djd>�d?k�	rJtd@�|�	r6tdA|
�|j!||||||d
|||	�	Std9|
�t"dB��|"S)GNFzcontent-length�uploadr�z!Sending file '%s', please wait...z100-continue�expectr]r�z Retrying failed request: %s (%s)r^zWaiting %d sec...rzUpload failed for: %sr_zQHTTP Expect Continue feature disabled because of no reply of the server in %.2fs.Trz3File smaller than expected. Was the file truncated?)�delta_positionr�r�rJr�rz
Response:
r�z[Errno 104]z
[Errno 32]zXCannot retrieve any response status before encountering an EPIPE or ECONNRESET exceptionzUpload failed: %s (%s)zGiving up on '%s' %s�elapsed�speedr��-�3)�offset�
chunk_size�use_expect_continuei�r�r�r�r�i�i�)r�rr�i+i�i��g{�G�z�?i�i�z(Retrying on lower speed (throttle=%0.2f)z$Too many failures. Giving up on '%s'z%sz"MD5 sums: computed=%s, received=%sz"'r�zx-amz-server-side-encryptionzaws:kmszMD5 Sums don't match!zRetrying upload of %sz0MD5 sums of sent and received files don't match!r�)r�r�)r�r�r�r�)r�r�r�r�)OrKr{r�Zuse_http_expectr�rJrrr�r�rrXr*r)rOrnr&r`rar��
putrequestr�r��keys�	putheaderr�
endheadersr�rr�rr}r�r�
S3UploadError�seekr�selectZsock�EXPECT_CONTINUE_TIMEOUTr�r�ZCONTINUEr�Z_CS_REQ_SENTZ_HTTPConnection__state�minrr�	limitrater�Zwrapper_send_bodyrC�float�maxZthrottle_max�	hexdigestr�rr�r�rr�r�r�r�r�r�r�rAr@r�r	r�r�r�rHr�r�))rQr�r#r �bufferZthrottler|r�r�r�rJ�	size_left�
size_totalr�r��timestamp_startZsha256_hashrMrLr��headerr��md5_hashr��readable�writableZexceptional�lr��
start_timeZlimitrate_throttle�
real_duration�expected_durationZmd5_computedr�Zknown_error�
timestamp_endr�r��	try_retry�md5_from_s3r2r2r3rsz

 

"

















",

",zS3.send_filec
Cs�tj�}t|||||�}|j|�|j�}tj�}	|	||d<||d<|drbt|d�|dphtd�|d<|dr�t|d�dkr�tt|dd���|S)	Nr�rrr�r�r9r�r�)rXr$Zupload_all_partsZcomplete_multipart_uploadr�rr�r)
rQr#rJr^rrr�r�r�r�r2r2r3rs
(zS3.send_file_multipartcCs|j|||||�S)N)r)rQr=r>rrJrr2r2r3r;/szS3.copy_file_multipartc!8CsN|dkr|jj}|j|�|j�\}}}|j}	|jjrNd|d<|jj|d�}
ntd|	�tj�}d}y�t	j
|j|d��}|jj
||j||j��x*|j�D]}
|jjt|
�t||
��q�W|dkr�td|�|jjdd|�|jj�i}|jj�}|j|d	<|j|d
<t|j��|d<d|dk�rHt|dd�}||d
<tdtj|��W�n(tk
�r�}z�WYdd}~X�nttfk
�r�}z�|jj�r�|
j d�t!|d��r�|j"�r�|j"t"j#t"j$t"j%fk�s�dt&|�k�s�dt&|�k�rt'|t(��r�t	j)|�|�rft*d|d|f�t*d|j+|��tj,|j+|��|j-|||||dd�St.d|d��WYdd}~XnX|d	dk�s�|d	dk�r�|j/�|d<|d	d:k�r�|j0|||j-||||�S|d	dk�r|j1|||j-||||�}|�r|St2|��|d	dk�r4|j3|||j-||||�S|d	dk�sP|d	dk�r�d }|d	d!k�rhd"}n|d	d#k�rzd"}|�r�|d}|�r�|j+|�}t*d|t2|�f�t*d|�tj,|�|j-|||||dd�St*d$|�t.d|��t2|��|dk�r
t4�}t5|dd%�}||}|}|jj�rB||
_6||
_7||
_8�y|dk�rZ|j/d�}x�||k�rB||jj9k�r~|jj9�p�|}|jj:dk�r�tj�}|j/|�}t;|�dk�r�t<d&��|jj:dk�r�tj�|}t=|�|jj:}||k�r�tj,||�|j>|�|dk�r|j?|�|t;|�7}|jj�r\|
j?t;|�d'��q\Wt	j@|�W�ntAk
�rl�Y�nttfk
�rl}z�|jj�r�|
j d�t!|d��r�|j"�r�|j"t"j#t"j$t"j%fk�s�dt&|�k�s�dt&|�k�r�t'|t(��r�t	j)|�|�rLt*d|d|f�t*d|j+|��tj,|j+|��|j-|||||dd�St.d|d��WYdd}~XnX|jB�tj�}|jj�r�|
j?�|
j d(�|dj
d)d*�jCd+�} d,|dk�r�y|d
d-} WntDk
�r�YnXd.| k�rd|dk�r|jE�|d-<n\ytF|	�|d-<WnJtk
�rb}z,|j"t"jGk�rJt*d/|	|f�t*d0�WYdd}~XnX|j
d-�| k|d1<|||d2<||d3<|d2�r�t=|d3�|d2�p�t=d;�|d4<|d3|t5|dd%�k�r�t*d5|t5|dd%�|d3f�td6|j
d-��d.| k�rJ|d1�rJ|dj
d7�d8k�rJt*d9|j
d-�| f�|S)<NZdownloadr�rz#Receiving file '%s', please wait...r]zRequesting Range: %d .. endZRangez	bytes=%d-r�r�rJzx-amz-meta-s3cmd-attrszs3cmd-attrsz
Response:
r�r�z[Errno 104]z
[Errno 32]z Retrying failed request: %s (%s)r^zWaiting %d sec...r)r|zDownload failed for: %sr�i+r��-�3i�i�Fi�Ti�z$Too many failures. Giving up on '%s'zcontent-lengthzEOF from S3!)r�r�rr_z"'zx-amz-meta-s3tools-gpgencrr�zUnable to open file: %s: %sz(Unable to verify MD5. Assume it matches.Zmd5matchr�rr�z4Reported size (%s) does not match received size (%s)zReceiveFile: Computed MD5 = %szx-amz-server-side-encryptionzaws:kmsz5MD5 signatures do not match: computed=%s, received=%s)r�r�r�)HrKr{r�rnrr�r�rrXr&r`rar�r�r�r�r�r�rrr�r�r�r�rr�r�r�r�r�rrr�r�r�r�r�r�rAr@r�r�rr}r�r"ZS3DownloadErrorr�r�r�r�r�rrZ
total_sizeZinitial_positionr�Z
recv_chunkr�rCr�r��writer�r�r�flushr��KeyErrorr�r,�ENOENT)!rQr�r#r r$r|rMrLrJr�r�r�r�r�r�r�r�r�r�r�rhZretry_delayr�r�r�r�r�Z
this_chunkr�r�r�r�r�r2r2r3r"4sD







"















"



, *zS3.recv_file)Nr�)NNNr�r�)NNNr�r�)NNNr�)NN)F)N)N)N)N)N)NF)Nr_)rr_)NNr_F)NNr_)NNr_r�)Nr�r�)Nr�r�)Nr�r�)Nr�r�)Nr�)NF)NNNNr_N)N)rr�)r_rNrr�N)r_)r_)rN)Zrorprqr!ryZtargetsrzZcodesrRr�rar�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r!r%r,r*r2r6r8rCrDrGrr:r<rJr�rLrMrNrOrPrRrSrTrUrVrWrXr[r\r]r`rbrcrgrdrlrirmrqrtrurxr�r}r�r�r�r�r�r�rrr;r"r2r2r2r3rr�s�



5


!






f






		
	
6


*


%*
h



rrcCs2i}x(|jd�D]}|jd�\}}|||<qW|S)Nr��:)rB)Zattrs_headerr��attrr�r�r2r2r3r�	s
r�i)ZZ
__future__rrr	r�rXr�r;rr�Zxml.saxrZsocketrr�rrrrrr	r
r
rrr
r�ImportErrorZurllib.parser�Z	BaseUtilsrrrrrrrZUtilsrrrrrrrrrr r!r"Z
ExceptionsZ	MultiPartr$r%r&ZCryptor'r(r)r*r+r,r-r.Zctypesr/r8ZMagicr0r4�	TypeErrorrZ
MAGIC_MIME�load�AttributeErrorrr�rAZ	error_strr:r9rEr�r�__all__r/rGrr�appendr�r2r2r2r3�<module>
s�$ (
PI