U
    ~fho                     @  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r`ddlmZ dd	d
dZdddddZddd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resolverboolreturnc                  C  s*   zdd l } W dS  tk
r$   Y dS X d S )Nr   TF)dnsImportError)r    r   8/tmp/pip-unpacked-wheel-36gvocj8/pymongo/srv_resolver.py_have_dnspython   s
    r   zUnion[str, bytes]str)textr   c                 C  s   t | tr|  S | S )N)
isinstancebytesdecode)r   r   r   r   maybe_decode(   s    
r   r   resolver.Answer)argskwargsr   c                  O  s.   ddl m} t|dr"|j| |S |j| |S )Nr   r	   resolve)r   r
   hasattrr   query)r   r   r
   r   r   r   _resolve/   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ddddZdd	d
dZdddddZdddddZdd	ddZdd	ddZdS )_SrvResolverr   r   zOptional[float]int)fqdnconnect_timeoutsrv_service_namesrv_max_hostsc                 C  s   || _ || _|pt| _|pd| _zt| ttd W n t	k
rN   Y nX z| j 
ddd  | _W n$ tk
r   tt|f d Y nX t| j| _| jdk rtt|f 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_SrvResolver__plist	Exceptionlen_SrvResolver__slen)selfr"   r#   r$   r%   r   r   r   __init__@   s     



z_SrvResolver.__init__zOptional[str]r   c              
   C  s   ddl m} zt| jd| jd}W nL |j|jfk
r@   Y d S  tk
rn } ztt	|d W 5 d }~X Y nX t
|dkrtdddd	 |D d
S )Nr   r	   ZTXTZlifetimer'   z Only one TXT record is supported   &c                 S  s   g | ]}d  |jqS )    )joinstrings.0resr   r   r   
<listcomp>f   s     z,_SrvResolver.get_options.<locals>.<listcomp>zutf-8)r   r
   r   r)   r+   ZNoAnswerZNXDOMAINr3   r   r   r4   r;   r   )r6   r
   resultsexcr   r   r   get_optionsZ   s     z_SrvResolver.get_optionsr   r   )encapsulate_errorsr   c              
   C  s`   z$t d| j d | j d| jd}W n6 tk
rZ } z|s< tt|d W 5 d }~X Y nX |S )N_z._tcp.ZSRVr8   )r   r*   r)   r+   r3   r   r   )r6   rD   rA   rB   r   r   r   _resolve_urih   s      
 z_SrvResolver._resolve_uriz-tuple[resolver.Answer, list[tuple[str, Any]]]c              	   C  s   |  |}dd |D }|D ]t}z*|d  ddd  | j d  }W n( tk
rr   td|d  d Y nX | j|krtd|d  q| jrt	|t
| jt|}||fS )Nc                 S  s$   g | ]}t |jjd d|jfqS )T)Zomit_final_dot)r   targetZto_textportr=   r   r   r   r@   {   s    z<_SrvResolver._get_srv_response_and_hosts.<locals>.<listcomp>r   r&   r'   zInvalid SRV host: )rF   lowerr1   r5   r3   r   r2   r,   randomsampleminr4   )r6   rD   rA   nodesnodeZnlistr   r   r   _get_srv_response_and_hostsu   s    
*
z(_SrvResolver._get_srv_response_and_hostszlist[tuple[str, Any]]c                 C  s   |  d\}}|S )NT)rO   )r6   rE   rM   r   r   r   	get_hosts   s    z_SrvResolver.get_hostsz!tuple[list[tuple[str, Any]], int]c                 C  s*   |  d\}}|j}|r|jnd}||fS )NFr   )rO   rrsetttl)r6   rA   rM   rQ   rR   r   r   r   get_hosts_and_min_ttl   s    z"_SrvResolver.get_hosts_and_min_ttlN)r   )	__name__
__module____qualname__r7   rC   rF   rO   rP   rS   r   r   r   r   r    ?   s    r    )__doc__
__future__r   r-   rJ   typingr   r   r   r   Zpymongo.commonr   Zpymongo.errorsr   r   r
   r   r   r   r/   r    r   r   r   r   <module>   s   