o
    "`^ho?                     @   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
rCd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&	d3d$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 )4aB  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      d S N selfchunkr   r   S/home/air/shanriGPT/back/venv/lib/python3.10/site-packages/botocore/httpchecksum.pyupdate3      zBaseChecksum.updatec                 C   r   r   r   r   r   r   r   digest6   r   zBaseChecksum.digestc                 C   s   |   }t|dS )Nascii)r   base64	b64encodedecode)r   bsr   r   r   	b64digest9   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>?   s    z.BaseChecksum._handle_fileobj.<locals>.<lambda>    )telliterr   seek)r   r#   start_positionr   r   r"   r   _handle_fileobj=   s   zBaseChecksum._handle_fileobjc                 C   s2   t |ttfr| | |  S | | |  S r   )
isinstancebytes	bytearrayr   r*   r   )r   bodyr   r   r   handleC   s
   

zBaseChecksum.handleN)	__name__
__module____qualname__r!   r   r   r   r*   r/   r   r   r   r   r   0   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__L      
zCrc32Checksum.__init__c                 C   s   t || jd@ | _d S Nl    )r   r8   r   r   r   r   r   O   s   zCrc32Checksum.updatec                 C      | j jdddS N   big)	byteorderr8   to_bytesr   r   r   r   r   R      zCrc32Checksum.digestNr0   r1   r2   r9   r   r   r   r   r   r   r4   K       r4   c                   @   r3   )CrtCrc32Checksumc                 C   r5   r6   r7   r   r   r   r   r9   X   r:   zCrtCrc32Checksum.__init__c                 C      t || j}|d@ | _d S r;   )crt_checksumsr   r8   r   r   new_checksumr   r   r   r   [      zCrtCrc32Checksum.updatec                 C   r<   r=   rA   r   r   r   r   r   _   rC   zCrtCrc32Checksum.digestNrD   r   r   r   r   rF   V       rF   c                   @   r3   )CrtCrc32cChecksumc                 C   r5   r6   )_int_crc32cr   r   r   r   r9   e   r:   zCrtCrc32cChecksum.__init__c                 C   rG   r;   )rH   crc32crN   rI   r   r   r   r   h   rK   zCrtCrc32cChecksum.updatec                 C   r<   r=   )rN   rB   r   r   r   r   r   l   rC   zCrtCrc32cChecksum.digestNrD   r   r   r   r   rM   c   rL   rM   c                   @   r3   )Sha1Checksumc                 C      t  | _d S r   )r   	_checksumr   r   r   r   r9   q      zSha1Checksum.__init__c                 C      | j | d S r   rR   r   r   r   r   r   r   t   rC   zSha1Checksum.updatec                 C   
   | j  S r   rR   r   r   r   r   r   r   w   r:   zSha1Checksum.digestNrD   r   r   r   r   rP   p   rE   rP   c                   @   r3   )Sha256Checksumc                 C   rQ   r   )r   rR   r   r   r   r   r9   |   rS   zSha256Checksum.__init__c                 C   rT   r   rU   r   r   r   r   r      rC   zSha256Checksum.updatec                 C   rV   r   rW   r   r   r   r   r      r:   zSha256Checksum.digestNrD   r   r   r   r   rX   {   rE   rX   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   r9      s   
zAwsChunkedWrapper.__init__c                 C   s*   d| _ d| _d | _| jr|  | _d S d S )Nr%   F)
_remaining	_completerR   r]   r   r   r   r   r^      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   r^   r[   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%   )rf   re   len_make_chunk)r   sizewant_more_bytes	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
)r[   r    r`   hexrk   encoderf   rR   r   r\   r   )r   	raw_chunkhex_lennamechecksumr   r   r   rl      s   zAwsChunkedWrapper._make_chunkc                 c   s     | j s|  V  | j rd S d S r   )rf   rl   r   r   r   r   __iter__   s   
zAwsChunkedWrapper.__iter__)NrZ   N)r   r   )
r0   r1   r2   r_   r9   r^   r(   r    rl   rw   r   r   r   r   rY      s    


rY   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   )superr9   rR   	_expected)r   
raw_streamcontent_lengthrv   expected	__class__r   r   r9      s   
zStreamingChecksumBody.__init__Nc                    s:   t  j|d}| j| |d u s|s|dkr|   |S )N)amtr   )ry   r    rR   r   _validate_checksum)r   r   r   r~   r   r   r       s
   zStreamingChecksumBody.readc                 C   s<   | j  t| jkrd| j d| j   }t|dd S )NExpected checksum $ did not match calculated checksum: rg   )rR   r   r   	b64decoderz   r   r   )r   rh   r   r   r   r      s   

z(StreamingChecksumBody._validate_checksumr   )r0   r1   r2   r9   r    r   __classcell__r   r   r~   r   rx      s    rx   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  |j }|d}|rl||v rl|d u rt}||  }||vr7ts/|tv r/td|  ddtd| dd}|j	rE| d 
d	rEd
}||d| d}|d | d v rXd S | d di }	||	d< |	| d d< d S |jst|dr| d di }	d|	d< |	| d d< d S d S )NrequestAlgorithmMemberzUsing za requires an additional dependency. You will need to pip install botocore[crt] before proceeding.)msgz Unsupported checksum algorithm: rg   headerurlzhttps:trailerx-amz-checksum-)	algorithminru   ru   headerscontextrv   request_algorithmrequestChecksumRequiredconditional-md5)http_checksumget_SUPPORTED_CHECKSUM_ALGORITHMSlowerr   _CRT_CHECKSUM_ALGORITHMSr   upperr   has_streaming_input
startswithhttp_checksum_required)
r   r   r   supported_algorithmsr   algorithm_memberalgorithm_namelocation_typer   checksum_contextr   r   r   r      sD   

r   c                 C   s~   |  di  di }| d}|sd S |dkrt|  d S |d dkr)t|  d S |d dkr5t|  d S td|d d	)
Nr   rv   r   r   r   r   r   zUnknown checksum variant: {}rg   )r   r
   _apply_request_header_checksum_apply_request_trailer_checksumr   format)r   r   r   r   r   r   apply_request_checksum-  s   
r   c                 C   sd   |  di  di }| d}|d }|| d v rd S t |d }| | d }|| d |< d S )Nr   rv   r   ru   r   r   r.   )r   _CHECKSUM_CLSr/   )r   r   r   location_namerb   r   r   r   r   r   A  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|}|d urOt||d< t|ttfr[t|}t	|||d| d< d S )Nr   rv   r   ru   r   r   r.   chunkedzTransfer-EncodingzContent-Encodingz,aws-chunkedzaws-chunkedzX-Amz-TrailerzX-Amz-Decoded-Content-Length)rb   rc   )
r   r   r   strr+   r,   r-   ioBytesIOrY   )r   r   r   r   rb   r   r.   r|   r   r   r   r   M  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 )NrequestValidationModeMemberc                 S   s   h | ]}|  qS r   )r   ).0ar   r   r   	<setcomp>{  s    z7resolve_response_checksum_algorithms.<locals>.<setcomp>responseAlgorithmsr   rv   response_algorithms)r   r   r   _ALGORITHMS_PRIORITY_LISTappend)
r   r   r   r   r   mode_memberr   usable_algorithmsr   r   r   r   r   r   s  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
 d S )Nr   rv   r   r   -r.   r   response_algorithmzXSkipping checksum validation. Response did not contain one of the following algorithms: .)r   has_streaming_output_handle_streaming_response_handle_bytes_responseloggerinfo)	http_responseresponser   r   r   r   
algorithmsr   header_namer   r   r   handle_checksum_body  s6   


r   c                 C   s8   t |}d| }t| j|d d| |d | S )Nr   r   zcontent-length)r   r   rx   ra   )r   r   r   rb   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   rg   )	contentr   r   r   r   r   r   r   r   )	r   r   r   r.   r   rb   rv   r}   rh   r   r   r   r     s   



r   )r   r   r   r   rO   )r   rO   c                 c   s    | ]}|t v V  qd S r   )r   )r   ru   r   r   r   	<genexpr>  s    
r   )rO   r   r   r   r   )4__doc__r   r   loggingbinasciir   hashlibr   r   botocore.compatr   botocore.exceptionsr   r   r   botocore.responser	   botocore.utilsr
   r   awscrtr   rH   	getLoggerr0   r   r   r4   rF   rM   rP   rX   rY   rx   r   r   r   r   r   r   r   r   r   r   r   _CRT_CHECKSUM_CLSr   allkeyslistr   r   r   r   r   r   <module>   s`   
R	
:'
)
