3
eH              	   @   st  U 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 dlmZ d dlmZ ejrd dlmZ d dlmZ d d	lmZ d
dlmZ daejej e Ze	dd
d
j Zedd ej ej dD ZdddddZ x>ee!de!ddD ]&Z"de"dj#de e"j$d
ej%< qW ej&dZ'ej&dZ(dZ)ej&dej*dZ+G d d! d!Z,e, Z-ej.e/ej0e/ge/f d"d#d$Z1ej.e2ej0e/ge2f d"d%d$Z1ej3ej0e/gej3f d"d&d$Z1ej4ej3d'f dd(d)d*Z5ej6 Z7e7d+fej8e/e2f e/e/e2d,d-d.Z9ej.dgdeje/ e/e:dd/d0d1Z;ej.dhej<eje/ e/e:e/d/d2d1Z;e7d+d3fejej< eje/ e/e:ejej8e/e2f  d/d4d1Z;die/e/e/e/d7d8d9Z=dje/e/e/e/d7d:d;Z>ej8dk d<d>d?d@Z?eje:dAdBdCZ@G dDdE dEejAZBe/e/ej<ej<ddFdGdHZCdIdJ ZDej.dddKdLdMZEej.eedKdNdMZEeje eje dKdOdMZEejFdPZGG dQdR dRejHeG ZIe2e2dSdTdUZJe2e2dSdVdWZKe2ejLej4e2e2f  dSdXdYZMe/e2dZd[d\ZNej8e/e2f e/dZd]d^ZOej.dddZd_d`ZPej.e/e2dZdad`ZPeje/ eje2 dZdbd`ZPdlejdc dcdddedfZQdS )m    N)date)datetime)timezone)chain)WeakKeyDictionary)StartResponse)WSGIApplication)WSGIEnvironment   )Requesti  c             c   s   | ]}|j d V  qdS )asciiN)encode).0c r   6/tmp/pip-build-3irwxpxt/Werkzeug/werkzeug/_internal.py	<genexpr>   s   r   z/=!#$%&'*+-.^_`|~:s   \054s   \073s   \"s   \\)   ,   ;   "   \          \Z03olatin1s   \\[0-3][0-7][0-7]s   [\\].s/   [\w\d!#%&\'~_`><@,:/\$\*\+\-\.\^\|\)\(\?\}\{\=]s   
    (?P<key>[^=;]+)
    (?:\s*=\s*
        (?P<val>
            "(?:[^\\"]|\\.)*" |
             (?:.*?)
        )
    )?
    \s*;
)flagsc               @   s(   e Zd ZedddZedddZdS )_Missing)returnc             C   s   dS )Nzno valuer   )selfr   r   r   __repr__4   s    z_Missing.__repr__c             C   s   dS )N_missingr   )r   r   r   r   
__reduce__7   s    z_Missing.__reduce__N)__name__
__module____qualname__strr    r"   r   r   r   r   r   3   s   r   )	referencer   c             C   s   d S )Nr   )r'   r   r   r   _make_encode_wrapper>   s    r(   c             C   s   d S )Nr   )r'   r   r   r   r(   C   s    c             C   s   t | trdd S tjddS )zCreate a function that will be called with a string argument. If
    the reference is bytes, values will be encoded to bytes.
    c             S   s   | S )Nr   )xr   r   r   <lambda>M   s    z&_make_encode_wrapper.<locals>.<lambda>r   r   )
isinstancer&   operatormethodcaller)r'   r   r   r   r(   H   s    
.)valuer   c                sH   | sdS t | d trtnt t fdd| D rDtd| ddS )z0Ensure tuple items are all strings or all bytes.Nr   c             3   s   | ]}t |  V  qd S )N)r+   )r   item)	item_typer   r   r   Y   s    z#_check_str_tuple.<locals>.<genexpr>z(Cannot mix str and bytes arguments (got ))r+   r&   bytesany	TypeError)r.   r   )r0   r   _check_str_tupleR   s
    r5   strict)r)   charseterrorsr   c             C   sN   | d kst | tr| S t | ttfr,t| S t | trB| j||S tdd S )NzExpected bytes)r+   r2   	bytearray
memoryviewr&   r   r4   )r)   r7   r8   r   r   r   	_to_bytes`   s    
r;   )r)   r7   r8   allow_none_charsetr   c             C   s   d S )Nr   )r)   r7   r8   r<   r   r   r   _to_stro   s    r=   c             C   s   d S )Nr   )r)   r7   r8   r<   r   r   r   r=   y   s    Fc             C   sH   | d kst | tr| S t | ttfs,t| S |d kr<|r<| S | j||S )N)r+   r&   r2   r9   decode)r)   r7   r8   r<   r   r   r   r=      s    utf-8replace)sr7   r8   r   c             C   s   | j dj||S )Nr   )r   r>   )rA   r7   r8   r   r   r   _wsgi_decoding_dance   s    rB   c             C   s(   t | tr| jd|S | j|jd|S )Nr   )r+   r2   r>   r   )rA   r7   r8   r   r   r   _wsgi_encoding_dance   s    
rC   r	   r   )objr   c             C   s.   t | d| }t|ts*tt| jd|S )Nenvironz- is not a WSGI environment (has to be a dict))getattrr+   dictAssertionErrortyper#   )rD   envr   r   r   _get_environ   s
    
rK   )loggerr   c                sD   | j   | }x2|r>t fdd|jD r.dS |js6P |j}qW dS )znCheck if there is a handler in the logging chain that will handle
    the given logger's effective level.
    c             3   s   | ]}|j  kV  qd S )N)level)r   handler)rM   r   r   r      s    z%_has_level_handler.<locals>.<genexpr>TF)getEffectiveLevelr3   handlers	propagateparent)rL   currentr   )rM   r   _has_level_handler   s    
rT   c                   s&   e Zd ZdZdd fddZ  ZS )_ColorStreamHandlerz=On Windows, wrap stream with Colorama for ANSI style support.N)r   c                sB   ydd l }W n tk
r$   d }Y nX |jtj}t j| d S )Nr   )coloramaImportErrorAnsiToWin32sysstderrsuper__init__)r   rV   stream)	__class__r   r   r\      s    
z_ColorStreamHandler.__init__)r#   r$   r%   __doc__r\   __classcell__r   r   )r^   r   rU      s   rU   )rI   messageargskwargsr   c             O   s\   t dkr>tjda t jtjkr*t jtj tt s>t jt	  t
t | |j f|| dS )a  Log a message to the 'werkzeug' logger.

    The logger is created the first time it is needed. If there is no
    level set, it is set to :data:`logging.INFO`. If there is no handler
    for the logger's effective level, a :class:`logging.StreamHandler`
    is added.
    NZwerkzeug)_loggerlogging	getLoggerrM   NOTSETsetLevelINFOrT   
addHandlerrU   rF   rstrip)rI   ra   rb   rc   r   r   r   _log   s    

rl   c       	         s   t j| }|dk	r|S tj| }|dd \}}|p:f }t| g xjt|D ]^\}}t|trltdy||   }W n t	k
r   |ddf}Y nX |d|f}j
| qRW t fdd}|t | < |S )zReturn a signature object for the function.

    .. deprecated:: 2.0
        Will be removed in Werkzeug 2.1 along with ``utils.bind`` and
        ``validate_arguments``.
    N   zCcannot parse functions that unpack tuples in the function signatureFTc       
         s   g }g }i }xt D ]\}\}}}y|j| |  W nX tk
r   y|j|j| W n. tk
r   |rz|j| n
|j| Y nX Y qX ||kr|j|||< qW |  d  }	d k	r|j|	 f }	|rd kr|j| i }|||||	fS )N)	enumerateappend
IndexErrorpopKeyErrorextendupdate)
rb   rc   Znew_argsmissingextraidxnameZhas_defaultdefaultZextra_positional)	arg_count	arguments	kwarg_var
vararg_varr   r   parse  s<    

z_parse_signature.<locals>.parse)_signature_cachegetinspectgetfullargspeclenrn   r+   listr4   rp   ro   tuple)	funcr~   tup
positionaldefaultsrw   rx   ry   paramr   )rz   r{   r|   r}   r   _parse_signature   s,    



)r   )dtr   c             C   s   d S )Nr   )r   r   r   r   
_dt_as_utc1  s    r   c             C   s   d S )Nr   )r   r   r   r   r   6  s    c             C   s@   | d kr| S | j d kr$| jtjdS | j tjkr<| jtjS | S )N)tzinfo)r   r@   r   utc
astimezone)r   r   r   r   r   ;  s    
_TAccessorValuec            	   @   s  e Zd ZdZdZdeeje ejej	egef  ejej	egef  eje
 eje ddddZejejeejf ddd	Zejded
dddZejejeedddZejej eejed
f dddZejeddddZejddddZedddZdS )_DictAccessorPropertyz7Baseclass for `environ_property` and `header_property`.FN)rx   ry   	load_func	dump_func	read_onlydocr   c             C   s0   || _ || _|| _|| _|d k	r&|| _|| _d S )N)rx   ry   r   r   r   r_   )r   rx   ry   r   r   r   r   r   r   r   r\   O  s    	z_DictAccessorProperty.__init__)instancer   c             C   s   t d S )N)NotImplementedError)r   r   r   r   r   lookup`  s    z_DictAccessorProperty.lookupz&_DictAccessorProperty[_TAccessorValue])r   ownerr   c             C   s   d S )Nr   )r   r   r   r   r   r   __get__c  s    z_DictAccessorProperty.__get__c             C   s   d S )Nr   )r   r   r   r   r   r   r   i  s    c             C   sd   |d kr| S | j |}| j|kr&| jS || j }| jd k	r`y
| j|S  ttfk
r^   | jS X |S )N)r   rx   ry   r   
ValueErrorr4   )r   r   r   Zstorager.   r   r   r   r   m  s    




)r   r.   r   c             C   sD   | j rtd| jd k	r0| j|| j|| j< n|| j|| j< d S )Nzread only property)r   AttributeErrorr   r   rx   )r   r   r.   r   r   r   __set__  s
    
z_DictAccessorProperty.__set__c             C   s&   | j rtd| j|j| jd  d S )Nzread only property)r   r   r   rq   rx   )r   r   r   r   r   
__delete__  s    z _DictAccessorProperty.__delete__)r   c             C   s   dt | j d| j dS )N< >)rI   r#   rx   )r   r   r   r   r      s    z_DictAccessorProperty.__repr__)NNNNN)r#   r$   r%   r_   r   r&   tOptionalr   Callableboolr\   AnyMutableMappingr   typingoverloadrI   r   Unionr   r   r    r   r   r   r   r   J  s&       D		r   )br   c             C   sl   t  }d}tj}|j}x8| D ]0}|jdtj}|tkrDd}|||}|| qW |r\t|S td| d S )NTr
   Fr   )	r9   _cookie_quoting_mapr   rs   to_bytesrY   	byteorder_legal_cookie_charsr2   )r   bufZ	all_legalZ_lookup_pushZchar_intcharr   r   r   _cookie_quote  s    

r   c       	      C   sZ  t | dk r| S | d d dks0| dd  dkr4| S | dd } d}t | }t }|j}xd|  kol|k n  rPtj| |}tj| |}| r| r|j| |d   P d	 }}|r|jd}|r|jd}|o| s||k r|| ||  || |d |d   |d }qZ|| ||  |jt| |d |d  d |d }qZW t	|S )
N   r
   r   r   rm      r   r   )
r   r9   rs   	_octal_research	_quote_restartro   intr2   )	r   inrvr   o_matchq_matchjkr   r   r   _cookie_unquote  s8     


 r   c             c   sh   d}t | }xV||k rbtj| d |}|s,P |jdj }|jdpFd}|jd}|t|fV  qW dS )z8Lowlevel cookie parsing facility that operates on bytes.r   r   keyval    N)r   
_cookie_rer   groupstripendr   )r   r   r   matchr   r.   r   r   r   _cookie_parse_impl  s    

r   )domainr   c             C   sR   t | tr| jd | S y
| jdS  tk
r6   Y nX djdd | jdD S )Nr      .c             s   s   | ]}|j d V  qdS )idnaN)r   )r   pr   r   r   r     s    z_encode_idna.<locals>.<genexpr>.)r+   r2   r>   r   UnicodeErrorjoinsplit)r   r   r   r   _encode_idna  s    


r   c                s\   t | tr.y| jd} W n tk
r,   | S X ttddd dj fdd| jdD S )	Nr   )partr   c             S   s,   y
| j dS  tk
r&   | j ddS X d S )Nr   r   ignore)r>   r   )r   r   r   r   decode_part  s    
z!_decode_idna.<locals>.decode_partr   c             3   s   | ]} |V  qd S )Nr   )r   r   )r   r   r   r     s    z_decode_idna.<locals>.<genexpr>r   )r+   r&   r   r   r2   r   r   )r   r   )r   r   _decode_idna  s    
r   c             C   s   d S )Nr   )r   r   r   r   _make_cookie_domain  s    r   c             C   s   d S )Nr   )r   r   r   r   r     s    c             C   sD   | d krd S t | } d| kr,| jddd } d| kr8| S tdd S )N   :r
   r   r   a'  Setting 'domain' for a cookie on a server running locally (ex: localhost) is not supported by complying browsers. You should have something like: '127.0.0.1 localhost dev.localhost' on your hosts file and then point your server to run on 'dev.localhost' and also set 'domain' for 'dev.localhost')r   r   r   )r   r   r   r   r     s    r   )appr   c                sN   t tddd}djdd |dj D dd	tjt  d
 fdd}|S )z0Like the name says.  But who knows how it works?)gyverr   c             S   s&   dd l }dd l}|j|j| jdS )Nr   r   )base64zlib
decompress	b64decoder>   )r   r   r   r   r   r   bzzzzzzz   s    z_easteregg.<locals>.bzzzzzzz
c             S   s    g | ]}|d t | d  qS )M   r   )r   )r   r)   r   r   r   
<listcomp>(  s   z_easteregg.<locals>.<listcomp>s#	  
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
7f2zLkGNv8b191cD/3vs9Q833z8tr	   r   )rE   start_responser   c                sz   dt tjtjt t f  tjtjtgtjf d fdd}d k	rZ| jddkrZ| |S |ddg d	 d
jdgS )N)statusheadersexc_infor   c                s   |j d  | ||S )NX-Powered-ByWerkzeug)r   r   )ro   )r   r   r   )r   r   r   injecting_start_responseQ  s    
zA_easteregg.<locals>.easteregged.<locals>.injecting_start_responseQUERY_STRINGZmacgybarchakkuz200 OKContent-Type	text/htmla  <!DOCTYPE html>
<html>
<head>
<title>About Werkzeug</title>
<style type="text/css">
  body { font: 15px Georgia, serif; text-align: center; }
  a { color: #333; text-decoration: none; }
  h1 { font-size: 30px; margin: 20px 0 10px 0; }
  p { margin: 0 0 30px 0; }
  pre { font: 11px 'Consolas', 'Monaco', monospace; line-height: 0.95; }
</style>
</head>
<body>
<h1><a href="http://werkzeug.pocoo.org/">Werkzeug</a></h1>
<p>the Swiss Army knife of Python web development.</p>
<pre>z


</pre>
</body>
</html>r   )N)r   r   )	r&   r   ListTupler   r   r2   r   r   )rE   r   r   )r   r   )r   r   eastereggedN  s     
z_easteregg.<locals>.easteregged)r2   r&   r   
splitlinesr   Iterable)r   r   r   r   )r   r   r   
_easteregg  s     "r   )...)...)r?   r@   )r?   r@   )r	   r   )N)Rr   re   r,   restringrY   r   r   r   r   r   	itertoolsr   weakrefr   ZTYPE_CHECKINGZ_typeshed.wsgir   r   r	   Zwrappers.requestr   rd   r   Loggerr   	toordinalZ
_epoch_ord	frozensetascii_lettersdigitsr   r   rangeZ_ir   r   r   compiler   r   Z_legal_cookie_chars_reVERBOSEr   r   r!   r   r&   r   r(   r2   ZAnyStrr   r5   getdefaultencodingZ_default_encodingr   r;   r   r=   r   rB   rC   rK   rT   StreamHandlerrU   rl   r   r   ZTypeVarr   ZGenericr   r   r   Iteratorr   r   r   r   r   r   r   r   r   <module>   s    &



 
    M
K$ 