a
    }3eQ                     @   s$  U d dl Z d dlZd dlZd dlmZmZmZmZmZm	Z	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 dZed	ZG d
d deZG dd dee ZG dd dZG dd dZG dd deZG dd deZe Zee e d< G dd dee Z!G dd de!e Z"dS )    N)	AwaitableCallableDequeGenericListOptionalTupleTypeVar   )BaseProtocol)BaseTimerContextset_exception
set_result)internal_logger)Final)EMPTY_PAYLOAD	EofStreamStreamReader	DataQueueFlowControlDataQueue_Tc                   @   s   e Zd ZdZdS )r   zeof stream indication.N)__name__
__module____qualname____doc__ r   r   B/home/pi/bot/my_env/lib/python3.9/site-packages/aiohttp/streams.pyr      s   r   c                   @   sD   e Zd Zeg ee f ddddZddddZedd	d
ZdS )AsyncStreamIteratorN)	read_funcreturnc                 C   s
   || _ d S N)r   )selfr   r   r   r   __init__   s    zAsyncStreamIterator.__init__zAsyncStreamIterator[_T]r   c                 C   s   | S r    r   r!   r   r   r   	__aiter__   s    zAsyncStreamIterator.__aiter__c                    s:   z|   I d H }W n ty(   tY n0 |dkr6t|S N    )r   r   StopAsyncIterationr!   rvr   r   r   	__anext__!   s    
zAsyncStreamIterator.__anext__)	r   r   r   r   r   r   r"   r%   r+   r   r   r   r   r      s   r   c                   @   s@   e Zd ZdddddZd dddZeeef dd	d
ZdS )ChunkTupleAsyncStreamIteratorr   N)streamr   c                 C   s
   || _ d S r    )_stream)r!   r-   r   r   r   r"   ,   s    z&ChunkTupleAsyncStreamIterator.__init__r#   c                 C   s   | S r    r   r$   r   r   r   r%   /   s    z'ChunkTupleAsyncStreamIterator.__aiter__c                    s    | j  I d H }|dkrt|S )Nr'   F)r.   	readchunkr(   r)   r   r   r   r+   2   s    z'ChunkTupleAsyncStreamIterator.__anext__)	r   r   r   r"   r%   r   bytesboolr+   r   r   r   r   r,   +   s   r,   c                   @   sR   e Zd Zee dddZeee dddZee dddZe	dd	d
Z
dS )AsyncStreamReaderMixinr#   c                 C   s
   t | jS r    )r   readliner$   r   r   r   r%   :   s    z AsyncStreamReaderMixin.__aiter__nr   c                    s   t  fddS )zzReturns an asynchronous iterator that yields chunks of size n.

        Python-3.5 available for Python 3.5+ only
        c                      s
     S r    )readr   r6   r!   r   r   <lambda>C   r'   z5AsyncStreamReaderMixin.iter_chunked.<locals>.<lambda>)r   r!   r6   r   r8   r   iter_chunked=   s    z#AsyncStreamReaderMixin.iter_chunkedc                 C   s
   t | jS )zoYield all available data as soon as it is received.

        Python-3.5 available for Python 3.5+ only
        )r   readanyr$   r   r   r   iter_anyF   s    zAsyncStreamReaderMixin.iter_anyc                 C   s   t | S )zYield chunks of data as they are received by the server.

        The yielded objects are tuples
        of (bytes, bool) as returned by the StreamReader.readchunk method.

        Python-3.5 available for Python 3.5+ only
        )r,   r$   r   r   r   iter_chunksM   s    z"AsyncStreamReaderMixin.iter_chunksN)r   r   r   r   r1   r%   intr;   r=   r,   r>   r   r   r   r   r3   9   s   	r3   c                   @   s  e Zd ZdZdZdddeeee ee	j
 ddddZedd	d
Zeeef dddZee dddZeddddZeg df ddddZddddZedddZedddZddddZeddddZd@eedd d!d"Zddd#d$Zddd%d&Zedd'd(d)Zedd*d+Z dAeed-d.d/Z!dBeed1d2d3Z"edd4d5Z#eeef dd6d7Z$eed1d8d9Z%dCeed1d:d;Z&eed1d<d=Z'eed1d>d?Z(dS )Dr   a*  An enhancement of asyncio.StreamReader.

    Supports asynchronous iteration by line, chunk or as available::

        async for line in reader:
            ...
        async for chunk in reader.iter_chunked(1024):
            ...
        async for slice in reader.iter_any():
            ...

    r   N)timerloop)protocollimitr@   rA   r   c                C   sv   || _ || _|d | _|d u r&t }|| _d| _d| _d | _t	
 | _d| _d| _d | _d | _d | _|| _g | _d S )N   r   F)	_protocol
_low_water_high_waterasyncioZget_event_loop_loop_size_cursor_http_chunk_splitscollectionsdeque_buffer_buffer_offset_eof_waiter_eof_waiter
_exception_timer_eof_callbacks)r!   rB   rC   r@   rA   r   r   r   r"   h   s"    

zStreamReader.__init__r#   c                 C   s   | j jg}| jr |d| j  | jr0|d | jdkrP|d| j| jf  | jrf|d| j  | jr||d| j  dd	| S )	Nz%d byteseofi   zlow=%d high=%dzw=%rze=%rz<%s> )
	__class__r   rJ   appendrQ   rF   rG   rR   rT   join)r!   infor   r   r   __repr__   s    


zStreamReader.__repr__c                 C   s   | j | jfS r    )rF   rG   r$   r   r   r   get_read_buffer_limits   s    z#StreamReader.get_read_buffer_limitsc                 C   s   | j S r    rT   r$   r   r   r   	exception   s    zStreamReader.exceptionexcr   c                 C   sP   || _ | j  | j}|d ur.d | _t|| | j}|d urLd | _t|| d S r    )rT   rV   clearrR   r   rS   r!   rb   waiterr   r   r   r      s    

zStreamReader.set_exceptioncallbackr   c                 C   s@   | j r0z
|  W q< ty,   td Y q<0 n| j| d S NException in eof callback)rQ   	Exceptionr   r`   rV   rZ   r!   rg   r   r   r   on_eof   s    
zStreamReader.on_eofc              	   C   s   d| _ | j}|d ur$d | _t|d  | j}|d urBd | _t|d  | jD ],}z
|  W qH tyr   td Y qH0 qH| j  d S )NTri   )	rQ   rR   r   rS   rV   rj   r   r`   rc   )r!   re   cbr   r   r   feed_eof   s    



zStreamReader.feed_eofc                 C   s   | j S )z&Return True if  'feed_eof' was called.rQ   r$   r   r   r   is_eof   s    zStreamReader.is_eofc                 C   s   | j o| j S )z=Return True if the buffer is empty and 'feed_eof' was called.rQ   rO   r$   r   r   r   at_eof   s    zStreamReader.at_eofc                    sH   | j r
d S | jd u sJ | j | _z| jI d H  W d | _nd | _0 d S r    )rQ   rS   rI   create_futurer$   r   r   r   wait_eof   s    zStreamReader.wait_eof)datar   c                 C   sx   t jdtdd |sdS | jr>| jd | jd | jd< d| _|  jt|7  _|  jt|8  _| j| d| _	dS )zDrollback reading some data from stream, inserting it to buffer head.zJunread_data() is deprecated and will be removed in future releases (#3260)rD   )
stacklevelNr   )
warningswarnDeprecationWarningrP   rO   rJ   lenrK   
appendleft_eof_counter)r!   ru   r   r   r   unread_data   s    zStreamReader.unread_dataru   sizer   c                 C   s   | j rJ d|sd S |  jt|7  _| j| |  jt|7  _| j}|d urdd | _t|d  | j| jkr| j	j
s| j	  d S )Nzfeed_data after feed_eof)rQ   rJ   rz   rO   rZ   total_bytesrR   r   rG   rE   _reading_pausedpause_readingr!   ru   r   re   r   r   r   	feed_data   s    
zStreamReader.feed_datac                 C   s"   | j d u r| jrtdg | _ d S )Nz?Called begin_http_chunk_receiving whensome data was already fed)rL   r   RuntimeErrorr$   r   r   r   begin_http_chunk_receiving   s    
z'StreamReader.begin_http_chunk_receivingc                 C   sd   | j d u rtd| j r"| j d nd}| j|kr4d S | j | j | j}|d ur`d | _t|d  d S )NzFCalled end_chunk_receiving without calling begin_chunk_receiving firstr   )rL   r   r   rZ   rR   r   )r!   posre   r   r   r   end_http_chunk_receiving  s    


z%StreamReader.end_http_chunk_receiving)	func_namer   c                    s   | j d urtd| | j  }| _ zL| jr`| j |I d H  W d    qj1 sT0    Y  n
|I d H  W d | _ nd | _ 0 d S )NzH%s() called while another coroutine is already waiting for incoming data)rR   r   rI   rs   rU   )r!   r   re   r   r   r   _wait!  s    
*zStreamReader._waitc                    s   |   I d H S r    )	readuntilr$   r   r   r   r4   6  s    zStreamReader.readline   
)	separatorr   c           	         s   t |}|dkrtd| jd ur(| jd}d}d}|r| jr|r| j}| jd ||d }| |rn|| nd}||7 }|t |7 }|rd}|| jkr8tdq8| jrq|r4| 	d	I d H  q4|S )
Nr   z,Separator should be at least one-byte stringr'   Tr
   r   FzChunk too bigr   )
rz   
ValueErrorrT   rO   rP   find_read_nowait_chunkrG   rQ   r   )	r!   r   Zseplenchunk
chunk_sizeZ
not_enoughoffsetZicharru   r   r   r   r   9  s0    



zStreamReader.readuntilr   r5   c                    s   | j d ur| j | jrF| jsFt| ddd | _| jdkrFtjddd |sNdS |dk rg }|  I d H }|snqz|| qZd	|S | js| js| 
d	I d H  q| |S )
Nr|   r   r
      zEMultiple access to StreamReader in eof state, might be infinite loop.T)
stack_infor'   r7   )rT   rQ   rO   getattrr|   r   warningr<   rZ   r[   r   _read_nowait)r!   r6   blocksblockr   r   r   r7   [  s*    


zStreamReader.readc                    s8   | j d ur| j | js.| js.| dI d H  q| dS )Nr<   r   )rT   rO   rQ   r   r   r$   r   r   r   r<     s
    
zStreamReader.readanyc                    s   | j dur| j | jrZ| jd}|| jkr0dS || jkrN| || j dfS td q| jrn| ddfS | j	rxdS | 
d	I dH  q dS )
a  Returns a tuple of (data, end_of_http_chunk).

        When chunked transfer
        encoding is used, end_of_http_chunk is a boolean indicating if the end
        of the data corresponds to the end of a HTTP chunk , otherwise it is
        always False.
        Nr   r'   TTzESkipping HTTP chunk end due to data consumption beyond chunk boundaryr   Fr/   r0   )rT   rL   poprK   r   r   r   rO   r   rQ   r   )r!   r   r   r   r   r0     s     	


zStreamReader.readchunkc                    sp   | j d ur| j g }|dkrf| |I d H }|sNd|}t|t|| || |t|8 }qd|S )Nr   r'   )rT   r7   r[   rH   IncompleteReadErrorrz   rZ   )r!   r6   r   r   partialr   r   r   readexactly  s    


zStreamReader.readexactlyc                 C   s2   | j d ur| j | jr(| j s(td| |S )Nz9Called while some coroutine is waiting for incoming data.)rT   rR   doner   r   r:   r   r   r   read_nowait  s    
zStreamReader.read_nowaitc                 C   s   | j d }| j}|dkrHt|| |krH||||  }|  j|7  _n,|rj| j   ||d  }d| _n
| j  }|  jt|8  _|  jt|7  _| j}|r|d | jk r|d q| j| jk r| j	j
r| j	  |S )Nr   r   )rO   rP   rz   popleftrJ   rK   rL   r   rF   rE   r   resume_reading)r!   r6   Zfirst_bufferr   ru   Zchunk_splitsr   r   r   r     s$    



zStreamReader._read_nowait_chunkc                 C   sP   g }| j r>| |}|| |dkr|t|8 }|dkrq>q|rLd|S dS )z6Read not more than n bytes, or whole buffer if n == -1r   r   r'   )rO   r   rZ   rz   r[   )r!   r6   chunksr   r   r   r   r     s    

zStreamReader._read_nowait)r   )r   )r   )r   ))r   r   r   r   r   r   r?   r   r   rH   AbstractEventLoopr"   strr]   r   r^   BaseExceptionr`   r   r   rl   rn   r2   rp   rr   rt   r1   r}   r   r   r   r   r4   r   r7   r<   r0   r   r   r   r   r   r   r   r   r   X   sD   	"*"r   c                   @   s  e Zd ZddddZee dddZedddd	Zeg df dd
ddZ	ddddZ
edddZedddZddddZd'eeddddZedddZd(eedddZeddd Zeeef dd!d"Zeedd#d$Zd)eedd%d&ZdS )*EmptyStreamReaderNr#   c                 C   s   d S r    r   r$   r   r   r   r"     s    zEmptyStreamReader.__init__c                 C   s   d S r    r   r$   r   r   r   r`     s    zEmptyStreamReader.exceptionra   c                 C   s   d S r    r   )r!   rb   r   r   r   r     s    zEmptyStreamReader.set_exceptionrf   c                 C   s,   z
|  W n t y&   td Y n0 d S rh   )rj   r   r`   rk   r   r   r   rl     s    
zEmptyStreamReader.on_eofc                 C   s   d S r    r   r$   r   r   r   rn     s    zEmptyStreamReader.feed_eofc                 C   s   dS NTr   r$   r   r   r   rp     s    zEmptyStreamReader.is_eofc                 C   s   dS r   r   r$   r   r   r   rr     s    zEmptyStreamReader.at_eofc                    s   d S r    r   r$   r   r   r   rt     s    zEmptyStreamReader.wait_eofr   )ru   r6   r   c                 C   s   d S r    r   )r!   ru   r6   r   r   r   r     s    zEmptyStreamReader.feed_datac                    s   dS r&   r   r$   r   r   r   r4     s    zEmptyStreamReader.readliner   r5   c                    s   dS r&   r   r:   r   r   r   r7     s    zEmptyStreamReader.readc                    s   dS r&   r   r$   r   r   r   r<   "  s    zEmptyStreamReader.readanyc                    s   dS )Nr   r   r$   r   r   r   r0   %  s    zEmptyStreamReader.readchunkc                    s   t d|d S r&   )rH   r   r:   r   r   r   r   (  s    zEmptyStreamReader.readexactlyc                 C   s   dS r&   r   r:   r   r   r   r   +  s    zEmptyStreamReader.read_nowait)r   )r   )r   )r   r   r   r"   r   r   r`   r   r   rl   rn   r2   rp   rr   rt   r1   r?   r   r4   r7   r<   r   r0   r   r   r   r   r   r   r     s   r   r   c                   @   s   e Zd ZdZejddddZedddZe	dd	d
Z
e	dddZee dddZeddddZdeeddddZddddZedddZee dddZdS )r   z>DataQueue is a general-purpose blocking queue with one reader.N)rA   r   c                 C   s,   || _ d| _d | _d | _d| _t | _d S )NFr   )rI   rQ   rR   rT   rJ   rM   rN   rO   )r!   rA   r   r   r   r"   5  s    zDataQueue.__init__r#   c                 C   s
   t | jS r    )rz   rO   r$   r   r   r   __len__=  s    zDataQueue.__len__c                 C   s   | j S r    ro   r$   r   r   r   rp   @  s    zDataQueue.is_eofc                 C   s   | j o| j S r    rq   r$   r   r   r   rr   C  s    zDataQueue.at_eofc                 C   s   | j S r    r_   r$   r   r   r   r`   F  s    zDataQueue.exceptionra   c                 C   s.   d| _ || _| j}|d ur*d | _t|| d S r   )rQ   rT   rR   r   rd   r   r   r   r   I  s    zDataQueue.set_exceptionr   r~   c                 C   s@   |  j |7  _ | j||f | j}|d ur<d | _t|d  d S r    )rJ   rO   rZ   rR   r   r   r   r   r   r   R  s    zDataQueue.feed_datac                 C   s(   d| _ | j}|d ur$d | _t|d  d S r   )rQ   rR   r   )r!   re   r   r   r   rn   [  s
    zDataQueue.feed_eofc              	      s   | j sV| jsV| jrJ | j | _z| jI d H  W n" tjtjfyT   d | _ Y n0 | j r|| j  \}}|  j	|8  _	|S | j
d ur| j
ntd S r    )rO   rQ   rR   rI   rs   rH   ZCancelledErrorTimeoutErrorr   rJ   rT   r   r!   ru   r   r   r   r   r7   c  s    

zDataQueue.readc                 C   s
   t | jS r    )r   r7   r$   r   r   r   r%   w  s    zDataQueue.__aiter__)r   )r   r   r   r   rH   r   r"   r?   r   r2   rp   rr   r   r   r`   r   r   r   rn   r7   r   r%   r   r   r   r   r   2  s   		r   c                       sX   e Zd ZdZeeejdd fddZde	edd fdd	Z
e	d
 fddZ  ZS )r   zlFlowControlDataQueue resumes and pauses an underlying stream.

    It is a destination for parsed data.
    N)rB   rC   rA   r   c                   s"   t  j|d || _|d | _d S )N)rA   rD   )superr"   rE   _limit)r!   rB   rC   rA   rY   r   r   r"     s    zFlowControlDataQueue.__init__r   r~   c                    s0   t  || | j| jkr,| jjs,| j  d S r    )r   r   rJ   r   rE   r   r   r   r   r   r   r     s    zFlowControlDataQueue.feed_datar#   c                    sX   z2t   I d H W | j| jk r0| jjr0| j  S n | j| jk rR| jjrR| j  0 d S r    )r   r7   rJ   r   rE   r   r   r$   r   r   r   r7     s    
 zFlowControlDataQueue.read)r   )r   r   r   r   r   r?   rH   r   r"   r   r   r7   __classcell__r   r   r   r   r   {  s   r   )#rH   rM   rw   typingr   r   r   r   r   r   r   r	   Zbase_protocolr   Zhelpersr   r   r   logr   Ztypedefsr   __all__r   rj   r   r   r,   r3   r   r   r   __annotations__r   r   r   r   r   r   <module>   s*   
(   &4I