
    < jH                    
   S r SSKJr  SSKJr  SSKJrJr  SSKrSSK	J
r
JrJr  SSKJrJrJrJrJr  SS	KJr  SS
KJrJrJrJrJrJr  \(       a  SSKJrJrJr  SSKJ r   Sr!Sr" " S S5      r#      SS jr$      SS jr%g)zR
wsproto/handshake
~~~~~~~~~~~~~~~~~~

An implementation of WebSocket handshakes.
    )annotations)deque)TYPE_CHECKINGcastN   )
ConnectionConnectionStateConnectionType)AcceptConnectionEventRejectConnection
RejectDataRequest)	Extension)LocalProtocolErrorRemoteProtocolErrorgenerate_accept_tokengenerate_noncenormed_header_dictsplit_comma_header)	GeneratorIterableSequence)Headerss   13s	   websocketc                      \ rS rSrSrSS jr\SS j5       r\SS j5       r      SS jr	SS jr
SS jrSS	 jr    SS
 jrSS jrSS jrSS jrSS jr    SS jrS S jrSrg)!H11Handshake)   z4A Handshake implementation for HTTP/1.1 connections.c                l   U[         R                  L U l        [        R                  U l        U R                  (       a*  [        R                  " [        R                  5      U l        O)[        R                  " [        R                  5      U l        S U l
        [        5       U l        S U l        S U l        g N)r
   CLIENTclientr	   
CONNECTING_stateh11r   _h11_connectionSERVER_connectionr   _events_initiating_request_nonce)selfconnection_types     b/root/GenerationalWealth/GenerationalWealth/venv/lib/python3.13/site-packages/wsproto/handshake.py__init__H11Handshake.__init__,   sr    %)>)>>%00;;#&>>#**#=D #&>>#**#=D .2%*W37 $(    c                    U R                   $ r   )r#   r+   s    r-   stateH11Handshake.state:   s    {{r0   c                    U R                   $ )z
Return the established connection.

This will either return the connection or raise a
LocalProtocolError if the connection has not yet been
established.

:rtype: h11.Connection
)r'   r2   s    r-   
connectionH11Handshake.connection>   s     r0   c                    U R                   (       a  Sn[        U5      e[        R                  " SX!S9n[        R                  " [        R
                  5      nU R                  UR                  U5      5        g)z
Initiate an upgrade connection.

This should be used if the request has already be received and
parsed.

:param list headers: HTTP headers represented as a list of 2-tuples.
:param str path: A URL path.
z?Cannot initiate an upgrade connection when acting as the client   GETmethodtargetheadersN)r!   r   r$   r   r   r    receive_datasend)r+   r=   pathmsgupgrade_request
h11_clients         r-   initiate_upgrade_connection(H11Handshake.initiate_upgrade_connectionK   s[     ;;SC$  ++VDR^^CJJ/
*///:;r0   c                x   Sn[        U[        5      (       a  X R                  U5      -  nU$ [        U[        5      (       a  X R	                  U5      -  nU$ [        U[
        5      (       a  X R                  U5      -  nU$ [        U[        5      (       a  X R                  U5      -  nU$ SU S3n[        U5      e)z
Send an event to the remote.

This will return the bytes to send based on the event or raise
a LocalProtocolError if the event is not valid given the
state.

:returns: Data to send to the WebSocket peer.
:rtype: bytes
r0   zEvent z$ cannot be sent during the handshake)

isinstancer   _initiate_connectionr   _acceptr   _rejectr   _send_reject_datar   )r+   eventdatarA   s       r-   r?   H11Handshake.send`   s     eW%%--e44D  /00LL''D  /00LL''D  z****511D 	 5'!EFC$ r0   c                   U R                   R                  U=(       d    S5          U R                   R                  5       n[        U[        R                  5      (       d&  U[        R                  L d  U[        R                  L a  g	U R                  (       Ga  [        U[        R                  5      (       a  UR                  S:X  a,  U R                  R                  U R                  U5      5        GOU R                  R                  [        [!        UR"                  5      UR                  SS95        [$        R&                  U l        GOd[        U[        R*                  5      (       aW  [$        R,                  U l        U R                  R                  [        [!        UR"                  5      UR                  SS95        O[        U[        R.                  5      (       a.  U R                  R                  [1        UR2                  SS95        O[        U[        R4                  5      (       a8  U R                  R                  [1        SSS95        [$        R&                  U l        OI[        U[        R6                  5      (       a*  U R                  R                  U R9                  U5      5        GM  ! [        R                   a    Sn[	        U[        5       S9ef = f)
z
Receive data from the remote.

A list of events that the remote peer triggered by sending
this data can be retrieved with :meth:`events`.

:param bytes data: Data received from the WebSocket peer.
r0   TzBad HTTP message
event_hinte   F)r=   status_codehas_body)rM   body_finishedN)r%   r>   
next_eventr$   r   r   rG   ConnectionClosed	NEED_DATAPAUSEDr!   InformationalResponserS   r(   append_establish_client_connectionlistr=   r	   CLOSEDr#   Response	REJECTINGDatar   rM   EndOfMessager   _process_connection_request)r+   rM   rL   rA   s       r-   r>   H11Handshake.receive_data{   s    	))$+#6,,779 5#"6"677CMM)CJJ&{{{eS%>%>??((C/++D,M,Me,TU++,(,U]](;,1,=,=). '6&<&<s||44"1";";DKLL''($($7(-(9(9%)  sxx00LL''"

%H  s'7'788LL''
4(PQ"1"8"8DKE3;;//##D$D$DU$KL[  ** ()$4$6 s   J3 3)Kc              #     #    U R                   (       a0  U R                   R                  5       v   U R                   (       a  M/  gg7f)z
Return a generator that provides any events that have been generated
by protocol activity.

:returns: a generator that yields H11 events.
N)r(   popleftr2   s    r-   eventsH11Handshake.events   s,      ll,,&&(( llls   ?AAc           	        UR                   S:w  a  Sn[        U[        5       S9eS n/ nS nS n/ nSnS n	/ n
UR                   H  u  pUR	                  5       nUS:X  a  [        U5      nOwUS:X  a  UR                  S5      nM@  US:X  a  UR                  [        U5      5        Mb  US	:X  a  UnO3US
:X  a  UR                  [        U5      5        M  US:X  a  Un	OUS:X  a  UnU
R                  X45        M     Ub  [        S U 5       5      (       d  Sn[        U[        5       S9eU	[        :w  a$  Sn[        U[        S[        4/U	(       a  SOSS9S9eUc  Sn[        U[        5       S9eUR	                  5       [        :w  a*  S[        R                  5        S3n[        U[        5       S9eUc  Sn[        U[        5       S9e[        UU
UUUR                  R                  S5      S9U l        U R                  $ )Nr9   zRequest method must be GETrP   r0   
   connections   hostidna   sec-websocket-extensions   sec-websocket-key   sec-websocket-protocols   sec-websocket-version   upgradec              3  F   #    U  H  oR                  5       S :H  v   M     g7fupgradeNlower.0tokens     r-   	<genexpr>;H11Handshake._process_connection_request.<locals>.<genexpr>         0
4E5KKMY&4E   !%Missing header, 'Connection: Upgrade'z'Missing header, 'Sec-WebSocket-Version'   Sec-WebSocket-Versioni  i  )r=   rS   z#Missing header, 'Sec-WebSocket-Key'Missing header, 'Upgrade: 'zMissing header, 'Host'ascii)
extensionsextra_headershostsubprotocolsr<   )r;   r   r   r=   rt   r   decodeextendr[   anyWEBSOCKET_VERSIONWEBSOCKET_UPGRADEr   r<   r)   )r+   rL   rA   connection_tokensr   r   keyr   rr   versionr=   namevalues                r-   rc   (H11Handshake._process_connection_request   sK    <<6!.C% 0 2  ! "
"$ ==KD::<D}$$6u$=!||F+44!!"4U";<--22##$6u$=>11#NND=)' )( $C 0
4E0
 -
 -
 :C% 0 2  '';C%+68IJK'.C  ;7C% 0 2  ==?//./@/G/G/I.J!LC%+-  <*C% 0 2  $+!!%<<&&w/$
  '''r0   c                   U R                   c   e[        U R                   R                  5      nUS   n[        U5      nS[        4SSU4/nUR
                  bj  UR
                  U R                   R                  ;  a  SUR
                   3n[        U5      eUR                  SUR
                  R                  S5      45        UR                  (       aN  [        [        SU R                   R                  5      UR                  5      nU(       a  UR                  S	U45        [        R                  " S
XQR                  -   SS9n[        U R                   (       a  ["        R$                  O["        R&                  UR                  5      U l        [*        R,                  U l        U R0                  R3                  U5      =(       d    S$ )Nrm      Upgrades
   Connectionr   s   Sec-WebSocket-Acceptzunexpected subprotocol    Sec-WebSocket-Protocolr   zSequence[str]   Sec-WebSocket-ExtensionsrR   s   Switching Protocols)rS   r=   reasonr0   )r)   r   r   r   r   subprotocolr   r   r[   encoder   server_extensions_handshaker   r$   rZ   r   r!   r
   r    r&   r'   r	   OPENr#   r%   r?   )	r+   rL   request_headersnonceaccept_tokenr=   rA   acceptsresponses	            r-   rI   H11Handshake._accept  s   ''333,T-E-E-S-ST 45,U3 *+'$l3
 (  (@(@(M(MM/0A0A/BC(--NN*E,=,=,D,DW,MN 1_d&>&>&I&IJ  G  ;WEF,,111)

 &%)[[N!!n6K6K
 &**##((29c9r0   c                R   U R                   [        R                  :w  a  SU R                    3n[        U5      e[	        UR
                  5      nUR                  (       d  UR                  S5        [        R                  " UR                  US9nU R                  R                  U5      =(       d    Sn[        R                  U l        UR                  (       dN  XPR                  R                  [        R                  " 5       5      =(       d    S-  n[        R                   U l        U$ )Nz'Connection cannot be rejected in state )s   content-length   0)rS   r=   r0   )r3   r	   r"   r   r]   r=   rT   r[   r$   r_   rS   r%   r?   r`   r#   rb   r^   )r+   rL   rA   r=   r   rM   s         r-   rJ   H11Handshake._reject8  s    ::333;DJJ<HC$  u}}%~~NN45<<E,=,=wO##((29c%//~~((--c.>.>.@AHSHD)00DKr0   c                   U R                   [        R                  :w  a  SU R                    3n[        U5      eU R                  R                  [        R                  " UR                  S95      =(       d    SnUR                  (       aN  X0R                  R                  [        R                  " 5       5      =(       d    S-  n[        R                  U l        U$ )Nz$Cannot send rejection data in state )rM   r0   )r3   r	   r`   r   r%   r?   r$   ra   rM   rU   rb   r^   r#   )r+   rL   rA   rM   s       r-   rK   H11Handshake._send_reject_dataJ  s    ::2228EC$  ##((uzz)BCJs((--c.>.>.@AHSHD)00DKr0   c                   Xl         [        5       U l        SUR                  R	                  S5      4S[
        4SSU R                  4S[        4/nUR                  (       a;  UR                  SSR                  UR                  5      R	                  S	5      45        UR                  (       a  0 nUR                   H6  n[        U[        5      (       d   eUR                  5       X4R                  '   M8     / nUR                  5        Hk  u  pgUR	                  S	5      n[        U[         5      (       a  U(       a  UR                  U5        ME  MG  UR                  S
XR	                  S	5      4-  5        Mm     U(       a"  UR                  SSR                  U5      45        ["        R$                  " SUR&                  R	                  S	5      X!R(                  -   S9n	U R*                  R-                  U	5      =(       d    S$ )Ns   Hostrk   r   r   s   Sec-WebSocket-Keyr}   r   z, r      %s; %sr      , r9   r:   r0   )r)   r   r*   r   r   r   r   r   r[   joinr   rG   r   offerr   itemsboolr$   r   r<   r   r%   r?   )
r+   requestr=   offerser   r   paramsbnamerr   s
             r-   rH   !H11Handshake._initiate_connectionY  s   #* $& gll))&12*+'!4;;/%'89
 NN-YYw334<<WE ,.F''!!Y////!"vv ( J &G,fd++"))%0  %%i5--:P2Q&QR !/  ;UZZ
=STU++>>((1333

 ##((18S8r0   c                N   U R                   c   eU R                  c   eS nS n/ nS nSn/ nUR                   Hz  u  pUR                  5       nUS:X  a  [	        U	5      nM(  US:X  a  [	        U	5      nM;  US:X  a  U	nME  US:X  a  U	R                  S5      nM^  US:X  a  U	nMh  UR                  X45        M|     Ub  [        S U 5       5      (       d  S	n
[        U
[        5       S
9eUR                  5       [        :w  a*  S[        R                  5        S3n
[        U
[        5       S
9e[        U R                  5      nX+:w  a  Sn
[        U
[        5       S
9eUb0  XPR                   R                  ;  a  SU 3n
[        U
[        5       S
9e[        U[        SU R                   R                  5      5      n[!        U R"                  (       a  [$        R&                  O[$        R(                  UU R*                  R,                  S   5      U l        [0        R2                  U l        [7        XUS9$ )Nr0   rj   rl   s   sec-websocket-acceptrn   r   ro   c              3  F   #    U  H  oR                  5       S :H  v   M     g7frq   rs   ru   s     r-   rx   <H11Handshake._establish_client_connection.<locals>.<genexpr>  rz   r{   r|   rP   r~   r   zBad accept tokenzunrecognized subprotocol Sequence[Extension]r   )r   r   r   )r)   r*   r=   rt   r   r   r[   r   r   r   r   r   r   client_extensions_handshaker   r   r   r!   r
   r    r&   r%   trailing_datar'   r	   r   r#   r   )r+   rL   acceptr   r   r   rr   r=   r   r   rA   r   r   s                r-   r\   )H11Handshake._establish_client_connection  s;    ''333{{&&&  ==KD::<D}$$6u$=!22,U3..00#ll73z!NND=)# )& $C 0
4E0
 -
 -
 :C% 0 2  ==?//./@/G/G/I.J!LC%+-  -T[[9!$C%c6F6HII"{:R:R:_:_'_-k];C%+-  1T/1I1I1T1TU

 &%)[[N!!n6K6K  ..q1

 &**!k
 	
r0   c                h    U R                   R                   SU R                   SU R                   S3$ )Nz(client=z, state=))	__class____name__r!   r3   r2   s    r-   __repr__H11Handshake.__repr__  s/    ..))*(4;;-x

|STUUr0   )r'   r(   r%   r)   r*   r#   r!   N)r,   r
   returnNone)r   r	   )r   zConnection | None)r=   r   r@   zbytes | strr   r   )rL   r   r   bytes)rM   bytes | Noner   r   )r   zGenerator[Event, None, None])rL   zh11.Requestr   r   )rL   r   r   r   )rL   r   r   r   )rL   r   r   r   )r   r   r   r   )rL   zh11.InformationalResponser   r   )r   str)r   
__module____qualname____firstlineno____doc__r.   propertyr3   r6   rD   r?   r>   rg   rc   rI   rJ   rK   rH   r\   r   __static_attributes__ r0   r-   r   r   )   s    >)   
  
 <<&1<	<*67Mr)L( L(	L(\(:T$)9VC
.C
	C
JVr0   r   c                   0 nU  H  nUR                  SS5      S   R                  5       nU Hv  nUR                  U:X  d  M  UR                  U5      n[	        U[
        5      (       a  U(       a  SX%R                  '   MR  MT  Uc  MY  UR                  S5      X%R                  '   Mx     M     U(       a  / nUR                  5        Hx  u  pHUR                  S5      n	[	        U[
        5      (       a  U(       d   eUR                  U	5        MG  US:X  a  UR                  SU	-  5        Mc  UR                  S	X4-  5        Mz     S
R                  U5      $ g)z|
Agree on the extensions to use returning an appropriate header value.

This returns None if there are no agreed extensions
;r   r   TNr   r0   s   %sr   r   )
splitstripr   r   rG   r   r   r   r[   r   )
	requested	supportedr   r   r   	extensionr   r   r   
name_bytess
             r-   r   r     s#    (*G{{3"1%++-"I~~%"))%0fd++26/ '.4mmG.DGNN+ #  "$
#MMOLDW-J&$''v!!*-3!!%:"67!!)z.B"BC , zz*%%r0   c                   / nU  Hy  nUR                  SS5      S   R                  5       nU H8  nUR                  U:X  d  M  UR                  U5        UR	                  U5          Mb     SU 3n[        U[        5       S9e   U$ )Nr   r   r   zunrecognized extension rP   )r   r   r   finalizer[   r   r   )acceptedr   r   r   r   r   rA   s          r-   r   r     s    
 J||C#A&,,."I~~%""6*!!),	 # ,D62C% 0 2   r0   )r   Iterable[str]r   list[Extension]r   r   )r   r   r   r   r   r   )&r   
__future__r   collectionsr   typingr   r   r$   r6   r   r	   r
   rg   r   r   r   r   r   r   r   	utilitiesr   r   r   r   r   r   collections.abcr   r   r   r   r   r   r   r   r   r   r0   r-   <module>r      s    # 
  C C R R !  ==   ! aV aVH!!)8!!H(;r0   