U
    g*                     @  sp  d dl mZ d dlZd dlZd dlZd dlZddlmZm	Z	 ddl
mZmZmZmZmZ ddlmZmZmZmZmZmZ ddlmZmZ dd	lmZmZ dd
lmZ edkrede e!e"e#dej$dd Z%e%dkrde%  krdk sn ej$ de_&edd dl'Zd dl(m)Z)m*Z* G dd dej+Z,G dd deZ-eG dd deeZ.ee.dd Z/dS )    )annotationsN   )InstanceStoreMixinselect_proxy)FeaturesRequestResponseregister_preferenceregister_rh)CertificateVerifyError	HTTPErrorIncompleteRead
ProxyErrorSSLErrorTransportError)ImpersonateRequestHandlerImpersonateTarget   )	curl_cfficertifi)int_or_nonezcurl_cffi is not installedz[^\d]+   )r      
   r      r   )r   r   r   z (unsupported)z=Only curl_cffi versions 0.5.10, 0.7.0 and 0.7.1 are supported)	CurlECodeCurlOptc                      s<   e Zd ZddddZdd Zddd	Z fd
dZ  ZS )CurlCFFIResponseReadercurl_cffi.requests.Responseresponsec                 C  s    || _ | | _d| _d| _d S )N    r   )	_responseiter_content	_iterator_buffer
bytes_readselfr!    r*   ?/tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/networking/_curlcffi.py__init__+   s    
zCurlCFFIResponseReader.__init__c                 C  s   dS )NTr*   r)   r*   r*   r+   readable1   s    zCurlCFFIResponseReader.readableNc                 C  s   d}z| jr`|d ks"t| j|k r`t| jd }|d kr>d | _q`|  j|7  _|  jt|7  _q|d krrt| j}| jd | }| j|d  | _| js| js|    d}|W S |r|    X d S )NTF)closer%   lenr&   nextr'   )r)   sizeZexception_raisedchunkdatar*   r*   r+   read4   s&    
zCurlCFFIResponseReader.readc                   s$   | j s| j  d| _t   d S )Nr"   )closedr#   r/   r&   superr-   	__class__r*   r+   r/   N   s    
zCurlCFFIResponseReader.close)N)__name__
__module____qualname__r,   r.   r5   r/   __classcell__r*   r*   r8   r+   r   *   s   
r   c                      s6   e Zd ZU ded< dd fddZd
dd	Z  ZS )CurlCFFIResponseAdapterr   fpr   r    c                   s"   t  jt||j|j|jd d S )N)r?   headersurlstatus)r7   r,   r   r@   rA   status_coder(   r8   r*   r+   r,   X   s    z CurlCFFIResponseAdapter.__init__Nc              
   C  s   z| j |W S  tjjjk
r } zV|jtjkrlt	|j
jd}t| j j|d k	r`|| j j nd |d|t|d|W 5 d }~X Y nX d S )NzContent-Length)partialexpectedcauserF   )r?   r5   r   requestserrorsRequestsErrorcoder   ZPARTIAL_FILEr   r!   r@   getr   r'   r   )r)   amtecontent_lengthr*   r*   r+   r5   _   s    zCurlCFFIResponseAdapter.read)N)r:   r;   r<   __annotations__r,   r5   r=   r*   r*   r8   r+   r>   U   s   
r>   c                      s  e Zd ZdZdZejejfZdZ	e
dkreddddejjjedd	ddejjjedd
ddejjjeddddejjjeddddejjjini eddddejjjeddddejjjeddddejjjeddddejjjeddddejjjeddddejjjeddddejjjeddddejjjie
dkrVeddddejjjini eddddejjjeddddejjjeddddejjjie
dkreddddejjj ini Z!d,d d!Z" fd"d#Z#d$d%d& fd'd(Z$d$d)d*d+Z%  Z&S )-
CurlCFFIRHr   )httphttps)rR   rS   Zsocks4Zsocks4aZsocks5Zsocks5hr   ZchromeZ124ZmacosZ14Z123Z120Z119Z116Zwindows10Z110Z107Z104Z101Z100Z99ZedgeZsafariz17.0z15.5Z12z15.3Z11Zandroidz17.2ZiosNc                 C  s   t jj|dS )N)cookies)r   rH   Session)r)   	cookiejarr*   r*   r+   _create_instance   s    zCurlCFFIRH._create_instancec                   s@   t  | |dd  |dd  |dd  |dd  d S )NimpersonaterW   timeoutZ
legacy_ssl)r7   _check_extensionspop)r)   
extensionsr8   r*   r+   r[      s
    zCurlCFFIRH._check_extensionsr   r   )requestreturnc              
     sZ   |  |}zt |}W n0 tk
rJ } z||jjd<  W 5 d }~X Y nX ||jd< |S )NrY   )_get_request_targetr7   sendr   r!   r]   )r)   r^   targetr!   rN   r8   r*   r+   ra      s    

zCurlCFFIRH.send)r^   c                 C  s  d}| j d|jkr| |nd d}| jr:|jtjd | |}d|krl|jtj	|d  |
dd  t|j|d}|r|jtj| tj|jj }|dkr|jtjd |jtjt  | js|jtjd |jtjd | |}| jr`|jtj| jd	  | jd
}| jd}	|rJ|jtj| |	r`|jtj|	 |  |}
|jtj!d |jtj"t#$|
 z>|j%|j&|j||j'| jd|
|
f| j(| )|| j*dd
}W n t+j,j-j.k
r } z|j/t0j1krt2|d|nz|j/t0j3kr t4|d|n^|j/t0j5kr:d}|j6}nD|j/t0jksd|j/t0j7krrdt8|krrt9|d|nt:|d|W 5 d }~X Y nX t;|}d|j<  krdk sn t=||d|S )NFcookie)rW   r   no)proxiesrR   r   Zclient_certificateclient_certificate_keyclient_certificate_passwordr   T)
methodrA   r@   r4   verifymax_redirectsrZ   rY   Z	interfacestreamrG   ZCONNECT   i,  )Zredirect_loop)>Z_get_instancer@   Z_get_cookiejarverboseZcurlZsetoptr   VERBOSEZ_get_proxiesZNOPROXYr\   r   rA   ZPROXYurllibparseurlparseschemelowerZHTTPPROXYTUNNELZPROXY_CAINFOr   whereri   ZPROXY_SSL_VERIFYPEERZPROXY_SSL_VERIFYHOSTZ_get_impersonate_headersZ_client_certZSSLCERTrL   ZSSLKEYZ	KEYPASSWDZ_calculate_timeoutZLOW_SPEED_LIMITZLOW_SPEED_TIMEmathceilr^   rh   r4   !_SUPPORTED_IMPERSONATE_TARGET_MAPr`   source_addressr   rH   rI   rJ   rK   r   ZPEER_FAILED_VERIFICATIONr   ZSSL_CONNECT_ERRORr   ZTOO_MANY_REDIRECTSr!   Z
RECV_ERRORstrr   r   r>   rB   r   )r)   r^   Zmax_redirects_exceededsessionre   proxyrr   r@   rf   rg   rZ   Zcurl_responserN   r!   r*   r*   r+   _send   s    






zCurlCFFIRH._send)N)'r:   r;   r<   ZRH_NAMEZ_SUPPORTED_URL_SCHEMESr   ZNO_PROXYZ	ALL_PROXYZ_SUPPORTED_FEATURESZ_SUPPORTED_PROXY_SCHEMEScurl_cffi_versionr   r   rH   ZBrowserTypeZ	chrome124Z	chrome123Z	chrome120Z	chrome119Z	chrome116Z	chrome110Z	chrome107Z	chrome104Z	chrome101Z	chrome100Zchrome99Zedge101Zedge99Z
safari17_0Z
safari15_5Z
safari15_3Zchrome99_androidZsafari17_2_iosrw   rX   r[   ra   r|   r=   r*   r*   r8   r+   rQ   l   sv                     
	
rQ   c                 C  s   dS )Nir*   )Zrhr^   r*   r*   r+   curl_cffi_preference  s    r~   )0
__future__r   ioru   reurllib.parsero   Z_helperr   r   commonr   r   r   r	   r
   
exceptionsr   r   r   r   r   r   rY   r   r   Zdependenciesr   r   utilsr   ImportErrortuplemapintsplit__version__r}   Z_yt_dlp__versionZcurl_cffi.requestsZcurl_cffi.constr   r   IOBaser   r>   rQ   r~   r*   r*   r*   r+   <module>   s2     "+ 