o
    ¹il  ã                   @   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   úP/var/www/edux/Edux_v2/venv/lib/python3.10/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   Úclose_on_execÚhandle)ÚselfÚlistenerÚclientÚaddrr   r   r   r      s   

zSyncWorker.acceptc              
   C   sÆ   z+|   ¡  t | jg g |¡}|d r)| jd |d v r$t | jd d¡ |d W S W d S  tjyb } z*|jd tj	krE| j
W  Y d }~S |jd tjkr]| jdk r[| j
W  Y d }~S t‚‚ d }~ww )Nr   r   )ÚnotifyÚselectÚwait_fdsÚPIPEÚosÚreadÚerrorÚargsÚerrnoÚ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)Úppidr   ÚgetppidÚlogÚinfo)r   r   r   r   Úis_parent_alive5   s   zSyncWorker.is_parent_alivec              
   C   s¢   | j d }| jrO|  ¡  z|  |¡ W q ty1 } z|jtjtjtjfvr'‚ W Y d }~nd }~ww |  	¡ s8d S z|  
|¡ W n
 tyI   Y d S w | jsd S 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 rZ|  ¡  z|  |¡}W n
 ty   Y d S w |d urO|D ]/}|| jd kr)qz|  |¡ W q tyN } z|jtjtj	tj
fvrD‚ W Y d }~qd }~ww |  ¡ sUd S | j sd S d S r/   )r0   r   r)   r   r   r   r1   r!   r2   r3   r4   r.   )r   r&   Úreadyr   r(   r   r   r   Úrun_for_multipleY   s0   ÿÿþ€ÿëzSyncWorker.run_for_multiplec                 C   sJ   | j pd}| jD ]}| d¡ qt| jƒdkr|  |¡ d S |  |¡ d S )Ng      à?r   r   )r&   r#   r   Úlenr7   r5   )r   r&   Úsr   r   r   Úrunq   s   

zSyncWorker.runc              
   C   s<  d }zz!| j jrt || j ¡}t | j ||¡}t|ƒ}|  ||||¡ W nÂ tjj	y@ } z| j
 d|¡ W Y d }~n´d }~w tyX } z| j
 d|¡ W Y d }~n¤d }~w tjy‹ } z'|jd tjkrs| j
 d¡ | ¡  n| j
 d¡ |  ||||¡ W Y d }~nyd }~w tyÎ } z8|jtjtjtjfvr¤| j
 d¡ n |jtjkr±| j
 d¡ n|jtjkr¾| j
 d¡ n| j
 d	¡ W Y d }~n>d }~w tyç } z|  ||||¡ W Y d }~n-d }~ww W t |¡ d S W t |¡ d S W t |¡ d S W t |¡ d S W t |¡ d S W t |¡ d S t |¡ w )
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)ÚcfgÚis_sslr   Ússl_wrap_socketr   ÚRequestParserÚnextÚhandle_requestÚerrorsÚ
NoMoreDatar,   ÚdebugÚStopIterationÚsslÚSSLErrorr    ÚSSL_ERROR_EOFÚcloseÚhandle_errorr1   r!   ÚEPIPEÚ
ECONNRESETÚENOTCONNÚ	exceptionÚBaseExceptionr   )r   r   r   r   ÚreqÚparserr(   r   r   r   r   €   sZ   €€
€€€ÿêéë€ € þzSyncWorker.handlec                 C   s  i }d }zçzŒ| j  | |¡ t ¡ }t |||| ¡ | j ¡\}}| ¡  |  jd7  _| j| j	kr9| j
 d¡ d| _|  ||j¡}z5t||d ƒrN| |¡ n
|D ]}	| |	¡ qP| ¡  W t ¡ | }
| j
 ||||
¡ t|dƒru| ¡  nt ¡ | }
| j
 ||||
¡ t|dƒr| ¡  w w W n< ty¡   tjt ¡ Ž  Y n- tyÍ   |rÌ|jrÌ| j
 d¡ z| tj¡ | ¡  W tƒ ‚ tyË   Y tƒ ‚w ‚ w W z| j   | |||¡ W d S  tyë   | j
 d¡ Y d S w z| j   | |||¡ W w  ty   | j
 d¡ Y w w )Nr   z,Autorestarting worker after current request.Fzwsgi.file_wrapperrH   zError handling requestzException in post_request hook)!r;   Úpre_requestr   Únowr   ÚcreateÚgetsocknameÚforce_closer%   Úmax_requestsr,   r-   r0   Ústart_responseÚ
isinstanceÚ
write_fileÚwriterH   ÚaccessÚhasattrr1   r   ÚreraiseÚsysÚexc_infoÚ	ExceptionÚheaders_sentrM   ÚshutdownÚsocketÚ	SHUT_RDWRrD   Úpost_request)r   r   rO   r   r   ÚenvironÚrespÚrequest_startÚrespiterÚitemÚrequest_timer   r   r   r@   ¢   sr   

ÿ

€ý

ÿ€

þþõ€ÿþÿzSyncWorker.handle_requestN)r	   r
   r   r   r)   r.   r5   r7   r:   r   r@   r   r   r   r   r      s    "r   )r   r!   r   r   rc   rE   r^   Úgunicornr   Úgunicorn.httpr   r   r   Úgunicorn.workersr   r`   r   ÚWorkerr   r   r   r   r   Ú<module>   s   