
_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$