o
    iK                     @   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 dd
lmZmZmZ e
rUd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* Z0d+d, Z1	d=d-d.Z2d/d0 Z3d1d2 Z4d3d4 Z5e#e'e(d5Z6g d6Z7e
re$e%d7Z8ed8re&e8d9< e69e8 e:d:d; e8; D sJ e<e6; Z=g d<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)register_feature_id)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      d S N selfchunkr   r   L/home/app/Keep/.python/lib/python3.10/site-packages/botocore/httpchecksum.pyupdate8      zBaseChecksum.updatec                 C   r   r   r   r   r   r   r   digest;   r   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>D   s    z.BaseChecksum._handle_fileobj.<locals>.<lambda>    )telliterr   seek)r   r(   Zstart_positionr   r   r'   r   _handle_fileobjB   s   zBaseChecksum._handle_fileobjc                 C   s2   t |ttfr| | |  S | | |  S r   )
isinstancebytes	bytearrayr   r.   r$   )r   bodyr   r   r   handleH   s
   

zBaseChecksum.handleN)	__name__
__module____qualname__r&   r   r   r$   r.   r3   r   r   r   r   r   5   s    r   c                   @   $   e Zd Zdd Zdd Zdd ZdS )Crc32Checksumc                 C   
   d| _ d S Nr   
_int_crc32r   r   r   r   __init__Q      
zCrc32Checksum.__init__c                 C   s   t || jd@ | _d S Nl    )r   r<   r   r   r   r   r   T   s   zCrc32Checksum.updatec                 C      | j jdddS N   big	byteorderr<   to_bytesr   r   r   r   r   W      zCrc32Checksum.digestNr4   r5   r6   r=   r   r   r   r   r   r   r8   P       r8   c                   @   r7   )CrtCrc32Checksumc                 C   r9   r:   r;   r   r   r   r   r=   ]   r>   zCrtCrc32Checksum.__init__c                 C      t || j}|d@ | _d S r?   )crt_checksumsr   r<   r   r   Znew_checksumr   r   r   r   `      zCrtCrc32Checksum.updatec                 C   r@   rA   rF   r   r   r   r   r   d   rH   zCrtCrc32Checksum.digestNrI   r   r   r   r   rK   [       rK   c                   @   r7   )CrtCrc32cChecksumc                 C   r9   r:   )_int_crc32cr   r   r   r   r=   j   r>   zCrtCrc32cChecksum.__init__c                 C   rL   r?   )rM   crc32crR   rN   r   r   r   r   m   rO   zCrtCrc32cChecksum.updatec                 C   r@   rA   )rR   rG   r   r   r   r   r   q   rH   zCrtCrc32cChecksum.digestNrI   r   r   r   r   rQ   h   rP   rQ   c                   @   r7   )CrtCrc64NvmeChecksumc                 C   r9   r:   )_int_crc64nvmer   r   r   r   r=   w   r>   zCrtCrc64NvmeChecksum.__init__c                 C   rL   )Nl    )rM   	crc64nvmerU   rN   r   r   r   r   z   rO   zCrtCrc64NvmeChecksum.updatec                 C   r@   )N   rC   rD   )rU   rG   r   r   r   r   r   ~   rH   zCrtCrc64NvmeChecksum.digestNrI   r   r   r   r   rT   u   rP   rT   c                   @   r7   )Sha1Checksumc                 C      t  | _d S r   )r   	_checksumr   r   r   r   r=         zSha1Checksum.__init__c                 C      | j | d S r   rZ   r   r   r   r   r   r      rH   zSha1Checksum.updatec                 C   
   | j  S r   rZ   r   r   r   r   r   r      r>   zSha1Checksum.digestNrI   r   r   r   r   rX      rJ   rX   c                   @   r7   )Sha256Checksumc                 C   rY   r   )r   rZ   r   r   r   r   r=      r[   zSha256Checksum.__init__c                 C   r\   r   r]   r   r   r   r   r      rH   zSha256Checksum.updatec                 C   r^   r   r_   r   r   r   r   r      r>   zSha256Checksum.digestNrI   r   r   r   r   r`      rJ   r`   c                   @   sL   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   r=      s   
zAwsChunkedWrapper.__init__c                 C   s*   d| _ d| _d | _| jr|  | _d S d S )Nr*   F)
_remaining	_completerZ   re   r   r   r   r   rf      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   rf   rc   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 p|t| jk}| j s;|r;|  j|  7  _|d u p5|t| jk}| j s;|s"|d u rDt| j}| jd | }| j|d  | _|S )Nr   r*   )rn   rm   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r!| j| | jr;| jr;| j	d}| j
 d}d||f S d||f S )N   r   s   0
%s:%s

s   %s
%s
)rc   r%   rh   hexrs   encodern   rZ   r   rd   r$   )r   Z	raw_chunkhex_lennamechecksumr   r   r   rt      s   zAwsChunkedWrapper._make_chunkc                 c   s     | j s|  V  | j rd S d S r   )rn   rt   r   r   r   r   __iter__   s   
zAwsChunkedWrapper.__iter__)Nrb   N)r   r   )
r4   r5   r6   rg   r=   rf   r-   r%   rt   r|   r   r   r   r   ra      s    


ra   c                       s>   e Zd Z fddZd
 fdd	Z fddZdd	 Z  ZS )StreamingChecksumBodyc                    s   t  || || _|| _d S r   )superr=   rZ   	_expected)r   Z
raw_streamcontent_lengthr{   expected	__class__r   r   r=      s   
zStreamingChecksumBody.__init__Nc                    s:   t  j|d}| j| |d u s|s|dkr|   |S )N)amtr   )r~   r%   rZ   r   _validate_checksum)r   r   r   r   r   r   r%      s
   zStreamingChecksumBody.readc                    sZ   t  |}|t|kr|}nt|d | }| j| |dkr+t|dkr+|   |S r:   )r~   readintors   
memoryviewrZ   r   r   )r   bZamount_readviewr   r   r   r      s   zStreamingChecksumBody.readintoc                 C   s<   | j  t| jkrd| j d| j   }t|dd S )NExpected checksum $ did not match calculated checksum: ro   )rZ   r   r    	b64decoder   r$   r	   )r   rp   r   r   r   r     s   

z(StreamingChecksumBody._validate_checksumr   )r4   r5   r6   r=   r%   r   r   __classcell__r   r   r   r   r}      s
    r}   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   sX  t | rd S | d di }| d d j}|j}|jp|d}|d}|rU||v rU|d u r1t}||  }	|	|vrTtsL|	tv rLt	d|	
  ddtd	|	 d
n)|s]|r||dkr|| d drfd S t }	t|| |}
|
d ur{|
td|d< nd S d}|jrt| d jdkr| d d jdkrd}|	|d|	 d}||d< || d d< d S )Ncontextr{   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: ro   Zwhen_supportedZis_presign_request)rz   valuerequest_algorithm_headerheaderurlhttpsZs3trailerx-amz-checksum-)	algorithminrz   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   r     sl   

r   c                 C   s4   | j }t|ts
dS |j|}|r|jdS dS )zDGet the name of the header targeted by the "requestAlgorithmMember".Nrz   )Zinput_shaper/   r   membersr   Zserialization)r   r   r   Zoperation_input_shapeZalgorithm_member_shaper   r   r   r   ^  s   
r   c                 C   s   |  di  di }| d}|sd S |dkrt|  n |d dkr't|  n|d dkr2t|  n
td|d d	d
|v rP|d
 }|d | d |d < d S d S )Nr   r{   r   zconditional-md5r   r   r   zUnknown checksum variant: {}ro   r   r   headersrz   )r   r   _apply_request_header_checksum_apply_request_trailer_checksumr	   format)r   r   r   r   r   r   r   apply_request_checksumn  s$   



r   c                 C   sl   |  di  di }| d}|d }|| d v rd S t |d }| | d }|| d |< t| d S )Nr   r{   r   rz   r   r   r2   )r   _CHECKSUM_CLSr3   '_register_checksum_algorithm_feature_id)r   r   r   location_namerj   r   r   r   r   r     s   
r   c                 C   s   |  di  di }| d}|d }t |d }| d }| d }||v r(d S d|d	< d
|v r9|d
  d7  < nd|d
< ||d< t| t|}|d ur_t||d< d|v r_|d= td t|tt	frkt
|}t|||d| d< d S )Nr   r{   r   rz   r   r   r2   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.)rj   rk   )r   r   r   r   strloggerdebugr/   r0   r1   ioBytesIOra   )r   r   r   r   rj   r   r2   r   r   r   r   r     s:   

r   c                 C   s.   | d   }|dkrd}d| }t| d S )Nr   Z	CRC64NVMEZCRC64ZFLEXIBLE_CHECKSUMS_REQ_)r   r   )r   Zchecksum_algorithm_nameZ"checksum_algorithm_name_feature_idr   r   r   r     s   r   c           
      C   s   |j }|d}|rH||v rJ|d u rt}dd |dg D }g }tD ]}||vr*q#||v r3|| q#| d di }	||	d< |	| d d< d S d S 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   r{   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 ];}d| }||vr!qd|| v r(q|jr4t| |||d< nt| |||d< |d  di }||d< ||d d<  d S td	| d S )
Nr   r{   r   r   -r2   r   Zresponse_algorithmz[Skipping checksum validation. Response did not contain one of the following algorithms: %s.)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  s4   


r   c                 C   s8   t |}d| }t| j|d d| |d | S )Nr   r   zcontent-length)r   r   r}   ri   )r   r   r   rj   r   r   r   r   r     s   


r   c           	      C   sj   | j }d| }t|}| }|| |d | }| t|kr3d| d|  }t|d|S )Nr   r   r   r   ro   )	contentr   r   r   r   r    r   r$   r	   )	r   r   r   r2   r   rj   r{   r   rp   r   r   r   r     s   



r   )r   r   r   )r   rS   rV   )r   rS   )r      rB   rV   c                 c   s    | ]}|t v V  qd S r   )r   )r   rz   r   r   r   	<genexpr>:  s    
r   )rV   rS   r   r   r   r   )?__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.useragentr   Zbotocore.utilsr   r   r   Zawscrtr   rM   	getLoggerr4   r   r   r   r8   rK   rQ   rT   rX   r`   ra   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   Z_CRT_CHECKSUM_CLSr   allkeyslistr   r   r   r   r   r   <module>   sp   
R!	
N-
)
