
     ftF                     @   d Z ddlmZ ddlmZmZmZmZmZm	Z	m
Z
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 dd
lmZmZmZmZm Z m!Z! dZ" G d d          Z#dee$         de	e         de
e%         fdZ&dee$         dee         de	e         fdZ'dS )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                   T   e Zd ZdZdeddfdZedefd            Zede	e
         fd            Zded	eeef         ddfd
ZdedefdZde	e         ddfdZdeeddf         fdZdej        defdZdedefdZdedefdZdedefdZdedefdZdej         defdZ!defdZ"dS )H11Handshakez4A Handshake implementation for HTTP/1.1 connections.connection_typereturnNc                 :   |t           j        u | _        t          j        | _        | j        r$t          j        t          j                  | _        n#t          j        t          j	                  | _        d | _
        t                      | _        d | _        d | _        d S N)r   CLIENTclientr   
CONNECTING_stateh11r   _h11_connectionSERVER_connectionr   _events_initiating_request_nonce)selfr    s     T/var/www/api.educacionweb.es/myenv/lib/python3.11/site-packages/wsproto/handshake.py__init__zH11Handshake.__init__*   sv    %)>>%0; 	>#&>#*#=#=D  #&>#*#=#=D 15%*WW6: '+    c                     | j         S r#   )r'   r/   s    r0   statezH11Handshake.state8   s
    {r2   c                     | j         S )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+   r4   s    r0   
connectionzH11Handshake.connection<   s     r2   headerspathc                     | j         rt          d          t          j        d||          }t          j        t          j                  }|                     |                    |                     dS )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targetr8   N)r%   r   r(   r   r   r$   receive_datasend)r/   r8   r9   upgrade_request
h11_clients        r0   initiate_upgrade_connectionz(H11Handshake.initiate_upgrade_connectionH   sr     ; 	$Q   +VD'RRR^CJ//
*///::;;;;;r2   eventc                    d}t          |t                    r||                     |          z  }nt          |t                    r||                     |          z  }not          |t
                    r||                     |          z  }nAt          |t                    r||                     |          z  }nt          d| d          |S )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
        r2   zEvent z$ cannot be sent during the handshake)

isinstancer   _initiate_connectionr   _acceptr   _rejectr   _send_reject_datar   r/   rD   datas      r0   r@   zH11Handshake.send[   s     eW%% 	D--e444DD/00 		DLL'''DD/00 	DLL'''DDz** 	D**5111DD$DDDD   r2   rL   c                 J   | j                             |pd           	 	 | j                                         }n0# t          j        $ r t	          dt                                w xY wt          |t          j                  s|t          j        u s|t          j	        u rd	S | j
        rt          |t          j                  r|j        dk    r/| j                            |                     |                     n| j                            t          t!          |j                  |j        d                     t$          j        | _        nRt          |t          j                  rSt$          j        | _        | j                            t          t!          |j                  |j        d                     nt          |t          j                  r/| j                            t1          |j        d                     nt          |t          j                  r:| j                            t1          dd                     t$          j        | _        nGt          |t          j                  r-| j                            |                     |                     )
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.
        r2   TzBad HTTP message
event_hinte   F)r8   status_codehas_body)rL   body_finishedN)r)   r?   
next_eventr(   r   r   rF   ConnectionClosed	NEED_DATAPAUSEDr%   InformationalResponserQ   r,   append_establish_client_connectionlistr8   r   CLOSEDr'   Response	REJECTINGDatar   rL   EndOfMessager   _process_connection_request)r/   rL   rD   s      r0   r?   zH11Handshake.receive_datat   s    	))$+#666-	Q,7799*   )&3C3E3E   
 5#"677CM))CJ&&{ QeS%>?? 9(C//++D,M,Me,T,TUUUU++,(,U](;(;,1,=).     '6&<s|44 9"1";DKL''($($7$7(-(9%)       sx00 9L''"
%HHH     s'788 9L''
4(P(P(PQQQ"1"8DKeS[11 QL''(H(H(O(OPPP[-	Qs	   9 -A&c              #   `   K   | j         r$| j                                         V  | j         "dS dS )zReturn a generator that provides any events that have been generated
        by protocol activity.

        :returns: a generator that yields H11 events.
        N)r,   popleftr4   s    r0   eventszH11Handshake.events   sL       l 	),&&((((( l 	) 	) 	) 	) 	)r2   c           	      R   |j         dk    rt          dt                                d }g }d }d }g }d}d }g }	|j        D ]\  }
}|
                                }
|
dk    rt          |          }n|
dk    r|                    d          }K|
dk    r#|                    t          |                     t|
d	k    r|}n:|
d
k    r#|                    t          |                     |
dk    r|}n|
dk    r|}|	                    |
|f           |t          d |D                       st          dt                                |t          k    r,t          dt          dt          fg|rdnd                    |t          dt                                |                                dk    rt          dt                                |t          dt                                t          ||	|||j                            d                    | _        | j        S )Nr;   zRequest method must be GETrN   r2   
   connections   hostidna   sec-websocket-extensions   sec-websocket-key   sec-websocket-protocols   sec-websocket-version   upgradec              3   F   K   | ]}|                                 d k    V  dS upgradeNlower.0tokens     r0   	<genexpr>z;H11Handshake._process_connection_request.<locals>.<genexpr>   @       0
 0
+0EKKMMY&0
 0
 0
 0
 0
 0
r2   %Missing header, 'Connection: Upgrade'z'Missing header, 'Sec-WebSocket-Version'   Sec-WebSocket-Versioni  i  )r8   rQ   z#Missing header, 'Sec-WebSocket-Key'	   websocket$Missing header, 'Upgrade: WebSocket'zMissing header, 'Host'ascii)
extensionsextra_headershostsubprotocolsr>   )r=   r   r   r8   rp   r   decodeextendrY   anyWEBSOCKET_VERSIONr   r>   r-   )r/   rD   connection_tokensr{   r}   keyr~   rn   versionr8   namevalues               r0   ra   z(H11Handshake._process_connection_request   s    <6!!%,9I9K9K    ! "
"$ = 	* 	*KD%::<<D}$$$6u$=$=!!||F++444!!"4U";";<<<---222##$6u$=$=>>>111##NND%=))))$C 0
 0
4E0
 0
 0
 -
 -
$ &7DTDVDV    '''%9+68IJK'. 7C      ;%5BRBTBT    ==??l**%6CSCUCU    <%(5E5G5G    $+!!%<&&w//$
 $
 $
  ''r2   c                     | j         J t          | j         j                  }|d         }t          |          }ddd|fg}|j        Y|j        | j         j        vrt          d|j                   |                    d|j                            d          f           |j	        rVt          t          t          t                   | j         j	                  |j	                  }|r|                    d|f           t          j        d	||j        z   
          }t!          | j        rt$          j        nt$          j        |j	                  | _        t,          j        | _        | j                            |          pdS )Nri      Upgrades	   WebSockets
   Connectionr   s   Sec-WebSocket-Acceptzunexpected subprotocol    Sec-WebSocket-Protocolrz      Sec-WebSocket-ExtensionsrP   rQ   r8   r2   )r-   r   r|   r   subprotocolr~   r   rY   encoder{   server_extensions_handshaker   r   strr(   rX   r   r%   r   r$   r*   r+   r   OPENr'   r)   r@   )r/   rD   request_headersnonceaccept_tokenr8   acceptsresponses           r0   rH   zH11Handshake._accept   s   '333,T-E-STT 45,U33 ''$l3
 ( (@(MMM()V5CT)V)VWWWNN*E,=,D,DW,M,MN    	G1Xc]D$<$GHH  G  G ;WEFFF,Wu/B%B
 
 
 &%)[KN!!n6K
 
 &*#((229c9r2   c                    | j         t          j        k    rt          d| j         z            t	          |j                  }|j        s|                    d           t          j	        |j
        |          }| j                            |          pd}t          j        | _        |j        sA|| j                            t          j                              pdz  }t          j        | _        |S )Nz)Connection cannot be rejected in state %s)s   content-length   0r   r2   )r5   r   r&   r   r[   r8   rR   rY   r(   r]   rQ   r)   r@   r^   r'   r`   r\   )r/   rD   r8   r   rL   s        r0   rI   zH11Handshake._reject%  s    :333$;djH   u}%%~ 	6NN4555<E,=wOOO#((229c%/~ 	1D(--c.>.@.@AAHSHD)0DKr2   c                 V   | j         t          j        k    rt          d| j                    | j                            t          j        |j                            pd}|j	        rA|| j                            t          j
                              pdz  }t          j        | _        |S )Nz$Cannot send rejection data in state )rL   r2   )r5   r   r^   r   r)   r@   r(   r_   rL   rS   r`   r\   r'   rK   s      r0   rJ   zH11Handshake._send_reject_data6  s    :222$CtzCC   #((uz)B)B)BCCJs 	1D(--c.>.@.@AAHSHD)0DKr2   requestc                    || _         t                      | _        d|j                            d          fddd| j        fdt
          fg}|j        rB|                    dd                    |j                                      d	          f           |j	        ri }|j	        D ]5}t          |t                    sJ |                                ||j        <   6g }|                                D ]t\  }}|                    d	          }t          |t                    r|r|                    |           G|                    d
||                    d	          fz             u|r*|                    dd                    |          f           t!          j        d|j                            d	          ||j        z             }	| j                            |	          pdS )Ns   Hostrg   r   r   s   Sec-WebSocket-Keyrw   r   z, rz      %s; %sr      , r;   r<   r2   )r-   r   r.   r}   r   r   r~   rY   joinr{   rF   r   offerr   itemsboolr(   r   r>   r|   r)   r@   )
r/   r   r8   offerser{   r   paramsbnamern   s
             r0   rG   z!H11Handshake._initiate_connectionD  s   #* $&& gl))&112&'!4;/%'89
  	NN-YYw344<<WEE    	V24F' + +!!Y/////!"qvJ & S SfG,,fd++ S 1"))%000%%i5&--:P:P2Q&QRRRR V ;UZZ
=S=STUUU+>((11g33
 
 

 #((118S8r2   c                 F   | j         J | j        J d }d }g }d }d}g }|j        D ]\  }}	|                                }|dk    rt	          |	          }/|dk    rt	          |	          }E|dk    r|	}N|dk    r|	                    d          }j|dk    r|	}s|                    ||	f           |t          d |D                       st          d	t                      
          |                                dk    rt          dt                      
          t          | j                  }
||
k    rt          dt                      
          |.|| j         j        vr t          d| t                      
          t          |t          t          t                   | j         j                            }t#          | j        rt&          j        nt&          j        || j        j        d                   | _        t2          j        | _        t9          |||          S )Nr2   rf   rh   s   sec-websocket-acceptrj   rz   rk   c              3   F   K   | ]}|                                 d k    V  dS rm   ro   rq   s     r0   rt   z<H11Handshake._establish_client_connection.<locals>.<genexpr>  ru   r2   rv   rN   rx   ry   zBad accept tokenzunrecognized subprotocol r   )r{   r|   r   )r-   r.   r8   rp   r   r   rY   r   r   r   r   r~   client_extensions_handshaker   r   r   r{   r   r%   r   r$   r*   r)   trailing_datar+   r   r   r'   r   )r/   rD   acceptr   r   r   rn   r8   r   r   r   r{   s               r0   rZ   z)H11Handshake._establish_client_connectiono  s    '333{&&&  = 	* 	*KD%::<<D}$$$6u$=$=!444,U33000222#ll733##NND%=))))$C 0
 0
4E0
 0
 0
 -
 -
$ &7DTDVDV    ==??l**%6CSCUCU    -T[99\!!%&8EUEWEWXXXX"$":"GGG)===/11    1T(9-t/G/RSS
 

 &%)[KN!!n6K .q1
 

 &*!k
 
 
 	
r2   c                 X    d                     | j        j        | j        | j                  S )Nz{}(client={}, state={}))format	__class____name__r%   r5   r4   s    r0   __repr__zH11Handshake.__repr__  s*    (//N#T[$*
 
 	
r2   )#r   
__module____qualname____doc__r   r1   propertyr   r5   r
   r   r7   r   r   bytesr   rC   r   r@   r?   r   rd   r(   r   ra   r   rH   r   rI   r   rJ   rG   rX   rZ   r    r2   r0   r   r   '   s6       >>, ,4 , , , ,     X 	 HZ0 	  	  	  X	 <<&+E3J&7<	< < < <&% E    26Q% 6QT 6Q 6Q 6Q 6Qp)	%t"34 ) ) ) )E([E(	E( E( E( E(N%:- %:% %: %: %: %:N- %    "
z 
e 
 
 
 
)9G )9 )9 )9 )9 )9V?
.?
	?
 ?
 ?
 ?
B
# 
 
 
 
 
 
r2   r   	requested	supportedr!   c                    i }| D ]}|                     dd          d                                         }|D ]c}|j        |k    rV|                    |          }t	          |t
                    r|r
d||j        <   D||                    d          ||j        <   d|rg }|                                D ]\  }}|                    d          }	t	          |t
                    r|sJ |                    |	           I|dk    r|                    d|	z             h|                    d	|	|fz             d
	                    |          S dS )zAgree on the extensions to use returning an appropriate header value.

    This returns None if there are no agreed extensions
    ;r   r   TNrz   r2   s   %sr   r   )
splitstripr   r   rF   r   r   r   rY   r   )
r   r   r   r   r   	extensionr   r{   r   
name_bytess
             r0   r   r     s    .0G 	E 	E{{3""1%++--" 	E 	EI~%%"))%00fd++ E 726	/'.4mmG.D.DGIN+	E  &"$
#MMOO 		H 		HLD&W--J&$'' H!!*----S==%%ez&:;;;;%%i:v2F&FGGGGzz*%%%4r2   acceptedc                 (   g }| D ]}|                     dd          d                                         }|D ]9}|j        |k    r,|                    |           |                    |            n!:t          d| t                                |S )Nr   r   r   zunrecognized extension rN   )r   r   r   finalizerY   r   r   )r   r   r{   r   r   r   s         r0   r   r     s    
 J 
 
||C##A&,,.." 	 	I~%%""6***!!),,, &
 &0$00=M=O=O    
 r2   )(r   collectionsr   typingr   r   r   r   r   r	   r
   r   r   r(   r7   r   r   r   rd   r   r   r   r   r   r{   r   r   	utilitiesr   r   r   r   r   r   r   r   r   r   r   r   r   r2   r0   <module>r      s         
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 C C C C C C C C C C R R R R R R R R R R R R R R ! ! ! ! ! !                       L
 L
 L
 L
 L
 L
 L
 L
^!}!)-i!e_! ! ! !Hsm(0(;	)_     r2   