o
    .jd.                     @  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   )HTTPResponse)ConnectionTypeWSConnection)AcceptConnectionBytesMessageCloseConnectionPingPongRequestTextMessage)PerMessageDeflate)ProtocolError)HttpVersion)UnavailableTraffic   )ExtensionFromHTTPc                      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 ).WebSocketExtensionFromHTTP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_future/contrib/webextensions/ws.pyr      s   

z#WebSocketExtensionFromHTTP.__init__set[HttpVersion]c                   C  s   t jhS N)r   h11r    r    r    r!   supported_svn"      z(WebSocketExtensionFromHTTP.supported_svnstrc                   C     dS )Nwsprotor    r    r    r    r!   implementation&      z)WebSocketExtensionFromHTTP.implementationresponser   c              
     s   t  | d}|d7 }|jd}|d u rtd|| d 7 }d|jv r5|d|jd  d 7 }|d7 }z| j| W n tyP } zt|d }~ww t	| j
 }t|tsat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 WebSocketExtensionFromHTTP.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"WebSocketExtensionFromHTTP.headersc                 C  s  | j durk| jdurhzQ| j| j@ | jdu r5z| jtd}| j | W n t	t
tfy4   Y nw z| j   W n t
tfyG   Y nw d| _ W d   n1 sUw   Y  W n tyg   d| _ Y nw d| _ | jdur| jdur}| j| j n| j  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 WebSocketExtensionFromHTTP.closestr | bytes | Nonec           	      C  sH  | j du s| jdu s| jdu rtdg }g }| j| j z| j D ]}t|trX|j	r?|s?|j
  W W  d   S ||j
 |j	rWd|  W W  d   S q&t|tr|j	ro|so|j
  W W  d   S ||j
 |j	rd|  W W  d   S q&t|trd| _|    W W d   dS t|trz
| j| }W n ty } z|   t|d}~ww |   | j | W d   n1 sw   Y  q&W n ty } z|   t|d}~ww 	 |   | j d\}}}W d   n	1 sw   Y  z| j| W n ty, } z|   t|d}~ww z| j D ]}t|trj|j	rO|sO|j
  W W  d   S ||j
 |j	rhd|  W W  d   S q3t|tr|j	r|s|j
  W W  d   S ||j
 |j	rd|  W W  d   S q3t|trd| _|    W W d   dS t|trz
| j| }W n ty } z|   t|d}~ww |   | j | W d   n	1 sw   Y  q3t|tr q3q3W n ty } z|   t|d}~ww q1 sw   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   











34
9:@
z'WebSocketExtensionFromHTTP.next_payloadbufstr | bytesc                 C  s   | j du s| jdu s| jdu rtd| j| jY zt|tr*| jt	|}n| jt
|}W n ttfyH } z|   t|d}~ww |   | j | W d   n1 s^w   Y  W d   dS W d   dS 1 svw   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'WebSocketExtensionFromHTTP.send_payloadc                 C  s   | j d u s| jd u s| jd u rtd| j| jU | jdu r_z	| jt }W n t	y< } z| 
  t|d }~ww |   | j | W d    n1 sRw   Y  W d    d S W d    d S W d    d S 1 srw   Y  d S )Nr]   F)rR   rU   rS   rW   rT   r   r   rH   r
   r3   rY   r   rd   rV   )r   r[   r:   r    r    r!   ping   s&   

"zWebSocketExtensionFromHTTP.pingset[str]c                   C  s   ddhS )Nwswssr    r    r    r    r!   supported_schemes  r&   z,WebSocketExtensionFromHTTP.supported_schemesschemec                 C  s   ddd|  S )Nhttphttps)rq   rr   r    )rt   r    r    r!   scheme_to_http_scheme  s   z0WebSocketExtensionFromHTTP.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     
%

'
V
r   c                   @  s,   e Zd ZdZed
ddZedddZd	S )%WebSocketExtensionFromMultiplexedHTTPz
    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+   z4WebSocketExtensionFromMultiplexedHTTP.implementationr"   c                   C  s   t jt jt jhS r#   )r   r$   h2h3r    r    r    r!   r%   "  s   z3WebSocketExtensionFromMultiplexedHTTP.supported_svnNry   rx   )rz   r{   r|   __doc__r}   r*   r%   r    r    r    r!   r     s    r   )
__future__r   typingTYPE_CHECKINGr,   r   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    $	 ~