U
    EZhH                     @   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
mZmZ ddlmZmZmZ ddlmZ ddlmZ dd	lmZmZmZ e
rdd
lmZ ndZeeZd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e Z&G dd dZ'G dd deZ(dd Z)d<d d!Z*d"d# Z+d$d% Z,d&d' Z-d(d) Z.d=d*d+Z/d,d- Z0d.d/ Z1d0d1 Z2e!e%e&d2Z3d3d4d5gZ4e
re"e#d6Z5ed7re$e5d5< e36e5 e7d8d9 e58 D st9e:e38 Z;d5d4d3d:d;gZ<dS )>aB  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has_minimum_crt_versionurlparse)AwsChunkedWrapperErrorFlexibleChecksumErrorMissingDependencyException)StructureShape)StreamingBody)conditionally_calculate_md5determine_content_lengthhas_checksum_header)	checksumsZCRC32c                   @   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   \/home/aprabhat/apps/x.techxrdev.in/venv/lib/python3.8/site-packages/botocore/httpchecksum.pyupdate7   s    zBaseChecksum.updatec                 C   s   d S r   r   r   r   r   r   digest:   s    zBaseChecksum.digestc                 C   s   |   }t|dS )Nascii)r   base64	b64encodedecode)r   bsr   r   r   	b64digest=   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>C       z.BaseChecksum._handle_fileobj.<locals>.<lambda>r'   )telliterr   seek)r   r%   Zstart_positionr   r   r$   r   _handle_fileobjA   s    zBaseChecksum._handle_fileobjc                 C   s,   t |ttfr| | n
| | |  S r   )
isinstancebytes	bytearrayr   r+   r!   )r   bodyr   r   r   handleG   s    
zBaseChecksum.handleN)	__name__
__module____qualname__r#   r   r   r!   r+   r0   r   r   r   r   r   4   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__P   s    zCrc32Checksum.__init__c                 C   s   t || jd@ | _d S Nl    )r   r7   r   r   r   r   r   S   s    zCrc32Checksum.updatec                 C   s   | j jdddS N   big	byteorderr7   to_bytesr   r   r   r   r   V   s    zCrc32Checksum.digestNr1   r2   r3   r8   r   r   r   r   r   r   r4   O   s   r4   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )CrtCrc32Checksumc                 C   s
   d| _ d S r5   r6   r   r   r   r   r8   \   s    zCrtCrc32Checksum.__init__c                 C   s   t || j}|d@ | _d S r9   )crt_checksumsr   r7   r   r   Znew_checksumr   r   r   r   _   s    zCrtCrc32Checksum.updatec                 C   s   | j jdddS r:   r?   r   r   r   r   r   c   s    zCrtCrc32Checksum.digestNrA   r   r   r   r   rB   Z   s   rB   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )CrtCrc32cChecksumc                 C   s
   d| _ d S r5   )_int_crc32cr   r   r   r   r8   i   s    zCrtCrc32cChecksum.__init__c                 C   s   t || j}|d@ | _d S r9   )rC   crc32crF   rD   r   r   r   r   l   s    zCrtCrc32cChecksum.updatec                 C   s   | j jdddS r:   )rF   r@   r   r   r   r   r   p   s    zCrtCrc32cChecksum.digestNrA   r   r   r   r   rE   g   s   rE   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )CrtCrc64NvmeChecksumc                 C   s
   d| _ d S r5   )_int_crc64nvmer   r   r   r   r8   v   s    zCrtCrc64NvmeChecksum.__init__c                 C   s   t || j}|d@ | _d S )Nl    )rC   	crc64nvmerI   rD   r   r   r   r   y   s    zCrtCrc64NvmeChecksum.updatec                 C   s   | j jdddS )N   r<   r=   )rI   r@   r   r   r   r   r   }   s    zCrtCrc64NvmeChecksum.digestNrA   r   r   r   r   rH   t   s   rH   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   r8      s    zSha1Checksum.__init__c                 C   s   | j | d S r   rM   r   r   r   r   r   r      s    zSha1Checksum.updatec                 C   s
   | j  S r   rM   r   r   r   r   r   r      s    zSha1Checksum.digestNrA   r   r   r   r   rL      s   rL   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   rM   r   r   r   r   r8      s    zSha256Checksum.__init__c                 C   s   | j | d S r   rN   r   r   r   r   r      s    zSha256Checksum.updatec                 C   s
   | j  S r   rO   r   r   r   r   r      s    zSha256Checksum.digestNrA   r   r   r   r   rP      s   rP   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   r8      s    zAwsChunkedWrapper.__init__c                 C   s&   d| _ d| _d | _| jr"|  | _d S )Nr'   F)
_remaining	_completerM   rU   r   r   r   r   rV      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   rV   rS   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'   )r^   r]   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
)rS   r"   rX   hexrc   encoder^   rM   r   rT   r!   )r   Z	raw_chunkhex_lennamechecksumr   r   r   rd      s    zAwsChunkedWrapper._make_chunkc                 c   s   | j s|  V  q d S r   )r^   rd   r   r   r   r   __iter__   s    zAwsChunkedWrapper.__iter__)NrR   N)r   )N)
r1   r2   r3   rW   r8   rV   r*   r"   rd   rl   r   r   r   r   rQ      s      


rQ   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   )superr8   rM   	_expected)r   Z
raw_streamcontent_lengthrk   expected	__class__r   r   r8      s    zStreamingChecksumBody.__init__Nc                    s:   t  j|d}| j| |d ks.|s6|dkr6|   |S )N)amtr   )rn   r"   rM   r   _validate_checksum)r   rt   r   rr   r   r   r"      s
    zStreamingChecksumBody.readc                 C   s<   | j  t| jkr8d| j d| j   }t|dd S )NExpected checksum $ did not match calculated checksum: r_   )rM   r   r   	b64decodero   r!   r	   )r   r`   r   r   r   ru      s    z(StreamingChecksumBody._validate_checksum)N)r1   r2   r3   r8   r"   ru   __classcell__r   r   rr   r   rm      s   rm   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    r   c                 C   s^  t | rd S | d di }| d d j}|j}|jp>|d}|d}|r||kr|d krbt}||  }	|	|krts|	tkrt	d|	
  ddtd	|	 d
nR|s|r|dkr| d drd S t }	t|| |}
|
d k	r|
td|d< nd S d}|jr4t| d jdkr4| d d jdkr4d}|	|d|	 d}||d< || d d< d S )Ncontextrk   Zclient_configZrequestChecksumRequiredZrequestAlgorithmMemberzUsing za requires an additional dependency. You will need to pip install botocore[crt] before proceeding.)msgz Unsupported checksum algorithm: r_   Zwhen_supportedZis_presign_request)rj   valuerequest_algorithm_headerheaderurlhttpsZs3trailerx-amz-checksum-)	algorithminrj   request_algorithm)r   getrequest_checksum_calculationhttp_checksumZhttp_checksum_required_SUPPORTED_CHECKSUM_ALGORITHMSlowerr   _CRT_CHECKSUM_ALGORITHMSr
   upperr	   DEFAULT_CHECKSUM_ALGORITHM$_get_request_algorithm_member_headerZhas_streaming_inputr   schemeZsignature_version)r|   r}   r~   supported_algorithmschecksum_contextr   r   Zrequest_checksum_requiredalgorithm_memberZalgorithm_nameZalgorithm_member_headerZlocation_typer   r   r   r   rz     sl    
  rz   c                 C   s4   | j }t|tsdS |j|}|r0|jdS dS )zDGet the name of the header targeted by the "requestAlgorithmMember".Nrj   )Zinput_shaper,   r   membersr   Zserialization)r}   r|   r   Zoperation_input_shapeZalgorithm_member_shaper   r   r   r   R  s    
r   c                 C   s   |  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
|kr|d
 }|d | d |d < d S )Nr   rk   r   zconditional-md5r   r   r   zUnknown checksum variant: {}r_   r   r   headersrj   )r   r   _apply_request_header_checksum_apply_request_trailer_checksumr	   format)r|   r   r   r   r   r   r   apply_request_checksumb  s"    



r   c                 C   sd   |  di  di }| d}|d }|| d kr6d S t |d }| | d }|| d |< d S )Nr   rk   r   rj   r   r   r/   )r   _CHECKSUM_CLSr0   )r|   r   r   location_namerZ   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< d|kr|d= td t|ttfrt	
|}t|||d| d< d S )Nr   rk   r   rj   r   r   r/   chunkedzTransfer-EncodingzContent-Encodingz,aws-chunkedzaws-chunkedzX-Amz-TrailerzX-Amz-Decoded-Content-LengthzContent-LengthzVRemoving the Content-Length header since 'chunked' is specified for Transfer-Encoding.)rZ   r[   )r   r   r   strloggerdebugr,   r-   r.   ioBytesIOrQ   )r|   r   r   r   rZ   r   r/   rp   r   r   r   r     s8    

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>  s    z7resolve_response_checksum_algorithms.<locals>.<setcomp>ZresponseAlgorithmsr   rk   response_algorithms)r   r   r   _ALGORITHMS_PRIORITY_LISTappend)
r|   r}   r~   r   r   Zmode_memberr   Zusable_algorithmsr   r   r   r   r   r{     s"    

r{   c           	      C   s   |d }| di }| d}|s&d S |D ]v}d| }||krBq*d|| krPq*|jrht| |||d< nt| |||d< |d  di }||d< ||d d<  d S td	| d
 d S )Nr   rk   r   r   -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_responser   r   )	http_responseresponser   r}   r   r   Z
algorithmsr   header_namer   r   r   handle_checksum_body  s:    

  
  
r   c                 C   s8   t |}d| }t| j|d d| |d | S )Nr   r   zcontent-length)r   r   rm   rY   )r   r   r   rZ   r   r   r   r   r     s    


r   c           	      C   sj   | j }d| }t|}| }|| |d | }| t|krfd| d|  }t|d|S )Nr   r   rv   rw   r_   )	contentr   r   r   r   r   rx   r!   r	   )	r   r   r   r/   r   rZ   rk   rq   r`   r   r   r   r     s    



r   )r   r   r   r   rG   rJ   )r   rG   )r      r;   c                 c   s   | ]}|t kV  qd S r   )r   )r   rj   r   r   r   	<genexpr>"  s    r   r   r   )N)N)=__doc__r   r   loggingbinasciir   hashlibr   r   Zbotocore.compatr   r   r   Zbotocore.exceptionsr   r	   r
   Zbotocore.modelr   Zbotocore.responser   Zbotocore.utilsr   r   r   Zawscrtr   rC   	getLoggerr1   r   r   r   r4   rB   rE   rH   rL   rP   rQ   rm   r   rz   r   r   r   r   r{   r   r   r   r   r   Z_CRT_CHECKSUM_CLSr   allkeysAssertionErrorlistr   r   r   r   r   r   <module>   sj   
R	 
N- 
)


