o
    #jڅ                     @  s  d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	m
Z
mZ ddlmZ ddlmZmZ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mZmZ ddl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-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@ erddlAmBZB ddlCmDZDmEZE ddlFmZG ddlmHZH ejIdkrejJZKnejZKefd-d d!ZLefd.d%d&ZMG d'd( d(ZNG d)d* d*eNZOd/d+d,ZPdS )0z
requests.sessions
~~~~~~~~~~~~~~~~~

This module provides a Session object to manage and persist settings across
requests (cookies, auth, proxies).
    )annotationsN)OrderedDict)	GeneratorMappingMutableMapping)	timedelta)TYPE_CHECKINGAnycast   )to_native_string)is_prepared)HTTPAdapter)_basic_auth_str)	cookieliburljoinurlparse)RequestsCookieJarcookiejar_from_dictextract_cookies_to_jarmerge_cookies)ChunkedEncodingErrorContentDecodingErrorInvalidSchemaTooManyRedirects)default_hooksdispatch_hook)DEFAULT_REDIRECT_LIMITREDIRECT_STATIPreparedRequestRequestResponse)codes)CaseInsensitiveDict)
DEFAULT_PORTSdefault_headersget_auth_from_urlget_environ_proxiesget_netrc_authrequote_uriresolve_proxiesrewind_bodyshould_bypass_proxiesto_key_val_list)	CookieJar)SelfUnpack)_types)BaseAdapterwin32request_settingr	   session_setting
dict_classtypereturnc                 C  sp   |du r| S | du r|S t |trt | ts| S |t|}|t|  dd | D }|D ]}||= q0|S )zDetermines appropriate setting for a given request, taking into account
    the explicit setting on that request, and the setting in the session. If a
    setting is a dictionary, they will be merged together using `dict_class`
    Nc                 S  s   g | ]
\}}|d u r|qS N ).0kvr:   r:   R/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/requests/sessions.py
<listcomp>e   s    z!merge_setting.<locals>.<listcomp>)
isinstancer   r-   updateitems)r4   r5   r6   merged_setting	none_keyskeyr:   r:   r>   merge_settingL   s   rF   request_hooks_t.HooksTypesession_hooksc                 C  s@   |du s| dg kr| S | du s|  dg kr|S t| ||S )zProperly merges both requests and session hooks.

    This is necessary because when request_hooks == {'response': []}, the
    merge breaks Session hooks entirely.
    Nresponse)getrF   )rG   rI   r6   r:   r:   r>   merge_hooksl   s
   
rL   c                   @  sz   e Zd ZU ded< ded< ded< d4ddZd5ddZd6ddZ						d7d8d(d)Zd9d-d.Zd:d0d1Z	d9d2d3Z
dS );SessionRedirectMixinintmax_redirectsbool	trust_envr   cookiesrequestr   kwargsr	   r8   r!   c                 K  s   d S r9   r:   )selfrS   rT   r:   r:   r>   send   s    zSessionRedirectMixin.sendresp
str | Nonec                 C  s(   |j r|jd }|d}t|dS dS )z7Receives a Response. Returns a redirect URI or ``None``locationlatin1utf8N)is_redirectheadersencoder   )rU   rW   rY   r:   r:   r>   get_redirect_target   s
   


z(SessionRedirectMixin.get_redirect_targetold_urlstrnew_urlc                 C  s   t |}t |}|j|jkrdS |jdkr&|jdv r&|jdkr&|jdv r&dS |j|jk}|j|jk}t|jddf}|sI|j|v rI|j|v rIdS |pL|S )zFDecide whether Authorization header should be removed when redirectingThttp)P   Nhttps)i  NFN)r   hostnameschemeportr$   rK   )rU   r`   rb   
old_parsed
new_parsedchanged_portchanged_schemedefault_portr:   r:   r>   should_strip_auth   s$   





z&SessionRedirectMixin.should_strip_authFNTreqstreamtimeout_t.TimeoutTypeverify_t.VerifyTypecert_t.CertTypeproxiesdict[str, str] | Noneyield_requestsadapter_kwargsGenerator[Response, None, None]c	              
   k  sH   g }
|  |}t|jj}|r"| }|
dd |_|
| z|j W n tt	t
fy9   |jjdd Y nw t|j| jkrMtd| j d|d|  |dret|j}dt|j|g}t|}|jd	krw|rw|j|d
}n|jr}|j}| }|jst|jt|}nt|}t||_| || |jtjtjfvrd}|D ]	}|j |d qd|_!|j}| dd t"d|j#}t$|||j t%|| j& |'| | (||}| )|| |j*duod|v pd|v }|rt+| |}|r|V  n | j,|f|||||dd|	}t$| j&||j |  |}|V  |sdS dS )zBReceives a Response. Returns a generator of Responses or Requests.NF)decode_contentz	Exceeded z redirects.)rJ   z//: )fragment)Content-LengthzContent-TypeTransfer-EncodingCookier.   r   r   )rp   rq   rs   ru   rw   allow_redirects)-r_   r   urlr   copyhistoryappendcontentr   r   RuntimeErrorrawreadlenrO   r   close
startswithjoinr   rg   _replacegeturlnetlocr   r)   rebuild_methodstatus_coder"   temporary_redirectpermanent_redirectr]   popbodyr
   _cookiesr   r   rR   prepare_cookiesrebuild_proxiesrebuild_auth_body_positionr+   rV   )rU   rW   ro   rp   rq   rs   ru   rw   ry   rz   histr   previous_fragmentprepared_requestparsed_rurlparsedpurged_headersheaderr]   Z
cookie_jar
rewindabler:   r:   r>   resolve_redirects   s   








z&SessionRedirectMixin.resolve_redirectsr   rJ   Nonec                 C  sv   |j }t|s	J t|sJ |j}|j}|j}d|v r%| ||r%|d= | jr,t|nd}|dur9|| dS dS )zWhen being redirected we may want to strip authentication from the
        request to avoid leaking credentials. This method intelligently removes
        and reapplies authentication where possible to avoid credential loss.
        AuthorizationN)rS   _is_preparedr]   r   rn   rQ   r(   prepare_auth)rU   r   rJ   Zoriginal_requestr]   original_urlr   new_authr:   r:   r>   r   5  s   z!SessionRedirectMixin.rebuild_authdict[str, str]c                 C  s   t |sJ |j}t|jj}t||| j}d|v r|d= z
t|| \}}W n ty4   d\}}Y nw |	dsE|rE|rEt
|||d< |S )a  This method re-evaluates the proxy configuration by considering the
        environment variables. If we are redirected to a URL covered by
        NO_PROXY, we strip the proxy configuration. Otherwise, we set missing
        proxy keys for this URL (in case they were stripped by a previous
        redirect).

        This method also replaces the Proxy-Authorization header where
        necessary.

        :rtype: dict
        zProxy-AuthorizationNNre   )r   r]   r   r   rg   r*   rQ   r&   KeyErrorr   r   )rU   r   rw   r]   rg   new_proxiesusernamepasswordr:   r:   r>   r   N  s   z$SessionRedirectMixin.rebuild_proxiesc                 C  sX   |j }|jtjkr|dkrd}|jtjkr|dkrd}|jtjkr'|dkr'd}||_ dS )zWhen being redirected we may want to change the method of the request
        based on certain specs or browser behavior.
        HEADGETPOSTN)methodr   r"   	see_otherfoundmoved)rU   r   rJ   r   r:   r:   r>   r   r  s   
z#SessionRedirectMixin.rebuild_methodrS   r   rT   r	   r8   r!   )rW   r!   r8   rX   )r`   ra   rb   ra   r8   rP   )FNTNNF)rW   r!   ro   r   rp   rP   rq   rr   rs   rt   ru   rv   rw   rx   ry   rP   rz   r	   r8   r{   )r   r   rJ   r!   r8   r   )r   r   rw   rx   r8   r   )__name__
__module____qualname____annotations__rV   r_   rn   r   r   r   r   r:   r:   r:   r>   rM      s"   
 


$
{
$rM   c                   @  sp  e Zd ZU dZded< ded< ded< ded	< d
ed< ded< ded< ded< ded< ded< ded< ded< g dZded< dkddZdld!d"Zdmd%d&Zdnd*d+Z		,	,	,	,	,	,	,	-	,	,	,	,	,	,dodpdCdDZ
	,dqdrdGdHZdsdJdKZdsdLdMZ	,	,dtdudOdPZ	,dqdvdRdSZ	,dqdvdTdUZdsdVdWZdwdXdYZdxd[d\Zdyd^d_Zdkd`daZdzdddeZd{dfdgZd|didjZd,S )}Sessiona  A Requests session.

    Provides cookie persistence, connection-pooling, and configuration.

    Basic Usage::

      >>> import requests
      >>> s = requests.Session()
      >>> s.get('https://httpbin.org/get')
      <Response [200]>

    Or as a context manager::

      >>> with requests.Session() as s:
      ...     s.get('https://httpbin.org/get')
      <Response [200]>
    zCaseInsensitiveDict[str]r]   _t.AuthTypeauthr   rw   zdict[str, list[_t.HookType]]hookszMutableMapping[str, Any]paramsrP   rp   rt   rs   rv   ru   rN   rO   rQ   r   rR   z MutableMapping[str, BaseAdapter]adapters)r]   rR   r   rw   r   r   rs   ru   r   rp   rQ   rO   z	list[str]	__attrs__r8   r   c                 C  sr   t  | _d | _i | _t | _i | _d| _d| _d | _	t
| _d| _ti | _t | _| dt  | dt  d S )NFTzhttps://zhttp://)r%   r]   r   rw   r   r   r   rp   rs   ru   r   rO   rQ   r   rR   r   r   mountr   rU   r:   r:   r>   __init__  s   
zSession.__init__r/   c                 C  s   | S r9   r:   r   r:   r:   r>   	__enter__  s   zSession.__enter__argsr	   c                 G  s   |    d S r9   )r   )rU   r   r:   r:   r>   __exit__  s   zSession.__exit__rS   r    r   c                 C  s   t d|j}t t|j}|jpi }t|tjst|}t	t	t
 | j|}|j}| jr4|s4| js4t|}t }|j| ||j|j|jt|j| jtdt|j| jt|| j|t|j| jd
 |S )a  Constructs a :class:`PreparedRequest <PreparedRequest>` for
        transmission and returns it. The :class:`PreparedRequest` has settings
        merged from the :class:`Request <Request>` instance and those of the
        :class:`Session`.

        :param request: :class:`Request` instance to prepare with this
            session's settings.
        :rtype: requests.PreparedRequest
        
_t.UriType)r6   )
r   r   filesdatajsonr]   r   r   rR   r   )r
   r   ra   r   rR   r@   r   r.   r   r   r   r   rQ   r(   r   prepareupperr   r   r   rF   r]   r#   r   rL   r   )rU   rS   r   r   rR   merged_cookiesr   pr:   r:   r>   prepare_request  s6   



zSession.prepare_requestNTr   ra   r   r   _t.ParamsTyper   _t.DataType Mapping[str, str | bytes] | None5RequestsCookieJar | CookieJar | dict[str, str] | Noner   _t.FilesTyperq   rr   r   rx   _t.HooksInputType | Nonebool | None_t.VerifyType | Noner   _t.JsonTyper!   c                 C  s   t |tr
|d}t| ||||pi ||pi |||d
}| |}t|s)J |p,i }| |j||||}|	|
d}|	| | j
|fi |}|S )a
  Constructs a :class:`Request <Request>`, prepares it and sends it.
        Returns :class:`Response <Response>` object.

        :param method: method for the new :class:`Request` object.
        :param url: URL for the new :class:`Request` object.
        :param params: (optional) Dictionary or bytes to be sent in the query
            string for the :class:`Request`.
        :param data: (optional) Dictionary, list of tuples, bytes, or file-like
            object to send in the body of the :class:`Request`.
        :param json: (optional) json to send in the body of the
            :class:`Request`.
        :param headers: (optional) Dictionary of HTTP Headers to send with the
            :class:`Request`.
        :param cookies: (optional) Dict or CookieJar object to send with the
            :class:`Request`.
        :param files: (optional) Dictionary of ``'filename': file-like-objects``
            for multipart encoding upload.
        :param auth: (optional) Auth tuple or callable to enable
            Basic/Digest/Custom HTTP Auth.
        :param timeout: (optional) How many seconds to wait for the server to send
            data before giving up, as a float, or a :ref:`(connect timeout,
            read timeout) <timeouts>` tuple.
        :type timeout: float or tuple
        :param allow_redirects: (optional) Set to True by default.
        :type allow_redirects: bool
        :param proxies: (optional) Dictionary mapping protocol or protocol and
            hostname to the URL of the proxy.
        :param hooks: (optional) Dictionary mapping hook name to one event or
            list of events, event must be callable.
        :param stream: (optional) whether to immediately download the response
            content. Defaults to ``False``.
        :param verify: (optional) Either a boolean, in which case it controls whether we verify
            the server's TLS certificate, or a string, in which case it must be a path
            to a CA bundle to use. Defaults to ``True``. When set to
            ``False``, requests will accept any TLS certificate presented by
            the server, and will ignore hostname mismatches and/or expired
            certificates, which will make your application vulnerable to
            man-in-the-middle (MitM) attacks. Setting verify to ``False``
            may be useful during local development or testing.
        :param cert: (optional) if String, path to ssl client cert file (.pem).
            If Tuple, ('cert', 'key') pair.
        :rtype: requests.Response
        zutf-8)
r   r   r]   r   r   r   r   r   rR   r   )rq   r   )r@   bytesdecoder    r   r   r   merge_environment_settingsr   rA   rV   )rU   r   r   r   r   r]   rR   r   r   rq   r   rw   r   rp   rs   ru   r   ro   prepsettingssend_kwargsrW   r:   r:   r>   rS   -  s4   
>


zSession.requestrT   Unpack[_t.GetKwargs]c                 K  s$   | dd | jd|fd|i|S )ai  Sends a GET request. Returns :class:`Response` object.

        :param url: URL for the new :class:`Request` object.
        :param params: (optional) Dictionary, list of tuples or bytes to send
        in the query string for the :class:`Request`.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        :rtype: requests.Response
        r   Tr   r   
setdefaultrS   )rU   r   r   rT   r:   r:   r>   rK     s   zSession.getUnpack[_t.RequestKwargs]c                 K      | dd | jd|fi |S )zSends a OPTIONS request. Returns :class:`Response` object.

        :param url: URL for the new :class:`Request` object.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        :rtype: requests.Response
        r   TOPTIONSr   rU   r   rT   r:   r:   r>   options     zSession.optionsc                 K  r   )zSends a HEAD request. Returns :class:`Response` object.

        :param url: URL for the new :class:`Request` object.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        :rtype: requests.Response
        r   Fr   r   r   r:   r:   r>   head  r   zSession.headUnpack[_t.PostKwargs]c                 K  s   | j d|f||d|S )a  Sends a POST request. Returns :class:`Response` object.

        :param url: URL for the new :class:`Request` object.
        :param data: (optional) Dictionary, list of tuples, bytes, or file-like
            object to send in the body of the :class:`Request`.
        :param json: (optional) json to send in the body of the :class:`Request`.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        :rtype: requests.Response
        r   )r   r   rS   )rU   r   r   r   rT   r:   r:   r>   post  s   zSession.postUnpack[_t.DataKwargs]c                 K     | j d|fd|i|S )au  Sends a PUT request. Returns :class:`Response` object.

        :param url: URL for the new :class:`Request` object.
        :param data: (optional) Dictionary, list of tuples, bytes, or file-like
            object to send in the body of the :class:`Request`.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        :rtype: requests.Response
        PUTr   r   rU   r   r   rT   r:   r:   r>   put     zSession.putc                 K  r   )aw  Sends a PATCH request. Returns :class:`Response` object.

        :param url: URL for the new :class:`Request` object.
        :param data: (optional) Dictionary, list of tuples, bytes, or file-like
            object to send in the body of the :class:`Request`.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        :rtype: requests.Response
        PATCHr   r   r   r:   r:   r>   patch  r   zSession.patchc                 K  s   | j d|fi |S )zSends a DELETE request. Returns :class:`Response` object.

        :param url: URL for the new :class:`Request` object.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        :rtype: requests.Response
        DELETEr   r   r:   r:   r>   delete  s   zSession.deletec                 K  s  | d| j | d| j | d| j d|vr#t|| j| j|d< t|tr,t	dt
|s2J |dd}|d}|j}| j|jd}t }|j|fi |}t | }	t|	d	|_td
||fi |}|jrz|jD ]}
t| j|
j|
j qnt| j||j |r| j||fi |}dd |D }ng }|r|d| | }||_|szt| j||fddi||_W n	 ty   Y nw |s|j |S )zISend a given PreparedRequest.

        :rtype: requests.Response
        rp   rs   ru   rw   z#You can only send PreparedRequests.r   T)r   )secondsrJ   c                 S  s   g | ]}|qS r:   r:   )r;   rW   r:   r:   r>   r?   %  s    z Session.send.<locals>.<listcomp>r   ry   ) r   rp   rs   ru   r*   rw   rQ   r@   r    
ValueErrorr   r   rK   r   get_adapterr   preferred_clockrV   r   elapsedr   r   r   rR   rS   r   r   insertnext_nextStopIterationr   )rU   rS   rT   r   rp   r   adapterstartrr   rW   genr   r:   r:   r>   rV     sP   




zSession.senddict[str, Any]c           
      C  s   | j r=|dur|dnd}t||d}|dur'| D ]
\}}	|||	 q|du s/|du r=tjdp<tjdp<|}t|| j}t|| j	}t|| j
}t|| j}||||dS )z^
        Check the environment and merge it with some settings.

        :rtype: dict
        Nno_proxy)r	  TREQUESTS_CA_BUNDLECURL_CA_BUNDLE)rw   rp   rs   ru   )rQ   rK   r'   rB   r   osenvironrF   rw   rp   rs   ru   )
rU   r   rw   rp   rs   ru   r	  env_proxiesr<   r=   r:   r:   r>   r   ?  s"   
z"Session.merge_environment_settingsr2   c                 C  s<   | j  D ]\}}| | r|  S qtd|)z~
        Returns the appropriate connection adapter for the given URL.

        :rtype: requests.adapters.BaseAdapter
        z&No connection adapters were found for )r   rB   lowerr   r   )rU   r   prefixr  r:   r:   r>   r   f  s
   zSession.get_adapterc                 C  s   | j  D ]}|  qdS )z+Closes all adapters and as such the sessionN)r   valuesr   )rU   r=   r:   r:   r>   r   s  s   
zSession.closer  r  c                   s>   || j  <  fdd| j D }|D ]}| j || j |< qdS )zwRegisters a connection adapter to a prefix.

        Adapters are sorted in descending order by prefix length.
        c                   s    g | ]}t |t  k r|qS r:   )r   )r;   r<   r  r:   r>   r?   ~  s     z!Session.mount.<locals>.<listcomp>N)r   r   )rU   r  r  keys_to_moverE   r:   r  r>   r   x  s
   
zSession.mountc                   s    fdd j D }|S )Nc                   s   i | ]	}|t  |d qS r9   )getattr)r;   attrr   r:   r>   
<dictcomp>  s    z(Session.__getstate__.<locals>.<dictcomp>)r   )rU   stater:   r   r>   __getstate__  s   zSession.__getstate__r  c                 C  s"   |  D ]
\}}t| || qd S r9   )rB   setattr)rU   r  r  valuer:   r:   r>   __setstate__  s   zSession.__setstate__)r8   r   )r8   r/   )r   r	   r8   r   )rS   r    r8   r   )NNNNNNNTNNNNNN)"r   ra   r   r   r   r   r   r   r]   r   rR   r   r   r   r   r   rq   rr   r   rP   rw   rx   r   r   rp   r   rs   r   ru   rv   r   r   r8   r!   r9   )r   r   r   r   rT   r   r8   r!   )r   r   rT   r   r8   r!   r   )
r   r   r   r   r   r   rT   r   r8   r!   )r   r   r   r   rT   r   r8   r!   r   )r   ra   rw   rx   rp   r   rs   r   ru   rv   r8   r  )r   ra   r8   r2   )r  ra   r  r2   r8   r   )r8   r  )r  r  r8   r   )r   r   r   __doc__r   r   r   r   r   r   rS   rK   r   r   r   r   r   r   rV   r   r   r   r   r  r  r:   r:   r:   r>   r     sj   
 

?

2e





O
'


r   c                   C  s   t  S )aZ  
    Returns a :class:`Session` for context-management.

    .. deprecated:: 1.0.0

        This method has been deprecated since version 1.0.0 and is only kept for
        backwards compatibility. New code should use :class:`~requests.sessions.Session`
        to create a session. This may be removed at a future date.

    :rtype: Session
    )r   r:   r:   r:   r>   session  s   r  )r4   r	   r5   r	   r6   r7   r8   r	   )rG   rH   rI   rH   r6   r7   r8   rH   )r8   r   )Qr  
__future__r   r  systimecollectionsr   collections.abcr   r   r   datetimer   typingr   r	   r
   _internal_utilsr   r1   r   r   r   r   r   r   compatr   r   r   rR   r   r   r   r   
exceptionsr   r   r   r   r   r   r   modelsr   r   r   r    r!   status_codesr"   
structuresr#   utilsr$   r%   r&   r'   r(   r)   r*   r+   r,   r-   http.cookiejarr.   Ztyping_extensionsr/   r0   r~   Z_tr2   platformperf_counterr   rF   rL   rM   r   r  r:   r:   r:   r>   <module>   sT    0
#      