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ddlm	Z	m
Z
mZ ddlmZ ddl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 ddlmZ ddl m!Z! eshe"dd dl#Ze$e%e!ej&j&'dZ(e(dk rej&j& de_)e"dd dl*Zd dl+m,Z, d dl-Ze.e/ dej0j1j2_3W d   n1 sw   Y  G dd deZ4eG dd deZ5dS )    )annotationsN   )create_connectioncreate_socks_proxy_socketmake_socks_proxy_opts   )select_proxy)FeaturesResponseregister_rh)CertificateVerifyError	HTTPError
ProxyErrorRequestErrorSSLErrorTransportError)WebSocketRequestHandlerWebSocketResponse)
websockets)r   )int_or_nonezwebsockets is not installed.)   r   z (unsupported)z"Only websockets>=13.0 is supported)	parse_uric                      s:   e Zd Zd fddZ fddZdd Zd	d
 Z  ZS )WebsocketsResponseAdapterws'websockets.sync.client.ClientConnectionc                   s:   t  jt|jjp
d||jj|jj|jjd || _	d S )N    fpurlheadersstatusreason)
super__init__ioBytesIOresponsebodyr    status_codereason_phrase_ws)selfr   r   	__class__ Q/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/networking/_websockets.pyr$   8   s   
z"WebsocketsResponseAdapter.__init__c                   s   | j   t   d S N)r+   closer#   )r,   r-   r/   r0   r2   B   s   
zWebsocketsResponseAdapter.closec              
   C  s   z| j |W S  tjjttfy } zt|d|d }~w ty/ } zt	|d|d }~w t
y@ } zt|d|d }~ww Ncause)r+   sendr   
exceptionsWebSocketExceptionRuntimeErrorTimeoutErrorr   SocksProxyErrorr   	TypeErrorr   )r,   messageer/   r/   r0   r6   F   s   zWebsocketsResponseAdapter.sendc              
   C  s^   z| j  W S  ty } zt|d|d }~w tjjttfy. } zt	|d|d }~ww r3   )
r+   recvr;   r   r   r7   r8   r9   r:   r   )r,   r>   r/   r/   r0   r?   Q   s   zWebsocketsResponseAdapter.recv)r   r   )__name__
__module____qualname__r$   r2   r6   r?   __classcell__r/   r/   r-   r0   r   6   s
    
r   c                      s\   e Zd ZdZdZdZejejfZ	dZ
 fddZ fddZd	d
 Zdd Zdd Z  ZS )WebsocketsRHz~
    Websockets request handler
    https://websockets.readthedocs.io
    https://github.com/python-websockets/websockets
    )wssr   )socks4socks4asocks5socks5hr   c                   s|   t  j|i | i | _dD ]-}t|}tjtjd}|t	| j
 d || j|< || | jr;|tj qd S )N)zwebsockets.clientzwebsockets.server)streamz: %(message)s)r#   r$   _WebsocketsRH__logging_handlerslogging	getLoggerStreamHandlersysstdoutsetFormatter	FormatterRH_NAME
addHandlerverbosesetLevelDEBUG)r,   argskwargsnameloggerhandlerr-   r/   r0   r$   g   s   


zWebsocketsRH.__init__c                   s@   t  | |dd  |dd  |dd  |dd  d S )Ntimeout	cookiejar
legacy_sslkeep_header_casing)r#   _check_extensionspop)r,   
extensionsr-   r/   r0   ra   s   s
   zWebsocketsRH._check_extensionsc                 C  s(   | j  D ]\}}t|| qd S r1   )rK   itemsrL   rM   removeHandler)r,   rZ   r\   r/   r/   r0   r2   z   s   zWebsocketsRH.closec                 C  s6   d|vr|  |}||j}|r||d< d S d S d S )Ncookie)_get_cookiejarget_cookie_headerr   )r,   requestr    r^   cookie_headerr/   r/   r0   _prepare_headers   s   
zWebsocketsRH._prepare_headersc                 C  s  |  |}| |}t|j}| jr| jdfnd |d}t|j| |}zS|rFt|}td|d |d ft	
t|j|jf|d|}ntdd|j|jfi|}| j|jdd}	tjjj||j||d |jrl|	nd dd	}
t|
|jd
W S  ty } zt|d|d }~w tjjy } zt|d|d }~w tjy } zt|d|d }~w tjy } zt|d|d }~w tjj y } zt!t"t#$|j%j&|j|j%j'|j%j(|j%j)d|d }~w t*t+tjj,fy } zt-|d|d }~ww )Nr   )source_addressr]   addrport)address_create_socket_funcro   r_   )legacy_ssl_support)sockuriadditional_headersopen_timeoutuser_agent_headersslclose_timeout)r   r4   r   r/   )._calculate_timeout_get_headersr   r   rl   r   _get_proxiesr   r   	functoolspartialr   hostrn   _make_sslcontextrc   getr   syncclientconnectsecurer   r;   r   r7   
InvalidURIr   rw   SSLCertVerificationErrorr   r   InvalidStatusr   r
   r%   r&   r'   r(   r    r)   r*   OSErrorr:   r8   r   )r,   ri   r]   r    wsuricreate_conn_kwargsproxysocks_proxy_optionsrr   ssl_ctxconnr>   r/   r/   r0   _send   s~   



	zWebsocketsRH._send)r@   rA   rB   __doc___SUPPORTED_URL_SCHEMES_SUPPORTED_PROXY_SCHEMESr	   	ALL_PROXYNO_PROXY_SUPPORTED_FEATURESrS   r$   ra   r2   rk   r   rC   r/   r/   r-   r0   rD   [   s    rD   )6
__future__r   
contextlibr|   r%   rL   rw   rO   _helperr   r   r   utils.networkingr   commonr	   r
   r   r7   r   r   r   r   r   r   	websocketr   r   dependenciesr   socksr;   utilsr   ImportErrorwebsockets.versiontuplemapversionsplitwebsockets_version_yt_dlp__versionwebsockets.sync.clientwebsockets.urir   websockets.sync.connectionsuppress	Exceptionr   
connection
Connectionrecv_excr   rD   r/   r/   r/   r0   <module>   s>     %