
y X                 @   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 j Z d  d l j j Z d  d l	 j
 Z
 d  d l j j Z d  d l m Z e   Z Gd d   d e j  Z d S)    )datetimeN)sixc                   sF   e  Z d  Z   f d d   Z d d   Z d d   Z d d   Z   S)	AsyncWorkerc                s,   t  t |   j | |   |  j j |  _ d  S)N)superr   __init__cfgZworker_connections)selfargskwargs)	__class__ F/home/ubuntu/projects/ifolica/build/gunicorn/gunicorn/workers/async.pyr      s    zAsyncWorker.__init__c             C   s   t     d  S)N)NotImplementedError)r   r   r   r   timeout_ctx   s    zAsyncWorker.timeout_ctxc       	      C   s1  d  } zyt  j |  j |  } y | j   } |  j j sd t j |  } |  j | | | |  ns i  } xj d  } |  j    t j |  } Wd  QX| s Pn  | j	 r | j	 } n	 | | _	 |  j | | | |  qm WWn t  j
 j k
 r} z |  j j d |  WYd  d  } ~ Xn t k
 rO} z |  j j d |  WYd  d  } ~ Xn t j k
 rvt j t j     Yn_ t k
 rt j t j     Yn; t k
 r} z |  j | | | |  WYd  d  } ~ Xn XWnBt j k
 rY} z^ | j d t j k r!|  j j d  | j   n& |  j j d  |  j | | | |  WYd  d  } ~ Xn t k
 r} zh | j t j t j f k r|  j j d  n5 | j t j k r|  j j d  n |  j j d  WYd  d  } ~ Xn; t k
 r} z |  j | | | |  WYd  d  } ~ Xn XWd  t j |  Xd  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 EPIPE)httpZRequestParserr   getsockname	keepaliver   nexthandle_requestr   proxy_protocol_infoerrorsZ
NoMoreDatalogdebugStopIterationsslSSLErrorreraisesysexc_infoEnvironmentError	Exceptionhandle_errorr	   SSL_ERROR_EOFcloseerrnoEPIPE
ECONNRESET	exceptionutil)	r   Zlistenerclientaddrreqparserlistener_namer   er   r   r   handle   sX    		%%-("-zAsyncWorker.handlec              C   s  t  j   } i  } d  } z5y|  j j |  |  t j | | | | |  j  \ } } d | d <|  j d 7_ |  j r |  j |  j k r |  j	 j
 d  | j   d |  _ n  |  j j s | j   n  |  j | | j  } | t k r d Szx t | | d  r| j |  n x | D] }	 | j |	  qW| j   t  j   | }
 |  j	 j | | | |
  Wd  t | d  r| j   n  X| j   rt    n  Wn t k
 r  Yn t k
 rt j t j     Yns t k
 rK| rD| j rD|  j	 j d  y | j t  j!  | j   Wn t k
 r7Yn Xt    n    Yn XWd  y |  j j" |  | | |  Wn" t k
 r|  j	 j d	  Yn XXd S)
NTzwsgi.multithread   z,Autorestarting worker after current request.Fzwsgi.file_wrapperr#   zError handling requestzException in post_request hook)#r   nowr   Zpre_requestwsgicreatenraliveZmax_requestsr   infoZforce_closer   Zstart_responseALREADY_HANDLED
isinstance
write_filewriter#   accesshasattrZshould_closer   r   r   r   r   r   r    Zheaders_sentr'   shutdownsocket	SHUT_RDWRZpost_request)r   r-   r+   sockr*   Zrequest_startenvironrespZrespiteritemZrequest_timer   r   r   r   U   sb    


zAsyncWorker.handle_request)__name__
__module____qualname__r   r   r/   r   r   r   )r   r   r      s   7r   )r   r$   r>   r   r   Zgunicorn.httpr   Zgunicorn.http.wsgir2   Zgunicorn.utilr(   Zgunicorn.workers.baseZworkersbaseZgunicornr   objectr7   ZWorkerr   r   r   r   r   <module>   s   	