o
    JhK                     @   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)	checksums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   u/var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/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)   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   r0   r%   )r   bodyr   r   r   handleH   s
   

zBaseChecksum.handleN)	__name__
__module____qualname__r'   r   r   r%   r0   r5   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r6   r7   r8   r?   r   r   r   r   r   r   r:   P       r:   c                   @   r9   )CrtCrc32Checksumc                 C   r;   r<   r=   r   r   r   r   r?   ]   r@   zCrtCrc32Checksum.__init__c                 C      t || j}|d@ | _d S rA   )crt_checksumsr   r>   r   r   new_checksumr   r   r   r   `      zCrtCrc32Checksum.updatec                 C   rB   rC   rH   r   r   r   r   r   d   rJ   zCrtCrc32Checksum.digestNrK   r   r   r   r   rM   [       rM   c                   @   r9   )CrtCrc32cChecksumc                 C   r;   r<   )_int_crc32cr   r   r   r   r?   j   r@   zCrtCrc32cChecksum.__init__c                 C   rN   rA   )rO   crc32crU   rP   r   r   r   r   m   rR   zCrtCrc32cChecksum.updatec                 C   rB   rC   )rU   rI   r   r   r   r   r   q   rJ   zCrtCrc32cChecksum.digestNrK   r   r   r   r   rT   h   rS   rT   c                   @   r9   )CrtCrc64NvmeChecksumc                 C   r;   r<   )_int_crc64nvmer   r   r   r   r?   w   r@   zCrtCrc64NvmeChecksum.__init__c                 C   rN   )Nl    )rO   	crc64nvmerX   rP   r   r   r   r   z   rR   zCrtCrc64NvmeChecksum.updatec                 C   rB   )N   rE   rF   )rX   rI   r   r   r   r   r   ~   rJ   zCrtCrc64NvmeChecksum.digestNrK   r   r   r   r   rW   u   rS   rW   c                   @   r9   )Sha1Checksumc                 C      t  | _d S r   )r   	_checksumr   r   r   r   r?         zSha1Checksum.__init__c                 C      | j | d S r   r]   r   r   r   r   r   r      rJ   zSha1Checksum.updatec                 C   
   | j  S r   r]   r   r   r   r   r   r      r@   zSha1Checksum.digestNrK   r   r   r   r   r[      rL   r[   c                   @   r9   )Sha256Checksumc                 C   r\   r   )r   r]   r   r   r   r   r?      r^   zSha256Checksum.__init__c                 C   r_   r   r`   r   r   r   r   r      rJ   zSha256Checksum.updatec                 C   ra   r   rb   r   r   r   r   r      r@   zSha256Checksum.digestNrK   r   r   r   r   rc      rL   rc   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	_completer]   rh   r   r   r   r   ri      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   ri   rf   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+   )rq   rp   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
)rf   r&   rk   hexrv   encoderq   r]   r   rg   r%   )r   	raw_chunkhex_lennamechecksumr   r   r   rw      s   zAwsChunkedWrapper._make_chunkc                 c   s     | j s|  V  | j rd S d S r   )rq   rw   r   r   r   r   __iter__   s   
zAwsChunkedWrapper.__iter__)Nre   N)r   r   )
r6   r7   r8   rj   r?   ri   r.   r&   rw   r   r   r   r   r   rd      s    


rd   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?   r]   	_expected)r   
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&   r]   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   readintorv   
memoryviewr]   r   r   )r   b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: rr   )r]   r   r!   	b64decoder   r%   r	   )r   rs   r   r   r   r     s   

z(StreamingChecksumBody._validate_checksumr   )r6   r7   r8   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   client_configrequestChecksumRequiredrequestAlgorithmMemberzUsing za requires an additional dependency. You will need to pip install botocore[crt] before proceeding.)msgz Unsupported checksum algorithm: rr   when_supportedis_presign_request)r   valuerequest_algorithm_headerheaderurlhttpss3trailerx-amz-checksum-)	algorithminr   request_algorithm)r   getrequest_checksum_calculationhttp_checksumhttp_checksum_required_SUPPORTED_CHECKSUM_ALGORITHMSlowerr   _CRT_CHECKSUM_ALGORITHMSr
   upperr	   DEFAULT_CHECKSUM_ALGORITHM$_get_request_algorithm_member_headerhas_streaming_inputr   schemesignature_version)r   r   r   supported_algorithmschecksum_contextr   r   request_checksum_requiredalgorithm_memberalgorithm_namealgorithm_member_header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".Nr   )input_shaper1   r   membersr   serialization)r   r   r   operation_input_shape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: {}rr   r   r   headersr   )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   r   r   r   r4   )r   _CHECKSUM_CLSr5   '_register_checksum_algorithm_feature_id)r   r   r   location_namerm   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   r   r   r   r4   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.)rm   rn   )r   r   r   r   strloggerdebugr1   r2   r3   ioBytesIOrd   )r   r   r   r   rm   r   r4   r   r   r   r   r     s:   

r   c                 C   s.   | d   }|dkrd}d| }t| d S )Nr   	CRC64NVMECRC64FLEXIBLE_CHECKSUMS_REQ_)r   r   )r   checksum_algorithm_name"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 )NrequestValidationModeMemberc                 S   s   h | ]}|  qS r   )r   ).0ar   r   r   	<setcomp>  s    z7resolve_response_checksum_algorithms.<locals>.<setcomp>responseAlgorithmsr   r   response_algorithms)r   r   r   _ALGORITHMS_PRIORITY_LISTappend)
r   r   r   r   r   mode_memberr   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
 d S )Nr   r   r   r   -r4   r   response_algorithmzXSkipping checksum validation. Response did not contain one of the following algorithms: .)r   has_streaming_output_handle_streaming_response_handle_bytes_responser   r   )	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   r   rl   )r   r   r   rm   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   rr   )	contentr   r   r   r   r!   r   r%   r	   )	r   r   r   r4   r   rm   r   r   rs   r   r   r   r     s   



r   )r   r   r   )r   rV   rY   )r   rV   )r      rD   rY   c                 c   s    | ]}|t v V  qd S r   )r   )r   r   r   r   r   	<genexpr>:  s    
r   )rY   rV   r   r   r   r   )?__doc__r!   r   loggingbinasciir   hashlibr   r   botocore.compatr   r   r   botocore.exceptionsr   r	   r
   botocore.modelr   botocore.responser   botocore.useragentr   botocore.utilsr   r   r   awscrtr   rO   	getLoggerr6   r   r   r   r:   rM   rT   rW   r[   rc   rd   r   r   r   r   r   r   r   r   r   r   r   r   r   r   _CRT_CHECKSUM_CLSr   allkeyslistr   r   r   r   r   r   <module>   sp   
R!	
N-
)
