B
    `#                 @   s  d dl Z d dlmZmZ d dlmZ d dlmZmZ d dlm	Z	m
Z
 d dlmZmZ d dlmZmZ e de jZe d	e jZe Zedfd
dZeddfddZdd Zdd Zdd ZdEddZdd Zdd Zdd Zdd Z dd Z!e d Z"dFd"d#Z#d$d% Z$d&d' Z%d(d) Z&d*d+ Z'd,d- Z(d.d/ Z)e*Z+d0d1 Z,d2d3 Z-e d4Z.d5d6 Z/d7d8d9d:d;d<d=gZ0e12e0dZ0ed>d?d@gZ3dAdB Z4dCdD Z5dS )G    N)datedatetime)
namedtuple)ContentRangeRange)PY2	text_type)
parse_dateserialize_date)header_docstringwarn_deprecationz;\s*charset=([^;]*)z^[a-z]+:c                st   |rt |}nd } tkr>fdd}fdd}d }n& fdd}fdd}fdd	}t||||d
S )Nz0Gets and sets the ``%s`` key in the environment.c                s
   | j   S )N)environ)req)key Y/home/kop/projects/devel/pgwui/test_venv/lib/python3.7/site-packages/webob/descriptors.pyfget+   s    zenviron_getter.<locals>.fgetc                s   || j  < d S )N)r   )r   val)r   r   r   fset-   s    zenviron_getter.<locals>.fsetc                s   | j  S )N)r   get)r   )defaultr   r   r   r   1   s    c                s*   |d kr | j kr&| j  = n
|| j  < d S )N)r   )r   r   )r   r   r   r   3   s    

c                s   | j  = d S )N)r   )r   )r   r   r   fdel9   s    zenviron_getter.<locals>.fdel)doc)r   
_not_givenproperty)r   r   rfc_sectionr   r   r   r   r   )r   r   r   environ_getter%   s    r   c                s|   |rt |}nd } tkrBfdd}fdd}d }n* fdd}fdd}fdd	}t||||d
S )Nz0Gets and sets the ``%s`` key in the environment.c                s   | j  dS )N)encattr)encget)r   )r   r   r   r   r   E   s    zenviron_decoder.<locals>.fgetc                s   | j | dS )N)r   )encset)r   r   )r   r   r   r   r   G   s    zenviron_decoder.<locals>.fsetc                s   | j  dS )N)r   )r   )r   )r   r   r   r   r   r   K   s    c                s0   |d kr| j kr,| j = n| j| dS d S )N)r   )r   r   )r   r   )r   r   r   r   r   M   s    

c                s   | j  = d S )N)r   )r   )r   r   r   r   S   s    zenviron_decoder.<locals>.fdel)r   )r   r   r   )r   r   r   r   r   r   r   r   r   )r   r   r   r   environ_decoder>   s    r    c                sH   t r fdd} fdd}n fdd} fdd}t||d  dS )	Nc                s   | j }| j d|S )N )url_encodingr   r   decode)r   encoding)r   r   r   r   Y   s    zupath_property.<locals>.fgetc                s(   | j }t|tr||}|| j < d S )N)r"   
isinstancer   encoder   )r   r   r$   )r   r   r   r   \   s    

zupath_property.<locals>.fsetc                s    | j }| j dd|S )Nr!   zlatin-1)r"   r   r   r&   r#   )r   r$   )r   r   r   r   b   s    c                s    | j }||d| j < d S )Nzlatin-1)r"   r&   r#   r   )r   r   r$   )r   r   r   r   e   s    zupath_property(%r))r   )r   r   )r   r   r   r   )r   r   upath_propertyW   s    r'   c                sL   fdd fdd} fdd} fdd}t |||d	 S )
zA
    Wraps a descriptor, with a deprecation warning or error
    c                  s   t d f d d S )Nz"The attribute %s is deprecated: %s   )r   r   )nametextversionr   r   warnp   s    z!deprecated_property.<locals>.warnc                s       | t| S )N)__get__type)self)attrr,   r   r   r   v   s    z!deprecated_property.<locals>.fgetc                s       | | d S )N)__set__)r/   r   )r0   r,   r   r   r   y   s    z!deprecated_property.<locals>.fsetc                s       |  d S )N)
__delete__)r/   )r0   r,   r   r   r   |   s    z!deprecated_property.<locals>.fdelz<Deprecated attribute %s>)r   )r0   r)   r*   r+   r   r   r   r   )r0   r)   r*   r+   r,   r   deprecated_propertyl   s    r3   c                sF   t |} fdd} fdd}fdd t|| |S )Nc                s(   x"| j D ]\}}|  kr|S qW d S )N)_headerlistlower)rkv)r   r   r   r      s    zheader_getter.<locals>.fgetc                sT    |  |d k	rPd|ks d|kr(t dt|tr@tr@|d}| j|f d S )N
z/Header value may not contain control characterszlatin-1)
ValueErrorr%   r   r   r&   r4   append)r6   value)r   headerr   r   r      s    
zheader_getter.<locals>.fsetc                s"    fdd| j D | j d d < d S )Nc                s$   g | ]\}}|   kr||fqS r   )r5   ).0r7   r8   )r   r   r   
<listcomp>   s    z/header_getter.<locals>.fdel.<locals>.<listcomp>)r4   )r6   )r   r   r   r      s    zheader_getter.<locals>.fdel)r   r5   r   )r>   r   r   r   r   r   )r   r>   r   r   header_getter   s    

rA   c                sr   t | tst|p djjf }| jp*d}|d| 7 }| j| j   fdd}fdd}t||| j|S )Nz``%s`` and ``%s``r!   z  Converts it using %s.c                s    | S )Nr   )r6   )hgetparser   r   r      s    zconverter.<locals>.fgetc                s   |d k	r|} | | d S )Nr   )r6   r   )hset	serializer   r   r      s    zconverter.<locals>.fset)r%   r   AssertionError__name____doc__r   r   r   )proprC   rE   Zconvert_namer   r   r   r   )rB   rD   rC   rE   r   	converter   s    


rJ   c             C   s   t | |}t|ttdS )Nlist)rA   rJ   
parse_listserialize_list)r>   r   rI   r   r   r   list_header   s    
rN   c             C   s&   | sd S t td dd | dD S )Nc             S   s   g | ]}|  qS r   )strip)r?   r8   r   r   r   r@      s    zparse_list.<locals>.<listcomp>,)tuplefiltersplit)r=   r   r   r   rL      s    rL   c             C   s*   t | ttfrt| S dtt| S d S )Nz, )r%   r   bytesstrjoinmap)r=   r   r   r   rM      s    rM   c             C   s   t | ttdS )Nz	HTTP date)rJ   r	   r
   )rI   r   r   r   converter_date   s    rX   c             C   s   t t| |S )N)rX   rA   )r>   r   r   r   r   date_header   s    rY   z(?:^|\s)(W/)?"((?:\\"|.)*?)"Fc             C   sB   | sdS t | }|s| S |r,|dr,dS |dddS dS )z
    Parse a response ETag.
    See:
        * http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.19
        * http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.11
    N      z\"")_rx_etagmatchgroupreplace)r=   strongmr   r   r   parse_etag_response   s    
rc   c             C   sF   d}t | tr| \} }nt| r&| S d| dd }|sBd| }|S )NTz"%s"r\   z\"zW/)r%   rQ   r]   r^   r`   )r=   ra   r6   r   r   r   serialize_etag_response   s    


rd   c             C   s&   t | ttfrt| S t| } | p$d S )N)r%   r   r   r
   rU   )r=   r   r   r   serialize_if_range   s    re   c             C   s   | sd S t | S )N)r   rC   )r=   r   r   r   parse_range   s    rf   c             C   s8   | sd S t | ttfr"tt|  S t | ts0t| S d S )N)r%   rK   rQ   rU   r   rF   )r=   r   r   r   serialize_range  s    rg   c             C   s   | d ks| dkrd S t | S )Nr!   )int)r=   r   r   r   	parse_int  s    ri   c             C   s6   | d ks| dkrd S yt | S  tk
r0   d S X d S )Nr!   )rh   r;   )r=   r   r   r   parse_int_safe  s    rj   c             C   s   | r|   sd S t| S )N)rO   r   rC   )r=   r   r   r   parse_content_range  s    rk   c             C   sn   t | ttfrVt| dkr&td|  t| dkr@| \}}d }n
| \}}}t|||} t|  } | sjd S | S )N)r[   r(   zMWhen setting content_range to a list/tuple, it must be length 2 or 3 (not %r)r[   )r%   rQ   rK   lenr;   r   rU   rO   )r=   beginendlengthr   r   r   serialize_content_range!  s    
rp   z3([a-z]+)[ \t]*=[ \t]*(".*?"|[^,]*?)[ \t]*(?:\Z|, *)c             C   s.   i }x$t | D ]\}}|d||< qW |S )Nr\   )_rx_auth_paramfindallrO   )paramsr6   r7   r8   r   r   r   parse_auth_params7  s    rt   BasicZDigestZWSSEZ
HMACDigestZGoogleLoginCookieZOpenIDAuthorizationauthtypers   c             C   sH   | d k	rD|  d\}}}|tkr:|dkr2d|kr2nt|}t||S | S )N ru   r\   )	partitionknown_auth_schemesrt   _authorization)r   rx   seprs   r   r   r   
parse_authD  s    
r~   c             C   sT   t | ttfrP| \}}t |tr6dtdj| }t |tsDt	d||f S | S )Nz, z%s="%s"z%s %s)
r%   rQ   rK   dictrV   rW   __mod__itemsrU   rF   )r   rx   rs   r   r   r   serialize_authP  s    
r   )N)F)6rer   r   collectionsr   Zwebob.byteranger   r   Zwebob.compatr   r   Zwebob.datetime_utilsr	   r
   Z
webob.utilr   r   compileIZ
CHARSET_RE	SCHEME_REobjectr   r   r    r'   r3   rA   rJ   rN   rL   rM   rX   rY   r]   rc   rd   re   rf   rg   ri   rj   rU   Zserialize_intrk   rp   rq   rt   r{   r   fromkeysr|   r~   r   r   r   r   r   <module>   sP   
	

	

