o
    .jc                     @  s   d dl mZ d dlZd dlZd dlZd dlZejr"G dd dejZd*d	d
Z	d*ddZ
d+ddZd+ddZd,ddZd-ddZd.ddZd/ddZd0d$d%Zd1d'd(Zd)ZdS )2    )annotationsNc                   @  s>   e Zd ZU ded< ded< ded< ded< ded< d	ed
< dS )HttpsRecordintprioritystrtarget	list[str]alpnipv4hintipv6hintbytes	echconfigN)__name__
__module____qualname____annotations__ r   r   S/home/thesage/.local/lib/python3.10/site-packages/urllib3/contrib/resolver/utils.pyr   
   s   
 r   addressr   returnr   c                 C  s@   t | dkrtdt |  dd| d | d | d | d f S )	z4
    Convert an IPv4 address from bytes to str.
       z%IPv4 addresses are 4 bytes long, got  byte(s) insteadz%u.%u.%u.%ur            )len
ValueError)r   r   r   r   
inet4_ntoa   s
    r   c                 C  s  t | dkrtdt |  dt| }g }d}t |}||k r=|||d   dp/d}|| |d7 }||k s!d}d}d}d}	td	D ]!}|| dkrd|	rc|}
|
| }||kra|}|}d}	qI|	sj|}d
}	qI|	r{d	}
|
| }||kr{|}|}|dkr|dkr|dks|dkr|d dkr|dkrd}nd}|t| dd  }|S d	|d| d d	||| d  }|S d	|}|S )z4
    Convert an IPv6 address from bytes to str.
       z&IPv6 addresses are 16 bytes long, got r   r   r   0F   Tr         ffffz::z::ffff:   N:)
r   r   binasciihexlifydecodelstripappendranger   join)r   hexchunksilengthchunk
best_startbest_lenstartlast_was_zeroendcurrent_lenprefixthexr   r   r   
inet6_ntoa   sj   

$

r;   addrboolc                 C  s&   zt |  W dS  ty   Y dS w NTF)socket	inet_atonOSErrorr<   r   r   r   is_ipv4_   s   
rC   c                 C  s*   z
t t j|  W dS  ty   Y dS w r>   )r?   	inet_ptonAF_INET6rA   rB   r   r   r   is_ipv6g   s   rF   hostnameNonec                 C  s>   t | ddkrtdtdd | dD rtddS )zDRFC 1035 impose a limit on a domain name length. We verify it there..   z)hostname to resolve exceed 253 charactersc                 S  s   g | ]}t |d kqS )?   )r   ).0_r   r   r   
<listcomp>s   s    z&validate_length_of.<locals>.<listcomp>z2at least one label to resolve exceed 63 charactersN)r   stripUnicodeErroranysplit)rG   r   r   r   validate_length_ofo   s
   rS   payloadc                 C  sx   | sdS t | dkrdS | }	 td|d d d }t |dd  |kr'dS t |dd  |k r3dS |d| d  }q)NFr   T!Hr   )r   structunpack)rT   cursorexpected_sizer   r   r   rfc1035_should_readw   s   rZ   tuple[bytes, ...]c                 C  sV   | }g }|r't d|d d d }||dd|   |d| d  }|st|S )NrU   r   r   )rV   rW   r+   tuple)rT   rX   packetsrY   r   r   r   rfc1035_unpack   s   r^   messagec                 C  s   t dt| |  S )NrU   )rV   packr   )r_   r   r   r   rfc1035_pack   s   ra   dataoffsetr   tuple[str, int]c                 C  s   g }	 | | }|d@ dkr)t d| |d d@ }t| |\}}|| |d7 }n|dkr2|d7 }n|d7 }|| |||    ||7 }qd||fS )	us   
    Read a DNS‐encoded name (with compression pointers) from data[offset:].
    Returns (name, new_offset).
    T   rU   r   i?  r   r   rI   )rV   unpack_from	read_namer+   r)   r-   )rb   rc   labelsr1   pointersubnamerM   r   r   r   rg      s"   
rg   rdatac                   s  d}t d| |d }|d7 }t| |\}}i  |d t| krCt d| |\}}|d7 }| |||   |< ||7 }|d t| ks dd
d}| dd} fddtdt dddD } fddtdt dddD }	 dd}
||pd|||	|
dS )z
    Parse the RDATA of an SVCB/HTTPS record.
    Returns a dict with keys: priority, target, alpn, ipv4hint, ipv6hint, echconfig.
    r   rU   r   r   z!HHbufr   r   r   c                 S  sZ   g }d}|t | k r+| | }|| |d |d |    |d| 7 }|t | k s
|S )Nr   r   )r   r+   r)   )rl   outr0   lnr   r   r   
parse_alpn   s   "z%parse_https_rdata.<locals>.parse_alpnr       c                   s$   g | ]}t  d  ||d   qS )r   )r   rL   r0   paramsr   r   rN          z%parse_https_rdata.<locals>.<listcomp>c                   s$   g | ]}t  d  ||d  qS )r"   r   )r;   rq   rr   r   r   rN      rt   r"   r   r#   rI   )r   r   r	   r
   r   r   N)rl   r   r   r   )rV   rf   rg   r   getr,   )rk   offr   r   keyr1   ro   r	   ipv4ipv6echconfsr   rr   r   parse_https_rdata   s6   
	

r{   )
r   r;   rC   rF   rS   ra   r^   rZ   r{   rg   )r   r   r   r   )r<   r   r   r=   )rG   r   r   rH   )rT   r   r   r=   )rT   r   r   r[   )r_   r   r   r   )rb   r   rc   r   r   rd   )rk   r   r   r   )
__future__r   r'   r?   rV   typingTYPE_CHECKING	TypedDictr   r   r;   rC   rF   rS   rZ   r^   ra   rg   r{   __all__r   r   r   r   <module>   s$    
	

@






0