U
    d                     @  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	m
Z
 zddlmZ dZW n ek
rh   dZY nX ddlmZ dd	lm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)AnyListOptionalTupleUnion)resolverTF)CONNECT_TIMEOUT)ConfigurationErrorzUnion[str, bytes]str)textreturnc                 C  s   t | tr|  S | S )N)
isinstancebytesdecode)r    r   8/tmp/pip-unpacked-wheel-oblwsawz/pymongo/srv_resolver.pymaybe_decode#   s    
r   r   resolver.Answer)argskwargsr   c                  O  s"   t tdrtj| |S tj| |S )Nresolve)hasattrr   r   query)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 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__9   s     



z_SrvResolver.__init__zOptional[str])r   c              
   C  s   zt | jd| jd}W nJ tjtjfk
r4   Y d S  tk
r` } ztt|W 5 d }~X Y nX t	|dkrvtdd
dd |D dS )	NZ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>]   s     z,_SrvResolver.get_options.<locals>.<listcomp>zutf-8)r   r$   r&   r   ZNoAnswerZNXDOMAINr.   r
   r   r/   r6   r   )r1   resultsexcr   r   r   get_optionsS   s    z_SrvResolver.get_optionsboolr   )encapsulate_errorsr   c              
   C  s^   z$t d| j d | j d| jd}W n4 tk
rX } z|s< tt|W 5 d }~X Y nX |S )N_z._tcp.ZSRVr3   )r   r%   r$   r&   r.   r
   r   )r1   r@   r<   r=   r   r   r   _resolve_uri_   s      
z_SrvResolver._resolve_uriz-Tuple[resolver.Answer, List[Tuple[str, Any]]]c              	   C  s   |  |}dd |D }|D ]r}z*|d  ddd  | j d  }W n& tk
rp   t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portr8   r   r   r   r;   r   s    z<_SrvResolver._get_srv_response_and_hosts.<locals>.<listcomp>r   r!   r"   zInvalid SRV host: )rB   lowerr,   r0   r.   r
   r-   r'   randomsampleminr/   )r1   r@   r<   nodesnodeZnlistr   r   r   _get_srv_response_and_hostsl   s    
*
z(_SrvResolver._get_srv_response_and_hostszList[Tuple[str, Any]]c                 C  s   |  d\}}|S )NT)rK   )r1   rA   rI   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   )rK   rrsetttl)r1   r<   rI   rM   rN   r   r   r   get_hosts_and_min_ttl   s    z"_SrvResolver.get_hosts_and_min_ttlN)r   )	__name__
__module____qualname__r2   r>   rB   rK   rL   rO   r   r   r   r   r   8   s    r   )__doc__
__future__r   r(   rF   typingr   r   r   r   r   Zdnsr   Z_HAVE_DNSPYTHONImportErrorZpymongo.commonr	   Zpymongo.errorsr
   r   r   r*   r   r   r   r   r   <module>   s    
	