o
    n~bhQ                     @   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   :/usr/local/lib/python3.10/dist-packages/aiohttp/streams.pyr      s    r   c                   @   sB   e Zd Zdeg ee f ddfddZdddZdefd	d
ZdS )AsyncStreamIterator	read_funcreturnNc                 C   
   || _ d S N)r   )selfr   r   r   r   __init__      
zAsyncStreamIterator.__init__AsyncStreamIterator[_T]c                 C      | S r!   r   r"   r   r   r   	__aiter__      zAsyncStreamIterator.__aiter__c                    s8   z	|   I d H }W n	 ty   tw |dkrt|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   r   r      s    
r   c                   @   s6   e Zd ZdddZdddZdeeef fd	d
ZdS )ChunkTupleAsyncStreamIteratorstreamr   r   Nc                 C   r    r!   )_stream)r"   r1   r   r   r   r#   ,   r$   z&ChunkTupleAsyncStreamIterator.__init__c                 C   r&   r!   r   r'   r   r   r   r(   /   r)   z'ChunkTupleAsyncStreamIterator.__aiter__c                    s"   | j  I d H }|dkrt|S )Nr+   F)r2   	readchunkr,   r-   r   r   r   r/   2   s
   z'ChunkTupleAsyncStreamIterator.__anext__)r1   r   r   N)r   r0   )	r   r   r   r#   r(   r   bytesboolr/   r   r   r   r   r0   +   s    

r0   c                   @   sT   e Zd Zdee fddZdedee fddZdee fddZde	fd	d
Z
dS )AsyncStreamReaderMixinr   c                 C   
   t | jS r!   )r   readliner'   r   r   r   r(   :   r$   z AsyncStreamReaderMixin.__aiter__nc                    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   r:   r"   r   r   <lambda>C   s   
 z5AsyncStreamReaderMixin.iter_chunked.<locals>.<lambda>)r   r"   r:   r   r<   r   iter_chunked=   s   z#AsyncStreamReaderMixin.iter_chunkedc                 C   r8   )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
        )r0   r'   r   r   r   iter_chunksM   s   z"AsyncStreamReaderMixin.iter_chunksN)r   r   r   r   r5   r(   intr?   rA   r0   rB   r   r   r   r   r7   9   s
    	r7   c                   @   s  e Zd ZdZdZddddededee dee	j
 d	df
d
dZd	efddZd	eeef fddZd	ee fddZded	dfddZdeg df d	dfddZdCddZd	efddZd	efddZdCddZd ed	dfd!d"ZdDd ed#ed	dfd$d%ZdCd&d'ZdCd(d)Zd*ed	dfd+d,Zd	efd-d.Z dEd0ed	efd1d2Z!dFd4ed	efd5d6Z"d	efd7d8Z#d	eeef fd9d:Z$d4ed	efd;d<Z%dFd4ed	efd=d>Z&d4ed	efd?d@Z'd4ed	efdAdBZ(dS )Gr   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limitrD   rE   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asyncioget_event_loop_loop_size_cursor_http_chunk_splitscollectionsdeque_buffer_buffer_offset_eof_waiter_eof_waiter
_exception_timer_eof_callbacks)r"   rF   rG   rD   rE   r   r   r   r#   h   s"   


zStreamReader.__init__c                 C   s   | j jg}| jr|d| j  | jr|d | jdkr(|d| j| jf  | jr3|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   rO   appendrV   rJ   rK   rW   rY   join)r"   infor   r   r   __repr__   s   


zStreamReader.__repr__c                 C   s   | j | jfS r!   )rJ   rK   r'   r   r   r   get_read_buffer_limits   s   z#StreamReader.get_read_buffer_limitsc                 C      | j S r!   rY   r'   r   r   r   	exception      zStreamReader.exceptionexcc                 C   sT   || _ | j  | j}|d urd | _t|| | j}|d ur(d | _t|| d S d S r!   )rY   r[   clearrW   r   rX   r"   rh   waiterr   r   r   r      s   

zStreamReader.set_exceptioncallbackc                 C   sB   | j rz|  W d S  ty   td Y d S w | j| d S NException in eof callback)rV   	Exceptionr   rf   r[   r_   r"   rl   r   r   r   on_eof   s   zStreamReader.on_eofc              	   C   s   d| _ | j}|d urd | _t|d  | j}|d ur!d | _t|d  | jD ]}z|  W q$ ty9   td Y q$w | j  d S )NTrn   )	rV   rW   r   rX   r[   ro   r   rf   ri   )r"   rk   cbr   r   r   feed_eof   s    



zStreamReader.feed_eofc                 C   rd   )z&Return True if  'feed_eof' was called.rV   r'   r   r   r   is_eof   s   zStreamReader.is_eofc                 C      | j o| j S )z=Return True if the buffer is empty and 'feed_eof' was called.rV   rT   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 | _d S d | _w r!   )rV   rX   rN   create_futurer'   r   r   r   wait_eof   s   zStreamReader.wait_eofdatac                 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)rH   )
stacklevelNr   )
warningswarnDeprecationWarningrU   rT   rO   lenrP   
appendleft_eof_counter)r"   r{   r   r   r   unread_data   s   
zStreamReader.unread_datasizec                 C   s   | j rJ d|sd S |  jt|7  _| j| |  jt|7  _| j}|d ur2d | _t|d  | j| jkrC| j	j
sE| j	  d S d S d S )Nzfeed_data after feed_eof)rV   rO   r   rT   r_   total_bytesrW   r   rK   rI   _reading_pausedpause_readingr"   r{   r   rk   r   r   r   	feed_data   s   
zStreamReader.feed_datac                 C   s&   | j d u r| jrtdg | _ d S d S )Nz?Called begin_http_chunk_receiving whensome data was already fed)rQ   r   RuntimeErrorr'   r   r   r   begin_http_chunk_receiving   s   

z'StreamReader.begin_http_chunk_receivingc                 C   sh   | j d u r	td| j r| j d nd}| j|krd S | j | j | j}|d ur2d | _t|d  d S d S )NzFCalled end_chunk_receiving without calling begin_chunk_receiving firstr   )rQ   r   r   r_   rW   r   )r"   posrk   r   r   r   end_http_chunk_receiving  s   


z%StreamReader.end_http_chunk_receiving	func_namec                    s   | j d urtd| | j  }| _ z-| jr1| j |I d H  W d    n1 s+w   Y  n|I d H  W d | _ d S W d | _ d S d | _ w )NzH%s() called while another coroutine is already waiting for incoming data)rW   r   rN   ry   rZ   )r"   r   rk   r   r   r   _wait!  s$   

 zStreamReader._waitc                    s   |   I d H S r!   )	readuntilr'   r   r   r   r9   6  s   zStreamReader.readline   
	separatorc           	         s   t |}|dkrtd| jd ur| jd}d}d}|ri| jrW|rW| j}| jd ||d }| |r8|| nd}||7 }|t |7 }|rId}|| jkrRtd| jrW|s"| jr]	 |S |rg| 	d	I d H  |s|S )
Nr   z,Separator should be at least one-byte stringr+   Tr
   r   FzChunk too bigr   )
r   
ValueErrorrY   rT   rU   find_read_nowait_chunkrK   rV   r   )	r"   r   seplenchunk
chunk_sizeZ
not_enoughoffsetZicharr{   r   r   r   r   9  s8   



zStreamReader.readuntilr   r:   c                    s   | j d ur	| j 	 | jr%| js%t| ddd | _| jdkr%tjddd |s)dS |dk rEg }	 |  I d H }|s:n|| q0d	|S | jsY| jsY| 
d	I d H  | jsY| jrK| |S )
NTr   r   r
      zEMultiple access to StreamReader in eof state, might be infinite loop.)
stack_infor+   r;   )rY   rV   rT   getattrr   r   warningr@   r_   r`   r   _read_nowait)r"   r:   blocksblockr   r   r   r;   [  s4   




zStreamReader.readc                    sD   | j d ur	| j | js| js| dI d H  | js| jr| dS )Nr@   r   )rY   rT   rV   r   r   r'   r   r   r   r@     s   

zStreamReader.readanyc                    s   	 | j dur
| j | jr1| jd}|| jkrdS || jkr)| || j dfS td | js| jr;| ddfS | j	r@dS | 
d	I dH  q)
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.
        TNr   r+   TzESkipping HTTP chunk end due to data consumption beyond chunk boundaryr   Fr3   r4   )rY   rQ   poprP   r   r   r   rT   r   rV   r   )r"   r   r   r   r   r4     s(   


zStreamReader.readchunkc                    sx   | j d ur	| j g }|dkr7| |I d H }|s(d|}t|t|| || |t|8 }|dksd|S )Nr   r+   )rY   r;   r`   rL   IncompleteReadErrorr   r_   )r"   r:   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.)rY   rW   doner   r   r>   r   r   r   read_nowait  s   

zStreamReader.read_nowaitc                 C   s   | j d }| j}|dkr$t|| |kr$||||  }|  j|7  _n|r5| j   ||d  }d| _n| j  }|  jt|8  _|  jt|7  _| j}|rf|d | jk rf|d |rf|d | jk sX| j| jk ru| j	j
ru| j	  |S )Nr   r   )rT   rU   r   popleftrO   rP   rQ   r   rJ   rI   r   resume_reading)r"   r:   Zfirst_bufferr   r{   Zchunk_splitsr   r   r   r     s&   




zStreamReader._read_nowait_chunkc                 C   sT   g }| j r!| |}|| |dkr|t|8 }|dkrn| j s|r(d|S dS )z6Read not more than n bytes, or whole buffer if n == -1r   r   r+   )rT   r   r_   r   r`   )r"   r:   chunksr   r   r   r   r     s   

zStreamReader._read_nowaitr   Nr   )r   r   ))r   r   r   r   r   r   rC   r   r   rL   AbstractEventLoopr#   strrb   r   rc   BaseExceptionrf   r   r   rq   rs   r6   ru   rx   rz   r5   r   r   r   r   r   r9   r   r;   r@   r4   r   r   r   r   r   r   r   r   r   X   sN    

	


"*"r   c                   @   s  e Zd Zd'ddZdee fddZdeddfdd	Zd
eg df ddfddZ	d'ddZ
defddZdefddZd'ddZd(dededdfddZdefddZd)dedefddZdefdd Zdeeef fd!d"Zdedefd#d$Zd)dedefd%d&ZdS )*EmptyStreamReaderr   Nc                 C      d S r!   r   r'   r   r   r   r#     r)   zEmptyStreamReader.__init__c                 C   r   r!   r   r'   r   r   r   rf     r)   zEmptyStreamReader.exceptionrh   c                 C   r   r!   r   )r"   rh   r   r   r   r     r)   zEmptyStreamReader.set_exceptionrl   c                 C   s,   z|  W d S  t y   td Y d S w rm   )ro   r   rf   rp   r   r   r   rq     s
   zEmptyStreamReader.on_eofc                 C   r   r!   r   r'   r   r   r   rs     r)   zEmptyStreamReader.feed_eofc                 C      dS NTr   r'   r   r   r   ru     r)   zEmptyStreamReader.is_eofc                 C   r   r   r   r'   r   r   r   rx     r)   zEmptyStreamReader.at_eofc                    s   d S r!   r   r'   r   r   r   rz        zEmptyStreamReader.wait_eofr   r{   r:   c                 C   r   r!   r   )r"   r{   r:   r   r   r   r     r)   zEmptyStreamReader.feed_datac                       dS r*   r   r'   r   r   r   r9     r   zEmptyStreamReader.readliner   c                    r   r*   r   r>   r   r   r   r;     r   zEmptyStreamReader.readc                    r   r*   r   r'   r   r   r   r@   "  r   zEmptyStreamReader.readanyc                    r   )Nr   r   r'   r   r   r   r4   %  r   zEmptyStreamReader.readchunkc                    s   t d|r*   )rL   r   r>   r   r   r   r   (  s   zEmptyStreamReader.readexactlyc                 C   r   r*   r   r>   r   r   r   r   +  r)   zEmptyStreamReader.read_nowaitr   r   r   )r   r   r   r#   r   r   rf   r   r   rq   rs   r6   ru   rx   rz   r5   rC   r   r9   r;   r@   r   r4   r   r   r   r   r   r   r     s     


r   r   c                   @   s   e Zd ZdZdejddfddZdefddZde	fd	d
Z
de	fddZdee fddZdeddfddZddededdfddZdddZdefddZdee fddZdS )r   z>DataQueue is a general-purpose blocking queue with one reader.rE   r   Nc                 C   s,   || _ d| _d | _d | _d| _t | _d S )NFr   )rN   rV   rW   rY   rO   rR   rS   rT   )r"   rE   r   r   r   r#   5  s   zDataQueue.__init__c                 C   r8   r!   )r   rT   r'   r   r   r   __len__=  r$   zDataQueue.__len__c                 C   rd   r!   rt   r'   r   r   r   ru   @  rg   zDataQueue.is_eofc                 C   rv   r!   rw   r'   r   r   r   rx   C  s   zDataQueue.at_eofc                 C   rd   r!   re   r'   r   r   r   rf   F  rg   zDataQueue.exceptionrh   c                 C   s2   d| _ || _| j}|d urd | _t|| d S d S r   )rV   rY   rW   r   rj   r   r   r   r   I  s   zDataQueue.set_exceptionr   r{   r   c                 C   sD   |  j |7  _ | j||f | j}|d ur d | _t|d  d S d S r!   )rO   rT   r_   rW   r   r   r   r   r   r   R  s   zDataQueue.feed_datac                 C   s,   d| _ | j}|d urd | _t|d  d S d S r   )rV   rW   r   )r"   rk   r   r   r   rs   [  s   zDataQueue.feed_eofc              	      s   | j s*| js*| jrJ | j | _z| jI d H  W n tjtjfy)   d | _ w | j r=| j  \}}|  j	|8  _	|S | j
d urE| j
tr!   )rT   rV   rW   rN   ry   rL   CancelledErrorTimeoutErrorr   rO   rY   r   r"   r{   r   r   r   r   r;   c  s"   

zDataQueue.readc                 C   r8   r!   )r   r;   r'   r   r   r   r(   w  r$   zDataQueue.__aiter__r   r   )r   r   r   r   rL   r   r#   rC   r   r6   ru   rx   r   r   rf   r   r   r   rs   r;   r   r(   r   r   r   r   r   2  s    	
	r   c                       sb   e Zd ZdZdededejddf fddZdd
e	deddf fddZ
de	f fddZ  ZS )r   zlFlowControlDataQueue resumes and pauses an underlying stream.

    It is a destination for parsed data.
    rF   rG   rE   r   Nc                   s"   t  j|d || _|d | _d S )N)rE   rH   )superr#   rI   _limit)r"   rF   rG   rE   r^   r   r   r#     s   zFlowControlDataQueue.__init__r   r{   r   c                    s8   t  || | j| jkr| jjs| j  d S d S d S r!   )r   r   rO   r   rI   r   r   r   r   r   r   r     s   zFlowControlDataQueue.feed_datac                    s\   zt   I d H W | j| jk r| jjr| j  S S S | j| jk r,| jjr-| j  w w w r!   )r   r;   rO   r   rI   r   r   r'   r   r   r   r;     s   zFlowControlDataQueue.readr   )r   r   r   r   r   rC   rL   r   r#   r   r   r;   __classcell__r   r   r   r   r   {  s    r   )#rL   rR   r}   typingr   r   r   r   r   r   r   r	   Zbase_protocolr   helpersr   r   r   logr   Ztypedefsr   __all__r   ro   r   r   r0   r7   r   r   r   __annotations__r   r   r   r   r   r   <module>   s,   
 (   &4I