o
    ZhdQ                     @   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mZ ddlmZ ddlmZmZmZ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FinalGenericListOptionalTupleTypeVar   )BaseProtocol)BaseTimerContext	TimerNoopset_exception
set_result)internal_logger)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   F/var/www/html/lang_env/lib/python3.10/site-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)   r0   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#   r2   r   r   r   r$   5   r%   z&ChunkTupleAsyncStreamIterator.__init__c                 C   r'   r"   r   r(   r   r   r   r)   8   r*   z'ChunkTupleAsyncStreamIterator.__aiter__c                    s"   | j  I d H }|dkrt|S )Nr,   F)r3   	readchunkr-   r.   r   r   r   r0   ;   s
   z'ChunkTupleAsyncStreamIterator.__anext__)r2   r   r    N)r    r1   )	r   r   r   r$   r)   r	   bytesboolr0   r   r   r   r   r1   4   s    

r1   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)   C   r%   z AsyncStreamReaderMixin.__aiter__nc                    s   t  fddS )z>Returns an asynchronous iterator that yields chunks of size n.c                      s
     S r"   )readr   r;   r#   r   r   <lambda>H   s   
 z5AsyncStreamReaderMixin.iter_chunked.<locals>.<lambda>)r   r#   r;   r   r=   r   iter_chunkedF   s   z#AsyncStreamReaderMixin.iter_chunkedc                 C   r9   )z3Yield all available data as soon as it is received.)r   readanyr(   r   r   r   iter_anyJ   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.
        )r1   r(   r   r   r   iter_chunksN   s   z"AsyncStreamReaderMixin.iter_chunksN)r   r   r   r   r6   r)   intr@   rB   r1   rC   r   r   r   r   r8   B   s
    r8   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limitrE   rF   r    c                C   s   || _ || _|d | _|d u rt }|| _d| _d| _d | _t	
 | _d| _d| _d | _d | _d | _|d u r:t n|| _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
_exceptionr   _timer_eof_callbacks)r#   rG   rH   rE   rF   r   r   r   r$   g   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=%r<%s> )
	__class__r   rP   appendrW   rK   rL   rX   rZ   join)r#   infor   r   r   __repr__   s   


zStreamReader.__repr__c                 C   s   | j | jfS r"   )rK   rL   r(   r   r   r   get_read_buffer_limits      z#StreamReader.get_read_buffer_limitsc                 C      | j S r"   rZ   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"   )rZ   r\   clearrX   r   rY   r#   rk   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)rW   	Exceptionr   ri   r\   ra   r#   ro   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 )NTrq   )	rW   rX   r   rY   r\   rr   r   ri   rl   )r#   rn   cbr   r   r   feed_eof   s    



zStreamReader.feed_eofc                 C   rg   )z&Return True if  'feed_eof' was called.rW   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.rW   rU   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"   )rW   rY   rO   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)rI   )
stacklevelNr   )
warningswarnDeprecationWarningrV   rU   rP   lenrQ   
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)rW   rP   r   rU   ra   total_bytesrX   r   rL   rJ   _reading_pausedpause_readingr#   r~   r   rn   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)rR   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   )rR   r   r   ra   rX   r   )r#   posrn   r   r   r   end_http_chunk_receiving  s   


z%StreamReader.end_http_chunk_receiving	func_namec                    sz   | j d urtd| | j  }| _ z$| j |I d H  W d    n1 s(w   Y  W d | _ d S W d | _ d S d | _ w )NzH%s() called while another coroutine is already waiting for incoming data)rX   r   rO   r|   r[   )r#   r   rn   r   r   r   _wait   s   

zStreamReader._waitc                    s   |   I d H S r"   )	readuntilr(   r   r   r   r:   2  s   zStreamReader.readline   
	separatorc           	         s   t |}|dkrtd| jd ur| jd}d}d}|rm| jr[|r[| j}| jd ||d }| |r<|| | d nd}||7 }|t |7 }|rMd}|| jkrVtd| jr[|s"| jra	 |S |rk| 	d	I d H  |s|S )
Nr   z,Separator should be at least one-byte stringr,   Tr   r   FzChunk too bigr   )
r   
ValueErrorrZ   rU   rV   find_read_nowait_chunkrL   rW   r   )	r#   r   seplenchunk
chunk_sizeZ
not_enoughoffsetZicharr~   r   r   r   r   5  s<   



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<   )rZ   rW   rU   getattrr   r   warningrA   ra   rb   r   _read_nowait)r#   r;   blocksblockr   r   r   r<   Y  s4   




zStreamReader.readc                    sD   | j d ur	| j | js| js| dI d H  | js| jr| dS )NrA   r   )rZ   rU   rW   r   r   r(   r   r   r   rA     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   Fr4   r5   )rZ   rR   poprQ   r   r   r   rU   r   rW   r   )r#   r   r   r   r   r5     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,   )rZ   r<   rb   rM   IncompleteReadErrorr   ra   )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.)rZ   rX   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   )rU   rV   r   popleftrP   rQ   rR   r   rK   rJ   r   resume_reading)r#   r;   Zfirst_bufferr   r~   Zchunk_splitsr   r   r   r     s&   




zStreamReader._read_nowait_chunkc                 C   s^   | j   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,   )r[   Zassert_timeoutrU   r   ra   r   rb   )r#   r;   chunksr   r   r   r   r     s   


zStreamReader._read_nowaitr    Nr   )r   r   ))r   r   r   r   r   r   rD   r   r   rM   AbstractEventLoopr$   strrd   r	   re   BaseExceptionri   r   r   rt   rv   r7   rx   r{   r}   r6   r   r   r   r   r   r:   r   r<   rA   r5   r   r   r   r   r   r   r   r   r   W   sN    

	


$*"r   c                   @   s  e Zd Zd)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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   s
   d| _ d S )NFZ_read_eof_chunkr(   r   r   r   r$     r%   zEmptyStreamReader.__init__c                 C   s   d| j j S )Nr^   )r`   r   r(   r   r   r   rd     rf   zEmptyStreamReader.__repr__c                 C      d S r"   r   r(   r   r   r   ri     r*   zEmptyStreamReader.exceptionrk   c                 C   r   r"   r   )r#   rk   r   r   r   r     r*   zEmptyStreamReader.set_exceptionro   c                 C   s,   z|  W d S  t y   td Y d S w rp   )rr   r   ri   rs   r   r   r   rt     s
   zEmptyStreamReader.on_eofc                 C   r   r"   r   r(   r   r   r   rv     r*   zEmptyStreamReader.feed_eofc                 C      dS NTr   r(   r   r   r   rx     r*   zEmptyStreamReader.is_eofc                 C   r   r   r   r(   r   r   r   r{     r*   zEmptyStreamReader.at_eofc                    s   d S r"   r   r(   r   r   r   r}        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   r:     r   zEmptyStreamReader.readliner   c                    r   r+   r   r?   r   r   r   r<     r   zEmptyStreamReader.readc                    r   r+   r   r(   r   r   r   rA   $  r   zEmptyStreamReader.readanyc                    s   | j s	d| _ dS dS )NTr4   r   r   r(   r   r   r   r5   '  s
   zEmptyStreamReader.readchunkc                    s   t d|r+   )rM   r   r?   r   r   r   r   .  s   zEmptyStreamReader.readexactlyc                 C   r   r+   r   r?   r   r   r   r   1  r*   zEmptyStreamReader.read_nowaitr   r   r   )r   r   r   r$   r   rd   r   r   ri   r   r   rt   rv   r7   rx   r{   r}   r6   rD   r   r:   r<   rA   r	   r5   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.rF   r    Nc                 C   s,   || _ d| _d | _d | _d| _t | _d S )NFr   )rO   rW   rX   rZ   rP   rS   rT   rU   )r#   rF   r   r   r   r$   ;  s   zDataQueue.__init__c                 C   r9   r"   )r   rU   r(   r   r   r   __len__C  r%   zDataQueue.__len__c                 C   rg   r"   rw   r(   r   r   r   rx   F  rj   zDataQueue.is_eofc                 C   ry   r"   rz   r(   r   r   r   r{   I  s   zDataQueue.at_eofc                 C   rg   r"   rh   r(   r   r   r   ri   L  rj   zDataQueue.exceptionrk   c                 C   s2   d| _ || _| j}|d urd | _t|| d S d S r   )rW   rZ   rX   r   rm   r   r   r   r   O  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"   )rP   rU   ra   rX   r   r   r   r   r   r   X  s   zDataQueue.feed_datac                 C   s,   d| _ | j}|d urd | _t|d  d S d S r   )rW   rX   r   )r#   rn   r   r   r   rv   a  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"   )rU   rW   rX   rO   r|   rM   CancelledErrorTimeoutErrorr   rP   rZ   r   r#   r~   r   r   r   r   r<   i  s"   

zDataQueue.readc                 C   r9   r"   )r   r<   r(   r   r   r   r)   }  r%   zDataQueue.__aiter__r   r   )r   r   r   r   rM   r   r$   rD   r   r7   rx   r{   r   r   ri   r   r   r   rv   r<   r   r)   r   r   r   r   r   8  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.
    rG   rH   rF   r    Nc                   s"   t  j|d || _|d | _d S )N)rF   rI   )superr$   rJ   _limit)r#   rG   rH   rF   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   rP   r   rJ   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<   rP   r   rJ   r   r   r(   r   r   r   r<     s   zFlowControlDataQueue.readr   )r   r   r   r   r   rD   rM   r   r$   r   r   r<   __classcell__r   r   r   r   r     s    r   )#rM   rS   r   typingr   r   r   r   r   r   r   r	   r
   Zbase_protocolr   helpersr   r   r   r   logr   __all__r   rr   r   r   r1   r8   r   r   r   __annotations__r   r   r   r   r   r   <module>   s*   
 ,   &;I