B
    u9a*i  ã            	   @   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 ddddd	d
dddg	Z
eedƒrte
 dddg¡ eedƒre
 ddddg¡ 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ƒZeedƒr,G 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)d„ deƒZ dS )*z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Ú	threadingZEventÚ_BaseServer__is_shut_downÚ_BaseServer__shutdown_request)Úselfr   r   © r   ú"/usr/lib/python3.7/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   sx   | j  ¡  zVtƒ F}| | tj¡ x0| jsR| |¡}| jr<P |rH|  ¡  |  	¡  q$W W d Q R X W d d| _| j  
¡  X d S )NF)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   Úwait)r   r   r   r   Úshutdownô   s    zBaseServer.shutdownc             C   s   d S )Nr   )r   r   r   r   r)   þ   s    zBaseServer.service_actionsc          	   C   s¤   | j  ¡ }|d kr| j}n| jd k	r0t|| jƒ}|d k	rBtƒ | }tƒ R}| | tj¡ x<| 	|¡}|rp|  
¡ S |d k	rZ|tƒ  }|dk rZ|  ¡ S qZW W d Q R X d S )Nr   )ÚsocketZ
gettimeoutÚtimeoutÚminÚtimer#   r$   r%   r&   r'   r(   Úhandle_timeout)r   r1   Zdeadliner+   r,   r   r   r   Úhandle_request  s"    




zBaseServer.handle_requestc             C   s”   y|   ¡ \}}W n tk
r$   d S X |  ||¡r†y|  ||¡ W q tk
rl   |  ||¡ |  |¡ Y q   |  |¡ ‚ Y qX n
|  |¡ d S )N)Ú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 )Nr   )r   r   r   r   r4   F  s    zBaseServer.handle_timeoutc             C   s   dS )NTr   )r   r=   r>   r   r   r   r8   M  s    zBaseServer.verify_requestc             C   s   |   ||¡ |  |¡ d S )N)Úfinish_requestr<   )r   r=   r>   r   r   r   r9   U  s    zBaseServer.process_requestc             C   s   d S )Nr   )r   r   r   r   Úserver_close^  s    zBaseServer.server_closec             C   s   |   ||| ¡ d S )N)r   )r   r=   r>   r   r   r   r?   f  s    zBaseServer.finish_requestc             C   s   |   |¡ d S )N)Úclose_request)r   r=   r   r   r   r<   j  s    zBaseServer.shutdown_requestc             C   s   d S )Nr   )r   r=   r   r   r   rA   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 happened during processing of request fromr   )ÚprintÚsysÚstderrÚ	tracebackÚ	print_exc)r   r=   r>   rF   r   r   r   r;   r  s    zBaseServer.handle_errorc             C   s   | S )Nr   )r   r   r   r   Ú	__enter__  s    zBaseServer.__enter__c             G   s   |   ¡  d S )N)r@   )r   Úargsr   r   r   Ú__exit__‚  s    zBaseServer.__exit__)r!   )Ú__name__Ú
__module__Ú__qualname__r1   r   r    r-   r/   r)   r5   r(   r4   r8   r9   r@   r?   r<   rA   r;   rH   rJ   r   r   r   r   r   ™   s$   -

	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¡| _|rPy|  ¡  |  ¡  W n   |  ¡  ‚ Y nX d S )N)r   r   r0   Úaddress_familyÚsocket_typeÚserver_bindr    r@   )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_addressr0   Ú
setsockoptZ
SOL_SOCKETZSO_REUSEADDRZbindr   Zgetsockname)r   r   r   r   rQ   Ê  s    zTCPServer.server_bindc             C   s   | j  | j¡ d S )N)r0   ZlistenÚrequest_queue_size)r   r   r   r   r    Õ  s    zTCPServer.server_activatec             C   s   | j  ¡  d S )N)r0   Úclose)r   r   r   r   r@   Ý  s    zTCPServer.server_closec             C   s
   | j  ¡ S )N)r0   Úfileno)r   r   r   r   rW   å  s    zTCPServer.filenoc             C   s
   | j  ¡ S )N)r0   Zaccept)r   r   r   r   r6   í  s    zTCPServer.get_requestc             C   s4   y|  tj¡ W n tk
r$   Y nX |  |¡ d S )N)r/   r0   ZSHUT_WRr7   rA   )r   r=   r   r   r   r<   õ  s
    zTCPServer.shutdown_requestc             C   s   |  ¡  d S )N)rV   )r   r=   r   r   r   rA   ÿ  s    zTCPServer.close_requestN)T)rK   rL   rM   r0   ZAF_INETrO   ZSOCK_STREAMrP   rU   rS   r   rQ   r    r@   rW   r6   r<   rA   r   r   r   r   r   †  s   /

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 )N)r0   ZrecvfromÚmax_packet_size)r   ÚdataZclient_addrr   r   r   r6     s    zUDPServer.get_requestc             C   s   d S )Nr   )r   r   r   r   r      s    zUDPServer.server_activatec             C   s   |   |¡ d S )N)rA   )r   r=   r   r   r   r<     s    zUDPServer.shutdown_requestc             C   s   d S )Nr   )r   r=   r   r   r   rA     s    zUDPServer.close_requestN)rK   rL   rM   rS   r0   Z
SOCK_DGRAMrP   rX   r6   r    r<   rA   r   r   r   r   r     s   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 krd S xht| j ƒ| jkrvy t dd¡\}}| j  |¡ W q tk
r^   | j  ¡  Y q tk
rr   P Y qX qW xt| j  	¡ D ]f}y.|r’dntj
}t ||¡\}}| j  |¡ W q„ tk
rÖ   | j  |¡ Y q„ tk
rè   Y q„X q„W d S )Néÿÿÿÿr   )Úactive_childrenÚlenÚmax_childrenÚosÚwaitpidÚdiscardÚChildProcessErrorr"   r7   ÚcopyÚWNOHANG)r   r[   ÚpidÚ_Úflagsr   r   r   Úcollect_children(  s&    
zForkingMixIn.collect_childrenc             C   s   |   ¡  d S )N)ri   )r   r   r   r   r4   K  s    zForkingMixIn.handle_timeoutc             C   s   |   ¡  d S )N)ri   )r   r   r   r   r)   R  s    zForkingMixIn.service_actionsc             C   sš   t  ¡ }|r8| jd krtƒ | _| j |¡ |  |¡ d S d}z:y|  ||¡ d}W n  tk
rr   |  ||¡ Y nX W d z|  	|¡ W d t  
|¡ X X d S )NrR   r   )r`   r   r]   r*   ÚaddrA   r?   r:   r;   r<   Ú_exit)r   r=   r>   rf   Ústatusr   r   r   r9   Y  s     

zForkingMixIn.process_requestc                s   t ƒ  ¡  | j| jd d S )N)r[   )Úsuperr@   ri   Úblock_on_close)r   )Ú	__class__r   r   r@   r  s    
zForkingMixIn.server_close)rK   rL   rM   r1   r]   r_   rn   ri   r4   r)   r9   r@   Ú__classcell__r   r   )ro   r   r     s   #c                   s8   e Zd ZdZdZdZdd„ Zdd„ Z‡ fdd	„Z‡  Z	S )
r   FTNc          	   C   sH   z6y|   ||¡ W n  tk
r2   |  ||¡ Y nX W d |  |¡ X d S )N)r?   r:   r;   r<   )r   r=   r>   r   r   r   Úprocess_request_threadƒ  s
    z%ThreadingMixIn.process_request_threadc             C   sP   t j| j||fd}| j|_|jsD| jrD| jd kr8g | _| j |¡ | ¡  d S )N)ÚtargetrI   )	r   ZThreadrq   Údaemon_threadsZdaemonrn   Ú_threadsÚappendÚstart)r   r=   r>   Útr   r   r   r9     s    
zThreadingMixIn.process_requestc                s:   t ƒ  ¡  | jr6| j}d | _|r6x|D ]}| ¡  q&W d S )N)rm   r@   rn   rt   Újoin)r   ZthreadsZthread)ro   r   r   r@   ›  s    

zThreadingMixIn.server_close)
rK   rL   rM   rs   rn   rt   rq   r9   r@   rp   r   r   )ro   r   r   w  s   c               @   s   e Zd ZdS )r   N)rK   rL   rM   r   r   r   r   r   ¦  s    c               @   s   e Zd ZdS )r   N)rK   rL   rM   r   r   r   r   r   §  s    c               @   s   e Zd ZdS )r   N)rK   rL   rM   r   r   r   r   r   ©  s    c               @   s   e Zd ZdS )r   N)rK   rL   rM   r   r   r   r   r   ª  s    c               @   s   e Zd ZejZdS )r   N)rK   rL   rM   r0   r   rO   r   r   r   r   r   ®  s   c               @   s   e Zd ZejZdS )r   N)rK   rL   rM   r0   r   rO   r   r   r   r   r   ±  s   c               @   s   e Zd ZdS )r   N)rK   rL   rM   r   r   r   r   r   ´  s    c               @   s   e Zd ZdS )r   N)rK   rL   rM   r   r   r   r   r   ¶  s    c               @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
r	   c             C   s6   || _ || _|| _|  ¡  z|  ¡  W d |  ¡  X d S )N)r=   r>   ÚserverÚsetupÚhandleÚfinish)r   r=   r>   ry   r   r   r   r   Ê  s    zBaseRequestHandler.__init__c             C   s   d S )Nr   )r   r   r   r   rz   Ô  s    zBaseRequestHandler.setupc             C   s   d S )Nr   )r   r   r   r   r{   ×  s    zBaseRequestHandler.handlec             C   s   d S )Nr   )r   r   r   r   r|   Ú  s    zBaseRequestHandler.finishN)rK   rL   rM   r   rz   r{   r|   r   r   r   r   r	   ¸  s   
c               @   s,   e Zd ZdZdZdZdZdd„ Zdd„ ZdS )	r
   r\   r   NFc             C   sz   | j | _| jd k	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)r=   Z
connectionr1   Z
settimeoutÚdisable_nagle_algorithmrT   r0   ZIPPROTO_TCPZTCP_NODELAYZmakefileÚrbufsizeÚrfileÚwbufsizeÚ_SocketWriterÚwfile)r   r   r   r   rz   û  s    



zStreamRequestHandler.setupc             C   sF   | j js.y| j  ¡  W n tjk
r,   Y nX | j  ¡  | j ¡  d S )N)r„   ÚclosedÚflushr0   ÚerrorrV   r   )r   r   r   r   r|     s    
zStreamRequestHandler.finish)	rK   rL   rM   r€   r‚   r1   r   rz   r|   r   r   r   r   r
   æ  s   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 )N)Ú_sock)r   Zsockr   r   r   r     s    z_SocketWriter.__init__c             C   s   dS )NTr   )r   r   r   r   Úwritable  s    z_SocketWriter.writablec          	   C   s&   | j  |¡ t|ƒ}|jS Q R X d S )N)rˆ   ZsendallÚ
memoryviewÚnbytes)r   ÚbZviewr   r   r   Úwrite  s    
z_SocketWriter.writec             C   s
   | j  ¡ S )N)rˆ   rW   )r   r   r   r   rW   #  s    z_SocketWriter.filenoN)rK   rL   rM   r   r‰   r   rW   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Ž   r=   Zpacketr0   r   r„   )r   rŽ   r   r   r   rz   *  s    zDatagramRequestHandler.setupc             C   s   | j  | j ¡ | j¡ d S )N)r0   Zsendtor„   Úgetvaluer>   )r   r   r   r   r|   0  s    zDatagramRequestHandler.finishN)rK   rL   rM   rz   r|   r   r   r   r   r   &  s   )!Ú__version__r0   r%   r`   rD   r   r   r   r3   r   Ú__all__ÚhasattrÚextendr   r#   ZSelectSelectorr   r   r   r   r   r   r   r   r   r   r   r   r   r	   r
   rƒ   r   r   r   r   r   Ú<module>{   sR   


 n~
X..-