o
    1)h                     @  s   d dl m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 edZ									d,d-ddZejdejejB dZedZd.d#d$Z		d/d0d)d*Zdd+lmZ dS )1    )annotationsN)datetime   )
_dt_as_utc)generate_etag)
parse_date)parse_etags)parse_if_range_header)unquote_etagz&([Ww]/)?(?:"(.*?)"|(.*?))(?:\s*,\s*|$)T
http_range
str | Nonehttp_if_rangehttp_if_modified_sincehttp_if_none_matchhttp_if_matchetagdatabytes | Nonelast_modifieddatetime | str | Noneignore_if_rangeboolreturnc	                 C  s  |du r|durt |}n|durtdd}	t|tr t|}|dur,t|jdd}d}
|s8| dur8t|}
|
durE|
jdurE|
j}nt|}|rS|rS||krSd}	|rt	|\}}|
duro|
j
durot|
j
|}	|	 S t|}|rz||}	t|}|r|| }	|	 S )a  Convenience method for conditional requests.
    :param http_range: Range HTTP header
    :param http_if_range: If-Range HTTP header
    :param http_if_modified_since: If-Modified-Since HTTP header
    :param http_if_none_match: If-None-Match HTTP header
    :param http_if_match: If-Match HTTP header
    :param etag: the etag for the response for comparison.
    :param data: or alternatively the data of the response to automatically
                 generate an etag using :func:`generate_etag`.
    :param last_modified: an optional date of the last modification.
    :param ignore_if_range: If `False`, `If-Range` header will be taken into
                            account.
    :return: `True` if the resource was modified, otherwise `False`.

    .. versionadded:: 2.2
    Nzboth data and etag givenFr   )microsecondT)r   	TypeError
isinstancestrr   r   replacer	   dater
   r   r   containsZcontains_weakZ	is_strong)r   r   r   r   r   r   r   r   r   Z
unmodifiedZif_rangeZmodified_since_Zif_none_matchZif_match r!   SC:\Users\User\Downloads\Proyecto_IoT\venv\Lib\site-packages\werkzeug/sansio/http.pyis_resource_modified   s:   


r#   zr
    ([^=;]*)
    (?:\s*=\s*
      (
        "(?:[^\\"]|\\.)*"
      |
        .*?
      )
    )?
    \s*;\s*
    )flagss   \\([0-3][0-7]{2}|.)mt.Match[bytes]bytesc                 C  s,   |  d}t|dkr|S t|dddS )N      big)grouplenintto_bytes)r%   vr!   r!   r"   _cookie_unslash_replaceq   s   
r0   cookiecls#type[ds.MultiDict[str, str]] | Noneds.MultiDict[str, str]c                 C  s   |du rt dtj}| s| S |  d} g }t| D ]<\}}| }| }|s+qt|dkrQ|d |d   kr?dkrQn nt	t
|dd  jd	d
}|||f q||S )a)  Parse a cookie from a string.

    The same key can be provided multiple times, the values are stored
    in-order. The default :class:`MultiDict` will have the first value
    first, and all values can be retrieved with
    :meth:`MultiDict.getlist`.

    :param cookie: The cookie header as a string.
    :param cls: A dict-like class to store the parsed cookies in.
        Defaults to :class:`MultiDict`.

    .. versionchanged:: 3.0
        Passing bytes, and the ``charset`` and ``errors`` parameters, were removed.

    .. versionadded:: 2.2
    Nztype[ds.MultiDict[str, str]];r   r   "r(   r   )errors)tcastdsZ	MultiDict
_cookie_refindallstripr,   _cookie_unslash_resubr0   encodedecodeappend)r1   r2   outZckZcvr!   r!   r"   parse_cookiez   s&   
,rE   )datastructures)	NNNNNNNNT)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r%   r&   r   r'   )NN)r1   r   r2   r3   r   r4   )
__future__r   retypingr9   r   	_internalr   httpr   r   r   r	   r
   compileZ_etag_rer#   ASCIIVERBOSEr<   r?   r0   rE    rF   r;   r!   r!   r!   r"   <module>   s>    
O



0