§
    7xÅj¹  ã                   ó´   — d dl Z d dlmZ d dlmZ d dlmZ d dlm	Z	m
Z
 d dlmZmZ d dlmZmZmZ d dlmZ  e j        e¦  «        Z G d	„ d
e¦  «        Zd„ ZdS )é    N)ÚIOBase)ÚProtocolError)ÚReadTimeoutError)ÚScalarTypesÚparsers)ÚXMLParseErrorÚset_socket_timeout)ÚIncompleteReadErrorr   ÚResponseStreamingError)Úfirst_non_none_responsec                   ó†   — e Zd ZdZdZd„ Zd„ Zd„ Zd„ Zdd„Z	d	„ Z
d
„ Zd„ Zd„ Zd„ Zd„ ZeZedfd„Zefd„Zd„ Zd„ Zd„ ZdS )ÚStreamingBodyae  Wrapper class for an http response body.

    This provides a few additional conveniences that do not exist
    in the urllib3 model:

        * Set the timeout on the socket (i.e read() timeouts)
        * Auto validation of content length, if the amount of bytes
          we read does not match the content length, an exception
          is raised.

    i   c                 ó0   — || _         || _        d| _        d S )Nr   )Ú_raw_streamÚ_content_lengthÚ_amount_read)ÚselfÚ
raw_streamÚcontent_lengths      úBC:\Projects\Historical\venv\Lib\site-packages\botocore/response.pyÚ__init__zStreamingBody.__init__6   s    € Ø%ˆÔØ-ˆÔØˆÔÐÐó    c                 ó   — d S ©N© ©r   s    r   Ú__del__zStreamingBody.__del__;   s	   € ð 	ˆr   c                 ó„   — 	 t          | j        |¦  «         dS # t          $ r t                               d¦  «         ‚ w xY w)z&Set the timeout seconds on the socket.zaCannot access the socket object of a streaming response. It's possible the interface has changed.N)r	   r   ÚAttributeErrorÚloggerÚ	exception)r   Útimeouts     r   r	   z StreamingBody.set_socket_timeoutA   s]   € ð	Ý˜tÔ/°Ñ9Ô9Ð9Ð9Ð9øÝð 	ð 	ð 	Ý×Òð;ñô ð ð ð	øøøs   ‚ ™&?c                 óX   — 	 | j                              ¦   «         S # t          $ r Y dS w xY w)NF)r   Úreadabler   r   s    r   r$   zStreamingBody.readableV   s>   € ð	ØÔ#×,Ò,Ñ.Ô.Ð.øÝð 	ð 	ð 	Ø�5�5ð	øøøs   ‚ ›
)¨)Nc                 ó>  — 	 | j                              |¦  «        }nE# t          $ r}t          |j        |¬¦  «        ‚d}~wt
          $ r}t          |¬¦  «        ‚d}~ww xY w| xj        t          |¦  «        z  c_        |�|s|dk    r|  	                    ¦   «          |S )zhRead at most amt bytes from the stream.

        If the amt argument is omitted, read all data.
        ©Úendpoint_urlÚerrorN©r(   r   )
r   ÚreadÚURLLib3ReadTimeoutErrorr   ÚurlÚURLLib3ProtocolErrorr   r   ÚlenÚ_verify_content_length)r   ÚamtÚchunkÚes       r   r*   zStreamingBody.read\   sÁ   € ð
	2ØÔ$×)Ò)¨#Ñ.Ô.ˆEˆEøÝ&ð 	@ð 	@ð 	@å"°´¸QÐ?Ñ?Ô?Ð?øøøøÝ#ð 	2ð 	2ð 	2Ý(¨qÐ1Ñ1Ô1Ð1øøøøð	2øøøàÐÔ�S ™ZœZÑ'ÐÔØˆ;˜uˆ;¨¨qª¨ð ×'Ò'Ñ)Ô)Ð)Øˆó   ‚ �
A§=½AÁ
AÁAc                 óB  — 	 | j                              |¦  «        }nE# t          $ r}t          |j        |¬¦  «        ‚d}~wt
          $ r}t          |¬¦  «        ‚d}~ww xY w| xj        |z  c_        |dk    r't          |¦  «        dk    r|  	                    ¦   «          |S )zcRead bytes into a pre-allocated, writable bytes-like object b, and return the number of bytes read.r&   Nr)   r   )
r   Úreadintor+   r   r,   r-   r   r   r.   r/   )r   ÚbÚamount_readr2   s       r   r5   zStreamingBody.readintop   sÄ   € ð	2ØÔ*×3Ò3°AÑ6Ô6ˆKˆKøÝ&ð 	@ð 	@ð 	@å"°´¸QÐ?Ñ?Ô?Ð?øøøøÝ#ð 	2ð 	2ð 	2Ý(¨qÐ1Ñ1Ô1Ð1øøøøð	2øøøàÐÔ˜[Ñ(ÐÔØ˜!ÒÐ¥ A¡¤¨¢
 
ð ×'Ò'Ñ)Ô)Ð)ØÐr3   c                 ó4   — | j                              ¦   «         S r   )r   Ú	readlinesr   s    r   r9   zStreamingBody.readlines€   s   € ØÔ×)Ò)Ñ+Ô+Ð+r   c                 ó6   — |                       | j        ¦  «        S )z:Return an iterator to yield 1k chunks from the raw stream.)Úiter_chunksÚ_DEFAULT_CHUNK_SIZEr   s    r   Ú__iter__zStreamingBody.__iter__ƒ   s   € à×Ò Ô 8Ñ9Ô9Ð9r   c                 óZ   — |                       | j        ¦  «        }|r|S t          ¦   «         ‚)z-Return the next 1k chunk from the raw stream.)r*   r<   ÚStopIteration)r   Úcurrent_chunks     r   Ú__next__zStreamingBody.__next__‡   s.   € àŸ	š	 $Ô":Ñ;Ô;ˆØð 	!Ø Ð Ý‰oŒoÐr   c                 ó   — | j         S r   )r   r   s    r   Ú	__enter__zStreamingBody.__enter__Ž   s   € ØÔÐr   c                 ó8   — | j                              ¦   «          d S r   ©r   Úclose)r   ÚtypeÚvalueÚ	tracebacks       r   Ú__exit__zStreamingBody.__exit__‘   s   € ØÔ×ÒÑ Ô Ð Ð Ð r   Fc              #   ó  K  — d}|                       |¦  «        D ]L}||z                        d¦  «        }|dd…         D ]}|                     |¦  «        d         V — Œ |d         }ŒM|r|                     |¦  «        d         V — dS dS )zÓReturn an iterator to yield lines from the raw stream.

        This is achieved by reading chunk of bytes (of size chunk_size) at a
        time from the raw stream, and then yielding lines from there.
        r   TNéÿÿÿÿr   )r;   Ú
splitlines)r   Ú
chunk_sizeÚkeependsÚpendingr1   ÚlinesÚlines          r   Ú
iter_lineszStreamingBody.iter_lines–   sº   è è € ð ˆØ×%Ò% jÑ1Ô1ð 	 ð 	 ˆEØ˜u‘_×0Ò0°Ñ6Ô6ˆEØ˜c˜r˜cœ
ð 3ð 3�Ø—o’o hÑ/Ô/°Ô2Ð2Ð2Ð2Ð2Ø˜B”iˆGˆGØð 	2Ø×$Ò$ XÑ.Ô.¨qÔ1Ð1Ð1Ð1Ð1Ð1ð	2ð 	2r   c              #   óL   K  — 	 |                       |¦  «        }|dk    rdS |V — Œ")z\Return an iterator to yield chunks of chunk_size bytes from the raw
        stream.
        Tr   N)r*   )r   rN   r@   s      r   r;   zStreamingBody.iter_chunks¥   s=   è è € ð	 Ø ŸIšI jÑ1Ô1ˆMØ Ò#Ð#Ø�ØÐÐÐð		 r   c                 ó¢   — | j         �E| j        t          | j         ¦  «        k    r*t          | j        t          | j         ¦  «        ¬¦  «        ‚d S d S )N)Úactual_bytesÚexpected_bytes)r   r   Úintr
   r   s    r   r/   z$StreamingBody._verify_content_length¯   so   € ð ÔÐ+°Ô0AÅSØÔ ñF
ô F
ò 1
ð 1
õ &Ø!Ô.Ý" 4Ô#7Ñ8Ô8ðñ ô ð ð ,Ð+ð 1
ð 1
r   c                 ó4   — | j                              ¦   «         S r   )r   Útellr   s    r   rZ   zStreamingBody.tell»   s   € ØÔ×$Ò$Ñ&Ô&Ð&r   c                 ó8   — | j                              ¦   «          dS )z*Close the underlying http response stream.NrE   r   s    r   rF   zStreamingBody.close¾   s   € àÔ×ÒÑ Ô Ð Ð Ð r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r<   r   r   r	   r$   r*   r5   r9   r=   rA   rC   rJ   ÚnextrS   r;   r/   rZ   rF   r   r   r   r   r   '   s6  € € € € € ð
ð 
ð Ððð ð ð
ð ð ðð ð ð*ð ð ðð ð ð ð(ð ð ð ,ð ,ð ,ð:ð :ð :ðð ð ð ð  ð  ð!ð !ð !ð €Dà$7À%ð 2ð 2ð 2ð 2ð &9ð  ð  ð  ð  ð
ð 
ð 
ð'ð 'ð 'ð!ð !ð !ð !ð !r   r   c                 óN  — | j         j        }|j        |j        dœ}|d         dk    r|j        |d<   nC| j        r2t          |j        |d                              d¦  «        ¦  «        |d<   n
|j        |d<   t          j
        |¦  «        }||                     || j        ¦  «        fS )N)ÚheadersÚstatus_coderc   i,  Úbodyrb   zcontent-length)Úservice_modelÚresolved_protocolrb   rc   ÚcontentÚhas_streaming_outputr   ÚrawÚgetr   Úcreate_parserÚparseÚoutput_shape)Úoperation_modelÚhttp_responseÚprotocolÚresponse_dictÚparsers        r   Úget_responsers   Ã   sÉ   € ØÔ,Ô>€Hà Ô(Ø$Ô0ðð €Mð �]Ô# sÒ*Ð*Ø -Ô 5ˆ�fÑÐØ	Ô	-ð 6Ý -ØÔ˜}¨YÔ7×;Ò;Ð<LÑMÔMñ!
ô !
ˆ�fÑÐð !.Ô 5ˆ�fÑåÔ" 8Ñ,Ô,€FØ˜&Ÿ,š,Ø�Ô3ñô ð ð r   )ÚloggingÚior   Úurllib3.exceptionsr   r-   r   r+   Úbotocorer   r   Úbotocore.compatr   r	   Úbotocore.exceptionsr
   r   Úbotocore.hooksr   Ú	getLoggerr\   r    r   rs   r   r   r   ú<module>r|      s:  ðð €€€Ø Ð Ð Ð Ð Ð à DÐ DÐ DÐ DÐ DÐ DØ JÐ JÐ JÐ JÐ JÐ Jðð ð ð ð ð ð ð ðð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð
 3Ð 2Ð 2Ð 2Ð 2Ð 2à	ˆÔ	˜8Ñ	$Ô	$€ðY!ð Y!ð Y!ð Y!ð Y!�Fñ Y!ô Y!ð Y!ðxð ð ð ð r   