3
]ð]f  ã               @   s€   d Z yddlmZ dZW n ek
r0   dZY nX ddlmZ ddlmZ ddl	m
Z
 erddd	„ Znd
d	„ ZG dd„ deƒZdS )zASupport for resolving hosts and options from mongodb+srv:// URIs.é    )ÚresolverTF)ÚPY3)ÚCONNECT_TIMEOUT)ÚConfigurationErrorc             C   s   t | tƒr| jƒ S | S )N)Ú
isinstanceÚbytesÚdecode)Útext© r
   ú7/tmp/pip-build-20mum3z4/pymongo/pymongo/srv_resolver.pyÚmaybe_decode    s    
r   c             C   s   | S )Nr
   )r	   r
   r
   r   r   %   s    c               @   s>   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ ZdS )Ú_SrvResolverNc             C   sv   || _ |pt| _y| j jdƒdd … | _W n" tk
rL   td|f ƒ‚Y nX t| jƒ| _| jdk rrtd|f ƒ‚d S )NÚ.é   zInvalid URI host: %sé   )	Ú_SrvResolver__fqdnr   Ú_SrvResolver__connect_timeoutÚsplitÚ_SrvResolver__plistÚ	Exceptionr   ÚlenÚ_SrvResolver__slen)ÚselfZfqdnÚconnect_timeoutr
   r
   r   Ú__init__*   s    

z_SrvResolver.__init__c             C   s�   yt j| jd| jd�}W nH t jt jfk
r4   d S  tk
r` } ztt|ƒƒ‚W Y d d }~X nX t	|ƒdkrvtdƒ‚dj
dd„ |D ƒƒjdƒS )	NZTXT)Úlifetimer   z Only one TXT record is supportedó   &c             S   s   g | ]}d j |jƒ‘qS )ó    )ÚjoinÚstrings)Ú.0Úresr
   r
   r   ú
<listcomp>C   s    z,_SrvResolver.get_options.<locals>.<listcomp>zutf-8)r   Úqueryr   r   ZNoAnswerZNXDOMAINr   r   Ústrr   r   r   )r   ÚresultsÚexcr
   r
   r   Úget_options7   s    
z_SrvResolver.get_optionsc             C   sV   yt jd| j d| jd�}W n4 tk
rP } z|s4‚ tt|ƒƒ‚W Y d d }~X nX |S )Nz_mongodb._tcp.ZSRV)r   )r   r#   r   r   r   r   r$   )r   Úencapsulate_errorsr%   r&   r
   r
   r   Ú_resolve_uriF   s    z_SrvResolver._resolve_uric             C   s˜   | j |ƒ}dd„ |D ƒ}xv|D ]n}y&|d jdƒdd … | j d … }W n& tk
rn   td|d f ƒ‚Y nX | j|krtd|d f ƒ‚qW ||fS )Nc             S   s$   g | ]}t |jjd d�ƒ|jf‘qS )T)Zomit_final_dot)r   ÚtargetZto_textÚport)r    r!   r
   r
   r   r"   W   s   z<_SrvResolver._get_srv_response_and_hosts.<locals>.<listcomp>r   r   r   zInvalid SRV host: %s)r)   r   r   r   r   r   )r   r(   r%   ÚnodesÚnodeZnlistr
   r
   r   Ú_get_srv_response_and_hostsR   s    

&
z(_SrvResolver._get_srv_response_and_hostsc             C   s   | j dƒ\}}|S )NT)r.   )r   Ú_r,   r
   r
   r   Ú	get_hostse   s    z_SrvResolver.get_hostsc             C   s   | j dƒ\}}||jjfS )NF)r.   ZrrsetZttl)r   r%   r,   r
   r
   r   Úget_hosts_and_min_ttli   s    z"_SrvResolver.get_hosts_and_min_ttl)N)	Ú__name__Ú
__module__Ú__qualname__r   r'   r)   r.   r0   r1   r
   r
   r
   r   r   )   s   
r   N)Ú__doc__Zdnsr   Z_HAVE_DNSPYTHONÚImportErrorZbson.py3compatr   Zpymongo.commonr   Zpymongo.errorsr   r   Úobjectr   r
   r
   r
   r   Ú<module>   s   

