
    i#                        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  G d de          Z G d de          ZdS )    )annotationsN   )HTTPResponse)ConnectionTypeWSConnection)AcceptConnectionBytesMessageCloseConnectionPingPongRequestTextMessage)PerMessageDeflate)ProtocolError)HttpVersion   )ExtensionFromHTTPc                       e Zd Zd fdZedd            Zedd            Zd fd
ZddZddZ	ddZ
d dZddZed!d            Zed"d            Z xZS )#WebSocketExtensionFromHTTPreturnNonec                    t                                                       t          t          j                  | _        d | _        d| _        d S )NF)super__init__r   r   CLIENT	_protocol_request_headers_remote_shutdown)self	__class__s    b/root/projects/butler/venv/lib/python3.11/site-packages/urllib3_future/contrib/webextensions/ws.pyr   z#WebSocketExtensionFromHTTP.__init__   sA    %n&;<<7;&+    set[HttpVersion]c                     t           j        hS N)r   h11 r"   r!   supported_svnz(WebSocketExtensionFromHTTP.supported_svn!   s      r"   strc                     dS )Nwsprotor'   r'   r"   r!   implementationz)WebSocketExtensionFromHTTP.implementation%       yr"   responser   c                h   t                                          |           d}|dz  }|j                            d          }|t	          d          ||                                dz   z  }d|j        v r5|d|j                            d                                          z   dz   z  }|dz  }	 | j                            |           n# t          $ r}t          |d }~ww xY wt          | j        
                                          }t          |t                    st          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    s         r!   r1   z WebSocketExtensionFromHTTP.start)   sk   hq77#+#3#7#78N#O#O B   	l1133g==%)999-"&&'ABBIIKKL 	g%	'N''(:;;;;% 	' 	' 	'Q&	' T^**,,--%!122 	]  	 	s   3C 
C%C  C%http_versionr   dict[str, str]c                   | j         | j         S 	 | j                            t          ddt	                      f                    }n# t
          $ r}t          |d}~ww xY w|                    d          dd         }i }|D ]C}|                                                    d          \  }}|||	                                <   D|t          j        k    r|d	= |d
= d|d<   d|d<   || _         |S )zHSpecific HTTP headers required (request) before the 101 status response.Nzexample.com/)hosttarget
extensionsr0      z: upgrade
connection	websocketz	:protocolCONNECTz:method)r   r   sendr   r   r6   r   splitdecodelowerr   r&   )	r   r?   raw_data_to_socketr=   raw_headersrequest_headers
raw_headerkvs	            r!   r2   z"WebSocketExtensionFromHTTP.headersN   s)    ,((	'!%!4!4&s@Q@S@S?U  " "
 & 	' 	' 	'Q&	' )..w77"=*,% 	+ 	+J$$&&,,T22DAq)*OAGGII&&;?**	*-+6OK()2OI& /s   7A 
AAAc                   | j         | j        | j                            | j                  5  | j        du r	 | j                            t          d                    }|                                 5  | j         	                    |           ddd           n# 1 swxY w Y   n# t          $ r Y nw xY w| j                                          d| _         ddd           n# 1 swxY w Y   nd| _         | j        G| j         | j                            | j                   n| j                                         d| _        d| _        dS )z"End/Notify close for sub protocol.NFr   )_dsa_police_officerborrow	_responser   r   rL   r
   _write_error_catchersendallr6   closeforget)r   data_to_sends     r!   r]   z WebSocketExtensionFromHTTP.closem   s   9 #/)00@@ % %,55@26.2E2E / 2 23 3L "&!:!:!<!< @ @ $	 1 1, ? ? ?@ @ @ @ @ @ @ @ @ @ @ @ @ @ @  6 ! ! ! D!
 IOO%%% $DI% % % % % % % % % % % % % % % !	>%#/$++DN;;;;$$&&&!DN#sX   
C#'B' C#4BC#B	C#"B	#C#'
B41C#3B44#C##C'*C'str | bytes | Nonec                   | j         | j        | j        t          d          | j                            | j                  5  | j                                        D ]L}t          |t                    r|j	        c cddd           S t          |t                    r|j	        c cddd           S t          |t                    r)d| _        |                                   ddd           dS t          |t                    r	 | j                            |                                          }n.# t"          $ r!}|                                  t$          |d}~ww xY w|                                 5  | j                             |           ddd           n# 1 swxY w Y   N	 |                                 5  | j                             d          \  }}}ddd           n# 1 swxY w Y   	 | j                            |           n.# t"          $ r!}|                                  t$          |d}~ww xY w| j                                        D ]e}t          |t                    r|j	        c cddd           S t          |t                    r|j	        c cddd           S t          |t                    r)d| _        |                                   ddd           dS t          |t                    r	 | j                            |                                          }n.# t"          $ r!}|                                  t$          |d}~ww xY w|                                 5  | j                             |           ddd           n# 1 swxY w Y   Nt          |t0                    reg# 1 swxY w Y   dS )z5Unpack the next received message/payload from remote.N-The HTTP extension is closed or uninitializedT)rW   rZ   rX   OSErrorrY   r   r8   r9   r   datar	   r
   r   r]   r   rL   r.   r6   r   r[   r\   _read_error_catcherrecv_extendedr5   r   )r   r>   r_   r=   rd   eot_s          r!   next_payloadz'WebSocketExtensionFromHTTP.next_payload   sd   9 6$:N:VIJJJ!((88 1	! 1	!..00 8 8e[11 8 :%%	1	! 1	! 1	! 1	! 1	! 1	! 1	! 1	!
  |44 8 :%%1	! 1	! 1	! 1	! 1	! 1	! 1	! 1	!  77 8,0D)JJLLL1	! 1	! 1	! 1	! 1	! 1	! 1	! 1	!  t,, 83.2n.A.A%..BRBR.S.S1 3 3 3

+23 2244 8 8	)),7778 8 8 8 8 8 8 8 8 8 8 8 8 8 8!--// A A#'9#:#:4#@#@LD#qA A A A A A A A A A A A A A A/N//5555- / / /JJLLL'Q./ "^2244 ! !E!%55 !$z))C1	! 1	! 1	! 1	! 1	! 1	! 1	! 1	!D $E<88 !$z))G1	! 1	! 1	! 1	! 1	! 1	! 1	! 1	!H $E?;; !04-

#O1	! 1	! 1	! 1	! 1	! 1	! 1	! 1	!P $E400 	!7+/>+>+>u~~?O?O+P+PLL5 7 7 7 JJLLL"/Q67 "6688 < < I--l;;;< < < < < < < < < < < < < < <#E400 ! !7!+1	! 1	! 1	! 1	! 1	! 1	! 1	! 1	! 1	! 1	!s  :OO51O3O	,D65O6
E! EE!!O8FOF##O&F#'OG, O,G0	0O3G0	4O8HO
H>H99H>><OO11O/O,L21O2
M<MMO4NONO"N# OO
Obufstr | bytesc                r   | j         | j        | j        t          d          | j                            | j                  5  	 t          |t                    r(| j                            t          |                    }n'| j                            t          |                    }n.# t          $ r!}|                                  t          |d}~ww xY w|                                 5  | j                             |           ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )zDispatch a buffer to remote.Nrb   )rW   rZ   rX   rc   rY   r9   r)   r   rL   r   r	   r6   r]   r   r[   r\   )r   rj   r_   r=   s       r!   send_payloadz'WebSocketExtensionFromHTTP.send_payload   s   9 6$:N:VIJJJ!((88 	0 	0+c3'' J*..*=*=k#>N>N*O*OLL#'>#6#6|C7H7H#I#IL) + + +

#*+ **,, 0 0	!!,///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0s[   D,A$B+*D,+
C5CCD,-DD,D	D,D	D,,D03D0c                   | j         | j        | j        t          d          | j                            | j                  5  | j        du r	 | j                            t                                }n.# t          $ r!}| 
                                 t          |d }~ww xY w|                                 5  | j                             |           d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nrb   F)rW   rZ   rX   rc   rY   r   r   rL   r   r6   r]   r   r[   r\   )r   r_   r=   s      r!   pingzWebSocketExtensionFromHTTP.ping   s   9 6$:N:VIJJJ!((88 		4 		4$--/*..*=*=dff*E*ELL- / / /JJLLL'Q./ ..00 4 4I%%l3334 4 4 4 4 4 4 4 4 4 4 4 4 4 4		4 		4 		4 		4 		4 		4 		4 		4 		4 		4 		4 		4 		4 		4 		4 		4 		4 		4sZ   
C7&A65C76
B! BB!!C78CC7C#	#C7&C#	'C77C;>C;set[str]c                 
    ddhS )Nwswssr'   r'   r"   r!   supported_schemesz,WebSocketExtensionFromHTTP.supported_schemes   s    e}r"   schemec                    ddd|          S )Nhttphttps)rr   rs   r'   )ru   s    r!   scheme_to_http_schemez0WebSocketExtensionFromHTTP.scheme_to_http_scheme   s    W--f55r"   )r   r   r   r#   r   r)   )r.   r   r   r   )r?   r   r   r@   )r   r`   )rj   rk   r   r   )r   rp   )ru   r)   r   r)   )__name__
__module____qualname__r   staticmethodr(   r,   r1   r2   r]   ri   rm   ro   rt   ry   __classcell__)r    s   @r!   r   r      sA       , , , , , , ! ! ! \!    \# # # # # #J   >$ $ $ $86! 6! 6! 6!p0 0 0 0$4 4 4 4    \ 6 6 6 \6 6 6 6 6r"   r   c                  B    e Zd ZdZedd            Ze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                     dS )Nrfc8441r'   r'   r"   r!   r,   z4WebSocketExtensionFromMultiplexedHTTP.implementation   r-   r"   r#   c                 H    t           j        t           j        t           j        hS r%   )r   r&   h2h3r'   r"   r!   r(   z3WebSocketExtensionFromMultiplexedHTTP.supported_svn   s    @@r"   Nr{   rz   )r|   r}   r~   __doc__r   r,   r(   r'   r"   r!   r   r      sd         
    \ A A A \A A Ar"   r   )
__future__r   typingTYPE_CHECKINGr.   r   r+   r   r   wsproto.eventsr   r	   r
   r   r   r   r   wsproto.extensionsr   wsproto.utilitiesr   r6   backendr   
exceptionsprotocolr   r   r   r'   r"   r!   <module>r      s~   " " " " " " 	 )(((((( 0 0 0 0 0 0 0 0                  1 0 0 0 0 0 E E E E E E " " " " " " ' ' ' ' ' ' ' ' ' ' ' 'N6 N6 N6 N6 N6!2 N6 N6 N6bA A A A A,F A A A A Ar"   