
    F2jc                        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ej                  Zd d	Z	d d
Z
d!dZd!dZd"dZd#dZd$dZd%dZd&dZd'dZdZdS )(    )annotationsNc                  L    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__     f/home/thesage/.hermes/hermes-agent/venv/lib/python3.11/site-packages/urllib3/contrib/resolver/utils.pyr   r   
   sQ         r   r   addressr   returnr   c                    t          |           dk    r t          dt          |            d          d| d         | d         | d         | d         fz  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   s    r   
inet4_ntoar!      sa     7||qRCLLRRR
 
 	
 GAJ
GAJ
KKKr   c                Z   t          |           dk    r t          dt          |            d          t          j        |           }g }d}t          |          }||k     rT|||dz                                                                d          pd}|                    |           |dz  }||k     Td}d}d}d}	t          d	          D ]*}||         dk    r|	r|}
|
|z
  }||k    r|}|}d}	$|	s|}d
}	+|	rd	}
|
|z
  }||k    r|}|}|dk    r|dk    r>|dk    s|dk    r2|d         dk    r&|dk    rd}nd}|t          | dd                   z   }nWd	                    |d|                   dz   d	                    |||z   d                   z   }n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thexs                 r   
inet6_ntoar@      s1    7||rSS\\SSS
 
 	
 
7
#
#CF	AXXF
f**AAI%%''..s33:se	Q f** JHEM1XX ! !!9 &!Ek))!&J*H % 	!E M #Ek!!J"H!||??AQ6!9PVCVCV1}}"Jwrss|444DD ,--((6*x"7"9"9:;;< D xxKr   addrboolc                R    	 t          j        |            dS # t          $ r Y dS w xY wNTF)socket	inet_atonOSErrorrA   s    r   is_ipv4rI   _   s?    t   uus    
&&c                h    	 t          j        t           j        |            dS # t          $ r Y dS w xY wrD   )rE   	inet_ptonAF_INET6rG   rH   s    r   is_ipv6rM   g   sC    $///t   uus   # 
11hostnameNonec                    t          |                     d                    dk    rt          d          t          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                4    g | ]}t          |          d k    S )?   )r   ).0_s     r   
<listcomp>z&validate_length_of.<locals>.<listcomp>s   s"    777ac!ffrk777r   z2at least one label to resolve exceed 63 charactersN)r   stripUnicodeErroranysplit)rN   s    r   validate_length_ofr\   o   sw    
8>>##%%FGGG	778>>##6#6777	8	8 QOPPPQ Qr   payloadc                   | sdS t          |           dk    rdS | }	 t          j        d|d d                   d         }t          |dd                    |k    rdS t          |dd                    |k     rdS |d|z   d          }k)NFr   T!Hr   )r   structunpack)r]   cursorexpected_sizes      r   rfc1035_should_readrd   w   s     u
7||qtF-#]4<<Q?vabbz??m++5__},,4M)++,-r   tuple[bytes, ...]c                    | }g }|rRt          j        d|d d                   d         }|                    |dd|z                       |d|z   d          }|Rt          |          S )Nr_   r   r   )r`   ra   r0   tuple)r]   rb   packetsrc   s       r   rfc1035_unpackri      s    FG
 -#]4<<Q?va!m"334555M)++,	  - >>r   messagec                L    t          j        dt          |                     | z   S )Nr_   )r`   packr   )rj   s    r   rfc1035_packrm      s    ;tS\\**W44r   dataoffsetr   tuple[str, int]c                   g }	 | |         }|dz  dk    rMt          j        d| |          d         dz  }t          | |          \  }}|                    |           |dz  }nI|dk    r|dz  }n=|dz  }|                    | |||z                                                       ||z  }d                    |          |fS )	us   
    Read a DNS‐encoded name (with compression pointers) from data[offset:].
    Returns (name, new_offset).
    T   r_   r   i?  r   r   rQ   )r`   unpack_from	read_namer0   r.   r2   )rn   ro   labelsr6   pointersubnamerV   s          r   rt   rt      s    
 FfD=D  (tV<<Q?&HG"411JGQMM'"""aKFQ;;aKF!d6FVO34;;==>>>& 88FV##r   rdatac           
        d}t          j        d| |          d         }|dz  }t          | |          \  }}i |dz   t          |           k    rIt          j        d| |          \  }}|dz  }| |||z            |<   ||z  }|dz   t          |           k    Idd
} |                    dd                    }fdt          dt                              dd                    d          D             }fdt          dt                              dd                    d          D             }	                    dd          }
||pd|||	|
dS )z
    Parse the RDATA of an SVCB/HTTPS record.
    Returns a dict with keys: priority, target, alpn, ipv4hint, ipv6hint, echconfig.
    r   r_   r   r   z!HHbufr   r   r
   c                    g }d}|t          |           k     r[| |         }|                    | |dz   |dz   |z                                                       |d|z   z  }|t          |           k     [|S )Nr   r   )r   r0   r.   )rz   outr5   lns       r   
parse_alpnz%parse_https_rdata.<locals>.parse_alpn   s}    #c((llQBJJs1q51q52:-.5577888RKA #c((ll 
r   r   r   c                P    g | ]"}t          d          ||d z                      #S )r   )r!   rU   r5   paramss     r   rW   z%parse_https_rdata.<locals>.<listcomp>   s?       -.
6!9QQY'((  r   c                P    g | ]"}t          d          ||dz                      #S )r'   r#   )r@   r   s     r   rW   z%parse_https_rdata.<locals>.<listcomp>   s?       ./
6!9QRZ())  r   r'   r#   r(   rQ   )r   r	   r   r   r   r   )rz   r   r   r
   )r`   rs   rt   r   getr1   )rx   offr   r	   keyr6   r~   r   ipv4ipv6echconfsr   s              @r   parse_https_rdatar      s   
 C!$s33A6H1HCE3''KFC F
'SZZ

(s;;VqC#,./sv	 'SZZ

    !jAs!3!344D   273vzz!S?Q?Q;R;RTU2V2V  D   38C

1c@R@R<S<SUW3X3X  D zz!S!!H -C  r   )
r!   r@   rI   rM   r\   rm   ri   rd   r   rt   )r   r   r   r   )rA   r   r   rB   )rN   r   r   rO   )r]   r   r   rB   )r]   r   r   re   )rj   r   r   r   )rn   r   ro   r   r   rp   )rx   r   r   r   )
__future__r   r,   rE   r`   typingTYPE_CHECKING	TypedDictr   r!   r@   rI   rM   r\   rd   ri   rm   rt   r   __all__r   r   r   <module>r      sP   " " " " " "    	     f&   	L 	L 	L 	L= = = =@      Q Q Q Q- - - -&
 
 
 
5 5 5 5$ $ $ $0- - - -`r   