o
    'hO                     @  s\  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mZ dd	lmZ dd
lmZmZm Z  eefZ!e	rnddl"m#Z# ddl$m%Z% zddl&m'Z'm(Z(m)Z)m&Z& dOddZ*W n e+y   dOddZ*Y nw dZ,dZ-dZ.ej/dkrzddl0Z1W n e+y   ddl1Z1Y nw dd Z2z%e13e1j4dZ5e2e5ddZ6e2e5ddZ7W d   n1 sw   Y  W n e8y   dZ6dZ7Y nw d d! Z9n
dPd'd(Z:dQd)d!Z9		dRdSd3d4Z;dTd8d9Z<dUd;d<Z=G d=d> d>Z>dVd@dAZ?dWdCdDZ@dXdFdGZAdVdHdIZBdWdJdKZCdYdMdNZDdS )Zz)Pool utilities and shared helper methods.    )annotationsN)TYPE_CHECKINGAnyNoReturnOptionalUnion)_csot)_getaddrinfo)AutoReconnectConnectionFailureNetworkTimeout_CertificateError)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    O/var/www/html/olx_land/venv/lib/python3.10/site-packages/pymongo/pool_shared.py_set_non_inheritable_non_atomic3   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!   _queryJ   s   
r1   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 )Nr4      )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_times`   s
   rA   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>   rC   rE   sockoptr.   r    r    r!   _set_tcp_optionh   s   

rL   c                 C  s(   t | dt t | dt t | dt d S )NTCP_KEEPIDLETCP_KEEPINTVLTCP_KEEPCNT)rL   r8   r:   _MAX_TCP_KEEPCNTr>   r    r    r!   rA   u   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r2t||t|trBdt|v rBt||t||)z9Convert a socket.error to ConnectionFailure and raise it.Nz	%s:%d: %s: zconfigured timeouts	timed out)format_timeout_details
isinstancer<   timeoutr   	SSLErrorsrD   r
   )rR   rS   rU   rW   hostportmsgr    r    r!   _raise_connection_failure{   s   


rb   optionsr   dict[str, float]c                 C  sP   i }t  }| j}| j}|r|d |d< |r|s|d |d< |r&|d |d< |S )Nr4   	timeoutMSsocketTimeoutMSconnectTimeoutMS)r   get_timeoutsocket_timeoutconnect_timeout)rc   detailsr]   ri   rj   r    r    r!   _get_timeout_details   s   rl   rk   c                 C  sT   d}| r(|d7 }dD ]}|| v r|d| d| |  d7 }q
|d d }|d7 }|S )	N z (configured timeouts:)rf   re   rg    rY   zms,)r    )rk   resultr]   r    r    r!   r[      s   r[   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.TNrs   ru   r    r    r!   cancel   s   
z_CancellationContext.cancelboolc                 C  s   | j S )zWas cancel called?rs   ru   r    r    r!   	cancelled   s   z_CancellationContext.cancelledN)r   r   )r   ry   )__name__
__module____qualname__rw   rx   propertyrz   r    r    r    r!   rr      s
    

rr   r   c                   s  | \}}| dr4ttdstdttj}t|  z|| |W S  ty3   |	   w tj
}tjrA|dkrAtj}d}t|||tjdI dH D ]}|\}}	}
}}zt||	ttddB |
}W n tyw   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}~qOd}~ww |dur|tdzGiven (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.
    z.sockAF_UNIXz-UNIX-sockets are not supported on this system	localhostN)familytypeSOCK_CLOEXECr   r5   rZ   Tzgetaddrinfo failed)endswithrF   r<   r   r   r"   filenoconnectr*   closeAF_INEThas_ipv6	AF_UNSPECr	   SOCK_STREAMrG   rJ   rI   TCP_NODELAYr   	remainingrj   r]   
settimeout
SOL_SOCKETSO_KEEPALIVErA   rR   rc   r_   r`   r>   r   errresafsocktypeprotodummysar]   er    r    r!   _async_create_connection   s\   






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: rW   hostname)r   _ssl_contextr   ri   r   asyncioget_running_looprun_in_executor	functoolspartialwrap_socketr   r   r*   r^   rl   rb   verify_modecheck_hostnametls_allow_invalid_hostnamessslmatch_hostnamegetpeercert)	rR   rc   r>   ssl_contextr_   loopssl_sockexcrk   r    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 Nr]   r   r    r   r    r!   <lambda>O     
 z0_configured_protocol_interface.<locals>.<lambda>rQ   r   c                     r   r   r   r    r   r    r!   r   X  r   )r>   r   r   r   r   peercertr   )r   r   ri   r   r   r   create_connectionr   r*   r^   rl   rb   r   r   r   r   r   get_extra_infoabort)	rR   rc   r>   r   r_   	transportprotocolr   rk   r    r   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r   )r   rF   r<   r   r   r"   r   r   r*   r   r   r   r   getaddrinfor   rG   rJ   rI   r   r   r   rj   r]   r   r   r   rA   r   r    r    r!   _create_connectionu  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   ri   r   r   r   r   r*   r^   rl   rb   r   r   r   r   r   r   rR   rc   r>   r   r_   r   r   rk   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   ri   r   r   r   r   r   r*   r^   rl   rb   r   r   r   r   r   r   r   r    r    r!   _configured_socket_interface  sD   

r   )r   r   r   r   )r>   rB   rC   rD   rE   r   r   r   )r>   rB   r   r   )NN)
rR   r   rS   rT   rU   rV   rW   rX   r   r   )rc   r   r   rd   )rk   rX   r   rD   )rR   r   rc   r   r   rB   )rR   r   rc   r   r   r   )rR   r   rc   r   r   r   )rR   r   rc   r   r   r   )E__doc__
__future__r   r   r   r<   r   systypingr   r   r   r   r   pymongor   pymongo.asynchronous.helpersr	   pymongo.errorsr
   r   r   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"   ImportErrorr8   r:   rP   platform_winregr(   r1   OpenKeyHKEY_LOCAL_MACHINEr,   r7   r9   r*   rA   rL   rb   rl   r[   rr   r   r   r   r   r   r   r    r    r    r!   <module>   s|   




	



G
8
6
G1