Ë
    è×ïi˜F  ã                   ó.  — d dl Z d dlZ d dlZd dlZd dlZd dlmZmZ	 d dl
mZ d dlmZ d dlmZ 	 	 d dlZd dlmZ e j*                  j-                  d	d
«      dk(  Ze j*                  j-                  dd«      Zedk7  ZdZd„ Z G d„ d«      Z G d„ de«      Z G d„ dej<                  «      Z G d„ dej<                  «      Z  G d„ dej<                  «      Z! G d„ dej<                  «      Z"e#dk(  r ejH                  «        yy# e$ r  G d„ de«      ZY ŒØw xY w)é    N)Ú_create_sec_websocket_keyÚ	_validate)Úread_headers)Úvalidate_utf8)Údecodebytes)ÚSSLErrorc                   ó   — e Zd Zy)r   N)Ú__name__Ú
__module__Ú__qualname__© ó    úX/var/www/html/aiagents/fe/lib/python3.12/site-packages/websocket/tests/test_websocket.pyr   r   &   s   „ Ør   r   ÚTEST_WITH_INTERNETÚ0Ú1ÚLOCAL_WS_SERVER_PORTz-1Tc                  ó   — y)NÚabcdr   )Ú_s    r   Úcreate_mask_keyr   1   s   € Ør   c                   ó0   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚSockMockc                 ó    — g | _         g | _        y ©N)ÚdataÚsent©Úselfs    r   Ú__init__zSockMock.__init__6   s   € ØˆŒ	Øˆ�	r   c                 ó:   — | j                   j                  |«       y r   )r   Úappend©r   r   s     r   Ú
add_packetzSockMock.add_packet:   s   € Ø�	‰	×Ñ˜Õr   c                  ó   — y r   r   r   s    r   Ú
gettimeoutzSockMock.gettimeout=   s   € Ør   c                 óÚ   — | j                   r_| j                   j                  d«      }t        |t        «      r|‚t	        |«      |kD  r| j                   j                  d||d  «       |d | S y )Nr   )r   ÚpopÚ
isinstanceÚ	ExceptionÚlenÚinsert)r   ÚbufsizeÚes      r   ÚrecvzSockMock.recv@   sa   € Ø�9Š9Ø—	‘	—‘˜aÓ ˆAÜ˜!œYÔ'Ø�Ü�1‹v˜ÒØ—	‘	× Ñ   A g h KÔ0Ø�X�g�;Ðð r   c                 óN   — | j                   j                  |«       t        |«      S r   )r   r"   r+   r#   s     r   ÚsendzSockMock.sendI   s   € Ø�	‰	×Ñ˜ÔÜ�4‹yÐr   c                  ó   — y r   r   r   s    r   ÚclosezSockMock.closeM   ó   € Ør   N)	r
   r   r   r    r$   r&   r/   r1   r3   r   r   r   r   r   5   s    „ òòòòòór   r   c                   ó   — e Zd Zd„ Zy)ÚHeaderSockMockc                 ó0  — t         j                  | «       t        j                  j	                  t        j                  j                  t        «      |«      }t        |d«      5 }| j                  |j                  «       «       d d d «       y # 1 sw Y   y xY w)NÚrb)
r   r    ÚosÚpathÚjoinÚdirnameÚ__file__Úopenr$   Úread)r   Úfnamer:   Úfs       r   r    zHeaderSockMock.__init__S   sd   € Ü×Ñ˜$ÔÜ�w‰w�|‰|œBŸG™GŸO™O¬HÓ5°uÓ=ˆÜ�$˜Óð 	& Ø�O‰O˜AŸF™F›HÔ%÷	&÷ 	&ñ 	&ús   Á# BÂBN)r
   r   r   r    r   r   r   r6   r6   Q   s   „ ó&r   r6   c                   ó  — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Z ej                  ed
«      d„ «       Z ej                  ed
«      d„ «       Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z ej                  ed«      d„ «       Z ej                  ed«      d„ «       Z ej                  ed
«      d„ «       Z ej                  ed
«      d„ «       Z ej                  ed«      d„ «       Z ej                  ed«      d„ «       Zy)ÚWebSocketTestc                 ó6   — t        j                  t        «       y r   )ÚwsÚenableTraceÚ	TRACEABLEr   s    r   ÚsetUpzWebSocketTest.setUp[   s   € Ü
�‰”yÕ!r   c                  ó   — y r   r   r   s    r   ÚtearDownzWebSocketTest.tearDown^   r4   r   c                 óè   — | j                  t        j                  «       d «       t        j                  d«       | j                  t        j                  «       d«       t        j                  d «       y )Né
   )ÚassertEqualrE   ÚgetdefaulttimeoutÚsetdefaulttimeoutr   s    r   ÚtestDefaultTimeoutz WebSocketTest.testDefaultTimeouta   sP   € Ø×Ñœ×-Ñ-Ó/°Ô6Ü
×Ñ˜RÔ Ø×Ñœ×-Ñ-Ó/°Ô4Ü
×Ñ˜TÕ"r   c                 óx   — t        «       }| j                  |dk7  «       | j                  t        d«      |v«       y )Né   u   Â¥n)r   Ú
assertTrueÚstr)r   Úkeys     r   Ú	testWSKeyzWebSocketTest.testWSKeyg   s/   € Ü'Ó)ˆØ�‰˜˜r™	Ô"Ø�‰œ˜E›
¨#Ð-Õ.r   c                 ó‚   — t        «       }t        |j                  d«      «      }| j                  dt	        |«      «       y)z9 WebSocket key should be a random 16-byte nonce.
        zutf-8é   N)r   Úbase64decodeÚencoderM   r+   )r   rU   Únonces      r   Ú	testNoncezWebSocketTest.testNoncel   s3   € ô (Ó)ˆÜ˜SŸZ™Z¨Ó0Ó1ˆØ×Ñ˜œS ›ZÕ(r   c                 ó¦  — d}ddddœ}| j                  t        ||d «      d«       |j                  «       }d|d<   | j                  t        ||d «      d«       |d= | j                  t        ||d «      d«       |j                  «       }d	|d
<   | j                  t        ||d «      d«       |d
= | j                  t        ||d «      d«       |j                  «       }d	|d<   | j                  t        ||d «      d«       |d= | j                  t        ||d «      d«       |j                  «       }d|d<   | j                  t        ||ddg«      d«       | j                  t        ||ddg«      d«       |j                  «       }d|d<   | j                  t        ||ddg«      d«       |j                  «       }| j                  t        ||ddg«      d«       y )Nzc6b8hTg4EeGb2gQMztV1/g==Ú	websocketÚupgradezKxep+hNu9n51529fGidYu7a3wO0=)r_   Ú
connectionúsec-websocket-accept)TNÚhttp)FNÚ	somethingr`   ra   Úsub1zsec-websocket-protocolÚsub2)Trd   Úsub3ÚsUb1ÚSub1ÚsuB2)rM   Ú_validate_headerÚcopy)r   rU   Úrequired_headerÚheaders       r   ÚtestWsUtilszWebSocketTest.testWsUtilss   sî  € Ø(ˆà"Ø#Ø$BñDˆð 	×ÑÔ)¨/¸3ÀÓEÀ|ÔTà ×%Ñ%Ó'ˆØ"ˆˆyÑØ×ÑÔ)¨&°#°tÓ<¸mÔLØ�9ÐØ×ÑÔ)¨&°#°tÓ<¸mÔLà ×%Ñ%Ó'ˆØ*ˆˆ|ÑØ×ÑÔ)¨&°#°tÓ<¸mÔLØ�<Ð Ø×ÑÔ)¨&°#°tÓ<¸mÔLà ×%Ñ%Ó'ˆØ)4ˆÐ%Ñ&Ø×ÑÔ)¨&°#°tÓ<¸mÔLØÐ)Ð*Ø×ÑÔ)¨&°#°tÓ<¸mÔLà ×%Ñ%Ó'ˆØ+1ˆÐ'Ñ(Ø×ÑÔ)¨&°#¸ÀÐ7GÓHÈ.ÔYà×ÑÔ)¨&°#¸ÀÐ7GÓHÈ-ÔXà ×%Ñ%Ó'ˆØ+1ˆÐ'Ñ(Ø×ÑÔ)¨&°#¸ÀÐ7GÓHÈ.ÔYà ×%Ñ%Ó'ˆà×ÑÔ)¨&°#¸ÀÐ7GÓHÈ-ÕXr   c                 ór  — t        t        d«      «      \  }}}| j                  |d«       | j                  |d   d«       t        t        d«      «      \  }}}| j                  |d«       | j                  |d   d«       t        d«       | j                  t        j
                  t         t        d«      «       y )Núdata/header01.txtée   r`   ÚUpgradezdata/header03.txtzUpgrade, Keep-Alivezdata/header02.txt)r   r6   rM   ÚassertRaisesrE   ÚWebSocketException)r   Ústatusrm   Ústatus_messages       r   ÚtestReadHeaderzWebSocketTest.testReadHeader›   s¢   € Ü)5´nÐEXÓ6YÓ)ZÑ&ˆ�˜Ø×Ñ˜ Ô%Ø×Ñ˜ Ñ-¨yÔ9ä)5´nÐEXÓ6YÓ)ZÑ&ˆ�˜Ø×Ñ˜ Ô%Ø×Ñ˜ Ñ-Ð/DÔEäÐ*Ô+Ø×Ñœ"×/Ñ/´¼~ÐNaÓ?bÕcr   c                 ó|  — t        j                  «       }|j                  t        «       t	        d«      x}|_        |j                  d«       | j                  |j                  d   d«       |j                  d«       | j                  |j                  d   d«       | j                  |j                  d«      d	«       y )
Nrp   ÚHellor   ó   �…abcd)õ   ã�“ã‚“ã�«ã�¡ã�¯é   ó   ��abcd‚ãð‡ãñ€åÊ�âÅ‚ãÌs   1111111111101é   )
rE   Ú	WebSocketÚset_mask_keyr   r6   Úsockr1   rM   r   Úsend_binary©r   r�   Úss      r   ÚtestSendzWebSocketTest.testSend§   s–   € ä�|‰|‹~ˆØ×Ñœ/Ô*Ü&Ð':Ó;Ð;ˆˆDŒIØ�	‰	�'ÔØ×Ñ˜Ÿ™ ™Ð$DÔEà�	‰	Ð#Ô$Ø×Ñ˜Ÿ™ ™Ð$oÔpð
 	×Ñ˜×)Ñ)Ð*:Ó;¸RÕ@r   c                 ó  — t        j                  «       }t        «       x}|_        d}|j	                  |«       |j                  «       }| j                  |d«       |j	                  d«       |j                  «       }| j                  |d«       y )Nr}   r{   rz   ry   )rE   r   r   r�   r$   r/   rM   )r   r�   r„   rc   r   s        r   ÚtestRecvzWebSocketTest.testRecv·   sp   € ä�|‰|‹~ˆÜ ›
Ð"ˆˆDŒIØ_ˆ	Ø	�‰�YÔØ�y‰y‹{ˆØ×Ñ˜Ð0Ô1à	�‰Ð5Ô6Ø�y‰y‹{ˆØ×Ñ˜˜wÕ'r   ú%Internet-requiring tests are disabledc                 óz   — d}t        j                  d«      }|j                  d«       |D ]  }|dz  }|dk(  sŒ y  y )Né   úwss://api.bitfinex.com/ws/2z+{"event": "subscribe", "channel": "ticker"}r|   r   )rE   Úcreate_connectionr1   )r   Úcountr„   r   s       r   ÚtestIterzWebSocketTest.testIterÄ   sG   € àˆÜ× Ñ Ð!>Ó?ˆØ	�‰Ð<Ô=Øò 	ˆAØ�Q‰JˆEØ˜‹zÙñ	r   c                 ó~   — t        j                  d«      }| j                  t        t	        t        |«      «      «       y )Nr‹   )rE   rŒ   rM   rT   ÚtypeÚnext)r   r�   s     r   ÚtestNextzWebSocketTest.testNextÎ   s,   € ä×#Ñ#Ð$AÓBˆØ×Ñœœd¤4¨£:Ó.Õ/r   c                 ó�  — t        j                  «       }t        «       x}|_        |j	                  d«       |j	                  t        j                  «       «       |j	                  d«       |j	                  d«       | j                  t         j                  «      5  |j                  j                  d«       d d d «       |j                  j                  d«      }| j                  |d«       | j                  t         j                  «      5  |j                  j                  d«       d d d «       y # 1 sw Y   ŒzxY w# 1 sw Y   y xY w)Ns   foos   bars   bazé	   s	   foobarbazr|   )rE   r   r   r�   r$   ÚsocketÚtimeoutrs   ÚWebSocketTimeoutExceptionÚframe_bufferÚrecv_strictrM   Ú"WebSocketConnectionClosedException©r   r�   r„   r   s       r   ÚtestInternalRecvStrictz$WebSocketTest.testInternalRecvStrictÓ   sù   € Ü�|‰|‹~ˆÜ ›
Ð"ˆˆDŒIØ	�‰�VÔØ	�‰”V—^‘^Ó%Ô&Ø	�‰�VÔà	�‰�VÔØ×Ñœr×;Ñ;Ó<ñ 	-Ø×Ñ×)Ñ)¨!Ô,÷	-ð × Ñ ×,Ñ,¨QÓ/ˆØ×Ñ˜˜|Ô,Ø×Ñœr×DÑDÓEñ 	-Ø×Ñ×)Ñ)¨!Ô,÷	-ð 	-÷	-ð 	-ú÷	-ð 	-ús   ÂD0ÄD<Ä0D9Ä<Ec                 ó  — t        j                  «       }t        «       x}|_        |j	                  d«       |j	                  t        j                  «       «       |j	                  d«       |j	                  t        j                  «       «       |j	                  d«       | j                  t         j                  «      5  |j                  «        d d d «       | j                  t         j                  «      5  |j                  «        d d d «       |j                  «       }| j                  |d«       | j                  t         j                  «      5  |j                  «        d d d «       y # 1 sw Y   ŒœxY w# 1 sw Y   ŒpxY w# 1 sw Y   y xY w)Nó   �s
   �abcd)s   NC3 @zHello, World!)rE   r   r   r�   r$   r•   r–   rs   r—   r/   rM   rš   r›   s       r   ÚtestRecvTimeoutzWebSocketTest.testRecvTimeoutä   s  € Ü�|‰|‹~ˆÜ ›
Ð"ˆˆDŒIØ	�‰�WÔØ	�‰”V—^‘^Ó%Ô&Ø	�‰Ð4Ô5Ø	�‰”V—^‘^Ó%Ô&Ø	�‰Ð8Ô9Ø×Ñœr×;Ñ;Ó<ñ 	Ø�I‰IŒK÷	à×Ñœr×;Ñ;Ó<ñ 	Ø�I‰IŒK÷	à�y‰y‹{ˆØ×Ñ˜˜Ô/Ø×Ñœr×DÑDÓEñ 	Ø�I‰IŒK÷	ð 	÷	ð 	ú÷	ð 	ú÷	ð 	ús$   Â>E*Ã6E6ÅFÅ*E3Å6E?ÆFc                 ó^  — t        j                  «       }t        «       x}|_        |j	                  d«       |j	                  d«       |j                  «       }| j                  |d«       | j                  t         j                  «      5  |j                  «        d d d «       y # 1 sw Y   y xY w)Nó   ‹abcd#DCó   €�abcd
DADzBrevity is the soul of wit©	rE   r   r   r�   r$   r/   rM   rs   rš   r›   s       r   ÚtestRecvWithSimpleFragmentationz-WebSocketTest.testRecvWithSimpleFragmentationõ   sƒ   € Ü�|‰|‹~ˆÜ ›
Ð"ˆˆDŒIà	�‰ÐGÔHà	�‰ÐQÔRØ�y‰y‹{ˆØ×Ñ˜Ð;Ô<Ø×Ñœr×DÑDÓEñ 	Ø�I‰IŒK÷	÷ 	ñ 	ús   Â	B#Â#B,c                 óÈ  — t        j                  d¬«      }t        «       x}|_        |j	                  d«       |j	                  d«       |j	                  d«       |j                  «       \  }}| j                  |d«       |j                  «       \  }}| j                  |d«       |j                  «       \  }}| j                  |d«       |j	                  d«       | j                  t         j                  «      5  |j                  «        d d d «       | j                  t         j                  «      5  |j                  «        d d d «       y # 1 sw Y   ŒBxY w# 1 sw Y   y xY w)	NT)Úfire_cont_framer¡   s    ‹abcd#DCr¢   s   Brevity is s   the soul of wits   €‹abcd#DC)rE   r   r   r�   r$   Ú	recv_datarM   rs   rt   rš   r/   )r   r�   r„   r   r   s        r   Ú$testRecvWithFireEventOfFragmentationz2WebSocketTest.testRecvWithFireEventOfFragmentation  s!  € Ü�|‰|¨DÔ1ˆÜ ›
Ð"ˆˆDŒIà	�‰ÐGÔHà	�‰ÐGÔHà	�‰ÐQÔRà—.‘.Ó"‰ˆˆ4Ø×Ñ˜˜~Ô.Ø—.‘.Ó"‰ˆˆ4Ø×Ñ˜˜~Ô.Ø—.‘.Ó"‰ˆˆ4Ø×Ñ˜Ð1Ô2ð 	
�‰ÐGÔHà×Ñœr×4Ñ4Ó5ñ 	Ø�N‰NÔ÷	ð ×Ñœr×DÑDÓEñ 	Ø�I‰IŒK÷	ð 	÷	ð 	ú÷	ð 	ús   Ã:EÄ2EÅEÅE!c                 ó$  — t        j                  «       }d|_        |j                   t        j                  «       }t	        «       x}|_        d|_        |j                  d«       |j                  «        | j                  |j                  d«       y )NTs   ˆ€˜p„F)	rE   r   Ú	connectedr3   r   r�   r$   r/   rM   rƒ   s      r   Ú	testClosezWebSocketTest.testClose  se   € Ü�|‰|‹~ˆØˆŒØ�
Š
ä�|‰|‹~ˆÜ ›
Ð"ˆˆDŒIØˆŒØ	�‰Ð-Ô.Ø�	‰	ŒØ×Ñ˜Ÿ™¨Õ/r   c                 óÄ   — t        j                  «       }t        «       x}|_        |j	                  d«       | j                  t         j                  |j                  «       y )Nr¢   )rE   r   r   r�   r$   rs   rt   r/   rƒ   s      r   ÚtestRecvContFragmentationz'WebSocketTest.testRecvContFragmentation'  sB   € Ü�|‰|‹~ˆÜ ›
Ð"ˆˆDŒIà	�‰ÐQÔRØ×Ñœ"×/Ñ/°·±Õ;r   c                 ó€  — t        j                  «       }t        «       x}|_        |j	                  d«       |j	                  d«       |j	                  d«       |j                  «       }| j                  |d«       | j                  t         j                  «      5  |j                  «        d d d «       y # 1 sw Y   y xY w)Ns!   ›abcd. AB
C	C	NCs    ŽabcdAMBs   €‰abcd Az2Once more unto the breach, dear friends, once morer£   r›   s       r   Ú"testRecvWithProlongedFragmentationz0WebSocketTest.testRecvWithProlongedFragmentation.  s–   € Ü�|‰|‹~ˆÜ ›
Ð"ˆˆDŒIà	�‰ÐsÔtà	�‰ÐQÔRà	�‰ÐEÔFØ�y‰y‹{ˆØ×ÑØØ@ô	Bð ×Ñœr×DÑDÓEñ 	Ø�I‰IŒK÷	÷ 	ñ 	ús   ÂB4Â4B=c                 óè  — t        j                  «       }|j                  t        «       t	        «       x}|_        |j                  d«       |j                  d«       |j                  d«       |j                  «       }| j                  |d«       | j                  t         j                  «      5  |j                  «        d d d «       | j                  |j                  d   d«       y # 1 sw Y   Œ)xY w)Ns   ‰abcd5D As   ‰�abcd1C4.,$D

s   €�abcdCABzToo much of a good thingr   s   Š�abcd1C4.,$D

)rE   r   r€   r   r   r�   r$   r/   rM   rs   rš   r   r›   s       r   Ú(testRecvWithFragmentationAndControlFramez6WebSocketTest.testRecvWithFragmentationAndControlFrame>  s»   € Ü�|‰|‹~ˆØ×Ñœ/Ô*Ü ›
Ð"ˆˆDŒIà	�‰Ð=Ô>à	�‰ÐKÔLà	�‰ÐWÔXØ�y‰y‹{ˆØ×Ñ˜Ð9Ô:Ø×Ñœr×DÑDÓEñ 	Ø�I‰IŒK÷	à×ÑØ�F‰F�1‰IØBõ	D÷	ð 	ús   Â/C(Ã(C1ú/Tests using local websocket server are disabledc                 ó°  — t        j                  dt        z   «      }| j                  |d «       |j	                  d«       |j                  «       }|j                  «        | j                  |d«       |j	                  d«       |j                  «       }| j                  |d«       | j                  t        |j                  dd«       |j                  «        y )Núws://127.0.0.1:úHello, Worldu   ã�“ã�«ã‚ƒã�«ã‚ƒã�¡ã�¯ã€�ä¸–ç•ŒéÿÿÿÿÚ )rE   rŒ   r   ÚassertNotEqualr1   r‘   ÚfilenorM   r/   rs   Ú
ValueErrorÚ
send_closer3   ©r   r„   Úresults      r   ÚtestWebSocketzWebSocketTest.testWebSocketP  s£   € ä× Ñ Ð!2Ô5IÑ!IÓJˆØ×Ñ˜A˜tÔ$Ø	�‰ˆ~ÔØ—‘“ˆØ	�‰Œ
Ø×Ñ˜ Ô0à	�‰Ð/Ô0Ø—‘“ˆØ×Ñ˜Ð!AÔBØ×Ñœ* a§l¡l°B¸Ô;Ø	�‰�	r   c                 óÄ   — t        j                  dt        z   «      }| j                  |d «       |j	                  d«       |j                  d«       |j                  «        y )Nr´   ry   ÚHi)rE   rŒ   r   r¸   ÚpingÚpongr3   ©r   r„   s     r   ÚtestPingPongzWebSocketTest.testPingPong_  sH   € ä× Ñ Ð!2Ô5IÑ!IÓJˆØ×Ñ˜A˜tÔ$Ø	�‰ˆwŒØ	�‰ˆtŒØ	�‰�	r   c                 ó–   — t        j                  «       }| j                  t         j                  j                  |j
                  d«       y )Nzws://google.com/)rE   r   rs   Ú_exceptionsÚWebSocketBadStatusExceptionÚconnectrÃ   s     r   ÚtestSupportRedirectz!WebSocketTest.testSupportRedirectg  s.   € ä�L‰L‹NˆØ×Ñœ"Ÿ.™.×DÑDÀaÇiÁiÐQcÕdr   c                 óú  — dd l }t        j                  d«      }| j                  |d «       | j	                  t        |j                  |j                  «      «       | j                  |j                  «       d«       | j                  |j                  «       d «       |j                  d«       | j                  |j                  «       d«       | j                  |j                  «       d «       |j                  «        y )Nr   r‹   rq   rL   )ÚsslrE   rŒ   r¸   rS   r)   r�   Ú	SSLSocketrM   Ú	getstatusÚ
getheadersÚ
settimeoutr&   ÚgetsubprotocolÚabort)r   rË   r„   s      r   ÚtestSecureWebSocketz!WebSocketTest.testSecureWebSocketm  s±   € ãÜ× Ñ Ð!>Ó?ˆØ×Ñ˜A˜tÔ$Ø�‰œ
 1§6¡6¨3¯=©=Ó9Ô:Ø×Ñ˜Ÿ™›¨Ô,Ø×Ñ˜AŸL™L›N¨DÔ1Ø	�‰�RÔØ×Ñ˜Ÿ™›¨Ô,Ø×Ñ˜×)Ñ)Ó+¨TÔ2Ø	�‰�	r   c                 ór  — t        j                  dt        z   ddi¬«      }| j                  |d «       | j	                  |j                  «       d «       |j                  d«       |j                  «       }| j	                  |d«       | j                  t        |j                  dd«       |j                  «        y )Nr´   z
User-AgentÚPythonWebsocketClient)Úheadersrµ   r¶   r·   )rE   rŒ   r   r¸   rM   rÐ   r1   r/   rs   rº   r3   r¼   s      r   ÚtestWebSocketWithCustomHeaderz+WebSocketTest.testWebSocketWithCustomHeaderz  s–   € ä× Ñ Ð!2Ô5IÑ!IØ*6Ð8OÐ)PôRˆà×Ñ˜A˜tÔ$Ø×Ñ˜×)Ñ)Ó+¨TÔ2Ø	�‰ˆ~ÔØ—‘“ˆØ×Ñ˜ Ô0Ø×Ñœ* a§g¡g¨r°2Ô6Ø	�‰�	r   c                 ó*  — t        j                  dt        z   «      }| j                  |d «       |j	                  «        | j                  t         j                  |j                  d«       | j                  t         j                  |j                  «       y )Nr´   ry   )	rE   rŒ   r   r¸   r3   rs   rš   r1   r/   rÃ   s     r   ÚtestAfterClosezWebSocketTest.testAfterClose†  sh   € ä× Ñ Ð!2Ô5IÑ!IÓJˆØ×Ñ˜A˜tÔ$Ø	�‰Œ	Ø×Ñœ"×?Ñ?ÀÇÁÈÔQØ×Ñœ"×?Ñ?ÀÇÁÕHr   N) r
   r   r   rH   rJ   rP   rV   r\   rn   rw   r…   r‡   ÚunittestÚ
skipUnlessr   rŽ   r’   rœ   rŸ   r¤   r¨   r«   r­   r¯   r±   ÚTEST_WITH_LOCAL_SERVERr¾   rÄ   rÉ   rÒ   rÖ   rØ   r   r   r   rC   rC   Z   s�  „ ò"òò#ò/ò
)ò&YòP
dòAò (ð €X×ÑÐ+Ð-TÓUñó Vðð €X×ÑÐ+Ð-TÓUñ0ó Vð0ò-ò"ò"
òò4
0ò<òò Dð$ €X×ÑÐ/Ð1bÓcñó dðð €X×ÑÐ/Ð1bÓcñó dðð €X×ÑÐ+Ð-TÓUñeó Vðeð
 €X×ÑÐ+Ð-TÓUñ
ó Vð
ð €X×ÑÐ/Ð1bÓcñ	ó dð	ð €X×ÑÐ/Ð1bÓcñIó dñIr   rC   c                   ó>   — e Zd Z ej                  ed«      d„ «       Zy)ÚSockOptTestr²   c                 ó4  — t         j                  t         j                  dff}t        j                  dt
        z   |¬«      }| j                  |j                  j                  t         j                  t         j                  «      d«       |j                  «        y )Nr|   r´   )Úsockoptr   )
r•   ÚIPPROTO_TCPÚTCP_NODELAYrE   rŒ   r   r¸   r�   Ú
getsockoptr3   )r   rß   r„   s      r   ÚtestSockOptzSockOptTest.testSockOpt�  sn   € ä×&Ñ&¬×(:Ñ(:¸AÐ>Ð@ˆÜ× Ñ Ð!2Ô5IÑ!IÐSZÔ[ˆØ×Ñ˜AŸF™F×-Ñ-¬f×.@Ñ.@Ä&×BTÑBTÓUÐWXÔYØ	�‰�	r   N)r
   r   r   rÙ   rÚ   rÛ   rã   r   r   r   rÝ   rÝ   �  s&   „ Ø€X×ÑÐ/Ð1bÓcñó dñr   rÝ   c                   ó   — e Zd Zd„ Zy)Ú	UtilsTestc                 ó²   — t        d«      }| j                  |d«       t        d«      }| j                  |d«       t        d«      }| j                  |d«       y )Ns   ð�€€Ts   Îºá½¹ÏƒÎ¼Îµí €editedFr   )r   rM   )r   Ústates     r   ÚtestUtf8ValidatorzUtilsTest.testUtf8Validator™  sR   € ÜÐ1Ó2ˆØ×Ñ˜ Ô%ÜÐ_Ó`ˆØ×Ñ˜ Ô&Ü˜cÓ"ˆØ×Ñ˜ Õ%r   N)r
   r   r   rè   r   r   r   rå   rå   ˜  s   „ ó&r   rå   c                   ó|   — e Zd Z ej                  ed«      d„ «       Z ej                  ed«      d„ «       Zd„ Zd„ Z	y)ÚHandshakeTestrˆ   c                 ó"  — t        j                  dt        j                  «       j                  id¬«      }| j                  t        |j                  d«       t        j                  ddi¬«      }| j                  t        |j                  d«       y )NÚ
cert_chainF)ÚssloptÚenable_multithreadr‹   ÚcertfileÚmyNonexistentCertFile©rí   )	rE   r   rË   Úget_default_verify_pathsÚcapathrs   rº   rÈ   ÚFileNotFoundError)r   Úwebsock1Úwebsock2s      r   Útest_http_SSLzHandshakeTest.test_http_SSL£  sv   € ä—<‘<¨´c×6RÑ6RÓ6T×6[Ñ6[Ð'\ÐqvÔwˆØ×Ñœ*Ø"×*Ñ*Ð,Iô	Kä—<‘<¨
Ð4KÐ'LÔMˆØ×ÑÔ+Ø"×*Ñ*Ð,Iõ	Kr   c                 ó*  — t        j                  t        j                  «       j                  t        j                  «       j
                  dœ¬«      }| j                  t         j                  j                  |j                  dddddgdd	d
dddœ¬«	       y )N)Úca_certsÚca_cert_pathrñ   r‹   Ú	chocolateztesting_websockets.comz+echo.websocket.events/websocket-client-testÚ	testprotorr   Ú123Ú	TestValuezk9kFAUWNAMmf5OEMfTlOEA==Únewprotocol)ÚCustomHeader1ÚCookiezSec-WebSocket-KeyzSec-WebSocket-Protocol)ÚcookieÚoriginÚhostÚsubprotocolsr`   rm   )
rE   r   rË   rò   Úcafileró   rs   rÆ   rÇ   rÈ   ©r   Úwebsock3s     r   ÚtestManualHeaderszHandshakeTest.testManualHeaders¬  s‰   € ä—<‘<´C×4PÑ4PÓ4R×4YÑ4YÜ8;×8TÑ8TÓ8V×8]Ñ8]ñ(_ô `ˆà×Ñœ"Ÿ.™.×DÑDØ"×*Ñ*Ð,IÐR]Ø!9ØLØ(3 }Ø%.Ø27Ø+6Ø6PØ;Hñ"Jð 	õ 		Kr   c                 ón   — t        j                  «       }| j                  t        |j                  d«       y )Nz2001:4860:4860::8888)rE   r   rs   rº   rÈ   )r   rö   s     r   ÚtestIPv6zHandshakeTest.testIPv6»  s&   € Ü—<‘<“>ˆØ×Ñœ* h×&6Ñ&6Ð8NÕOr   c                 ó  — t        j                  «       }| j                  t        |j                  d«       | j                  t         j
                  |j                  d«       | j                  t        |j                  d«       y )Nzws//example.comzws://examplezexample.com)rE   r   rs   rº   rÈ   ÚWebSocketAddressExceptionr  s     r   ÚtestBadURLszHandshakeTest.testBadURLs¿  s\   € Ü—<‘<“>ˆØ×Ñœ* h×&6Ñ&6Ð8IÔJØ×Ñœ"×6Ñ6¸×8HÑ8HÈ.ÔYØ×Ñœ* h×&6Ñ&6¸ÕFr   N)
r
   r   r   rÙ   rÚ   r   r÷   r	  r  r  r   r   r   rê   rê   ¢  s\   „ Ø€X×ÑÐ+Ð-TÓUñKó VðKð €X×ÑÐ+Ð-TÓUñKó VðKòPóGr   rê   Ú__main__)%r9   Úos.pathr•   r^   rE   rÙ   Úwebsocket._handshaker   r   rj   Úwebsocket._httpr   Úwebsocket._utilsr   Úbase64r   rY   rË   r   ÚImportErrorr*   ÚenvironÚgetr   r   rÛ   rG   r   r   r6   ÚTestCaserC   rÝ   rå   rê   r
   Úmainr   r   r   ú<module>r     s  ðó 
Û Û Û Û ÷"å (Ý *Ý .ðð&ÛÝð —Z‘Z—^‘^Ð$8¸#Ó>À#ÑEÐ à—z‘z—~‘~Ð&<¸dÓCÐ Ø-°Ñ5Ð Ø€	ò÷ñ ô8&�Xô &ôrI�H×%Ñ%ô rIôj	�(×#Ñ#ô ô&�×!Ñ!ô &ô!G�H×%Ñ%ô !GðH ˆzÒØ€H‡M�M…Oð øðE ò ô�9ö ðús   ±
D ÄDÄD