ó
    Y§•j†  ã                   ó4  • S r SSKrSSKrSSKrSSKrSSKJr  SSKJ	r	  SSK
JrJrJr  SSKJr  SSKJrJr  SS	KJr  SS
KJrJr  SSKJr  / SQrSr\	R8                  \	R:                  \	R<                  \	R>                  \	R@                  4r!\!\	RD                  4-   r#\" 5       r$ " S S5      r%S\R                  S\&S\&S\'S\&S\S\%4S jr(S\&S\&4S jr)S\&S\&S\&S\'S\*S\+4S jr,\#4S\R                  S\+S\+4S jjr-SSS.r.S \*S!\&S"\\\&      S\+4S# jr/S\&4S$ jr0g)%ad  
_handshake.py
websocket - WebSocket client library for Python

Copyright 2026 engn33r

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
é    N)Úencodebytes)Ú
HTTPStatus)ÚAnyÚListÚOptionalé   )ÚSimpleCookieJar)ÚWebSocketExceptionÚWebSocketBadStatusException)Úread_headers)ÚdumpÚerror)Úsend)Úhandshake_responseÚ	handshakeÚSUPPORTED_REDIRECT_STATUSESé   c                   ó4   • \ rS rSrS\S\S\\   SS4S jrSr	g)	r   é3   ÚstatusÚheadersÚsubprotocolÚreturnNc                 óp   • Xl         X l        X0l        [        R	                  UR                  S5      5        g )Nz
set-cookie)r   r   r   Ú	CookieJarÚaddÚget)Úselfr   r   r   s       Ú¢C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\websocket/_handshake.pyÚ__init__Úhandshake_response.__init__4   s'   € ØŒØŒØ&ÔÜ�‰�g—k‘k ,Ó/Õ0ó    )r   r   r   )
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__ÚintÚdictr   Ústrr    Ú__static_attributes__© r"   r   r   r   3   s(   † ð1˜sð 1¨Tð 1ÀÈÁð 1ÐRV÷ 1r"   r   ÚsockÚurlÚhostnameÚportÚresourceÚoptionsr   c                 ó,  • [        XAX#U5      u  pgSR                  U5      n[        X5        [        SU5        [	        U 5      u  pšU	[
        ;   a  [        XšS 5      $ [        X§UR                  S5      5      u  p¼U(       d  [        S5      e[        XšU5      $ )Nz
zrequest headerÚsubprotocolszInvalid WebSocket Header)
Ú_get_handshake_headersÚjoinr   r   Ú_get_resp_headersr   r   Ú	_validater   r
   )r,   r-   r.   r/   r0   r1   r   ÚkeyÚ
header_strr   ÚrespÚsuccessÚsubprotos                r   r   r   ;   s‹   € ô *¨(¸ÈÓQ�L€Gà—‘˜WÓ%€JÜˆÔÜÐ	˜:Ô&ä$ TÓ*�L€FØÔ,Ó,Ü! &°Ó5Ð5Ü! $¨W¯[©[¸Ó-HÓIÑ€GÞÜ Ð!;Ó<Ð<ä˜f¨HÓ5Ð5r"   c                 ó   • SU ;   a  SU  S3$ U $ )NÚ:Ú[Ú]r+   )r.   s    r   Ú_pack_hostnamerA   S   s   € à
ˆhƒØ�8�*˜AˆÐØ€Or"   Úhostc                 óÆ  • SU  S3S/nUS;   a  [        U5      nO[        U5       SU 3nUR                  S5      (       dB  UR                  S5      (       a  UR                  SUS    35        OUR                  SU 35        UR                  SS	5      u  pqUR                  S
5      (       dS  SU;   a  US   b  UR                  SUS    35        O/US:X  a  UR                  SU 35        OUR                  SU 35        [	        5       nUR                  S5      (       a	  SUS   ;  a  UR                  SU 35        OUS   S   nUR                  S5      (       a	  SUS   ;  a  UR                  S[
         35        UR                  S5      (       d  UR                  S5        OUR                  US   5        UR                  S5      =n	(       a#  UR                  SSR                  U	5       35        UR                  S5      =n
(       a_  [        U
[        5      (       a9  U
R                  5        VVs/ s H  u  p¼Uc  M
  SR                  X¼/5      PM     n
nnUR                  U
5        [        R                  U5      nUR                  SS 5      nSR                  [        S XÞ/5      5      =n(       a  UR                  SU 35        UR                  S5        XX4$ s  snnf )NzGET z	 HTTP/1.1zUpgrade: websocket)éP   i»  r>   Úsuppress_hostrB   zHost: r   Úsuppress_originÚoriginzOrigin: ÚwsszOrigin: https://zOrigin: http://ÚheaderzSec-WebSocket-KeyzSec-WebSocket-Key: zSec-WebSocket-VersionzSec-WebSocket-Version: Ú
connectionzConnection: Upgrader3   zSec-WebSocket-Protocol: Ú,z: Úcookiez; zCookie: )Ú rM   )rA   r   ÚappendÚsplitÚ_create_sec_websocket_keyÚVERSIONr5   Ú
isinstancer(   ÚitemsÚextendr   Úfilter)r0   r-   rB   r/   r1   r   ÚhostportÚschemer8   r3   rI   ÚkÚvÚserver_cookieÚclient_cookierL   s                   r   r4   r4   Z   s¡  € ð �h�Z˜yÐ)Ð+?Ð@€GØˆyÓÜ! $Ó'‰ä$ TÓ*Ð+¨1¨T¨FÐ3ˆØ�;‰;�×'Ñ'Ø�;‰;�v×ÑØ�N‰N˜V G¨F¡OÐ#4Ð5Õ6à�N‰N˜V H :Ð.Ô/ð —)‘)˜C Ó#�K€FØ�;‰;Ð(×)Ñ)Ø�wÓ 7¨8Ñ#4Ñ#@Ø�N‰N˜X g¨hÑ&7Ð%8Ð9Õ:Ø�u‹_Ø�N‰NÐ-¨h¨ZÐ8Õ9à�N‰N˜_¨X¨JÐ7Ô8ä
#Ó
%€Cð �;‰;�x× Ñ Ð$7¸wÀxÑ?PÓ$PØ�‰Ð,¨S¨EÐ2Õ3à�hÑÐ 3Ñ4ˆà�;‰;�x× Ñ Ð$;À7È8ÑCTÓ$TØ�‰Ð0´°	Ð:Ô;à�;‰;�|×$Ñ$Ø�‰Ð,Õ-à�‰�w˜|Ñ,Ô-à—{‘{ >Ó2Ð2€|Õ2Ø�‰Ð1°#·(±(¸<Ó2HÐ1IÐJÔKà—‘˜XÓ&Ð&€vÕ&Ü�fœd×#Ñ#Ø4:·L±L´NÔT²N©D¨AÀaÓ'�d—i‘i  Ö'±NˆFÑTØ�‰�vÔä—M‘M $Ó'€MØ—K‘K ¨$Ó/€Mà—‘œ6 $¨Ð(FÓGÓHÐH€vÕHØ�‰˜ & Ð*Ô+à‡N�N�8ÔØˆ<Ðùó Us   È4	KÉKÚsuccess_statusesc                 ó’  • [        U 5      u  p#nX!;  a•  UR                  S5      nU(       aI  SSKJn  Sn [	        U5      nUS:”  a.  [        US5      n	U" X	5      n
Xz-  nU[        U
5      -  nUS:”  a  M.  OS n[        SU S	U S
U S
U(       a  UR                  SSS9OS  3UUUU5      eX#4$ ! [
         a    [        SU< 35      ef = f)Nzcontent-lengthr   )Úrecvr"   zInvalid content-length header: r   i @  zHandshake status Ú z -+-+- úutf-8Úreplace)Úerrors)r   r   Ú_socketr^   r'   Ú
ValueErrorr
   ÚminÚlenr   Údecode)r,   r\   r   Úresp_headersÚstatus_messageÚcontent_lenr^   Úresponse_bodyÚ	remainingÚ
chunk_sizeÚchunks              r   r6   r6   •   s$  € ô ,8¸Ó+=Ñ(€F˜.ØÓ%Ø"×&Ñ&Ð'7Ó8ˆÞå%àˆMðÜ Ó,�	ð
 ˜a“-Ü  ¨EÓ2�
Ù˜TÓ.�ØÑ&�ØœS ›ZÑ'�	ð	 ˜a•-øð !ˆMÜ)Ø ˜x q¨Ð(8¸À¸~ÈWö  IVÐUb×UiÑUiÐjqð  {DÐUiñ  VEð  \`ð  Uað  bØØØØó
ð 	
ð ÐÐøô% ó Ü(Ø5°k±_ÐEóð ðús   µB, Â,CÚ	websocketÚupgrade)rp   rJ   r   r8   r3   c                 óŒ  • S n[         R                  5        Hc  u  pEU R                  US 5      nU(       d    gUR                  S5       Vs/ s H   owR	                  5       R                  5       PM"     nnXV;  d  Mc    g   U(       aj  U R                  SS 5      nU(       a2  UR                  5       U Vs/ s H  oˆR                  5       PM     sn;  a  [        SU 35        gUR                  5       nU R                  SS 5      n	U	(       d  gU	R                  5       n	[        U	[        5      (       a  U	R                  S5      n	U S3R                  S5      n
[        [        R                  " U
5      R                  5       5      R	                  5       R                  5       n[        R                  " X¹5      (       a  SU4$ gs  snf s  snf )	N)FNrK   zsec-websocket-protocolzInvalid subprotocol: zsec-websocket-acceptr`   z$258EAFA5-E914-47DA-95CA-C5AB0DC85B11T)Ú_HEADERS_TO_CHECKrS   r   rO   ÚstripÚlowerr   rR   r)   ÚencodeÚbase64encodeÚhashlibÚsha1ÚdigestÚhmacÚcompare_digest)r   r8   r3   r<   rX   rY   ÚrÚxÚsÚresultÚvalueÚhasheds               r   r7   r7   ½   sf  € Ø€HÜ!×'Ñ'Ö)‰ˆØ�K‰K˜˜4Ó ˆÞÙØ()¯©°¬Ó5ª 1�W‰W‹Y�_‰_Ö©ˆÐ5Ø�:Ùñ *ö Ø—;‘;Ð7¸Ó>ˆÞ˜8Ÿ>™>Ó+Á|Ó3TÂ|À!·G±G¶IÁ|Ñ3TÓTÜÐ)¨,¨Ð8Ô9ØØ—>‘>Ó#ˆà�[‰[Ð/°Ó6€FÞØØ�\‰\‹^€Fä�&œ#×ÑØ—‘˜wÓ'ˆàˆeÐ7Ð8×?Ñ?ÀÓH€EÜœ'Ÿ,š, uÓ-×4Ñ4Ó6Ó7×=Ñ=Ó?×EÑEÓG€Fä×Ò˜6×*Ñ*Ø�Xˆ~Ðàùò3 6ùò 4Us   Á
'F<Â1Gc                  ó~   • [         R                  " S5      n [        U 5      R                  S5      R	                  5       $ )Né   r`   )ÚosÚurandomrv   rg   rs   )Ú
randomnesss    r   rP   rP   ß   s.   € Ü—’˜B“€JÜ˜
Ó#×*Ñ*¨7Ó3×9Ñ9Ó;Ð;r"   )1Ú__doc__rw   rz   r„   ÚsocketÚbase64r   rv   Úhttpr   Útypingr   r   r   Ú
_cookiejarr	   Ú_exceptionsr
   r   Ú_httpr   Ú_loggingr   r   rc   r   Ú__all__rQ   ÚMOVED_PERMANENTLYÚFOUNDÚ	SEE_OTHERÚTEMPORARY_REDIRECTÚPERMANENT_REDIRECTr   ÚSWITCHING_PROTOCOLSÚSUCCESS_STATUSESr   r   r)   r'   r   rA   r(   Útupler4   r6   rr   r7   rP   r+   r"   r   Ú<module>r™      s¡  ðñó& Û Û 	Û Ý .Ý ß &Ñ &å 'ß HÝ ß !Ý â
L€ð €ð × Ñ Ø×ÑØ×ÑØ×!Ñ!Ø×!Ñ!ðÐ ð /°*×2PÑ2PÐ1RÑRÐ áÓ€	÷1ñ 1ð6Ø
�-‰-ð6à	ð6ð ð6ð ð	6ð
 ð6ð ð6ð ô6ð0˜Sð  Sô ð8Øð8Øð8Ø#&ð8Ø.1ð8Ø<@ð8à
ô8ðx 4Dñ Ø
�-‰-ð Ø+0ð à
õ ðF ØñÐ ð�tð  #ð °X¸dÀ3¹iÑ5Hð ÈUô ðD< 3õ <r"   