o
    sDi
L                     @  sX  d Z 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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mZmZmZ ddlmZ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# e!e"fZ$e	rvddl%m&Z& ddl'm(Z( zddl)m*Z*m+Z+m,Z,m)Z) dJddZ-W n e.y   dJddZ-Y nw dZ/dZ0dZ1ej2dkrzddl3Z4W n e.y   ddl4Z4Y nw dd Z5z%e46e4j7dZ8e5e8ddZ9e5e8dd Z:W d   n1 sw   Y  W n e;y   dZ9d Z:Y nw d!d" Z<n
dKd(d)Z=dLd*d"Z<		dMdNd4d5Z>G d6d7 d7Z?dOd;d<Z@dPd>d?ZAdQdAdBZBdOdCdDZCdPdEdFZDdRdHdIZEdS )Sz)Pool utilities and shared helper methods.    )annotationsN)TYPE_CHECKINGAnyNoReturnOptionalUnion)_csot)_getaddrinfo)AutoReconnectConnectionFailureNetworkTimeout_CertificateError)_get_timeout_detailsformat_timeout_details)AsyncNetworkingInterfaceNetworkingInterfacePyMongoProtocol)PoolOptions)
PYSSLErrorSSLError_has_sni)_sslConn)_Address)F_GETFDF_SETFD
FD_CLOEXECfcntlfdintreturnNonec                 C  s   t | t}t | t|tB  dS )z8Set the close-on-exec flag on the given file descriptor.N)r   r   r   r   )r   flags r"   Q/home/alumno/antzosa8961/venv/lib/python3.10/site-packages/pymongo/pool_shared.py_set_non_inheritable_non_atomic4   s   
r$   c                 C  s   dS )z6Dummy function for platforms that don't provide fcntl.Nr"   )r   r"   r"   r#   r$   =   s    x   
   	   win32c              	   C  s6   zt | |\}}t|W S  ttfy   | Y S w N)winregQueryValueExr   OSError
ValueError)keynamedefaultvalue_r"   r"   r#   _queryK   s   
r3   z2SYSTEM\CurrentControlSet\Services\Tcpip\ParametersKeepAliveTimei m KeepAliveInterval  c                 C  sH   t ttd }t ttd }|tk s|tk r"| tjd||f d S d S )Nr6      )min_WINDOWS_TCP_IDLE_MS_MAX_TCP_KEEPIDLE_WINDOWS_TCP_INTERVAL_MS_MAX_TCP_KEEPINTVLioctlsocketSIO_KEEPALIVE_VALS)sockidle_msinterval_msr"   r"   r#   _set_keepalive_timesa   s
   rC   r@   socket.socket
tcp_optionstr	max_valuec                 C  s`   t t|r.tt|}z| tj|}||kr!| tj|| W d S W d S  ty-   Y d S w d S r)   )hasattrr>   getattr
getsockoptIPPROTO_TCP
setsockoptr,   )r@   rE   rG   sockoptr0   r"   r"   r#   _set_tcp_optioni   s   

rN   c                 C  s(   t | dt t | dt t | dt d S )NTCP_KEEPIDLETCP_KEEPINTVLTCP_KEEPCNT)rN   r:   r<   _MAX_TCP_KEEPCNTr@   r"   r"   r#   rC   v   s   addressr   error	Exception
msg_prefixOptional[str]timeout_detailsOptional[dict[str, float]]r   c                 C  s   | \}}|durd|||f }n| d| }|r|| }d|vr'|t |7 }t|tjs8t|tr=dt|v r=t||t||)z9Convert a socket.error to ConnectionFailure and raise it.Nz	%s:%d: %sz: zconfigured timeouts	timed out)r   
isinstancer>   timeout	SSLErrorsrF   r   r
   )rT   rU   rW   rY   hostportmsgr"   r"   r#   _raise_connection_failure|   s   


rb   c                   @  s.   e Zd ZdddZdddZeddd	Zd
S )_CancellationContextr   r    c                 C  s
   d| _ d S )NF
_cancelledselfr"   r"   r#   __init__   s   
z_CancellationContext.__init__c                 C  s
   d| _ dS )zCancel this context.TNrd   rf   r"   r"   r#   cancel   s   
z_CancellationContext.cancelboolc                 C  s   | j S )zWas cancel called?rd   rf   r"   r"   r#   	cancelled   s   z_CancellationContext.cancelledN)r   r    )r   rj   )__name__
__module____qualname__rh   ri   propertyrk   r"   r"   r"   r#   rc      s
    

rc   r   optionsr   c                   s,  | \}}| dr?ttdstdttj}t|  z|d t	 
||I dH  |W S  ty>   |   w tj}tjrL|dkrLtj}d}t|||tjdI dH D ]}|\}}	}
}}zt||	ttdd	B |
}W n ty   t||	|
}Y nw t|  zJ|tjtjd
 t }|du r|j}n	|d	krtd|tjtjd t| |d tjt	 
|||dI dH  || |W   S  tjy } z|  td}||_ W Y d}~qZd}~w ty
 } z|  |}W Y d}~qZd}~ww |dur|td)Given (host, port) and PoolOptions, connect and return a raw socket object.

    Can raise socket.error.

    This is a modified version of create_connection from CPython >= 2.7.
    .sockAF_UNIX-UNIX-sockets are not supported on this systemFN	localhostfamilytypeSOCK_CLOEXECr   r7   r[   Tr]   getaddrinfo failed)!endswithrH   r>   r   rs   r$   filenosetblockingasyncioget_running_loopsock_connectr,   closeAF_INEThas_ipv6	AF_UNSPECr	   SOCK_STREAMrI   rL   rK   TCP_NODELAYr   	remainingconnect_timeoutr]   
SOL_SOCKETSO_KEEPALIVErC   wait_for
settimeoutTimeoutError	__cause__rT   rp   r_   r`   r@   rw   errresafsocktypeprotodummysar]   er"   r"   r#   _async_create_connection   sn   








r   Union[socket.socket, _sslConn]c           	   
     sB  t | |I dH }|j}|du r||j |S | d }z*tdr6t }|dtj	|j
||dI dH }nt }|d|j
|I dH }W n1 tyR   |    tgtR yw } z|  t|}t| |d|d W Y d}~nd}~ww |jr|js|jsztj| |d W n ty   |   w ||j |S )Given (host, port) and PoolOptions, return a raw configured socket.

    Can raise socket.error, ConnectionFailure, or _CertificateError.

    Sets socket's SSL and timeout options.
    Nr   Fserver_hostnameSSL handshake failed: rY   hostname)r   _ssl_contextr   socket_timeoutr   r   r   run_in_executor	functoolspartialwrap_socketr   r   r,   r^   r   rb   verify_modecheck_hostnametls_allow_invalid_hostnamessslmatch_hostnamegetpeercert)	rT   rp   r@   ssl_contextr_   loopssl_sockexcdetailsr"   r"   r#   _async_configured_socket   sP   	r   r   c           	   
     s"  t | |I dH }|j}|j |du r%tt j fdd|dI dH S | d }zt j fdd|||dI dH \}}W n) tyG     tgt	R yh } zt
|}t| |d|d	 W Y d}~nd}~ww |jr|js|jsztj|d
|d W n ty   |   w t||fS )zGiven (host, port) and PoolOptions, return a configured AsyncNetworkingInterface.

    Can raise socket.error, ConnectionFailure, or _CertificateError.

    Sets protocol's SSL and timeout options.
    Nc                     
   t  dS Nrz   r   r"   rz   r"   r#   <lambda><     
 z0_configured_protocol_interface.<locals>.<lambda>rS   r   c                     r   r   r   r"   rz   r"   r#   r   E  r   )r@   r   r   r   r   peercertr   )r   r   r   r   r   r   create_connectionr   r,   r^   r   rb   r   r   r   r   r   get_extra_infoabort)	rT   rp   r@   r   r_   	transportprotocolr   r   r"   rz   r#   _configured_protocol_interface,  sL   	

r   c                 C  s  | \}}| dr3ttdstdttj}t|  z|| |W S  ty2   |	   w tj
}tjr@|dkr@tj}d}tj|||tjdD ]}|\}}	}
}}zt||	ttddB |
}W n tyt   t||	|
}Y nw t|  z:|tjtjd	 t }|du r|j}n	|dkrtd
|| |tjtjd t| || |W   S  ty } z|}|	  W Y d}~qLd}~ww |dur|td)rq   rr   rs   rt   ru   Nrv   ry   r   r7   r[   Tr{   )r|   rH   r>   r   rs   r$   r}   connectr,   r   r   r   r   getaddrinfor   rI   rL   rK   r   r   r   r   r]   r   r   r   rC   r   r"   r"   r#   _create_connectionb  sZ   






r   c              
   C  s  t | |}|j}|du r||j |S | d }ztdr%|j||d}n||}W n1 ty7   |    tgt	R y\ } z|  t
|}t| |d|d W Y d}~nd}~ww |jr~|js~|js~ztj| |d W n ty}   |   w ||j |S )r   Nr   Tr   r   r   r   )r   r   r   r   r   r   r   r   r,   r^   r   rb   r   r   r   r   r   r   rT   rp   r@   r   r_   r   r   r   r"   r"   r#   _configured_socket  sD   

r   r   c              
   C  s  t | |}|j}|du r||j t|S | d }ztdr'|j||d}n||}W n1 ty9   |    t	gt
R y^ } z|  t|}t| |d|d W Y d}~nd}~ww |jr|js|jsztj| |d W n ty   |   w ||j t|S )zGiven (host, port) and PoolOptions, return a NetworkingInterface wrapping a configured socket.

    Can raise socket.error, ConnectionFailure, or _CertificateError.

    Sets socket's SSL and timeout options.
    Nr   Tr   r   r   r   )r   r   r   r   r   r   r   r   r   r,   r^   r   rb   r   r   r   r   r   r   r   r"   r"   r#   _configured_socket_interface  sD   

r   )r   r   r   r    )r@   rD   rE   rF   rG   r   r   r    )r@   rD   r   r    )NN)
rT   r   rU   rV   rW   rX   rY   rZ   r   r   )rT   r   rp   r   r   rD   )rT   r   rp   r   r   r   )rT   r   rp   r   r   r   )rT   r   rp   r   r   r   )F__doc__
__future__r   r   r   r>   r   systypingr   r   r   r   r   pymongor   pymongo.asynchronous.helpersr	   pymongo.errorsr
   r   r   r   pymongo.helpers_sharedr   r   pymongo.network_layerr   r   r   pymongo.pool_optionsr   pymongo.ssl_supportr   r   r   r^   pymongo.pyopenssl_contextr   pymongo.typingsr   r   r   r   r   r$   ImportErrorr:   r<   rR   platform_winregr*   r3   OpenKeyHKEY_LOCAL_MACHINEr.   r9   r;   r,   rC   rN   rb   rc   r   r   r   r   r   r   r"   r"   r"   r#   <module>   sz   




	

O
8
6
F1