o
    .j8                     @  s   d dl mZ d dlZd dlZd dlmZ ddlmZmZ ddl	m
Z
mZmZmZmZmZ ddlmZ dd	lmZmZmZmZmZmZ G d
d deZG dd deZG dd deZG dd deZG dd deZdS )    )annotationsN)deque   )_sock_has_grosync_recv_gro   )COMMON_RCODE_LABELBaseResolverDomainNameServerQueryDomainNameServerReturnProtocolResolverSupportedQueryType)SystemResolver)is_ipv4is_ipv6rfc1035_packrfc1035_should_readrfc1035_unpackvalidate_length_ofc                      sZ   e Zd ZdZejZdZ	d%d& fddZd'ddZ	d(ddZ
		d)ddd*d#d$Z  ZS )+PlainResolverz
    Minimalist DNS resolver over UDP
    Comply with RFC 1035: https://datatracker.ietf.org/doc/html/rfc1035

    EDNS is not supported, yet. But we plan to. Willing to contribute?
    socketNserverstrport
int | Nonepatternskwargs
typing.AnyreturnNonec                   s   t  j||g|R i | t| ds`d|v r%t|d ttfr%|d }nd }d|v r=t|d tr=|d dd\}}nd\}}t j	||pHdf||dksR|d	krX|t|fnd d t
jd
| _d| _t| j| _t | _t | _d| _d S )N_sockettimeoutsource_address:   )0.0.0.005   r%   r&   )r!   r"   socket_optionssocket_kindF)super__init__hasattr
isinstancefloatintr   splitr   create_connectionr   
SOCK_DGRAMr    _rfc1035_prefix_mandatedr   _gro_enabledr   _unconsumed_pending_terminated)selfr   r   r   r   r!   bind_ip	bind_port	__class__ `/home/thesage/.local/lib/python3.10/site-packages/urllib3_future/contrib/resolver/dou/_socket.pyr+   &   s6   




zPlainResolver.__init__c                 C  s\   | j s,| j | jd ur| jd | j  d| _ W d    d S 1 s%w   Y  d S d S )Nr   T)r7   _lockr    shutdowncloser8   r=   r=   r>   rA   T   s   

"zPlainResolver.closeboolc                 C  s   | j  S N)r7   rB   r=   r=   r>   is_available\   s   zPlainResolver.is_availabler   F)quic_upgrade_via_dns_rrhostbytes | str | Nonestr | int | Nonefamilysocket.AddressFamilytypesocket.SocketKindprotor/   flagsrF   slist[tuple[socket.AddressFamily, socket.SocketKind, int, str | bytes, tuple[str, int] | tuple[str, int, int, int]]]c                   s  |d u r	t d|d u rd}t|trt|}|dk r!t dt|tr+|d}t|rD|t jkr9t dt j	|dd||ffgS t
|r_|t j	krRt dt j|dd||ddffgS t| d	}d |rp|t jkrpd	}g }	|t jt j	fv r|	tj |t jt jfv r|	tj |	tj tj|g|	R  }
| j& |
D ]}t|}| j| | jd
u rt|}| j| qW d    n1 sw   Y  g }t|t|	k r| j | jrd  |
D ]}| jD ]}|j|jkr| |   nq r nq r| j| | j  	 W d    qzX| jr&t | jd}n| j!d}t|t"r5|}n	|r<|g}ng }| jd
u rq|rqd#|}t$|rn| j!d}t|t"re|d#|7 }n||7 }t$|sQ|g}W n t%t&t j't(fy } zt d|d }~ww |sd
| _)t d|D ]S}| jd
u rt*|}n|f}|D ]?}t+| t, fdd|
D r|  d }| jD ]}|j jkr|} nq|d ur| j| q| j  qqW d    n	1 sw   Y  t|t|	k sg }|D ]}|j-s:|j.dkr t d| d| dt d|j.t/v r1t/|j.  d|j.  |j0D ]p}|d tjkrnt|d t1sQJ |d d r^|d d d|d d v rl|rld
}q=t|d t1rxJ |d tjkrt j	nt j}|t j	kr|d |fn|d |ddf}||||t j2krdndd|f q=qg }|rd	}|D ]}|d t j2kr||d t jdd|d f qd
} |rg }d urfdd|D }fdd|D }|s|st d | d!t3|| d"d# d
d$S )%Nz1Tried to resolve 'localhost' from a PlainResolverr   z&Servname not supported for ai_socktypeasciiz)Address family for hostname not supported       FTi  i      z?Got unexpectedly disconnected while waiting for name resolutionc                 3  s    | ]	} j |j kV  qd S rD   )id).0_)dns_respr=   r>   	<genexpr>	  s    z,PlainResolver.getaddrinfo.<locals>.<genexpr>r   z5DNSSEC validation failure. Check http://dnsviz.net/d/z5/dnssec/ and http://dnssec-debugger.verisignlabs.com/z for errorszDNS returned an error: zcode 	echconfigh3alpnr$      c                   *   g | ]}|d  |d |d  |d fqS r   r$   r   r_   r=   rW   rech_config_listr=   r>   
<listcomp>n  s   * z-PlainResolver.getaddrinfo.<locals>.<listcomp>c                   r`   ra   r=   rb   rd   r=   r>   rf   o  s    zName or service not known: ''c                 S  s   | d | d  S )Nr   r$   r=   )rX   r=   r=   r>   <lambda>v  s    z+PlainResolver.getaddrinfo.<locals>.<lambda>)keyreverse)4r   gaierrorr-   r   r/   bytesdecoder   AF_INET6AF_INETr   r   r2   	AF_UNSPECappendr   AAAAAHTTPSr
   bulkr?   r6   r3   r   r    sendalllenr5   rV   remover4   r   recvlistjoinr   TimeoutErrorOSErrorr!   ConnectionErrorr7   r   r   anyis_okrcoder   recordsdictSOCK_STREAMsorted) r8   rG   r   rJ   rL   rN   rO   rF   remote_preemptive_quic_rrtbqqueriesqpayload	responsesquery
unconsumeddata_in_or_segmentspayloadsextrae	fragmentsfragment	query_tbr	pending_qresultsresponserecord	inet_typedst_addrquic_resultsany_specifiedresultr=   )rY   re   r>   getaddrinfo_   s  
















X


0


zPlainResolver.getaddrinforD   )
r   r   r   r   r   r   r   r   r   r   )r   r   )r   rC   )r   r   )rG   rH   r   rI   rJ   rK   rL   rM   rN   r/   rO   r/   rF   rC   r   rP   )__name__
__module____qualname____doc__r   DOUprotocolimplementationr+   rA   rE   r   __classcell__r=   r=   r;   r>   r      s    
.
		r   c                      "   e Zd ZdZd
 fdd	Z  ZS )CloudflareResolver
cloudflarer   r   r   r   r   r   c                   R   d|v r	| d d|v r|d }| d nd }t jd|g|R i | d S )Nr   r   z1.1.1.1popr*   r+   r8   r   r   r   r;   r=   r>   r+   ~     
 zCloudflareResolver.__init__r   r   r   r   r   r   r   r   r   	specifierr+   r   r=   r=   r;   r>   r   y      r   c                      r   )GoogleResolvergoogler   r   r   r   r   r   c                   r   )Nr   r   z8.8.8.8r   r   r;   r=   r>   r+     r   zGoogleResolver.__init__r   r   r=   r=   r;   r>   r     r   r   c                      r   )Quad9Resolverquad9r   r   r   r   r   r   c                   r   )Nr   r   z9.9.9.9r   r   r;   r=   r>   r+     r   zQuad9Resolver.__init__r   r   r=   r=   r;   r>   r     r   r   c                      r   )AdGuardResolveradguardr   r   r   r   r   r   c                   r   )Nr   r   z94.140.14.140r   r   r;   r=   r>   r+     r   zAdGuardResolver.__init__r   r   r=   r=   r;   r>   r     r   r   )
__future__r   r   typingcollectionsr   ssa._gror   r   	protocolsr   r	   r
   r   r   r   systemr   utilsr   r   r   r   r   r   r   r   r   r   r   r=   r=   r=   r>   <module>   s.      
  
`


