o
    èÇhL&  ã                   @   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   úl/var/www/html/construction_image-detection-poc/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 )Né2   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{®Gáz„?Ú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    