a
    Rîh j  ã                   @   sì  d Z ddlZddlZddlZddlZddlZddlmZ ddlm	Z g d¢Z
eedƒrde
 g d¢¡ eedƒr|e
 g d	¢¡ eed
ƒrŽejZnejZG dd„ dƒZG dd„ deƒZG dd„ deƒZeedƒrÚG dd„ dƒZG dd„ deƒZG dd„ dƒZG dd„ dƒZeedƒr6G dd„ deeƒZG dd„ deeƒZG dd„ deeƒZG dd „ d eeƒZeedƒrªG d!d"„ d"eƒZG d#d$„ d$eƒZG d%d&„ d&eeƒZG d'd(„ d(eeƒZG d)d*„ d*ƒZ G d+d,„ d,e ƒZ!G d-d.„ d.eƒZ"G d/d0„ d0e ƒZ#dS )1z0.4é    N)ÚBufferedIOBase)Ú	monotonic)	Ú
BaseServerÚ	TCPServerÚ	UDPServerÚThreadingUDPServerÚThreadingTCPServerÚBaseRequestHandlerÚStreamRequestHandlerÚDatagramRequestHandlerÚThreadingMixInÚfork)ÚForkingUDPServerÚForkingTCPServerÚForkingMixInÚAF_UNIX)ÚUnixStreamServerÚUnixDatagramServerÚThreadingUnixStreamServerÚThreadingUnixDatagramServerÚPollSelectorc                   @   sš   e Zd ZdZdd„ Zdd„ Zd%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 )&r   Nc                 C   s    || _ || _t ¡ | _d| _d S ©NF)Úserver_addressÚRequestHandlerClassÚ	threadingÚEventÚ_BaseServer__is_shut_downÚ_BaseServer__shutdown_request)Úselfr   r   © r   ú4/opt/python-3.9.24/usr/lib/python3.9/socketserver.pyÚ__init__È   s    
zBaseServer.__init__c                 C   s   d S ©Nr   ©r   r   r   r    Úserver_activateÏ   s    zBaseServer.server_activateç      à?c                 C   s˜   | j  ¡  zvtƒ L}| | tj¡ | jsP| |¡}| jr:qP|rF|  ¡  |  	¡  q"W d   ƒ n1 sd0    Y  W d| _| j  
¡  nd| _| j  
¡  0 d S r   )r   ÚclearÚ_ServerSelectorÚregisterÚ	selectorsÚ
EVENT_READr   ÚselectÚ_handle_request_noblockÚservice_actionsÚset)r   Zpoll_intervalÚselectorÚreadyr   r   r    Úserve_forever×   s    

*ÿzBaseServer.serve_foreverc                 C   s   d| _ | j ¡  d S ©NT)r   r   Úwaitr#   r   r   r    Úshutdownô   s    zBaseServer.shutdownc                 C   s   d S r"   r   r#   r   r   r    r-   þ   s    zBaseServer.service_actionsc                 C   sÐ   | j  ¡ }|d u r| j}n| jd ur0t|| jƒ}|d urBtƒ | }tƒ t}| | tj¡ | 	|¡}|r||  
¡ W  d   ƒ S |d urX|tƒ  }|dk rX|  ¡ W  d   ƒ S qXW d   ƒ n1 sÂ0    Y  d S )Nr   )ÚsocketÚ
gettimeoutÚtimeoutÚminÚtimer'   r(   r)   r*   r+   r,   Úhandle_timeout)r   r7   Údeadliner/   r0   r   r   r    Úhandle_request  s     




zBaseServer.handle_requestc                 C   s’   z|   ¡ \}}W n ty$   Y d S 0 |  ||¡r„z|  ||¡ W qŽ tyj   |  ||¡ |  |¡ Y qŽ   |  |¡ ‚ Y qŽ0 n
|  |¡ d S r"   )Úget_requestÚOSErrorÚverify_requestÚprocess_requestÚ	ExceptionÚhandle_errorÚshutdown_request©r   ÚrequestÚclient_addressr   r   r    r,   /  s    

z"BaseServer._handle_request_noblockc                 C   s   d S r"   r   r#   r   r   r    r:   F  s    zBaseServer.handle_timeoutc                 C   s   dS r2   r   rD   r   r   r    r?   M  s    zBaseServer.verify_requestc                 C   s   |   ||¡ |  |¡ d S r"   )Úfinish_requestrC   rD   r   r   r    r@   U  s    zBaseServer.process_requestc                 C   s   d S r"   r   r#   r   r   r    Úserver_close^  s    zBaseServer.server_closec                 C   s   |   ||| ¡ d S r"   )r   rD   r   r   r    rG   f  s    zBaseServer.finish_requestc                 C   s   |   |¡ d S r"   ©Úclose_request©r   rE   r   r   r    rC   j  s    zBaseServer.shutdown_requestc                 C   s   d S r"   r   rK   r   r   r    rJ   n  s    zBaseServer.close_requestc                 C   s@   t dtjd t d|tjd dd l}| ¡  t dtjd d S )Nz(----------------------------------------)Úfilez4Exception occurred during processing of request fromr   )ÚprintÚsysÚstderrÚ	tracebackÚ	print_exc)r   rE   rF   rP   r   r   r    rB   r  s    ÿzBaseServer.handle_errorc                 C   s   | S r"   r   r#   r   r   r    Ú	__enter__  s    zBaseServer.__enter__c                 G   s   |   ¡  d S r"   )rH   )r   Úargsr   r   r    Ú__exit__‚  s    zBaseServer.__exit__)r%   )Ú__name__Ú
__module__Ú__qualname__r7   r!   r$   r1   r4   r-   r<   r,   r:   r?   r@   rH   rG   rC   rJ   rB   rR   rT   r   r   r   r    r   ™   s$   -

	r   c                   @   sb   e Zd ZejZejZdZdZ	d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 )r   é   FTc                 C   sT   t  | ||¡ t | j| j¡| _|rPz|  ¡  |  ¡  W n   |  ¡  ‚ Y n0 d S r"   )r   r!   r5   Úaddress_familyÚsocket_typeÚserver_bindr$   rH   )r   r   r   Zbind_and_activater   r   r    r!   ½  s    ÿzTCPServer.__init__c                 C   s8   | j r| j tjtjd¡ | j | j¡ | j ¡ | _d S )Né   )Úallow_reuse_addressr5   Ú
setsockoptÚ
SOL_SOCKETÚSO_REUSEADDRÚbindr   Úgetsocknamer#   r   r   r    r[   Ê  s    zTCPServer.server_bindc                 C   s   | j  | j¡ d S r"   )r5   ÚlistenÚrequest_queue_sizer#   r   r   r    r$   Õ  s    zTCPServer.server_activatec                 C   s   | j  ¡  d S r"   )r5   Úcloser#   r   r   r    rH   Ý  s    zTCPServer.server_closec                 C   s
   | j  ¡ S r"   )r5   Úfilenor#   r   r   r    rf   å  s    zTCPServer.filenoc                 C   s
   | j  ¡ S r"   )r5   Úacceptr#   r   r   r    r=   í  s    zTCPServer.get_requestc                 C   s2   z|  tj¡ W n ty"   Y n0 |  |¡ d S r"   )r4   r5   ÚSHUT_WRr>   rJ   rK   r   r   r    rC   õ  s
    zTCPServer.shutdown_requestc                 C   s   |  ¡  d S r"   )re   rK   r   r   r    rJ   ÿ  s    zTCPServer.close_requestN)T)rU   rV   rW   r5   ÚAF_INETrY   ÚSOCK_STREAMrZ   rd   r]   r!   r[   r$   rH   rf   r=   rC   rJ   r   r   r   r    r   †  s   /

r   c                   @   s:   e Zd ZdZejZdZdd„ Zdd„ Z	dd„ Z
d	d
„ ZdS )r   Fi    c                 C   s    | j  | j¡\}}|| j f|fS r"   )r5   ÚrecvfromÚmax_packet_size)r   ÚdataZclient_addrr   r   r    r=     s    zUDPServer.get_requestc                 C   s   d S r"   r   r#   r   r   r    r$     s    zUDPServer.server_activatec                 C   s   |   |¡ d S r"   rI   rK   r   r   r    rC     s    zUDPServer.shutdown_requestc                 C   s   d S r"   r   rK   r   r   r    rJ     s    zUDPServer.close_requestN)rU   rV   rW   r]   r5   Ú
SOCK_DGRAMrZ   rl   r=   r$   rC   rJ   r   r   r   r    r     s   r   c                       sR   e Zd ZdZdZdZdZddœdd„Zd	d
„ Zdd„ Z	dd„ Z
‡ fdd„Z‡  ZS )r   i,  Né(   TF©Úblockingc             	   C   sä   | j d u rd S t| j ƒ| jkrrz t dd¡\}}| j  |¡ W q tyZ   | j  ¡  Y q tyn   Y qrY q0 q| j  	¡ D ]b}z.|rŠdntj
}t ||¡\}}| j  |¡ W q| tyÌ   | j  |¡ Y q| tyÜ   Y q|0 q|d S )Néÿÿÿÿr   )Úactive_childrenÚlenÚmax_childrenÚosÚwaitpidÚdiscardÚChildProcessErrorr&   r>   ÚcopyÚWNOHANG)r   rq   ÚpidÚ_Úflagsr   r   r    Úcollect_children(  s&    
zForkingMixIn.collect_childrenc                 C   s   |   ¡  d S r"   ©r   r#   r   r   r    r:   K  s    zForkingMixIn.handle_timeoutc                 C   s   |   ¡  d S r"   r€   r#   r   r   r    r-   R  s    zForkingMixIn.service_actionsc                 C   sÈ   t  ¡ }|r8| jd u rtƒ | _| j |¡ |  |¡ d S d}z^z|  ||¡ d}W n typ   |  ||¡ Y n0 W z|  	|¡ W t  
|¡ qÄt  
|¡ 0 n(z|  	|¡ W t  
|¡ nt  
|¡ 0 0 d S )Nr\   r   )rv   r   rs   r.   ÚaddrJ   rG   rA   rB   rC   Ú_exit)r   rE   rF   r|   Ústatusr   r   r    r@   Y  s&    

ýzForkingMixIn.process_requestc                    s   t ƒ  ¡  | j| jd d S )Nrp   )ÚsuperrH   r   Úblock_on_closer#   ©Ú	__class__r   r    rH   r  s    
zForkingMixIn.server_close)rU   rV   rW   r7   rs   ru   r…   r   r:   r-   r@   rH   Ú__classcell__r   r   r†   r    r     s   #r   c                       s4   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Z‡  ZS )	Ú_Threadsc                    s"   |   ¡  |jrd S tƒ  |¡ d S r"   )ÚreapÚdaemonr„   Úappend©r   Úthreadr†   r   r    rŒ   {  s    z_Threads.appendc                 C   s   g | d d …  | d d …< }|S r"   r   )r   Úresultr   r   r    Úpop_all  s    z_Threads.pop_allc                 C   s   |   ¡ D ]}| ¡  qd S r"   )r   Újoinr   r   r   r    r‘   …  s    z_Threads.joinc                 C   s   dd„ | D ƒ| d d …< d S )Nc                 s   s   | ]}|  ¡ r|V  qd S r"   )Úis_alive)Ú.0rŽ   r   r   r    Ú	<genexpr>Š  ó    z _Threads.reap.<locals>.<genexpr>r   r#   r   r   r    rŠ   ‰  s    z_Threads.reap)rU   rV   rW   rŒ   r   r‘   rŠ   rˆ   r   r   r†   r    r‰   w  s   r‰   c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú
_NoThreadsc                 C   s   d S r"   r   r   r   r   r    rŒ   ‘  s    z_NoThreads.appendc                 C   s   d S r"   r   r#   r   r   r    r‘   ”  s    z_NoThreads.joinN)rU   rV   rW   rŒ   r‘   r   r   r   r    r–     s   r–   c                       s:   e Zd ZdZdZeƒ Zdd„ Zdd„ Z‡ fdd„Z	‡  Z
S )	r   FTc              	   C   sP   z>z|   ||¡ W n ty0   |  ||¡ Y n0 W |  |¡ n|  |¡ 0 d S r"   )rG   rA   rB   rC   rD   r   r   r    Úprocess_request_thread¤  s
    z%ThreadingMixIn.process_request_threadc                 C   sL   | j rt| ƒ dtƒ ¡ tj| j||fd}| j|_| j	 
|¡ | ¡  d S )NÚ_threads)ÚtargetrS   )r…   ÚvarsÚ
setdefaultr‰   r   ÚThreadr—   Údaemon_threadsr‹   r˜   rŒ   Ústart)r   rE   rF   Útr   r   r    r@   ±  s    ÿzThreadingMixIn.process_requestc                    s   t ƒ  ¡  | j ¡  d S r"   )r„   rH   r˜   r‘   r#   r†   r   r    rH   »  s    
zThreadingMixIn.server_close)rU   rV   rW   r   r…   r–   r˜   r—   r@   rH   rˆ   r   r   r†   r    r   ˜  s   
r   c                   @   s   e Zd ZdS )r   N©rU   rV   rW   r   r   r   r    r   Á  r•   r   c                   @   s   e Zd ZdS )r   Nr    r   r   r   r    r   Â  r•   r   c                   @   s   e Zd ZdS )r   Nr    r   r   r   r    r   Ä  r•   r   c                   @   s   e Zd ZdS )r   Nr    r   r   r   r    r   Å  r•   r   c                   @   s   e Zd ZejZdS )r   N©rU   rV   rW   r5   r   rY   r   r   r   r    r   É  s   r   c                   @   s   e Zd ZejZdS )r   Nr¡   r   r   r   r    r   Ì  s   r   c                   @   s   e Zd ZdS )r   Nr    r   r   r   r    r   Ï  r•   r   c                   @   s   e Zd ZdS )r   Nr    r   r   r   r    r   Ñ  r•   r   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
r	   c                 C   s>   || _ || _|| _|  ¡  z|  ¡  W |  ¡  n
|  ¡  0 d S r"   )rE   rF   ÚserverÚsetupÚhandleÚfinish)r   rE   rF   r¢   r   r   r    r!   å  s    
zBaseRequestHandler.__init__c                 C   s   d S r"   r   r#   r   r   r    r£   ï  s    zBaseRequestHandler.setupc                 C   s   d S r"   r   r#   r   r   r    r¤   ò  s    zBaseRequestHandler.handlec                 C   s   d S r"   r   r#   r   r   r    r¥   õ  s    zBaseRequestHandler.finishN)rU   rV   rW   r!   r£   r¤   r¥   r   r   r   r    r	   Ó  s   
r	   c                   @   s,   e Zd ZdZdZdZdZdd„ Zdd„ ZdS )	r
   rr   r   NFc                 C   sz   | j | _| jd ur | j | j¡ | jr:| j tjtjd¡ | j 	d| j
¡| _| jdkrdt| jƒ| _n| j 	d| j¡| _d S )NTÚrbr   Úwb)rE   Ú
connectionr7   Ú
settimeoutÚdisable_nagle_algorithmr^   r5   ÚIPPROTO_TCPÚTCP_NODELAYÚmakefileÚrbufsizeÚrfileÚwbufsizeÚ_SocketWriterÚwfiler#   r   r   r    r£     s    

ÿ
zStreamRequestHandler.setupc                 C   sD   | j js,z| j  ¡  W n tjy*   Y n0 | j  ¡  | j ¡  d S r"   )r²   ÚclosedÚflushr5   Úerrorre   r¯   r#   r   r   r    r¥   #  s    
zStreamRequestHandler.finish)	rU   rV   rW   r®   r°   r7   rª   r£   r¥   r   r   r   r    r
     s   r
   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
r±   c                 C   s
   || _ d S r"   )Ú_sock)r   Úsockr   r   r    r!   3  s    z_SocketWriter.__init__c                 C   s   dS r2   r   r#   r   r   r    Úwritable6  s    z_SocketWriter.writablec                 C   s>   | j  |¡ t|ƒ}|jW  d   ƒ S 1 s00    Y  d S r"   )r¶   ÚsendallÚ
memoryviewÚnbytes)r   ÚbÚviewr   r   r    Úwrite9  s    
z_SocketWriter.writec                 C   s
   | j  ¡ S r"   )r¶   rf   r#   r   r   r    rf   >  s    z_SocketWriter.filenoN)rU   rV   rW   r!   r¸   r¾   rf   r   r   r   r    r±   .  s   r±   c                   @   s   e Zd Zdd„ Zdd„ ZdS )r   c                 C   s2   ddl m} | j\| _| _|| jƒ| _|ƒ | _d S )Nr   )ÚBytesIO)Úior¿   rE   Zpacketr5   r¯   r²   )r   r¿   r   r   r    r£   E  s    zDatagramRequestHandler.setupc                 C   s   | j  | j ¡ | j¡ d S r"   )r5   Úsendtor²   ÚgetvaluerF   r#   r   r   r    r¥   K  s    zDatagramRequestHandler.finishN)rU   rV   rW   r£   r¥   r   r   r   r    r   A  s   r   )$Ú__version__r5   r)   rv   rN   r   rÀ   r   r9   r   Ú__all__ÚhasattrÚextendr   r'   ÚSelectSelectorr   r   r   r   Úlistr‰   r–   r   r   r   r   r   r   r   r   r   r	   r
   r±   r   r   r   r   r    Ú<module>{   sL   


 n~
X(.-