U
    c^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  Z!z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./drvd\ddZ0dd Z1nej2Z1dd Z2dd  Z3d]d"d#Z4d$d% Z5d&d' Z6d(d) Z7z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: %sr   title r	   3/tmp/pip-install-u9bp_5q1/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   sn  t | r| S | dr| dd }z|dd\}}W n tk
rV   |}|}Y nX zt|||W S    t	 }d}t
|| |f Y nX n| d}t|dkr| dr| dd  } | tkrt|  d}qztd|| W S    t	 }d}t
|| |f Y qX q|d}	ztd|}
W n(   t	 }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:   sN    




 
r.   c                 C   s4   t | }d}|j D ]}|jtkr|d7 }q|S )Nr   r   )r   	signature
parametersvalueskindpositionals)fsigarityparamr	   r	   r
   	get_arityq   s    


r8   c                 C   s   t | 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.zt | }W n tk
r,   d}Y nX t|d@ }|rLt|| n|t krbt| | rpt|  dS )z) set user and group of workers processes FiN)r=   KeyErrorabsos
initgroupsgetgidsetgidsetuid)r<   gidrA   usernamer	   r	   r
   set_owner_process   s    

rG   c                 C   s   t | || d S r   )r@   chown)pathr<   rE   r	   r	   r
   rH      s    rH   winc                 C   s   | | |r|}nt j|\}}|p(d}d}|dk rjt |}|rJ|sVn||krVd S t| |d9 }q.tjd| tdd d S )Nr   gMbP?g      ?   z)tests may fail, delete still pending for    )
stacklevel)	r@   rI   r   listdirtimesleepwarningswarnRuntimeWarning)funcpathnameZwaitalldirnamer(   timeoutLr	   r	   r
   _waitfor   s     



 rY   c                 C   s   t tj|  d S r   )rY   r@   unlink)filenamer	   r	   r
   _unlink   s    r\   c              
   C   sH   zt |  W n6 tk
rB } z|jtjtjfkr2 W 5 d }~X Y nX d S r   )r\   OSErrorerrnoENOENTENOTDIR)r[   errorr	   r	   r
   rZ      s
    rZ   c                 C   sD   zt t j|  W n, t jk
r*   Y dS  tk
r>   Y dS X dS )NFT)socket	inet_ptonAF_INET6ra   r   )addrr	   r	   r
   is_ipv6   s    rf   8000c                 C   s2  t d| rt d| d S | dr`| dd  }z
t|W S  tk
r^   td| d Y nX | drx| dd } | | }}d| krd	| kr| d	d
 dd  }| d|g d }n8d| kr| d|g d d \}}n| dkrd| }}zt|}W n" tk
r$   td| Y nX | |fS )Nz
unix:(//)?r   zfd://   z"%r is not a valid file descriptor.ztcp://r   []r   z]::rK    z0.0.0.0z%r is not a valid port number.)rematchr   r   intr   r   lower)netlocdefault_portfdhostportr	   r	   r
   parse_address   s.    




rv   c                 C   s,   t  | t j}|t jO }t  | t j| d S r   )fcntlZF_GETFDZ
FD_CLOEXECZF_SETFDrs   flagsr	   r	   r
   close_on_exec   s    
rz   c                 C   s(   t  | t jtjB }t  | t j| d S r   )rw   ZF_GETFLr@   
O_NONBLOCKZF_SETFLrx   r	   r	   r
   set_non_blocking   s    r|   c                 C   s(   z|    W n tjk
r"   Y nX d S r   )closerb   ra   )sockr	   r	   r
   r}     s    r}   )
closerangec              	   C   s8   t | |D ](}zt| W q
 tk
r0   Y q
X q
d S r   )ranger@   r}   r]   )Zfd_lowZfd_highrs   r	   r	   r
   r   
  s
    r   c                 C   sD   t |tr|d}dt| }d|d|dg}| | 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 | | d S r   )r   r   )r~   r   chunkedr	   r	   r
   write  s    
r   c              	   C   sJ   |   }|dkr:z| d t| ||W S | d X nt| ||S d S )Ng        r   r   )
gettimeoutsetblockingr   )r~   r   r   rW   r	   r	   r
   write_nonblock!  s    
r   c                 C   sL   t d|t|d }t dt||t||f }t| |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   sD   t  d }z.|dk	r4|jj| jkr,W dS |j}qW dS ~X dS )zCheck 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.
    rK   NFT)sysexc_infotb_framef_code__code__tb_next)r4   tbr	   r	   r
   _called_with_wrong_argsD  s    r   c              
   C   sN  |  dd}t|dkrd}n|d |d  } }zt| }W nL tk
r   | drtj| rd}t|| 	ddd |f  Y nX zt
j|dd	j}W n  tk
r   td
| Y nX t|t
jr|j}d  }}nt|t
jrZt|jt
jstd| |jj}z$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}	zt||}
W n: tk
r   |	rtjt    td|| f Y nX |d k	r"z|
||}
W nJ t!k
r  } z*t"|
rtd#t$t!|%  W 5 d }~X Y nX |
d kr8td| t&|
sJtd|
S )Nrk   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 |qS r	   )astliteral_eval).0argr	   r	   r
   
<listcomp>  s     zimport_app.<locals>.<listcomp>c                 S   s   i | ]}|j t|jqS r	   )r   r   r   value)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.rl   z%Failed to find application object: %rz$Application object must be callable.)'r   r   r    r!   ImportErrorendswithr@   rI   existsr   r   parsebodySyntaxErrorr   r   NameidZCallrT   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^  sn    





r   c                  C   sh   zNt t jd } t t  }| j|jkrD| j|jkrDt jd }nt  }W n   t  }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   } tjj| ddd}|S )z@Return the current date and time formatted for a message header.NFT)	localtimeusegmt)rO   emailutils
formatdate)	timestampsr	   r	   r
   	http_date  s    r   c                 C   s   |    tkS r   )rp   r   hop_headers)headerr	   r	   r
   
is_hoppish  s    r   c                    s   dt jkrt  rt d t   t  r6t d t d | stdd t tt j	  dkrpt 
 d t 
 d t 
 d nPt tt j	  dkrt d t 
 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   rK   c                    sL   z2|   }||kr0|  r0t| t | W n tk
rF   Y nX d S r   )filenoisattyr@   r}   dup2r   )streamZ	fd_expectrs   Z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   zt td W n. tk
rB   t dt t f  Y nX d S )N@   z%s.%s)randomseedr@   urandomNotImplementedErrorrO   getpidr	   r	   r	   r
   r     s    r   c              
   C   sN   zt | d}W n2 tk
r@ } ztd| |f W 5 d }~X Y nX |  d S )Nr   zError: '%s' isn't writable [%r])r   IOErrorr   r}   )rI   r4   r   r	   r	   r
   check_is_writeable%  s
    "r   utf8c                 C   s.   t | tr| S t | ts$td|  | |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 z|   W n tttjfk
r8   Y dS X dS )Nr   FT)hasattrr   r   r   ioUnsupportedOperation)r   r	   r	   r
   
has_fileno7  s    
r   c                 C   sf   t dtjd |  }t|D ]*\}}|dkr6d| }t d| tjd qt dtjd tj  d S )Nz!!!)filer   zWARNING: %sz!!! %sz!!!
)printr   r   
splitlines	enumerateflush)r*   linesiliner	   r	   r
   rR   D  s    rR   c                    s   t    fdd}|S )Nc                    s    |dddt t fg  gS )Nz500 Internal Server Error)zContent-Typez
text/plainzContent-Length)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<   |  dr0tjd|  }|j|jdd  dS tj| S )Nz//r   r   )rI   )r   urllibr   urlsplit_replacerI   )r$   r   r	   r	   r
   split_request_uri^  s    
r  c                 C   s:   z*|d kr|  }|j |k	r$|||W 5 d }d }X d S r   )__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| 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| r$| S dddg}dtjkrLtjd d	| }|D ]}tj|| }||rztj|  S tj|d
|  }dD ]B}|d||D ],}||s|dkrtj|      S qqqPd S )Nc              
   S   sF   z2t | d}|ddkW  5 Q R  W S Q R X W n   Y dS X d S )NrbrL   s   ELFF)r   read)filepathfhr	   r	   r
   _is_elf  s
    &z!_findWalk_ldpath.<locals>._is_elfr   )globz/libz/usr/local/libz/usr/libZLD_LIBRARY_PATHrk   lib)sozso.*z*.so.*r   z{0}.{1}r   )	r  r@   rI   isabsr   r   r"   basenameformat)r(   r  r  pathsdr4   prefixsuffixr	   r	   r
   _findWalk_ldpath  s     

r   c                 C   s   t j| pt| S r   )ctypesutilfind_libraryr   )r(   r	   r	   r
   r#    s    r#  )r   r   )F)F)rg   )F)F)N)F)r   )N)Or   Zctypes.utilr!  email.utilsr   r^   rw   r   r    r   r   r   r@   r9   r   rm   rb   r   r   rO   r   rQ   r   Zgunicorn.errorsr   Zgunicorn.workersr   urllib.parser  r#   r   setr   r   r   r   r   r.   	ParameterPOSITIONAL_ONLYPOSITIONAL_OR_KEYWORDr3   r8   r=   rG   rH   platformr   rY   r\   rZ   rf   rv   rz   r|   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rR   r  r  r  r  r  r   r#  r	   r	   r	   r
   <module>   s   
  
2

!
	

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


