U
    ÓB·fl  ã                   @   sž   d dl m Z  d dl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lmZ d dlmZ d dlmZ G dd	„ d	eƒZG d
d„ dejƒZdS )é    )ÚdatetimeN)Úhttp)Úwsgi)Úsock)Úutil)Úbasec                   @   s   e Zd ZdZdS )ÚStopWaitingz3 exception raised to stop waiting for a connection N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   ú9/tmp/pip-unpacked-wheel-s8855r93/gunicorn/workers/sync.pyr      s   r   c                   @   sL   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d„ Z
dS )Ú
SyncWorkerc                 C   s2   |  ¡ \}}| d¡ t |¡ |  |||¡ d S )Né   )ÚacceptÚsetblockingr   Zclose_on_execÚhandle)ÚselfÚlistenerÚclientÚaddrr   r   r   r      s    

zSyncWorker.acceptc              
   C   sÊ   zT|   ¡  t | jg g |¡}|d rR| jd |d krHt | jd d¡ |d W S W np tjk
rÄ } zP|jd tj	kr†| j
 W Y ¢4S |jd tjkr²| jdk r®| j
 W Y ¢S t‚‚ W 5 d }~X Y nX d S )Nr   r   )ÚnotifyÚselectZwait_fdsÚPIPEÚosÚreadÚerrorÚargsÚerrnoZEINTRÚsocketsÚEBADFÚnrr   )r   ÚtimeoutÚretÚer   r   r   Úwait"   s    
zSyncWorker.waitc                 C   s$   | j t ¡ kr | j d| ¡ dS dS )Nz!Parent changed, shutting down: %sFT)Zppidr   ÚgetppidÚlogÚinfo)r   r   r   r   Úis_parent_alive5   s    zSyncWorker.is_parent_alivec              
   C   sž   | j d }| jrš|  ¡  z|  |¡ W q
W n: tk
rd } z|jtjtjtjfkrT‚ W 5 d }~X Y nX |  	¡ srd S z|  
|¡ W q
 tk
r–   Y d S X q
d S ©Nr   )r    Úaliver   r   ÚEnvironmentErrorr   ÚEAGAINÚECONNABORTEDÚEWOULDBLOCKr*   r&   r   )r   r#   r   r%   r   r   r   Úrun_for_one<   s"    

ÿzSyncWorker.run_for_onec                 C   s²   | j r®|  ¡  z|  |¡}W n tk
r2   Y d S X |d k	r |D ]^}|| jd krTq@z|  |¡ W q@ tk
rœ } z|jtjtj	tj
fkrŒ‚ W 5 d }~X Y q@X q@|  ¡ s d S q d S r+   )r,   r   r&   r   r   r   r-   r   r.   r/   r0   r*   )r   r#   Úreadyr   r%   r   r   r   Úrun_for_multipleY   s&    ÿzSyncWorker.run_for_multiplec                 C   sH   | j pd}| jD ]}| d¡ qt| jƒdkr:|  |¡ n
|  |¡ d S )Ng      à?r   r   )r#   r    r   Úlenr3   r1   )r   r#   Úsr   r   r   Úrunq   s    

zSyncWorker.runc              
   C   sì  d }zÔzD| jjr t || j¡}t | j||¡}t|ƒ}|  	||||¡ W nŠ tj
jk
r‚ } z| j d|¡ W 5 d }~X Y nV tk
r² } z| j d|¡ W 5 d }~X Y n& tjk
r } zF|jd tjkrì| j d¡ | ¡  n| j d¡ |  ||||¡ W 5 d }~X Y nÀ tk
r¤ } zn|jtjtjtjfkrP| j d¡ nD|jtjkrl| j d¡ n(|jtjkrˆ| j d¡ n| j d	¡ W 5 d }~X Y n4 tk
rÖ } z|  ||||¡ W 5 d }~X Y nX W 5 t  |¡ X d S )
Nz*Ignored premature client disconnection. %szClosing connection. %sr   zssl connection closedzError processing SSL request.z Socket error processing request.zIgnoring connection resetzIgnoring socket not connectedzIgnoring EPIPE)r   ÚcloseÚcfgZis_sslr   Ússl_wrap_socketr   ZRequestParserÚnextÚhandle_requestÚerrorsZ
NoMoreDatar(   ÚdebugÚStopIterationÚsslÚSSLErrorr   ÚSSL_ERROR_EOFÚhandle_errorr-   r   ÚEPIPEÚ
ECONNRESETÚENOTCONNÚ	exceptionÚBaseException)r   r   r   r   ÚreqÚparserr%   r   r   r   r   €   s8      
 &zSyncWorker.handlec                 C   sÂ  i }d }zvzæ| j  | |¡ t ¡ }t 	|||| 
¡ | j ¡\}}| ¡  |  jd7  _| j| jkrt| j d¡ d| _|  ||j¡}z:t||d ƒrž| |¡ n|D ]}
| |
¡ q¢| ¡  W 5 t ¡ | }	| j ||||	¡ t|dƒrî| ¡  X W nŠ tk
r   tjt ¡ Ž  Y nh tk
r|   |rv|jrv| j d¡ z| tj¡ | ¡  W n tk
rn   Y nX t ƒ ‚‚ Y nX W 5 z| j  | |||¡ W n" tk
rº   | j d¡ Y nX X d S )NzException in post_request hookr   z,Autorestarting worker after current request.Fr7   zwsgi.file_wrapperzError handling request)!r8   Zpost_requestÚ	Exceptionr(   rF   Zpre_requestr   Únowr   ÚcreateÚgetsocknameZforce_closer"   Zmax_requestsr)   r,   Zstart_responseÚaccessÚhasattrr7   Ú
isinstanceÚ
write_fileÚwriter-   r   ÚreraiseÚsysÚexc_infoZheaders_sentÚshutdownÚsocketÚ	SHUT_RDWRr>   )r   r   rH   r   r   ÚenvironÚrespZrequest_startZrespiterZrequest_timeÚitemr   r   r   r;   ¢   sR    
 ÿ
zSyncWorker.handle_requestN)r	   r
   r   r   r&   r*   r1   r3   r6   r   r;   r   r   r   r   r      s   "r   )r   r   r   r   rW   r?   rT   Zgunicornr   Zgunicorn.httpr   r   r   Zgunicorn.workersr   rJ   r   ZWorkerr   r   r   r   r   Ú<module>   s   