U
    M8c;                     @   s  d Z ddlZddlZddl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 ddlmZmZ e
rdd	lmZ ndZeeZG d
d dZG dd deZG dd deZG dd deZG dd deZG dd deZG dd dZG dd deZ dd Z!d2ddZ"dd Z#d d! Z$d"d# Z%d3d$d%Z&d&d' Z'd(d) Z(d*d+ Z)eeed,Z*e
rze*+eed- e,e*- Z.d.d/d0d1gZ/dS )4aC   The interfaces in this module are not intended for public use.

This module defines interfaces for applying checksums to HTTP requests within
the context of botocore. This involves both resolving the checksum to be used
based on client configuration and environment, as well as application of the
checksum to the request.
    N)crc32)sha1sha256)HAS_CRT)AwsChunkedWrapperErrorFlexibleChecksumError)StreamingBody)conditionally_calculate_md5determine_content_length)	checksumsc                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )BaseChecksum   c                 C   s   d S N selfchunkr   r   9/tmp/pip-unpacked-wheel-ozje0y8b/botocore/httpchecksum.pyupdate.   s    zBaseChecksum.updatec                 C   s   d S r   r   r   r   r   r   digest1   s    zBaseChecksum.digestc                 C   s   |   }t|dS )Nascii)r   base64	b64encodedecode)r   bsr   r   r   	b64digest4   s    zBaseChecksum.b64digestc                    s:      }t fdddD ]}| q | d S )Nc                      s     jS r   )read_CHUNK_SIZEr   fileobjr   r   r   <lambda>:       z.BaseChecksum._handle_fileobj.<locals>.<lambda>r"   )telliterr   seek)r   r    Zstart_positionr   r   r   r   _handle_fileobj8   s    zBaseChecksum._handle_fileobjc                 C   s,   t |ttfr| | n
| | |  S r   )
isinstancebytes	bytearrayr   r&   r   )r   bodyr   r   r   handle>   s    
zBaseChecksum.handleN)	__name__
__module____qualname__r   r   r   r   r&   r+   r   r   r   r   r   +   s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )Crc32Checksumc                 C   s
   d| _ d S Nr   
_int_crc32r   r   r   r   __init__G   s    zCrc32Checksum.__init__c                 C   s   t || jd@ | _d S Nl    )r   r2   r   r   r   r   r   J   s    zCrc32Checksum.updatec                 C   s   | j jdddS N   big)	byteorderr2   to_bytesr   r   r   r   r   M   s    zCrc32Checksum.digestNr,   r-   r.   r3   r   r   r   r   r   r   r/   F   s   r/   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )CrtCrc32Checksumc                 C   s
   d| _ d S r0   r1   r   r   r   r   r3   S   s    zCrtCrc32Checksum.__init__c                 C   s   t || j}|d@ | _d S r4   )crt_checksumsr   r2   r   r   Znew_checksumr   r   r   r   V   s    zCrtCrc32Checksum.updatec                 C   s   | j jdddS r5   r9   r   r   r   r   r   Z   s    zCrtCrc32Checksum.digestNr;   r   r   r   r   r<   Q   s   r<   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )CrtCrc32cChecksumc                 C   s
   d| _ d S r0   )_int_crc32cr   r   r   r   r3   `   s    zCrtCrc32cChecksum.__init__c                 C   s   t || j}|d@ | _d S r4   )r=   crc32cr@   r>   r   r   r   r   c   s    zCrtCrc32cChecksum.updatec                 C   s   | j jdddS r5   )r@   r:   r   r   r   r   r   g   s    zCrtCrc32cChecksum.digestNr;   r   r   r   r   r?   ^   s   r?   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )Sha1Checksumc                 C   s   t  | _d S r   )r   	_checksumr   r   r   r   r3   l   s    zSha1Checksum.__init__c                 C   s   | j | d S r   rC   r   r   r   r   r   r   o   s    zSha1Checksum.updatec                 C   s
   | j  S r   rC   r   r   r   r   r   r   r   s    zSha1Checksum.digestNr;   r   r   r   r   rB   k   s   rB   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )Sha256Checksumc                 C   s   t  | _d S r   )r   rC   r   r   r   r   r3   w   s    zSha256Checksum.__init__c                 C   s   | j | d S r   rD   r   r   r   r   r   z   s    zSha256Checksum.updatec                 C   s
   | j  S r   rE   r   r   r   r   r   }   s    zSha256Checksum.digestNr;   r   r   r   r   rF   v   s   rF   c                   @   sF   e Zd ZdZdddZdd Zdd	d
ZdddZdd Zdd Z	dS )AwsChunkedWrapperr   Nx-amz-checksumc                 C   s2   || _ || _|| _|   |d kr(| j}|| _d S r   )_raw_checksum_name_checksum_cls_reset_DEFAULT_CHUNK_SIZE_chunk_size)r   rawchecksum_clschecksum_name
chunk_sizer   r   r   r3      s    zAwsChunkedWrapper.__init__c                 C   s&   d| _ d| _d | _| jr"|  | _d S )Nr"   F)
_remaining	_completerC   rK   r   r   r   r   rL      s
    zAwsChunkedWrapper._resetr   c                 C   s2   |dks|dkrt dd|   | jd d S )Nr   z Can only seek to start of stream	error_msg)r   rL   rI   r%   )r   offsetwhencer   r   r   r%      s    zAwsChunkedWrapper.seekc                 C   s   |d k	r|dkrd }| j r$| js$dS |d kp8|t| jk}| j sn|rn|  j|  7  _|d kpj|t| jk}q:|d krt| j}| jd | }| j|d  | _|S )Nr   r"   )rT   rS   len_make_chunk)r   sizeZwant_more_bytesZ	to_returnr   r   r   r      s    

zAwsChunkedWrapper.readc                 C   s   | j | j}tt|dd  d}| | _| jrB| j| | jrv| jrv| j	d}| j
 d}d||f S d||f S )N   r   s   0
%s:%s

s   %s
%s
)rI   r   rN   hexrY   encoderT   rC   r   rJ   r   )r   Z	raw_chunkZhex_lennamechecksumr   r   r   rZ      s    zAwsChunkedWrapper._make_chunkc                 c   s   | j s|  V  q d S r   )rT   rZ   r   r   r   r   __iter__   s    zAwsChunkedWrapper.__iter__)NrH   N)r   )N)
r,   r-   r.   rM   r3   rL   r%   r   rZ   ra   r   r   r   r   rG      s      


rG   c                       s2   e Zd Z fddZd fdd	Zdd Z  ZS )	StreamingChecksumBodyc                    s   t  || || _|| _d S r   )superr3   rC   	_expected)r   Z
raw_streamcontent_lengthr`   expected	__class__r   r   r3      s    zStreamingChecksumBody.__init__Nc                    s:   t  j|d}| j| |d ks.|s6|dkr6|   |S )N)amtr   )rc   r   rC   r   _validate_checksum)r   ri   r   rg   r   r   r      s
    zStreamingChecksumBody.readc                 C   s<   | j  t| jkr8d| j d| j   }t|dd S )NzExpected checksum z$ did not match calculated checksum: rU   )rC   r   r   	b64decoderd   r   r   )r   rV   r   r   r   rj      s    z(StreamingChecksumBody._validate_checksum)N)r,   r-   r.   r3   r   rj   __classcell__r   r   rg   r   rb      s   rb   c                 C   s   t | || t| || d S r   )"resolve_request_checksum_algorithm$resolve_response_checksum_algorithms)requestoperation_modelparamsr   r   r   resolve_checksum_context   s    rr   c           
      C   s   |j }|d}|r||kr|d kr(t}||  }||krJtd| dd}|jrf| d drfd}||d| d	}|d
 | d krd S | d di }	||	d< |	| d d< n4|js|dr| d di }	d|	d< |	| d d< d S )NZrequestAlgorithmMemberz"Unsupported checksum algorithm: %srU   headerurlzhttps:trailerx-amz-checksum-%s)	algorithminr_   r_   headerscontextr`   request_algorithmZrequestChecksumRequiredconditional-md5)http_checksumget_SUPPORTED_CHECKSUM_ALGORITHMSlowerr   Zhas_streaming_input
startswithZhttp_checksum_required)
ro   rp   rq   supported_algorithmsr}   Zalgorithm_memberZalgorithm_nameZlocation_typerw   checksum_contextr   r   r   rm      s:    

rm   c                 C   sz   |  di  di }| d}|s&d S |dkr8t|  n>|d dkrNt|  n(|d dkrdt|  ntd|d  d	d S )
Nrz   r`   r{   r|   rx   rs   ru   zUnknown checksum variant: %srU   )r~   r	   _apply_request_header_checksum_apply_request_trailer_checksumr   )ro   r   rw   r   r   r   apply_request_checksum   s    




r   c                 C   sd   |  di  di }| d}|d }|| d kr6d S t |d }| | d }|| d |< d S )Nrz   r`   r{   r_   ry   rw   r*   )r~   _CHECKSUM_CLSr+   )ro   r   rw   location_namerP   r   r   r   r   r   4  s    
r   c                 C   s   |  di  di }| d}|d }t |d }| d }| d }||krPd S d|d	< d
|d< ||d< t|}|d k	rt||d< t|ttfrt|}t	|||d| d< d S )Nrz   r`   r{   r_   rw   ry   r*   chunkedzTransfer-Encodingzaws-chunkedzContent-EncodingzX-Amz-TrailerzX-Amz-Decoded-Content-Length)rP   rQ   )
r~   r   r
   strr'   r(   r)   ioBytesIOrG   )ro   r   rw   r   rP   ry   r*   re   r   r   r   r   @  s*    

r   c           
      C   s   |j }|d}|r||kr|d kr(t}dd |dg D }g }tD ] }||krTqF||krF|| qF| d di }	||	d< |	| d d< d S )NZrequestValidationModeMemberc                 S   s   h | ]}|  qS r   )r   ).0ar   r   r   	<setcomp>i  s    z7resolve_response_checksum_algorithms.<locals>.<setcomp>ZresponseAlgorithmsrz   r`   response_algorithms)r}   r~   r   _ALGORITHMS_PRIORITY_LISTappend)
ro   rp   rq   r   r}   Zmode_memberr   Zusable_algorithmsrw   r   r   r   r   rn   a  s"    

rn   c           	      C   s   |d }| di }| d}|s&d S |D ]t}d| }||kr@q*d|| krNq*|jrft| |||d< nt| |||d< |d  di }||d< ||d d<  d S td	| d
 d S )Nry   r`   r   rv   -r*   rz   Zresponse_algorithmzXSkipping checksum validation. Response did not contain one of the following algorithms: .)r~   Zhas_streaming_output_handle_streaming_response_handle_bytes_responseloggerinfo)	http_responseresponserz   rp   ry   r   Z
algorithmsrw   header_namer   r   r   handle_checksum_bodyy  s:    
  
  
r   c                 C   s6   t |}d| }t| j|d d| |d | S )Nrv   ry   zcontent-length)r   r~   rb   rO   )r   r   rw   rP   r   r   r   r   r     s    

r   c           	      C   sd   | j }d| }t|}| }|| |d | }| t|kr`d|| f }t|d|S )Nrv   ry   z:Expected checksum %s did not match calculated checksum: %srU   )	contentr   r~   r   r   r   rk   r   r   )	r   r   rw   r*   r   rP   r`   rf   rV   r   r   r   r     s    


r   )r   r   r   )r   rA   rA   r   r   r   )N)N)0__doc__r   r   loggingbinasciir   hashlibr   r   Zbotocore.compatr   Zbotocore.exceptionsr   r   Zbotocore.responser   Zbotocore.utilsr	   r
   Zawscrtr   r=   	getLoggerr,   r   r   r/   r<   r?   rB   rF   rG   rb   rr   rm   r   r   r   rn   r   r   r   r   r   listkeysr   r   r   r   r   r   <module>   sT   
R	 
2" 
)