
    gh i                        d Z ddlmZ ddlZddlZddlmZmZmZm	Z	 ddl
mZ ddlmZ erddlmZ dZdd	Zdd
ZddZdZ G d d      Zy)zASupport for resolving hosts and options from mongodb+srv:// URIs.    )annotationsN)TYPE_CHECKINGAnyOptionalUnion)CONNECT_TIMEOUT)ConfigurationErrorresolverFc                 ,    	 dd l } y# t        $ r Y yw xY w)Nr   TF)dnsImportError)r   s    ]/opt/movilizia/ApiFast/venv/lib/python3.12/site-packages/pymongo/asynchronous/srv_resolver.py_have_dnspythonr      s     s    	c                F    t        | t              r| j                         S | S )N)
isinstancebytesdecode)texts    r   maybe_decoder   *   s    ${{}K    c                    K   t         r6ddlm} t        |d      r |j                  | i |S  |j
                  | i |S ddlm} t        |d      r |j                  | i | d {   S t        d      7 w)Nr   r
   resolve)asyncresolverz\Upgrade to dnspython version >= 2.0 to use AsyncMongoClient with mongodb+srv:// connections.)_IS_SYNCr   r   hasattrr   queryr   r	   )argskwargsr   r   s       r   _resolver    1   s      8Y'#8##T4V44x~~t.v..%=),...???? j
 	
 @s   A$A8&A6'A8zdInvalid URI host: %s is not a valid hostname for 'mongodb+srv://'. Did you mean to use 'mongodb://'?c                  V    e Zd Z	 d	 	 	 	 	 	 	 d	dZd
dZddZ	 	 	 	 ddZddZddZy)_SrvResolverc                   || _         || _        |xs t        | _        |xs d| _        	 t        j                  |       t        t        dz        # t        $ r Y nw xY w	 | j                   j                  d      }t        |      dkD  r|dd  n|| _        n!# t        $ r t        t        |fz        d w xY wt        | j                        | _        t        |      | _        y )Nr   )zan IP address.      )_SrvResolver__fqdn_SrvResolver__srvr   _SrvResolver__connect_timeout_SrvResolver__srv_max_hosts	ipaddress
ip_addressr	   _INVALID_HOST_MSG
ValueErrorsplitlen_SrvResolver__plist	Exception_SrvResolver__slennparts)selffqdnconnect_timeoutsrv_service_namesrv_max_hosts
split_fqdns         r   __init__z_SrvResolver.__init__L   s     %
!0!CO,1	  &$%69K%KLL 			L**3/J-0_q-@:ab>jDL 	L$%6$%@AtK	L$,,'*os   'A 	AA!5B B5c                  K   ddl m} 	 t        | j                  d| j                         d {   }t        |      dkD  rt        d      dj                  |D cg c]  }dj                  |j                         c}      j                  d	      S 7 d# |j
                  |j                  f$ r Y y t        $ r}t        t        |            d d }~ww xY wc c}w w)
Nr   r
   TXTlifetimer&   z Only one TXT record is supported   &r   zutf-8)r   r   r    r'   r)   NoAnswerNXDOMAINr2   r	   strr0   joinstringsr   )r5   r   resultsexcress        r   get_optionsz_SrvResolver.get_optionse   s      	9$T[[%$BXBXYYG w<!$%GHH		GDS388CKK0DEMMgVV Z!!8#4#45 	 	9$SX.D8	9 EsO   C%B BB (C"C>CB C1C3C;CCCc                   K   	 t        d| j                  z   dz   | j                  z   d| j                         d {   }|S 7 # t        $ r}|s t        t        |            d d }~ww xY ww)N_z._tcp.SRVr>   )r    r(   r'   r)   r2   r	   rC   )r5   encapsulate_errorsrF   rG   s       r   _resolve_uriz_SrvResolver._resolve_uris   sr     		9$djj 8+dkk954KaKa G   	9%$SX.D8	9s8   A.8A AA A.A 	A+A&&A++A.c           	       K   | j                  |       d {   }|D cg c]3  }t        |j                  j                  d            |j                  f5 }}|D ]  }|d   j                         }| j                  |k(  r| j                  dk  rt        d      	 |j                  d      dd  | j                   d  }| j                  |k7  srt        d|d           | j                  r3t        j                  |t!        | j                  t#        |                  }||fS 7 c c}w # t        $ r t        d|d          d w xY ww)	NT)omit_final_dotr      z=Invalid SRV host: return address is identical to SRV hostnamer$   r&   zInvalid SRV host: )rN   r   targetto_textportlowerr'   r4   r	   r/   r3   r2   r1   r*   randomsampleminr0   )r5   rM   rF   rH   nodesnodesrv_hostnlists           r   _get_srv_response_and_hostsz(_SrvResolver._get_srv_response_and_hosts   s[     ))*<==
 
 #**,,D,ABCHHM
 
  	IDAw}}H{{h&4;;?(S S s+AB/? ||u$(+=d1gY)GHH	I MM%T-A-A3u:)NOE~/ >
  S(+=d1gY)GHdRSs@   E
D#E
8D&AE
"D+>E
AE
&E
+EE
c                J   K   | j                  d       d {   \  }}|S 7 	w)NT)r]   )r5   rK   rY   s      r   	get_hostsz_SrvResolver.get_hosts   s(     99$??5 @s   #!
#c                   K   | j                  d       d {   \  }}|j                  }|r|j                  nd}||fS 7 'w)NFr   )r]   rrsetttl)r5   rF   rY   ra   rb   s        r   get_hosts_and_min_ttlz"_SrvResolver.get_hosts_and_min_ttl   sC     #??FF eiiacz Gs   A?(AN)r   )r6   rC   r7   zOptional[float]r8   rC   r9   int)returnzOptional[str])rM   boolre   resolver.Answer)rM   rf   re   z-tuple[resolver.Answer, list[tuple[str, Any]]])re   zlist[tuple[str, Any]])re   z!tuple[list[tuple[str, Any]], int])	__name__
__module____qualname__r;   rI   rN   r]   r_   rc    r   r   r"   r"   K   s\     && )& 	&
 &2W"&	68r   r"   )re   rf   )r   zUnion[str, bytes]re   rC   )r   r   r   r   re   rg   )__doc__
__future__r   r+   rV   typingr   r   r   r   pymongo.commonr   pymongo.errorsr	   r   r   r   r   r   r    r-   r"   rk   r   r   <module>rq      sP    H "   6 6 * -
*( Y Yr   