
    O=dQ                        d dl mZ d dlZ	 d dlZd dlmZ  eej                   ed          k     r ed          n# e$ r  ed          w xY wd dlm	Z	m
Z
 d dlmZ d dlmZ d dlZd d	lmZ dd
Zd Zd Zd Z G d de          ZdS )    )partialN)parse_versionz0.24.1z2eventlet worker requires eventlet 0.24.1 or higher)hubsgreenthread)GreenSocket)ALREADY_HANDLED)AsyncWorkerc                    |                                  dk    rt          d          |r|                    |           |rt          |d          nd}d}|j        }| j        }	 	 |rt          ||z
  |          }|dk    rn^t           ||                    }|snC	 	  ||          }	||	z  }|	t          |          k     r||	d          }nn# t          $ r Y =w xY wAz||dk    r)t          |d          r|                    ||z              S S S # |dk    r)t          |d          r|                    ||z              w w w xY w)Nr   z&non-blocking sockets are not supportedi    Tseek)

gettimeout
ValueErrorr   minreadsend
memoryviewlenBlockingIOErrorhasattr)
selffileoffsetcount	blocksize
total_sent	file_read	sock_senddatasents
             DD:\Sites\api_v1\venv\Lib\site-packages\gunicorn/workers/geventlet.py_eventlet_socket_sendfiler       s    AABBB 		&$)3E4   tIJ	I	I+	 
 2I>>	>>ii	2233D 
	$9T??D $&Jc$ii''#DEE{ '   H
	& >>gdF33>IIfz)**** >:>>gdF33>IIfz)**** >s0   $9D C )$D 
CD CD 2Ec                    t           j                            |          }t           j                                        }	 	 |                                 \  }}|                    |||          }|                    t          ||           d\  }}}n># t           j	        $ r, | 
                                 |                                 Y dS w xY w)z
    Serve requests forever.

    This code is nearly identical to ``eventlet.convenience.serve`` except
    that it attempts to join the pool at the end, which allows for gunicorn
    graceful shutdowns.
    T)NNNN)eventlet	greenpool	GreenPoolr   
getcurrentacceptspawnlink_eventlet_stop	StopServeclosewaitall)sockhandleconcurrencypool	server_gtconnaddrgts           r   _eventlet_server5   A   s     ''44D$//11I		JD$FD$//BGGNIt444-ND$! 	 	 	JJLLLLLNNNFF		s    AB 7CCc                    	 	 |                                   |                                 dS # |                                 w xY w# t          j        $ r Y dS t          $ r' t          j        |gt          j                    R   Y dS w xY w)z
    Stop a greenlet handling a request and close its connection.

    This code is lifted from eventlet so as not to depend on undocumented
    functions in the library.
    N)	waitr+   greenletGreenletExit	Exceptionr   killsysexc_info)clientserverr2   s      r   r)   r)   X   s    2	KKMMMJJLLLLLDJJLLLL     2 2 21#,..11111112s&   - A AA B,BBc                  V    t          t          d          st          t          _        d S d S )Nsendfile)r   r   r    rA        r   patch_sendfilerD   j   s.     ;
++ 989 9rC   c                   X     e Zd Zd Z fdZ fdZ fdZ fdZd Z fdZ	d Z
 xZS )	EventletWorkerc                 n    t          j                     t          j                     t	                       d S N)r   use_hubr"   monkey_patchrD   r   s    r   patchzEventletWorker.patchz   s.    rC   c                 x    |t           k    rt                      t                                          |          S rH   )EVENTLET_ALREADY_HANDLEDStopIterationsuperis_already_handled)r   respiter	__class__s     r   rQ   z!EventletWorker.is_already_handled   s1    /////!ww))(333rC   c                 p    |                                   t                                                       d S rH   )rL   rP   init_process)r   rS   s    r   rU   zEventletWorker.init_process   s,    

rC   c                 V    t          j        t                      j        ||           d S rH   )r"   r'   rP   handle_quitr   sigframerS   s      r   rW   zEventletWorker.handle_quit   $    uww*C77777rC   c                 V    t          j        t                      j        ||           d S rH   )r"   r'   rP   handle_usr1rX   s      r   r]   zEventletWorker.handle_usr1   r[   rC   c                 D    t          j        | j        j        pd d          S )NF)r"   Timeoutcfg	keepaliverK   s    r   timeout_ctxzEventletWorker.timeout_ctx   s     2 :dEBBBrC   c                     | j         j        rt          j        |fddi| j         j        }t                                          |||           d S )Nserver_sideT)r`   is_sslr"   wrap_sslssl_optionsrP   r.   )r   listenerr>   r3   rS   s       r   r.   zEventletWorker.handle   s^    8? 	?&v ? ?4 ?)-)=? ?F 	x.....rC   c                 ,   g }| j         D ]}t          |          }|                    d           t          | j        |          }t          j        t          ||| j                  }|	                    |           t          j
        d           | j        r/|                                  t          j
        d           | j        /|                                  	 t          j        | j        j                  5 }|D ](}|                    t          j                               )|D ]}|                                 	 d d d            d S # 1 swxY w Y   d S # t
          j        $ r+}||k    r |D ]}|                                 Y d }~d S d }~ww xY w)N   g        g      ?)socketsr   setblockingr   r.   r"   r'   r5   worker_connectionsappendsleepalivenotifyr_   r`   graceful_timeoutr;   r*   r7   )	r   	acceptorsr-   gsockhfunacceptortates	            r   runzEventletWorker.run   s
   	L 	  	 D%%Ea   4;..D~oud&*&=? ?H X&&&N3j 	 KKMMMN3 j 	  	
	!$(";<< " 1 1AFF8-//0000"  AFFHHHH                 
  	 	 	Qww       	s=   E 9AE?E EE EE F( FF)__name__
__module____qualname__rL   rQ   rU   rW   r]   rb   r.   rz   __classcell__)rS   s   @r   rF   rF   x   s          
4 4 4 4 4
    8 8 8 8 88 8 8 8 8C C C/ / / / /      rC   rF   )r   N)	functoolsr   r<   r"   pkg_resourcesr   __version__RuntimeErrorImportErrorr   r   eventlet.greenior   eventlet.wsgir   rN   r8   gunicorn.workers.base_asyncr	   r    r5   r)   rD   rF   rB   rC   r   <module>r      s         



QOOO ,+++++}X)**]]8-D-DDDlOPPP E	  M M M
,K
L
LLM ' & & & & & & & ( ( ( ( ( ( E E E E E E  3 3 3 3 3 3#+ #+ #+ #+N  .2 2 2$9 9 9; ; ; ; ;[ ; ; ; ; ;s	   ? A