U
    gv                  	   @  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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se!dd dl"Ze#e$e ej%j%&dZ'e'dk re!dd dl(Zd dl)m*Z* d dl+Ze,e- dej.j/j0_1W 5 Q R X G dd deZ2eG dd deZ3d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"Only websockets>=13.0 is supported)	parse_uric                      s>   e Zd Zdd fddZ fddZdd Zd	d
 Z  ZS )WebsocketsResponseAdapterz'websockets.sync.client.ClientConnection)wsc                   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__ A/tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/networking/_websockets.pyr#   7   s    z"WebsocketsResponseAdapter.__init__c                   s   | j   t   d S N)r*   closer"   )r+   r,   r.   r/   r1   A   s    
zWebsocketsResponseAdapter.closec              
   C  s   z| j |W S  tjjttfk
rF } zt|d|W 5 d }~X Y nZ tk
rr } zt	|d|W 5 d }~X Y n. t
k
r } zt|d|W 5 d }~X Y nX d S Ncause)r*   sendr   
exceptionsWebSocketExceptionRuntimeErrorTimeoutErrorr   SocksProxyErrorr   	TypeErrorr   )r+   messageer.   r.   r/   r5   E   s    zWebsocketsResponseAdapter.sendc              
   C  sv   z| j  W S  tk
r: } zt|d|W 5 d }~X Y n8 tjjttfk
rp } zt	|d|W 5 d }~X Y nX d S r2   )
r*   recvr:   r   r   r6   r7   r8   r9   r   )r+   r=   r.   r.   r/   r>   P   s    zWebsocketsResponseAdapter.recv)__name__
__module____qualname__r#   r1   r5   r>   __classcell__r.   r.   r,   r/   r   5   s   
r   c                      sT   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  ZS )WebsocketsRHz~
    Websockets request handler
    https://websockets.readthedocs.io
    https://github.com/python-websockets/websockets
    )wssr   )Zsocks4Zsocks4aZsocks5Zsocks5hr   c                   sx   t  j|| i | _dD ]Z}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.   r/   r#   f   s    


zWebsocketsRH.__init__c                   s4   t  | |dd  |dd  |dd  d S )Ntimeout	cookiejar
legacy_ssl)r"   _check_extensionspop)r+   
extensionsr,   r.   r/   r[   r   s    zWebsocketsRH._check_extensionsc                 C  s(   | j  D ]\}}t|| q
d S r0   )rF   itemsrG   rH   removeHandler)r+   rU   rW   r.   r.   r/   r1   x   s    zWebsocketsRH.closec                 C  sv  |  |}| |j}d|kr@| |}||j}|r@||d< t|j}| jrZ| jdfnd |d}t|j| 	|}z|rt
|}	tf |	d |	d ftt|j|jf|	d|}
ntf d|j|jfi|}
| j|jdd	}tjjj|
|j||d |jr|nd dd
}t||jdW S  tk
rP } zt|d|W 5 d }~X Y n" tjjk
r } zt|d|W 5 d }~X Y n tj k
r } zt!|d|W 5 d }~X Y n tj"k
r } zt"|d|W 5 d }~X Y n tjj#k
r8 } z4t$t%t&'|j(j)|j|j(j|j(j*|j(j+d|W 5 d }~X Y n: t,t-tjj.fk
rp } zt/|d|W 5 d }~X Y nX d S )Ncookier   )source_addressrX   addrport)addressZ_create_socket_funcrd   rZ   )Zlegacy_ssl_support)sockuriZadditional_headersZopen_timeoutZuser_agent_headersslZclose_timeout)r   r3   r   )0Z_calculate_timeoutZ_merge_headersr   Z_get_cookiejarget_cookie_headerr   r   ra   r   Z_get_proxiesr   r   	functoolspartialr   hostrc   Z_make_sslcontextr]   getr   syncclientconnectsecurer   r:   r   r6   Z
InvalidURIr   rg   SSLCertVerificationErrorr   r   ZInvalidStatusr   r	   r$   r%   r&   r'   r(   r)   OSErrorr9   r7   r   )r+   requestrX   r   rY   cookie_headerZwsuriZcreate_conn_kwargsproxyZsocks_proxy_optionsre   Zssl_ctxconnr=   r.   r.   r/   _send~   s~    


 
 
	zWebsocketsRH._send)r?   r@   rA   __doc__Z_SUPPORTED_URL_SCHEMESZ_SUPPORTED_PROXY_SCHEMESr   Z	ALL_PROXYZNO_PROXYZ_SUPPORTED_FEATURESrN   r#   r[   r1   rw   rB   r.   r.   r,   r/   rC   Z   s   rC   )4
__future__r   
contextlibri   r$   rG   rg   rJ   Z_helperr   r   r   r   commonr   r	   r
   r6   r   r   r   r   r   r   Z	websocketr   r   Zdependenciesr   socksr:   utilsr   ImportErrorZwebsockets.versiontuplemapversionsplitZwebsockets_versionZwebsockets.sync.clientZwebsockets.urir   Zwebsockets.sync.connectionsuppress	Exceptionrm   
connection
ConnectionZrecv_excr   rC   r.   r.   r.   r/   <module>   s6    %