
    _iO                       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	rddl%m&Z& ddl'm(Z( 	 ddl)m*Z*m+Z+m,Z,m)Z) d?dZ-n# e.$ r d?dZ-Y nw xY wdZ/dZ0dZ1ej2        dk    ru	 ddl3Z4n# e.$ r ddl4Z4Y nw xY wd Z5	  e4j6        e4j7        d          5 Z8 e5e8dd          Z9 e5e8dd          Z:ddd           n# 1 swxY w Y   n# e;$ r dZ9dZ:Y nw xY wd Z<nd@d%Z=dAd&Z<	 	 dBdCd0Z> G d1 d2          Z?dDd6Z@dEd8ZAdFd:ZBdDd;ZCdEd<ZDdGd>ZEdS )Hz)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                l    t          | t                    }t          | t          |t          z             dS )z8Set the close-on-exec flag on the given file descriptor.N)r   r   r   r   )r   flagss     6D:\Nbitz\venv\Lib\site-packages\pymongo/pool_shared.py_set_non_inheritable_non_atomicr%   4   s.    b'""b'5:-.....    c                    dS )z6Dummy function for platforms that don't provide fcntl.N )r   s    r$   r%   r%   =   s      r&   x   
   	   win32c                    	 t          j        | |          \  }}t          |          S # t          t          f$ r |cY S w xY wN)winregQueryValueExr   OSError
ValueError)keynamedefaultvalue_s        r$   _queryr8   K   sT    	*355HE1u::$ 	 	 	 NNN	s   &) ??z2SYSTEM\CurrentControlSet\Services\Tcpip\ParametersKeepAliveTimei m KeepAliveInterval  c                    t          t          t          dz            }t          t          t          dz            }|t          k     s|t          k     r%|                     t          j        d||f           d S d S )Nr;      )min_WINDOWS_TCP_IDLE_MS_MAX_TCP_KEEPIDLE_WINDOWS_TCP_INTERVAL_MS_MAX_TCP_KEEPINTVLioctlsocketSIO_KEEPALIVE_VALS)sockidle_msinterval_mss      r$   _set_keepalive_timesrI   a   sr    *,=,DEE24F4MNN)))[;S-S-SJJv01g{2KLLLLL .T-Sr&   rF   socket.socket
tcp_optionstr	max_valuec                   t          t          |          rrt          t          |          }	 |                     t          j        |          }||k    r#|                     t          j        ||           d S d S # t          $ r Y d S w xY wd S r.   )hasattrrD   getattr
getsockoptIPPROTO_TCP
setsockoptr1   )rF   rK   rM   sockoptr5   s        r$   _set_tcp_optionrU   i   s    6:&& 
	fj11G //&*<gFFY&&OOF$6KKKKK '&   
	 
	s   AA7 7
BBc                    t          | dt                     t          | dt                     t          | dt                     d S )NTCP_KEEPIDLETCP_KEEPINTVLTCP_KEEPCNT)rU   r@   rB   _MAX_TCP_KEEPCNTrF   s    r$   rI   rI   v   sA    n.?@@@o/ABBBm-=>>>>>r&   addressr   error	Exception
msg_prefixOptional[str]timeout_detailsOptional[dict[str, float]]r   c                J   | \  }}|	d|||fz  }n| d| }|r||z   }d|vr|t          |          z  }t          |t          j                  rt	          |          |t          |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   
isinstancerD   timeoutr   	SSLErrorsrL   r   )r\   r]   r_   ra   hostportmsgs          r$   _raise_connection_failurerk   |   s     JD$T4//     3C''%o666%(( 	,S!!u,	E9	%	% ,+U*C*C
 S!!u,C  e+r&   c                  6    e Zd ZddZddZed	d            ZdS )
_CancellationContextr    r!   c                    d| _         d S )NF
_cancelledselfs    r$   __init__z_CancellationContext.__init__   s    r&   c                    d| _         dS )zCancel this context.TNro   rq   s    r$   cancelz_CancellationContext.cancel   s    r&   boolc                    | j         S )zWas cancel called?ro   rq   s    r$   	cancelledz_CancellationContext.cancelled   s     r&   N)r    r!   )r    rv   )__name__
__module____qualname__rs   ru   propertyrx   r(   r&   r$   rm   rm      s\                      X  r&   rm   r   optionsr   c           
       K   | \  }}|                     d          rt          t          d          st          d          t          j        t          j                  }t          |                                           	 |                    d           t          j	                    
                    ||           d{V  |S # t          $ r |                                  w xY wt          j        }t          j        r|dk    rt          j        }d}t!          |||t          j                   d{V D ] }|\  }}	}
}}	 t          j        ||	t%          t          dd	          z  |
          }n&# t          $ r t          j        ||	|
          }Y nw xY wt          |                                           	 |                    t          j        t          j        d
           t-          j                    }||j        }n|d	k    rt          j        d          |                    t          j        t          j        d           t9          |           |                    d           t          j        t          j	                    
                    ||          |           d{V  |                    |           |c S # t          j        $ r:}|                                 t          j        d          }||_         Y d}~d}~wt          $ r!}|                                 |}Y d}~d}~ww xY w||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   r=   rd   Trf   getaddrinfo failed)!endswithrO   rD   r   r   r%   filenosetblockingasyncioget_running_loopsock_connectr1   closeAF_INEThas_ipv6	AF_UNSPECr
   SOCK_STREAMrP   rS   rR   TCP_NODELAYr	   	remainingconnect_timeoutrf   
SOL_SOCKETSO_KEEPALIVErI   wait_for
settimeoutTimeoutError	__cause__r\   r}   rh   ri   rF   r   errresafsocktypeprotodummysarf   es                  r$   _async_create_connectionr      sw      JD$ }}W vy)) 	U#$STTT}V^,,'666	U###*,,99$EEEEEEEEEK 	 	 	JJLLL	 ^F "4;..!
C!$V&BTUUUUUUUUU $ $),&HeUB	6=XPQ0R0R%RTYZZDD 	6 	6 	6 =Xu55DDD	6
 	(666	OOF.0BAFFFo''G!1An[111OOF-v/BDIII &&&U###"(**77bAA7          OOG$$$KKK# 	 	 	JJLLL.--CCMMMMMM 	 	 	JJLLLCCCCCC	 	 *+++sD   AC  C%-E11 FF9DKL6/LL6L11L6Union[socket.socket, _sslConn]c                  K   t          | |           d{V }|j        }||                    |j                   |S | d         }	 t	          d          rJt          j                    }|                    dt          j	        |j
        ||                     d{V }n5t          j                    }|                    d|j
        |           d{V }nt# t          $ r |                                  t          gt          R $ r@}|                                 t          |          }t!          | |d|           Y d}~nd}~ww xY w|j        r[|j        sT|j        sM	 t)          j        |                                |           n## t          $ r |                                  w x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: ra   hostname)r   _ssl_contextr   socket_timeoutr   r   r   run_in_executor	functoolspartialwrap_socketr   r   r1   rg   r   rk   verify_modecheck_hostnametls_allow_invalid_hostnamessslmatch_hostnamegetpeercert)	r\   r}   rF   ssl_contextrh   loopssl_sockexcdetailss	            r$   _async_configured_socketr      s?      *'7;;;;;;;;D&K.///1:Dc E?? 	W+--D!11!+"94QUVVV       HH
 +--D!11$8OQUVVVVVVVVH   

 	 i   c c c

 'w//!'30HZabbbbbbbbbc 		*	 3	
	x3355EEEEE  	 	 	NN	 .///Os%   BC 1E6EE (F	 	 F)r   c                  	K   t          | |           d{V }|j        }|j        	|>t          t	          j                                        	fd|           d{V           S | d         }	 t	          j                                        	fd|||           d{V \  }}nL# t          $ r  t          gt          R $ r,}t          |          }t          | |d|           Y d}~nd}~ww xY w|j        r\|j        sU|j        sN	 t          j        |                    d	          |
           n## t          $ r |                                  w x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                     S Nr   r   r   s   r$   <lambda>z0_configured_protocol_interface.<locals>.<lambda>?  s    888 r&   r[   r   c                 $    t                     S r   r   r   s   r$   r   z0_configured_protocol_interface.<locals>.<lambda>H  s    OG444 r&   )rF   r   r   r   r   peercertr   )r   r   r   r   r   r   create_connectionr   r1   rg   r   rk   r   r   r   r   r   get_extra_infoabort)
r\   r}   rF   r   rh   	transportprotocolr   r   rf   s
            @r$   _configured_protocol_interfacer   /  s"      *'7;;;;;;;;D&K$G'*,,>>8888t ?        
 
 	
 1:Dc %,$<$>$>$P$P4444 	 %Q %
 %
 
 
 
 
 
 
	88     	 i   c c c 'w//!'30HZabbbbbbbbbc 		*	 3	
	y77
CCdSSSSS  	 	 	OO	 $Y$9:::s$   16B( (C1"C,,C1
)D4 4 Ec           
     (   | \  }}|                     d          rt          t          d          st          d          t          j        t          j                  }t          |                                           	 |                    |           |S # t          $ r |	                                  w xY wt          j
        }t          j        r|dk    rt          j        }d}t          j        |||t          j                  D ]x}|\  }}	}
}}	 t          j        ||	t          t          dd          z  |
          }n&# t          $ r t          j        ||	|
          }Y nw xY wt          |                                           	 |                    t          j        t          j        d	           t'          j                    }||j        }n|dk    rt          j        d
          |                    |           |                    t          j        t          j        d           t5          |           |                    |           |c S # t          $ r!}|}|	                                 Y d}~rd}~ww xY w||t          d          )r   r   r   r   r   Nr   r   r   r=   rd   Tr   )r   rO   rD   r   r   r%   r   connectr1   r   r   r   r   getaddrinfor   rP   rS   rR   r   r	   r   r   rf   r   r   r   rI   r   s                  r$   _create_connectionr   e  s    JD$ }}W vy)) 	U#$STTT}V^,,'666	LLK 	 	 	JJLLL	 ^F "4;..!
C!$V&BTUUU  ),&HeUB	6=XPQ0R0R%RTYZZDD 	6 	6 	6 =Xu55DDD	6
 	(666	OOF.0BAFFFo''G!1An[111OOG$$$OOF-v/BDIII &&&LLKKK 	 	 	CJJLLLLLLLL	 	 *+++s7   ?B  B6-E E$#E$	CI
I>I99I>c                   t          | |          }|j        }||                    |j                   |S | d         }	 t	          d          r|                    ||          }n|                    |          }nt# t          $ r |                                  t          gt          R $ r@}|                                 t          |          }t          | |d|           Y d}~nd}~ww xY w|j        r[|j        sT|j        sM	 t          j        |                                |           n## t          $ r |                                  w xY w|                    |j                   |S )r   Nr   Tr   r   r   r   )r   r   r   r   r   r   r   r   r1   rg   r   rk   r   r   r   r   r   r   r\   r}   rF   r   rh   r   r   r   s           r$   _configured_socketr     s    gw//D&K.///1:Dc D>> 	5"..tT.JJHH"..t44H   

 	 i   c c c

 'w//!'30HZabbbbbbbbbc 		*	 3	
	x3355EEEEE  	 	 	NN	 .///Os#   <A< <1C--6C((C-(D/ / Er   c                   t          | |          }|j        }|)|                    |j                   t	          |          S | d         }	 t          d          r|                    ||          }n|                    |          }nt# t          $ r |                                  t          gt          R $ r@}|                                 t          |          }t          | |d|           Y d}~nd}~ww xY w|j        r[|j        sT|j        sM	 t!          j        |                                |           n## t          $ r |                                  w x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   r1   rg   r   rk   r   r   r   r   r   r   r   s           r$   _configured_socket_interfacer     s    gw//D&K.///"4(((1:Dc D>> 	5"..tT.JJHH"..t44H   

 	 i   c c c

 'w//!'30HZabbbbbbbbbc 		*	 3	
	x3355EEEEE  	 	 	NN	 .///x(((s$   <B	 	1C::6C55C:(D< < E)r   r   r    r!   )rF   rJ   rK   rL   rM   r   r    r!   )rF   rJ   r    r!   )NN)
r\   r   r]   r^   r_   r`   ra   rb   r    r   )r\   r   r}   r   r    rJ   )r\   r   r}   r   r    r   )r\   r   r}   r   r    r   )r\   r   r}   r   r    r   )F__doc__
__future__r   r   r   rD   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   rg   pymongo.pyopenssl_contextr   pymongo.typingsr   r   r   r   r   r%   ImportErrorr@   rB   rZ   platform_winregr/   r8   OpenKeyHKEY_LOCAL_MACHINEr3   r?   rA   r1   rI   rU   rk   rm   r   r   r   r   r   r   r(   r&   r$   <module>r      s   0 / " " " " " "       



 



                    5 5 5 5 5 5            P O O O O O O O ` ` ` ` ` ` ` ` ` ` , , , , , , > > > > > > > > > >"	 )222222((((((E999999999999/ / / / /
  E E EE E E E E E	E    <7          
(V^%'\
 
 	N#)6##H#H '-vc3F'M'M$		N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N
  ( ( (  '#'   	(M M M M   ? ? ? ? !%26	, , , , ,:       M, M, M, M,`5 5 5 5p3; 3; 3; 3;lD, D, D, D,N. . . .b.) .) .) .) .) .)sZ   8B	 		BB*B/ /	B;:B;D C?3D ?DD DD 	DD