
    F2jd.                        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e          Z G d de          ZdS )    )annotationsN   )HTTPResponse)ConnectionTypeWSConnection)AcceptConnectionBytesMessageCloseConnectionPingPongRequestTextMessage)PerMessageDeflate)ProtocolError)HttpVersion)UnavailableTraffic   )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    h/home/thesage/.hermes/hermes-agent/venv/lib/python3.11/site-packages/urllib3/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"   r2   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
extensionsr1      z: upgrade
connection	websocketz	:protocolCONNECTz:method)r   r   sendr   r   r7   r   splitdecodelowerr   r'   )	r    r@   raw_data_to_socketr>   raw_headersrequest_headers
raw_headerkvs	            r"   r3   z"WebSocketExtensionFromHTTP.headersO   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                    }| j                             |           n# t          t          t          f$ r Y nw xY w	 | j                                          n# t          t          f$ r Y nw xY wd| _         ddd           n# 1 swxY w Y   n# t          $ r
 d| _         Y nw xY w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   rM   r
   sendallr7   OSErrorAssertionErrorcloser   forget)r    data_to_sends     r"   r_   z WebSocketExtensionFromHTTP.closen   s   9 #/%-44T^DD ) )
  0E99%6:n6I6I$3A$6$67" 7" !%	 1 1, ? ? ? ?$:G^#T % % % $%! IOO---- '8 ! ! ! D!$(	#) ) ) ) ) ) ) ) ) ) ) ) ) ) )$ * % % % !%DIII	% !	>%#/$++DN;;;;$$&&&!DN#s|   C+ 
CAA=<C=BCBCB54C5C	CC		
CC+ C##C+ &C#'C+ +C?>C?str | bytes | Nonec                
   | j         | j        | j        t          d          g }g }| j                            | j                  5  	 | j                                        D ]}t          |t                    rc|j	        r|s|j
        c cddd           S |                    |j
                   |j	        r#d                    |          c cddd           S {t          |t                    rc|j	        r|s|j
        c cddd           S |                    |j
                   |j	        r#d                    |          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.# t0          $ r!}|                                  t*          |d}~ww xY w	 |                                 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 ]}t          |t                    rc|j	        r|s|j
        c cddd           S |                    |j
                   |j	        r#d                    |          c cddd           S {t          |t                    rc|j	        r|s|j
        c cddd           S |                    |j
                   |j	        r#d                    |          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   t          |t8                    rn.# t0          $ r!}|                                  t*          |d}~ww xY w# 1 swxY w Y   dS )z5Unpack the next received message/payload from remote.N-The HTTP extension is closed or uninitialized r#   T)rX   r[   rY   r]   rZ   r   r9   r:   r   message_finisheddataappendjoinr	   r
   r   r_   r   rM   r/   r7   r   _write_error_catcherr\   r^   _read_error_catcherrecv_extendedr6   r   )	r    text_buf	bytes_bufr?   ra   r>   rg   eot_s	            r"   next_payloadz'WebSocketExtensionFromHTTP.next_payload   s/   9 6$:N:VIJJJ !#	!((88 L	/ L	/
+!^2244 < <E!%55 < 1 .( .#(:--L	/ L	/ L	/ L	/ L	/ L	/ L	/ L	/ !
333 1 5#%778#4#444L	/ L	/ L	/ L	/ L	/ L	/ L	/ L	/5#E<88 < 1 .) .#(:--L	/ L	/ L	/ L	/ L	/ L	/ L	/ L	/  "((444 1 7#&88I#6#666%L	/ L	/ L	/ L	/ L	/ L	/ L	/ L	/"7#E?;; <04-

#-L	/ L	/ L	/ L	/ L	/ L	/ L	/ L	/. $E400 <726.2E2EennFVFV2W2WLL5 7 7 7 JJLLL"/Q67 "6688 < < I--l;;;< < < < < < < < < < < < < < <1<4 " + + +

#*+(/--// 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.//!%!6!6!8!8 % %%e[99 %$5 2h 2',z 1 1eL	/ L	/ L	/ L	/ L	/ L	/ L	/ L	/f %OOEJ777$5 9')wwx'8'8 8 8kL	/ L	/ L	/ L	/ L	/ L	/ L	/ L	/h9'|<< %$5 2i 2',z 1 1qL	/ L	/ L	/ L	/ L	/ L	/ L	/ L	/r &,,UZ888$5 ;'*xx	':': : :wL	/ L	/ L	/ L	/ L	/ L	/ L	/ L	/t;'?? %48D1 JJLLL#'L	/ L	/ L	/ L	/ L	/ L	/ L	/ L	/@ (t44 	%;/3~/B/B5>>CSCS/T/T#9 ; ; ; $

&3 :; "&!:!:!<!< @ @ $	 1 1, ? ? ?@ @ @ @ @ @ @ @ @ @ @ @ @ @ @'t44 %$%3%6 & / / /JJLLL'Q./M(/IL	/ L	/ L	/ L	/ L	/ L	/ L	/ L	/ L	/ L	/sp  U
AI7I'I7I2II*,GI
H!G==HII 4I IIIIU
I9I44I99UJ<0U<K 	 UK 	UK#"U#
L-L		LUAT/!7T/%'T/7T/2T/T/2,RT/
S
)SS

T/!T<T/TT/TT/.U/
U9UUUU#&U#bufstr | bytesc                   | j         | j        | j        t          d          | j                            | j                  5  	 t          |t                    r(| j                            t          |                    }n'| j                            t          |                    }n5# t          t          f$ 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.Nrd   )rX   r[   rY   r]   rZ   r:   r*   r   rM   r   r	   r7   r^   r_   r   rj   r\   )r    rr   ra   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*N; + + +

#*+ **,, 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[   D3A$B+*D3+C<CCD34DD3D	D3"D	#D33D7:D7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 )Nrd   F)rX   r[   rY   r]   rZ   r   r   rM   r   r7   r_   r   rj   r\   )r    ra   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)rz   r{   r(   )r}   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   rA   )r   rb   )rr   rs   r   r   )r   rx   )r}   r*   r   r*   )__name__
__module____qualname__r   staticmethodr)   r-   r2   r3   r_   rq   ru   rw   r|   r   __classcell__)r!   s   @r"   r   r      sF       , , , , , , ! ! ! \!    \# # # # # #J   >%$ %$ %$ %$NT/ T/ T/ T/l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   r   )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   r7   backendr   
exceptionsutil.traffic_policer   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 " " " " " " ' ' ' ' ' ' 5 5 5 5 5 5 ' ' ' ' ' 'z6 z6 z6 z6 z6!2 z6 z6 z6zA A A A A,F A A A A Ar#   