
    wc                        d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	m
Z
mZmZmZmZmZ ddlmZmZmZmZ ddlmZmZ dd	lmZ dd
lmZ ddlmZ e	r
ddlmZmZm Z  ddgZ!h dZ"dZ#eee$                  Z%eee$e&f         Z' ee(          Z)	 	 	 d:d;dZ*d<dZ+	 d=d>d!Z,d?d#Z-d@d%Z.dAd'Z/dBd*Z0dCd,Z1dDd/Z2dEdFd1Z3dEdGd2Z4dHd5Z5dId7Z6dJd9Z7dS )KzInternal utilities for generating the cache keys that are used to match requests

.. automodsumm:: requests_cache.cache_keys
   :functions-only:
   :nosignatures:
    )annotationsN)blake2b)	getLogger)TYPE_CHECKINGDictIterableListMappingOptionalUnion)	parse_qsl	urlencodeurlparse
urlunparse)RequestSession)CaseInsensitiveDict)url_normalize   )get_valid_kwargs)AnyPreparedRequest
AnyRequestCachedResponse
create_keynormalize_request>   Cache-ControlIf-None-MatchIf-Modified-Sincei ( Frequestr   ignored_parameters	ParamListmatch_headersUnion[ParamList, bool]returnstrc                   | s$t          di t          t           j        |          } t          | |          } | j        pd| j        | j        pd|                    dd          gt          | j	        |          }t          d          }|D ]$}|                    t          |                     %|                                S )a  Create a normalized cache key from either a request object or :py:class:`~requests.Request`
    arguments

    Args:
        request: Request object to generate a cache key from
        ignored_parameters: Request parames, headers, and/or body params to not match against
        match_headers: Match only the specified headers, or ``True`` to match all headers
        request_kwargs: Request arguments to generate a cache key from
     verifyT   )digest_size )r   r   __init__r   methodurlbodygetget_matched_headersheadersr   updateencode	hexdigest)r   r    r"   request_kwargs	key_partskeyparts          ;/usr/lib/python3/dist-packages/requests_cache/cache_keys.pyr   r   &   s       POO,W-=~NNOO  );<<G"8T**	
 
W_m	<	<I a
 
 
 C ! !

6$<<    ==??    r2   r   	List[str]c                     |sg S t          |t                    rt          |          t          z
  }nt                     t          z
  } fdt	          |d           D             S )zsGet only the headers we should match against as a list of ``k=v`` strings, given an optional
    include list.
    c                V    g | ]%}|v |                                  d |          &S =lower).0kr2   s     r:   
<listcomp>z'get_matched_headers.<locals>.<listcomp>X   sD       << 7799##wqz##<<r;   c                *    |                                  S NrA   )xs    r:   <lambda>z%get_matched_headers.<locals>.<lambda>Z   s    		 r;   )r8   )
isinstancer   setDEFAULT_EXCLUDE_HEADERSsorted)r2   r"   includeds   `  r:   r1   r1   J   s      	-** :}%%(??w<<"99   &9&9:::   r;   r   c                r   t          | t                    r"t                                          |           }n|                                 }|j        pd                                |_        t          |j        pd|          |_        t          |j
        |          |_
        t          ||          |_        |S )a  Normalize and remove ignored parameters from request URL, body, and headers.
    This is used for both:

    * Increasing cache hits by generating more precise cache keys
    * Redacting potentially sensitive info from cached requests

    Args:
        request: Request object to normalize
        ignored_parameters: Request parames, headers, and/or body params to not match against and
            to remove from the request
    r'   )rJ   r   r   prepare_requestcopyr-   uppernormalize_urlr.   normalize_headersr2   normalize_bodyr/   )r   r    norm_requests      r:   r   r   _   s     '7## &+299+D+DW+M+M||~~'.4";;==L$\%5%;=OPPL,\-ACUVVL&|5GHHLr;   Mapping[str, str]c                D    |rt          | |          } t          |           S )zSort and filter request headers)filter_sort_dictr   )r2   r    s     r:   rT   rT   y   s+      @"7,>??w'''r;   r.   c           
         t          |           }t          |j        |j        |j        |j        t          |j        |          |j        f          } t          |           S )zlNormalize and filter a URL. This includes request parameters, IDN domains, scheme, host,
    port, etc.
    )
r   r   schemenetlocpathparamsnormalize_paramsqueryfragmentr   )r.   r    
url_tokenss      r:   rS   rS      sa    
 #J
OZ-/ABB	
	 	C r;   bytesc                    | j         pd}| j                            d          }|}|dk    rt          ||          }n|dk    rt	          ||          }t          |          S )zJNormalize and filter a request body if possible, depending on Content-Typer;   zContent-Typezapplication/jsonz!application/x-www-form-urlencoded)r/   r2   r0   normalize_json_bodyr_   r4   )r   r    original_bodycontent_typefiltered_bodys        r:   rU   rU      sr    L'CM?&&~66L (5M)))+M;MNN	<	<	<(8JKK-   r;   rf   Union[str, bytes]c                ^   t          |           dk    st          |           t          k    r| S 	 t          j        t	          |                     }t          ||          }t          j        |          S # t          t          t          f$ r! t                              dd           | cY S w xY w)z=Normalize and filter a request body with serialized JSON datar   zInvalid JSON body:T)exc_info)lenMAX_NORM_BODY_SIZEjsonloadsdecodefilter_sort_jsondumpsAttributeError	TypeError
ValueErrorloggerdebug)rf   r    r/   s      r:   re   re      s    
 =Q#m"4"47I"I"Iz&//00&899z$Iz2   )D999s   AA4 45B,+B,valuec                   t          |           }t          t          |                    }d |                    d          D             }|                    d |D                        t          ||          }t          |          S )zWNormalize and filter urlencoded params from either a URL or request body with form datac                    g | ]
}|d |v|S r?   r+   rC   rD   s     r:   rE   z$normalize_params.<locals>.<listcomp>   s"    MMMQ!M1qr;   &c                    i | ]}|d S )r'   r+   r{   s     r:   
<dictcomp>z$normalize_params.<locals>.<dictcomp>   s    222Q1b222r;   )rp   dictr   splitr3   rY   r   )rx   r    	query_strr^   key_only_paramss        r:   r_   r_      s    uI)I&&''F NM)//#"6"6MMMO
MM22/222333f&899FVr;   responser   c                r    |r4t          | j        |          | _        t          | j        |          | _        | S )z[Redact any ignored parameters (potentially containing sensitive info) from a cached request)rS   r.   r   r   )r   r    s     r:   redact_responser      s:     S$X\3EFF,X-=?QRROr;   utf-8c                Z    t          | t                    r|                     |          n| S )zvDecode a value from bytes, if hasn't already been.
    Note: ``PreparedRequest.body`` is always encoded in utf-8.
    )rJ   rc   rp   rx   encodings     r:   rp   rp      s*     &0u%=%=H5<<!!!5Hr;   c                t    t          | t                    r| n!t          |                               |          S )z2Encode a value to bytes, if it hasn't already been)rJ   rc   r%   r4   r   s     r:   r4   r4      s/    ue,,M55#e**2C2CH2M2MMr;   dataUnion[List, Mapping]c                l    t          | t                    rt          | |          S t          | |          S rG   )rJ   r
   rY   filter_sort_listr   r    s     r:   rq   rq      s6    $   :&8999&8999r;   Dict[str, str]c                    s.t          t          |                                                     S fdt          |                                           D             S )Nc                >    i | ]\  }}|t                    v||S r+   rK   )rC   rD   vr    s      r:   r~   z$filter_sort_dict.<locals>.<dictcomp>   s2    VVVTQQcBT>U>U5U5UAq5U5U5Ur;   )r   rM   itemsr   s    `r:   rY   rY      sS     *F4::<<(()))VVVVVDJJLL11VVVVr;   r	   c                \    st          |           S fdt          |           D             S )Nc                6    g | ]}|t                    v|S r+   r   )rC   rD   r    s     r:   rE   z$filter_sort_list.<locals>.<listcomp>   s,    HHH!q4F0G0G'G'GA'G'G'Gr;   )rM   r   s    `r:   r   r      s7     d||HHHHvd||HHHHr;   )NNF)r   r   r    r!   r"   r#   r$   r%   )r2   r   r"   r#   r$   r<   rG   )r   r   r    r!   r$   r   )r2   rW   r    r!   r$   r   )r.   r%   r    r!   r$   r%   )r   r   r    r!   r$   rc   )rf   ri   r    r!   r$   ri   )rx   ri   r    r!   r$   r%   )r   r   r    r!   r$   r   )r   )r$   r%   )r$   rc   )r   r   r    r!   )r   rW   r    r!   r$   r   )r   r	   r    r!   r$   r	   )8__doc__
__future__r   rn   hashlibr   loggingr   typingr   r   r   r	   r
   r   r   urllib.parser   r   r   r   requestsr   r   requests.modelsr   r   _utilsr   modelsr   r   r   __all__rL   rm   r%   r!   rc   RequestContent__name__rv   r   r1   r   rT   rS   rU   re   r_   r   rp   r4   rq   rY   r   r+   r;   r:   <module>r      s    # " " " " "              P P P P P P P P P P P P P P P P P P C C C C C C C C C C C C % % % % % % % % / / / / / / ' ' ' ' ' ' $ $ $ $ $ $ GFFFFFFFFFF,
- RQQ  & Xc]#	wU*+	8		 $(,1! ! ! ! !H   , :>    4( ( ( (   (! ! ! !   $
 
 
 
   I I I I IN N N N N
: : : :W W W WI I I I I Ir;   