o
    .j.                     @  s   d dl mZ d dlZejrddlmZ d dlmZmZ d dl	m
Z
mZmZmZmZmZmZ d dlmZ d dlmZ dd	lmZ ddlmZ dd
lmZ ddlmZ G dd deZG dd deZdS )    )annotationsN   )AsyncHTTPResponse)ConnectionTypeWSConnection)AcceptConnectionBytesMessageCloseConnectionPingPongRequestTextMessage)PerMessageDeflate)ProtocolError)HttpVersion)UnavailableTraffic   )AsyncExtensionFromHTTPc                      s   e Zd Zd% fddZed&ddZed'd	d
Zd( fddZd)ddZd%ddZ	d*ddZ
d+ddZd%ddZed,d d!Zed-d#d$Z  ZS ).AsyncWebSocketExtensionFromHTTPreturnNonec                   s&   t    ttj| _d | _d| _d S )NF)super__init__r   r   CLIENT	_protocol_request_headers_remote_shutdown)self	__class__ \/home/thesage/.local/lib/python3.10/site-packages/urllib3/contrib/webextensions/_async/ws.pyr      s   

z(AsyncWebSocketExtensionFromHTTP.__init__set[HttpVersion]c                   C  s   t jhS N)r   h11r    r    r    r!   supported_svn"      z-AsyncWebSocketExtensionFromHTTP.supported_svnstrc                   C     dS )Nwsprotor    r    r    r    r!   implementation&      z.AsyncWebSocketExtensionFromHTTP.implementationresponser   c              
     s   t  |I d H  d}|d7 }|jd}|d u rtd|| d 7 }d|jv r9|d|jd  d 7 }|d7 }z| j| W n tyT } zt|d }~ww t	| j
 }t|tsetdd S )	NsK   HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
s   Sec-Websocket-Accept: zSec-Websocket-AcceptzoThe WebSocket HTTP extension requires 'Sec-Websocket-Accept' header in the server response but was not present.   
zsec-websocket-extensionss   Sec-Websocket-Extensions: zKThe WebSocket state-machine did not pass the handshake phase when expected.)r   startheadersgetr   encoder   receive_dataWebSocketProtocolErrornextevents
isinstancer   RuntimeError)r   r,   fake_http_responseaccept_tokeneeventr   r    r!   r.   *   s>   

z%AsyncWebSocketExtensionFromHTTP.starthttp_versionr   dict[str, str]c           	   
   C  s   | j dur| j S z| jtddt fd}W n ty& } zt|d}~ww |ddd }i }|D ]}| d\}}|||	 < q4|t
jkrY|d	= |d
= d|d< d|d< || _ |S )zHSpecific HTTP headers required (request) before the 101 status response.Nzexample.com/)hosttarget
extensionsr-      z: upgrade
connection	websocketz	:protocolCONNECTz:method)r   r   sendr   r   r3   r   splitdecodelowerr   r$   )	r   r<   raw_data_to_socketr:   raw_headersrequest_headers
raw_headerkvr    r    r!   r/   O   s0   


z'AsyncWebSocketExtensionFromHTTP.headersc                   s<  | j dur|| jduryza| j| j4 I dH I | jdu r=z| jtd}| j |I dH  W n t	t
tfy<   Y nw z
| j  I dH  W n t
tfyR   Y nw d| _ W d  I dH  n1 I dH sfw   Y  W n tyx   d| _ Y nw d| _ | jdur| jdur| j| j n| j I dH  d| _d| _dS )z"End/Notify close for sub protocol.NFr   )_dsa_police_officerborrow	_responser   r   rH   r	   sendallr3   OSErrorAssertionErrorcloser   forget)r   data_to_sendr    r    r!   rY   n   s@   


(



z%AsyncWebSocketExtensionFromHTTP.closestr | bytes | Nonec           	        s  | j du s| jdu s| jdu rtdg }g }| j| j4 I dH W z| j D ]}t|trc|j	rG|sG|j
  W W  d  I dH  S ||j
 |j	rbd|  W W  d  I dH  S q+t|tr|j	r}|s}|j
  W W  d  I dH  S ||j
 |j	rd|  W W  d  I dH  S q+t|trd| _|  I dH   W W d  I dH  dS t|trz
| j| }W n ty } z
|  I dH  t|d}~ww |  4 I dH  | j |I dH  W d  I dH  n1 I dH sw   Y  q+W n ty } z
|  I dH  t|d}~ww 	 |  4 I dH  | j dI dH \}}}W d  I dH  n1 I dH sDw   Y  z| j| W n tyh } z
|  I dH  t|d}~ww z| j D ]}t|tr|j	r|s|j
  W W  d  I dH  S ||j
 |j	rd|  W W  d  I dH  S qot|tr|j	r|s|j
  W W  d  I dH  S ||j
 |j	rd|  W W  d  I dH  S qot|trd| _|  I dH   W W d  I dH  dS t|trVz
| j| }W n ty+ } z
|  I dH  t|d}~ww |  4 I dH  | j |I dH  W d  I dH  n1 I dH sOw   Y  qot|tr^qoqoW n tyx } z
|  I dH  t|d}~ww q1 I dH sw   Y  dS )z5Unpack the next received message/payload from remote.N-The HTTP extension is closed or uninitialized     T)rR   rU   rS   rW   rT   r   r5   r6   r   message_finisheddataappendjoinr   r	   r   rY   r
   rH   r,   r3   r   _write_error_catcherrV   rX   _read_error_catcherrecv_extendedr2   r   )	r   text_buf	bytes_bufr;   r[   r:   ra   eot_r    r    r!   next_payload   s   


	




(*
23
89?*z,AsyncWebSocketExtensionFromHTTP.next_payloadbufstr | bytesc                   s   | j du s| jdu s| jdu rtd| j| j4 I dH d zt|tr/| jt	|}n| jt
|}W n ttfyP } z
|  I dH  t|d}~ww |  4 I dH  | j |I dH  W d  I dH  n1 I dH ssw   Y  W d  I dH  dS 1 I dH sw   Y  dS )zDispatch a buffer to remote.Nr]   )rR   rU   rS   rW   rT   r6   r'   r   rH   r   r   r3   rX   rY   r   rd   rV   )r   rl   r[   r:   r    r    r!   send_payload   s$   
*.z,AsyncWebSocketExtensionFromHTTP.send_payloadc                   s   | j d u s| jd u s| jd u rtd| j| j4 I d H S z	| jt }W n ty? } z
| 	 I d H  t
|d }~ww |  4 I d H  | j |I d H  W d   I d H  n1 I d H sbw   Y  W d   I d H  d S 1 I d H sxw   Y  d S )Nr]   )rR   rU   rS   rW   rT   r   rH   r
   r3   rY   r   rd   rV   )r   r[   r:   r    r    r!   ping   s   *.z$AsyncWebSocketExtensionFromHTTP.pingset[str]c                   C  s   ddhS )Nwswssr    r    r    r    r!   supported_schemes  r&   z1AsyncWebSocketExtensionFromHTTP.supported_schemesschemec                 C  s   ddd|  S )Nhttphttps)rq   rr   r    )rt   r    r    r!   scheme_to_http_scheme  s   z5AsyncWebSocketExtensionFromHTTP.scheme_to_http_scheme)r   r   r   r"   r   r'   )r,   r   r   r   )r<   r   r   r=   )r   r\   )rl   rm   r   r   )r   rp   )rt   r'   r   r'   )__name__
__module____qualname__r   staticmethodr%   r*   r.   r/   rY   rk   rn   ro   rs   rw   __classcell__r    r    r   r!   r      s     
%

'
U
r   c                   @  s,   e Zd ZdZed
ddZedddZd	S )*AsyncWebSocketExtensionFromMultiplexedHTTPz
    Plugin that support doing WebSocket over HTTP 2 and 3.
    This implement RFC8441. Beware that this isn't actually supported by much server around internet.
    r   r'   c                   C  r(   )Nrfc8441r    r    r    r    r!   r*     r+   z9AsyncWebSocketExtensionFromMultiplexedHTTP.implementationr"   c                   C  s   t jt jt jhS r#   )r   r$   h2h3r    r    r    r!   r%      s   z8AsyncWebSocketExtensionFromMultiplexedHTTP.supported_svnNry   rx   )rz   r{   r|   __doc__r}   r*   r%   r    r    r    r!   r     s    r   )
__future__r   typingTYPE_CHECKING_async.responser   r)   r   r   wsproto.eventsr   r   r	   r
   r   r   r   wsproto.extensionsr   wsproto.utilitiesr   r3   backendr   
exceptionsutil.traffic_policer   protocolr   r   r   r    r    r    r!   <module>   s    $	 |