a
    �ÏOcŸ  ã                   @   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  m
Z
 d dlmZ d dlm  mZ G dd„ deƒZG dd„ dejƒZdS )é    )ÚdatetimeNc                   @   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   úL/var/www/html/gsl.tools/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ÚsetblockingÚutilZ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 nz tj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Ú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_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   Ú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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   Úlenr/   r-   )r   r   Úsr   r   r	   Úrunp   s    

zSyncWorker.runc              
   C   s  d }�zôzP| j jr,tj|fddi| j 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�r`| j d¡ nD|jtjk�r|| 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 )NÚserver_sideTz*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_sslÚsslÚwrap_socketZssl_optionsÚhttpZRequestParserÚnextÚhandle_requestÚerrorsZ
NoMoreDatar$   ÚdebugÚStopIterationÚSSLErrorr   ÚSSL_ERROR_EOFÚcloseÚhandle_errorr)   r   ÚEPIPEÚ
ECONNRESETÚENOTCONNÚ	exceptionÚ	Exceptionr   )r   r   r   r   ÚreqÚparserr!   r   r   r	   r      s<    ÿ$$
$ (zSyncWorker.handlec                 C   s  i }d }�z¼zú| j  | |¡ t ¡ }t |||| ¡ | j ¡\}}| ¡  |  jd7  _| j| j	krt| j
 d¡ d| _|  ||j¡}zjt||d ƒrž| |¡ n|D ]}	| |	¡ q¢| ¡  t ¡ | }
| j
 ||||
¡ W t|dƒrì| ¡  nt|dƒ�r| ¡  0 W n„ t�y(   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)!r4   Zpre_requestr   ÚnowÚwsgiÚcreateÚgetsocknameZforce_closer   Zmax_requestsr$   r%   r(   Zstart_responseÚ
isinstanceÚ
write_fileÚwriter?   ÚaccessÚhasattrr)   r   ÚreraiseÚsysÚexc_inforE   Zheaders_sentrD   ÚshutdownÚsocketÚ	SHUT_RDWRr<   Zpost_request)r   r   rF   r   r   ÚenvironÚrespZrequest_startZrespiterÚitemZrequest_timer   r   r	   r9   £   s\    

ÿ

ÿ
ýzSyncWorker.handle_requestN)r   r   r   r   r"   r&   r-   r/   r2   r   r9   r   r   r   r	   r
      s   $r
   )r   r   r   r   rU   r5   rR   Zgunicorn.httpr7   Zgunicorn.http.wsgirI   Zgunicorn.utilr   Zgunicorn.workers.baseÚworkersÚbaserE   r   ZWorkerr
   r   r   r   r	   Ú<module>   s   