B
    v9a`                 @   s  d 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ZG dd deZG dd deZd!dedddZd"dedddZeedrd#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IncompleteReadErrorLimitOverrunError    NZAF_UNIX)open_unix_connectionstart_unix_server   )
coroutines)events)	protocols)logger)sleepi   c                   s$   e Zd Z fddZdd Z  ZS )r   c                s,   t  t| d|d || _|| _d S )Nz bytes read on a total of z expected bytes)super__init__lenpartialexpected)selfr   r   )	__class__ /usr/lib/python3.7/streams.pyr      s    zIncompleteReadError.__init__c             C   s   t | | j| jffS )N)typer   r   )r   r   r   r   
__reduce__#   s    zIncompleteReadError.__reduce__)__name__
__module____qualname__r   r   __classcell__r   r   )r   r   r      s   r   c                   s$   e Zd Z fddZdd Z  ZS )r   c                s   t  | || _d S )N)r   r   consumed)r   messager    )r   r   r   r   -   s    zLimitOverrunError.__init__c             C   s   t | | jd | jffS )Nr   )r   argsr    )r   r   r   r   r   1   s    zLimitOverrunError.__reduce__)r   r   r   r   r   r   r   r   )r   r   r   '   s   r   )looplimitc      	         sb   |d krt  }t||d}t||d |j fdd| |f|I d H \}}t| ||}||fS )N)r$   r#   )r#   c                  s    S )Nr   r   )protocolr   r   <lambda>M       z!open_connection.<locals>.<lambda>)r   get_event_loopr   r   Zcreate_connectionr   )	hostportr#   r$   kwdsreader	transport_writerr   )r%   r   r   5   s     r   c               s8   d krt   fdd}j|||f|I d H S )Nc                 s   t d} t|  d}|S )N)r$   r#   )r#   )r   r   )r,   r%   )client_connected_cbr$   r#   r   r   factoryl   s    zstart_server.<locals>.factory)r   r(   Zcreate_server)r0   r)   r*   r#   r$   r+   r1   r   )r0   r$   r#   r   r   R   s    r   c               s`   |d krt  }t||d}t||d |j fdd| f|I d H \}}t| ||}||fS )N)r$   r#   )r#   c                  s    S )Nr   r   )r%   r   r   r&      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	   x   s    r	   c               s6   d krt   fdd}j||f|I d H S )Nc                 s   t d} t|  d}|S )N)r$   r#   )r#   )r   r   )r,   r%   )r0   r$   r#   r   r   r1      s    z"start_unix_server.<locals>.factory)r   r(   Zcreate_unix_server)r0   r2   r#   r$   r+   r1   r   )r0   r$   r#   r   r
      s    r
   c               @   s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )FlowControlMixinNc             C   s0   |d krt  | _n|| _d| _d | _d| _d S )NF)r   r(   _loop_paused_drain_waiter_connection_lost)r   r#   r   r   r   r      s    zFlowControlMixin.__init__c             C   s    d| _ | j rtd|  d S )NTz%r pauses writing)r5   r4   	get_debugr   debug)r   r   r   r   pause_writing   s    
zFlowControlMixin.pause_writingc             C   sF   d| _ | j rtd|  | j}|d k	rBd | _| sB|d  d S )NFz%r resumes writing)r5   r4   r8   r   r9   r6   done
set_result)r   waiterr   r   r   resume_writing   s    
zFlowControlMixin.resume_writingc             C   sV   d| _ | jsd S | j}|d kr"d S d | _| r4d S |d krH|d  n
|| d S )NT)r7   r5   r6   r;   r<   set_exception)r   excr=   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)r7   ConnectionResetErrorr5   r6   r4   create_future)r   r=   r   r   r   _drain_helper   s    
zFlowControlMixin._drain_helper)N)r   r   r   r   r:   r>   rA   rD   r   r   r   r   r3      s
   

	r3   c                   sJ   e Zd Zd fdd	Zdd Z fddZdd	 Zd
d Zdd Z  Z	S )r   Nc                s6   t  j|d || _d | _|| _d| _| j | _d S )N)r#   F)	r   r   _stream_reader_stream_writer_client_connected_cb	_over_sslr4   rC   _closed)r   Zstream_readerr0   r#   )r   r   r   r      s    zStreamReaderProtocol.__init__c             C   sd   | j | |dd k	| _| jd k	r`t|| | j | j| _| | j | j}t	|r`| j
| d S )NZ
sslcontext)rE   set_transportget_extra_inforH   rG   r   r4   rF   r   ZiscoroutineZcreate_task)r   r-   Zresr   r   r   connection_made   s    


z$StreamReaderProtocol.connection_madec                sr   | j d k	r*|d kr| j   n| j | | j sV|d krJ| jd  n| j| t | d | _ d | _d S )N)	rE   feed_eofr?   rI   r;   r<   r   rA   rF   )r   r@   )r   r   r   rA      s    

z$StreamReaderProtocol.connection_lostc             C   s   | j | d S )N)rE   	feed_data)r   datar   r   r   data_received   s    z"StreamReaderProtocol.data_receivedc             C   s   | j   | jrdS dS )NFT)rE   rM   rH   )r   r   r   r   eof_received  s    
z!StreamReaderProtocol.eof_receivedc             C   s"   | j }| r| s|  d S )N)rI   r;   	cancelled	exception)r   closedr   r   r   __del__  s    zStreamReaderProtocol.__del__)NN)
r   r   r   r   rL   rA   rP   rQ   rU   r   r   r   )r   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   s   || _ || _|| _|| _d S )N)
_transport	_protocol_readerr4   )r   r-   r%   r,   r#   r   r   r   r     s    zStreamWriter.__init__c             C   s@   | j jd| jg}| jd k	r0|d| j dd|S )Nz
transport=zreader=z<{}> )r   r   rV   rX   appendformatjoin)r   infor   r   r   __repr__&  s    
zStreamWriter.__repr__c             C   s   | j S )N)rV   )r   r   r   r   r-   ,  s    zStreamWriter.transportc             C   s   | j | d S )N)rV   write)r   rO   r   r   r   r_   0  s    zStreamWriter.writec             C   s   | j | d S )N)rV   
writelines)r   rO   r   r   r   r`   3  s    zStreamWriter.writelinesc             C   s
   | j  S )N)rV   	write_eof)r   r   r   r   ra   6  s    zStreamWriter.write_eofc             C   s
   | j  S )N)rV   can_write_eof)r   r   r   r   rb   9  s    zStreamWriter.can_write_eofc             C   s
   | j  S )N)rV   close)r   r   r   r   rc   <  s    zStreamWriter.closec             C   s
   | j  S )N)rV   
is_closing)r   r   r   r   rd   ?  s    zStreamWriter.is_closingc                s   | j jI d H  d S )N)rW   rI   )r   r   r   r   wait_closedB  s    zStreamWriter.wait_closedNc             C   s   | j ||S )N)rV   rK   )r   namedefaultr   r   r   rK   E  s    zStreamWriter.get_extra_infoc                sR   | j d k	r | j  }|d k	r || j r>td| jdI d H  | j I d H  d S )Nr   )r#   )rX   rS   rV   rd   r   r4   rW   rD   )r   r@   r   r   r   drainH  s    


zStreamWriter.drain)N)r   r   r   r   r^   propertyr-   r_   r`   ra   rb   rc   rd   re   rK   rh   r   r   r   r   r     s   

r   c               @   s   e 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 kr*t | _n|| _t | _d| _d | _d | _	d | _
d| _d S )Nr   zLimit cannot be <= 0F)
ValueError_limitr   r(   r4   	bytearray_buffer_eof_waiter
_exceptionrV   r5   )r   r$   r#   r   r   r   r   a  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=z
transport=Zpausedz<{}>rY   )rm   rZ   r   rn   rk   _DEFAULT_LIMITro   rp   rV   r5   r[   r\   )r   r]   r   r   r   r^   t  s     


zStreamReader.__repr__c             C   s   | j S )N)rp   )r   r   r   r   rS     s    zStreamReader.exceptionc             C   s0   || _ | j}|d k	r,d | _| s,|| d S )N)rp   ro   rR   r?   )r   r@   r=   r   r   r   r?     s    zStreamReader.set_exceptionc             C   s*   | j }|d k	r&d | _ | s&|d  d S )N)ro   rR   r<   )r   r=   r   r   r   _wakeup_waiter  s
    zStreamReader._wakeup_waiterc             C   s
   || _ d S )N)rV   )r   r-   r   r   r   rJ     s    zStreamReader.set_transportc             C   s*   | j r&t| j| jkr&d| _ | j  d S )NF)r5   r   rm   rk   rV   resume_reading)r   r   r   r   _maybe_resume_transport  s    z$StreamReader._maybe_resume_transportc             C   s   d| _ |   d S )NT)rn   rs   )r   r   r   r   rM     s    zStreamReader.feed_eofc             C   s   | j o| j S )N)rn   rm   )r   r   r   r   at_eof  s    zStreamReader.at_eofc             C   st   |sd S | j | |   | jd k	rp| jspt| j d| j krpy| j  W n tk
rh   d | _Y nX d| _d S )N   T)	rm   extendrs   rV   r5   r   rk   Zpause_readingNotImplementedError)r   rO   r   r   r   rN     s    
zStreamReader.feed_datac                sX   | j d k	rt| d| jr.d| _| j  | j | _ z| j I d H  W d d | _ X d S )NzF() called while another coroutine is already waiting for incoming dataF)ro   RuntimeErrorr5   rV   rt   r4   rC   )r   Z	func_namer   r   r   _wait_for_data  s    	

zStreamReader._wait_for_datac          
      s   d}t |}y| |I d H }W n tk
rD } z|jS d }~X Y nf tk
r } zH| j||jrx| jd |j| = n
| j  | 	  t
|jd W d d }~X Y nX |S )N   
r   )r   	readuntilr   r   r   rm   
startswithr    clearru   rj   r"   )r   sepseplenlineer   r   r   readline  s    
 zStreamReader.readliner|   c                s   t |}|dkrtd| jd k	r(| jd}xt | j}|| |kr|| j||}|dkr\P |d | }|| jkr|td|| jrt| j}| j	  t
|d | dI d H  q.W || jkrtd|| jd ||  }| jd || = |   t|S )Nr   z,Separator should be at least one-byte stringr   z2Separator is not found, and chunk exceed the limitr}   z2Separator is found, but chunk is longer than limit)r   rj   rp   rm   findrk   r   rn   bytesr   r   r{   ru   )r   Z	separatorr   offsetbuflenZisepchunkr   r   r   r}     s:    






zStreamReader.readuntilr   c                s   | j d k	r| j |dkrdS |dk rZg }x&| | jI d H }|sBP || q*W d|S | jsv| jsv| dI d H  t| jd | }| jd |= | 	  |S )Nr   r'   read)
rp   r   rk   rZ   r\   rm   rn   r{   r   ru   )r   nZblocksblockrO   r   r   r   r   W  s$    

zStreamReader.readc                s   |dk rt d| jd k	r | j|dkr,dS xFt| j|k rr| jr`t| j}| j  t||| dI d H  q.W t| j|krt| j}| j  nt| jd | }| jd |= | 	  |S )Nr   z*readexactly size can not be less than zeror'   readexactly)
rj   rp   r   rm   rn   r   r   r   r{   ru   )r   r   Z
incompleterO   r   r   r   r     s&    




zStreamReader.readexactlyc             C   s   | S )Nr   )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   )r   r   r   rr   r   r^   rS   r?   rs   rJ   ru   rM   rv   rN   r{   r   r}   r   r   r   r   r   r   r   r   r   _  s"   	
[
2)r   )NN)NN)N)N)__all__Zsockethasattr r   r   r   logr   Ztasksr   rr   EOFErrorr   	Exceptionr   r   r   r	   r
   ZProtocolr3   r   r   r   r   r   r   r   <module>   s0   
"
A@K