o
    iW5                     @  s  U 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m	Z	 ddl
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u rce!de"e#e$e%dej&dd Z'e'dkrde'  krdk sn 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ddddeddddeddddedd ddedd!ddedd"ddedd#dded$ddded$d dded%d&d'd(ed%d)d'dd*edd+ddedd,d'd-edd.d'd-edd/d'd-edd0d'd-ed%d1d'd-ed%d2d3d2d4ed%d&d'd-ed%d)d'd-edd,d'd-edd.d'd-edd/d'd-edd0d'd-edd5d'd-edd5dd-edd6d'd7ed8d6d'd-ed%d9d'd7ed%d9d3d9d:d;ed8d<d'd-ied=d>d'd-ed%d?d'd7ed%d?d3d?edd@d'd7dAed%dBd'dCed%dBd3dBdDdEZ0dFe1dG< dHdIdJdKdLdMdNZ2edd6d'd7edd@d'd7hZ3eG dOdP dPee	Z4ee4dQdR Z5dS )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      z (unsupported)zFOnly curl_cffi versions 0.5.10 and 0.10.x through 0.14.x are supported)	CurlECodeCurlOptc                      s8   e Zd ZdddZdd Zddd	Z fd
dZ  ZS )CurlCFFIResponseReaderresponsecurl_cffi.requests.Responsec                 C  s    || _ | | _d| _d| _d S )N    r   )	_responseiter_content	_iterator_buffer
bytes_readselfr    r)   O/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/networking/_curlcffi.py__init__-   s   

zCurlCFFIResponseReader.__init__c                 C     dS )NTr)   r(   r)   r)   r*   readable3   s   zCurlCFFIResponseReader.readableNc                 C  s   d}zh| j r=|d u st| j|k r=t| j d }|d u rd | _ n|  j|7  _|  jt|7  _| j r=|d u st| j|k s|d u rFt| j}| jd | }| j|d  | _| j s_| js_|   d}|W |rj|   S S |rr|   w w )NTF)r$   lenr%   nextr&   close)r(   sizeexception_raisedchunkdatar)   r)   r*   read6   s.   


zCurlCFFIResponseReader.readc                   s$   | j s| j  d| _t   d S )Nr!   )closedr"   r1   r%   superr-   	__class__r)   r*   r1   P   s   
zCurlCFFIResponseReader.closer   r    N)__name__
__module____qualname__r+   r.   r6   r1   __classcell__r)   r)   r9   r*   r   ,   s
    

r   c                      s2   e Zd ZU de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)rB   headersurlstatus)r8   r+   r   rC   rD   status_coder'   r9   r)   r*   r+   Z   s   
z CurlCFFIResponseAdapter.__init__Nc              
   C  s   z| j |}| j jr|   |W S  tjjjyL } z,|jt	j
krB|jo-t|jjd}t| j j|d ur<|| j j nd |d|t|d|d }~ww )NzContent-Length)partialexpectedcauserI   )rB   r6   r7   r1   r   requestserrorsRequestsErrorcoder   PARTIAL_FILEr   r   rC   getr   r&   r   )r(   amtresecontent_lengthr)   r)   r*   r6   a   s$   zCurlCFFIResponseAdapter.readr;   r<   )r=   r>   r?   __annotations__r+   r6   r@   r)   r)   r9   r*   rA   W   s   
 rA   chrome99windows10android12100101104107110edgesafariz15.3macos11z15.5)chrome99chrome99_android	chrome100	chrome101	chrome104	chrome107	chrome110edge99edge101	safari153	safari15511611914120123124z17.0z17.2ios)	chrome116	chrome119	chrome120	chrome123	chrome124	safari170safari172_ios13113315firefoxz18.0)rn   ro   rx   ry   rz   r{   	chrome131chrome131_android
chrome133a
firefox133	safari180safari180_ios
firefox135135torz14.5z18.4136)tor145	safari184safari184_ios	chrome136z26.026)	safari260safari260_ios))r   r   )r      r   	   r   r      )r      z3dict[tuple[int, ...], dict[str, ImpersonateTarget]]BROWSER_TARGETS
safari15_3
safari15_5
safari17_0safari17_2_ios
safari18_0safari18_0_ios)rn   ro   r|   r}   r   r   c                      s   e Zd ZdZdZejejfZdZ	dd e
eejdd e D dd	 d
d D ZdddZ fddZd fddZdddZ  ZS )
CurlCFFIRHr   )httphttps)r   r   socks4socks4asocks5socks5hc                 C  sF   i | ]\}}|t d kr|nt dkrt||n	tjjt|| qS )r   r   )curl_cffi_version_TARGETS_COMPAT_LOOKUPrP   r   rK   BrowserType).0nametargetr)   r)   r*   
<dictcomp>   s    zCurlCFFIRH.<dictcomp>c                 c  s$    | ]\}}t |kr| V  qd S r<   )r   items)r   versiontargetsr)   r)   r*   	<genexpr>   s    zCurlCFFIRH.<genexpr>c                 C  sJ   | d t v| d jdvd| d j| d jrt| d jnd| d jfS )Nr   )rv   rZ   )r   ra   r   rb   rV   r   )_DEPRIORITIZED_TARGETSosindexclientr   float)xr)   r)   r*   <lambda>   s   
zCurlCFFIRH.<lambda>T)keyreverseNc                 C  s   t jj|dS )N)cookies)r   rK   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impersonater   timeout
legacy_ssl)r8   _check_extensionspop)r(   
extensionsr9   r)   r*   r      s
   zCurlCFFIRH._check_extensionsrequestr   returnr	   c              
     sP   |  |}zt |}W n ty  } z||jjd<  d }~ww ||jd< |S )Nr   )_get_request_targetr8   sendr   r   r   )r(   r   r   r   rS   r9   r)   r*   r      s   

zCurlCFFIRH.sendc                 C  s  d}| j d|jvr| |nd d}| jr|jtjd | |}d|v r6|jtj	|d  |
dd  t|j|d}|rz|jtj| tj|jj }|dkr]|jtjd |jtjt  | jsz|jtjd |jtjd | |}| jr|jtj| jd	  | jd
}| jd}	|r|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.yA } zM|j/t0j1krt2|d||j/t0j3kr	t4|d||j/t0j5krd}|j6}n!|j/t0jks+|j/t0j7kr1dt8|v r1t9|d|t:|d|W Y d }~nd }~ww t;|}d|j<  krSdk sZn t=||d|S )NFcookie)r   r   no)proxiesr   r   client_certificateclient_certificate_keyclient_certificate_passwordr   T)
methodrD   rC   r5   verifymax_redirectsr   r   	interfacestreamrJ   CONNECT   i,  )redirect_loop)>_get_instancerC   _get_cookiejarverbosecurlsetoptr   VERBOSE_get_proxiesNOPROXYr   r   rD   PROXYurllibparseurlparseschemelowerHTTPPROXYTUNNELPROXY_CAINFOr   wherer   PROXY_SSL_VERIFYPEERPROXY_SSL_VERIFYHOST_get_impersonate_headers_client_certSSLCERTrP   SSLKEY	KEYPASSWD_calculate_timeoutLOW_SPEED_LIMITLOW_SPEED_TIMEmathceilr   r   r5   !_SUPPORTED_IMPERSONATE_TARGET_MAPr   source_addressr   rK   rL   rM   rN   r   PEER_FAILED_VERIFICATIONr   SSL_CONNECT_ERRORr   TOO_MANY_REDIRECTSr   
RECV_ERRORstrr   r   rA   rE   r   )r(   r   max_redirects_exceededsessionr   proxyr   rC   r   r   r   curl_responserS   r   r)   r)   r*   _send   s   



zCurlCFFIRH._sendr<   )r   r   r   r	   )r   r   )r=   r>   r?   RH_NAME_SUPPORTED_URL_SCHEMESr   NO_PROXY	ALL_PROXY_SUPPORTED_FEATURES_SUPPORTED_PROXY_SCHEMESdictsorted	itertoolschainfrom_iterabler   r   r   r   r   r   r   r@   r)   r)   r9   r*   r      s$    
	
r   c                 C  r,   )Nir)   )rhr   r)   r)   r*   curl_cffi_preferenceK  s   r  )6
__future__r   ior  r   reurllib.parser   _helperr   utils.networkingr   commonr   r   r	   r
   r   
exceptionsr   r   r   r   r   r   r   r   r   dependenciesr   r   utilsr   ImportErrortuplemapintsplit__version__r   _yt_dlp__versioncurl_cffi.requestscurl_cffi.constr   r   IOBaser   rA   r   rU   r   r   r   r  r)   r)   r)   r*   <module>   s      +
7 