Ë
    Bü´j*}  ã                   ó˜  — d dl Z d dlZ d dlZd dlZd dlmZ d dlmZ d dlZ	d dl
mZ d dlmZmZmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ 	 	 d dl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jN                  «      Z( G d„ dejN                  «      Z) G d„ dejN                  «      Z* G d„ d ejN                  «      Z+ G d!„ d"ejN                  «      Z,e-d#k(  r ej\                  «        yy# e$ r  G d„ de«      ZY Œíw xY w)$é    N)Údecodebytes)Úmock)ÚABNF)ÚWebSocketBadStatusExceptionÚWebSocketAddressExceptionÚWebSocketException)Ú_create_sec_websocket_key)Ú	_validate)Ú_get_handshake_headers)Úhandshake_response)Úread_headers)Úvalidate_utf8c                   ó   — e Zd Zy)ÚSSLErrorN©Ú__name__Ú
__module__Ú__qualname__© ó    ú\/root/workspace/ytshorts/venv/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   ;   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__@   s   € ØˆŒ	Øˆ�	r   c                 ó:   — | j                   j                  |«       y r#   )r$   Úappend©r'   r$   s     r   Ú
add_packetzSockMock.add_packetD   s   € Ø�	‰	×Ñ˜Õr   c                  ó   — y r#   r   r&   s    r   Ú
gettimeoutzSockMock.gettimeoutG   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.recvJ   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*   r4   r+   s     r   ÚsendzSockMock.sendS   s   € Ø�	‰	×Ñ˜ÔÜ�4‹yÐr   c                  ó   — y r#   r   r&   s    r   ÚclosezSockMock.closeW   ó   € Ør   N)	r   r   r   r(   r,   r.   r8   r:   r<   r   r   r   r!   r!   ?   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'   ÚfnamerC   Úfs       r   r(   zHeaderSockMock.__init__\   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   r?   r?   [   s   „ ó&r   r?   c                   ó  — e Zd Zd„ 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.setUpd   s   € Ü
�‰”yÕ!r   c                  ó   — y r#   r   r&   s    r   ÚtearDownzWebSocketTest.tearDowng   r=   r   c                 óè   — | j                  t        j                  «       d «       t        j                  d«       | j                  t        j                  «       d«       t        j                  d «       y )Né
   )ÚassertEqualrN   ÚgetdefaulttimeoutÚsetdefaulttimeoutr&   s    r   Útest_default_timeoutz"WebSocketTest.test_default_timeoutj   sP   € Ø×Ñœ×-Ñ-Ó/°Ô6Ü
×Ñ˜RÔ Ø×Ñœ×-Ñ-Ó/°Ô4Ü
×Ñ˜TÕ"r   c                 óf   — t        «       }| j                  |dk7  «       | j                  d|v«       y )Né   u   Â¥n)r	   Ú
assertTrue)r'   Úkeys     r   Útest_ws_keyzWebSocketTest.test_ws_keyp   s+   € Ü'Ó)ˆØ�‰˜˜r™	Ô"Ø�‰˜ SÐ(Õ)r   c                 ó‚   — t        «       }t        |j                  d«      «      }| j                  dt	        |«      «       y)z/WebSocket key should be a random 16-byte nonce.zutf-8é   N)r	   Úbase64decodeÚencoderV   r4   )r'   r]   Únonces      r   Ú
test_noncezWebSocketTest.test_nonceu   s1   € ä'Ó)ˆÜ˜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=)rg   Ú
connectionúsec-websocket-accept)TNÚhttp)FNÚ	somethingrh   ri   Úsub1zsec-websocket-protocolÚsub2)Trl   Úsub3ÚsUb1ÚSub1ÚsuB2)rV   Ú_validate_headerÚcopy)r'   r]   Úrequired_headerÚheaders       r   Útest_ws_utilszWebSocketTest.test_ws_utils{   sõ  € Ø(ˆà"Ø#Ø$Bñ
ˆð
 	×ÑÔ)¨/¸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ˆÐ'Ñ(Ø×ÑÜ˜V S¨6°6Ð*:Ó;¸^ô	
ð 	×ÑÔ)¨&°#¸ÀÐ7GÓHÈ-ÔXà ×%Ñ%Ó'ˆØ+1ˆÐ'Ñ(Ø×ÑÜ˜V S¨6°6Ð*:Ó;¸^ô	
ð !×%Ñ%Ó'ˆà×ÑÔ)¨&°#¸ÀÐ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   rh   ÚUpgradezdata/header03.txtzUpgrade, Keep-Alivezdata/header02.txt)r   r?   rV   ÚassertRaisesrN   r   )r'   Ústatusru   r   s       r   Útest_read_headerzWebSocketTest.test_read_header¨   s¥   € Ü(¬Ð8KÓ)LÓMÑˆ�˜Ø×Ñ˜ Ô%Ø×Ñ˜ Ñ-¨yÔ9ä(¬Ð8KÓ)LÓMÑˆ�˜Ø×Ñ˜ Ô%Ø×Ñ˜ Ñ-Ð/DÔEäÐ*Ô+Ø×ÑÜ×!Ñ!¤<´Ð@SÓ1Tõ	
r   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 )
Nrx   ÚHellor   ó   �…abcd)õ   ã�“ã‚“ã�«ã�¡ã�¯é   ó   ��abcd‚ãð‡ãñ€åÊ�âÅ‚ãÌs   1111111111101é   )
rN   Ú	WebSocketÚset_mask_keyr   r?   Úsockr:   rV   r%   Úsend_binary©r'   r‡   Úss      r   Ú	test_sendzWebSocketTest.test_send¶   s™   € ä�|‰|‹~ˆØ×Ñœ/Ô*Ü&Ð':Ó;Ð;ˆˆDŒIØ�	‰	�'ÔØ×Ñ˜Ÿ™ ™Ð$DÔEà�	‰	Ð#Ô$Ø×ÑØ�F‰F�1‰IØWô	
ð 	×Ñ˜×)Ñ)Ð*:Ó;¸RÕ@r   c                 óZ  ‡— t        j                  «       }i Šˆfd„}||_        d|_        |j	                  d¬«       | j                  ‰d   t         j                  j                  «       | j                  ‰d   t        t        f«       | j                  ‰d   j                  d«      «       y )Nc                 ó.   •— | ‰d<   |‰d<   t        | «      S ©NÚpayloadÚopcode©r4   ©r�   r�   Úcaptureds     €r   Ú	fake_sendzDWebSocketTest.test_send_close_accepts_text_reason.<locals>.fake_sendÍ   ó!   ø€ Ø")ˆH�YÑØ!'ˆH�XÑÜ�w“<Ðr   Túnormal close©Úreasonr�   r�   ó   normal close)rN   r…   r:   Ú	connectedÚ
send_closerV   r   ÚOPCODE_CLOSEÚassertIsInstanceÚbytesÚ	bytearrayr\   Úendswith©r'   r‡   r”   r“   s      @r   Ú#test_send_close_accepts_text_reasonz1WebSocketTest.test_send_close_accepts_text_reasonÉ   s‹   ø€ Ü�|‰|‹~ˆØˆô	 ð
 ˆŒ	ØˆŒà�‰˜~ˆÔ.à×Ñ˜ (Ñ+¬R¯W©W×-AÑ-AÔBØ×Ñ˜h yÑ1´E¼9Ð3EÔFØ�‰˜ Ñ+×4Ñ4°_ÓEÕFr   c                 óZ  ‡— t        j                  «       }i Šˆfd„}||_        d|_        |j	                  d¬«       | j                  ‰d   t         j                  j                  «       | j                  ‰d   t        t        f«       | j                  ‰d   j                  d«      «       y )Nc                 ó.   •— | ‰d<   |‰d<   t        | «      S rŽ   r‘   r’   s     €r   r”   z?WebSocketTest.test_close_accepts_text_reason.<locals>.fake_sendß   r•   r   Tr–   r—   r�   r�   r™   )rN   r…   r:   rš   r<   rV   r   rœ   r�   rž   rŸ   r\   r    r¡   s      @r   Útest_close_accepts_text_reasonz,WebSocketTest.test_close_accepts_text_reasonÛ   s‹   ø€ Ü�|‰|‹~ˆØˆô	 ð
 ˆŒ	ØˆŒà�
‰
˜.ˆ
Ô)à×Ñ˜ (Ñ+¬R¯W©W×-AÑ-AÔBØ×Ñ˜h yÑ1´E¼9Ð3EÔFØ�‰˜ Ñ+×4Ñ4°_ÓEÕFr   c                 ó  — t        j                  «       }t        «       x}|_        d}|j	                  |«       |j                  «       }| j                  |d«       |j	                  d«       |j                  «       }| j                  |d«       y )Nrƒ   r�   r€   r   )rN   r…   r!   r‡   r,   r8   rV   )r'   r‡   rŠ   rk   r$   s        r   Ú	test_recvzWebSocketTest.test_recví   su   € ä�|‰|‹~ˆÜ ›
Ð"ˆˆDŒIàWð 	ð 	
�‰�YÔØ�y‰y‹{ˆØ×Ñ˜Ð0Ô1à	�‰Ð5Ô6Ø�y‰y‹{ˆØ×Ñ˜˜wÕ'r   ú%Internet-requiring tests are disabledc                 óì   — d}t        j                  d«      }	 |j                  d«       |D ]  }|dz  }|dk(  sŒ n | j                  |dd«       |j	                  «        y # |j	                  «        w xY w)Né   úwss://api.bitfinex.com/ws/2z+{"event": "subscribe", "channel": "ticker"}r‚   r   z6WebSocket iterator failed to yield the expected frames)rN   Úcreate_connectionr:   rV   r<   )r'   ÚcountrŠ   r   s       r   Ú	test_iterzWebSocketTest.test_iterü   sy   € àˆÜ× Ñ Ð!>Ó?ˆð
	Ø�F‰FÐ@ÔAØò �Ø˜‘
�Ø˜A“:Ùðð ×ÑØ�qÐRôð �G‰G�IøˆA�G‰G�Iús   ™ A! ºA! Á!A3c                 óÊ   — t        j                  d«      }	 | j                  t        t	        t        |«      «      «       |j                  «        y # |j                  «        w xY w)Nr«   )rN   r¬   rV   ÚstrÚtypeÚnextr<   )r'   r‡   s     r   Ú	test_nextzWebSocketTest.test_next  sD   € ä×#Ñ#Ð$AÓBˆð	Ø×ÑœS¤$¤t¨D£zÓ"2Ô3à�J‰J�LøˆD�J‰J�Lús   —(A ÁA"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‚   )rN   r…   r!   r‡   r,   ÚsocketÚtimeoutr{   ÚWebSocketTimeoutExceptionÚframe_bufferÚrecv_strictrV   Ú"WebSocketConnectionClosedException©r'   r‡   rŠ   r$   s       r   Útest_internal_recv_strictz'WebSocketTest.test_internal_recv_strict  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!)rN   r…   r!   r‡   r,   r¶   r·   r{   r¸   r8   rV   r»   r¼   s       r   Útest_recv_timeoutzWebSocketTest.test_recv_timeout%  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©	rN   r…   r!   r‡   r,   r8   rV   r{   r»   r¼   s       r   Ú#test_recv_with_simple_fragmentationz1WebSocketTest.test_recv_with_simple_fragmentation6  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)rN   r…   r!   r‡   r,   Ú	recv_datarV   r{   r   r»   r8   )r'   r‡   rŠ   r   r$   s        r   Ú*test_recv_with_fire_event_of_fragmentationz8WebSocketTest.test_recv_with_fire_event_of_fragmentationB  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)	rN   r…   rš   r<   r!   r‡   r,   r8   rV   r‰   s      r   Ú
test_closezWebSocketTest.test_close\  sg   € Ü�|‰|‹~ˆØˆŒØ�
‰
Œä�|‰|‹~ˆÜ ›
Ð"ˆˆDŒIØˆŒØ	�‰Ð-Ô.Ø�	‰	ŒØ×Ñ˜Ÿ™¨Õ/r   c                 óÄ   — t        j                  «       }t        «       x}|_        |j	                  d«       | j                  t         j                  |j                  «       y )NrÃ   )rN   r…   r!   r‡   r,   r{   r   r8   r‰   s      r   Útest_recv_cont_fragmentationz*WebSocketTest.test_recv_cont_fragmentationh  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   Ú&test_recv_with_prolonged_fragmentationz4WebSocketTest.test_recv_with_prolonged_fragmentationo  s”   € Ü�|‰|‹~ˆÜ ›
Ð"ˆˆDŒIà	�‰Øjô	
ð 	
�‰ÐQÔRà	�‰ÐEÔFØ�y‰y‹{ˆØ×Ñ˜ÐSÔTØ×Ñœ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

)rN   r…   r†   r   r!   r‡   r,   r8   rV   r{   r»   r%   r¼   s       r   Ú.test_recv_with_fragmentation_and_control_framez<WebSocketTest.test_recv_with_fragmentation_and_control_frame  sº   € Ü�|‰|‹~ˆØ×Ñœ/Ô*Ü ›
Ð"ˆˆDŒIà	�‰Ð=Ô>à	�‰ÐKÔLà	�‰ÐWÔXØ�y‰y‹{ˆØ×Ñ˜Ð9Ô:Ø×Ñœr×DÑDÓEñ 	Ø�I‰IŒK÷	à×ÑØ�F‰F�1‰IÐMõ	
÷	ð 	ús   Â/C(Ã(C1ú/Tests using local websocket server are disabledc                 ó°  — t        j                  dt        › �«      }| 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   ã�“ã�«ã‚ƒã�«ã‚ƒã�¡ã�¯ã€�ä¸–ç•ŒéÿÿÿÿÚ )rN   r¬   r   ÚassertNotEqualr:   r²   ÚfilenorV   r8   r{   Ú
ValueErrorr›   r<   ©r'   rŠ   Úresults      r   Útest_websocketzWebSocketTest.test_websocket‘  s§   € ô × Ñ  ?Ô3GÐ2HÐ!IÓJˆØ×Ñ˜A˜tÔ$Ø	�‰ˆ~ÔØ—‘“ˆØ	�‰Œ
Ø×Ñ˜ Ô0à	�‰Ð/Ô0Ø—‘“ˆØ×Ñ˜Ð!AÔBØ×Ñœ* a§l¡l°B¸Ô;Ø	�‰�	r   c                 óÄ   — t        j                  dt        › �«      }| j                  |d «       |j	                  d«       |j                  d«       |j                  «        y )NrÔ   r   ÚHi)rN   r¬   r   rØ   ÚpingÚpongr<   ©r'   rŠ   s     r   Útest_ping_pongzWebSocketTest.test_ping_pong¢  sL   € ô × Ñ  ?Ô3GÐ2HÐ!IÓJˆØ×Ñ˜A˜tÔ$Ø	�‰ˆwŒØ	�‰ˆtŒØ	�‰�	r   c                 ón   — t        j                  «       }| j                  t        |j                  d«       y )Nzws://google.com/)rN   r…   r{   r   Úconnectrâ   s     r   Útest_support_redirectz#WebSocketTest.test_support_redirect¬  s%   € ä�L‰L‹NˆØ×ÑÔ5°q·y±yÐBTÕUr   c                 óú  — t        j                  d«      }| j                  |d «       | j                  t	        |j
                  t        j                  «      «       | j                  |j                  «       d«       | j                  |j                  «       d «       |j                  d«       | j                  |j                  «       d«       | j                  |j                  «       d «       |j                  «        y )Nr«   ry   rU   )rN   r¬   rØ   r\   r2   r‡   ÚsslÚ	SSLSocketrV   Ú	getstatusÚ
getheadersÚ
settimeoutr.   ÚgetsubprotocolÚabortrâ   s     r   Útest_secure_websocketz#WebSocketTest.test_secure_websocket²  s®   € ä× Ñ Ð!>Ó?ˆØ×Ñ˜A˜tÔ$Ø�‰œ
 1§6¡6¬3¯=©=Ó9Ô:Ø×Ñ˜Ÿ™›¨Ô,Ø×Ñ˜AŸL™L›N¨DÔ1Ø	�‰�RÔØ×Ñ˜Ÿ™›¨Ô,Ø×Ñ˜×)Ñ)Ó+¨TÔ2Ø	�‰�	r   c                 ór  — t        j                  dt        › �ddi¬«      }| j                  |d «       | j	                  |j                  «       d «       |j                  d«       |j                  «       }| j	                  |d«       | j                  t        |j                  dd«       |j                  «        y )NrÔ   ú
User-AgentÚPythonWebsocketClient)ru   rÕ   rÖ   r×   )rN   r¬   r   rØ   rV   rí   r:   r8   r{   rÚ   r<   rÛ   s      r   Ú!test_websocket_with_custom_headerz/WebSocketTest.test_websocket_with_custom_header¾  sœ   € ô × Ñ ØÔ2Ð3Ð4Ø Ð"9Ð:ô
ˆð 	×Ñ˜A˜tÔ$Ø×Ñ˜×)Ñ)Ó+¨TÔ2Ø	�‰ˆ~ÔØ—‘“ˆØ×Ñ˜ Ô0Ø×Ñœ* a§g¡g¨r°2Ô6Ø	�‰�	r   c                 ó*  — t        j                  dt        › �«      }| j                  |d «       |j	                  «        | j                  t         j                  |j                  d«       | j                  t         j                  |j                  «       y )NrÔ   r   )	rN   r¬   r   rØ   r<   r{   r»   r:   r8   râ   s     r   Útest_after_closezWebSocketTest.test_after_closeÎ  sl   € ô × Ñ  ?Ô3GÐ2HÐ!IÓJˆØ×Ñ˜A˜tÔ$Ø	�‰Œ	Ø×Ñœ"×?Ñ?ÀÇÁÈÔQØ×Ñœ"×?Ñ?ÀÇÁÕHr   N)"r   r   r   rQ   rS   rY   r^   rd   rv   r}   r‹   r¢   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   rL   rL   c   sž  „ ò"òò#ò*ò
)ò+YòZ
òAò&Gò$Gò$(ð €X×ÑÐ+Ð-TÓUñó Vðð €X×ÑÐ+Ð-TÓUñó Vðò-ò"ò"
òò4
0ò<òò 
ð$ €X×ÑØÐ Qóñóðð €X×ÑØÐ Qóñóðð €X×ÑÐ+Ð-TÓUñVó VðVð
 €X×ÑÐ+Ð-TÓUñ	ó Vð	ð €X×ÑØÐ Qóñóðð €X×ÑØÐ QóñIóñIr   rL   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
        › �|¬«      }| j                  |j                  j                  t         j                  t         j                  «      d«       |j                  «        y )Nr‚   rÔ   )Úsockoptr   )
r¶   ÚIPPROTO_TCPÚTCP_NODELAYrN   r¬   r   rØ   r‡   Ú
getsockoptr<   )r'   rü   rŠ   s      r   Útest_sockoptzSockOptTest.test_sockoptÚ  sz   € ô ×&Ñ&¬×(:Ñ(:¸AÐ>Ð@ˆÜ× Ñ ØÔ2Ð3Ð4¸gô
ˆð 	×ÑØ�F‰F×Ñœf×0Ñ0´&×2DÑ2DÓEÀqô	
ð 	
�‰�	r   N)r   r   r   rö   r÷   rø   r   r   r   r   rú   rú   Ù  s'   „ Ø€X×ÑØÐ Qóñóñr   rú   c                   ó   — e Zd Zd„ Zy)Ú	UtilsTestc                 ó`  — t        d«      }| j                  |d«       t        d«      }| j                  |d«       t        d«      }| j                  |d«       t        d«      }| j                  |d«       t        d«      }| j                  |d«       t        d«      }| j                  |d«       y )	Ns   ð�€€Ts   Îºá½¹ÏƒÎ¼Îµí €editedFr   u   Îºá½¹ÏƒÎ¼Îµu   aí €br×   )r   rV   )r'   Ústates     r   Útest_utf8_validatorzUtilsTest.test_utf8_validatoré  s¤   € ÜÐ1Ó2ˆØ×Ñ˜ Ô%ÜØMó
ˆð 	×Ñ˜ Ô&Ü˜cÓ"ˆØ×Ñ˜ Ô%Ü˜mÓ,ˆØ×Ñ˜ Ô%Ü˜jÓ)ˆØ×Ñ˜ Ô&Ü˜bÓ!ˆØ×Ñ˜ Õ%r   N)r   r   r   r  r   r   r   r  r  è  s   „ ó&r   r  c                   óŽ   — e 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y	)
ÚHandshakeTestc                 óú   — t        ddd«      }| j                  |j                  d«       | j                  |j                  d«       | j	                  |j
                  «       | j	                  |j                  «       y )NzHandshake status 404 Not Foundi”  z	Not Found)r   rV   Ústatus_codeÚstatus_messageÚassertIsNoneÚresp_headersÚ	resp_body)r'   Úexcs     r   Ú0test_bad_status_exception_carries_status_messagez>HandshakeTest.test_bad_status_exception_carries_status_messageû  se   € Ü)Ø,¨c°;ó
ˆð 	×Ñ˜Ÿ™¨#Ô.Ø×Ñ˜×+Ñ+¨[Ô9Ø×Ñ˜#×*Ñ*Ô+Ø×Ñ˜#Ÿ-™-Õ(r   r¨   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  )	rN   r…   rè   Úget_default_verify_pathsÚcapathr{   rÚ   rå   r   )r'   Úwebsock1Úwebsock2s      r   Útest_http_sslzHandshakeTest.test_http_ssl  su   € ä—<‘<Ø ¤#×">Ñ">Ó"@×"GÑ"GÐHØ$ô
ˆð 	×Ñœ* h×&6Ñ&6Ð8UÔVÜ—<‘<¨
Ð4KÐ'LÔMˆØ×ÑÜ × 0Ñ 0Ð2Oõ	
r   c                 ó  — t        j                  t        j                  «       j                  t        j                  «       j
                  dœ¬«      }| j                  t        |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Ú	testprotorz   Ú123Ú	TestValuezk9kFAUWNAMmf5OEMfTlOEA==Únewprotocol)ÚCustomHeader1ÚCookiezSec-WebSocket-KeyzSec-WebSocket-Protocol)ÚcookieÚoriginÚhostÚsubprotocolsrh   ru   )	rN   r…   rè   r  Úcafiler  r{   r   rå   ©r'   Úwebsock3s     r   Útest_manual_headersz!HandshakeTest.test_manual_headers  s   € ä—<‘<ä×8Ñ8Ó:×AÑAÜ #× <Ñ <Ó >× EÑ Eñô
ˆð 	×ÑÜ'Ø×ÑØ)ØØ+Ø>Ø%˜Ø à!&Ø%Ø%?Ø*7ñ	ð 	õ 	
r   c                 ón   — t        j                  «       }| j                  t        |j                  d«       y )Nz2001:4860:4860::8888)rN   r…   r{   rÚ   rå   )r'   r  s     r   Ú	test_ipv6zHandshakeTest.test_ipv6)  s&   € Ü—<‘<“>ˆØ×Ñœ* h×&6Ñ&6Ð8NÕOr   c                 óò   — t        j                  «       }| j                  t        |j                  d«       | j                  t
        |j                  d«       | j                  t        |j                  d«       y )Nzws//example.comzws://exampleúexample.com)rN   r…   r{   rÚ   rå   r   r+  s     r   Útest_bad_urlszHandshakeTest.test_bad_urls-  sW   € Ü—<‘<“>ˆØ×Ñœ* h×&6Ñ&6Ð8IÔJØ×ÑÔ3°X×5EÑ5EÀ~ÔVØ×Ñœ* h×&6Ñ&6¸ÕFr   c           	      óN  — t        ddddi «      \  }}|D �cg c]  }|j                  d«      sŒ|‘Œ }}| j                  t        |«      d«       | j                  |d   d«       t        ddddd	d
i«      \  }}|D �cg c]  }|j                  d«      sŒ|‘Œ }}| j                  t        |«      d«       | j                  |d   d«       t        ddddd	di«      \  }}|D �cg c]  }|j                  d«      sŒ|‘Œ }}| j                  t        |«      d«       t        dddddd
dœ«      \  }}|D �cg c]  }|j                  d«      sŒ|‘Œ }}| j                  t        |«      d«       | j                  |d   d«       t        dddddddœ«      \  }}|D �cg c]  }|j                  d«      sŒ|‘Œ }}| j                  t        |«      d«       t        ddddi «      \  }}|D �cg c]  }|j                  d«      sŒ|‘Œ }}| j                  t        |«      d«       | j                  |d   d«       t        ddddd	di«      \  }}|D �cg c]  }|j                  d«      sŒ|‘Œ }}| j                  t        |«      d«       yc c}w c c}w c c}w c c}w c c}w c c}w c c}w )z?Test suppress_host parameter in _get_handshake_headers functionz/pathzws://example.com:8080r1  i�  zHost:r‚   r   zHost: example.com:8080Úsuppress_hostFTzcustom-host.example.com)r(  r4  zHost: custom-host.example.comúws://example.coméP   zHost: example.comN)r   Ú
startswithrV   r4   )r'   Úheadersr]   ÚhÚhost_headerss        r   Útest_suppress_host_headerz'HandshakeTest.test_suppress_host_header3  sÝ  € ô .ØÐ,¨m¸TÀ2ó
‰ˆ�ð $+ÖD˜a¨a¯l©l¸7Õ.CšÐDˆÐDØ×Ñœ˜\Ó*¨AÔ.Ø×Ñ˜ a™Ð*BÔCô .ØØ#ØØØ˜eÐ$ó
‰ˆ�ð $+ÖD˜a¨a¯l©l¸7Õ.CšÐDˆÐDØ×Ñœ˜\Ó*¨AÔ.Ø×Ñ˜ a™Ð*BÔCô .ØØ#ØØØ˜dÐ#ó
‰ˆ�ð $+ÖD˜a¨a¯l©l¸7Õ.CšÐDˆÐDØ×Ñœ˜\Ó*¨AÔ.ô .ØØ#ØØØ.ÀÑGó
‰ˆ�ð $+ÖD˜a¨a¯l©l¸7Õ.CšÐDˆÐDØ×Ñœ˜\Ó*¨AÔ.Ø×Ñ˜ a™Ð*IÔJô .ØØ#ØØØ.ÀÑFó
‰ˆ�ð $+ÖD˜a¨a¯l©l¸7Õ.CšÐDˆÐDØ×Ñœ˜\Ó*¨AÔ.ô .ØÐ'¨¸¸Bó
‰ˆ�ð $+ÖD˜a¨a¯l©l¸7Õ.CšÐDˆÐDØ×Ñœ˜\Ó*¨AÔ.Ø×Ñ˜ a™Ð*=Ô>ô .ØÐ'¨¸¸_ÈdÐ<Só
‰ˆ�ð $+ÖD˜a¨a¯l©l¸7Õ.CšÐDˆÐDØ×Ñœ˜\Ó*¨AÕ.ùò Eùò Eùò Eùò Eùò Eùò Eùò EsR   —J®JÁ<J	ÂJ	Ã!JÃ8JÄ2JÅ	JÆJÆ/JÇ&JÇ=JÉJ"É"J"c                 ó  — t        j                  «       }	 |j                  ddd¬«       	 |j                  ddd¬«       y# t        t        t
        j                  f$ r Y Œ6w xY w# t        t        t
        j                  f$ r Y yw xY w)z5Test suppress_host parameter with WebSocket.connect()zws://nonexistent.example.comTgš™™™™™¹?)r4  r·   FN)rN   r…   rå   r   ÚOSErrorr¶   r·   )r'   Úwebsocks     r   Ú$test_suppress_host_websocket_connectz2HandshakeTest.test_suppress_host_websocket_connectz  s„   € ä—,‘,“.ˆð	Ø�O‰OØ.¸dÈCð ô ð	Ø�O‰OØ.¸eÈSð õ øô *¬7´F·N±NÐCò 	áð	ûô *¬7´F·N±NÐCò 	áð	ús"   –A  «A$ Á A!Á A!Á$BÂBN)r   r   r   r  rö   r÷   r   r  r-  r/  r2  r;  r?  r   r   r   r  r  ú  sk   „ ò)ð €X×ÑÐ+Ð-TÓUñ	
ó Vð	
ð €X×ÑÐ+Ð-TÓUñ
ó Vð
ò0PòGòE/óNr   r  c                   óT   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zy)ÚWebSocketCoreUnitTestsc                 óô  —  G d„ dt         «      }t        j                  «       }t        j                  d |d«      g¬«      |_        t        |«      }| j                  t        |«      d«       | j                  |«      5  t        |«       d d d «       t        j                  d¬«      |_        | j                  |j                  «       d«       | j                  |j                  «       d«       y # 1 sw Y   ŒexY w)Nc                   ó   — e Zd Zy)úQWebSocketCoreUnitTests.test_iteration_helpers_and_next_aliases.<locals>.TestErrorNr   r   r   r   Ú	TestErrorrD  ”  ó   „ Ør   rE  ÚfirstÚstop©Úside_effectÚagain©Úreturn_value)r3   rN   r…   r   ÚMockr8   ÚiterrV   r²   r{   Ú__next__)r'   rE  r‡   Úiterators       r   Ú'test_iteration_helpers_and_next_aliasesz>WebSocketCoreUnitTests.test_iteration_helpers_and_next_aliases“  sº   € ô	œ	ô 	ô �|‰|‹~ˆÜ—I‘I¨7±I¸fÓ4EÐ*FÔGˆŒ	ä˜“:ˆØ×Ñœ˜h›¨Ô1Ø×Ñ˜yÓ)ñ 	Ü�ŒN÷	ô —I‘I¨7Ô3ˆŒ	Ø×Ñ˜Ÿ™›¨'Ô2Ø×Ñ˜Ÿ™› gÕ.÷	ð 	ús   Á>C.Ã.C7c                 ó8  — t        j                  «       }| j                  t        «      5  |j	                  «        d d d «       t        j                  «       }d|j                  _        ||_        | j                  |j	                  «       d«       y # 1 sw Y   ŒVxY w)Né*   )
rN   r…   r{   r   rÙ   r   rN  rM  r‡   rV   ©r'   r‡   Úfake_sockets      r   Útest_fileno_requires_socketz2WebSocketCoreUnitTests.test_fileno_requires_socket£  sr   € Ü�|‰|‹~ˆØ×ÑÔ1Ó2ñ 	Ø�K‰KŒM÷	ô —i‘i“kˆØ*,ˆ×ÑÔ'ØˆŒ	Ø×Ñ˜Ÿ™›¨Õ+÷	ð 	ús   ªBÂBc                 óú   — t        j                  «       }t        j                  «       }||_        |j                  d«       | j                  |j                  «       d«       |j
                  j                  d«       y )Né   )	rN   r…   r   rN  r‡   rì   rV   r.   Úassert_called_once_withrU  s      r   Ú)test_settimeout_updates_underlying_socketz@WebSocketCoreUnitTests.test_settimeout_updates_underlying_socket­  sV   € Ü�|‰|‹~ˆÜ—i‘i“kˆØˆŒ	à�‰˜ÔØ×Ñ˜Ÿ™Ó*¨AÔ.Ø×Ñ×6Ñ6°qÕ9r   c                 ó*  — t        j                  «       }| j                  |j                  «       «        G d„ d«      }t	        j
                  d|«      5   |«       |_        | j                  |j                  «       «       d d d «       y # 1 sw Y   y xY w)Nc                   ó   — e Zd Zy)úCWebSocketCoreUnitTests.test_is_ssl_detection.<locals>.FakeSSLSocketNr   r   r   r   ÚFakeSSLSocketr^  º  rF  r   r_  zwebsocket._core.ssl.SSLSocket)rN   r…   ÚassertFalseÚis_sslr   Úpatchr‡   r\   )r'   r‡   r_  s      r   Útest_is_ssl_detectionz,WebSocketCoreUnitTests.test_is_ssl_detection¶  sl   € Ü�|‰|‹~ˆØ×Ñ˜Ÿ™›Ô'÷	ñ 	ô �Z‰ZÐ7¸ÓGñ 	+Ù%›ˆDŒIØ�O‰O˜DŸK™K›MÔ*÷	+÷ 	+ñ 	+ús   Á,B	Â	Bc                 ó  — t        j                  «       }t        j                  d„ ¬«      |_        t        j
                  «       |_        t        j                  dt        j                  «      }t        j                  dd¬«      5  t        j                  d«      5 }|j                  |«      }d d d «       d d d «       | j                  d«       | j                  j                  d	«       y # 1 sw Y   Œ@xY w# 1 sw Y   ŒDxY w)
Nc                 ó   — t        | «      S r#   r‘   )r$   s    r   ú<lambda>zQWebSocketCoreUnitTests.test_send_frame_emits_trace_when_enabled.<locals>.<lambda>Ã  s
   € ¼¸D»	€ r   rI  Úhiz!websocket._core.isEnabledForTraceTrL  zwebsocket._core.tracer   rª   )rN   r…   r   rN  Ú_sendÚ	MagicMockÚlockr   Úcreate_frameÚOPCODE_TEXTrb  Ú
send_frameÚassertGreaterrV   Ú
call_count)r'   r‡   ÚframeÚ
trace_mockÚlengths        r   Ú(test_send_frame_emits_trace_when_enabledz?WebSocketCoreUnitTests.test_send_frame_emits_trace_when_enabledÁ  sÅ   € Ü�|‰|‹~ˆÜ—Y‘YÑ+AÔBˆŒ
Ü—N‘NÓ$ˆŒ	ä×!Ñ! $¬×(8Ñ(8Ó9ˆä�Z‰ZØ/¸dô
ñ 	,ä�:‰:Ð-Ó.ð	,à2<Ø—_‘_ UÓ+ˆF÷	,÷ 	,ð
 	×Ñ˜6 1Ô%Ø×Ñ˜×.Ñ.°Õ2÷	,ð 	,ú÷ 	,ð 	,ús$   ÂC8ÂC,Â-C8Ã,C5	Ã1C8Ã8Dc                 ó   ‡
— t        j                  «       }t        j                  «       }t        j                  «       }|df|dfgŠ
ˆ
fd„}t	        dddid «      }t	        di d «      }t        j
                  d|¬	«      5 }t        j
                  d
||g¬	«      5 }|j                  dd¬«       d d d «       d d d «       | j                  |j                  «       | j                  |j                  |«       |j                  j                  «        | j                  j                  D �	cg c]  }	|	j                  d   ‘Œ c}	ddg«       | j                  j                   d«       y # 1 sw Y   Œ¸xY w# 1 sw Y   Œ¼xY wc c}	w )N©r'  r6  ú/©Úredirectr6  rv  c                 ó&   •— ‰j                  d«      S r0   )r1   )Úurlr   Úconnect_resultss     €r   Úfake_connectzKWebSocketCoreUnitTests.test_connect_handles_redirects.<locals>.fake_connectÙ  s   ø€ Ø"×&Ñ& qÓ)Ð)r   i-  Úlocationúws://redirectry   úwebsocket._core.connectrI  úwebsocket._core.handshakeúws://originr‚   ©Úredirect_limitr   rª   )rN   r…   r   rN  r   rb  rå   r\   rš   ÚassertIsr‡   r<   Úassert_called_oncerV   Úcall_args_listÚargsro  )r'   r‡   Úfirst_socketÚsecond_socketr|  Úredirect_respÚsuccess_respÚconnect_mockÚhandshake_mockÚcallr{  s             @r   Útest_connect_handles_redirectsz5WebSocketCoreUnitTests.test_connect_handles_redirectsÐ  sR  ø€ Ü�|‰|‹~ˆÜ—y‘y“{ˆÜŸ	™	›ˆàÐ.Ð/ØÐ1Ð2ð
ˆô
	*ô +¨3°¸_Ð0MÈtÓTˆÜ)¨#¨r°4Ó8ˆä�Z‰ZØ%°<ô
ð 	:àœ4Ÿ:™:Ø'°mÀ\Ð5Rô
ð	:ð Ø�L‰L˜°qˆLÔ9÷	:÷ 	:ð 	�‰˜Ÿ™Ô'Ø�‰�d—i‘i Ô/Ø×Ñ×-Ñ-Ô/Ø×ÑØ&2×&AÑ&AÖB˜dˆT�Y‰Y�q‹\ÒBØ˜OÐ,ô	
ð 	×Ñ˜×2Ñ2°AÕ6÷	:ð 	:ú÷ 	:ð 	:üò Cs*   Á>E/ÂE#Â,E/Ä&E;Å#E,	Å(E/Å/E8c                 ó€  ‡— t        j                  «       }g Št        dddid «      }ˆfd„}t        j                  d|¬«      5 }t        j                  d|¬«      5  | j                  t         j                  d	«      5  |j                  d
d¬«       d d d «       d d d «       d d d «       | j                  j                  d«       | j                  |j                  «       | j                  |j                  «       ‰D ]  }|j                  j                  «        Œ y # 1 sw Y   Œ�xY w# 1 sw Y   Œ‘xY w# 1 sw Y   Œ•xY w)Né.  r}  r~  c                 óV   •— t        j                  «       }‰j                  |«       |dfS )Nrw  )r   rN  r*   )rz  r‡  ÚkwargsÚsocket_mockÚsocketss       €r   r|  zYWebSocketCoreUnitTests.test_connect_redirect_limit_exhausted_raises.<locals>.fake_connectô  s&   ø€ ÜŸ)™)›+ˆKØ�N‰N˜;Ô'ØÐ 5Ð5Ð5r   r  rI  r€  rL  zRedirect limit exhaustedr�  rª   r‚  é   )rN   r…   r   r   rb  ÚassertRaisesRegexr   rå   rV   ro  r`  rš   r  r‡   r<   r…  )r'   r‡   rŠ  r|  rŒ  r”  r•  s         @r   Ú,test_connect_redirect_limit_exhausted_raiseszCWebSocketCoreUnitTests.test_connect_redirect_limit_exhausted_raisesï  s  ø€ Ü�|‰|‹~ˆØˆÜ*¨3°¸_Ð0MÈtÓTˆô	6ô
 �Z‰ZØ%°<ô
ð 	>àœ4Ÿ:™:Ø'°mô
ñ	>ð
 ×'Ñ'Ü×%Ñ%Ð'Aóñ >ð —‘˜]¸1�Ô=÷>÷	>÷ 	>ð 	×Ñ˜×0Ñ0°!Ô4Ø×Ñ˜Ÿ™Ô(Ø×Ñ˜$Ÿ)™)Ô$Ø"ò 	3ˆKØ×Ñ×0Ñ0Õ2ñ	3÷>ð >ú÷	>ð 	>ú÷ 	>ð 	>ús<   ÁD4Á!D(Á<DÂD(ÂD4ÄD%Ä!D(Ä(D1	Ä-D4Ä4D=c                 óü  — t        j                  «       }t        dddid «      }d„ }t        j                  d|¬«      5  t        j                  d|¬«      5  | j                  t         j                  d	«      5  |j                  d
d¬«       d d d «       d d d «       d d d «       | j                  |j                  «       | j                  |j                  «       y # 1 sw Y   ŒPxY w# 1 sw Y   ŒTxY w# 1 sw Y   ŒXxY w)Nr‘  r}  úhttps://redirectc                 óN   — | dk(  rt        d«      ‚t        j                  «       dfS )Nrš  zscheme https is invalidru  )rÚ   r   rN  ©rz  r‡  r“  s      r   r|  zXWebSocketCoreUnitTests.test_connect_redirect_invalid_target_raises.<locals>.fake_connect  s)   € ØÐ(Ò(Ü Ð!:Ó;Ð;Ü—9‘9“;Ð 3Ð3Ð3r   r  rI  r€  rL  z*Invalid redirect target 'https://redirect'r�  rª   r‚  ©rN   r…   r   r   rb  r—  r   rå   r`  rš   r  r‡   ©r'   r‡   rŠ  r|  s       r   Ú+test_connect_redirect_invalid_target_raiseszBWebSocketCoreUnitTests.test_connect_redirect_invalid_target_raises	  sÜ   € Ü�|‰|‹~ˆÜ*¨3°Ð=OÐ0PÐRVÓWˆò	4ô
 �Z‰ZØ%°<ô
ñ 	>ä�:‰:Ð1ÀÔNñ	>ð ×'Ñ'Ü×%Ñ%Ð'Sóñ >ð —‘˜]¸1�Ô=÷>÷	>÷ 	>ð 	×Ñ˜Ÿ™Ô(Ø×Ñ˜$Ÿ)™)Õ$÷>ð >ú÷	>ð 	>ú÷ 	>ð 	>ús;   ¾C2Á!C&Á7CÂC&ÂC2ÃC#ÃC&Ã&C/	Ã+C2Ã2C;c                 óø  — t        j                  «       }t        di d «      }d„ }t        j                  d|¬«      5  t        j                  d|¬«      5  | j                  t         j                  d«      5  |j                  dd	¬
«       d d d «       d d d «       d d d «       | j                  |j                  «       | j                  |j                  «       y # 1 sw Y   ŒPxY w# 1 sw Y   ŒTxY w# 1 sw Y   ŒXxY w)Nr‘  c                 ó.   — t        j                  «       dfS )Nru  )r   rN  rœ  s      r   r|  zZWebSocketCoreUnitTests.test_connect_redirect_without_location_raises.<locals>.fake_connect!  s   € Ü—9‘9“;Ð 3Ð3Ð3r   r  rI  r€  rL  ÚLocationr�  rª   r‚  r�  rž  s       r   Ú-test_connect_redirect_without_location_raiseszDWebSocketCoreUnitTests.test_connect_redirect_without_location_raises  sÏ   € Ü�|‰|‹~ˆÜ*¨3°°DÓ9ˆò	4ô �Z‰ZØ%°<ô
ñ 	>ä�:‰:Ð1ÀÔNñ	>ð ×'Ñ'¬×(=Ñ(=¸zÓJñ >Ø—‘˜]¸1�Ô=÷>÷	>÷ 	>ð 	×Ñ˜Ÿ™Ô(Ø×Ñ˜$Ÿ)™)Õ$÷	>ð >ú÷	>ð 	>ú÷ 	>ð 	>ús;   ¼C0Á!C$Á5CÂ	C$ÂC0ÃC!ÃC$Ã$C-	Ã)C0Ã0C9c                 óô  — t        j                  «       }t        j                  «       }d|_        ||_        d|_        |j                  «        |j                  j                  «        | j                  |j
                  «       | j                  |j                  «       t        j                  «       }||_        d|_        |j                  «        |j                  j                  t        j                  «       y )NFT)rN   r…   r   rN  Ú_closedr‡   rš   Úshutdownr<   r…  r  r`  rî   rZ  r¶   Ú	SHUT_RDWR)r'   r‡   r”  s      r   Útest_shutdown_and_abortz.WebSocketCoreUnitTests.test_shutdown_and_abort-  s©   € Ü�|‰|‹~ˆÜ—i‘i“kˆØ#ˆÔØˆŒ	ØˆŒà�‰ŒØ×Ñ×,Ñ,Ô.Ø×Ñ˜$Ÿ)™)Ô$Ø×Ñ˜Ÿ™Ô(ä—i‘i“kˆØˆŒ	ØˆŒØ�
‰
ŒØ×Ñ×4Ñ4´V×5EÑ5EÕFr   c                 ó°   — t        j                  «       }t        j                  «       }||_        d|_        |j                  «        |j                  «        y )NT)rN   r…   r¶   r‡   rš   rî   r<   )r'   r‡   Úreals      r   Ú test_abort_tolerates_dead_socketz7WebSocketCoreUnitTests.test_abort_tolerates_dead_socket?  s:   € Ü�|‰|‹~ˆô �}‰}‹ˆØˆŒ	ØˆŒà�
‰
ŒØ�
‰
�r   c                 óZ  —  G d„ d«      }t        j                  dd|ddid¬«      }| j                  ||«       | j                  |j                  d«       | j                  |j
                  d«       | j                  d	|j                  «       | j                  |j                  d
   d«       y )Nc                   ó   — e Zd Zd„ Zd„ Zd„ Zy)úTWebSocketCoreUnitTests.test_create_connection_uses_custom_class.<locals>.DummySocketc                 ó<   — || _         d | _        d | _        d | _        y r#   )Úinit_kwargsÚtimeout_valuerz  Úoptions)r'   r“  s     r   r(   z]WebSocketCoreUnitTests.test_create_connection_uses_custom_class.<locals>.DummySocket.__init__L  s    € Ø#)�Ô Ø%)�Ô"Ø�”Ø#�•r   c                 ó   — || _         y r#   )r±  )r'   Úvalues     r   rì   z_WebSocketCoreUnitTests.test_create_connection_uses_custom_class.<locals>.DummySocket.settimeoutR  s
   € Ø%*�Õ"r   c                 ó    — || _         || _        y r#   )rz  r²  )r'   rz  r²  s      r   rå   z\WebSocketCoreUnitTests.test_create_connection_uses_custom_class.<locals>.DummySocket.connectU  s   € Ø�”Ø&�•r   N)r   r   r   r(   rì   rå   r   r   r   ÚDummySocketr®  K  s   „ ò$ò+ó'r   r¶  r5  rY  rñ   Útesterzhttps://origin)r·   Úclass_ru   r'  ru   r'  )rN   r¬   r�   rV   rz  r±  ÚassertInr²  )r'   r¶  Úconns      r   Ú(test_create_connection_uses_custom_classz?WebSocketCoreUnitTests.test_create_connection_uses_custom_classJ  s›   € ÷	'ñ 	'ô ×#Ñ#ØØØØ  (Ð+Ø#ô
ˆð 	×Ñ˜d KÔ0Ø×Ñ˜Ÿ™Ð#5Ô6Ø×Ñ˜×+Ñ+¨QÔ/Ø�‰�h §¡Ô-Ø×Ñ˜Ÿ™ hÑ/Ð1AÕBr   N)r   r   r   rR  rW  r[  rc  rs  r�  r˜  rŸ  r£  r¨  r«  r»  r   r   r   rA  rA  ’  s@   „ ò/ò ,ò:ò	+ò3ò7ò>3ò4%ò(%ò Gò$	óCr   rA  Ú__main__)/rB   Úos.pathr¶   rö   Úbase64r   ra   r   rf   rN   Úwebsocket._abnfr   Úwebsocket._exceptionsr   r   r   Úwebsocket._handshaker	   r
   rr   r   r   Úwebsocket._httpr   Úwebsocket._utilsr   rè   ÚImportErrorr3   r   ÚenvironÚgetr   r   rø   rP   r   r!   r?   ÚTestCaserL   rú   r  r  rA  r   Úmainr   r   r   ú<module>rÉ     sG  ðó 
Û Û Û Ý .Ý ã Ý  ÷ñ õ
 ;Ý >Ý 7Ý 3Ý (Ý *ðð&Ûð —Z‘Z—^‘^Ð$8¸#Ó>À#ÑEÐ à—z‘z—~‘~Ð&<¸dÓCÐ Ø-°Ñ5Ð Ø€	ò÷ñ ô8&�Xô &ôsI�H×%Ñ%ô sIôl�(×#Ñ#ô ô&�×!Ñ!ô &ô$U�H×%Ñ%ô UôpSC˜X×.Ñ.ô SCðl ˆzÒØ€H‡M�M…Oð øðw ò ô�9ö ðús   ÁD6 Ä6E	ÅE	