
À«‘_8  ã               @   sv  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 e j e j d j d ƒ Z d d d d d d d d i Z xC e e d ƒ e d d ƒ ƒ D]# Z d e j d ƒ e e e ƒ <qGWe j d ƒ Z e j d ƒ Z d Z e j d  d! e j ƒZ  Gd" d# „  d# e! ƒ Z" e" ƒ  Z# d$ d% „  Z$ d& d' „  Z% d( d) „  Z& d* d+ „  Z' d, d- „  Z( Gd. d/ „  d/ e! ƒ Z) d0 d1 „  Z* d2 d3 „  Z+ d4 d5 „  Z, d6 d7 „  Z- d8 d9 „  Z. d: d; „  Z/ d d< d= „ Z0 d S)>z©
    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²  z/=!#$%&'*+-.^_`|~:Úasciió   ,s   \054ó   ;s   \073ó   "s   \"s   \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-5gj8f0j9/Werkzeug/werkzeug/_internal.pyÚ__repr__9   s    z_Missing.__repr__c             C   s   d S)NÚ_missingr   )r   r   r   r   Ú
__reduce__<   s    z_Missing.__reduce__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   8   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_environC   s    r'   c                s\   |  j  ƒ  ‰  |  } xC | rW t ‡  f d d †  | j Dƒ ƒ rA d S| j sK P| j } q Wd 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   s    z%_has_level_handler.<locals>.<genexpr>TF)ÚgetEffectiveLevelÚanyÚhandlersÚ	propagateÚparent)ÚloggerÚcurrentr   )r(   r   Ú_has_level_handlerK   s    	"	r3   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 ƒ  | | Ž 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ÚINFOr3   Ú
addHandlerÚStreamHandlerr    Úrstrip)r$   ÚmessageÚargsÚkwargsr   r   r   Ú_log^   s    
r@   c       	         s`  t  |  d ƒ r |  j }  t j |  ƒ } | d k	 r7 | St  t d ƒ rX t j |  ƒ } n t j |  ƒ } | d d … \ } ‰ ‰ } | pŒ f  } t | ƒ ‰  g  ‰ x‡ t | ƒ D]y \ } } t	 | t
 ƒ rÕ t d ƒ ‚ y | | ˆ  } Wn! t k
 r
| d d f } Yn X| d | f } ˆ j | ƒ q® Wt ˆ ƒ ‰ ‡  ‡ ‡ ‡ 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       
         sC  g  } g  } i  } x¾ t  ˆ ƒ D]° \ } \ } } } y | j |  | ƒ Wnd t k
 r¯ y | j | j | ƒ ƒ Wn5 t k
 rª | r™ | j | ƒ n | j | ƒ Yn XYq 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)ÚhasattrrA   Ú_signature_cacheÚgetÚinspectrB   Z
getargspecÚlenrD   r!   ÚlistÚ	TypeErrorrF   rE   Útuple)	ÚfuncrT   ÚtupZ
positionalÚdefaultsrM   rN   rO   Úparamr   )rP   rQ   rR   rS   r   Ú_parse_signaturet   s4    		)
ra   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    
"$ru   c               @   sj   e  Z d  Z d Z d Z d d d d 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   sF   | |  _  | |  _ | |  _ | |  _ | d  k	 r9 | |  _ | |  _ d  S)N)rN   rO   Ú	load_funcÚ	dump_funcÚ	read_onlyÚ__doc__)r   rN   rO   rw   rx   ry   Údocr   r   r   Ú__init__×   s    						z_DictAccessorProperty.__init__c             C   sŒ   | d  k r |  S|  j  | ƒ } |  j | k r5 |  j S| |  j } |  j d  k	 rˆ y |  j | ƒ } Wn! t t f k
 r‡ |  j } Yn X| S)N)ÚlookuprN   rO   rw   Ú
ValueErrorr[   )r   r%   r$   ZstorageÚrvr   r   r   Ú__get__è   s    z_DictAccessorProperty.__get__c             C   sM   |  j  r t d ƒ ‚ |  j d  k	 r3 |  j | ƒ } | |  j | ƒ |  j <d  S)Nzread only property)ry   ÚAttributeErrorrx   r}   rN   )r   r%   Úvaluer   r   r   Ú__set__ö   s
    	z_DictAccessorProperty.__set__c             C   s5   |  j  r t d ƒ ‚ |  j | ƒ j |  j d  ƒ d  S)Nzread only property)ry   r�   r}   rG   rN   )r   r%   r   r   r   Ú
__delete__ý   s    	z _DictAccessorProperty.__delete__c             C   s   d |  j  j |  j f S)Nz<%s %s>)Ú	__class__r   rN   )r   r   r   r   r     s    z_DictAccessorProperty.__repr__)
r   r   r   rz   ry   r|   r€   rƒ   r„   r   r   r   r   r   rv   Ò   s   
rv   c             C   s…   t  ƒ  } d } t j } | j } x? t |  ƒ D]1 } | t k rU d } | | | ƒ } | | ƒ q. W| rs t | ƒ St d | d ƒ S)NTFr   )Ú	bytearrayÚ_cookie_quoting_maprW   rI   r	   Ú_legal_cookie_charsÚbytes)ÚbÚbufZ	all_legalZ_lookupÚ_pushÚcharr   r   r   Ú_cookie_quote  s    			
rŽ   c       	      C   sÁ  t  |  ƒ d k  r |  S|  d  d … d k sB |  d d  … d k rF |  S|  d d … }  d } t  |  ƒ } t ƒ  } | j } x:d | k o” | k  n r¶t j |  | ƒ } t j |  | ƒ } | rã | rã | j |  | d  … ƒ Pd	 } } | r| j d ƒ } | r| j d ƒ } | rm| s0| | k  rm| |  | | … ƒ | |  | d | d … ƒ | d } q} | |  | | … ƒ | j t |  | d | d … d ƒ ƒ | d } q} Wt	 | ƒ S)
Né   r   r   r   rC   é   éÿÿÿÿr‘   r‘   )
rY   r†   rI   Ú	_octal_reÚsearchÚ	_quote_reÚstartrE   rg   r‰   )	rŠ   ÚiÚnr   rŒ   Úo_matchÚq_matchÚjÚkr   r   r   Ú_cookie_unquote  s8    ,		
(rœ   c             c   s–   d } t  |  ƒ } x} | | k  r‘ t j |  d | ƒ } | s> P| j d ƒ j ƒ  } | j d ƒ pe d } | j d ƒ } t | ƒ t | ƒ f Vq Wd S)z8Lowlevel cookie parsing facility that operates on bytes.r   r   ÚkeyÚvaló    N)rY   Ú
_cookie_rer“   ÚgroupÚstripÚendrœ   )rŠ   r–   r—   Úmatchr�   r‚   r   r   r   Ú_cookie_parse_impl;  s    r¥   c             C   s’   t  |  t ƒ s  |  j d ƒ |  Sy |  j d ƒ SWn t k
 rE Yn X|  j d ƒ } x- t | ƒ D] \ } } | j d ƒ | | <qb Wd j | ƒ S)Nr   Ú.Úidnaó   .)r!   r   ÚdecodeÚencodeÚUnicodeErrorÚsplitrD   Újoin)ÚdomainÚpartsrM   Úpartr   r   r   Ú_encode_idnaL  s    r±   c             C   s¶   t  |  t ƒ r; y |  j d ƒ }  Wn t k
 r: |  SYn X|  j d ƒ } x\ t | ƒ D]N \ } } y | j d ƒ | | <WqW t k
 r¤ | j d d ƒ | | <YqW XqW Wd j | ƒ S)Nr   r¨   r§   Úignorer¦   )r!   r   rª   r«   r¬   rD   r©   r­   )r®   r¯   rM   r°   r   r   r   Ú_decode_idna_  s    	r³   c             C   s^   |  d  k r d  St  |  ƒ }  d |  k r> |  j d d ƒ d }  d |  k rN |  St 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_domainv  s    rµ   c                sM   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   s7   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   ú )rY   )r)   Úxr   r   r   ú
<listcomp>’  s   	z_easteregg.<locals>.<listcomp>s#	  
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
7f2zLkGNv8b191cD/3vs9Q833z8tc                sg   d  ‡  f d d † } ˆ d  k	 rC |  j  d ƒ d k rC ˆ |  | ƒ S| d d
 g ƒ d ˆ j d	 ƒ g S)Nc                s   | j  d ƒ ˆ  |  | | ƒ S)NúX-Powered-ByÚWerkzeug)rÁ   rÂ   )rE   )Ú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   )rÉ   rÊ   )rW   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Î   )1rz   rX   r5   ÚreÚstringr   r   Ú	itertoolsr   Úweakrefr   Ú_compatr   r   r	   r
   r   r4   rV   rh   ri   Úascii_lettersÚdigitsrª   rˆ   r‡   Z_iÚcompiler’   r”   Z_legal_cookie_chars_reÚVERBOSEr    Úobjectr   r   r'   r3   r@   ra   ru   rv   rŽ   rœ   r¥   r±   r³   rµ   rÎ   r   r   r   r   Ú<module>
   sT   		%!
	N4$