o
    .jU\                     @  s  d dl mZ d dlZd dlZd dlmZmZ ddlmZ ddl	m
Z
mZmZ ddlmZ ddlmZ dd	lmZ d
dlmZmZmZmZmZmZ d
dl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#G dd deZ$G dd deZ%dS )    )annotationsN)	b64decode	b64encode   )HTTPHeaderDict)ConnectionInfoHttpVersionResponsePromise)HTTPSConnectionPool)HTTPResponse)	parse_url   )BaseResolverDomainNameServerQueryDomainNameServerReturnProtocolResolverSupportedQueryTypeCOMMON_RCODE_LABEL)is_ipv4is_ipv6validate_length_ofparse_https_rdatac                      sZ   e Zd ZdZdZejZ	d&d' fddZd(ddZ	d)ddZ
		d*ddd+d$d%Z  ZS ),HTTPSResolveru   
    Advanced DNS over HTTPS resolver.
    No common ground emerged from IETF w/ JSON. Following Google’s DNS over HTTPS schematics that is
    also implemented at Cloudflare.

    Support RFC 8484 without JSON. Disabled by default.
    urllib3Nserver
str | Noneport
int | Nonepatternsstrkwargs
typing.AnyreturnNonec                   s  t  j||pdg|R i | d| _d|v r.t|d tr)|d dkr)|d | _|d d| _d|v rA|d r<d| _|d | jd usHJ d|v rtt|d trp|d d	d
\}}|rl|	 rl|t
|f|d< ntdtdd|v rt|d |d< |d d|vrd|d< d|v rd|v rt }t|d ts|d g|d< |d D ]}d	|vrtd|d	d
\}	}
||	|
 q||d< d|v rt }t|d ts|d g|d< |d D ]}d	|vrtd|d	d
\}	}
||	|
 q||d< d|v rIt|d ts|d g|d< t }|d D ],}| }|dkr+|tj q|dkr8|tj q|dkrC|tj q||d< d|v r`t|d r`|d | _|d nd | _t| j| jfi || _d S )Ni  z/resolvepath/Frfc8484Tsource_address:   z*invalid source_address given in parametersproxy_proxymaxsize
   proxy_headersz*Passed header is invalid in DNS parameters_proxy_headersheadersdisabled_svnh11h2h3on_post_connection)super__init___path
isinstancer   pop_rfc8484_serversplitisdigitint
ValueErrorr   r   listaddsetlowerr   r2   r3   r4   callable_connection_callbackr
   _port_pool)selfr   r   r   r    bind_ip	bind_portr.   itemkvr0   r1   svn	__class__ Z/home/thesage/.local/lib/python3.10/site-packages/urllib3/contrib/resolver/doh/_urllib3.pyr7   #   s    








zHTTPSResolver.__init__c                 C  s   | j   d S N)rH   closerI   rR   rR   rS   rU      s   zHTTPSResolver.closeboolc                 C  s   | j jd uS rT   )rH   poolrV   rR   rR   rS   is_available   s   zHTTPSResolver.is_availabler   F)quic_upgrade_via_dns_rrhostbytes | str | Nonestr | int | Nonefamilysocket.AddressFamilytypesocket.SocketKindprotor?   flagsrZ   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| g }d	}	d  |rr|t jkrrd	}|t jt j	fv r| js|| jjd
| j|ddddi| jdd n)t|tjdd}
t|
}|| jjd
| jdt| ddiddi| jdd |t jt jfv r	| js|| jjd
| j|ddddi| jdd n)t|tjdd}
t|
}|| jjd
| jdt| ddiddi| jdd | js$|| jjd
| j|ddddi| jdd n)t|tjdd}
t|
}|| jjd
| jdt| ddiddi| jdd g }|D ]}t|tr`|| qQ|| jj|d qQg }|D ]Q}|jdkrt d|j d| js| }d|v rt|d tsJ |d dkrd|v r|d nd|d  d}t|trd |}t |d|v rt|d tsJ d |vrؐqpt|d  tsJ |d  D ]1}|d! d"vrqd#|v sJ t|d# tsJ |d! d$kr|d# }|!d%rTd |d&d  "d'd&d  }zt#|}W n t$y7   d(}Y nw t%|}|d) rE|d)  d*|d+ vsO|sQqd}	nt&d,d- d.d- |"d'D D }d/|v r}zt'|d/  W n
 t(y|   Y nw d+|vsd*|d+ ) vs|sqd}	d0|v r|t jt j	fv r|d0 "d1D ]}|t j	t jdd||ff qd2|v r|t jt jfv r|d2 "d1D ]}|t jt jdd||ddff qΐq|d! d3krt j	nt j}|t j	kr|d# |fn|d# |ddf}||||t j*krdndd|f qqpt+|j,}|j-sP|j.d&kr6t d4| d5| d6t d7|j.t/v rGt/|j.  d8|j.  |j0D ]m}|d tjkrt|d9 t&sgJ d*|d9 d+ v rrd}	|d9 d) r|d9 d)  qSt|d9 t&rJ |d tjkrt j	nt j}|t j	kr|d9 |fn|d9 |ddf}||||t j*krdndd|f qSqpg }|	rd	}|D ]}|d3 t j*k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?t1|| d@dA ddBS )CNz1Tried to resolve 'localhost' from a HTTPSResolverr   z&Servname not supported for ai_socktypeasciiz)Address family for hostname not supported       FGET1)namer`   Acceptzapplication/dns-jsonT)r0   r5   multiplexed)override_iddns=zapplication/dns-message2865)promisei,  z8DNS over HTTPS was unsuccessful, server response status .StatusCommentzORemote DNS indicated that an error occurred while providing resolution. Status z, QuestionAnswerr`   )r)      A   datarz   z\#r        	echconfigr4   alpnc                 s  s     | ]\}}|  |fV  qd S rT   )rD   ).0rM   rN   rR   rR   rS   	<genexpr>  s
    

z,HTTPSResolver.getaddrinfo.<locals>.<genexpr>c                 s  s$    | ]}d |v r| d dV  qdS )rp   r)   N)r=   )r   _rR   rR   rS   r     s    echipv4hint,ipv6hintr)   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 r   c                   *   g | ]}|d  |d |d  |d fqS r   r)   r   r   rR   r   rech_config_listrR   rS   
<listcomp>3  s   * z-HTTPSResolver.getaddrinfo.<locals>.<listcomp>c                   r   r   rR   r   r   rR   rS   r   4  s    zName or service not known: ''c                 S  s   | d | d  S )Nr   r)   rR   )r   rR   rR   rS   <lambda>;  s    z+HTTPSResolver.getaddrinfo.<locals>.<lambda>)keyreverse)2socketgaierrorr9   r   r?   bytesdecoder   AF_INET6AF_INETr   r   
SOCK_DGRAM	AF_UNSPECr;   appendrH   request_encode_urlr8   rF   r   r   Ar   replaceAAAAHTTPSr   get_responsestatusjsonrA   join
startswithr=   fromhexr@   r   dictr   	ExceptionrD   SOCK_STREAMr   r{   is_okrcoder   recordssorted) rI   r[   r   r^   r`   rb   rc   rZ   promisesremote_preemptive_quic_rr	dns_querydns_payload	responsesrs   resultsresponsepayloadmsganswerrr
raw_recordhttps_record	rr_decodeipv4ipv6	inet_typedst_addrdns_resprecordquic_resultsany_specifiedresultrR   r   rS   getaddrinfo   sn  














 


	
|

0


zHTTPSResolver.getaddrinforT   )
r   r   r   r   r   r   r    r!   r"   r#   )r"   r#   )r"   rW   )r   r   )r[   r\   r   r]   r^   r_   r`   ra   rb   r?   rc   r?   rZ   rW   r"   rd   )__name__
__module____qualname____doc__implementationr   DOHprotocolr7   rU   rY   r   __classcell__rR   rR   rP   rS   r      s    
h
		r   c                      "   e Zd ZdZd
 fdd	Z  ZS )GoogleResolvergoogler   r   r    r!   r"   r#   c                   sj   d|v r	| d d|v r|d }| d nd }d|v r%|d r%d|d< t jd|g|R i | d S )Nr   r   r&   
/dns-queryr$   z
dns.googler:   r6   r7   rI   r   r    r   rP   rR   rS   r7   C  s   
 zGoogleResolver.__init__r   r   r    r!   r"   r#   r   r   r   	specifierr7   r   rR   rR   rP   rS   r   >      r   c                      r   )CloudflareResolver
cloudflarer   r   r    r!   r"   r#   c                   s`   d|v r	| d d|v r|d }| d nd }|ddi t jd|g|R i | d S )Nr   r   r$   r   zcloudflare-dns.comr:   updater6   r7   r   rP   rR   rS   r7   V  s   
 zCloudflareResolver.__init__r   r   rR   rR   rP   rS   r   Q  r   r   c                      r   )AdGuardResolveradguardr   r   r    r!   r"   r#   c                   b   d|v r	| d d|v r|d }| d nd }|ddd t jd|g|R i | d S )Nr   r   r   Tr$   r&   zunfiltered.adguard-dns.comr   r   rP   rR   rS   r7   h     
 zAdGuardResolver.__init__r   r   rR   rR   rP   rS   r   c  r   r   c                      r   )OpenDNSResolveropendnsr   r   r    r!   r"   r#   c                   r   )Nr   r   r   Tr   zdns.opendns.comr   r   rP   rR   rS   r7   z  r   zOpenDNSResolver.__init__r   r   rR   rR   rP   rS   r   u  r   r   c                      r   )Quad9Resolverquad9r   r   r    r!   r"   r#   c                   r   )Nr   r   r   Tr   zdns11.quad9.netr   r   rP   rR   rS   r7     r   zQuad9Resolver.__init__r   r   rR   rR   rP   rS   r     r   r   c                      r   )NextDNSResolvernextdnsr   r   r    r!   r"   r#   c                   sR   d|v r	| d d|v r|d }| d nd }t jd|g|R i | d S )Nr   r   zdns.nextdns.ior   r   rP   rR   rS   r7     s   
 zNextDNSResolver.__init__r   r   rR   rR   rP   rS   r     r   r   )&
__future__r   r   typingbase64r   r   _collectionsr   backendr   r   r	   connectionpoolr
   r   r   util.urlr   	protocolsr   r   r   r   r   r   utilsr   r   r   r   r   r   r   r   r   r   r   rR   rR   rR   rS   <module>   sD         
+




