a
    ݌xd?                     @   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"d3ddZ#dd Z$d d! Z%d"d# Z&d4d$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 sJ e1e+0 Z2g d2Z3dS )5aC   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   M/var/www/html/Ranjet/env/lib/python3.9/site-packages/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 u 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 ur|dkrd }| j r$| js$dS |d u p8|t| jk}| j sn|rn|  j|  7  _|d u pj|t| jk}q:|d u 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_chunk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[   rc   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_lengthrb   expected	__class__r   r   r4      s    zStreamingChecksumBody.__init__Nc                    s:   t  j|d}| j| |d u s.|s6|dkr6|   |S )N)amtr   )re   r   rD   r   _validate_checksum)r   rk   r   ri   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   	b64decoderf   r   r   )r   rW   r   r   r   rl      s    
z(StreamingChecksumBody._validate_checksum)N)r-   r.   r/   r4   r   rl   __classcell__r   r   ri   r   rd      s   rd   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    rt   c           
      C   s  |j }|d}|r||v r|d u r(t}||  }||vrlts^|tv r^td|  ddtd| dd}|j	r| d 
d	rd
}||d| d}|d | d v 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inra   ra   headerscontextrb   request_algorithmZrequestChecksumRequiredconditional-md5)http_checksumget_SUPPORTED_CHECKSUM_ALGORITHMSlowerr   _CRT_CHECKSUM_ALGORITHMSr   upperr   Zhas_streaming_input
startswithZhttp_checksum_required)
rq   rr   rs   supported_algorithmsr   Zalgorithm_memberZalgorithm_nameZlocation_typerz   checksum_contextr   r   r   ro      sB    

ro   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}   rb   r~   r   r{   rv   rx   zUnknown checksum variant: %srV   )r   r
   _apply_request_header_checksum_apply_request_trailer_checksumr   )rq   r   rz   r   r   r   apply_request_checksum,  s    




r   c                 C   sd   |  di  di }| d}|d }|| d v r6d S t |d }| | d }|| d |< d S )Nr}   rb   r~   ra   r|   rz   r+   )r   _CHECKSUM_CLSr,   )rq   r   rz   location_namerQ   r   r   r   r   r   @  s    
r   c                 C   s   |  di  di }| d}|d }t |d }| d }| d }||v rPd S d|d	< d
|v rr|d
  d7  < nd|d
< ||d< t|}|d urt||d< t|ttfrt|}t	|||d| d< d S )Nr}   rb   r~   ra   rz   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   )rq   r   rz   r   rQ   r|   r+   rg   r   r   r   r   L  s.    

r   c           
      C   s   |j }|d}|r||v r|d u r(t}dd |dg D }g }tD ] }||vrTqF||v 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}   rb   response_algorithms)r   r   r   _ALGORITHMS_PRIORITY_LISTappend)
rq   rr   rs   r   r   Zmode_memberr   Zusable_algorithmsrz   r   r   r   r   rp   r  s"    

rp   c           	      C   s   |d }| di }| d}|s&d S |D ]t}d| }||vr@q*d|| v rNq*|jrft| |||d< nt| |||d< |d  di }||d< ||d d<  d S td	| d
 d S )Nr|   rb   r   ry   -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}   rr   r|   r   Z
algorithmsrz   header_namer   r   r   handle_checksum_body  s6    

r   c                 C   s6   t |}d| }t| j|d d| |d | S )Nry   r|   zcontent-length)r   r   rd   rP   )r   r   rz   rQ   r   r   r   r   r     s    

r   c           	      C   sd   | j }d| }t|}| }|| |d | }| t|kr`d|| f }t|d|S )Nry   r|   z:Expected checksum %s did not match calculated checksum: %srV   )	contentr   r   r   r   r   rm   r   r   )	r   r   rz   r+   r   rQ   rb   rh   rW   r   r   r   r     s    


r   )r   r   r   r   rB   )r   rB   c                 c   s   | ]}|t v V  qd S r   )r   )r   ra   r   r   r   	<genexpr>  s   r   )rB   r   r   r   )N)N)4__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   rd   rt   ro   r   r   r   rp   r   r   r   r   r   Z_CRT_CHECKSUM_CLSr   allkeyslistr   r   r   r   r   r   <module>   s^   
R	 
:' 
)
