Ë
    Bü´j�>  ã                   ó@  — 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 d dl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mZmZmZ 	 	 d dlmZmZmZ e j4                  j7                  dd«      d	k(  Ze j4                  j7                  d
d«      d	k(  Ze j4                  j7                  dd«      Zedk7  Z G d„ d«      Z  G d„ de «      Z! G d„ d«      Z" G d„ dejF                  «      Z$ G d„ dejF                  «      Z%e&dk(  r ejN                  «        yy#  d dlmZmZmZ Y ŒÎxY w)é    N)ÚSimpleNamespace)Úmock)ÚWebSocketAddressExceptionÚWebSocketProxyExceptionÚWebSocketException)Ú_get_addrinfo_listÚ_start_proxied_socketÚ_tunnelÚ_wrap_sni_socketÚconnectÚ
proxy_infoÚread_headersÚHAVE_PYTHON_SOCKS)ÚProxyConnectionErrorÚ
ProxyErrorÚProxyTimeoutErrorÚTEST_WITH_INTERNETÚ0Ú1ÚTEST_WITH_PROXYÚLOCAL_WS_SERVER_PORTz-1c                   ó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    úW/root/workspace/ytshorts/venv/lib/python3.12/site-packages/websocket/tests/test_http.pyÚ__init__zSockMock.__init__=   s   € ØˆŒ	Øˆ�	ó    c                 ó:   — | j                   j                  |«       y r   )r   Úappend©r   r   s     r    Ú
add_packetzSockMock.add_packetA   s   € Ø�	‰	×Ñ˜Õr"   c                  ó   — y r   © r   s    r    Ú
gettimeoutzSockMock.gettimeoutD   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.recvG   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.sendP   s   € Ø�	‰	×Ñ˜ÔÜ�4‹yÐr"   c                  ó   — y r   r(   r   s    r    ÚclosezSockMock.closeT   s   € Ør"   N)	Ú__name__Ú
__module__Ú__qualname__r!   r&   r)   r2   r4   r6   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   Úfnamer?   Úfs       r    r!   zHeaderSockMock.__init__Y   sd   € Ü×Ñ˜$ÔÜ�w‰w�|‰|œBŸG™GŸO™O¬HÓ5°uÓ=ˆÜ�$˜Óð 	& Ø�O‰O˜AŸF™F›HÔ%÷	&÷ 	&ñ 	&ús   Á# BÂBN©r7   r8   r9   r!   r(   r"   r    r;   r;   X   s   „ ó&r"   r;   c                   ó   — e Zd Zd„ Zy)ÚOptsListc                 óN   — d| _         g | _        dt        j                  i| _        y )Né   Ú	cert_reqs)ÚtimeoutÚsockoptÚsslÚ	CERT_NONEÚssloptr   s    r    r!   zOptsList.__init__a   s    € ØˆŒØˆŒØ"¤C§M¡MÐ2ˆ�r"   NrG   r(   r"   r    rI   rI   `   s   „ ó3r"   rI   c                   ó    — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Z ej                  e
d«      d„ «       Zd„ Zd	„ Z ej                  e
d«      d
„ «       Zd„ Zy)ÚHttpTestc                 óÊ   — t        t        d«      «      \  }}}| j                  |d«       | j                  |d   d«       | j                  t        t         t        d«      «       y )Núdata/header01.txtée   Ú
connectionÚUpgradeúdata/header02.txt)r   r;   ÚassertEqualÚassertRaisesr   )r   ÚstatusÚheaderÚ_s       r    Útest_read_headerzHttpTest.test_read_headerh   sY   € Ü(¬Ð8KÓ)LÓMÑˆ�˜Ø×Ñ˜ Ô%Ø×Ñ˜ Ñ-¨yÔ9à×ÑÜ¤¬nÐ=PÓ.Qõ	
r"   c                 ó  — t        «       }|j                  d«       | j                  t        «      5 }t	        |«       ddd«       | j                  dt        j                  «      «       t        «       }|j                  d«       | j                  t        «      5 }t	        |«       ddd«       | j                  dt        |j                  «      «       t        «       }|j                  d«       | j                  t        «      5 }t	        |«       ddd«       | j                  dt        |j                  «      «       | j                  dt        |j                  «      «       y# 1 sw Y   �Œ'xY w# 1 sw Y   ŒÊxY w# 1 sw Y   ŒmxY w)zqMalformed responses surface as WebSocketException, not raw
        IndexError, ValueError, or UnicodeDecodeError.s   GARBAGE

NzInvalid status lines#   HTTP/1.1 XX Switching Protocols

s%   HTTP/1.1ÿ 101 Switching Protocols

zUTF-8z	at byte 8)r   r&   r[   r   r   ÚassertInÚstrÚ	exception)r   Ú	one_tokenÚcmÚ
bad_statusÚbad_utf8s        r    Ú&test_read_header_malformed_status_linez/HttpTest.test_read_header_malformed_status_lineq   s.  € ô “Jˆ	Ø×ÑÐ/Ô0Ø×ÑÔ1Ó2ð 	$°bÜ˜Ô#÷	$à�‰Ð+¬S°·±Ó->Ô?ä“Zˆ
Ø×ÑÐHÔIØ×ÑÔ1Ó2ð 	%°bÜ˜Ô$÷	%à�‰Ð+¬S°·±Ó->Ô?ä“:ˆØ×ÑÐKÔLØ×ÑÔ1Ó2ð 	#°bÜ˜Ô"÷	#à�‰�gœs 2§<¡<Ó0Ô1Ø�‰�k¤3 r§|¡|Ó#4Õ5÷	$ñ 	$ú÷	%ð 	%ú÷	#ð 	#ús#   ±E"ÂE/ÄE;Å"E,Å/E8Å;Fc                 óô   — ddl m} t        «       }|j                  d«       | j	                  t
        «      5 } ||«       ddd«       | j                  dt        j                  «      «       y# 1 sw Y   Œ/xY w)zmA non-numeric Content-Length on an error response surfaces as
        WebSocketException, not raw ValueError.r   )Ú_get_resp_headerss1   HTTP/1.1 400 Bad Request
Content-Length: abc

NzInvalid content-length)	Úwebsocket._handshakerj   r   r&   r[   r   ra   rb   rc   )r   rj   Úsockre   s       r    Ú,test_get_resp_headers_invalid_content_lengthz5HttpTest.test_get_resp_headers_invalid_content_length‡   sa   € õ 	;ä‹zˆØ�‰ÐRÔSØ×ÑÔ1Ó2ð 	$°bÙ˜dÔ#÷	$à�‰Ð.´°B·L±LÓ0AÕB÷	$ð 	$ús   ·	A.Á.A7c                 ó    — | j                  t        t        t        d«      ddd«       | j                  t        t        t        d«      ddd«       y )NrU   úexample.coméP   )ÚusernameÚpasswordrY   )r[   r   r
   r;   r   s    r    Útest_tunnelzHttpTest.test_tunnel’   sP   € Ø×ÑÜ#ÜÜÐ.Ó/ØØØ$ô	
ð 	×ÑÜ#ÜÜÐ.Ó/ØØØ$õ	
r"   c                 óø  — t         r‚dD ]?  }| j                  t        t        t        ft
        dt        «       t        dd|d¬«      «       ŒA | j                  t        t        t        ft        dt        «       t        dddd¬«      d «       | j                  t        t        d d	d
t        ddd¬«      «       | j                  t        j                  t        t        ft        dt        «       t        dddd¬«      d «       y )N)Úsocks4Úsocks4aÚsocks5Úsocks5hzwss://127.0.0.1ú	127.0.0.1Ú9999gš™™™™™¹?)Úhttp_proxy_hostÚhttp_proxy_portÚ
proxy_typeÚhttp_proxy_timeouti'  ru   rp   TÚhttp©r{   r|   r}   )r   r[   r   ÚOSErrorÚConnectionRefusedErrorr	   rI   r   r   r   r   r   ÚsocketrM   )r   r}   s     r    Útest_connectzHttpTest.test_connect¤   sý   € åàHò �
Ø×!Ñ!Ü&¬Ô1GÐHÜ)Ø%Ü“JÜØ(3Ø(.Ø#-Ø+.ô	õðð ×ÑÜ%Ô'=¼wÐGÜØ!Ü“
ÜØ$/Ø$(Ø'Ø'*ô	ð ôð 	×ÑÜ%ÜØØØÜØ +¸VÐPVôô		
ð 	×ÑÜ�^‰^Ô3´WÐ=ÜØÜ‹JÜØ +Ø $Ø!Ø#&ô	ð õ	
r"   z%Internet-requiring tests are disabledc                 óh   — | j                  t        dt        «       t        ddd¬«      d«      d«       y )Nzwss://google.comz8.8.8.8é�  r   r€   T)T)z
google.comé»  ú/)rZ   r   rI   r   r   s    r    Útest_connect_with_internetz#HttpTest.test_connect_with_internetà   s<   € ð 	×ÑÜØ"Ü“
ÜØ$-¸tÐPVôð óð -õ
	
r"   c           	      óî  — t        dddd¬«      }t        «       }t        j                  «       }t        j                  «       }t        j                  «       }||j                  _        t        dd¬«      }t        j                  dd	«      5  t        j                  j                  t        j                  d
|«      5  t        j                  dd	¬«      5 }t        j                  d|¬«      5 }||j                  _        t        d||«      \  }	}
ddd«       ddd«       ddd«       ddd«       j                  j                  «        |j                  j                  ddd¬«       j                  ||j                  d«       | j!                  	|«       | j#                  
d«       t        j                  «       }t        j                  d«      5 }t        j                  ddi df¬«      5  t%        |ddd«      }ddd«       dd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# 1 sw Y   �Œ0xY w# 1 sw Y   ŒhxY w# 1 sw Y   ŒlxY w)zDProxy logic should exercise SOCKS path and HTTP tunnel path offline.úproxy.localÚ1080rw   ©ÚuserÚpass©r{   r|   r}   Úhttp_proxy_authru   )ÚSOCKS4ÚSOCKS5ú!websocket._http.HAVE_PYTHON_SOCKSTÚ	ProxyTypezwebsocket._http.Proxy)Úcreatezwebsocket._http._ssl_socket©Úreturn_valuezwss://example.com/wsNro   r‡   )rM   )ro   r‡   z/wsúwebsocket._http.sendúwebsocket._http.read_headerséÈ   ÚOKÚendpointi(#  )ÚdemoÚsecret)r   rI   r   ÚMockr   r˜   r   ÚpatchÚobjectÚ	websocketÚ_httpr–   r	   Úassert_called_onceÚassert_called_once_withrQ   ÚassertIsrZ   r
   )r   Ú	proxy_cfgÚoptionsÚproxy_instanceÚproxied_socketÚssl_wrapped_socketÚproxy_typesÚ	proxy_clsÚ
ssl_socketrl   ÚaddrÚ	fake_sockÚ	send_mockÚreturneds                 r    Útest_proxy_connectzHttpTest.test_proxy_connectï   s'  € ô Ø)Ø"ØØ,ô	
ˆ	ô “*ˆÜŸ™›ˆÜŸ™›ˆÜ!ŸY™Y›[ÐØ.<ˆ×ÑÔ+ä%¨X¸hÔGˆä�Z‰ZÐ;¸TÓBñ 	ÄDÇJÁJ×DUÑDUÜ�O‰O˜[¨+óE
ñ 	ä�:‰:Ð-°dÔ;ð	à?HÌ$Ï*É*Ø)Ð8JôK
ð	ð Ø,:ˆI×ÑÔ)Ü.Ø&¨°ó‰JˆD�$÷	÷ 	÷ 	÷ 	ð 	×Ñ×+Ñ+Ô-Ø×Ñ×6Ñ6°}ÀcÐSWÐ6ÔXØ×*Ñ*Ø˜GŸN™N¨Mô	
ð 	�‰�dÐ.Ô/Ø×Ñ˜Ð:Ô;ä—I‘I“Kˆ	Ü�Z‰ZÐ.Ó/ð 	P°9¼d¿j¹jØ*¸#¸rÀ4¸ô?
ñ 	Pô ˜y¨*°dÐ<NÓOˆH÷	P÷ 	Pð
 	�‰�h 	Ô*Ø×$Ñ$Õ&÷3	ñ 	ú÷ 	ñ 	ú÷ 	ñ 	ú÷ 	ñ 	ú÷&	Pð 	Pú÷ 	Pð 	Púsx   Â
0IÂ:IÃH8Ã*"H+	ÄH8ÄIÄIÇI+Ç)IÇ8I+È+H5È0H8È8IÈ=IÉI	É
IÉIÉI(	É$I+É+I4c                 óÂ   — t        dd¬«      t        ddd¬«      fD ]5  }| j                  t        «      5  t        dt	        «       |«       ddd«       Œ7 y# 1 sw Y   ŒBxY w)z´A SOCKS proxy with an explicit host but no port raises the same
        WebSocketProxyException as the http-proxy path, instead of passing
        port 0 (or None) to python-socks.r‹   rw   )r{   r}   Nr€   zws://example.com/ws)r   r[   r   r	   rI   )r   r¨   s     r    Ú!test_proxy_connect_no_port_raisesz*HttpTest.test_proxy_connect_no_port_raises  sq   € ô
  }ÀÔJÜØ -Ø $Ø#ôð
ò 		TˆIð ×"Ñ"Ô#:Ó;ñ TÜ%Ð&;¼X»ZÈÔS÷Tð Tñ		T÷Tð Tús   ´AÁA	c                 ó2  — ddt         j                  dddœ}t        j                  |¬«      }|j	                  d«       |j                  d«       |j                  «        t        j                  d	d
i¬«      }|j	                  d«       |j                  «        y )NFÚ
ServerNameaÚ  TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:                        TLS_AES_128_GCM_SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:                        ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:                        ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:                        DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:                        ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:                        ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:                        DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES128-SHA256:                        ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA256:                        ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHAÚ
prime256v1)Úcheck_hostnameÚserver_hostnameÚssl_versionÚciphersÚ
ecdh_curve©rQ   zwss://api.bitfinex.com/ws/2ÚHellorº   T)rO   ÚPROTOCOL_TLS_CLIENTr£   Ú	WebSocketr   r4   r6   )r   Ú
ssloptionsÚws_ssl1Úws_ssl2s       r    Útest_ssloptzHttpTest.test_sslopt*  s…   € ð $Ø+Ü×2Ñ2ð	Eð 'ñ
ˆ
ô  ×%Ñ%¨ZÔ8ˆØ�‰Ð5Ô6Ø�‰�WÔØ�‰Œä×%Ñ%Ð.>ÀÐ-EÔFˆØ�‰Ð5Ô6Ø�‰�r"   c                 óv  — | j                  t        ddd¬«      j                  d«       | j                  t        t        ddd¬«       | j                  t        ddd¬«      j
                  d«       | j                  t        ddd¬«      j                  d«       | j                  t        ddd¬«      j                  d «       | j                  t        dddd¬«      j                  d	   d
«       | j                  t        dddd¬«      j                  d   d«       | j                  t        «       j                  «       y )Nry   Ú8080r   r€   Úbadvalro   )Úmy_username123Ú
my_pass321r�   r   rÊ   rK   rË   )
rZ   r   Úproxy_protocolr[   r   Ú
proxy_hostÚ
proxy_portÚauthÚassertIsNoneÚproxy_timeoutr   s    r    Útest_proxy_infozHttpTest.test_proxy_infoE  sJ  € Ø×ÑÜØ +¸VÐPVôç‰nØô		
ð 	×ÑÜÜØ'Ø"Øð 	ô 	
ð 	×ÑÜØ -¸vÐRXôç‰jØô		
ð 	×ÑÜØ +¸VÐPVôç‰jØô		
ð 	×ÑÜØ +¸VÐPVôç‰dØô		
ð 	×ÑÜØ +Ø &Ø!Ø @ô	÷
 ‰d�1ñð ô	
ð 	×ÑÜØ +Ø &Ø!Ø @ô	÷
 ‰d�1ñð ô	
ð 	×Ñœ*›,×4Ñ4Õ5r"   N)r7   r8   r9   r_   rh   rm   rs   r„   ÚunittestÚ
skipUnlessr   r‰   r´   r¶   rÆ   rÒ   r(   r"   r    rS   rS   g   sz   „ ò
ò6ò,	Cò
ò$:
ðx €X×ÑÐ+Ð-TÓUñ
ó Vð
ò*'òXTð €X×ÑÐ+Ð-TÓUñó Vðó426r"   rS   c                   ó*   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚHttpPureUnitTestsc                 ój  — t        ddd¬«      }t        j                  ddg¬«      5 }t        dd	d
|«      \  }}}d d d «       | j	                  «       | j                  «       j                  dddt        j                  t        j                  «       | j                  dg«       y # 1 sw Y   ŒpxY w)Nzproxy.exampler†   r   r€   ú"websocket._http.socket.getaddrinfo)r°   r—   zrealhost.exampler‡   Tr   )r   r   r¡   r   Ú
assertTruerÐ   r¦   rƒ   ÚSOCK_STREAMÚSOL_TCPrZ   )r   ÚproxyÚmocked_getaddrinfoÚaddrinfoÚneed_tunnelrÏ   s         r    Ú&test_get_addrinfo_list_uses_proxy_hostz8HttpPureUnitTests.test_get_addrinfo_list_uses_proxy_host{  s­   € ÜØ+¸TÈfô
ˆô �Z‰ZØ0À	¸{ô
ð 	àÜ*<Ø" C¨¨uó+Ñ'ˆH�k 4÷	ð 	�‰˜Ô$Ø×Ñ˜$ÔØ×2Ñ2Ø˜T 1¤f×&8Ñ&8¼&¿.¹.ô	
ð 	×Ñ˜ I ;Õ/÷	ð 	ús   §B)Â)B2c                 ó  — t        «       }t        j                  dt        j                  d«      ¬«      5  | j                  t        «      5  t        ddd|«       d d d «       d d d «       y # 1 sw Y   ŒxY w# 1 sw Y   y xY w)NrØ   Úboom©Úside_effectro   rp   F)r   r   r¡   rƒ   Úgaierrorr[   r   r   )r   rÜ   s     r    Ú%test_get_addrinfo_list_wraps_gaierrorz7HttpPureUnitTests.test_get_addrinfo_list_wraps_gaierrorŽ  sz   € Ü“ˆä�Z‰ZØ0¼f¿o¹oÈfÓ>Uô
ñ 	Dð ×"Ñ"Ô#<Ó=ñ DÜ" =°"°e¸UÔC÷D÷	Dð 	D÷Dð Dú÷	Dð 	Dús#   µA7ÁA+ÁA7Á+A4	Á0A7Á7B c                 óv  — t        j                  «       }t        j                  ddœ}t        j                  dt        d«      ¬«      5  | j                  t        «      5 }t        ||dd«       d d d «       d d d «       | j                  dt        j                  «      «       y # 1 sw Y   Œ7xY w# 1 sw Y   Œ;xY w)	Nz/does/not/exist)rL   Úca_certsz4websocket._http.ssl.SSLContext.load_verify_locationsÚmissingrã   ro   Tz!SSL CA certificate loading failed)r   r    rO   ÚCERT_REQUIREDr¡   ÚFileNotFoundErrorr[   r   r   ra   rb   rc   )r   Ú
dummy_sockrQ   Úctxs       r    Ú/test_wrap_sni_socket_raises_for_missing_ca_filezAHttpPureUnitTests.test_wrap_sni_socket_raises_for_missing_ca_file—  s¢   € Ü—Y‘Y“[ˆ
Ü"×0Ñ0Ð>OÑPˆä�Z‰ZØBÜ)¨)Ó4ô
ñ 	Jð ×"Ñ"Ô#5Ó6ð J¸#Ü  ¨V°]ÀDÔI÷J÷		Jð 	�‰Ð9¼3¸s¿}¹}Ó;MÕN÷Jð Jú÷		Jð 	Jús$   ÁB/ÁB#Á-B/Â#B,	Â(B/Â/B8c                 óü   — t        ddd¬«      }t        i ¬«      }t        j                  dd«      5  | j	                  t
        «      5  t        d||«       d d d «       d d d «       y # 1 sw Y   ŒxY w# 1 sw Y   y xY w)	Nry   i8  rw   r€   r¿   r”   Fzwss://example.com)r   r   r   r¡   r[   r   r	   )r   rÜ   r©   s      r    Ú/test_start_proxied_socket_requires_python_sockszAHttpPureUnitTests.test_start_proxied_socket_requires_python_socks¤  s‚   € ÜØ'¸È(ô
ˆô "¨Ô,ˆä�Z‰ZÐ;¸UÓCñ 	KØ×"Ñ"Ô#5Ó6ñ KÜ%Ð&9¸7ÀEÔJ÷K÷	Kð 	K÷Kð Kú÷	Kð 	Kús#   ±A2ÁA&ÁA2Á&A/	Á+A2Á2A;c           	      óZ  — t        «       }t        j                  d«      5 }t        j                  ddi df¬«      5  | j                  t        «      5  t        |ddd«       d d d «       d d d «       d d d «       j                  «        y # 1 sw Y   Œ*xY w# 1 sw Y   Œ.xY w# 1 sw Y   Œ2xY w)	Nr™   rš   i“  Ú	Forbiddenr—   ro   r‡   r�   )r¢   r   r¡   r[   r   r
   Úassert_called)r   Úfake_socketr²   s      r    Útest_tunnel_raises_for_non_200z0HttpPureUnitTests.test_tunnel_raises_for_non_200®  s¨   € Ü“hˆä�Z‰ZÐ.Ó/ð 	K°9¼d¿j¹jØ*¸#¸rÀ;Ð9Oô?
ñ 	Kð ×"Ñ"Ô#:Ó;ñ KÜ˜ ]°CÐ9IÔJ÷K÷	K÷ 	Kð 	×ÑÕ!÷Kð Kú÷	Kð 	Kú÷ 	Kð 	Kús:    B!»BÁB	Á BÁ(B!Â	BÂBÂB	ÂB!Â!B*N)r7   r8   r9   rà   ræ   rî   rð   rõ   r(   r"   r    rÖ   rÖ   z  s   „ ò0ò&DòOòKó	"r"   rÖ   Ú__main__)(r>   Úos.pathrƒ   rO   rÓ   Útypesr   r   r£   Úwebsocket._exceptionsr   r   r   Úwebsocket._httpr   r	   r
   r   r   r   r   r   Úpython_socks._errorsr   r   r   ÚenvironÚgetr   r   r   ÚTEST_WITH_LOCAL_SERVERr   r;   rI   ÚTestCaserS   rÖ   r7   Úmainr(   r"   r    ú<module>r     s  ðó 
Û Û Û 
Û Ý !Ý ã ÷ñ ÷
	÷ 	ó 	ðð&TßXÑXð
 —Z‘Z—^‘^Ð$8¸#Ó>À#ÑEÐ Ø—*‘*—.‘.Ð!2°CÓ8¸CÑ?€à—z‘z—~‘~Ð&<¸dÓCÐ Ø-°Ñ5Ð ÷ñ ô8&�Xô &÷3ñ 3ôP6ˆx× Ñ ô P6ôf="˜×)Ñ)ô ="ð@ ˆzÒØ€H‡M�M…Oð øðSTßSÓSús   Á
D ÄD