o
     JAfj                     @   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r3e
g d eedr?e
g d	 eed
rHe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rnG dd dZG dd deZG dd dZG dd dZeedrG 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rG 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   #/usr/lib/python3.10/socketserver.py__init__   s
   

zBaseServer.__init__c                 C      	 d S Nr   r   r   r   r    server_activate      zBaseServer.server_activate      ?c                 C   s   	 | j   zIt (}|| tj | js+||}| jrn|r$|   | 	  | jrW d    n1 s5w   Y  W d| _| j 
  d S W d| _| j 
  d S d| _| j 
  w 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   r"   r#   r   r$   r   r   r    r/      r&   zBaseServer.service_actionsc                 C   s   	 | j  }|d u r| j}n| jd urt|| j}|d ur"t | }t 4}|| tj 	 |	|}|r@| 
 W  d    S |d urX|t  }|dk rX|  W  d    S q.1 s\w   Y  d S )NTr   )socket
gettimeouttimeoutmintimer)   r*   r+   r,   r-   r.   handle_timeout)r   r9   deadliner1   r2   r   r   r    handle_request  s,   




zBaseServer.handle_requestc                 C   s   	 z|   \}}W n
 ty   Y d S w | ||rAz	| || W d S  ty8   | || | | Y d S    | |  | | 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   r"   r#   r   r$   r   r   r    r<   F  s   zBaseServer.handle_timeoutc                 C   s   	 dS r4   r   rF   r   r   r    rA   M  r&   zBaseServer.verify_requestc                 C   s   	 |  || | | d S r#   )finish_requestrE   rF   r   r   r    rB   U  s   zBaseServer.process_requestc                 C   r"   r#   r   r$   r   r   r    server_close^  r&   zBaseServer.server_closec                 C   s   	 |  |||  d S r#   )r   rF   r   r   r    rI   f  s   zBaseServer.finish_requestc                 C   s   	 |  | d S r#   close_requestr   rG   r   r   r    rE   j  s   zBaseServer.shutdown_requestc                 C   r"   r#   r   rM   r   r   r    rL   n  s   zBaseServer.close_requestc                 C   sB   	 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   rG   rH   rR   r   r   r    rD   r  s   zBaseServer.handle_errorc                 C   s   | S r#   r   r$   r   r   r    	__enter__     zBaseServer.__enter__c                 G   s   |    d S r#   )rJ   )r   argsr   r   r    __exit__  s   zBaseServer.__exit__)r'   )__name__
__module____qualname__r9   r!   r%   r3   r6   r/   r>   r.   r<   rA   rB   rJ   rI   rE   rL   rD   rT   rW   r   r   r   r    r      s(    +

	r   c                   @   sd   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   sR   	 t | || t| j| j| _|r'z|   |   W d S    |    d S r#   )r   r!   r7   address_familysocket_typeserver_bindr%   rJ   )r   r   r   Zbind_and_activater   r   r    r!     s   zTCPServer.__init__c                 C   s:   	 | j r| jtjtjd | j| j | j | _d S )N   )allow_reuse_addressr7   
setsockopt
SOL_SOCKETSO_REUSEADDRbindr   getsocknamer$   r   r   r    r^     s
   zTCPServer.server_bindc                 C   s   	 | j | j d S r#   )r7   listenrequest_queue_sizer$   r   r   r    r%     s   zTCPServer.server_activatec                 C   s   	 | j   d S r#   )r7   closer$   r   r   r    rJ     s   zTCPServer.server_closec                 C      	 | j  S r#   )r7   filenor$   r   r   r    rj        
zTCPServer.filenoc                 C   ri   r#   )r7   acceptr$   r   r   r    r?     rk   zTCPServer.get_requestc                 C   s4   	 z| tj W n	 ty   Y nw | | d S r#   )r6   r7   SHUT_WRr@   rL   rM   r   r   r    rE     s   zTCPServer.shutdown_requestc                 C   s   	 |   d S r#   )rh   rM   r   r   r    rL     s   zTCPServer.close_requestN)T)rX   rY   rZ   r7   AF_INETr\   SOCK_STREAMr]   rg   r`   r!   r^   r%   rJ   rj   r?   rE   rL   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#   )r7   recvfrommax_packet_size)r   dataZclient_addrr   r   r    r?     s   zUDPServer.get_requestc                 C      d S r#   r   r$   r   r   r    r%        zUDPServer.server_activatec                 C   s   |  | d S r#   rK   rM   r   r   r    rE     s   zUDPServer.shutdown_requestc                 C   rs   r#   r   rM   r   r   r    rL     rt   zUDPServer.close_requestN)rX   rY   rZ   r`   r7   
SOCK_DGRAMr]   rq   r?   r%   rE   rL   r   r   r   r    r     s    r   c                       sT   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r?ztdd\}}| j | W n ty.   | j   Y n	 ty6   Y n	w t| j | jks| j 	 D ]0}z|rKdntj
}t||\}}| j | W qD tyl   | j | Y qD tyt   Y qDw d S )Nr   )active_childrenlenmax_childrenoswaitpiddiscardChildProcessErrorr(   r@   copyWNOHANG)r   rx   pid_flagsr   r   r    collect_children(  s0   
zForkingMixIn.collect_childrenc                 C      	 |    d S r#   r   r$   r   r   r    r<   K     zForkingMixIn.handle_timeoutc                 C   r   r#   r   r$   r   r   r    r/   R  r   zForkingMixIn.service_actionsc                 C   s   	 t  }|r| jd u rt | _| j| | | d S d}z/z
| || d}W n ty9   | || Y nw W z| 	| W t 
| d S t 
| w z| 	| W t 
| w t 
| w )Nr_   r   )r}   r   rz   r0   addrL   rI   rC   rD   rE   _exit)r   rG   rH   r   statusr   r   r    rB   Y  s,   

zForkingMixIn.process_requestc                    s   t    | j| jd d S )Nrw   )superrJ   r   block_on_closer$   	__class__r   r    rJ   r  s   
zForkingMixIn.server_close)rX   rY   rZ   r9   rz   r|   r   r   r<   r/   rB   rJ   __classcell__r   r   r   r    r     s    #r   c                       s6   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>  s    z _Threads.reap.<locals>.<genexpr>r   r$   r   r   r    r        z_Threads.reap)rX   rY   rZ   r   r   r   r   r   r   r   r   r    r   w  s    r   c                   @      e Zd Z	 dd Zdd ZdS )
_NoThreadsc                 C   rs   r#   r   r   r   r   r    r     rU   z_NoThreads.appendc                 C   rs   r#   r   r$   r   r   r    r     rU   z_NoThreads.joinN)rX   rY   rZ   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   s`   	 z(z|  || W n ty   | || Y n	w W | | d S W | | d S | | w r#   )rI   rC   rD   rE   rF   r   r   r    process_request_thread  s   z%ThreadingMixIn.process_request_threadc                 C   sN   	 | j rt| dt  tj| j||fd}| j|_| j	
| |  d S )N_threads)targetrV   )r   vars
setdefaultr   r   Threadr   daemon_threadsr   r   r   start)r   rG   rH   tr   r   r    rB     s   zThreadingMixIn.process_requestc                    s   t    | j  d S r#   )r   rJ   r   r   r$   r   r   r    rJ     s   
zThreadingMixIn.server_close)rX   rY   rZ   r   r   r   r   r   rB   rJ   r   r   r   r   r    r     s    
r   c                   @      e Zd ZdS )r   NrX   rY   rZ   r   r   r   r    r         r   c                   @   r   )r   Nr   r   r   r   r    r     r   r   c                   @   r   )r   Nr   r   r   r   r    r     r   r   c                   @   r   )r   Nr   r   r   r   r    r     r   r   c                   @      e Zd ZejZdS )r   NrX   rY   rZ   r7   r   r\   r   r   r   r    r         
r   c                   @   r   )r   Nr   r   r   r   r    r     r   r   c                   @   r   )r   Nr   r   r   r   r    r     r   r   c                   @   r   )r   Nr   r   r   r   r    r     r   r   c                   @   .   e Zd Z	 dd Zdd Zdd Zdd Zd	S )
r	   c                 C   s<   || _ || _|| _|   z|   W |   d S |   w r#   )rG   rH   serversetuphandlefinish)r   rG   rH   r   r   r   r    r!     s   
zBaseRequestHandler.__init__c                 C   rs   r#   r   r$   r   r   r    r     rU   zBaseRequestHandler.setupc                 C   rs   r#   r   r$   r   r   r    r     rU   zBaseRequestHandler.handlec                 C   rs   r#   r   r$   r   r   r    r     rU   zBaseRequestHandler.finishN)rX   rY   rZ   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
   ry   r   NFc                 C   s|   | j | _| jd ur| j| j | jr| jtjtjd | j	d| j
| _| jdkr3t| j| _d S | j	d| j| _d S )NTrbr   wb)rG   
connectionr9   
settimeoutdisable_nagle_algorithmra   r7   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w | j   | j  d S r#   )r   closedflushr7   errorrh   r   r$   r   r   r    r   #  s   
zStreamRequestHandler.finish)	rX   rY   rZ   r   r   r9   r   r   r   r   r   r   r    r
     s    	r
   c                   @   r   )
r   c                 C   s
   || _ d S r#   )_sock)r   sockr   r   r    r!   3     
z_SocketWriter.__init__c                 C   s   dS r4   r   r$   r   r   r    writable6  rU   z_SocketWriter.writablec                 C   s>   | j | t|}|jW  d    S 1 sw   Y  d S r#   )r   sendall
memoryviewnbytes)r   bviewr   r   r    write9  s   
$z_SocketWriter.writec                 C   s
   | j  S r#   )r   rj   r$   r   r   r    rj   >  r   z_SocketWriter.filenoN)rX   rY   rZ   r!   r   r   rj   r   r   r   r    r   .  s    r   c                   @   r   )r   c                 C   s2   ddl m} | j\| _| _|| j| _| | _d S )Nr   )BytesIO)ior   rG   Zpacketr7   r   r   )r   r   r   r   r    r   E  s   zDatagramRequestHandler.setupc                 C   s   | j | j | j d S r#   )r7   sendtor   getvaluerH   r$   r   r   r    r   K  r   zDatagramRequestHandler.finishN)rX   rY   rZ   r   r   r   r   r   r    r   A  s    r   )$__version__r7   r+   r}   rP   r   r   r   r;   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>   sP    z


 n~
X
(
.-