
y X!                 @   s&  d  d l  m  Z  d  d l Z d  d l m Z d  d l Z d  d l m 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 m Z m Z m Z m Z m Z m Z d  d	 l m Z m Z d  d
 l m Z m Z d  d l m Z Gd d   d e  Z  d S)    )datetimeN)randint)SSLError)util)	WorkerTmp)Reloader)InvalidHeaderInvalidHeaderNameInvalidRequestLineInvalidRequestMethodInvalidHTTPVersionLimitRequestLineLimitRequestHeaders)InvalidProxyLineForbiddenProxyRequest)default_environResponse)MAXSIZEc               @   s   e  Z d  Z d d   d j   D Z g  Z d d   Z d d   Z e 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 d   Z d d   Z d d   Z d d   Z d  S)!Workerc             C   s#   g  |  ] } t  t d  |   q S)zSIG%s)getattrsignal).0x r   E/home/ubuntu/projects/ifolica/build/gunicorn/gunicorn/workers/base.py
<listcomp>   s   	zWorker.<listcomp>z+ABRT HUP QUIT INT TERM USR1 USR2 WINCH CHLDc       	      C   s   | |  _  | |  _ | |  _ | |  _ | |  _ | |  _ d |  _ d |  _ d |  _ d |  _	 t
 d | j  } | j | p| t |  _ d |  _ | |  _ t |  |  _ d S)z        This is called pre-fork so it shouldn't do anything to the
        current process. If there's a need to make process wide
        changes you'll want to do that in ``self.init_process()``.
        FNr   T)ageppidsocketsapptimeoutcfgbootedZabortedreloadernrr   Zmax_requests_jitterZmax_requestsr   alivelogr   tmp)	selfr   r   r   r   r    r!   r&   Zjitterr   r   r   __init__"   s    												zWorker.__init__c             C   s   d |  j  S)Nz<Worker %s>)pid)r(   r   r   r   __str__9   s    zWorker.__str__c             C   s
   t  j   S)N)osgetpid)r(   r   r   r   r*   <   s    z
Worker.pidc             C   s   |  j  j   d S)z        Your worker subclass must arrange to have this method called
        once every ``self.timeout`` seconds. If you fail in accomplishing
        this task, the master process will murder your workers.
        N)r'   notify)r(   r   r   r   r.   @   s    zWorker.notifyc             C   s   t     d S)z        This is the mainloop of a worker process. You should override
        this method in a subclass to provide the intended behaviour
        for your particular evil schemes.
        N)NotImplementedError)r(   r   r   r   runH   s    z
Worker.runc                sn    j  j r@   f d d   } t d |    _   j j   n    j  j r x0   j  j j   D] \ } } | t j | <q_ Wn  t	 j
   j  j   j  j  t	 j   t j     _ x+   j D]  } t	 j |  t	 j |  q Wd d     j D t	 j   j j      j   j d g   _   j j     j     j     j  j    d   _   j   d S)	z        If you override this method in a subclass, the last statement
        in the function should be to call this method with
        super(MyWorkerClass, self).init_process() so that the ``run()``
        loop is initiated.
        c                sJ     j  j d |   d   _   j j    t j d  t j d  d  S)NzWorker reloading: %s modifiedFg?r   )	r&   infor%   r!   
worker_inttimesleepsysexit)fname)r(   r   r   changedZ   s
    	z$Worker.init_process.<locals>.changedcallbackc             S   s   g  |  ] } t  j |   q Sr   )r   close_on_exec)r   sr   r   r   r   u   s   	 z'Worker.init_process.<locals>.<listcomp>r   TN)r!   reloadr   r#   startenvitemsr,   environr   Zset_owner_processuidgidseedpipePIPEZset_non_blockingr:   r   r'   filenoZwait_fdsr&   init_signals	load_wsgiZpost_worker_initr"   r0   )r(   r8   kvpr   )r(   r   init_processP   s,    	


	zWorker.init_processc             C   s   y |  j  j   |  _ Wn t k
 r } z{ |  j j s=   n  |  j j |  zM t j   \ } } } |  j	 j
 | j  t j |  } t j |  |  _ Wd  ~ XWYd  d  } ~ Xn Xd  S)N)r   ZwsgiSyntaxErrorr!   r<   r&   	exceptionr5   exc_infor#   Zadd_extra_filefilename	traceback	format_tbr   Zmake_fail_app)r(   eexc_typeZexc_valexc_tbZ	tb_stringr   r   r   rH      s    zWorker.load_wsgic             C   s   d d   |  j  D t j t j |  j  t j t j |  j  t j t j |  j  t j t j |  j  t j t j	 |  j
  t j t j |  j  t t d  r t j t j d  t j t j	 d  n  t t d  r t j |  j d  n  d  S)Nc             S   s%   g  |  ] } t  j  | t  j   q Sr   )r   SIG_DFL)r   r;   r   r   r   r      s   	 z'Worker.init_signals.<locals>.<listcomp>siginterruptFset_wakeup_fd   )SIGNALSr   SIGQUIThandle_quitSIGTERMhandle_exitSIGINTSIGWINCHhandle_winchSIGUSR1handle_usr1SIGABRThandle_aborthasattrrW   rX   rE   )r(   r   r   r   rG      s    zWorker.init_signalsc             C   s   |  j  j   d  S)N)r&   Zreopen_files)r(   sigframer   r   r   rc      s    zWorker.handle_usr1c             C   s   d |  _  d  S)NF)r%   )r(   rg   rh   r   r   r   r^      s    zWorker.handle_exitc             C   s7   d |  _  |  j j |   t j d  t j d  d  S)NFg?r   )r%   r!   r2   r3   r4   r5   r6   )r(   rg   rh   r   r   r   r\      s    	zWorker.handle_quitc             C   s*   d |  _  |  j j |   t j d  d  S)NFrY   )r%   r!   Zworker_abortr5   r6   )r(   rg   rh   r   r   r   re      s    	zWorker.handle_abortc             C   s  t  j   } | p d } t | t t t t t t t	 t
 t t f
  rd } d } t | t  rs d t |  } nFt | t  r d t |  } n$t | t  r d t |  } nt | t t f  rd t |  } | rt | d	  r| j } qn t | t  r#d t |  } n t | t	  rEd
 t |  } nt t | t
  rgd t |  } nR t | t  rd } d } d } n. t | t  rd } d t |  } d } n  d }	 |  j j |	 j d | d d t |    n: t | d  r|  j j d | j  n  d } d } d } | d  k	 rt  j   | }
 t | | |  j  } | d | d <t | d  | d <t | | |  j  } d | | f | _ t |  | _ |  j j | | | |
  n  y t j | | | |  Wn |  j j d  Yn Xd  S)N rY   i  zBad RequestzInvalid Request Line '%s'zInvalid Method '%s'zInvalid HTTP Version '%s'z%sreqzError parsing headers: '%s'z'%s'	ForbiddenzRequest forbiddeni  z%Invalid request from ip={ip}: {error}ipr   errorurizError handling request %si  zInternal Server ErrorZREMOTE_ADDRZREMOTE_PORTz%s %szFailed to send error message.)ri   ro   )r   now
isinstancer
   r   r   r   r	   r   r   r   r   r   strrf   rj   r&   debugformatrN   rn   r   r!   r   statuslenZresponse_lengthaccessr   Zwrite_error)r(   rj   clientaddrexcZrequest_startZ
status_intreasonZmesgmsgZrequest_timer@   respr   r   r   handle_error   sj    			/zWorker.handle_errorc             C   s   |  j  j d  d  S)Nzworker: SIGWINCH ignored.)r&   rs   )r(   rg   r7   r   r   r   ra      s    zWorker.handle_winchN)__name__
__module____qualname__splitrZ   rE   r)   r+   propertyr*   r.   r0   rL   rH   rG   rc   r^   r\   re   r~   ra   r   r   r   r   r      s"   	6=r   )!r   r,   randomr   r   sslr   r5   r3   rQ   Zgunicornr   Zgunicorn.workers.workertmpr   Zgunicorn.reloaderr   Zgunicorn.http.errorsr   r	   r
   r   r   r   r   r   r   Zgunicorn.http.wsgir   r   Zgunicorn.sixr   objectr   r   r   r   r   <module>   s   4