
    vKgtF                        S r SSKJr  SSKJrJrJrJrJrJ	r	J
r
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  SS
KJrJrJrJrJ r J!r!  Sr" " S S5      r#S\\$   S\	\   S\
\%   4S jr&S\\$   S\\   S\	\   4S jr'g)zR
wsproto/handshake
~~~~~~~~~~~~~~~~~~

An implementation of WebSocket handshakes.
    )deque)	castDequeDict	GeneratorIterableListOptionalSequenceUnionN   )
ConnectionConnectionStateConnectionType)AcceptConnectionEventRejectConnection
RejectDataRequest)	Extension)Headers)generate_accept_tokengenerate_nonceLocalProtocolErrornormed_header_dictRemoteProtocolErrorsplit_comma_headers   13c                   f   \ rS rSrSrS\SS4S jr\S\4S j5       r	\S\
\   4S j5       rS	\S
\\\4   SS4S jrS\S\4S jrS\
\   SS4S jrS\\SS4   4S jrS\R0                  S\4S jrS\S\4S jrS\S\4S jrS\S\4S jrS\S\4S jr S\RB                  S\4S jr"S\4S jr#Sr$g)H11Handshake'   z4A Handshake implementation for HTTP/1.1 connections.connection_typereturnNc                 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)selfr!   s     Q/var/www/highfloat_scraper/venv/lib/python3.13/site-packages/wsproto/handshake.py__init__H11Handshake.__init__*   sr    %)>)>>%00;;#&>>#**#=D #&>>#**#=D 15%*W6: '+    c                     U R                   $ r$   )r(   r0   s    r1   stateH11Handshake.state8   s    {{r4   c                     U R                   $ )zReturn 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,   r6   s    r1   
connectionH11Handshake.connection<   s     r4   headerspathc                     U R                   (       a  [        S5      e[        R                  " SX!S9n[        R                  " [        R
                  5      nU R                  UR                  U5      5        g)zInitiate 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targetr<   N)r&   r   r)   r   r   r%   receive_datasend)r0   r<   r=   upgrade_request
h11_clients        r1   initiate_upgrade_connection(H11Handshake.initiate_upgrade_connectionH   sV     ;;$Q  ++VDR^^CJJ/
*///:;r4   eventc                 t   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5      e)zSend 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
r4   zEvent z$ cannot be sent during the handshake)

isinstancer   _initiate_connectionr   _acceptr   _rejectr   _send_reject_datar   r0   rI   datas      r1   rD   H11Handshake.send[   s     eW%%--e44D  /00LL''D  /00LL''D  z****511D
  %CD r4   rQ   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[        5       S9ef = f)
zReceive 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.
r4   TzBad HTTP message
event_hinte   F)r<   status_codehas_body)rQ   body_finishedN)r*   rC   
next_eventr)   r   r   rK   ConnectionClosed	NEED_DATAPAUSEDr&   InformationalResponserW   r-   append_establish_client_connectionlistr<   r   CLOSEDr(   Response	REJECTINGDatar   rQ   EndOfMessager   _process_connection_request)r0   rQ   rI   s      r1   rC   H11Handshake.receive_datat   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eS[[11LL''(H(H(OP[  ** )&3C3E s   J3 3'Kc              #      #    U R                   (       a0  U R                   R                  5       v   U R                   (       a  M/  gg7f)zReturn a generator that provides any events that have been generated
by protocol activity.

:returns: a generator that yields H11 events.
N)r-   popleftr6   s    r1   eventsH11Handshake.events   s,      ll,,&&(( llls   ?AAc           	         UR                   S:w  a  [        S[        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[        5       S9eU[        :w  a"  [        S[        S[        4/U(       a  SOSS9S9eUc  [        S[        5       S9eUR	                  5       S:w  a  [        S[        5       S9eUc  [        S[        5       S9e[        UU	UUUR                  R                  S5      S9U l        U R                  $ )Nr?   zRequest method must be GETrT   r4   
   connections   hostidna   sec-websocket-extensions   sec-websocket-key   sec-websocket-protocols   sec-websocket-version   upgradec              3   D   #    U H  oR                  5       S :H  v   M     g7fupgradeNlower.0tokens     r1   	<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<   rW   z#Missing header, 'Sec-WebSocket-Key'	   websocket$Missing header, 'Upgrade: WebSocket'zMissing header, 'Host'ascii)
extensionsextra_headershostsubprotocolsrB   )rA   r   r   r<   rx   r   decodeextendr_   anyWEBSOCKET_VERSIONr   rB   r.   )r0   rI   connection_tokensr   r   keyr   rv   versionr<   namevalues               r1   rg   (H11Handshake._process_connection_request   s    <<6!%,9I9K  ! "
"$ ==KD::<D}$$6u$=!||F+44!!"4U";<--22##$6u$=>11#NND=)' )( $C 0
4E0
 -
 -
 &7DTDV  ''%9+68IJK'.C  ;%5BRBT  ==?l*%6CSCU  <%(5E5G  $+!!%<<&&w/$
  '''r4   c                    U R                   c   e[        U R                   R                  5      nUS   n[        U5      nSSSU4/nUR                  bh  UR                  U R                   R
                  ;  a  [        SUR                   35      eUR                  SUR                  R                  S5      45        UR                  (       aY  [        [        [        [           U R                   R                  5      UR                  5      nU(       a  UR                  SU45        [        R                  " S	XQR                  -   S
9n[!        U R"                  (       a  [$        R&                  O[$        R(                  UR                  5      U l        [,        R.                  U l        U R2                  R5                  U5      =(       d    S$ )Nrq      Upgrades	   WebSockets
   Connectionr   s   Sec-WebSocket-Acceptzunexpected subprotocol    Sec-WebSocket-Protocolr      Sec-WebSocket-ExtensionsrV   rW   r<   r4   )r.   r   r   r   subprotocolr   r   r_   encoder   server_extensions_handshaker   r   strr)   r^   r   r&   r   r%   r+   r,   r   OPENr(   r*   rD   )r0   rI   request_headersnonceaccept_tokenr<   acceptsresponses           r1   rM   H11Handshake._accept   s   ''333,T-E-E-S-ST 45,U3 ''$l3
 (  (@(@(M(MM(+B5CTCTBU)VWWNN*E,=,=,D,DW,MN 1Xc]D$<$<$G$GH  G  ;WEF,,W/B/B%B
 &%)[[N!!n6K6K
 &**##((29c9r4   c                 N   U R                   [        R                  :w  a  [        SU R                   -  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  X@R                  R                  [        R                  " 5       5      =(       d    S-  n[        R                   U l        U$ )Nz)Connection cannot be rejected in state %s)s   content-length   0r   r4   )r7   r   r'   r   ra   r<   rX   r_   r)   rc   rW   r*   rD   rd   r(   rf   rb   )r0   rI   r<   r   rQ   s        r1   rN   H11Handshake._reject%  s    ::333$;djjH  u}}%~~NN45<<E,=,=wO##((29c%//~~((--c.>.>.@AHSHD)00DKr4   c                    U R                   [        R                  :w  a  [        SU R                    35      eU R                  R                  [        R                  " UR                  S95      =(       d    SnUR                  (       aN  X R                  R                  [        R                  " 5       5      =(       d    S-  n[        R                  U l        U$ )Nz$Cannot send rejection data in state )rQ   r4   )r7   r   rd   r   r*   rD   r)   re   rQ   rY   rf   rb   r(   rP   s      r1   rO   H11Handshake._send_reject_data6  s    ::222$6tzzlC  ##((uzz)BCJs((--c.>.>.@AHSHD)00DKr4   requestc                    Xl         [        5       U l        SUR                  R	                  S5      4S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   Hostro   r   r   s   Sec-WebSocket-Keyr   r   z, r      %s; %sr      , r?   r@   r4   )r.   r   r/   r   r   r   r   r_   joinr   rK   r   offerr   itemsboolr)   r   rB   r   r*   rD   )
r0   r   r<   offerser   r   paramsbnamerv   s
             r1   rL   !H11Handshake._initiate_connectionD  s   #* $& gll))&12&'!4;;/%'89
 NN-YYw334<<WE 24F''!!Y////!"vv ( J &G,fd++"))%0  %%i5--:P2Q&QR !/  ;UZZ
=STU++>>((1333

 ##((18S8r4   c                     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	[        5       S
9eUR                  5       S:w  a  [        S[        5       S
9e[        U R                  5      n
X*:w  a  [        S[        5       S
9eUb.  XPR                   R                  ;  a  [        SU 3[        5       S
9e[        U[        [        [           U R                   R                   5      5      n[#        U R$                  (       a  [&        R(                  O[&        R*                  UU R,                  R.                  S   5      U l        [2        R4                  U l        [9        XUS9$ )Nr4   rn   rp   s   sec-websocket-acceptrr   r   rs   c              3   D   #    U H  oR                  5       S :H  v   M     g7fru   rw   ry   s     r1   r|   <H11Handshake._establish_client_connection.<locals>.<genexpr>  r~   r   r   rT   r   r   zBad accept tokenzunrecognized subprotocol r   )r   r   r   )r.   r/   r<   rx   r   r   r_   r   r   r   r   r   client_extensions_handshaker   r   r   r   r   r&   r   r%   r+   r*   trailing_datar,   r   r   r(   r   )r0   rI   acceptr   r   r   rv   r<   r   r   r   r   s               r1   r`   )H11Handshake._establish_client_connectiono  s    ''333{{&&&  ==KD::<D}$$6u$=!44,U30022#ll73#NND=)# )& $C 0
4E0
 -
 -
 &7DTDV  ==?l*%6CSCU  -T[[9!%&8EUEWXX"":":"G"GG)/}=/1  1T(9-t/G/G/R/RS

 &%)[[N!!n6K6K  ..q1

 &**!k
 	
r4   c                 x    SR                  U R                  R                  U R                  U R                  5      $ )Nz{}(client={}, state={}))format	__class____name__r&   r7   r6   s    r1   __repr__H11Handshake.__repr__  s.    (//NN##T[[$**
 	
r4   )r,   r-   r*   r.   r/   r(   r&   )%r   
__module____qualname____firstlineno____doc__r   r2   propertyr   r7   r
   r   r:   r   r   bytesr   rG   r   rD   rC   r   rk   r)   r   rg   r   rM   r   rN   r   rO   rL   r^   r`   r   __static_attributes__ r4   r1   r   r   '   sT   >, ,4 ,    	 HZ0 	  	 <<&+E3J&7<	<&% E 26Q% 6QT 6Qp)	%t"34 )E([[E(	E(N%:- %:% %:N- % "
z 
e 
)9G )9 )9V?
..?
	?
B
# 
r4   r   	requested	supportedr"   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   r4   s   %sr   r   )
splitstripr   r   rK   r   r   r   r_   r   )
r   r   r   r   r   	extensionr   r   r   
name_bytess
             r1   r   r     s#    .0G{{3"1%++-"I~~%"))%0fd++26/ '.4mmG.DGNN+ #  "$
#MMOLDW-J&$''v!!*-S=%%ez&:;%%i:2F&FG , zz*%%r4   acceptedc                    / nU  Hw  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[        5       S9e   U$ )Nr   r   r   zunrecognized extension rT   )r   r   r   finalizer_   r   r   )r   r   r   r   r   r   s         r1   r   r     s    
 J||C#A&,,."I~~%""6*!!),	 # &)$0=M=O   r4   )(r   collectionsr   typingr   r   r   r   r   r	   r
   r   r   r)   r:   r   r   r   rk   r   r   r   r   r   r   r   r   	utilitiesr   r   r   r   r   r   r   r   r   r   r   r   r   r4   r1   <module>r      s    
 
 
  C C R R !    L
 L
^!}!)-i!e_!Hsm(0(;	)_r4   