
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3

  \‚i  ã               @   s  d Z ddlZddlZddlZddlZddlZyddlZW n ek
rT   ddlZY nX ddl	m
Z
 ddlmZ ddddd	d
dddg	Zeedƒržejdddgƒ eedƒrºej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ƒ�rXG 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jƒ | _d| _d S )NF)Úserver_addressÚRequestHandlerClassÚ	threadingZEventÚ_BaseServer__is_shut_downÚ_BaseServer__shutdown_request)Úselfr   r   © r   ú$/usr/lib64/python3.6/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 jƒ  zVtƒ �F}|j| tjƒ x0| jsR|j|ƒ}| jr<P |rH| jƒ  | j	ƒ  q$W W d Q R X W d d| _| j 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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 jƒ }|d kr| j}n| jd k	r0t|| jƒ}|d k	rBtƒ | }tƒ �R}|j| tjƒ x<|j	|ƒ}|rp| j
ƒ S |d k	rZ|tƒ  }|dk rZ| jƒ 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| j ƒ \}}W n tk
r$   d S X | j||ƒr†y| j||ƒ W q� tk
rl   | j||ƒ | j|ƒ Y q�   | j|ƒ ‚ Y q�X n
| j|ƒ d S )N)Úget_requestÚOSErrorÚverify_requestÚprocess_requestÚ	ExceptionÚhandle_errorÚshutdown_request)r   ÚrequestÚclient_addressr   r   r   r(   3  s    

z"BaseServer._handle_request_noblockc             C   s   d S )Nr   )r   r   r   r   r4   J  s    zBaseServer.handle_timeoutc             C   s   dS )NTr   )r   r=   r>   r   r   r   r8   Q  s    zBaseServer.verify_requestc             C   s   | j ||ƒ | j|ƒ d S )N)Úfinish_requestr<   )r   r=   r>   r   r   r   r9   Y  s    zBaseServer.process_requestc             C   s   d S )Nr   )r   r   r   r   Úserver_closeb  s    zBaseServer.server_closec             C   s   | j ||| ƒ d S )N)r   )r   r=   r>   r   r   r   r?   j  s    zBaseServer.finish_requestc             C   s   | j |ƒ d S )N)Úclose_request)r   r=   r   r   r   r<   n  s    zBaseServer.shutdown_requestc             C   s   d S )Nr   )r   r=   r   r   r   rA   r  s    zBaseServer.close_requestc             C   sH   t dd tjd� t d|tjd� dd l}|jƒ  t dd tjd� d S )Nú-é(   )Úfilez4Exception happened during processing of request fromr   )ÚprintÚsysÚstderrÚ	tracebackÚ	print_exc)r   r=   r>   rH   r   r   r   r;   v  s    zBaseServer.handle_errorc             C   s   | S )Nr   )r   r   r   r   Ú	__enter__ƒ  s    zBaseServer.__enter__c             G   s   | j ƒ  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;   rJ   rL   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 j| ||ƒ tj| j| jƒ| _|rPy| jƒ  | jƒ  W n   | jƒ  ‚ 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jtjtjdƒ | jj| jƒ | jjƒ | _d S )Né   )Úallow_reuse_addressr0   Ú
setsockoptZ
SOL_SOCKETZSO_REUSEADDRZbindr   Zgetsockname)r   r   r   r   rS   Î  s    zTCPServer.server_bindc             C   s   | j j| jƒ d S )N)r0   ZlistenÚrequest_queue_size)r   r   r   r   r    Ù  s    zTCPServer.server_activatec             C   s   | j jƒ  d S )N)r0   Úclose)r   r   r   r   r@   á  s    zTCPServer.server_closec             C   s
   | j jƒ S )N)r0   Úfileno)r   r   r   r   rY   é  s    zTCPServer.filenoc             C   s
   | j jƒ S )N)r0   Zaccept)r   r   r   r   r6   ñ  s    zTCPServer.get_requestc             C   s4   y|j tjƒ W n tk
r$   Y nX | j|ƒ d S )N)r/   r0   ZSHUT_WRr7   rA   )r   r=   r   r   r   r<   ù  s
    zTCPServer.shutdown_requestc             C   s   |j ƒ  d S )N)rX   )r   r=   r   r   r   rA     s    zTCPServer.close_requestN)T)rM   rN   rO   r0   ZAF_INETrQ   ZSOCK_STREAMrR   rW   rU   r   rS   r    r@   rY   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ƒ\}}|| 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   | j |ƒ 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)rM   rN   rO   rU   r0   Z
SOCK_DGRAMrR   rZ   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,  NrC   F)Úblockingc            C   sò   | j d krd S xht| j ƒ| jkrvy tjddƒ\}}| j j|ƒ W q tk
r^   | j jƒ  Y q tk
rr   P Y qX qW xt| j j	ƒ D ]f}y.|r’dntj
}tj||ƒ\}}| j j|ƒ W q„ tk
rÖ   | j j|ƒ Y q„ tk
rè   Y q„X q„W d S )NrT   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   | j ƒ  d S )N)rj   )r   r   r   r   r4   O  s    zForkingMixIn.handle_timeoutc             C   s   | j ƒ  d S )N)rj   )r   r   r   r   r)   V  s    zForkingMixIn.service_actionsc             C   sš   t jƒ }|r8| jd krtƒ | _| jj|ƒ | j|ƒ d S d}z:y| j||ƒ d}W n  tk
rr   | j||ƒ Y nX W d z| j	|ƒ W d t j
|ƒ X X d S )NrT   r   )ra   r   r^   r*   ÚaddrA   r?   r:   r;   r<   Ú_exit)r   r=   r>   rg   Zstatusr   r   r   r9   ]  s     

zForkingMixIn.process_requestc                s   t ƒ jƒ  | j| jd� d S )N)r\   )Úsuperr@   rj   Ú_block_on_close)r   )Ú	__class__r   r   r@   v  s    
zForkingMixIn.server_close)rM   rN   rO   r1   r^   r`   rn   rj   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   FNc             C   sH   z6y| j ||ƒ W n  tk
r2   | j||ƒ Y nX W d | j|ƒ X d S )N)r?   r:   r;   r<   )r   r=   r>   r   r   r   Úprocess_request_thread‡  s
    z%ThreadingMixIn.process_request_threadc             C   sR   t j| j||fd�}| j|_|j rF| jrF| jd kr:g | _| jj|ƒ |jƒ  d S )N)ÚtargetrK   )	r   ZThreadrq   Údaemon_threadsZdaemonrn   Ú_threadsÚappendÚstart)r   r=   r>   Útr   r   r   r9   ”  s    
zThreadingMixIn.process_requestc                s:   t ƒ jƒ  | jr6| j}d | _|r6x|D ]}|jƒ  q&W d S )N)rm   r@   rn   rt   Újoin)r   ZthreadsZthread)ro   r   r   r@   Ÿ  s    

zThreadingMixIn.server_close)
rM   rN   rO   rs   rn   rt   rq   r9   r@   rp   r   r   )ro   r   r   {  s   c               @   s   e Zd ZdS )r   N)rM   rN   rO   r   r   r   r   r   ª  s    c               @   s   e Zd ZdS )r   N)rM   rN   rO   r   r   r   r   r   «  s    c               @   s   e Zd ZdS )r   N)rM   rN   rO   r   r   r   r   r   ­  s    c               @   s   e Zd ZdS )r   N)rM   rN   rO   r   r   r   r   r   ®  s    c               @   s   e Zd ZejZdS )r   N)rM   rN   rO   r0   r   rQ   r   r   r   r   r   ²  s   c               @   s   e Zd ZejZdS )r   N)rM   rN   rO   r0   r   rQ   r   r   r   r   r   µ  s   c               @   s   e Zd ZdS )r   N)rM   rN   rO   r   r   r   r   r   ¸  s    c               @   s   e Zd ZdS )r   N)rM   rN   rO   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   || _ || _|| _| jƒ  z| jƒ  W d | jƒ  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)rM   rN   rO   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
   rT   r   NFc             C   sz   | j | _| jd k	r | jj| jƒ | jr:| jjtjtjdƒ | jj	d| j
ƒ| _| jdkrdt| jƒ| _n| jj	d| jƒ| _d S )NTÚrbr   Úwb)r=   Z
connectionr1   Z
settimeoutÚdisable_nagle_algorithmrV   r0   ZIPPROTO_TCPZTCP_NODELAYÚmakefileÚrbufsizeÚrfileÚwbufsizeÚ_SocketWriterÚwfile)r   r   r   r   rz   ÿ  s    



zStreamRequestHandler.setupc             C   sF   | j js.y| j jƒ  W n tjk
r,   Y nX | j jƒ  | jjƒ  d S )N)r…   ÚclosedÚflushr0   ÚerrorrX   r‚   )r   r   r   r   r|     s    
zStreamRequestHandler.finishr]   )	rM   rN   rO   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 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 jƒ S )N)r‰   rY   )r   r   r   r   rY   '  s    z_SocketWriter.filenoN)rM   rN   rO   r   rŠ   rŽ   rY   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jƒ | jƒ d S )N)r0   Zsendtor…   Úgetvaluer>   )r   r   r   r   r|   4  s    zDatagramRequestHandler.finishN)rM   rN   rO   rz   r|   r   r   r   r   r   *  s   )$Ú__version__r0   r%   ra   ÚerrnorF   r   ÚImportErrorZdummy_threadingr�   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>{   sZ   


 n~X..-