3
ûZð]ÙK  ã               @   sž  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Zd dlZd dlmZ d dlmZ d dlZeeddƒZedj ƒ ƒZ!yd dl"m"Z" dd	„ Z#W n e$k
�r   d
d	„ Z#Y nX dZdd„Z%e	j&j'e	j&j(fZ)dd„ Z*dd„ Z+d[dd„Z,dd„ Z-ej.j/dƒ�rvd\dd„Z0dd„ Z1nej2Z1dd„ Z2dd „ Z3d]d"d#„Z4d$d%„ Z5d&d'„ Z6d(d)„ Z7yd d*lm8Z8 W n e$k
�rÜ   d+d,„ Z8Y nX d-d.„ Z9d^d/d0„Z:d_d1d2„Z;d3d4„ Z<d5d6„ Z=d7d8„ Z>d9d:„ Z?d`d;d<„Z@d=d>„ ZAdad?d@„ZBdAdB„ ZCdCdD„ ZDdbdFdG„ZEdHdI„ ZFdJdK„ ZGdLdM„ ZHdNdO„ ZIdcdPdQ„ZJdRdS„ ZKdTdU„ ZLdVdW„ ZMdXdY„ ZNdS )dé    N)ÚAppImportError)ÚSUPPORTED_WORKERSÚdevnullz	/dev/nullz€
    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   ú1/tmp/pip-build-w1as9q70/gunicorn/gunicorn/util.pyÚ_setproctitle3   s    r	   c             C   s   d S )Nr   )r   r   r   r   r	   6   s    ú gunicorn.workers.sync.SyncWorkerúgunicorn.workersc             C   sl  t j| ƒr| S | jdƒr’| jdƒd }y|jddƒ\}}W n tk
rV   |}|}Y nX ytj|||ƒS    tj	ƒ }d}t
|| |f ƒ‚Y nX nÖ| jdƒ}t|ƒdk�rxj| jdƒrÂ| dd … } | tkrÚt|  jdƒ}P ytjd|| ƒS    tj	ƒ }d}t
|| |f ƒ‚Y q¬X q¬W |jdƒ}	ytjdj|ƒƒ}
W n(   tj	ƒ }d}t
|| |f ƒ‚Y nX t|
|	ƒS d S )Nzegg:é   ú#z)class uri %r invalid or not found: 

[%s]Ú.Zgunicornéÿÿÿÿ)ÚinspectÚisclassÚ
startswithÚsplitÚrsplitÚ
ValueErrorÚpkg_resourcesÚload_entry_pointÚ	tracebackÚ
format_excÚRuntimeErrorÚlenr   ÚpopÚ	importlibÚimport_moduleÚjoinÚgetattr)ÚuriÚdefaultÚsectionZ	entry_strÚdistÚnameÚexcÚmsgÚ
componentsÚklassÚmodr   r   r   Ú
load_class:   sL    





r+   c             C   s8   t j| ƒ}d}x$|jjƒ D ]}|jtkr|d7 }qW |S )Nr   r   )r   Ú	signatureÚ
parametersÚvaluesÚkindÚpositionals)ÚfÚsigÚarityÚparamr   r   r   Ú	get_arityq   s    

r5   c             C   s   t j| ƒjS )z get the username for a user id)ÚpwdÚgetpwuidÚpw_name)Úuidr   r   r   Úget_username|   s    r:   Fc             C   st   |rb| r.yt | ƒ}W n tk
r,   d}Y nX t|ƒd@ }|rLtj||ƒ n|tjƒ krbtj|ƒ | rptj| ƒ dS )z) set user and group of workers processes FiÿÿÿN)r:   ÚKeyErrorÚabsÚosÚ
initgroupsÚgetgidÚsetgidÚsetuid)r9   Úgidr>   Úusernamer   r   r   Úset_owner_process�   s    

rD   c             C   s   t j| ||ƒ d S )N)r=   Úchown)Úpathr9   rB   r   r   r   rE   ˜   s    rE   Úwinc             C   s†   | |ƒ |r|}nt jj|ƒ\}}|p(d}d}x>|dk rlt j|ƒ}|rL| n||krXd S tj|ƒ |d9 }q0W tjd| tdd� d S )Nr   gü©ñÒMbP?g      ð?é   z)tests may fail, delete still pending for é   )Ú
stacklevel)	r=   rF   r   ÚlistdirÚtimeÚsleepÚwarningsÚwarnÚRuntimeWarning)ÚfuncÚpathnameZwaitallÚdirnamer%   ÚtimeoutÚLr   r   r   Ú_waitfor�   s    



rV   c             C   s   t tj| ƒ d S )N)rV   r=   Úunlink)Úfilenamer   r   r   Ú_unlink¾   s    rY   c             C   sH   yt | ƒ W n6 tk
rB } z|jtjtjfkr2‚ W Y d d }~X nX d S )N)rY   ÚOSErrorÚerrnoÚENOENTÚENOTDIR)rX   Úerrorr   r   r   rW   Ä   s
    rW   c             C   s@   yt jt j| ƒ W n( t jk
r(   dS  tk
r:   dS X dS )NFT)ÚsocketÚ	inet_ptonÚAF_INET6r^   r   )Úaddrr   r   r   Úis_ipv6Í   s    rc   Ú8000c             C   s0  t jd| ƒrt jd| ƒd S | jdƒr^| dd … }yt|ƒS  tk
r\   td| ƒd ‚Y nX | jdƒrv| jdƒd } | | }}d| kr¼d| kr¼| jdƒd	 dd … }| jd
ƒ|g d }n8d| krâ| jdƒ|g d d… \}}n| dkrôd| }}yt|ƒ}W n" tk
�r"   td| ƒ‚Y nX |jƒ |fS )Nz
unix:(//)?r   zfd://é   z"%r is not a valid file descriptor.ztcp://ú[ú]r   z]:ú:rH   Ú z0.0.0.0z%r is not a valid port number.r   )ÚreÚmatchr   r   Úintr   r   Úlower)ÚnetlocÚdefault_portÚfdÚhostÚportr   r   r   Úparse_address×   s.    



rs   c             C   s,   t j | t jƒ}|t jO }t j | t j|ƒ d S )N)ÚfcntlÚF_GETFDÚ
FD_CLOEXECÚF_SETFD)rp   Úflagsr   r   r   Úclose_on_execö   s    
ry   c             C   s(   t j | t jƒtjB }t j | t j|ƒ d S )N)rt   ÚF_GETFLr=   Ú
O_NONBLOCKÚF_SETFL)rp   rx   r   r   r   Úset_non_blockingü   s    r}   c             C   s(   y| j ƒ  W n tjk
r"   Y nX d S )N)Úcloser_   r^   )Úsockr   r   r   r~     s    r~   )Ú
closerangec             C   s<   x6t | |ƒD ](}ytj|ƒ W q tk
r2   Y qX qW d S )N)Úranger=   r~   rZ   )Zfd_lowZfd_highrp   r   r   r   r€   
  s
    r€   c             C   sD   t |tƒr|jdƒ}dt|ƒ }dj|jdƒ|dgƒ}| j|ƒ d S )Nzutf-8z%X
ó    s   
)Ú
isinstanceÚstrÚencoder   r   Úsendall)r   ÚdataÚ
chunk_sizeÚchunkr   r   r   Úwrite_chunk  s
    

rŠ   c             C   s   |rt | |ƒS | j|ƒ d S )N)rŠ   r†   )r   r‡   Úchunkedr   r   r   Úwrite  s    
rŒ   c             C   sF   | j ƒ }|dkr6z| jdƒ t| ||ƒS | jdƒ X nt| ||ƒS d S )Ng        r   r   )Ú
gettimeoutÚsetblockingrŒ   )r   r‡   r‹   rT   r   r   r   Úwrite_nonblock!  s    
r�   c             C   sL   t jdƒ|tj|ƒdœ }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ÚhtmlÚescaper„   r   r�   r…   )r   Z
status_intr�   r‘   Z
html_errorÚhttpr   r   r   Úwrite_error-  s
    
r˜   c          	   C   s@   t jƒ d }z*x$|dk	r2|jj| jkr*dS |j}qW dS ~X dS )zêCheck whether calling a function raised a ``TypeError`` because
    the call failed or because something in the function raised the
    error.

    :param f: The function that was called.
    :return: ``True`` if the call failed.
    rH   NFT)ÚsysÚexc_infoÚtb_frameÚf_codeÚ__code__Útb_next)r1   Útbr   r   r   Ú_called_with_wrong_argsD  s    

r    c          1   C   sN  | j ddƒ}t|ƒdkrd}n|d |d  } }ytj| ƒ}W nL tk
rŠ   | jdƒr„tjj| ƒr„d}t|| j	ddƒd |f ƒ‚‚ Y nX yt
j|dd	�j}W n  tk
rÀ   td
| ƒ‚Y nX t|t
jƒrÞ|j}d  }}nˆt|t
jƒ�rZt|jt
jƒ�std| ƒ‚|jj}y$dd„ |jD ƒ}dd„ |jD ƒ}W n" tk
�rV   td| ƒ‚Y nX ntd
| ƒ‚tjjtjk}	yt||ƒ}
W n: tk
�r¼   |	�r¨tjtj ƒ Ž  td|| f ƒ‚Y nX |d k	�r"y|
||Ž}
W nJ t!k
�r  } z,t"|
ƒ�rtdj#tj$t!|ƒƒj%ƒ ƒ‚‚ W Y d d }~X nX |
d k�r8td| ƒ‚t&|
ƒ�sJtdƒ‚|
S )Nrh   r   Zapplicationr   z.pyz1Failed to find application, did you mean '%s:%s'?r   Úeval)Úmodez9Failed to parse %r as an attribute name or function call.z,Function reference must be a simple name: %rc             S   s   g | ]}t j|ƒ‘qS r   )ÚastÚliteral_eval)Ú.0Úargr   r   r   ú
<listcomp>‚  s    zimport_app.<locals>.<listcomp>c             S   s   i | ]}t j|jƒ|j“qS r   )r£   r¤   Úvaluer¦   )r¥   Úkwr   r   r   ú
<dictcomp>ƒ  s    zimport_app.<locals>.<dictcomp>z/Failed to parse arguments as literal values: %rz"Failed to find attribute %r in %r.ri   z%Failed to find application object: %rz$Application object must be callable.)'r   r   r   r   ÚImportErrorÚendswithr=   rF   Úexistsr   r£   ÚparseÚbodyÚSyntaxErrorr   rƒ   ÚNameÚidÚCallrQ   ÚargsÚkeywordsr   ÚloggingÚrootÚlevelÚDEBUGr    ÚAttributeErrorr   Úprint_exceptionr™   rš   Ú	TypeErrorr    r   Úformat_exception_onlyÚstripÚcallable)ÚmoduleÚpartsÚobjr*   r'   Z
expressionr%   r´   ÚkwargsZis_debugÚappÚer   r   r   Ú
import_app^  sf    





rÆ   c           	   C   sh   yNt jt jd ƒ} t jt jƒ ƒ}| j|jkrD| j|jkrDt jd }nt jƒ }W n   t jƒ }Y n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 ƒ } tjj| ddd�}|S )z@Return the current date and time formatted for a message header.NFT)Ú	localtimeÚusegmt)rL   ÚemailÚutilsÚ
formatdate)Ú	timestampÚsr   r   r   Ú	http_date¿  s    rÖ   c             C   s   | j ƒ jƒ tkS )N)rm   r¾   Úhop_headers)Úheaderr   r   r   Ú
is_hoppishÇ  s    rÙ   c                sÞ   dt jkrÚt jƒ rt jdƒ t jƒ  t jƒ r6t jdƒ t jdƒ | sŠtddƒ t jtt j	ƒ‰ ˆ dkrpt j
ˆ dƒ t j
ˆ dƒ t j
ˆ dƒ nPt jtt j	ƒ‰ ˆ dkr¶t jdƒ t j
ˆ dƒ ‡ fdd„}|tjdƒ |tjdƒ 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   rH   c                sL   y2| j ƒ }||kr0| jƒ r0tj|ƒ tjˆ |ƒ W n tk
rF   Y nX d S )N)ÚfilenoÚisattyr=   r~   Údup2rº   )ÚstreamZ	fd_expectrp   )Úfd_nullr   r   Úredirect  s    
zdaemonize.<locals>.redirectN)r=   rÈ   ÚforkÚ_exitÚsetsidÚumaskr€   ÚopenÚREDIRECT_TOÚO_RDWRrÞ   r~   r™   ÚstdoutÚstderr)Zenable_stdio_inheritancerá   r   )rà   r   Ú	daemonizeË  s*    





	rë   c               C   sH   yt jtjdƒƒ W n. tk
rB   t jdtjƒ tjƒ f ƒ Y nX d S )Né@   z%s.%s)ÚrandomÚseedr=   ÚurandomÚNotImplementedErrorrL   Úgetpidr   r   r   r   rî     s    rî   c             C   sN   yt | dƒ}W n2 tk
r@ } ztd| |f ƒ‚W Y d d }~X nX |jƒ  d S )NrÌ   zError: '%s' isn't writable [%r])ræ   ÚIOErrorr   r~   )rF   r1   rÅ   r   r   r   Úcheck_is_writeable%  s
    "ró   Úutf8c             C   s.   t | tƒr| S t | tƒs$td|  ƒ‚| j|ƒS )z+Converts a string argument to a byte stringz%r is not a string)rƒ   Úbytesr„   r¼   r…   )r¨   Úencodingr   r   r   Úto_bytestring-  s
    

r÷   c             C   s<   t | dƒsdS y| jƒ  W n tttjfk
r6   dS X dS )NrÜ   FT)ÚhasattrrÜ   rº   rò   ÚioÚUnsupportedOperation)rÂ   r   r   r   Ú
has_fileno7  s    
rû   c             C   sj   t dtjd� | jƒ }x6t|ƒD ]*\}}|dkr8d| }t d| tjd� q W t dtjd� tjjƒ  d S )Nz!!!)Úfiler   zWARNING: %sz!!! %sz!!!
)Úprintr™   rê   Ú
splitlinesÚ	enumerateÚflush)r'   ÚlinesÚiÚliner   r   r   rO   D  s    rO   c                s   t ˆ ƒ‰ ‡ 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Ä   T  s    zmake_fail_app.<locals>.app)r÷   )r'   rÄ   r   )r'   r   Úmake_fail_appQ  s    r  c             C   s<   | j dƒr0tjjd|  ƒ}|j|jdd … d�S tjj| ƒS )Nz//r   r   )rF   )r   Úurllibr®   ÚurlsplitÚ_replacerF   )r!   rÁ   r   r   r   Úsplit_request_uri^  s    
r
  c          
   C   s:   z*|d kr| ƒ }|j |k	r$|j|ƒ‚|‚W d d }d }X d S )N)Ú__traceback__Úwith_traceback)Útpr¨   rŸ   r   r   r   Úreraisek  s    

r  c             C   s   t | tƒr| S t| dƒS )Nr’   )rƒ   r„   )rÍ   r   r   r   Úbytes_to_strw  s    
r  c             C   s   t jj| ƒjdƒS )Nzlatin-1)r  r®   Úunquote_to_bytesÚdecode)Ústringr   r   r   Úunquote_to_wsgi_str}  s    r  c             C   sÖ   dd„ }ddl m } tjj| ƒr$| S dddg}dtjkrLtjd jd	ƒ| }x„|D ]|}tjj|| ƒ}||ƒrxtjj|ƒS tjj|d
|  ƒ}xBdD ]:}x4|dj||ƒƒD ] }||ƒsº|dkr¦tjj|ƒS q¦W q�W qRW d S )Nc             S   s4   y$t | dƒ�}|jdƒdkS Q R X W n
   dS d S )NÚrbrI   s   ELFF)ræ   Úread)ÚfilepathÚfhr   r   r   Ú_is_elf‚  s
    z!_findWalk_ldpath.<locals>._is_elfr   )Úglobz/libz/usr/local/libz/usr/libÚLD_LIBRARY_PATHrh   ÚlibÚsoúso.*ú*.so.*rÌ   z{0}.{1})r  r  r  rÌ   )	r  r=   rF   ÚisabsrÈ   r   r   ÚbasenameÚformat)r%   r  r  ÚpathsÚdr1   ÚprefixÚsuffixr   r   r   Ú_findWalk_ldpath�  s     



r&  c             C   s   t jj| ƒpt| ƒS )N)ÚctypesÚutilÚfind_libraryr&  )r%   r   r   r   r)  œ  s    r)  )r
   r   )F)F)rd   )F)F)N)F)rô   )N)Or£   Úctypes.utilr'  Úemail.utilsrÑ   r[   rt   r•   r   r   rù   r¶   r=   r6   rí   rj   r_   r™   r“   rL   r   rN   r   Zgunicorn.errorsr   Zgunicorn.workersr   Úurllib.parser  r    rç   Úsetr   r×   r   r	   r«   r+   Ú	ParameterÚPOSITIONAL_ONLYÚPOSITIONAL_OR_KEYWORDr0   r5   r:   rD   rE   Úplatformr   rV   rY   rW   rc   rs   ry   r}   r~   r€   rŠ   rŒ   r�   r˜   r    rÆ   rÉ   rÖ   rÙ   rë   rî   ró   r÷   rû   rO   r  r
  r  r  r  r&  r)  r   r   r   r   Ú<module>   s–   

 
1


!
	

	

S

S


