
y Xk=                 @   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	 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 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 Z e e d d  Z e   Z  dX Z! dY Z" e# d j$    Z% y  d  d l& m& Z& d d   Z' Wn e( k
 rd d   Z' Yn Xy d  d l) m* Z* Wn- e( k
 rd d   Z+ d d d  Z* Yn Xd d d d  Z, d d   Z- d d   Z. e j/ j0 d  rBd d d   Z1 d! d"   Z2 n	 e j3 Z2 d# d$   Z3 d% d&   Z4 d' d( d)  Z5 d* d+   Z6 d, d-   Z7 d. d/   Z8 d0 d1   Z9 y d  d2 l m: Z: Wn e( k
 rd3 d4   Z: Yn Xd5 d6   Z; d d7 d8  Z< d d9 d:  Z= d d; d<  Z> d= d>   Z? d? d@   Z@ dA dB   ZA dC dD   ZB d dE dF  ZC dG dH   ZD d dI dJ  ZE dK dL   ZF dM dN   ZG dO dP dQ  ZH dR dS   ZI dT dU   ZJ dV dW   ZK d S)Z    )print_functionN)AppImportError)	text_type)SUPPORTED_WORKERSi   devnullz	/dev/null      z
    connection keep-alive proxy-authenticate proxy-authorization
    te trailers transfer-encoding upgrade
    server date
    )setproctitlec             C   s   t  d |   d  S)Nzgunicorn: %s)r	   )title r   =/home/ubuntu/projects/ifolica/build/gunicorn/gunicorn/util.py_setproctitle9   s    r   c             C   s   d  S)Nr   )r
   r   r   r   r   <   s    )import_modulec             C   s   t  | d  s t d   n  t |  } xZ t | d d	  D]F } y | j d d |  } Wq= t k
 r d } t |   Yq= Xq= Wd | d |  |  f S)
z6Return the absolute name of the module to be imported.rindexz'package' not set to a string   .r   z2attempted relative import beyond top-level packagez%s.%sN)hasattr
ValueErrorlenranger   )namepackageleveldotxmsgr   r   r   _resolve_nameC   s    r   c             C   s   |  j  d  rt | s$ t d   n  d } x( |  D]  } | d k rG Pn  | d 7} q1 Wt |  | d  | |  }  n  t |   t j |  S)zImport a module.

The 'package' argument is required when performing a relative import. It
specifies the package to use as the anchor point from which to resolve the
relative import to an absolute import.

r   z/relative imports require the 'package' argumentr   r   N)
startswith	TypeErrorr   
__import__sysmodules)r   r   r   	characterr   r   r   r   P   s    
r   z gunicorn.workers.sync.SyncWorkerzgunicorn.workersc             C   s  t  j |   r |  S|  j d  r |  j d  d } y | j d d  \ } } Wn t k
 rq | } | } Yn Xy t j | | |  SWqt j	   } d } t
 | |  | f   YqXn"|  j d  } t |  d k ryx |  j d  r|  d d   }  n  |  t k r(t |  j d  } Pn  y t j d | |   SWq t j	   } d } t
 | |  | f   Yq Xq Wn  | j d  }	 y t d j |   }
 Wn0 t j	   } d } t
 | |  | f   Yn Xt |
 |	  Sd  S)Nzegg:r   #z)class uri %r invalid or not found: 

[%s]r   Zgunicornr   )inspectZisclassr   splitrsplitr   pkg_resourcesload_entry_point	traceback
format_excRuntimeErrorr   r   popr   joingetattr)uridefaultsectionZ	entry_strdistr   excr   
componentsklassmodr   r   r   
load_classe   sL    	"r8   c             C   s@   | r& t  |  d @} t j |  n  |  r< t j |   n  d S)z) set user and group of workers processes iN)absossetgidsetuid)uidgidr   r   r   set_owner_process   s
    r?   c             C   s'   t  |  d @} t j |  | |  d  S)Ni)r9   r:   chown)pathr=   r>   r   r   r   r@      s    r@   winFc             C   s   |  |  | r | } n$ t  j j |  \ } } | p: d } d } xR | d k  r t  j |  } | rm | n	 | | k s} d  St j |  | d 9} qF Wt j d | t d d d  S)Nr   gMbP?g      ?   z)tests may fail, delete still pending for 
stacklevel   )	r:   rA   r&   listdirtimesleepwarningswarnRuntimeWarning)funcpathnameZwaitalldirnamer   timeoutLr   r   r   _waitfor   s    
	rQ   c             C   s   t  t j |   d  S)N)rQ   r:   unlink)filenamer   r   r   _unlink   s    rT   c             C   s[   y t  |   WnF t k
 rV } z& | j t j t j f k rD   n  WYd  d  } ~ Xn Xd  S)N)rT   OSErrorerrnoENOENTENOTDIR)rS   errorr   r   r   rR      s
    rR   c             C   sL   y t  j t  j |   Wn. t  j k
 r2 d SYn t k
 rG d SYn Xd S)NFT)socket	inet_ptonAF_INET6rY   r   )addrr   r   r   is_ipv6   s    	r^   i@  c             C   s_  |  j  d  r  |  j d  d S|  j  d  r@ |  j d  d S|  j  d  re |  j d  d }  n  d |  k r d |  k r |  j d  d d d   j   } nI d |  k r |  j d  d j   } n! |  d	 k r d
 } n |  j   } |  j d  d }  d |  k rO|  j d d  d } | j   s@t d |   n  t |  } n | } | | f S)Nzunix://r   zunix:ztcp://[]r   : z0.0.0.0z%r is not a valid port number.r   )r   r&   lowerisdigitr,   int)netlocdefault_porthostportr   r   r   parse_address   s*    &	rj   c              C   s2   t  j t  j  d }  |  t  j k r. t }  n  |  S)Nr   )resourceZ	getrlimitZRLIMIT_NOFILEZRLIM_INFINITYMAXFD)Zmaxfdr   r   r   	get_maxfd   s    	rm   c             C   s<   t  j  |  t  j  } | t  j O} t  j  |  t  j |  d  S)N)fcntlF_GETFD
FD_CLOEXECF_SETFD)fdflagsr   r   r   close_on_exec  s    rt   c             C   s6   t  j  |  t  j  t j B} t  j  |  t  j |  d  S)N)rn   F_GETFLr:   
O_NONBLOCKF_SETFL)rr   rs   r   r   r   set_non_blocking  s    rx   c             C   s*   y |  j    Wn t j k
 r% Yn Xd  S)N)closerZ   rY   )sockr   r   r   ry     s    ry   )
closerangec             C   sD   x= t  |  |  D], } y t j |  Wq t k
 r; Yq Xq Wd  S)N)r   r:   ry   rU   )Zfd_lowZfd_highrr   r   r   r   r{     s
    r{   c             C   sc   t  | t  r! | j d  } n  d t |  } d j | j d  | d g  } |  j |  d  S)Nzutf-8z%X
    s   
)
isinstancer   encoder   r.   sendall)rz   data
chunk_sizechunkr   r   r   write_chunk#  s
    !r   c             C   s$   | r t  |  |  S|  j |  d  S)N)r   r   )rz   r   chunkedr   r   r   write+  s    r   c             C   sa   |  j    } | d k rM z! |  j d  t |  | |  SWd  |  j d  Xn t |  | |  Sd  S)Ng        r   r   )
gettimeoutsetblockingr   )rz   r   r   rO   r   r   r   write_nonblock1  s    r   c             C   s+   x$ t  |  D] } t |  | |  q Wd  S)N)listr   )rz   linesr   liner   r   r   
writelines=  s    r   c             C   so   t  j d  i | d 6t j |  d 6} t  j d  t |  | t |  | f } t |  | j d   d  S)Nz    <html>
      <head>
        <title>%(reason)s</title>
      </head>
      <body>
        <h1><p>%(reason)s</p></h1>
        %(mesg)s
      </body>
    </html>
    reasonmesgzl    HTTP/1.1 %s %s
    Connection: close
    Content-Type: text/html
    Content-Length: %d
    
    %slatin1)textwrapdedentcgiescapestrr   r   r~   )rz   Z
status_intr   r   htmlhttpr   r   r   write_errorB  s
    
$%r   c             C   s#   d j  d d   |  j d  D  S)N-c             S   s"   g  |  ] } | j    j    q Sr   )rc   
capitalize).0wr   r   r   
<listcomp>Z  s   	 z"normalize_name.<locals>.<listcomp>)r.   r&   )r   r   r   r   normalize_nameY  s    r   c             C   sE  |  j  d d  } t |  d k r4 |  d }  } n | d | d }  } y t |   Wne t k
 r |  j d  r t j j |   r d } t | |  j d d  d | f   n   Yn Xt	 j
 |  } y t | | j  } Wn" t k
 rt d |    Yn X| d  k r&t d	 |   n  t |  sAt d
   n  | S)Nra   r   Zapplicationr   z.pyz1Failed to find application, did you mean '%s:%s'?r   zFailed to find application: %rz%Failed to find application object: %rz$Application object must be callable.)r&   r   r    ImportErrorendswithr:   rA   existsr'   r!   r"   eval__dict__	NameErrorr   callable)modulepartsobjr   r7   appr   r   r   
import_app]  s*    !)r   c           	   C   s   yo t  j t  j d  }  t  j t  j    } |  j | j k rb |  j | j k rb t  j d } n t  j   } Wn t  j   } Yn X| S)NZPWD)r:   statenvirongetcwdst_inost_dev)abcwdr   r   r   r   |  s    $r   c             C   s=   |  d k r t  j    }  n  t j j |  d d d d } | S)z@Return the current date and time formatted for a message header.N	localtimeFusegmtT)rG   emailutils
formatdate)	timestampsr   r   r   	http_date  s    r   c             C   s   |  j    j   t k S)N)rc   striphop_headers)headerr   r   r   
is_hoppish  s    r   c                sB  d t  j k r>t  j   r+ t  j d  n  t  j   t  j   rQ t  j d  n  t  j d  |  s t d d  t  j t t  j	      d k r t  j
   d  n  t  j
   d  t  j
   d  q>t  j t t  j	      d k r	t  j d  t  j
   d  n    f d d   } | t j d  | t j d  n  d	 S)
z~    Standard daemonization of a process.
    http://www.svbug.com/documentation/comp.unix.programmer-FAQ/faq_2.html#SEC16
    ZGUNICORN_FDr         r   rC   c                sa   yH |  j    } | | k rG |  j   rG t j |  t j   |  n  Wn t k
 r\ Yn Xd  S)N)filenoisattyr:   ry   dup2AttributeError)streamZ	fd_expectrr   )fd_nullr   r   redirect  s    zdaemonize.<locals>.redirectN)r:   r   fork_exitsetsidumaskr{   openREDIRECT_TOO_RDWRr   ry   r!   stdoutstderr)Zenable_stdio_inheritancer   r   )r   r   	daemonize  s*    
	r   c               C   sV   y t  j t j d   Wn5 t k
 rQ t  j d t j   t j   f  Yn Xd  S)N@   z%s.%s)randomseedr:   urandomNotImplementedErrorrG   getpidr   r   r   r   r     s    r   c             C   s_   y t  |  d  } Wn; t k
 rP } z t d |  | f   WYd  d  } ~ Xn X| j   d  S)Nr   zError: '%s' isn't writable [%r])r   IOErrorr,   ry   )rA   fer   r   r   check_is_writeable  s
    )r   utf8c             C   sB   t  |  t  r |  St  |  t  s5 t d |    n  |  j |  S)z+Converts a string argument to a byte stringz%r is not a string)r}   bytesr   r   r~   )valueencodingr   r   r   to_bytestring  s
    r   c             C   sJ   t  |  d  s d Sy |  j   Wn" t t t j f k
 rE d SYn Xd S)Nr   FT)r   r   r   r   ioUnsupportedOperation)r   r   r   r   
has_fileno  s    	r   c             C   s   t  d d t j |  j   } xJ t |  D]< \ } } | d k rQ d | } n  t  d | d t j q, Wt  d d t j t j j   d  S)Nz!!!filer   zWARNING: %sz!!! %sz!!!
)printr!   r   
splitlines	enumerateflush)r   r   ir   r   r   r   rJ     s    rJ   c                s     f d d   } | S)Nc                s,   | d d d t  t     f g    g S)Nz500 Internal Server ErrorContent-Type
text/plainzContent-Length)r   r   )r   r   )r   Zstart_response)r   r   r   r     s    zmake_fail_app.<locals>.appr   )r   r   r   )r   r   make_fail_app  s    r   i @  i  )L
__future__r   email.utilsr   rn   grpr   r:   r(   pwdr   rk   rZ   r   r!   r   rG   r*   r%   rV   rI   r   Zgunicorn.errorsr   Zgunicorn.sixr   Zgunicorn.workersr   rl   r/   r   objectZtimeout_defaultZ
CHUNK_SIZEZMAX_BODYsetr&   r   r	   r   r   	importlibr   r   r8   r?   r@   platformr   rQ   rT   rR   r^   rj   rm   rt   rx   ry   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rJ   r   r   r   r   r   <module>   s   	
0!		
	S	