
    Pe?                     R   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
rdd	lmZ ndZ ej.                  e      Z G d
 d      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d d      Z  G d de      Z!d Z"	 d)dZ#d Z$d Z%d Z&	 d)dZ'd  Z(d! Z)d" Z*eeed#Z+d$d%gZ,e
r5eed&Z-e+j]                  e-        e/d' e-ja                         D              sJ  e1e+ja                               Z2g d(Z3y)*aC   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                   .    e Zd ZdZd Zd Zd Zd Zd Zy)BaseChecksum   c                      y N selfchunks     7/usr/lib/python3/dist-packages/botocore/httpchecksum.pyupdatezBaseChecksum.update2           c                      y r   r   r   s    r   digestzBaseChecksum.digest5   r   r   c                 j    | j                         }t        j                  |      j                  d      S )Nascii)r   base64	b64encodedecode)r   bss     r   	b64digestzBaseChecksum.b64digest8   s)    [[]#**733r   c                      j                         }t         fdd      D ]  } j                  |        j                  |       y )Nc                  :     j                  j                        S r   )read_CHUNK_SIZE)fileobjr   s   r   <lambda>z.BaseChecksum._handle_fileobj.<locals>.<lambda>>   s    ',,t/?/?"@ r   r   )telliterr   seek)r   r)   start_positionr   s   ``  r   _handle_fileobjzBaseChecksum._handle_fileobj<   s=     @#F 	EKK	^$r   c                     t        |t        t        f      r!| j                  |       | j                         S | j	                  |       | j                         S r   )
isinstancebytes	bytearrayr   r/   r$   )r   bodys     r   handlezBaseChecksum.handleB   sI    dUI./KK ~~   &~~r   N)	__name__
__module____qualname__r(   r   r   r$   r/   r5   r   r   r   r   r   /   s     K4% r   r   c                       e Zd Zd Zd Zd Zy)Crc32Checksumc                     d| _         y Nr   
_int_crc32r   s    r   __init__zCrc32Checksum.__init__K   	    r   c                 @    t        || j                        dz  | _        y Nl    )r   r>   r   s     r   r   zCrc32Checksum.updateN   s    t7*Dr   c                 <    | j                   j                  dd      S N   big)	byteorderr>   to_bytesr   s    r   r   zCrc32Checksum.digestQ       ''U';;r   Nr6   r7   r8   r?   r   r   r   r   r   r:   r:   J   s    E<r   r:   c                       e Zd Zd Zd Zd Zy)CrtCrc32Checksumc                     d| _         y r<   r=   r   s    r   r?   zCrtCrc32Checksum.__init__W   r@   r   c                 X    t        j                  || j                        }|dz  | _        y rB   )crt_checksumsr   r>   r   r   new_checksums      r   r   zCrtCrc32Checksum.updateZ   s$    $**5$//B&3r   c                 <    | j                   j                  dd      S rD   rH   r   s    r   r   zCrtCrc32Checksum.digest^   rJ   r   NrK   r   r   r   rM   rM   U   s    4<r   rM   c                       e Zd Zd Zd Zd Zy)CrtCrc32cChecksumc                     d| _         y r<   )_int_crc32cr   s    r   r?   zCrtCrc32cChecksum.__init__d   s
    r   c                 X    t        j                  || j                        }|dz  | _        y rB   )rP   crc32crW   rQ   s      r   r   zCrtCrc32cChecksum.updateg   s'    $++E43C3CD'*4r   c                 <    | j                   j                  dd      S rD   )rW   rI   r   s    r   r   zCrtCrc32cChecksum.digestk   s    ((e(<<r   NrK   r   r   r   rU   rU   b   s    5=r   rU   c                       e Zd Zd Zd Zd Zy)Sha1Checksumc                 "    t               | _        y r   )r   	_checksumr   s    r   r?   zSha1Checksum.__init__p   s    r   c                 :    | j                   j                  |       y r   r^   r   r   s     r   r   zSha1Checksum.updates       e$r   c                 6    | j                   j                         S r   r^   r   r   s    r   r   zSha1Checksum.digestv       ~~$$&&r   NrK   r   r   r   r\   r\   o   s     %'r   r\   c                       e Zd Zd Zd Zd Zy)Sha256Checksumc                 "    t               | _        y r   )r   r^   r   s    r   r?   zSha256Checksum.__init__{   s    r   c                 :    | j                   j                  |       y r   r`   r   s     r   r   zSha256Checksum.update~   ra   r   c                 6    | j                   j                         S r   rc   r   s    r   r   zSha256Checksum.digest   rd   r   NrK   r   r   r   rf   rf   z   s    "%'r   rf   c                   @    e Zd ZdZ	 	 	 d	dZd Zd
dZddZd Zd Z	y)AwsChunkedWrapperr   Nc                 x    || _         || _        || _        | j                          || j                  }|| _        y r   )_raw_checksum_name_checksum_cls_reset_DEFAULT_CHUNK_SIZE_chunk_size)r   rawchecksum_clschecksum_name
chunk_sizes        r   r?   zAwsChunkedWrapper.__init__   s=     	+)11J%r   c                 r    d| _         d| _        d | _        | j                  r| j                         | _        y y )Nr   F)
_remaining	_completer^   ro   r   s    r   rp   zAwsChunkedWrapper._reset   s5    !//1DN r   c                     |dk7  s|dk7  rt        d      | j                          | j                  j                  d       y )Nr   z Can only seek to start of stream	error_msg)r   rp   rm   r-   )r   offsetwhences      r   r-   zAwsChunkedWrapper.seek   s:    Q;&A+(<  			qr   c                    ||dk  rd }| j                   r| j                  sy|d u xs |t        | j                        kD  }| j                   sR|rP| xj                  | j                         z  c_        |d u xs |t        | j                        kD  }| j                   s|rP|t        | j                        }| j                  d | }| j                  |d  | _        |S )Nr   r   )ry   rx   len_make_chunk)r   sizewant_more_bytes	to_returns       r   r'   zAwsChunkedWrapper.read   s    	D >>$// $,E$T__1E*E.._OOt//11O"dlIdS5I.IO .._
 <t'D OOET*	//$%0r   c                    | j                   j                  | j                        }t        t	        |            dd  j                  d      }| | _        | j                  r| j                  j                  |       | j                  rW| j                  rK| j                  j                  d      }| j                  j                         j                  d      }d||fz  S d||fz  S )N   r   s   0
%s:%s

s   %s
%s
)rm   r'   rr   hexr   encodery   r^   r   rn   r$   )r   	raw_chunkhex_lennamechecksums        r   r   zAwsChunkedWrapper._make_chunk   s     IINN4#3#34	c)n%ab)009&>>NN!!),>>dnn&&--g6D~~//188AH(D(+;;;'9!555r   c              #   d   K   | j                   s | j                          | j                   sy y wr   )ry   r   r   s    r   __iter__zAwsChunkedWrapper.__iter__   s%     ..""$$ ..s   +00)Nzx-amz-checksumN)r   r   )
r6   r7   r8   rq   r?   rp   r-   r'   r   r   r   r   r   rk   rk      s1    %
 && 226$%r   rk   c                   0     e Zd Z fdZd fd	Zd Z xZS )StreamingChecksumBodyc                 B    t         |   ||       || _        || _        y r   )superr?   r^   	_expected)r   
raw_streamcontent_lengthr   expected	__class__s        r   r?   zStreamingChecksumBody.__init__   s     ^4!!r   c                     t         |   |      }| j                  j                  |       ||s|dkD  r| j	                          |S )N)amtr   )r   r'   r^   r   _validate_checksum)r   r   r   r   s      r   r'   zStreamingChecksumBody.read   sC    %e$;uq##%r   c                     | j                   j                         t        j                  | j                        k7  r6d| j                   d| j                   j                          }t        |      y )NExpected checksum $ did not match calculated checksum: r{   )r^   r   r    	b64decoder   r$   r   )r   r|   s     r   r   z(StreamingChecksumBody._validate_checksum   sg    >>  "f&6&6t~~&FF$T^^$4 5!^^5578:  ()<< Gr   r   )r6   r7   r8   r?   r'   r   __classcell__)r   s   @r   r   r      s    "
=r   r   c                 8    t        | ||       t        | ||       y r   )"resolve_request_checksum_algorithm$resolve_response_checksum_algorithms)requestoperation_modelparamss      r   resolve_checksum_contextr      s    &wH(/6Jr   c                 4   |j                   }|j                  d      }|r||v r|t        }||   j                         }||vr;t        s&|t
        v rt        d|j                          d      t        d|z        d}|j                  r| d   j                  d	      rd
}||d|z  d}|d   | d   v ry | d   j                  di       }	||	d<   |	| d   d<   y |j                  s|j                  d      r#| d   j                  di       }	d|	d<   |	| d   d<   y y )NrequestAlgorithmMemberzUsing za requires an additional dependency. You will need to pip install botocore[crt] before proceeding.)msgz"Unsupported checksum algorithm: %sr{   headerurlzhttps:trailerx-amz-checksum-%s)	algorithminr   r   headerscontextr   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_contexts
             r   r   r      s~    $11M$(()AB,6  '#A  01779!55~1II0 !5!5!7 8 9; ;  (>O  !..u~((2 !* ('.8
	 V	 22"9-11*bA09,-)9	:&		/	/=3D3D!4 #9-11*bA0A,-)9	:&4r   c                    | j                  di       j                  di       }|j                  d      }|sy |dk(  rt        |        y |d   dk(  rt        |        y |d   dk(  rt        |        y t	        d|d   z  	      )
Nr   r   r   r   r   r   r   zUnknown checksum variant: %sr{   )r   r   _apply_request_header_checksum_apply_request_trailer_checksumr   )r   r   r   s      r   apply_request_checksumr   ,  s    {{9b155j"E $$%89I%%#G,	4H	$&w/	4I	%'0#4yF
 	
r   c                     | j                  di       j                  di       }|j                  d      }|d   }|| d   v ry t        j                  |d         } |       j                  | d         }|| d   |<   y )Nr   r   r   r   r   r   r4   )r   _CHECKSUM_CLSr5   )r   r   r   location_namert   r   s         r   r   r   @  s    {{9b155j"E $$%89If%M	** $$Y{%;<L^""76?3F(.GI}%r   c                    | j                  di       j                  di       }|j                  d      }|d   }t        j                  |d         }| d   }| d   }||v ry d|d	<   d
|v r|d
xx   dz  cc<   nd|d
<   ||d<   t        |      }|t        |      |d<   t	        |t
        t        f      rt        j                  |      }t        |||      | d<   y )Nr   r   r   r   r   r   r4   chunkedzTransfer-EncodingzContent-Encodingz,aws-chunkedzaws-chunkedzX-Amz-TrailerzX-Amz-Decoded-Content-Length)rt   ru   )
r   r   r   strr1   r2   r3   ioBytesIOrk   )r   r   r   r   rt   r   r4   r   s           r   r   r   L  s    {{9b155j"E $$%89If%M $$Y{%;<Li G6?D#,G W$ 	"#~5#&3"#,GO-d3N! 36n2E./$	*+zz$'!#GFOr   c                 V   |j                   }|j                  d      }|r||v r|t        }|j                  dg       D ch c]  }|j                          }}g }t        D ]  }	|	|vr|	|v s|j                  |	        | d   j                  di       }
||
d<   |
| d   d<   y y y c c}w )NrequestValidationModeMemberresponseAlgorithmsr   r   response_algorithms)r   r   r   r   _ALGORITHMS_PRIORITY_LISTappend)r   r   r   r   r   mode_memberar   usable_algorithmsr   r   s              r   r   r   r  s     $11M##$ABK{f,'#A ,001ErJ
AGGI
 
 2 	4I 3300!((3		4 #9-11*bA2C./)9	:&! -{
s    B&c                 ^   |d   }|j                  di       }|j                  d      }|sy |D ]d  }d|z  }||vrd||   v r|j                  rt        | ||      |d<   nt        | ||      |d<   |d   j                  di       }||d<   ||d   d<    y  t        j                  d	| d
       y )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_responseloggerinfo)	http_responseresponser   r   r   r   
algorithmsr   header_names	            r   handle_checksum_bodyr     s    y!G{{:r2!%%&;<J 	)I5g%
 '+&&//9x HV  6x HV
 $I.22:rB1:-.*:J'36 KK!!+A	/r   c                     t         j                  |      }d|z  }t        | j                  |d   j                  d       |       |d   |         S )Nr   r   zcontent-length)r   r   r   rs   )r   r   r   rt   r   s        r   r   r     sX     $$Y/L%	1K  01K(	 r   c                 "   | j                   }d|z  }t        j                  |      } |       }|j                  |       |d   |   }|j	                         t        j                  |      k7  r"d|d|j                         }t        |      |S )Nr   r   r   r   r{   )	contentr   r   r   r   r    r   r$   r   )	r   r   r   r4   r   rt   r   r   r|   s	            r   r   r     s      D%	1K $$Y/L~HOOD	";/HF,,X66 ""$ 	 $i88Kr   )r   r   r   r   rY   )r   rY   c              #   ,   K   | ]  }|t         v   y wr   )r   ).0r   s     r   	<genexpr>r     s      -1((s   )rY   r   r   r   r   )4__doc__r    r   loggingbinasciir   hashlibr   r   botocore.compatr   botocore.exceptionsr   r   r	   botocore.responser
   botocore.utilsr   r   awscrtr   rP   	getLoggerr6   r   r   r:   rM   rU   r\   rf   rk   r   r   r   r   r   r   r   r   r   r   r   r   _CRT_CHECKSUM_CLSr   allkeyslistr   r   r   r   r   <module>r      ss    	     # 
 ,
 1M			8	$   6<L <
<| 
<
= 
='< ''\ 'O% O%d=M =,K 	7:t
(	/#N <@:0&R( 
 $X. 
 "# *+ 5F5K5K5M    "&m&8&8&:!; A r   