a
    hk                     @  s   d dl mZ d dlZd dlmZ d dlmZ d dlmZ ddl	m
Z
mZmZ ddlmZ d	d
lmZ d	dlmZmZ d	dlmZmZ edddG dd dZG dd de
eZeedd ZdS )    )annotationsN)ABC)	dataclass)Any   )RequestHandlerregister_preferenceRequest)UnsupportedRequest   )NoneType)classpropertyjoin_nonempty)std_headersHTTPHeaderDictT)orderfrozenc                   @  sr   e Zd ZU dZdZded< dZded< dZded< dZded< dd	 Z	d d
ddZ
dd Zedd
ddZdS )ImpersonateTargeta<  
    A target for browser impersonation.

    Parameters:
    @param client: the client to impersonate
    @param version: the client version to impersonate
    @param os: the client OS to impersonate
    @param os_version: the client OS version to impersonate

    Note: None is used to indicate to match any.

    Nz
str | Noneclientversionos
os_versionc                 C  s,   | j r| jstd| jr(| js(tdd S )Nz$client is required if version is setz#os is required if os_version is set)r   r   
ValueErrorr   r   self r   R/mnt/pikpak/tmp/myenv/lib/python3.9/site-packages/yt_dlp/networking/impersonate.py__post_init__"   s    zImpersonateTarget.__post_init__targetc                 C  s   t |tsdS | jd u s.|jd u s.| j|jko| jd u sN|jd u sN| j|jko| jd u sn|jd u sn| j|jko| jd u p|jd u p| j|jkS )NF)
isinstancer   r   r   r   r   r   r   r   r   r   __contains__(   s    
 zImpersonateTarget.__contains__c                 C  s(   t | j| j dt | j| j dS )N:)r   r   r   r   r   rstripr   r   r   r   __str__2   s    zImpersonateTarget.__str__strc                 C  s2   t d|}|s td| d| f i | S )Nze(?:(?P<client>[^:-]+)(?:-(?P<version>[^:-]+))?)?(?::(?:(?P<os>[^:-]+)(?:-(?P<os_version>[^:-]+))?)?)?zInvalid impersonate target "")re	fullmatchr   	groupdict)clsr   Zmobjr   r   r   from_str5   s    zImpersonateTarget.from_str)__name__
__module____qualname____doc__r   __annotations__r   r   r   r   r"   r%   classmethodr,   r   r   r   r   r      s   

r   c                      s   e Zd ZU dZi Zded< dddd fddZdd	d
dZ fddZ fddZ	dd	ddZ
eddddZdd	ddZdd Zdddddd Zdd!d"d#d$Z  ZS )%ImpersonateRequestHandlera<  
    Base class for request handlers that support browser impersonation.

    This provides a method for checking the validity of the impersonate extension,
    which can be used in _check_extensions.

    Impersonate targets consist of a client, version, os and os_ver.
    See the ImpersonateTarget class for more details.

    The following may be defined:
     - `_SUPPORTED_IMPERSONATE_TARGET_MAP`: a dict mapping supported targets to custom object.
                Any Request with an impersonate target not in this list will raise an UnsupportedRequest.
                Set to None to disable this check.
                Note: Entries are in order of preference

    Parameters:
    @param impersonate: the default impersonate target to use for requests.
                        Set to None to disable impersonation.
    zdict[ImpersonateTarget, Any]!_SUPPORTED_IMPERSONATE_TARGET_MAPN)impersonater   c                  s   t  jf i | || _d S N)super__init__r5   )r   r5   kwargs	__class__r   r   r8   S   s    z"ImpersonateRequestHandler.__init__r   c                 C  s@   t |ttfsJ |d u s | js$d S | |s<td| d S )Nz Unsupported impersonate target: )r    r   r   supported_targetsis_supported_targetr
   r!   r   r   r   _check_impersonate_targetW   s
    
z3ImpersonateRequestHandler._check_impersonate_targetc                   s(   t  | d|v r$| |d d S )Nr5   )r7   _check_extensionsr>   get)r   
extensionsr:   r   r   r?   ^   s    z+ImpersonateRequestHandler._check_extensionsc                   s   t  | | | j d S r6   )r7   	_validater>   r5   r   requestr:   r   r   rB   c   s    z#ImpersonateRequestHandler._validatezImpersonateTarget | Nonec                 C  sP   |du rdS | j D ]8}||v r| jrB| j| j d| d|  |  S qdS )z'Resolve a target to a supported target.Nz: resolved impersonate target z to )r<   verboseZ_loggerstdoutZRH_NAME)r   r   Zsupported_targetr   r   r   _resolve_targetg   s    
z)ImpersonateRequestHandler._resolve_targetztuple[ImpersonateTarget, ...])returnc                 C  s   t | j S r6   )tupler4   keys)r+   r   r   r   r<   r   s    z+ImpersonateRequestHandler.supported_targetsc                 C  s   t |tsJ | |d uS r6   )r    r   rG   r!   r   r   r   r=   v   s    z-ImpersonateRequestHandler.is_supported_targetc                 C  s   |  |jdp| jS )z(Get the requested target for the requestr5   )rG   rA   r@   r5   rC   r   r   r   _get_request_targetz   s    z-ImpersonateRequestHandler._get_request_targetr	   r   None)rD   headersrH   c                 C  s   dS )zAdditional operations to prepare headers before building. To be extended by subclasses.
        @param request: Request object
        @param headers: Merged headers to prepare
        Nr   )r   rD   rM   r   r   r   _prepare_impersonate_headers~   s    z6ImpersonateRequestHandler._prepare_impersonate_headerszdict[str, str])rD   rH   c                 C  sl   |  |j}| |durDt D ] \}}|||kr"|| q"| || |jdrd|	 S t
|S )z
        Get headers for external impersonation use.
        Subclasses may define a _prepare_impersonate_headers method to modify headers after merge but before building.
        NZkeep_header_casing)Z_merge_headersrM   rK   r   itemsr@   poprN   rA   Z	sensitivedict)r   rD   rM   kvr   r   r   _get_impersonate_headers   s    z2ImpersonateRequestHandler._get_impersonate_headers)r-   r.   r/   r0   r4   r1   r8   r>   r?   rB   rG   r   r<   r=   rK   rN   rT   __classcell__r   r   r:   r   r3   =   s   
r3   c                 C  s   |j ds| jrdS dS )Nr5   i  r   )rA   r@   r5   )ZrhrD   r   r   r   impersonate_preference   s    rV   )
__future__r   r(   abcr   Zdataclassesr   typingr   commonr   r   r	   
exceptionsr
   Zcompat.typesr   utilsr   r   Zutils.networkingr   r   r   r3   rV   r   r   r   r   <module>   s   
-Z