U
    m/e?                     @   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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"d4ddZ#dd Z$d d! Z%d"d# Z&d5d$d%Z'd&d' Z(d(d) Z)d*d+ Z*eeed,Z+d-d.gZ,e
reed/Z-e+.e- e/d0d1 e-0 D st1e2e+0 Z3d.d-d2d3gZ4dS )6aC   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MissingDependencyException)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-3gylhwtm/botocore/httpchecksum.pyupdate2   s    zBaseChecksum.updatec                 C   s   d S r   r   r   r   r   r   digest5   s    zBaseChecksum.digestc                 C   s   |   }t|dS )Nascii)r   base64	b64encodedecode)r   bsr   r   r   	b64digest8   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_fileobj<   s    zBaseChecksum._handle_fileobjc                 C   s,   t |ttfr| | n
| | |  S r   )
isinstancebytes	bytearrayr   r'   r   )r   bodyr   r   r   handleB   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__K   s    zCrc32Checksum.__init__c                 C   s   t || jd@ | _d S Nl    )r   r3   r   r   r   r   r   N   s    zCrc32Checksum.updatec                 C   s   | j jdddS N   big)	byteorderr3   to_bytesr   r   r   r   r   Q   s    zCrc32Checksum.digestNr-   r.   r/   r4   r   r   r   r   r   r   r0   J   s   r0   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )CrtCrc32Checksumc                 C   s
   d| _ d S r1   r2   r   r   r   r   r4   W   s    zCrtCrc32Checksum.__init__c                 C   s   t || j}|d@ | _d S r5   )crt_checksumsr   r3   r   r   Znew_checksumr   r   r   r   Z   s    zCrtCrc32Checksum.updatec                 C   s   | j jdddS r6   r:   r   r   r   r   r   ^   s    zCrtCrc32Checksum.digestNr<   r   r   r   r   r=   U   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 r1   )_int_crc32cr   r   r   r   r4   d   s    zCrtCrc32cChecksum.__init__c                 C   s   t || j}|d@ | _d S r5   )r>   crc32crA   r?   r   r   r   r   g   s    zCrtCrc32cChecksum.updatec                 C   s   | j jdddS r6   )rA   r;   r   r   r   r   r   k   s    zCrtCrc32cChecksum.digestNr<   r   r   r   r   r@   b   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   r4   p   s    zSha1Checksum.__init__c                 C   s   | j | d S r   rD   r   r   r   r   r   r   s   s    zSha1Checksum.updatec                 C   s
   | j  S r   rD   r   r   r   r   r   r   v   s    zSha1Checksum.digestNr<   r   r   r   r   rC   o   s   rC   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   rD   r   r   r   r   r4   {   s    zSha256Checksum.__init__c                 C   s   | j | d S r   rE   r   r   r   r   r   ~   s    zSha256Checksum.updatec                 C   s
   | j  S r   rF   r   r   r   r   r      s    zSha256Checksum.digestNr<   r   r   r   r   rG   z   s   rG   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   r4      s    zAwsChunkedWrapper.__init__c                 C   s&   d| _ d| _d | _| jr"|  | _d S )Nr#   F)
_remaining	_completerD   rL   r   r   r   r   rM      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   rM   rJ   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#   )rU   rT   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
)rJ   r   rO   hexrZ   encoderU   rD   r   rK   r   )r   Z	raw_chunkZhex_lennamechecksumr   r   r   r[      s    zAwsChunkedWrapper._make_chunkc                 c   s   | j s|  V  q d S r   )rU   r[   r   r   r   r   __iter__   s    zAwsChunkedWrapper.__iter__)NrI   N)r   )N)
r-   r.   r/   rN   r4   rM   r&   r   r[   rb   r   r   r   r   rH      s      


rH   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   )superr4   rD   	_expected)r   Z
raw_streamcontent_lengthra   expected	__class__r   r   r4      s    zStreamingChecksumBody.__init__Nc                    s:   t  j|d}| j| |d ks.|s6|dkr6|   |S )N)amtr   )rd   r   rD   r   _validate_checksum)r   rj   r   rh   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: rV   )rD   r   r   	b64decodere   r   r   )r   rW   r   r   r   rk      s    z(StreamingChecksumBody._validate_checksum)N)r-   r.   r/   r4   r   rk   __classcell__r   r   rh   r   rc      s   rc   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    rs   c           
      C   s  |j }|d}|r||kr|d kr(t}||  }||krlts^|tkr^td|  ddtd| dd}|j	r| d 
d	rd
}||d| d}|d | d krd S | d di }	||	d< |	| d d< n6|js|dr| d di }	d|	d< |	| d d< d S )NZrequestAlgorithmMemberzUsing za requires an additional dependency. You will need to pip install botocore[crt] before proceeding.)msgz"Unsupported checksum algorithm: %srV   headerurlzhttps:trailerx-amz-checksum-%s)	algorithminr`   r`   headerscontextra   request_algorithmZrequestChecksumRequiredconditional-md5)http_checksumget_SUPPORTED_CHECKSUM_ALGORITHMSlowerr   _CRT_CHECKSUM_ALGORITHMSr   upperr   Zhas_streaming_input
startswithZhttp_checksum_required)
rp   rq   rr   supported_algorithmsr   Zalgorithm_memberZalgorithm_nameZlocation_typery   checksum_contextr   r   r   rn      sB    

rn   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 )
Nr|   ra   r}   r~   rz   ru   rw   zUnknown checksum variant: %srV   )r   r
   _apply_request_header_checksum_apply_request_trailer_checksumr   )rp   r   ry   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 )Nr|   ra   r}   r`   r{   ry   r+   )r   _CHECKSUM_CLSr,   )rp   r   ry   location_namerQ   r   r   r   r   r   @  s    
r   c                 C   s   |  di  di }| d}|d }t |d }| d }| d }||krPd S d|d	< d
|krr|d
  d7  < nd|d
< ||d< t|}|d k	rt||d< t|ttfrt|}t	|||d| d< d S )Nr|   ra   r}   r`   ry   r{   r+   chunkedzTransfer-EncodingzContent-Encodingz,aws-chunkedzaws-chunkedzX-Amz-TrailerzX-Amz-Decoded-Content-Length)rQ   rR   )
r   r   r   strr(   r)   r*   ioBytesIOrH   )rp   r   ry   r   rQ   r{   r+   rf   r   r   r   r   L  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>z  s    z7resolve_response_checksum_algorithms.<locals>.<setcomp>ZresponseAlgorithmsr|   ra   response_algorithms)r   r   r   _ALGORITHMS_PRIORITY_LISTappend)
rp   rq   rr   r   r   Zmode_memberr   Zusable_algorithmsry   r   r   r   r   ro   r  s"    

ro   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 )Nr{   ra   r   rx   -r+   r|   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responser|   rq   r{   r   Z
algorithmsry   header_namer   r   r   handle_checksum_body  s:    
  
  
r   c                 C   s6   t |}d| }t| j|d d| |d | S )Nrx   r{   zcontent-length)r   r   rc   rP   )r   r   ry   rQ   r   r   r   r   r     s    

r   c           	      C   sd   | j }d| }t|}| }|| |d | }| t|kr`d|| f }t|d|S )Nrx   r{   z:Expected checksum %s did not match calculated checksum: %srV   )	contentr   r   r   r   r   rl   r   r   )	r   r   ry   r+   r   rQ   ra   rg   rW   r   r   r   r     s    


r   )r   r   r   r   rB   )r   rB   c                 c   s   | ]}|t kV  qd S r   )r   )r   r`   r   r   r   	<genexpr>  s    r   r   r   )N)N)5__doc__r   r   loggingbinasciir   hashlibr   r   Zbotocore.compatr   Zbotocore.exceptionsr   r   r   Zbotocore.responser	   Zbotocore.utilsr
   r   Zawscrtr   r>   	getLoggerr-   r   r   r0   r=   r@   rC   rG   rH   rc   rs   rn   r   r   r   ro   r   r   r   r   r   Z_CRT_CHECKSUM_CLSr   allkeysAssertionErrorlistr   r   r   r   r   r   <module>   s^   
R	 
:' 
)
