
    ,htF                        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'y)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                   B   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"y)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 | _        y N)r   CLIENTclientr   
CONNECTING_stateh11r   _h11_connectionSERVER_connectionr   _events_initiating_request_nonce)selfr    s     S/var/www/html/Resume-Scraper/venv/lib/python3.12/site-packages/wsproto/handshake.py__init__zH11Handshake.__init__*   sr    %)>)>>%00;;#&>>#**#=D #&>>#**#=D 15%*W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
                        }| j                  |j                  |             y)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   sX     ;;$Q  ++VD'R^^CJJ/
*///:;r2   eventc                 T   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 t        d| d      )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4D  /0DLL''D  /0DLL''D  z*D**511D
  %CD r2   rL   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 t	        dt                     w xY w)
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,,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eS[[1LL''(H(H(OP[  ** )&3C3E s   J )J<c              #   x   K   | j                   r*| j                   j                          | j                   r)yyw)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   s+      ll,,&&(( lls   5::c           	         |j                   dk7  rt        d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t        dt                     |t        k7  r#t        dt        dt        fg|rdnd            |t        dt                     |j	                         dk7  rt        dt                     |t        dt                     t        ||	|||j                  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   B   K   | ]  }|j                         d k(    ywupgradeNlower.0tokens     r0   	<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  )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!%,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/$
  '''r2   c                 h   | j                   J t        | j                   j                        }|d   }t        |      }ddd|fg}|j                  f|j                  | j                   j
                  vrt        d|j                         |j                  d|j                  j                  d      f       |j                  rTt        t        t        t           | j                   j                        |j                        }|r|j                  d|f       t        j                  d	||j                  z   
      }t!        | j"                  rt$        j&                  nt$        j(                  |j                        | _        t,        j.                  | _        | j2                  j5                  |      xs dS )Nri      Upgrades	   WebSockets
   Connectionr   s   Sec-WebSocket-Acceptzunexpected subprotocol    Sec-WebSocket-Protocolr{      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,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,,Wu/B/B%B
 &%)[[N!!n6K6K
 &**##((29c9r2   c                 (   | j                   t        j                  k7  rt        d| j                   z        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)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$;djjH  u}}%~~NN45<<E,=,=wO##((29c%//~~D((--c.>.>.@AHSHD)00DKr2   c                    | j                   t        j                  k7  rt        d| j                          | 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 )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$6tzzlC  ##((uzz)BCJsD((--c.>.>.@AHSHD)00DKr2   requestc                    || _         t               | _        d|j                  j	                  d      fd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   Hostrg   r   r   s   Sec-WebSocket-Keyrx   r   z, r{      %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   #* $& gll))&12&'!4;;/%'89
 NN-YYw334<<WE 24F'' +!!Y//!"qvv+ J & SfG,fd+"))%0%%i5&--:P2Q&QRS  ;UZZ
=STU++>>((1g333

 ##((18S8r2   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t        d	t               
      |j                         dk7  rt        dt               
      t        | j                        }
||
k7  rt        dt               
      |0|| 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        j4                  | _        t9        |||      S )Nr2   rf   rh   s   sec-websocket-acceptrj   r{   rk   c              3   B   K   | ]  }|j                         d k(    ywrm   ro   rq   s     r0   rt   z<H11Handshake._establish_client_connection.<locals>.<genexpr>  ru   rv   rw   rN   ry   rz   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{{&&  == 	*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
 	
r2   c                 x    dj                  | j                  j                  | j                  | j                        S )Nz{}(client={}, state={}))format	__class____name__r%   r5   r4   s    r0   __repr__zH11Handshake.__repr__  s.    (//NN##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   '   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
# 
r2   r   	requested	supportedr!   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)zAgree on the extensions to use returning an appropriate header value.

    This returns None if there are no agreed extensions
    ;r   r   TNr{   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     s3    .0G 	E{{3"1%++-" 	EI~~%"))%0fd+26	/'.4mmG.DGINN+	E	E "$
#MMO 		HLD&W-J&$'!!*-S=%%ez&:;%%i:v2F&FG		H zz*%%r2   acceptedc                     g }| D ]v  }|j                  dd      d   j                         }|D ]5  }|j                  |k(  s|j                  |       |j	                  |        _ 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=M=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 R R !    L
 L
^!}!)-i!e_!Hsm(0(;	)_r2   