
    ɯei,]                    &   d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	m
Z
mZmZmZ d dlmZmZmZmZ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  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- ddl.m/Z/ erddl0m1Z1m2Z2  ejf                  e4      Z5dZ6 ed      Z7d Z8 G d de#      Z9 G d dejt                        Z; G d de;      Z< e
d       G d d             Z= e
d       G d de=             Z> G d  d!ee7         Z? G d" d#ejt                        Z@ G d$ d%e@ejt                        ZA G d& d'ejt                        ZB G d( d)eBeA      ZCdd*ddd+	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d1d,ZD G d- d.eC      ZE G d/ d0      ZFy)2    )annotationsN)asdict	dataclassfieldfieldsreplace)TYPE_CHECKINGAnyCallable	GeneratorGenericMappingTypeVar   )urlparse)get_proxy_url)should_bypass_proxies)requests)ResponseSession)BaseAdapterHTTPAdapter)InvalidProxyURL)prepend_scheme_if_neededselect_proxy)PoolManagerRetry)ProxyManager)	parse_url)HTTPConnectionPoolHTTPSConnectionPoolSessionTc                B     t        j                          fd       }|S )a  Decorator: push self into ssl_wrap_socket ContextVar for OCSP duration.

    Designed for methods that are implemented as generator functions.
    It performs a push-pop (``set_current_session_manager`` / ``reset_current_session_manager``)
    around the execution of the generator so that any TLS handshake & OCSP
    validation triggered by the HTTP request can reuse the correct proxy /
    retry configuration.

    Can be removed, when OCSP is deprecated.
    c              ?     K   ddl m}m}  ||       }	  | g|i |E d {     ||       y 7 #  ||       w xY ww)Nr   )reset_current_session_managerset_current_session_manager)#snowflake.connector.ssl_wrap_socketr%   r&   )selfargskwargsr%   r&   context_tokengenerator_funcs         e/var/www/html/glpi_dashboard/venv/lib/python3.12/site-packages/snowflake/connector/session_manager.pywrapperz3_propagate_session_manager_to_ocsp.<locals>.wrapper.   sK     	

 4D9	9%d<T<V<<<)-8 =)-8s#   A4 24 	A4 
>A)	functoolswraps)r,   r.   s   ` r-   "_propagate_session_manager_to_ocspr1   "   s'     __^$9 %9 N    c                      e Zd ZdZ	 d	 ddZy)ProxySupportAdapterz?This Adapter creates proper headers for Proxy CONNECT messages.Nc                P   t        |j                  |      }	 | j                  |||      \  }}|rt        |d      }t        |      }	|	j                  st        d      | j                  |      }
t        |
t              r/t        |j                        }|j                  |
j                  d<   n"t        j!                  dt#        |
       d        |
j$                  di |d|i}|S  | j&                  j$                  di |d|i}|S # t        $ r}t	        ||      d }~ww xY w)	N)requesthttpzFPlease check proxy URL. It is malformed and could be missing the host.Hostz.Unable to set 'Host' to proxy manager of type z/ as it does not have attribute 'proxy_headers'.pool_kwargs )r   url$build_connection_pool_key_attributes
ValueError
InvalidURLr   r   hostr   proxy_manager_for
isinstancer   r   netlocproxy_headersloggerdebugtypeconnection_from_hostpoolmanager)r(   r6   verifyproxiescertproxyhost_paramsr9   e	proxy_urlproxy_manager
parsed_urlconns                r-   get_connection_with_tls_contextz3ProxySupportAdapter.get_connection_with_tls_contextB   sO    W[['2	1'+'P'P($K ,UF;E!%(I>>%5  !2259M-6 &gkk2
6@6G6G++F3DT-EXDY ZC D
 6=55 +6D 	 94##88 +6D M  	1Q00	1s   D
 
	D%D  D%)NN)returnz(HTTPConnectionPool | HTTPSConnectionPool)__name__
__module____qualname____doc__rS   r:   r2   r-   r4   r4   ?   s    I 370	10r2   r4   c                  2    e Zd Zej                  dd       Zy)AdapterFactoryc                    t               N)NotImplementedErrorr(   r)   r*   s      r-   __call__zAdapterFactory.__call__v   s    !##r2   N)rT   r   )rU   rV   rW   abcabstractmethodr_   r:   r2   r-   rZ   rZ   u   s    $ $r2   rZ   c                      e Zd ZddZy)ProxySupportAdapterFactoryc                    t        |i |S r\   )r4   r^   s      r-   r_   z#ProxySupportAdapterFactory.__call__|   s    "D3F33r2   N)rT   r4   )rU   rV   rW   r_   r:   r2   r-   rc   rc   {   s    4r2   rc   T)frozenc                      e Zd ZU dZdZded<   eZded<   dZded	<   dZ	ded
<   dZ
ded<   dZded<   dZded<   ddZddZy)BaseHttpConfigz@Immutable HTTP configuration shared by SessionManager instances.Tbooluse_poolingzint | Retry | Nonemax_retriesN
str | None
proxy_host
proxy_port
proxy_userproxy_passwordno_proxyc                    t        | fi |S )z+Return a new config with overrides applied.)r   )r(   	overridess     r-   	copy_withzBaseHttpConfig.copy_with   s    t)y))r2   c                    t        t              D ch c]  }|j                   }}t        |       j	                         D ci c]  \  }}||v s|| c}}S c c}w c c}}w )zQExtract only BaseHttpConfig fields as a dict, excluding subclass-specific fields.)r   rg   namer   items)r(   fbase_field_nameskvs        r-   to_base_dictzBaseHttpConfig.to_base_dict   sV    ,2>,BCqAFFCC!'!3!3!5OA>N9N1OO DOs   AAA)rr   r
   rT   rg   )rT   zdict[str, Any])rU   rV   rW   rX   ri   __annotations__REQUESTS_RETRYrj   rl   rm   rn   ro   rp   rs   r{   r:   r2   r-   rg   rg      sW    JK&4K#4!J
!!J
!!J
!!%NJ%Hj*Pr2   rg   c                  6    e Zd ZU dZ ee      Zded<   ddZy)
HttpConfigz0HTTP configuration specific to requests library.)default_factoryCallable[..., HTTPAdapter]adapter_factoryc                    t        dh      }|D ci c]  }|t        | |       }}|j                  |        | j                  di |S c c}w )Nrj   r:   )	frozensetgetattrupdater   )r(   override_adapter_factory_kwargsattributes_for_adapter_factory	attr_nameself_kwargs_for_adapter_factorys        r-   get_adapterzHttpConfig.get_adapter   sp     *3*
& <+
 wtY//+
' +
 	(../NO#t##F&EFF+
s   A
N)rT   r   )	rU   rV   rW   rX   r   rc   r   r|   r   r:   r2   r-   r   r      s     :2723O/ Gr2   r   c                  >    e Zd ZdZd	dZddd
dZddZddZddZy)SessionPoola  
    Component responsible for storing and reusing established session instances.

    This approach is especially useful in scenarios where multiple requests would have to be sent
    to the same host in short period of time. Instead of repeatedly establishing a new TCP connection
    for each request, one can get a new Session instance only when there was no connection to the
    current host yet, or the workload is so high that all established sessions are already occupied.

    Sessions are created using the factory method make_session of a passed instance of the
    SessionManager class.

    Generic over SessionT to support different session types (requests.Session, aiohttp.ClientSession, etc.)
    c                >    g | _         t               | _        || _        y r\   )_idle_sessionsset_active_sessions_manager)r(   managers     r-   __init__zSessionPool.__init__   s    .0/2ur2   Nr;   c                   	 | j                   j                         }| j
                  j                  |       |S # t        $ r | j                  j	                  |      }Y Dw xY w)z=Returns a session from the session pool or creates a new one.r   )r   pop
IndexErrorr   make_sessionr   addr(   r;   sessions      r-   get_sessionzSessionPool.get_session   s^    	:))--/G 	!!'*  	:mm00S09G	:s   9 %A! A!c                    	 | j                   j                  |       | j
                  j                  |       y# t        $ r t        j	                  d       Y <w xY w)z:Places an active session back into the idle session stack.z<session doesn't exist in the active session pool. Ignored...N)r   removeKeyErrorrD   rE   r   append)r(   r   s     r-   return_sessionzSessionPool.return_session   sR    	Y!!((1 	""7+  	YLLWX	Ys   9 AAc                    t        | j                        t        | j                        z   }dt        | j                         d| dS )NzSessionPool / active sessions)lenr   r   )r(   total_sessionss     r-   __str__zSessionPool.__str__   sG    T223c$:M:M6NN3t4456a7GGWX	
r2   c                   | j                   r,t        j                  dt        | j                          d       t	        j
                  | j                   | j                        D ]  }	 |j                           | j                   j                          | j                  j                          y# t        $ r"}t        j                  d|        Y d}~qd}~ww xY w)z9Closes all active and idle sessions in this session pool.zClosing r   z2Session cleanup failed - failed to close session: N)r   rD   rE   r   	itertoolschainr   close	Exceptioninfoclear)r(   r   rN   s      r-   r   zSessionPool.close   s      LL8C(=(=$>#??OPQ t'<'<d>Q>QR 	VGV	V
 	##%!!#  VPQRPSTUUVs   'B..	C7CC)r   SessionManagerrT   None)r;   rk   rT   r"   )r   r"   rT   r   rT   str)rT   r   )	rU   rV   rW   rX   r   r   r   r   r   r:   r2   r-   r   r      s%      04 ,

$r2   r   c                      e Zd Zeej
                  dd              Zej                  ej
                  dd              Zed	d       Zej                  d
d       Zedd       Z	e	j                  dd       Z	y)_BaseConfigDirectAccessMixinc                     y r\   r:   r(   s    r-   configz#_BaseConfigDirectAccessMixin.config   s    $'r2   c                     y r\   r:   r(   values     r-   r   z#_BaseConfigDirectAccessMixin.config   s    +.r2   c                .    | j                   j                  S r\   )r   ri   r   s    r-   ri   z(_BaseConfigDirectAccessMixin.use_pooling       {{&&&r2   c                F    | j                   j                  |      | _         y )N)ri   r   rs   r   s     r-   ri   z(_BaseConfigDirectAccessMixin.use_pooling       kk+++>r2   c                .    | j                   j                  S r\   )r   rj   r   s    r-   rj   z(_BaseConfigDirectAccessMixin.max_retries   r   r2   c                F    | j                   j                  |      | _         y )N)rj   r   r   s     r-   rj   z(_BaseConfigDirectAccessMixin.max_retries   r   r2   NrT   r   )rT   rh   )r   rh   rT   r   )rT   Retry | int)r   r   rT   r   )
rU   rV   rW   propertyr`   ra   r   setterri   rj   r:   r2   r-   r   r      s    '  ']].  .' ' ? ? ' ' ? ?r2   r   c                  D    e Zd Zedd       Zej
                  dd       Zy)_HttpConfigDirectAccessMixinc                .    | j                   j                  S r\   )r   r   r   s    r-   r   z,_HttpConfigDirectAccessMixin.adapter_factory  s    {{***r2   c                F    | j                   j                  |      | _         y )N)r   r   r   s     r-   r   z,_HttpConfigDirectAccessMixin.adapter_factory  s    kk++E+Br2   N)rT   r   )r   r   rT   r   )rU   rV   rW   r   r   r   r:   r2   r-   r   r     s0    + + C Cr2   r   c                     e Zd ZdZej
                  dd       Zdddd	 	 	 	 	 	 	 ddZdddd	 	 	 	 	 	 	 ddZdddd	 	 	 	 	 	 	 ddZ	dddddd		 	 	 	 	 	 	 dd
Z
ddddd	 	 	 	 	 	 	 ddZddddd	 	 	 	 	 	 	 ddZdddd	 	 	 	 	 	 	 ddZy)_RequestVerbsUsingSessionMixina  
    Mixin that provides HTTP methods (get, post, put, etc.) mirroring requests.Session, maintaining their default argument behavior (e.g., HEAD uses allow_redirects=False).
    These wrappers manage the SessionManager's use of pooled/non-pooled sessions and delegate the actual request to the corresponding session.<verb>() method.
    The subclass must implement use_session to yield a *requests.Session* instance.
    c                     y r\   r:   )r(   r;   ri   s      r-   use_sessionz*_RequestVerbsUsingSessionMixin.use_session  s    CFr2   N   headerstimeoutri   c               ~    | j                  ||      5 } |j                  |f||d|cd d d        S # 1 sw Y   y xY wN)r   r   )r   getr(   r;   r   r   ri   r*   r   s          r-   r   z"_RequestVerbsUsingSessionMixin.get  sI     c;/ 	P77;;sOGWOO	P 	P 	P   3<c               ~    | j                  ||      5 } |j                  |f||d|cd d d        S # 1 sw Y   y xY wr   )r   optionsr   s          r-   r   z&_RequestVerbsUsingSessionMixin.options"  sI     c;/ 	T7"7??3SSFS	T 	T 	Tr   c               ~    | j                  ||      5 } |j                  |f||d|cd d d        S # 1 sw Y   y xY wr   )r   headr   s          r-   r   z#_RequestVerbsUsingSessionMixin.head.  sI     c;/ 	Q77<<PWgPP	Q 	Q 	Qr   )r   r   ri   datajsonc          	         | j                  ||      5 } |j                  |f||||d|cd d d        S # 1 sw Y   y xY w)N)r   r   r   r   )r   post)	r(   r;   r   r   ri   r   r   r*   r   s	            r-   r   z#_RequestVerbsUsingSessionMixin.post:  sW     c;/ 	77<< 	 	 	s   5>)r   r   ri   r   c                   | j                  ||      5 } |j                  |f|||d|cd d d        S # 1 sw Y   y xY wN)r   r   r   )r   putr(   r;   r   r   ri   r   r*   r   s           r-   r   z"_RequestVerbsUsingSessionMixin.putO  sP     c;/ 	77;;$gDDJ	 	 	   4=c                   | j                  ||      5 } |j                  |f|||d|cd d d        S # 1 sw Y   y xY wr   )r   patchr   s           r-   r   z$_RequestVerbsUsingSessionMixin.patch^  sP     c;/ 	7 7==$gDDJ	 	 	r   c               ~    | j                  ||      5 } |j                  |f||d|cd d d        S # 1 sw Y   y xY wr   )r   deleter   s          r-   r   z%_RequestVerbsUsingSessionMixin.deletem  sI     c;/ 	S7!7>>#RwR6R	S 	S 	Sr   )r;   r   ri   rh   rT   r   )r;   r   r   Mapping[str, str] | Noner   zint | tuple[int, int] | Noneri   bool | None)r;   r   r   r   r   
int | Noneri   r   )rU   rV   rW   rX   r`   ra   r   r   r   r   r   r   r   r   r:   r2   r-   r   r     s    	F F -101#'
P
P *	
P
 .
P !
P  -1#'
T
T *	
T
 
T !
T  -1#'
Q
Q *	
Q
 
Q !
Q  -1#' *	
  !2 -1#' *	
  !& -1#' *	
  !& -1#'
S
S *	
S
 
S !
Sr2   r   c                  l   e Zd ZdZdddZedd       Zedd       Zej                  dd       Zedd       Z
edd       Zedd	       Zd d
Zddd!dZed"d       Zej$                  e	 d	 	 	 	 	 d#d              Z	 	 	 	 d$dZed%d       Zdddd	 	 	 	 	 	 	 	 	 	 	 	 	 d&dZd Z	 	 d'dZd Zd Zy)(r   a  
    Central HTTP session manager that handles all external requests from the Snowflake driver.

    **Purpose**: Replaces scattered HTTP methods (requests.request/post/get, PoolManager().request_encode,
    urllib3.HttpConnection().urlopen) with centralized configuration and optional connection pooling.

    **Two Operating Modes**:
    - use_pooling=False: One-shot sessions (create, use, close) - suitable for infrequent requests
    - use_pooling=True: Per-hostname session pools - reuses TCP connections, avoiding handshake
      and SSL/TLS negotiation overhead for repeated requests to the same host.

    **Key Benefits**:
    - Centralized HTTP configuration management and easy propagation across the codebase
    - Consistent proxy setup (SNOW-694457) and headers customization (SNOW-2043816)
    - HTTPAdapter customization for connection-level request manipulation
    - Performance optimization through connection reuse for high-traffic scenarios.

    **Usage**: Create the base session manager, then use clone() for derived managers to ensure
    proper config propagation. Pre-commit checks enforce usage to prevent code drift back to
    direct HTTP library calls.
    Nc                     | t         j                  d       t        di |}| _        t	        j
                   fd       _        y)z.
        Create a new SessionManager.
        Nz(Creating a config for the SessionManagerc                     t               S r\   r   r   s   r-   <lambda>z)SessionManager.__init__.<locals>.<lambda>  s    K% r2   r:   )rD   rE   r   _cfgcollectionsdefaultdict_sessions_map)r(   r   http_config_kwargss   `  r-   r   zSessionManager.__init__  sB    
 >LLCD5"45F &	<G<S<S%=
r2   c                <    |r |j                   di |} | |      S )zBuild a new manager from *cfg*, optionally overriding fields.

        Example::

            no_pool_cfg = conn._http_config.copy_with(use_pooling=False)
            manager = SessionManager.from_config(no_pool_cfg)
        )r   r:   )rs   )clscfgrr   s      r-   from_configzSessionManager.from_config  s$     #--,),C#r2   c                    | j                   S r\   r   r   s    r-   r   zSessionManager.config  s    yyr2   c                    || _         y r\   r   )r(   r   s     r-   r   zSessionManager.config  s	    	r2   c                    t        | j                  j                  | j                  j                  | j                  j                  | j                  j
                        S r\   )r   r   rl   rm   rn   ro   r   s    r-   rO   zSessionManager.proxy_url  sC    II  II  II  II$$	
 	
r2   c                    | j                   S r\   )r   r   s    r-   sessions_mapzSessionManager.sessions_map  s    !!!r2   c                h   | j                  |      }	 |j                  S # t        $ r}d| d| }t        j	                  |       t        |t              s7t        j                  d|j                  j                          t        |      t        j                  d       t        |      d }~ww xY w)Nz,Unable to get pool manager from session for z: z/Adapter was expected to be an HTTPAdapter, got ziAdapter was expected an HTTPAdapter but didn't have attribute 'poolmanager'. This is unexpected behavior.)r   rH   AttributeErrorrD   errorrA   r   warning	__class__rU   rE   r=   )r   r;   adapter_for_urlno_pool_manager_errorerror_messages        r-   get_session_pool_managerz'SessionManager.get_session_pool_manager  s    '.':':3'?	,"... 	,J3%rRgQhiMLL'o{;EoF_F_FhFhEij ]++  ]++	,s    	B1BB,,B1c                    	 | j                   j                         }|%|j                  d|       |j                  d|       y y # t        t        f$ r }t
        j                  d|       Y d }~y d }~ww xY w)Nzhttp://zhttps://zFNo adapter factory found. Using session without adapter. Exception: %s)r   r   mount	TypeErrorr  rD   r   )r(   r   adapterno_adapter_factory_exceptions       r-   _mount_adapterszSessionManager._mount_adapters  sn    	ii++-G"i1j'2 # >* 	KKX, 	s   A A A3A..A3r   c               P    t        j                         }| j                  |       |S r\   )r   r   r  r   s      r-   r   zSessionManager.make_session  s#    ""$W%r2   c                H    t        | t              r| j                  d      S | S )zCNormalize URL to string format (handles bytes from storage client).zutf-8)rA   bytesdecoder   s    r-   _normalize_urlzSessionManager._normalize_url  s!     '1e&<szz'"E#Er2   c              #    K   | j                  |      }||n| j                  }|s(| j                  |      }	 | |j                          y| j	                  |      E d{    y# |j                          w xY w7 w)zYield a session for the given URL (used for proxy handling and pooling).
        The 'url' is an obligatory parameter due to the need for correct proxy handling (i.e. bypassing caused by no_proxy settings).
        Nr   )r  ri   r   r   _yield_session_from_pool)r(   r;   ri   url_strr   s        r-   r   zSessionManager.use_session  sw      %%c*%0%<k$BRBR''G'4G 44W=== =s'   6A?A( %A?"A=#A?(A::A?c              #     K   | j                  |      }| j                  |   }|j                  |      }	 | |j                  |       y # |j                  |       w xY ww)Nr   )_get_pooling_key_from_urlr   r   r   )r(   r;   hostnamepoolr   s        r-   r  z'SessionManager._yield_session_from_pool  sa      11#6!!(+""s"+	)M(D(s   3A"A A"AA"c                <    | rt        |       j                  }|S d}|S )z
        Derive the session pooling key (hostname) from a URL.

        :param url: Absolute URL the session will be used for.
        :return: Hostname string or None if URL is missing/invalid.
        N)r   r  )r;   r  s     r-   r  z(SessionManager._get_pooling_key_from_url
  s&     .18C=)) 7;r2   r   r   c          	         | j                  ||      5 } |j                  d|j                         |||d|cddd       S # 1 sw Y   yxY w)u   Make a single HTTP request handled by this *SessionManager*.

        This wraps :pymeth:`use_session` so callers don’t have to manage the
        context manager themselves.
        )methodr;   r   r   Nr:   )r   r6   upper)r(   r  r;   r   r   ri   r*   r   s           r-   r6   zSessionManager.request  sZ     c;/ 	7"7?? ||~	
 	 	 	s   %AAc                b    | j                   j                         D ]  }|j                           y r\   )r   valuesr   )r(   r  s     r-   r   zSessionManager.close-  s)    &&--/ 	DJJL	r2   c                <     | j                   | j                  fi |S )u  Return a new *stateless* SessionManager sharing this instance’s config.

        "Shallow clone" - the configuration object (HttpConfig) is reused as-is,
        while *stateful* aspects such as the per-host SessionPool mapping are
        reset, so the two managers do not share live `requests.Session`
        objects.
        Optional kwargs (e.g. *use_pooling* / *adapter_factory* / max_retries etc.) - overrides to create a modified
        copy of the HttpConfig before instantiation.
        )r   r   )r(   http_config_overridess     r-   clonezSessionManager.clone1  s!      t		C-BCCr2   c                    | j                   j                         }t        |j                  d      j	                               |d<   |S )Nr   _sessions_map_items)__dict__copylistr   rv   )r(   states     r-   __getstate__zSessionManager.__getstate__@  s=    ""$ (,EIIo,F,L,L,N'O#$r2   c                     |j                  dg       } j                  j                  |       t        j                   fd       _        |D ]  \  }}| j
                  |<    y )Nr%  c                     t               S r\   r   r   s   r-   r   z-SessionManager.__setstate__.<locals>.<lambda>K  s    [=N r2   )r   r&  r   r   r   r   )r(   r)  sessions_itemsr?   r  s   `    r-   __setstate__zSessionManager.__setstate__G  s]    #8"=U#(445NO( 	,JD$'+Dt$	,r2   r\   )r   HttpConfig | NonerT   r   )r   r   rr   r
   rT   r   r   )r   r   rT   r   r   )rT   zdict[str, SessionPool])r   r   r;   r   rT   zPoolManager | None)r   zrequests.SessionrT   r   r;   rk   rT   r   )r;   str | bytes | NonerT   r   )r;   r1  ri   r   rT   zGenerator[Session, Any, None])r;   rk   rT   zGenerator[SessionT, Any, None])r;   r   rT   rk   )r  r   r;   r   r   r   r   r   ri   r   r*   r
   rT   r   )rT   r   )rU   rV   rW   rX   r   classmethodr   r   r   r   rO   r   staticmethodr  r  r   r  
contextlibcontextmanagerr1   r   r  r  r6   r   r#  r*  r.  r:   r2   r-   r   r   z  s   ,
     ]]  
 
 " " , ," 15 
 F F 'BF>%>4?>	&> ( >"	)	)	'	)   -1#' 
 *  !  
0D 
D,r2   r   r   )r   r   session_managerri   c          	     L    |t        d       |j                  d| ||||d|S )uK   
    Convenience wrapper – requires an explicit ``session_manager``.
    zBsession_manager is required - no default session manager available)r  r;   r   r   ri   r:   )r=   r6   )r  r;   r   r   r6  ri   r*   s          r-   r6   r6   P  sO     P
 	
 #?""   r2   c                      e Zd ZddddZy)ProxySessionManagerNr   c               ,   t        j                         }| j                  |       t        || j                  j
                        rd| j                  j
                  in-| j                  | j                  | j                  j
                  d}||_        |S )N)rp   rp   )r7   httpsrp   )	r   r   r  r   r   rp   r   rO   rJ   )r(   r;   r   rJ   s       r-   r   z ProxySessionManager.make_sessionm  s    ""$W%
 %S4;;3G3GH DII..
  KK00 	 "r2   r0  )rU   rV   rW   r   r:   r2   r-   r9  r9  l  s
    04 r2   r9  c                  (    e Zd Ze	 d	 	 	 dd       Zy)SessionManagerFactoryNc                f    | xr | j                   d uxs d|v }|rt        | fi |S t        | fi |S )NrJ   )rl   r9  r   )r   r   has_param_proxiess      r-   get_managerz!SessionManagerFactory.get_manager  sQ    
 4v((4-,, 	 &vD1CDD!&?,>??r2   r\   )r   r/  rT   r   )rU   rV   rW   r3  r@  r:   r2   r-   r=  r=    s+    $(	@!	@		@ 	@r2   r=  )r  r   r;   r   r   r   r   r   r6  zSessionManager | Noneri   r   r*   r
   rT   r   )G
__future__r   r`   r   r4  r/   r   loggingdataclassesr   r   r   r   r   typingr	   r
   r   r   r   r   r   compatr   rL   r   url_utilr   vendoredr   vendored.requestsr   r   vendored.requests.adaptersr   r   vendored.requests.exceptionsr   vendored.requests.utilsr   r   vendored.urllib3r   r   vendored.urllib3.poolmanagerr   vendored.urllib3.util.urlr   vendored.urllib3.connectionpoolr    r!   	getLoggerrU   rD   r}   r"   r1   r4   ABCrZ   rc   rg   r   r   r   r   r   r   r6   r9  r=  r:   r2   r-   <module>rR     s   " 
      A A U U U    +  0 @ 9 K 0 6 0X			8	$ ::3+ 3l$SWW $4 4
 $P P P* $G G G06$'(# 6$r?377 ?4C#? CkSSWW kS\S,35Q S,t )--1#	 &	
  +   8. &@ @r2   