a
    &Úwh$  ã                   @   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   úO/var/www/battlenet.uz/venv/lib/python3.9/site-packages/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 v rHt | jd d¡ |d W S W nx tyÌ } z`|jd tj	kr†| j
W  Y d }~S |jd tjkr¶| jdk r²| j
W  Y d }~S t‚‚ W Y d }~n
d }~0 0 d S )Nr   r   )ÚnotifyÚselectZwait_fdsÚPIPEÚosÚreadÚOSErrorÚ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_alive4   s    zSyncWorker.is_parent_alivec              
   C   sž   | j d }| jrš|  ¡  z|  |¡ W q
W n< tyf } z$|jtjtjtjfvrR‚ W Y d }~n
d }~0 0 |  	¡ std S z|  
|¡ W q
 ty–   Y d S 0 q
d S ©Nr   )r    Úaliver   r   r   r   Ú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y0   Y d S 0 |d ur |D ]`}|| jd krRq>z|  |¡ W q> tyœ } z$|jtjtj	tj
fvrˆ‚ W Y d }~q>d }~0 0 q>|  ¡ s d S q d S r+   )r,   r   r&   r   r   r   r   r   r-   r.   r/   r*   )r   r#   Úreadyr   r%   r   r   r   Úrun_for_multipleX   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   Úlenr2   r0   )r   r#   Úsr   r   r   Úrunp   s    

zSyncWorker.runc              
   C   s   d }zèzD| j jr t || j ¡}t | j ||¡}t|ƒ}|  ||||¡ W n” tjj	y„ } z| j
 d|¡ W Y d }~nfd }~0  ty¶ } z| j
 d|¡ W Y d }~n4d }~0  tjy } zN|jd tjkrî| j
 d¡ | ¡  n| j
 d¡ |  ||||¡ W Y d }~nÌd }~0  ty¬ } zv|jtjtjtjfvrT| j
 d¡ nD|jtjkrp| j
 d¡ n(|jtjkrŒ| j
 d¡ n| j
 d	¡ W Y d }~n>d }~0  tyà } z|  ||||¡ W Y d }~n
d }~0 0 W t |¡ nt |¡ 0 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)ÚcfgZis_sslr   Ússl_wrap_socketr   ZRequestParserÚnextÚhandle_requestÚerrorsZ
NoMoreDatar(   ÚdebugÚStopIterationÚsslÚSSLErrorr   ÚSSL_ERROR_EOFÚcloseÚhandle_errorr   r   ÚEPIPEÚ
ECONNRESETÚENOTCONNÚ	exceptionÚBaseExceptionr   )r   r   r   r   ÚreqÚparserr%   r   r   r   r      s8    $$
$ (zSyncWorker.handlec                 C   s&  i }d }zÜz| j  | |¡ t ¡ }t |||| ¡ | j ¡\}}| ¡  |  jd7  _| j| j	krv| j
 d¡ d| _|  ||j¡}zjt||d ƒr | |¡ n|D ]}	| |	¡ q¤| ¡  W t ¡ | }
| j
 ||||
¡ t|dƒrî| ¡  n4t ¡ | }
| j
 ||||
¡ t|dƒr"| ¡  0 W n„ tyH   tjt ¡ Ž  Y nd tyª   |r¤|jr¤| j
 d¡ z| tj¡ | ¡  W n tyœ   Y n0 tƒ ‚‚ Y n0 W z| j   | |||¡ W n  tyä   | j
 d¡ Y n0 n:z| j   | |||¡ W n  ty   | j
 d¡ Y n0 0 d S )Nr   z,Autorestarting worker after current request.Fzwsgi.file_wrapperr@   zError handling requestzException in post_request hook)!r6   Zpre_requestr   Únowr   ÚcreateÚgetsocknameZforce_closer"   Zmax_requestsr(   r)   r,   Zstart_responseÚ
isinstanceÚ
write_fileÚwriter@   ÚaccessÚhasattrr   r   ÚreraiseÚsysÚexc_infoÚ	ExceptionZheaders_sentrE   ÚshutdownÚsocketÚ	SHUT_RDWRr<   Zpost_request)r   r   rG   r   r   ÚenvironÚrespZrequest_startZrespiterÚitemZrequest_timer   r   r   r9   ¡   s`    

ÿ


ý
ýzSyncWorker.handle_requestN)r	   r
   r   r   r&   r*   r0   r2   r5   r   r9   r   r   r   r   r      s   "r   )r   r   r   r   rV   r=   rR   Zgunicornr   Zgunicorn.httpr   r   r   Zgunicorn.workersr   rT   r   ZWorkerr   r   r   r   r   Ú<module>   s   