o
    ݈)iL&                     @   s\   d dl Z d dlZd dlZd dlZd dlmZ G dd deZG dd dZG dd dZ	dS )	    N)clusterc                   @   s   e Zd ZdS )
StopServerN)__name__
__module____qualname__ r   r   f/home/esfera/Desktop/Rishu/Inhouse_Email/venv/lib/python3.10/site-packages/asyncpg/_testbase/fuzzer.pyr      s    r   c                   @   s   e Zd Zdddddedeje dededeje d	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# Zd$d% Zd&d' ZdS )(TCPFuzzingProxyz	127.0.0.1N)listening_addrlistening_portsettingsr
   r   backend_hostbackend_portr   returnc                C   sP   || _ || _|| _|| _|pi | _d | _d | _d | _d | _i | _	d | _
d | _d S N)r
   r   r   r   r   loopconnectivityconnectivity_loss
stop_eventconnectionssocklisten_task)selfr
   r   r   r   r   r   r   r   __init__   s   

zTCPFuzzingProxy.__init__c                    s   t |}t | j }z+t j||gt jdI d H  | j r$t | W | s0|	  | s9|	  S S | sB|	  | sK|	  w w N)return_when)
asyncioensure_futurer   waitFIRST_COMPLETEDis_setr   resultdonecancel)r   work	work_taskstop_event_taskr   r   r   _wait&   s*   



zTCPFuzzingProxy._waitc                 C   s>   t  }t j| j|fd| _| j  |jddstdd S )N)targetargs   )timeoutzfuzzer proxy failed to start)	threadingEventThread_start_threadthreadstartr   RuntimeError)r   startedr   r   r   r1   9   s   
zTCPFuzzingProxy.startc                 C   s   | j | j | j  d S r   )r   call_soon_threadsafe_stopr0   joinr   r   r   r   stopA   s   zTCPFuzzingProxy.stopc                 C   s   | j   d S r   )r   setr7   r   r   r   r5   E   s   zTCPFuzzingProxy._stopc                 C   s   t  | _t | j t  | _| j  t  | _t  | _| j	d u r)t
 | _	t | _| j| j| j	f | jd | jd z| j| | W | j  d S | j  w )N2   F)r   new_event_loopr   set_event_loopr-   r   r9   r   r   r   r   find_available_portsocketr   bindr
   listensetblockingrun_until_complete_mainclose)r   started_eventr   r   r   r/   H   s   







zTCPFuzzingProxy._start_threadc              
      s   t |  | _|  z1| jI d H  W t| jD ]}|  qt dI d H  t	| j
dr8| j
| j  | j  d S t| jD ]}|  qDt dI d H  t	| j
drb| j
| j  | j  w )Ng{Gz?remove_reader)r   r   r@   r   r9   listr   rD   sleephasattrr   rF   r   fileno)r   rE   cr   r   r   rC   ^   s"   

zTCPFuzzingProxy._mainc                    s   	 z+|  | j| jI d H \}}t }|d |  | j|| j| jfI d H  W n
 t	y7   Y d S w t
||| }| j| }|| j|< q)NTF)r'   r   sock_acceptr   r>   rA   sock_connectr   r   r   
Connectioncreate_taskhandler   )r   client_sock_backend_sockconn	conn_taskr   r   r   r@   l   s$   


zTCPFuzzingProxy.listenc                 C      | j | j d S r   )r   r4   _trigger_connectivity_lossr7   r   r   r   trigger_connectivity_loss~      z)TCPFuzzingProxy.trigger_connectivity_lossc                 C      | j   | j  d S r   )r   clearr   r9   r7   r   r   r   rW         
z*TCPFuzzingProxy._trigger_connectivity_lossc                 C   rV   r   )r   r4   _restore_connectivityr7   r   r   r   restore_connectivity   rY   z$TCPFuzzingProxy.restore_connectivityc                 C   rZ   r   )r   r9   r   r[   r7   r   r   r   r]      r\   z%TCPFuzzingProxy._restore_connectivityc                 C   s   |    d S r   )r^   r7   r   r   r   reset   s   zTCPFuzzingProxy.resetc                 C   s&   | j |d }|d ur|  d S d S r   )r   popr#   )r   
connectionrU   r   r   r   _close_connection   s   z!TCPFuzzingProxy._close_connectionc                 C   s$   t | jD ]
}| j| j| qd S r   )rG   r   r   r4   rb   )r   rT   r   r   r   close_all_connections   s   z%TCPFuzzingProxy.close_all_connections)r   r   r   strtypingOptionalintdictr   r'   r1   r8   r5   r/   rC   r@   rX   rW   r^   r]   r_   rb   rc   r   r   r   r   r	      s:    

r	   c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )rN   c                 C   s@   || _ || _|| _|j| _|j| _|j| _d | _d | _d| _d S )NF)	rQ   rS   proxyr   r   r   proxy_to_backend_taskproxy_from_backend_task	is_closed)r   rQ   rS   ri   r   r   r   r      s   
zConnection.__init__c                 C   sT   | j rd S d| _ | jd ur| j  d | _| jd ur"| j  d | _| j|  d S )NT)rl   rj   r#   rk   ri   rb   r7   r   r   r   rD      s   



zConnection.closec              
      sR  t |  | _t |  | _zTt j| j| jgt jdI d H  W | jd ur,| j  | jd ur6| j  | j	
| j  | j	| j  | j	
| j  | j	| j  | j  | j  d S | jd urp| j  | jd urz| j  | j	
| j  | j	| j  | j	
| j  | j	| j  | j  | j  w r   )r   r   proxy_to_backendrj   proxy_from_backendrk   r   r   r#   r   rF   rQ   rJ   remove_writerrS   rD   r7   r   r   r   rP      s@   










zConnection.handlec                       t | j||}t | j }zJt j||gt jdI d H  | j rBW | j s>|	 s4|
  |	 s@|
  d S d S d S | W | j s\|	 sS|
  |	 s]|
  S S S | j st|	 sk|
  |	 su|
  w w w r   )r   r   r   	sock_recvr   r   r   r    rl   r"   r#   r!   )r   r   n	read_taskconn_event_taskr   r   r   _read   H   





zConnection._readc                    rp   r   )r   r   r   sock_sendallr   r   r   r    rl   r"   r#   r!   )r   r   data
write_taskrt   r   r   r   _write   rv   zConnection._writec              	         d }zSz8	 | j  I d H  |d ur|}d }n
| | jdI d H }|dkr&n| j r0|r/|}q| | j|I d H  qW n	 tyE   Y nw W | j	
 sU| j	| j d S d S | j	
 sd| j	| j w w NTi       )r   r   ru   rQ   r   r    rz   rS   ConnectionErrorr   rl   	call_soonrD   r   bufrx   r   r   r   rm      6   

zConnection.proxy_to_backendc              	      r{   r|   )r   r   ru   rS   r   r    rz   rQ   r~   r   rl   r   rD   r   r   r   r   rn     r   zConnection.proxy_from_backendN)
r   r   r   r   rD   rP   ru   rz   rm   rn   r   r   r   r   rN      s    rN   )
r   r>   r,   re   asyncpgr   	Exceptionr   r	   rN   r   r   r   r   <module>   s    