
    i                         d dl mZ d dl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-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	echconfigN)__name__
__module____qualname____annotations__     `/root/projects/butler/venv/lib/python3.11/site-packages/urllib3_future/contrib/resolver/utils.pyr   r      sQ         r   r   addressbytes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   payloadidentifierstuple[bytes, ...]c                   g }d}g }d }|D ]H}| d d                              |          }|dk    r&|dk    r|}|                    ||z
             |} |D ]\}||k    r	|dk    r|                      d|z             }n|                      |          }|dk    rD|                    ||z
             ]|st          d          t          |          dk    r| fS t	          |          }d }|D ]&}||}|                    | ||                    |}'|                    | |d                     t          |          S )Nr   r*   r%      zhno identifiable dns message emerged from given payload. this should not happen at all. networking issue?r   )findr0   r    r   sortedtuple)	rA   rB   resultsoffsetstart_packet_idxlead_identifier
identifieridxprevious_idxs	            r   packet_fragmentrP   `   s   GFO!  
crcl
++"99!88Ff---$! . .
((Q;;,,w344CC,,z**C"99f---- 
?
 
 	

 !!z.//L  Lw|C/0111NN7<==)***>>r   addrboolc                R    	 t          j        |            dS # t          $ r Y dS w xY wNTF)socket	inet_atonOSErrorrQ   s    r   is_ipv4rY      s?    t   uus    
&&c                h    	 t          j        t           j        |            dS # t          $ r Y dS w xY wrT   )rU   	inet_ptonAF_INET6rW   rX   s    r   is_ipv6r]      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"    777ac!ffrk777r   z2at least one label to resolve exceed 63 charactersN)r   stripUnicodeErroranysplit)r^   s    r   validate_length_ofrl      sw    
8>>##%%FGGG	778>>##6#6777	8	8 QOPPPQ Qr   c                   | 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)rA   cursorexpected_sizes      r   rfc1035_should_readrs      s     u
7||qtF-#]4<<Q?vabbz??m++5__},,4M)++,-r   c                    | }g }|rRt          j        d|d d                   d         }|                    |dd|z                       |d|z   d          }|Rt          |          S )Nrn   r   r   )ro   rp   r0   rH   )rA   rq   packetsrr   s       r   rfc1035_unpackrv      s    FG
 -#]4<<Q?va!m"334555M)++,	  - >>r   messagec                L    t          j        dt          |                     | z   S )Nrn   )ro   packr   )rw   s    r   rfc1035_packrz      s    ;tS\\**W44r   datarJ   r   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   rn   r   i?  r   r   ra   )ro   unpack_from	read_namer0   r.   r2   )r{   rJ   labelsr6   pointersubnamerf   s          r   r   r      s    
 FfD=D  (tV<<Q?&HG"411JGQMM'"""aKFQ;;aKF!d6FVO34;;==>>>& 88FV##r   bufr
   c                v   t          |           dk     rg S d}t          j        d| d          d         }d|z   }g }|dz   |k    rut          j        d| |          d         }|dz  }| |||z            }||z  }|                    t	          j        |                                                     |dz   |k    u|S )z
    buf is the raw bytes of the ECHConfig vector:
      - 2-byte total length, then for each:
        - 2-byte cfg length + that many bytes of cfg
    We return a list of Base64 strings (one per config).
    r   rn   r   )r   ro   r   r0   base64	b64encoder.   )r   offtotalr<   outcfg_lencfgs          r   parse_echconfigsr      s     3xx!||	
CtS!,,Q/E
e)C
C
'S..$T344Q7q#g%&w

6#C((//11222 'S.. Jr   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             }	t                              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   rn   r   r   z!HHr   r   r   r
   c                    g }d}|t          |           k     r[| |         }|                    | |dz   |dz   |z                                                       |d|z   z  }|t          |           k     [|S )Nr   r   )r   r0   r.   )r   r   r5   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!   re   r5   paramss     r   rg   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   rg   z%parse_https_rdata.<locals>.<listcomp>(  s?       ./
6!9QRZ())  r   r'   r#   r(   ra   )r   r	   r   r   r   r   r   r   r   r
   )ro   r   r   r   getr1   r   )r   r   r   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  

1c 2 233H -C  r   )
r!   r@   rP   rY   r]   rl   rz   rv   rs   r   )r   r   r   r   )rA   r   rB   r   r   rC   )rQ   r   r   rR   )r^   r   r   r_   )rA   r   r   rR   )rA   r   r   rC   )rw   r   r   r   )r{   r   rJ   r   r   r|   r   )r   r   r   r   )
__future__r   r   r,   rU   ro   typingTYPE_CHECKING	TypedDictr   r!   r@   rP   rY   r]   rl   rs   rv   rz   r   r   r   __all__r   r   r   <module>r      s   " " " " " "     	     f&   	L 	L 	L 	L= = = =@: : : :z      Q Q Q Q- - - -&
 
 
 
5 5 5 5$ $ $ $0   ,- - - -`r   