
    ,iH                        d Z ddlmZ ddlmZ ddlmZmZ ddlZddl	m
Z
mZmZ ddlmZmZmZmZmZ dd	lmZ dd
lmZmZmZmZmZmZ erddlmZmZmZ ddlm Z  dZ!dZ" G d d      Z#	 	 	 	 	 	 ddZ$	 	 	 	 	 	 ddZ%y)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                      e Zd ZdZddZedd       Zedd       Z	 	 	 	 	 	 ddZddZ	ddZ
ddZ	 	 	 	 dd	Zdd
ZddZddZddZ	 	 	 	 ddZddZy)H11Handshakez4A Handshake implementation for HTTP/1.1 connections.c                ^   |t         j                  u | _        t        j                  | _        | j                  r)t        j                  t        j                        | _        n(t        j                  t        j                        | _        d | _
        t               | _        d | _        d | _        y N)r
   CLIENTclientr	   
CONNECTING_stateh11r   _h11_connectionSERVER_connectionr   _events_initiating_request_nonce)selfconnection_types     `/var/www/system.tvplus.app.br/jogos/scrap/venv/lib/python3.12/site-packages/wsproto/handshake.py__init__zH11Handshake.__init__,   sr    %)>)>>%00;;#&>>#**#=D #&>>#**#=D .2%*W37 $(    c                    | j                   S r   )r"   r*   s    r,   statezH11Handshake.state:   s    {{r.   c                    | j                   S )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&   r0   s    r,   
connectionzH11Handshake.connection>   s     r.   c                    | j                   rd}t        |      t        j                  d||      }t        j                  t        j
                        }| j                  |j                  |             y)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*   r9   pathmsgupgrade_request
h11_clients         r,   initiate_upgrade_connectionz(H11Handshake.initiate_upgrade_connectionK   s]     ;;SC$  ++VD'R^^CJJ/
*///:;r.   c                X   d}t        |t              r|| j                  |      z  }|S t        |t              r|| j	                  |      z  }|S t        |t
              r|| j                  |      z  }|S t        |t              r|| j                  |      z  }|S d| d}t        |      )a  
        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
        r.   zEvent z$ cannot be sent during the handshake)

isinstancer   _initiate_connectionr   _acceptr   _rejectr   _send_reject_datar   )r*   eventdatar=   s       r,   r;   zH11Handshake.send`   s     eW%D--e44D  /0DLL''D  /0DLL''D  z*D**511D 	 5'!EFC$ r.   c                   | j                   j                  |xs d       	 	 | j                   j                         }t        |t        j                        s$|t        j                  u s|t        j                  u ry	| j                  rt        |t        j                        r|j                  dk(  r,| j                  j                  | j                  |             n| j                  j                  t        t!        |j"                        |j                  d             t$        j&                  | _        nYt        |t        j*                        rZt$        j,                  | _        | j                  j                  t        t!        |j"                        |j                  d             nt        |t        j.                        r1| j                  j                  t1        |j2                  d             nt        |t        j4                        r| j                  j                  t1        dd             t$        j&                  | _        nDt        |t        j6                        r*| j                  j                  | j9                  |             r# t        j                  $ r d}t	        |t                     w xY w)
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.
        r.   TzBad HTTP message
event_hinte   F)r9   status_codehas_body)rH   body_finishedN)r$   r:   
next_eventr#   r   r   rB   ConnectionClosed	NEED_DATAPAUSEDr    InformationalResponserM   r'   append_establish_client_connectionlistr9   r	   CLOSEDr"   Response	REJECTINGDatar   rH   EndOfMessager   _process_connection_request)r*   rH   rG   r=   s       r,   r:   zH11Handshake.receive_data{   s     	))$+#6,,779 5#"6"67CMM)CJJ&{{eS%>%>?((C/++D,M,Me,TU++,(,U]](;,1,=,=). '6&<&<s||4"1";";DKLL''($($7(-(9(9%)  sxx0LL''"

%H  s'7'78LL''
4(PQ"1"8"8DKE3;;/##D$D$DU$KL[  ** ()$4$6 s   J +J>c              #  x   K   | j                   r*| j                   j                          | j                   r)yyw)z
        Return a generator that provides any events that have been generated
        by protocol activity.

        :returns: a generator that yields H11 events.
        N)r'   popleftr0   s    r,   eventszH11Handshake.events   s+      ll,,&&(( lls   5::c           	        |j                   dk7  rd}t        |t                     d }g }d }d }g }d}d }	g }
|j                  D ]  \  }}|j	                         }|dk(  rt        |      }nn|dk(  r|j                  d      }>|dk(  r|j                  t        |             ^|d	k(  r|}n/|d
k(  r|j                  t        |             |dk(  r|}	n|dk(  r|}|
j                  ||f        |t        d |D              sd}t        |t                     |	t        k7  r%d}t        |t        dt        fg|	rdnd            |d}t        |t                     |j	                         t        k7  r-dt        j                          d}t        |t                     |d}t        |t                     t        ||
|||j                  j                  d            | _        | j                  S )Nr5   zRequest method must be GETrJ   r.   
   connections   hostidna   sec-websocket-extensions   sec-websocket-key   sec-websocket-protocols   sec-websocket-version   upgradec              3  B   K   | ]  }|j                         d k(    ywupgradeNlower.0tokens     r,   	<genexpr>z;H11Handshake._process_connection_request.<locals>.<genexpr>          0
+0EKKMY&0
   %Missing header, 'Connection: Upgrade'z'Missing header, 'Sec-WebSocket-Version'   Sec-WebSocket-Versioni  i  )r9   rM   z#Missing header, 'Sec-WebSocket-Key'Missing header, 'Upgrade: 'zMissing header, 'Host'ascii)
extensionsextra_headershostsubprotocolsr8   )r7   r   r   r9   rl   r   decodeextendrU   anyWEBSOCKET_VERSIONWEBSOCKET_UPGRADEr   r8   r(   )r*   rG   r=   connection_tokensrx   rz   keyr{   rj   versionr9   namevalues                r,   r]   z(H11Handshake._process_connection_request   sO    <<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/$
  '''r.   c                d   | j                   J t        | j                   j                        }|d   }t        |      }dt        fdd|fg}|j
                  h|j
                  | j                   j                  vrd|j
                   }t        |      |j                  d|j
                  j                  d      f       |j                  rIt        t        d| j                   j                        |j                        }|r|j                  d	|f       t        j                  d
||j                  z   d      }t        | j                   rt"        j$                  nt"        j&                  |j                        | _        t*        j,                  | _        | j0                  j3                  |      xs dS )Nre      Upgrades
   Connectionr   s   Sec-WebSocket-Acceptzunexpected subprotocol    Sec-WebSocket-Protocolrw   zSequence[str]   Sec-WebSocket-ExtensionsrL   s   Switching Protocols)rM   r9   reasonr.   )r(   r   ry   r   r   subprotocolr{   r   rU   encoderx   server_extensions_handshaker   r#   rT   r   r    r
   r   r%   r&   r	   OPENr"   r$   r;   )	r*   rG   request_headersnonceaccept_tokenr9   r=   acceptsresponses	            r,   rD   z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,,e111)

 &%)[[N!!n6K6K
 &**##((29c9r.   c                ,   | j                   t        j                  k7  rd| j                    }t        |      t	        |j
                        }|j                  s|j                  d       t        j                  |j                  |      }| j                  j                  |      xs d}t        j                  | _        |j                  sI|| j                  j                  t        j                               xs dz  }t        j                   | _        |S )Nz'Connection cannot be rejected in state )s   content-length   0)rM   r9   r.   )r1   r	   r!   r   rW   r9   rN   rU   r#   rY   rM   r$   r;   rZ   r"   r\   rX   )r*   rG   r=   r9   r   rH   s         r,   rE   zH11Handshake._reject8  s    ::333;DJJ<HC$  u}}%~~NN45<<E,=,=wO##((29c%//~~D((--c.>.>.@AHSHD)00DKr.   c                   | j                   t        j                  k7  rd| j                    }t        |      | j                  j                  t        j                  |j                              xs d}|j                  rI|| j                  j                  t        j                               xs dz  }t        j                  | _        |S )Nz$Cannot send rejection data in state )rH   r.   )r1   r	   rZ   r   r$   r;   r#   r[   rH   rO   r\   rX   r"   )r*   rG   r=   rH   s       r,   rF   zH11Handshake._send_reject_dataJ  s    ::2228EC$  ##((uzz)BCJsD((--c.>.>.@AHSHD)00DKr.   c                   || _         t               | _        d|j                  j	                  d      fdt
        fdd| j                  fdt        fg}|j                  r;|j                  ddj                  |j                        j	                  d	      f       |j                  ri }|j                  D ]1  }t        |t              sJ |j                         ||j                  <   3 g }|j                         D ]`  \  }}|j	                  d	      }t        |t               r|s*|j                  |       <|j                  d
||j	                  d	      fz         b |r"|j                  ddj                  |      f       t#        j$                  d|j&                  j	                  d	      ||j(                  z         }	| j*                  j-                  |	      xs dS )Ns   Hostrc   r   r   s   Sec-WebSocket-Keyrt   r   z, rw      %s; %sr      , r5   r6   r.   )r(   r   r)   rz   r   r   r   r{   rU   joinrx   rB   r   offerr   itemsboolr#   r   r8   ry   r$   r;   )
r*   requestr9   offerserx   r   paramsbnamerj   s
             r,   rC   z!H11Handshake._initiate_connectionY  s   #* $& gll))&12*+'!4;;/%'89
 NN-YYw334<<WE ,.F'' +!!Y///!"qvv+ J & SfG,fd+"))%0%%i5&--:P2Q&QRS  ;UZZ
=STU++>>((1g333

 ##((18S8r.   c                :   | j                   J | j                  J d }d }g }d }d}g }|j                  D ]q  \  }}	|j                         }|dk(  rt	        |	      }'|dk(  rt	        |	      }8|dk(  r|	}@|dk(  r|	j                  d      }W|dk(  r|	}_|j                  ||	f       s |t        d |D              sd	}
t        |
t               
      |j                         t        k7  r-dt        j                          d}
t        |
t               
      t        | j                        }||k7  rd}
t        |
t               
      |2|| j                   j                  vrd| }
t        |
t               
      t        |t        d| j                   j                              }t!        | j"                  rt$        j&                  nt$        j(                  || j*                  j,                  d         | _        t0        j2                  | _        t7        |||      S )Nr.   rb   rd   s   sec-websocket-acceptrf   rw   rg   c              3  B   K   | ]  }|j                         d k(    ywri   rk   rm   s     r,   rp   z<H11Handshake._establish_client_connection.<locals>.<genexpr>  rq   rr   rs   rJ   ru   rv   zBad accept tokenzunrecognized subprotocol Sequence[Extension]r   )rx   ry   r   )r(   r)   r9   rl   r   r|   rU   r~   r   r   r   r   r{   client_extensions_handshaker   rx   r   r    r
   r   r%   r$   trailing_datar&   r	   r   r"   r   )r*   rG   acceptr   r   r   rj   r9   r   r   r=   r   rx   s                r,   rV   z)H11Handshake._establish_client_connection  sE    ''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
 	
r.   c                h    | j                   j                   d| j                   d| j                   dS )Nz(client=z, state=))	__class____name__r    r1   r0   s    r,   __repr__zH11Handshake.__repr__  s/    ..))*(4;;-x

|STUUr.   N)r+   r
   returnNone)r   r	   )r   zConnection | None)r9   r   r<   zbytes | strr   r   )rG   r   r   bytes)rH   bytes | Noner   r   )r   zGenerator[Event, None, None])rG   zh11.Requestr   r   )rG   r   r   r   )rG   r   r   r   )rG   r   r   r   )r   r   r   r   )rG   zh11.InformationalResponser   r   )r   str)r   
__module____qualname____doc__r-   propertyr1   r3   r@   r;   r:   r`   r]   rD   rE   rF   rC   rV   r    r.   r,   r   r   )   s    >)   
  
 <<&1<	<*67Mr)L( L(	L(\(:T$)9VC
.C
	C
JVr.   r   c                \   i }| D ]  }|j                  dd      d   j                         }|D ]g  }|j                  |k(  s|j                  |      }t	        |t
              r|s7d||j                  <   G|J|j                  d      ||j                  <   i  |rg }|j                         D ]l  \  }}|j                  d      }	t	        |t
              r|sJ |j                  |	       =|dk(  r|j                  d|	z         W|j                  d	|	|fz         n d
j                  |      S y)z
    Agree on the extensions to use returning an appropriate header value.

    This returns None if there are no agreed extensions
    ;r   r   TNrw   r.   s   %sr   r   )
splitstripr   r   rB   r   r   r   rU   r   )
	requested	supportedr   r   r   	extensionr   rx   r   
name_bytess
             r,   r   r     s5    (*G 	E{{3"1%++-" 	EI~~%"))%0fd+26	/'.4mmG.DGINN+	E	E "$
#MMO 	DLD&W-J&$'v!!*-3!!%:"67!!)z6.B"BC	D zz*%%r.   c                   g }| D ]x  }|j                  dd      d   j                         }|D ]5  }|j                  |k(  s|j                  |       |j	                  |        _ d| }t        |t                      |S )Nr   r   r   zunrecognized extension rJ   )r   r   r   finalizerU   r   r   )acceptedr   rx   r   r   r   r=   s          r,   r   r     s    
 J ||C#A&,,." 		I~~%""6*!!),			 ,D62C% 0 2  r.   )r   Iterable[str]r   list[Extension]r   r   )r   r   r   r   r   r   )&r   
__future__r   collectionsr   typingr   r   r#   r3   r   r	   r
   r`   r   r   r   r   r   rx   r   	utilitiesr   r   r   r   r   r   collections.abcr   r   r   r   r   r   r   r   r   r   r.   r,   <module>r      s    # 
  C C R R !  ==   ! aV aVH!!)8!!H(;r.   