o
    sDi                     @  s   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r0ddlmZ dZdddZdddZdddZdZG dd dZdS )zASupport for resolving hosts and options from mongodb+srv:// URIs.    )annotationsN)TYPE_CHECKINGAnyOptionalUnion)CONNECT_TIMEOUT)ConfigurationErrorresolverTreturnboolc                  C  s$   zdd l } W dS  ty   Y dS w )Nr   TF)dnsImportError)r    r   ^/home/alumno/antzosa8961/venv/lib/python3.10/site-packages/pymongo/synchronous/srv_resolver.py_have_dnspython   s   r   textUnion[str, bytes]strc                 C  s   t | tr	|  S | S )N)
isinstancebytesdecode)r   r   r   r   maybe_decode*   s   
r   argsr   kwargsresolver.Answerc                  O  s<   t rddlm} |j| i |S ddlm} |j| i |S )Nr   r	   )asyncresolver)_IS_SYNCr   r
   resolver   )r   r   r
   r   r   r   r   _resolve1   s
   r   zdInvalid URI host: %s is not a valid hostname for 'mongodb+srv://'. Did you mean to use 'mongodb://'?c                   @  sL   e Zd Z	ddd	d
Zd ddZd!ddZd"ddZd#ddZd$ddZdS )%_SrvResolverr   fqdnr   connect_timeoutOptional[float]srv_service_namesrv_max_hostsintc                 C  s   || _ || _|p	t| _|pd| _zt| ttd  t	y$   Y nw z| j 
d}t|dkr8|dd  n|| _W n tyK   tt|f d w t| j| _t|| _d S )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)selfr!   r"   r$   r%   
split_fqdnr   r   r   __init__C   s$   


"z_SrvResolver.__init__r   Optional[str]c              
   C  s   ddl m} zt| jd| jd}W n  |j|jfy   Y d S  ty1 } ztt	||d }~ww t
|dkr<tdddd	 |D d
S )Nr   r	   TXTlifetimer)   z Only one TXT record is supported   &c                 S  s   g | ]}d  |jqS )    )joinstrings.0resr   r   r   
<listcomp>h   s    z,_SrvResolver.get_options.<locals>.<listcomp>zutf-8)r   r
   r   r*   r,   NoAnswerNXDOMAINr5   r   r   r3   rA   r   )r8   r
   resultsexcr   r   r   get_options\   s   z_SrvResolver.get_optionsencapsulate_errorsr   r   c              
   C  sT   zt d| j d | j d| jd}W |S  ty) } z
|s tt||d }~ww )N_z._tcp.SRVr=   )r   r+   r*   r,   r5   r   r   )r8   rL   rI   rJ   r   r   r   _resolve_urij   s   	z_SrvResolver._resolve_uri-tuple[resolver.Answer, list[tuple[str, Any]]]c                 C  s   |  |}dd |D }|D ]L}|d  }| j|kr$| jdk r$tdz|ddd  | j d  }W n tyK } z
td|d  |d }~ww | j|krZtd|d  q| j	rjt
|t| j	t|}||fS )	Nc                 S  s$   g | ]}t |jjd d|jfqS )T)omit_final_dot)r   targetto_textportrC   r   r   r   rF   }   s    z<_SrvResolver._get_srv_response_and_hosts.<locals>.<listcomp>r      z=Invalid SRV host: return address is identical to SRV hostnamer'   r)   zInvalid SRV host: )rO   lowerr*   r7   r   r2   r6   r5   r4   r-   randomsampleminr3   )r8   rL   rI   nodesnodesrv_hostnlistrJ   r   r   r   _get_srv_response_and_hostsw   s,   
"
z(_SrvResolver._get_srv_response_and_hostslist[tuple[str, Any]]c                 C  s   |  d\}}|S )NT)r^   )r8   rM   rZ   r   r   r   	get_hosts   s   z_SrvResolver.get_hosts!tuple[list[tuple[str, Any]], int]c                 C  s*   |  d\}}|j}|r|jnd}||fS )NFr   )r^   rrsetttl)r8   rI   rZ   rb   rc   r   r   r   get_hosts_and_min_ttl   s   z"_SrvResolver.get_hosts_and_min_ttlN)r   )r!   r   r"   r#   r$   r   r%   r&   )r   r;   )rL   r   r   r   )rL   r   r   rP   )r   r_   )r   ra   )	__name__
__module____qualname__r:   rK   rO   r^   r`   rd   r   r   r   r   r    B   s    



r    )r   r   )r   r   r   r   )r   r   r   r   r   r   )__doc__
__future__r   r.   rW   typingr   r   r   r   pymongo.commonr   pymongo.errorsr   r   r
   r   r   r   r   r0   r    r   r   r   r   <module>   s    


