a
    åze h  ã                   @   s&  d Z ddlZddlZddlZddlZeedƒr6e 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dedœdd„Zd dedœdd„Zeedƒràd!dedœdd„Zd"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   )ÚloopÚlimitc          	      ‹   sx   |d u rt  ¡ }ntjdtdd t||d}t||d‰ |j‡ fdd„| |fi |¤ŽI d H \}}t|ˆ ||ƒ}||fS )Nú[The loop argument is deprecated since Python 3.8, and scheduled for removal in Python 3.10.é   ©Ú
stacklevel©r   r   ©r   c                      s   ˆ S ©N© r   ©Úprotocolr   ú%/usr/lib/python3.9/asyncio/streams.pyÚ<lambda>5   ó    z!open_connection.<locals>.<lambda>)	r   Úget_event_loopÚwarningsÚwarnÚDeprecationWarningr   r   Úcreate_connectionr   )	ÚhostÚportr   r   ÚkwdsÚreaderÚ	transportÚ_Úwriterr   r   r   r      s    
þÿÿr   c                ‹   sN   ˆd u rt  ¡ ‰ntjdtdd ‡ ‡‡fdd„}ˆj|||fi |¤ŽI d H S )Nr   r   r   c                     s   t ˆˆd} t| ˆ ˆd}|S ©Nr   r   ©r   r   ©r)   r   ©Úclient_connected_cbr   r   r   r   ÚfactoryX   s
    ÿzstart_server.<locals>.factory)r   r!   r"   r#   r$   Úcreate_server)r1   r&   r'   r   r   r(   r2   r   r0   r   r   :   s    
þr   c                ‹   sv   |d u rt  ¡ }ntjdtdd t||d}t||d‰ |j‡ fdd„| fi |¤ŽI d H \}}t|ˆ ||ƒ}||fS )Nr   r   r   r   r   c                      s   ˆ S r   r   r   r   r   r   r   p   r    z&open_unix_connection.<locals>.<lambda>)	r   r!   r"   r#   r$   r   r   Zcreate_unix_connectionr   )Úpathr   r   r(   r)   r*   r+   r,   r   r   r   r   d   s    
þÿÿr   c                ‹   sL   ˆd u rt  ¡ ‰ntjdtdd ‡ ‡‡fdd„}ˆj||fi |¤ŽI d H S )Nr   r   r   c                     s   t ˆˆd} t| ˆ ˆd}|S r-   r.   r/   r0   r   r   r2   ~   s
    ÿz"start_unix_server.<locals>.factory)r   r!   r"   r#   r$   Zcreate_unix_server)r1   r4   r   r   r(   r2   r   r0   r   r	   t   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   s0   |d u rt  ¡ | _n|| _d| _d | _d| _d S ©NF)r   r!   Ú_loopÚ_pausedÚ_drain_waiterÚ_connection_lost)Úselfr   r   r   r   Ú__init__‘   s    zFlowControlMixin.__init__c                 C   s    d| _ | j ¡ rt d| ¡ d S )NTz%r pauses writing)r8   r7   Ú	get_debugr   Údebug©r;   r   r   r   Úpause_writingš   s    
zFlowControlMixin.pause_writingc                 C   sF   d| _ | j ¡ rt d| ¡ | j}|d urBd | _| ¡ sB| d ¡ d S )NFz%r resumes writing)r8   r7   r=   r   r>   r9   ÚdoneÚ
set_result©r;   Úwaiterr   r   r   Úresume_writing    s    
zFlowControlMixin.resume_writingc                 C   sV   d| _ | jsd S | j}|d u r"d S d | _| ¡ r4d S |d u rH| d ¡ n
| |¡ d S ©NT)r:   r8   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 ¡ }|| _|I d H  d S )NzConnection lost)r:   ÚConnectionResetErrorr8   r9   r7   Úcreate_futurerC   r   r   r   Ú_drain_helper¼   s    
zFlowControlMixin._drain_helperc                 C   s   t ‚d S r   )ÚNotImplementedError©r;   Ústreamr   r   r   Ú_get_close_waiterÇ   s    z"FlowControlMixin._get_close_waiter)N)	Ú__name__Ú
__module__Ú__qualname__r<   r@   rE   rJ   rM   rQ   r   r   r   r   r5   ‡   s   

	r5   c                       sb   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                    sn   t ƒ j|d |d ur,t |¡| _|j| _nd | _|d ur@|| _d| _d | _d | _	|| _
d| _| j ¡ | _d S )Nr   F)Úsuperr<   ÚweakrefÚrefÚ_stream_reader_wrÚ_source_tracebackÚ_strong_readerÚ_reject_connectionÚ_stream_writerÚ
_transportÚ_client_connected_cbÚ	_over_sslr7   rL   Ú_closed)r;   Zstream_readerr1   r   ©Ú	__class__r   r   r<   Ö   s    
zStreamReaderProtocol.__init__c                 C   s   | j d u rd S |   ¡ S r   )rX   r?   r   r   r   Ú_stream_readeré   s    
z#StreamReaderProtocol._stream_readerc                 C   s®   | j r6ddi}| jr| j|d< | j |¡ | ¡  d S || _| j}|d urT| |¡ | d¡d u| _	| j
d urªt|| || jƒ| _|  
|| j¡}t |¡r¤| j |¡ d | _d S )NÚmessagezpAn open stream was garbage collected prior to establishing network connection; call "stream.close()" explicitly.Zsource_tracebackZ
sslcontext)r[   rY   r7   Zcall_exception_handlerÚabortr]   rc   Úset_transportÚget_extra_infor_   r^   r   r\   r   ZiscoroutineZcreate_taskrZ   )r;   r*   Úcontextr)   Úresr   r   r   Úconnection_madeï   s0    ÿ


þÿ
z$StreamReaderProtocol.connection_madec                    sx   | j }|d ur*|d u r | ¡  n
| |¡ | j ¡ sV|d u rJ| j d ¡ n| j |¡ tƒ  |¡ d | _d | _	d | _
d S r   )rc   Úfeed_eofrG   r`   rA   rB   rU   rJ   rX   r\   r]   )r;   rI   r)   ra   r   r   rJ   
  s    


z$StreamReaderProtocol.connection_lostc                 C   s   | j }|d ur| |¡ d S r   )rc   Ú	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)rc   rk   r_   )r;   r)   r   r   r   Úeof_received   s    z!StreamReaderProtocol.eof_receivedc                 C   s   | j S r   )r`   rO   r   r   r   rQ   +  s    z&StreamReaderProtocol._get_close_waiterc                 C   s"   | j }| ¡ r| ¡ s| ¡  d S r   )r`   rA   Ú	cancelledÚ	exception)r;   Úclosedr   r   r   Ú__del__.  s    zStreamReaderProtocol.__del__)NN)rR   rS   rT   rY   r<   Úpropertyrc   rj   rJ   rn   ro   rQ   rs   Ú__classcell__r   r   ra   r   r   Ë   s   	
r   c                   @   sr   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   )r]   Ú	_protocolÚ_readerr7   rL   Z_complete_futrB   )r;   r*   r   r)   r   r   r   r   r<   @  s    zStreamWriter.__init__c                 C   s@   | j jd| j›g}| jd ur0| d| j›¡ d d |¡¡S )Nú
transport=zreader=ú<{}>ú )rb   rR   r]   rw   ÚappendÚformatÚjoin©r;   Úinfor   r   r   Ú__repr__J  s    
zStreamWriter.__repr__c                 C   s   | j S r   ©r]   r?   r   r   r   r*   P  s    zStreamWriter.transportc                 C   s   | j  |¡ d S r   )r]   Úwrite©r;   rm   r   r   r   r‚   T  s    zStreamWriter.writec                 C   s   | j  |¡ d S r   )r]   Ú
writelinesrƒ   r   r   r   r„   W  s    zStreamWriter.writelinesc                 C   s
   | j  ¡ S r   )r]   Ú	write_eofr?   r   r   r   r…   Z  s    zStreamWriter.write_eofc                 C   s
   | j  ¡ S r   )r]   Úcan_write_eofr?   r   r   r   r†   ]  s    zStreamWriter.can_write_eofc                 C   s
   | j  ¡ S r   )r]   Úcloser?   r   r   r   r‡   `  s    zStreamWriter.closec                 C   s
   | j  ¡ S r   )r]   Ú
is_closingr?   r   r   r   rˆ   c  s    zStreamWriter.is_closingc                 Ã   s   | j  | ¡I d H  d S r   )rv   rQ   r?   r   r   r   Úwait_closedf  s    zStreamWriter.wait_closedNc                 C   s   | j  ||¡S r   )r]   rg   )r;   ÚnameÚdefaultr   r   r   rg   i  s    zStreamWriter.get_extra_infoc                 Ã   sL   | j d ur | j  ¡ }|d ur |‚| j ¡ r8tdƒI d H  | j ¡ I d H  d S )Nr   )rw   rq   r]   rˆ   r   rv   rM   )r;   rI   r   r   r   Údrainl  s    



zStreamWriter.drain)N)rR   rS   rT   r<   r€   rt   r*   r‚   r„   r…   r†   r‡   rˆ   r‰   rg   rŒ   r   r   r   r   r   6  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   sv   |dkrt dƒ‚|| _|d u r*t ¡ | _n|| _tƒ | _d| _d | _d | _	d | _
d| _| j ¡ rrt t d¡¡| _d S )Nr   zLimit cannot be <= 0Fr
   )Ú
ValueErrorÚ_limitr   r!   r7   Ú	bytearrayÚ_bufferÚ_eofÚ_waiterÚ
_exceptionr]   r8   r=   r   Úextract_stackÚsysÚ	_getframerY   )r;   r   r   r   r   r   r<   Š  s     
ÿzStreamReader.__init__c                 C   s¶   dg}| j r"| t| j ƒ› d¡ | jr2| d¡ | jtkrN| d| j› ¡ | jrf| d| j›¡ | jr~| d| j›¡ | jr–| d| j›¡ | j	r¦| d¡ d	 
d
 |¡¡S )Nr   z bytesÚeofzlimit=zwaiter=z
exception=rx   Zpausedry   rz   )r   r{   Úlenr‘   rŽ   Ú_DEFAULT_LIMITr’   r“   r]   r8   r|   r}   r~   r   r   r   r€      s     


zStreamReader.__repr__c                 C   s   | j S r   )r“   r?   r   r   r   rq   ²  s    zStreamReader.exceptionc                 C   s0   || _ | j}|d ur,d | _| ¡ s,| |¡ d S r   )r“   r’   rp   rG   rH   r   r   r   rG   µ  s    zStreamReader.set_exceptionc                 C   s*   | j }|d ur&d | _ | ¡ s&| d ¡ d S r   )r’   rp   rB   rC   r   r   r   Ú_wakeup_waiter¾  s
    zStreamReader._wakeup_waiterc                 C   s
   || _ d S r   r   )r;   r*   r   r   r   rf   Æ  s    zStreamReader.set_transportc                 C   s*   | j r&t| jƒ| jkr&d| _ | j ¡  d S r6   )r8   r˜   r   rŽ   r]   Ú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   rk   Ï  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   sr   |sd S | j  |¡ |  ¡  | jd urn| jsnt| j ƒd| j krnz| j ¡  W n tyf   d | _Y n0 d| _d S )Nr   T)	r   Úextendrš   r]   r8   r˜   rŽ   Zpause_readingrN   rƒ   r   r   r   rl   ×  s    
ÿþzStreamReader.feed_datac                 Ã   s^   | j d urt|› dƒ‚| jr.d| _| j ¡  | j ¡ | _ z| j I d H  W d | _ nd | _ 0 d S )NzF() called while another coroutine is already waiting for incoming dataF)r’   ÚRuntimeErrorr8   r]   r›   r7   rL   )r;   Ú	func_namer   r   r   Ú_wait_for_dataí  s    	
ÿ
zStreamReader._wait_for_datac              
   Ã   sº   d}t |ƒ}z|  |¡I d H }W n” tjyL } z|jW  Y d }~S d }~0  tjy´ } zP| j ||j¡r€| jd |j| …= n
| j 	¡  |  
¡  t|jd ƒ‚W Y d }~n
d }~0 0 |S )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r|| j ||¡}|dkrZq´|d | }|| jkr|t d|¡‚| jr¢t	| jƒ}| j 
¡  t |d ¡‚|  d¡I d H  q,|| jkrÊt d|¡‚| jd || … }| jd || …= |  ¡  t	|ƒS )Nr   z,Separator should be at least one-byte stringéÿÿÿÿr
   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£   (  s<    


þ


ÿzStreamReader.readuntilr°   c                 Ã   sœ   | j d ur| j ‚|dkrdS |dk rVg }|  | j¡I d H }|s@qL| |¡ q(d |¡S | jsr| jsr|  d¡I d H  t| jd |… ƒ}| jd |…= |  	¡  |S )Nr   r    Úread)
r“   r·   rŽ   r{   r}   r   r‘   r¡   r²   rœ   )r;   ÚnZblocksÚblockrm   r   r   r   r·   ƒ  s"    

zStreamReader.readc                 Ã   sÀ   |dk rt dƒ‚| jd ur | j‚|dkr,dS t| jƒ|k rr| jr`t| jƒ}| j ¡  t ||¡‚|  	d¡I d H  q,t| jƒ|kr–t| 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
incompleterm   r   r   r   rº   µ  s&    



zStreamReader.readexactlyc                 C   s   | S r   r   r?   r   r   r   Ú	__aiter__Þ  s    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°   )rR   rS   rT   rY   r™   r<   r€   rq   rG   rš   rf   rœ   rk   r   rl   r¡   r¯   r£   r·   rº   r»   r¾   r   r   r   r   r   †  s$   	
[
2)r   )NN)NN)N)N)Ú__all__Úsocketr•   r"   rV   ÚhasattrÚ r   r   r   r   r   Úlogr   Ztasksr   r™   r   r   r   r	   ÚProtocolr5   r   r   r   r   r   r   r   Ú<module>   s>   
ÿ!ÿ'
ÿÿDkP