a
    h!                     @  s   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d dlZej	rLe
dZddlmZmZmZ ddlmZ dd ZG d	d
 d
eZee ddddZdd
dddZd
dddZdd Zdd Zdd Zdd ZdS )    )annotationsNT   )
NO_DEFAULTremove_startformat_field)traverse_objc                  C  s   d} d}|  tj|  dS )NzhMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/{} Safari/537.36)      z.0.0.0)formatrandomrandint)ZUSER_AGENT_TMPLZCHROME_MAJOR_VERSION_RANGE r   L/mnt/pikpak/tmp/myenv/lib/python3.9/site-packages/yt_dlp/utils/networking.pyrandom_user_agent   s    r   c                      s  e Zd ZdZddddddZ fddZd	d
ddZddd fddZddd fddZdd
 fddZ	dd Z
dd
ddZdd
ddZddd fddZdd
 fdd Zdd
d!d"Zejdd#dd$d%Zejd&dd'd(d)d%Zef fd*d%	Zejdddd+d,Zejd&dd'd(d-d,Zef fd.d,	Zd/d
 fd0d1Zejdddd2d3Zejdddd4d3Zd9dd
 fd6d3Zdd
d7d8Z  ZS ):HTTPHeaderDictz
    Store and access keys case-insensitively.
    The constructor can take multiple dicts, in which keys in the latter are prioritised.

    Retains a case sensitive mapping of the headers, which can be accessed via `.sensitive()`.
    z
typing.Anyztyping.Self)argskwargsreturnc                 O  s"   t j| g|R i |}i |_|S N)dict__new___HTTPHeaderDict__sensitive_map)clsr   r   objr   r   r   r      s    zHTTPHeaderDict.__new__c                  s<   t    i | _td |D ]}| | q|r8| | d S r   )super__init__r   filterupdate)selfr   r   dct	__class__r   r   r   $   s    
zHTTPHeaderDict.__init__zdict[str, str])r   c                  s    fdd   D S )Nc                   s   i | ]\}} j | |qS r   )r   ).0keyvaluer   r   r   
<dictcomp>.   s   z,HTTPHeaderDict.sensitive.<locals>.<dictcomp>)itemsr&   r   r&   r   	sensitive-   s    
zHTTPHeaderDict.sensitivestrbool)r$   r   c                  s   t  t|tr| n|S r   )r   __contains__
isinstancer*   titler   r$   r!   r   r   r,   3   s    zHTTPHeaderDict.__contains__Nonec                  s    |  }| j|= t | d S r   )r.   r   r   __delitem__r/   r!   r   r   r1   6   s    zHTTPHeaderDict.__delitem__c                  s   t  | S r   )r   __getitem__r.   r/   r!   r   r   r2   ;   s    zHTTPHeaderDict.__getitem__c                C  s2   t |t| r| }t |tr.| | d S tS r   )r-   typer)   r   r   NotImplementedr   otherr   r   r   __ior__>   s    

zHTTPHeaderDict.__ior__c                C  s6   t |t| r| }t |tr2t| |  |S tS r   r-   r3   r)   r   r4   r5   r   r   r   __or__F   s
    
zHTTPHeaderDict.__or__c                C  s6   t |t| r| }t |tr2t| ||  S tS r   r8   r5   r   r   r   __ror__M   s
    
zHTTPHeaderDict.__ror__c                  s@   t |tr|d}| }|| j|< t |t|  d S )Nzlatin-1)	r-   bytesdecoder.   r   r   __setitem__r*   strip)r   r$   r%   Z	key_titler!   r   r   r=   T   s
    


zHTTPHeaderDict.__setitem__c                  s   | j   t   d S r   )r   clearr   r&   r!   r   r   r?   [   s    
zHTTPHeaderDict.clearc                C  s   t | |  S r   )r3   r)   r&   r   r   r   copy_   s    zHTTPHeaderDict.copyz
str | Nonec                C  s   d S r   r   r/   r   r   r   getb   s    zHTTPHeaderDict.getr   zstr | T)defaultr$   r   c                C  s   d S r   r   r   r$   rB   r   r   r   rA   e   s    c                  s*   |  }|tu rt |S t ||S r   )r.   r   r   rA   rC   r!   r   r   rA   h   s    c                C  s   d S r   r   r/   r   r   r   popn   s    zHTTPHeaderDict.popc                C  s   d S r   r   rC   r   r   r   rD   q   s    c                  sD   |  }|tu r(| j| t |S | j|| t ||S r   )r.   r   r   rD   r   rC   r!   r   r   rD   t   s    ztuple[str, str]c                   s   | j   t  S r   )r   popitemr   r&   r!   r   r   rE   |   s    
zHTTPHeaderDict.popitemc                C  s   d S r   r   r/   r   r   r   
setdefault   s    zHTTPHeaderDict.setdefaultc                C  s   d S r   r   rC   r   r   r   rF      s    Nc                  s2   |  }|| jv rt |S |p$d| |< | | S )N )r.   r   r   r2   rC   r!   r   r   rF      s
    
c                K  s   t |t| r| }t |tjjr@| D ]\}}|| |< q,n<t|drf| D ]}|| | |< qRn|D ]\}}|| |< qj| D ]\}}|| |< qd S )Nkeys)	r-   r3   r)   collectionsabcMappingr(   hasattrrH   )r   r6   r   r$   r%   r   r   r   r      s    

zHTTPHeaderDict.update)N)__name__
__module____qualname____doc__r   r   r)   r,   r1   r2   r7   r9   r:   r=   r?   r@   typingoverloadrA   r   rD   rE   rF   r   __classcell__r   r   r!   r   r      s<   	r   z?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8zen-us,en;q=0.5Znavigate)z
User-AgentAcceptzAccept-LanguagezSec-Fetch-Moder   )proxiesheadersc              	   C  s   | dd }|r |   || d< |  D ]\}}|dkrBd | |< q(|dkrLq(|d ur(ztj|d }W n ty~   Y q(Y n0 |d u rdt|d | |< dd	d
}||v r(tj	tj
|j|| d| |< q(d S )NzYtdl-Request-ProxyallZ__noproxy__nor   zhttp://z//Zsocks5hZsocks4)Zsocks5socks)scheme)rD   r?   r(   urllibrequest_parse_proxy
ValueErrorr   parse
urlunparseurlparse_replace)rU   rV   Z	req_proxy	proxy_key	proxy_urlproxy_schemeZreplace_schemer   r   r   clean_proxies   s0    
rf   rV   c                 C  s&   d| v r| d= d| d< |  dd  d S )NzYoutubedl-No-CompressionidentityzAccept-EncodingzYtdl-socks-proxy)rD   rg   r   r   r   clean_headers   s    ri   c                 C  s   g }|  d}|D ]0}|dkr"qq|dkr8|rB|  q|| q|d sd|rX|d rd|dd |d dv rz|d d|S )N/...r   rG   )rk   rl   )splitrD   appendinsertjoin)pathoutputsegmentssr   r   r   remove_dot_segments   s    


rv   c                 C  s   t j| dS )z4Escape non-ASCII characters as suggested by RFC 3986s   %/;:@&=+$,!~*'()?#[])r[   r_   quote)ru   r   r   r   escape_rfc3986   s    rx   c                 C  sN   t j| }|j|jddtt|j	t|j
t|jt|jd S )z&Normalize URL as suggested by RFC 3986idnaascii)netlocrr   paramsqueryfragment)r[   r_   ra   rb   r{   encoder<   rx   rv   rr   r|   r}   r~   geturl)urlZ
url_parsedr   r   r   normalize_url   s    r   c                 C  sd   t j| }d|v rR|jt|jdd }t j|d|d irBdS t j|rRdS t	||j
p^ddS )z'Unified proxy selector for all backendsrX   Nz:%shttprW   )r[   r_   ra   hostnamer   portr\   proxy_bypass_environmentproxy_bypassr   rZ   )r   rU   Zurl_componentshostportr   r   r   select_proxy   s    r   )
__future__r   rI   collections.abcr   rQ   urllib.parser[   urllib.requestTYPE_CHECKINGTypeVarr   _utilsr   r   r   Z	traversalr   r   r   r   Zstd_headersrf   ri   rv   rx   r   r   r   r   r   r   <module>   s2   
 
 