o
    NK&h                     @   s   d dl Z d dlmZmZ d dlmZ d dlmZ e dZ	e dZ
e dZdd	 Zd
edeeee f fddZG dd deZdS )    N)AnyOptional)Cookie)RequestParametersu   [ --ÿ()<>@,;:\\"/[\]?={} 	]z\\[0-3][0-7][0-7]z[\\].c                 C   s\  | d u s
t | dk r| S | d dks| d dkr| S | dd } d}t | }g }d|  kr2|k rn nut| |}t| |}|sN|sN|| |d   n[d }}|rY|d}|r`|d}|r|rh||k r|| ||  || |d   |d }n|| ||  |tt| |d |d  d |d }d|  kr|k s4n d|S )	N   r   "          )	lenOCTAL_PATTERNsearchQUOTE_PATTERNappendstartchrintjoin)strinreso_matchq_matchjk r   H/var/www/html/venv/lib/python3.10/site-packages/sanic/cookies/request.py_unquote   s8   


$
r    rawreturnc                 C   s   i }|  dD ]I}|d\}}}| }| }|s#|sqd|}}t|r)qt|dkr?|d dkr?|d dkr?t|}||v rK|| | q|g||< q|S )a  Parses a raw cookie string into a dictionary.

    The function takes a raw cookie string (usually from HTTP headers) and
    returns a dictionary where each key is a cookie name and the value is a
    list of values for that cookie. The function handles quoted values and
    skips invalid cookie names.

    Args:
        raw (str): The raw cookie string to be parsed.

    Returns:
        Dict[str, List[str]]: A dictionary containing the cookie names as keys
        and a list of values for each cookie.

    Example:
        ```python
        raw = 'name1=value1; name2="value2"; name3=value3'
        cookies = parse_cookie(raw)
        # cookies will be {'name1': ['value1'], 'name2': ['value2'], 'name3': ['value3']}
        ```
    ;=r   r   r   r   r   )split	partitionstripCOOKIE_NAME_RESERVED_CHARSr   r   r    r   )r!   cookiestokennamesepvaluer   r   r   parse_cookie2   s"   

$r.   c                       s   e Zd ZdZdedee f fddZdedefddZdd	ed
ee dee f fddZ		dd	ed
ee
e  de
e f fddZd	edef fddZ  ZS )CookieRequestParametersa  A container for accessing single and multiple cookie values.

    Because the HTTP standard allows for multiple cookies with the same name,
    a standard dictionary cannot be used to access cookie values. This class
    provides a way to access cookie values in a way that is similar to a
    dictionary, but also allows for accessing multiple values for a single
    cookie name when necessary.

    Args:
        cookies (Dict[str, List[str]]): A dictionary containing the cookie
            names as keys and a list of values for each cookie.

    Example:
        ```python
        raw = 'name1=value1; name2="value2"; name3=value3'
        cookies = parse_cookie(raw)
        # cookies will be {'name1': ['value1'], 'name2': ['value2'], 'name3': ['value3']}

        request_cookies = CookieRequestParameters(cookies)
        request_cookies['name1']  # 'value1'
        request_cookies.get('name1')  # 'value1'
        request_cookies.getlist('name1')  # ['value1']
        ```
    keyr"   c                    s2   z|  |}W |S  ty   t |}Y |S w N)_get_prefixed_cookieKeyErrorsuper__getitem__)selfr0   r-   	__class__r   r   r5      s   z#CookieRequestParameters.__getitem__c                 C   s6   | dr
| |S |ddd}t| |dS )N_-r   )
startswith__getattribute__rstripreplacer   get)r6   r0   r   r   r   __getattr__   s   

z#CookieRequestParameters.__getattr__Nr+   defaultc                    s2   z|  |d W S  ty   t || Y S w )Nr   )r2   r3   r4   r?   r6   r+   rA   r7   r   r   r?      s
   zCookieRequestParameters.getc                    s.   z|  |W S  ty   t || Y S w r1   )r2   r3   r4   getlistrB   r7   r   r   rC      s
   zCookieRequestParameters.getlistc                    sB   t  j}z
|tj | W S  ty    |tj |  Y S w r1   )r4   r5   r   HOST_PREFIXr3   SECURE_PREFIX)r6   r+   getitemr7   r   r   r2      s   z,CookieRequestParameters._get_prefixed_cookier1   )__name__
__module____qualname____doc__r   r   r5   r@   r   r?   listrC   r2   __classcell__r   r   r7   r   r/   e   s    $
r/   )retypingr   r   sanic.cookies.responser   sanic.request.parametersr   compiler(   r   r   r    r   dictrK   r.   r/   r   r   r   r   <module>   s    

"3