3
 [ð]þ8  ã               @   sÈ  d 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 dd	lmZ dd
lmZ ddlmZ ddlmZ dae
ƒ Zedddƒjƒ ZdddddddhZejej d jdƒZdddddœZx2eedƒeddƒƒD ]Zde jd ƒeeeƒ< qöW ejd!ƒZejd"ƒZd#Zejd$ej d%�Z!G d&d'„ d'e"ƒZ#e#ƒ Z$d(d)„ Z%d*d+„ Z&d,d-„ Z'd.d/„ Z(d0d1„ Z)G d2d3„ d3e"ƒZ*d4d5„ Z+d6d7„ Z,d8d9„ Z-d:d;„ Z.d<d=„ Z/d>d?„ Z0dBd@dA„Z1dS )Cz©
    werkzeug._internal
    ~~~~~~~~~~~~~~~~~~

    This module provides internally used helpers and constants.

    :copyright: 2007 Pallets
    :license: BSD-3-Clause
é    N)Údate)Údatetime)Úchain)ÚWeakKeyDictionaryé   )Úint_to_byte)Úinteger_types)Ú
iter_bytes)Ú
range_type)Ú	text_typei²  s   expiress   paths   comments   max-ages   secures   httponlys   versionz/=!#$%&'*+-.^_`|~:Úasciis   \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dd„ Zdd„ ZdS )Ú_Missingc             C   s   dS )Nzno value© )Úselfr   r   ú6/tmp/pip-build-w1as9q70/Werkzeug/werkzeug/_internal.pyÚ__repr__B   s    z_Missing.__repr__c             C   s   dS )NÚ_missingr   )r   r   r   r   Ú
__reduce__E   s    z_Missing.__reduce__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   A   s   r   c             C   s,   t | d| ƒ}t|tƒs(tdt| ƒj ƒ‚|S )NÚenvironz/%r is not a WSGI environment (has to be a dict))ÚgetattrÚ
isinstanceÚdictÚAssertionErrorÚtyper   )ÚobjÚenvr   r   r   Ú_get_environL   s    r(   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)Ú.0Úhandler)r)   r   r   ú	<genexpr>\   s    z%_has_level_handler.<locals>.<genexpr>TF)ÚgetEffectiveLevelÚanyÚhandlersÚ	propagateÚparent)ÚloggerÚcurrentr   )r)   r   Ú_has_level_handlerT   s    
r4   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j	ƒ ƒ 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Ú	getLoggerr)   ÚNOTSETÚsetLevelÚINFOr4   Ú
addHandlerÚStreamHandlerr!   Úrstrip)r%   ÚmessageÚargsÚkwargsr   r   r   Ú_logg   s    

rA   c       	         s   t | dƒr| j} tj| ƒ}|dk	r&|S t tdƒr<tj| ƒ}n
tj| ƒ}|dd… \}‰‰}|p`f }t|ƒ‰ g ‰xjt|ƒD ]^\}}t	|t
ƒr’tdƒ‚y||ˆ   }W n tk
rÀ   |ddf}Y nX |d|f}ˆj|ƒ qxW tˆƒ‰‡ ‡‡‡fdd	„}|t| < |S )
z+Return a signature object for the function.Úim_funcNÚgetfullargspecé   zCcannot parse functions that unpack tuples in the function signatureFTc       
         sú   g }g }i }xœt ˆƒ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)
r?   r@   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)ÚhasattrrB   Ú_signature_cacheÚgetÚinspectrC   Ú
getargspecÚlenrE   r"   ÚlistÚ	TypeErrorrG   rF   Útuple)	ÚfuncrU   ÚtupÚ
positionalÚdefaultsrN   rO   rP   Úparamr   )rQ   rR   rS   rT   r   Ú_parse_signature}   s4    





)rd   c             C   sˆ   t | tƒr| jƒ } nt | ttf ƒr,t| ƒS | dd… \}}}}}}t||dƒjƒ t | d }|d | }|d | }	|	d | }
|
S )z]Converts a timetuple, integer or datetime object into the seconds from
    epoch in utc.
    Né   r   é   é<   )	r"   r   Úutctimetupler   ÚfloatÚintr   Ú	toordinalÚ
_epoch_ord)ÚargÚyearÚmonthÚdayÚhourÚminuteÚsecondÚdaysÚhoursÚminutesÚsecondsr   r   r   Ú_date_to_unixË   s    

rx   c               @   s@   e Zd ZdZdZddd„Zddd„Zdd	„ Zd
d„ Zdd„ Z	dS )Ú_DictAccessorPropertyz7Baseclass for `environ_property` and `header_property`.FNc             C   s0   || _ || _|| _|| _|d k	r&|| _|| _d S )N)rO   rP   Ú	load_funcÚ	dump_funcÚ	read_onlyÚ__doc__)r   rO   rP   rz   r{   r|   Údocr   r   r   Ú__init__à   s    	z_DictAccessorProperty.__init__c             C   sl   |d kr| S | j |ƒ}| j|kr&| jS || j }| jd k	rhy| j|ƒ}W n ttfk
rf   | j}Y nX |S )N)ÚlookuprO   rP   rz   Ú
ValueErrorr]   )r   r&   r%   ZstorageÚrvr   r   r   Ú__get__ñ   s    



z_DictAccessorProperty.__get__c             C   s6   | j rtdƒ‚| jd k	r"| j|ƒ}|| j|ƒ| j< d S )Nzread only property)r|   ÚAttributeErrorr{   r€   rO   )r   r&   Úvaluer   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€   rH   rO   )r   r&   r   r   r   Ú
__delete__  s    z _DictAccessorProperty.__delete__c             C   s   d| j j| jf S )Nz<%s %s>)Ú	__class__r   rO   )r   r   r   r   r     s    z_DictAccessorProperty.__repr__)NNNNN)N)
r   r   r   r}   r|   r   rƒ   r†   r‡   r   r   r   r   r   ry   Û   s       


ry   c             C   sb   t ƒ }d}tj}|j}x.t| ƒD ]"}|tkr:d}|||ƒ}||ƒ q W |rRt|ƒS td| d ƒS )NTFr   )Ú	bytearrayÚ_cookie_quoting_maprX   rJ   r	   Ú_legal_cookie_charsÚbytes)ÚbÚbufZ	all_legalZ_lookupÚ_pushÚ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}xød|  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   rD   é   éÿÿÿÿr”   r”   )
r[   r‰   rJ   Ú	_octal_reÚsearchÚ	_quote_reÚstartrF   rj   rŒ   )	r�   ÚiÚnr‚   r�   Úo_matchÚq_matchÚjÚkr   r   r   Ú_cookie_unquote   s8     


 rŸ   c             c   sx   d}t | ƒ}xf||k rrtj| d |ƒ}|s,P |jdƒjƒ }|jdƒpFd}|jdƒ}|jƒ tkrt|ƒ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ÚendÚlowerÚ_cookie_paramsrŸ   )r�   r™   rš   Úmatchr    r…   r   r   r   Ú_cookie_parse_implD  s    

rª   c             C   sp   t | tƒs| jdƒ | S y
| jdƒS  tk
r6   Y nX | jdƒ}x"t|ƒD ]\}}|jdƒ||< qLW dj|ƒS )Nr   Ú.Úidnaó   .)r"   r   ÚdecodeÚencodeÚUnicodeErrorÚsplitrE   Újoin)ÚdomainÚpartsrN   Úpartr   r   r   Ú_encode_idnaW  s    



r¶   c             C   s�   t | tƒr.y| jdƒ} W n tk
r,   | S X | jdƒ}xLt|ƒD ]@\}}y|jdƒ||< W qB tk
r€   |jddƒ||< Y qBX qBW dj|ƒS )Nr   r­   r¬   Úignorer«   )r"   r   r¯   r°   r±   rE   r®   r²   )r³   r´   rN   rµ   r   r   r   Ú_decode_idnaj  s    

r¸   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   Ú_make_cookie_domain�  s    rº   c                s6   dd„ }dj dd„ |dƒjƒ D ƒƒ‰‡ ‡fdd„}|S )	z0Like the name says.  But who knows how it works?c             S   s&   dd l }dd l}|j|j| ƒƒjdƒS )Nr   r   )Úbase64ÚzlibÚ
decompressÚ	b64decoder®   )Úgyverr»   r¼   r   r   r   Úbzzzzzzz•  s    z_easteregg.<locals>.bzzzzzzzÚ
c             S   s    g | ]}|d t |ƒ d  ‘qS )éM   ú )r[   )r*   Úxr   r   r   ú
<listcomp>�  s   z_easteregg.<locals>.<listcomp>s#	  
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
7f2zLkGNv8b191cD/3vs9Q833z8tc                sJ   d
‡ fdd„	}ˆd k	r.| j dƒdkr.ˆ| |ƒS |ddgƒ dˆ jd	ƒgS )Nc                s   |j dƒ ˆ | ||ƒS )NúX-Powered-ByÚWerkzeug)rÆ   rÇ   )rF   )ÚstatusÚheadersÚexc_info)Ústart_responser   r   Úinjecting_start_responseÄ  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>%s


</pre>
</body>
</html>r   )N)rÎ   rÏ   )rX   r¯   )r    rË   rÌ   )Úappr¿   )rË   r   ÚeastereggedÃ  s    
z_easteregg.<locals>.easteregged)r²   Ú
splitlines)rÐ   rÀ   rÑ   r   )rÐ   r¿   r   Ú
_easteregg’  s     !rÓ   )N)2r}   rY   r6   ÚreÚstringr   r   Ú	itertoolsr   Úweakrefr   Ú_compatr   r   r	   r
   r   r5   rW   rk   rl   r¨   Úascii_lettersÚdigitsr¯   r‹   rŠ   Z_iÚcompiler•   r—   Z_legal_cookie_chars_reÚVERBOSEr£   Úobjectr   r   r(   r4   rA   rd   rx   ry   r‘   rŸ   rª   r¶   r¸   rº   rÓ   r   r   r   r   Ú<module>
   sb   



N4$