o
     JAfd                     @   s&  d Z ddlZddlZddlZddlZddlZeedre d7 Z ddlmZ ddlm	Z	 ddlm
Z
 dd	lmZ dd
lmZ ddlmZ ddlmZ dZdedddZdedddZeedrpd edddZd edddZG dd dejZG dd deejZG dd dZG dd dZdS )!)StreamReaderStreamWriterStreamReaderProtocolopen_connectionstart_server    NAF_UNIX)open_unix_connectionstart_unix_server   )
coroutines)events)
exceptions)format_helpers)	protocols)logger)sleepi   )limitc          	         sb   	 t  }t||d}t||d |j fdd| |fi |I d H \}}t| ||}||fS )Nr   loopr   c                          S N r   protocolr   &/usr/lib/python3.10/asyncio/streams.py<lambda>1       z!open_connection.<locals>.<lambda>)r   get_running_loopr   r   create_connectionr   )	hostportr   kwdsr   reader	transport_writerr   r   r   r      s   r   c                   s8   	 t   fdd}j|||fi |I d H S )Nc                        t d} t|  d}|S Nr   r   r   r   r#   r   client_connected_cbr   r   r   r   factoryO   
   zstart_server.<locals>.factory)r   r   create_server)r,   r    r!   r   r"   r-   r   r+   r   r   6   s
   r   c                   s`   	 t  }t||d}t||d |j fdd| fi |I d H \}}t| ||}||fS )Nr   r   c                      r   r   r   r   r   r   r   r   c   r   z&open_unix_connection.<locals>.<lambda>)r   r   r   r   Zcreate_unix_connectionr   )pathr   r"   r   r#   r$   r%   r&   r   r   r   r   [   s   r   c                   s6   	 t   fdd}j||fi |I d H S )Nc                     r'   r(   r)   r*   r+   r   r   r-   l   r.   z"start_unix_server.<locals>.factory)r   r   Zcreate_unix_server)r,   r0   r   r"   r-   r   r+   r   r	   g   s
   r	   c                   @   s@   e Zd Z	 dddZdd Zdd Zdd	 Zd
d Zdd ZdS )FlowControlMixinNc                 C   s8   |d u rt jdd| _n|| _d| _t | _d| _d S )N   )
stacklevelF)r   _get_event_loop_loop_pausedcollectionsdeque_drain_waiters_connection_lost)selfr   r   r   r   __init__   s   

zFlowControlMixin.__init__c                 C   s$   d| _ | j rtd|  d S d S )NTz%r pauses writing)r6   r5   	get_debugr   debugr;   r   r   r   pause_writing   s   
zFlowControlMixin.pause_writingc                 C   s>   d| _ | j rtd|  | jD ]}| s|d  qd S )NFz%r resumes writing)r6   r5   r=   r   r>   r9   done
set_resultr;   waiterr   r   r   resume_writing   s   


zFlowControlMixin.resume_writingc                 C   sF   d| _ | jsd S | jD ]}| s |d u r|d  q|| qd S NT)r:   r6   r9   rA   rB   set_exceptionr;   excrD   r   r   r   connection_lost   s   

z FlowControlMixin.connection_lostc              	      s\   | j rtd| jsd S | j }| j| z|I d H  W | j| d S | j| w )NzConnection lost)r:   ConnectionResetErrorr6   r5   create_futurer9   appendremoverC   r   r   r   _drain_helper   s   
zFlowControlMixin._drain_helperc                 C   s   t r   )NotImplementedErrorr;   streamr   r   r   _get_close_waiter      z"FlowControlMixin._get_close_waiterr   )	__name__
__module____qualname__r<   r@   rE   rJ   rO   rS   r   r   r   r   r1   u   s    
		
r1   c                       sd   e Zd Z	 dZd fdd	Zedd Zdd Z fdd	Zd
d Z	dd Z
dd Zdd Z  ZS )r   Nc                    st   t  j|d |d urt|| _|j| _nd | _|d ur || _d| _d | _d | _	d | _
|| _d| _| j | _d S )Nr   F)superr<   weakrefref_stream_reader_wr_source_traceback_strong_reader_reject_connection_stream_writer_task
_transport_client_connected_cb	_over_sslr5   rL   _closed)r;   Zstream_readerr,   r   	__class__r   r   r<      s   
zStreamReaderProtocol.__init__c                 C   s   | j d u rd S |   S r   )r[   r?   r   r   r   _stream_reader   s   
z#StreamReaderProtocol._stream_readerc                 C   s   | j rddi}| jr| j|d< | j| |  d S || _| j}|d ur*|| |dd u| _	| j
d urXt|| || j| _| 
|| j}t|rS| j|| _d | _d S d S )NmessagezpAn open stream was garbage collected prior to establishing network connection; call "stream.close()" explicitly.Zsource_tracebackZ
sslcontext)r^   r\   r5   Zcall_exception_handlerabortra   rg   set_transportget_extra_inforc   rb   r   r_   r   ZiscoroutineZcreate_taskr`   r]   )r;   r$   contextr#   resr   r   r   connection_made   s2   




z$StreamReaderProtocol.connection_madec                    s~   | j }|d ur|d u r|  n|| | j s+|d u r%| jd  n| j| t | d | _d | _	d | _
d | _d S r   )rg   feed_eofrG   rd   rA   rB   rX   rJ   r[   r_   r`   ra   )r;   rI   r#   re   r   r   rJ      s   



z$StreamReaderProtocol.connection_lostc                 C   s    | j }|d ur|| d S d S r   )rg   	feed_data)r;   datar#   r   r   r   data_received  s   z"StreamReaderProtocol.data_receivedc                 C   s$   | j }|d ur|  | jrdS dS )NFT)rg   ro   rc   )r;   r#   r   r   r   eof_received  s   z!StreamReaderProtocol.eof_receivedc                 C      | j S r   )rd   rQ   r   r   r   rS        z&StreamReaderProtocol._get_close_waiterc                 C   sD   z| j }W n
 ty   Y d S w | r| s |  d S d S d S r   )rd   AttributeErrorrA   	cancelled	exception)r;   closedr   r   r   __del__  s   
zStreamReaderProtocol.__del__NN)rU   rV   rW   r\   r<   propertyrg   rn   rJ   rr   rs   rS   rz   __classcell__r   r   re   r   r      s    
r   c                   @   st   e Zd Z	 dd Zdd Zedd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd ZdddZdd ZdS )r   c                 C   s4   || _ || _|| _|| _| j | _| jd  d S r   )ra   	_protocol_readerr5   rL   Z_complete_futrB   )r;   r$   r   r#   r   r   r   r   r<   0  s   zStreamWriter.__init__c                 C   s@   | j jd| jg}| jd ur|d| j dd|S )N
transport=zreader=<{}> )rf   rU   ra   r   rM   formatjoinr;   infor   r   r   __repr__:  s   
zStreamWriter.__repr__c                 C   rt   r   ra   r?   r   r   r   r$   @  s   zStreamWriter.transportc                 C      | j | d S r   )ra   writer;   rq   r   r   r   r   D     zStreamWriter.writec                 C   r   r   )ra   
writelinesr   r   r   r   r   G  r   zStreamWriter.writelinesc                 C   
   | j  S r   )ra   	write_eofr?   r   r   r   r   J     
zStreamWriter.write_eofc                 C   r   r   )ra   can_write_eofr?   r   r   r   r   M  r   zStreamWriter.can_write_eofc                 C   r   r   )ra   closer?   r   r   r   r   P  r   zStreamWriter.closec                 C   r   r   )ra   
is_closingr?   r   r   r   r   S  r   zStreamWriter.is_closingc                    s   | j | I d H  d S r   )r~   rS   r?   r   r   r   wait_closedV  s   zStreamWriter.wait_closedNc                 C   s   | j ||S r   )ra   rk   )r;   namedefaultr   r   r   rk   Y  s   zStreamWriter.get_extra_infoc                    sP   	 | j d ur| j  }|d ur|| j rtdI d H  | j I d H  d S )Nr   )r   rx   ra   r   r   r~   rO   )r;   rI   r   r   r   drain\  s   



zStreamWriter.drainr   )rU   rV   rW   r<   r   r|   r$   r   r   r   r   r   r   r   rk   r   r   r   r   r   r   &  s    	


r   c                   @   s   e Zd ZdZedfddZdd Zdd Zdd	 Zd
d Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zd&ddZd'ddZd d! Zd"d# Zd$d% ZdS )(r   Nc                 C   sz   |dkrt d|| _|d u rt | _n|| _t | _d| _d | _d | _	d | _
d| _| j r;ttd| _d S d S )Nr   zLimit cannot be <= 0Fr
   )
ValueError_limitr   r4   r5   	bytearray_buffer_eof_waiter
_exceptionra   r6   r=   r   extract_stacksys	_getframer\   )r;   r   r   r   r   r   r<   z  s"   

zStreamReader.__init__c                 C   s   dg}| j r|t| j  d | jr|d | jtkr'|d| j  | jr3|d| j | jr?|d| j | jrK|d| j | j	rS|d d	
d
|S )Nr   z byteseofzlimit=zwaiter=z
exception=r   Zpausedr   r   )r   rM   lenr   r   _DEFAULT_LIMITr   r   ra   r6   r   r   r   r   r   r   r     s    


zStreamReader.__repr__c                 C   rt   r   )r   r?   r   r   r   rx     ru   zStreamReader.exceptionc                 C   s8   || _ | j}|d urd | _| s|| d S d S d S r   )r   r   rw   rG   rH   r   r   r   rG     s   zStreamReader.set_exceptionc                 C   s4   	 | j }|d urd | _ | s|d  d S d S d S r   )r   rw   rB   rC   r   r   r   _wakeup_waiter  s   zStreamReader._wakeup_waiterc                 C   s
   || _ d S r   r   )r;   r$   r   r   r   rj     s   
zStreamReader.set_transportc                 C   s2   | j rt| j| jkrd| _ | j  d S d S d S )NF)r6   r   r   r   ra   resume_readingr?   r   r   r   _maybe_resume_transport  s   z$StreamReader._maybe_resume_transportc                 C   s   d| _ |   d S rF   )r   r   r?   r   r   r   ro     s   zStreamReader.feed_eofc                 C   s   	 | j o| j S r   )r   r   r?   r   r   r   at_eof  s   zStreamReader.at_eofc                 C   s   |sd S | j | |   | jd ur:| js<t| j d| j kr>z| j  W n ty4   d | _Y d S w d| _d S d S d S d S )N   T)	r   extendr   ra   r6   r   r   Zpause_readingrP   r   r   r   r   rp     s    

zStreamReader.feed_datac                    s`   	 | j d urt| d| jrd| _| j  | j | _ z| j I d H  W d | _ d S d | _ w )NzF() called while another coroutine is already waiting for incoming dataF)r   RuntimeErrorr6   ra   r   r5   rL   )r;   	func_namer   r   r   _wait_for_data  s   

zStreamReader._wait_for_datac              
      s   	 d}t |}z| |I d H }W |S  tjy) } z	|jW  Y d }~S d }~w tjyW } z"| j||jrC| jd |j| = n| j	  | 
  t|jd d }~ww )N   
r   )r   	readuntilr   IncompleteReadErrorpartialLimitOverrunErrorr   
startswithconsumedclearr   r   args)r;   sepseplenlineer   r   r   readline  s$   

zStreamReader.readliner   c                    s  	 t |}|dkrtd| jd ur| jd}	 t | j}|| |krA| j||}|dkr0n-|d | }|| jkrAtd|| jrTt	| j}| j
  t|d | dI d H  q|| jkrhtd|| jd ||  }| jd || = |   t	|S )	Nr   z,Separator should be at least one-byte stringTr
   z2Separator is not found, and chunk exceed the limitr   z2Separator is found, but chunk is longer than limit)r   r   r   r   findr   r   r   r   bytesr   r   r   r   )r;   	separatorr   offsetbuflenZisepchunkr   r   r   r     sD   





 zStreamReader.readuntilr   c                    s   	 | j d ur
| j |dkrdS |dk r.g }	 | | jI d H }|s#n|| qd|S | js<| js<| dI d H  t| jd | }| jd |= | 	  |S )Nr       Tread)
r   r   r   rM   r   r   r   r   r   r   )r;   nZblocksblockrq   r   r   r   r   s  s*   


zStreamReader.readc                    s   	 |dk r
t d| jd ur| j|dkrdS t| j|k rA| jr2t| j}| j  t||| 	dI d H  t| j|k st| j|krSt| j}| j  nt| jd | }| jd |= | 
  |S )Nr   z*readexactly size can not be less than zeror   readexactly)r   r   r   r   r   r   r   r   r   r   r   )r;   r   Z
incompleterq   r   r   r   r     s,   



zStreamReader.readexactlyc                 C   s   | S r   r   r?   r   r   r   	__aiter__  rT   zStreamReader.__aiter__c                    s    |   I d H }|dkrt|S )Nr   )r   StopAsyncIteration)r;   valr   r   r   	__anext__  s
   zStreamReader.__anext__)r   )r   )rU   rV   rW   r\   r   r<   r   rx   rG   r   rj   r   ro   r   rp   r   r   r   r   r   r   r   r   r   r   r   r   v  s&    	

[2)r   r{   r   )__all__r7   socketr   warningsrY   hasattr r   r   r   r   r   logr   Ztasksr   r   r   r   r   r	   ZProtocolr1   r   r   r   r   r   r   r   <module>   sB    

"@qP