o
    di(                     @   s   d dl Z d dlZd dlZd dlZd dlmZmZmZ d dlm	Z	 G dd dee j
ZG dd dejZG dd	 d	ejZd
d ZdS )    N)IncompleteReadErrorReadTimeoutErrorResponseStreamingError)parsersc                   @   s   e Zd ZdS )AioReadTimeoutErrorN)__name__
__module____qualname__ r
   r
   H/home/ubuntu/.local/lib/python3.10/site-packages/aiobotocore/response.pyr      s    r   c                       s   e Zd ZdZdZdejdef fddZdd Z	d	d
 Z
dd Zd"ddZdefddZdd Zdd Zdd ZeZedfddZefddZdd Zd d! Z  ZS )#StreamingBodya&  Wrapper class for an http response body.

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

        * Auto validation of content length, if the amount of bytes
          we read does not match the content length, an exception
          is raised.
    i   
raw_streamcontent_lengthc                    s    t  | |  || _d| _d S )Nr   )super__init___self_content_length_self_amount_read)selfr   r   	__class__r
   r   r       s   
zStreamingBody.__init__c                    s   | j  I d H S N)__wrapped__
__aenter__r   r
   r
   r   r   )   s   zStreamingBody.__aenter__c                    s   | j |||I d H S r   )r   	__aexit__r   exc_typeexc_valexc_tbr
   r
   r   r   ,   s   zStreamingBody.__aexit__c                 C   s
   |    S r   )at_eofr   r
   r
   r   readable1   s   
zStreamingBody.readableNc              
      s   z| j j|dur|ndI dH }W n' tjy( } zt| j j|dd}~w tjj	y: } zt
|dd}~ww |  jt|7  _|du sN|sR|dkrR|   |S )zhRead at most amt bytes from the stream.

        If the amt argument is omitted, read all data.
        Nendpoint_urlerrorr$   r   )r   contentreadasyncioTimeoutErrorr   urlaiohttpclient_exceptionsClientConnectionErrorr   r   len_verify_content_length)r   amtchunker
   r
   r   r'   4   s$   
zStreamingBody.readbc              
      s   z| j jt|I dH }t|}||d|< W n' tjy. } zt| j j|dd}~w tj	j
y@ } zt|dd}~ww |  j|7  _|dkrVt|dkrV|   |S )zcRead bytes into a pre-allocated, writable bytes-like object b, and return the number of bytes read.Nr"   r%   r   )r   r&   r'   r.   r(   r)   r   r*   r+   r,   r-   r   r   r/   )r   r3   r1   amount_readr2   r
   r
   r   readintoM   s$   
zStreamingBody.readintoc                    s   dd |   2 I d H }|S )Nc                    s   g | z3 d H W }|q6 S r   r
   ).0liner
   r
   r   
<listcomp>e   s    z+StreamingBody.readlines.<locals>.<listcomp>)
iter_lines)r   linesr
   r
   r   	readlinesc   s   zStreamingBody.readlinesc                 C   s   |  | jS )z:Return an iterator to yield 1k chunks from the raw stream.)iter_chunks_DEFAULT_CHUNK_SIZEr   r
   r
   r   	__aiter__h   s   zStreamingBody.__aiter__c                    s    |  | jI dH }|r|S t)z-Return the next 1k chunk from the raw stream.N)r'   r=   StopAsyncIteration)r   current_chunkr
   r
   r   	__anext__l   s
   zStreamingBody.__anext__Fc                 C  st   d}|  |2 z"3 dH W }|| d}|dd D ]
}||d V  q|d }q6 |r8||d V  dS dS )zReturn 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.
            NTr!   r   )r<   
splitlines)r   
chunk_sizekeependspendingr1   r:   r7   r
   r
   r   r9   u   s   
zStreamingBody.iter_linesc                 C  s(   	 |  |I dH }|dkrdS |V  q)z\Return an iterator to yield chunks of chunk_size bytes from the raw
        stream.
        TNrB   )r'   )r   rD   r@   r
   r
   r   r<      s   zStreamingBody.iter_chunksc                 C   s6   | j d ur| jt| j krt| jt| j dd S d S )N)actual_bytesexpected_bytes)r   r   intr   r   r
   r
   r   r/      s   
z$StreamingBody._verify_content_lengthc                 C   s   | j S r   )r   r   r
   r
   r   tell   s   zStreamingBody.tellr   )r   r   r	   __doc__r=   r+   ClientResponsestrr   r   r   r    r'   	bytearrayr5   r;   r>   rA   anextr9   r<   r/   rJ   __classcell__r
   r
   r   r   r      s*    
	

r   c                   @   s&   e Zd ZdddZdd Zdd ZdS )	HttpxStreamingBodyNc                    s"   |d ur	t d| j I d H S )NzHhttpx.Response.aread does not support reading a specific number of bytes)
ValueErrorr   aread)r   r0   r
   r
   r   r'      s   zHttpxStreamingBody.readc                    s   | S r   r
   r   r
   r
   r   r      s   zHttpxStreamingBody.__aenter__c                    s   | j  I d H  d S r   )r   acloser   r
   r
   r   r      s   zHttpxStreamingBody.__aexit__r   )r   r   r	   r'   r   r   r
   r
   r
   r   rQ      s    
	rQ   c                    s   | j j}|j|jd}|d dkr|jI d H |d< n| jr,t|j|d d|d< n|jI d H |d< t	
|}||| jI d H }||fS )N)headersstatus_coderV   i,  bodyrU   zcontent-length)service_modelresolved_protocolrU   rV   r&   has_streaming_outputr   rawgetr   create_parserparseoutput_shape)operation_modelhttp_responseprotocolresponse_dictparserparsedr
   r
   r   get_response   s   

rf   )r(   r+   aiohttp.client_exceptionswraptbotocore.responser   r   r   aiobotocorer   r)   r   ObjectProxyr   rQ   rf   r
   r
   r
   r   <module>   s     