o
    iT                     @   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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mZ erYd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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Z0d'd( Z1	dKd)d*Z2d+d, Z3d-d. Z4d/d0 Z5d1d2 Z6d3d4 Z7d5d6 Z8	dKd7d8Z9d9d: Z:d;d< Z;d=d> Z<e%e,e-e.d?Z=g d@Z>er<e&e'dAZ?edBre(e?dC< edDr)e)e?dE< e*e?dF< e+e?dG< e=@e? eAdHdI e?B D s<J eCe=B ZDg dJZEdS )LaB  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sha512)HAS_CRThas_minimum_crt_versionurlparse)AwsChunkedWrapperErrorFlexibleChecksumErrorMissingDependencyException)StructureShape)StreamingBody)register_feature_id)conditionally_calculate_md5determine_content_lengthget_checksum_header_algorithms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   S/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/botocore/httpchecksum.pyupdate9      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>E   s    z.BaseChecksum._handle_fileobj.<locals>.<lambda>    )telliterr   seek)r   r+   start_positionr   r   r*   r   _handle_fileobjC   s   zBaseChecksum._handle_fileobjc                 C   s2   t |ttfr| | |  S | | |  S r   )
isinstancebytes	bytearrayr   r2   r'   )r   bodyr   r   r   handleI   s
   

zBaseChecksum.handleN)	__name__
__module____qualname__r)   r   r!   r'   r2   r7   r   r   r   r   r   6   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__R      
zCrc32Checksum.__init__c                 C   s   t || jd@ | _d S Nl    )r   r@   r   r   r   r   r   U   s   zCrc32Checksum.updatec                 C      | j jdddS N   big	byteorderr@   to_bytesr    r   r   r   r!   X      zCrc32Checksum.digestNr8   r9   r:   rA   r   r!   r   r   r   r   r<   Q       r<   c                   @   r;   )CrtCrc32Checksumc                 C   r=   r>   r?   r    r   r   r   rA   ^   rB   zCrtCrc32Checksum.__init__c                 C      t || j}|d@ | _d S rC   )crt_checksumsr   r@   r   r   new_checksumr   r   r   r   a      zCrtCrc32Checksum.updatec                 C   rD   rE   rJ   r    r   r   r   r!   e   rL   zCrtCrc32Checksum.digestNrM   r   r   r   r   rO   \       rO   c                   @   r;   )CrtCrc32cChecksumc                 C   r=   r>   )_int_crc32cr    r   r   r   rA   k   rB   zCrtCrc32cChecksum.__init__c                 C   rP   rC   )rQ   crc32crW   rR   r   r   r   r   n   rT   zCrtCrc32cChecksum.updatec                 C   rD   rE   )rW   rK   r    r   r   r   r!   r   rL   zCrtCrc32cChecksum.digestNrM   r   r   r   r   rV   i   rU   rV   c                   @   r;   )CrtCrc64NvmeChecksumc                 C   r=   r>   )_int_crc64nvmer    r   r   r   rA   x   rB   zCrtCrc64NvmeChecksum.__init__c                 C   rP   )Nl    )rQ   	crc64nvmerZ   rR   r   r   r   r   {   rT   zCrtCrc64NvmeChecksum.updatec                 C   rD   )N   rG   rH   )rZ   rK   r    r   r   r   r!      rL   zCrtCrc64NvmeChecksum.digestNrM   r   r   r   r   rY   v   rU   rY   c                   @   r;   )CrtXxhash64Checksumc                 C      t j | _d S r   )rQ   XXHashnew_xxhash64_xxhashr    r   r   r   rA      rL   zCrtXxhash64Checksum.__init__c                 C      | j | d S r   ra   r   r   r   r   r   r      rL   zCrtXxhash64Checksum.updatec                 C   
   | j  S r   ra   finalizer    r   r   r   r!      rB   zCrtXxhash64Checksum.digestNrM   r   r   r   r   r]          r]   c                   @   r;   )CrtXxhash3Checksumc                 C   r^   r   )rQ   r_   new_xxhash3_64ra   r    r   r   r   rA      rL   zCrtXxhash3Checksum.__init__c                 C   rb   r   rc   r   r   r   r   r      rL   zCrtXxhash3Checksum.updatec                 C   rd   r   re   r    r   r   r   r!      rB   zCrtXxhash3Checksum.digestNrM   r   r   r   r   rh      rg   rh   c                   @   r;   )CrtXxhash128Checksumc                 C   r^   r   )rQ   r_   new_xxhash3_128ra   r    r   r   r   rA      rL   zCrtXxhash128Checksum.__init__c                 C   rb   r   rc   r   r   r   r   r      rL   zCrtXxhash128Checksum.updatec                 C   rd   r   re   r    r   r   r   r!      rB   zCrtXxhash128Checksum.digestNrM   r   r   r   r   rj      rg   rj   c                   @   r;   )Sha1Checksumc                 C      t  | _d S r   )r   	_checksumr    r   r   r   rA         zSha1Checksum.__init__c                 C   rb   r   rn   r   r   r   r   r   r      rL   zSha1Checksum.updatec                 C   rd   r   rn   r!   r    r   r   r   r!      rB   zSha1Checksum.digestNrM   r   r   r   r   rl      rN   rl   c                   @   r;   )Sha256Checksumc                 C   rm   r   )r   rn   r    r   r   r   rA      ro   zSha256Checksum.__init__c                 C   rb   r   rp   r   r   r   r   r      rL   zSha256Checksum.updatec                 C   rd   r   rq   r    r   r   r   r!      rB   zSha256Checksum.digestNrM   r   r   r   r   rr      rN   rr   c                   @   r;   )Sha512Checksumc                 C   rm   r   )r   rn   r    r   r   r   rA      ro   zSha512Checksum.__init__c                 C   rb   r   rp   r   r   r   r   r      rL   zSha512Checksum.updatec                 C   rd   r   rq   r    r   r   r   r!      rB   zSha512Checksum.digestNrM   r   r   r   r   rs      rN   rs   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   rA      s   
zAwsChunkedWrapper.__init__c                 C   s*   d| _ d| _d | _| jr|  | _d S d S )Nr-   F)
_remaining	_completern   rx   r    r   r   r   ry      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	   ry   rv   r0   )r   offsetwhencer   r   r   r0      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-   )r   r   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
)rv   r(   r{   hexr   encoder   rn   r   rw   r'   )r   	raw_chunkhex_lennamechecksumr   r   r   r     s   zAwsChunkedWrapper._make_chunkc                 c   s     | j s|  V  | j rd S d S r   )r   r   r    r   r   r   __iter__  s   
zAwsChunkedWrapper.__iter__)Nru   N)r   r   )
r8   r9   r:   rz   rA   ry   r0   r(   r   r   r   r   r   r   rt      s    


rt   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   )superrA   rn   	_expected)r   
raw_streamcontent_lengthr   expected	__class__r   r   rA     s   
zStreamingChecksumBody.__init__Nc                    s:   t  j|d}| j| |d u s|s|dkr|   |S )N)amtr   )r   r(   rn   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   readintor   
memoryviewrn   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: r   )rn   r!   r#   	b64decoder   r'   r
   )r   r   r   r   r   r   2  s   

z(StreamingChecksumBody._validate_checksumr   )r8   r9   r:   rA   r(   r   r   __classcell__r   r   r   r   r     s
    r   c                 C   s$   t | || t| || t|  d S r   )"resolve_request_checksum_algorithm$resolve_response_checksum_algorithms_register_checksum_feature_ids)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: r   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   A  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_shaper3   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: {}r   r   r   headersr   )r   r   _apply_request_header_checksum_apply_request_trailer_checksumr
   format)r   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   r   r   r   r   r   r6   )r   _CHECKSUM_CLSr7   )r   r   r   location_namer}   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|}|d ur[t||d< d|v r[|d= td t|ttfrgt	
|}t|||d| d< d S )Nr   r   r   r   r   r   r6   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.)r}   r~   )r   r   r   strloggerdebugr3   r4   r5   ioBytesIOrt   )r   r   r   r   r}   r   r6   r   r   r   r   r     s8   

r   c                 C   sf   t |  }r|D ]}t| qdS | di di }|d}|r/t|tr1t|d  dS dS dS )zARegister feature IDs for checksum algorithms used in the request.Nr   r   r   r   )r   '_register_checksum_algorithm_feature_idr   r3   dict)r   algorithm_listr   r   r   r   r   r   r     s   

r   c                 C   s*   |   }|dkr
d}d| }t| d S )N	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 S )
Nr   r   r   r   -r6   r   response_algorithmz[Skipping checksum validation. Response did not contain one of the following algorithms: %s.)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   s4   


r   c                 C   s8   t |}d| }t| j|d d| |d | S )Nr   r   zcontent-length)r   r   r   r|   )r   r   r   r}   r   r   r   r   r   I  s   


r   c           	      C   sj   | j }d| }t|}| }|| |d | }| t|kr3d| d|  }t|d|S )Nr   r   r   r   r   )	contentr   r   r   r!   r#   r   r'   r
   )	r   r   r   r6   r   r}   r   r   r   r   r   r   r   T  s   



r   )r   r   r   r   )r   rX   r[   xxhash64xxhash3	xxhash128)r   rX   )r      rF   r[   )r      r   r  r  r  c                 c   s    | ]}|t v V  qd S r   )r   )r   r   r   r   r   	<genexpr>  s    
r  )	r  r  r[   r  rX   r   r   r   r   r   )F__doc__r#   r   loggingbinasciir   hashlibr   r   r   botocore.compatr   r   r   botocore.exceptionsr	   r
   r   botocore.modelr   botocore.responser   botocore.useragentr   botocore.utilsr   r   r   r   awscrtr   rQ   	getLoggerr8   r   r   r   r<   rO   rV   rY   r]   rh   rj   rl   rr   rs   rt   r   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>   s   
R!

N,
)


