o
    i!                     @  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	r&e
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Z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)USER_AGENT_TMPLCHROME_MAJOR_VERSION_RANGE r   K/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/utils/networking.pyrandom_user_agent   s   r   c                      sH  e Zd ZdZd:ddZ fd	d
Zd;ddZd< fddZd= fddZd> fddZ	dd Z
d?ddZd?ddZd= fddZd@ fd d!Zd?d"d#ZejdAd%d&ZejdBd*d&Zef fd+d&	ZejdCd,d-ZejdBd.d-Zef fd/d-	ZdD fd1d2ZejdCd3d4ZejdCd5d4ZdEd> fd7d4Zd@d8d9Z  ZS )F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()`.
    args
typing.Anykwargsreturntyping.Selfc                 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|r| | d S d S r   )super__init__r   filterupdate)selfr   r   dct	__class__r   r   r    $   s   
zHTTPHeaderDict.__init__dict[str, str]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.sensitiver)   strboolc                  s    t  t|tr| S |S r   )r   __contains__
isinstancer/   titler#   r)   r%   r   r   r1   3   s    zHTTPHeaderDict.__contains__Nonec                  s    |  }| j|= t | d S r   )r3   r   r   __delitem__r4   r%   r   r   r6   6   s   zHTTPHeaderDict.__delitem__c                  s   t  | S r   )r   __getitem__r3   r4   r%   r   r   r7   ;      zHTTPHeaderDict.__getitem__c                C  s2   t |t| r| }t |tr| | d S tS r   )r2   typer.   r   r"   NotImplementedr#   otherr   r   r   __ior__>   s   

zHTTPHeaderDict.__ior__c                C  s6   t |t| r| }t |trt| |  |S tS r   r2   r9   r.   r   r:   r;   r   r   r   __or__F   
   
zHTTPHeaderDict.__or__c                C  s6   t |t| r| }t |trt| ||  S tS r   r>   r;   r   r   r   __ror__M   r@   zHTTPHeaderDict.__ror__c                  s@   t |tr
|d}| }|| j|< t |t|  d S )Nzlatin-1)	r2   bytesdecoder3   r   r   __setitem__r/   strip)r#   r)   r*   	key_titler%   r   r   rD   T   s
   


zHTTPHeaderDict.__setitem__c                  s   | j   t   d S r   )r   clearr   r+   r%   r   r   rG   [   s   
zHTTPHeaderDict.clearc                C  s   t | |  S r   )r9   r.   r+   r   r   r   copy_   r8   zHTTPHeaderDict.copy
str | Nonec                C     d S r   r   r4   r   r   r   getb      zHTTPHeaderDict.getdefaultr   str | Tc                C  rJ   r   r   r#   r)   rM   r   r   r   rK   e   rL   c                  s*   |  }|tu rt |S t ||S r   )r3   r   r   rK   rO   r%   r   r   rK   h   s   c                C  rJ   r   r   r4   r   r   r   popn   rL   zHTTPHeaderDict.popc                C  rJ   r   r   rO   r   r   r   rP   q   rL   c                  sD   |  }|tu r| j| t |S | j|| t ||S r   )r3   r   r   rP   r   rO   r%   r   r   rP   t   s   tuple[str, str]c                   s   | j   t  S r   )r   popitemr   r+   r%   r   r   rR   |   s   

zHTTPHeaderDict.popitemc                C  rJ   r   r   r4   r   r   r   
setdefault   rL   zHTTPHeaderDict.setdefaultc                C  rJ   r   r   rO   r   r   r   rS      rL   Nc                  s2   |  }|| jv rt |S |pd| |< | | S )N )r3   r   r   r7   rO   r%   r   r   rS      s
   
c                K  s   t |t| r| }t |tjjr | D ]\}}|| |< qnt|dr3| D ]}|| | |< q)n|D ]\}}|| |< q5| D ]\}}|| |< qBd S )Nkeys)	r2   r9   r.   collectionsabcMappingr-   hasattrrU   )r#   r<   r   r)   r*   r   r   r   r"      s   



zHTTPHeaderDict.update)r   r   r   r   r   r   )r   r'   )r)   r/   r   r0   )r)   r/   r   r5   )r   r/   )r   r   )r   r5   )r)   r/   r   rI   )rM   r   r)   r/   r   rN   )r)   r/   r   r/   )r   rQ   r   )__name__
__module____qualname____doc__r   r    r.   r1   r6   r7   r=   r?   rA   rD   rG   rH   typingoverloadrK   r   rP   rR   rS   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.5navigate)z
User-AgentAcceptzAccept-LanguagezSec-Fetch-Modeproxiesr   headersc              	   C  s   | dd }|r|   || d< |  D ]R\}}|dkr!d | |< q|dkr&q|d urfz
tj|d }W n	 ty=   Y qw |d u rKdt|d | |< dd	d
}||v rftj	tj
|j|| d| |< qd S )NzYtdl-Request-Proxyall__noproxy__nor   zhttp://z//socks5hsocks4)socks5socks)scheme)rP   rG   r-   urllibrequest_parse_proxy
ValueErrorr   parse
urlunparseurlparse_replace)rc   rd   	req_proxy	proxy_key	proxy_urlproxy_schemereplace_schemer   r   r   clean_proxies   s6   rz   c                 C  s&   d| v r| d= d| d< |  dd  d S )NzYoutubedl-No-CompressionidentityzAccept-EncodingzYtdl-socks-proxy)rP   )rd   r   r   r   clean_headers   s   r|   c                 C  s   g }|  d}|D ]}|dkrq	|dkr|r|  q	|| q	|d s1|r+|d r1|dd |d dv r<|d d|S )N/...r   rT   )r~   r   )splitrP   appendinsertjoin)pathoutputsegmentssr   r   r   remove_dot_segments   s   


r   c                 C  s   t j| dS )z4Escape non-ASCII characters as suggested by RFC 3986s   %/;:@&=+$,!~*'()?#[])rm   rq   quote)r   r   r   r   escape_rfc3986   s   r   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)netlocr   paramsqueryfragment)rm   rq   rs   rt   r   encoderC   r   r   r   r   r   r   geturl)url
url_parsedr   r   r   normalize_url   s   r   c                 C  sd   t j| }d|v r)|jt|jdd }t j|d|d ir!dS t j|r)dS t	||j
p/ddS )z'Unified proxy selector for all backendsrg   Nz:%shttpre   )rm   rq   rs   hostnamer   portrn   proxy_bypass_environmentproxy_bypassr   rl   )r   rc   url_componentshostportr   r   r   select_proxy   s   r   )rc   r   rd   r   )rd   r   )
__future__r   rV   collections.abcr   r^   urllib.parserm   urllib.requestTYPE_CHECKINGTypeVarr   _utilsr   r   r   	traversalr   r   r   r   std_headersrz   r|   r   r   r   r   r   r   r   r   <module>   s4    
 


 