o
    ‡eªM  ã                   @   sš  d dl mZmZ d dlm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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d dlmZ d dlmZ G dd„ deƒZdd„ ZG dd„ deƒZG dd„ de
jƒZG dd„ deƒZG dd„ deƒZ G dd„ deƒZ!G dd„ deƒZ"G dd„ de#ƒZ$G dd „ d eƒZ%ej& 'e(¡fd!d"„Z)G d#d$„ d$e*ƒZ+G d%d&„ d&eƒZ,e-d'krËe
 .¡  dS dS )(é    )Úprint_functionÚdivision)ÚcontextmanagerN)ÚPY3)Úsysinfo)ÚDEFAULT_SOCKET_TIMEOUT)ÚSMALLEST_RELIABLE_DELAY)Útcp_listener)ÚWIN)Úsocket)ÚStreamServer)ÚLoopExitc                   @   ó   e Zd Zdd„ ZdS )ÚSimpleStreamServerc           	      C   sÔ   |  ¡ }z`| ¡ }|sW | ¡  d S z| dd¡\}}}W n ty,   td|f ƒ ‚ w |dkr7| d¡ n |dv rK| d¡ 	 | d	¡}|sInqAn| d
¡ W | ¡  d S W | ¡  d S W | ¡  d S | ¡  w )Nú é   z Failed to parse request line: %rz/pings   HTTP/1.0 200 OK

PONG)ú/longú/shorts   helloTé   s   HTTP/1.0 404 WTF?

)ÚmakefileÚreadlineÚcloseÚsplitÚ	ExceptionÚprintÚsendallÚrecv)	ÚselfZclient_socketÚ_addressÚfdZrequest_lineÚ_methodÚpathÚ_restÚdata© r$   úID:\Projects\ConvertPro\env\Lib\site-packages\gevent/tests/test__server.pyÚhandle   s8   ðþ

ýö
üzSimpleStreamServer.handleN)Ú__name__Ú
__module__Ú__qualname__r&   r$   r$   r$   r%   r      ó    r   c                  G   s.   zt  tsdnt¡ W d S  ty   Y d S w ©Nr   )ÚgeventÚsleepr
   r   r   ©Ú_argsr$   r$   r%   Úsleep_to_clear_old_sockets0   s
   ÿr0   c                   @   sP   e Zd ZeZeZdZdZe	dd„ ƒZ
e
Ze	dd„ ƒZe	dd„ ƒZe	dd	„ ƒZd
S )ÚSettingsTc              	   C   s\   |   ¡ }z| ¡ }W n tjy   d }Y nw W d   ƒ n1 s"w   Y  |  |¡ d S ©N)r   Úreadr   ÚtimeoutÚassertFalse)ÚinstÚconnÚresultr$   r$   r%   ÚassertAcceptedConnectionErrorB   s   
ÿ€ýz&Settings.assertAcceptedConnectionErrorc              
   C   sR   |   ¡  z|  ¡  W d S  tjy( } z|jd tjvr‚ W Y d }~d S d }~ww r+   )Ú	assert500Úsend_requestr   ÚerrorÚargsÚ	greentestZCONN_ABORTED_ERRORS)r6   Úexr$   r$   r%   Ú	assert503M   s   ÿ€ÿzSettings.assert503c                 C   s>   |   tj¡ | jdd W d   ƒ d S 1 sw   Y  d S )Ng{®Gáz„?©r4   )ÚassertRaisesr   r4   ÚassertRequestSucceeded)r6   r$   r$   r%   ÚassertPoolFullX   s   "ÿzSettings.assertPoolFullc                 C   s   |  d|  ¡ ¡ |S )NÚspawn)Ú
setdefaultÚ	get_spawn)r6   Úkwargsr$   r$   r%   Úfill_default_server_args]   s   z!Settings.fill_default_server_argsN)r'   r(   r)   r   ÚServerClassr   ÚServerSubClassÚrestartableZclose_socket_detectedÚstaticmethodr9   r:   r@   rD   rI   r$   r$   r$   r%   r1   <   s    



r1   c                   @   s  e Zd ZejZeZdZdd„ Zdd„ Z	dd„ Z
eedd	fd
d„ƒZdedfdd„Zd8dd„ZdZejr8ejfZnejr@ejr@dZd9dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zefd d!„Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Z d*d+„ Z!e"d,d-„ ƒZ#d.d/„ Z$d0d1„ Z%d2d3„ Z&d4d5„ Z'd6d7„ Z(dS ):ÚTestCaseNc                 C   s*   t | dd ƒd ur| j ¡  d | _tƒ  d S )NÚserver)ÚgetattrrO   Ústopr0   ©r   r$   r$   r%   Úcleanuph   s   

zTestCase.cleanupc                 C   s   |   tdd¡S )Né   ©Úbacklog)Ú_close_on_teardownr	   rR   r$   r$   r%   Úget_listenern   ó   zTestCase.get_listenerc                 C   sX   | j j}|s
tj}n|dkrtj}z| j jj}W n ty$   tj}Y nw || j j	|fS )Nz::)
rO   Úserver_hostr>   ZDEFAULT_LOCAL_HOST_ADDRZDEFAULT_LOCAL_HOST_ADDR6r   ÚfamilyÚAttributeErrorÚAF_INETÚserver_port)r   rZ   r[   r$   r$   r%   Úget_server_host_port_familyq   s   
þz$TestCase.get_server_host_port_familyr   Fc              	   c   sÔ    |   ¡ \}}}trdnd}||i}trd|d< tj|dB}	d }
|	 ||f¡ |	 |¡ |	jdi |¤Ž}
|s:|
n|
|	f}|V  W d   ƒ n1 sKw   Y  W d   ƒ d S W d   ƒ d S 1 scw   Y  d S )NÚ	bufferingÚbufsizeÚrwbÚmode)r[   r$   )r_   r   r   ÚconnectÚ
settimeoutr   )r   r4   ra   Úinclude_raw_socketrZ   r^   r[   ZbufargZmakefile_kwargsÚsockZrconnr8   r$   r$   r%   r   €   s"   €
þù"ùzTestCase.makefileú/c                 C   s@   | j ||d}|  ||¡ W d   ƒ d S 1 sw   Y  d S )N)r4   ra   )r   Úsend_request_to_fd)r   Úurlr4   ra   r7   r$   r$   r%   r;   •   s   "ÿzTestCase.send_requestc                 C   s    |  d|  d¡¡ | ¡  d S )NzGET %s HTTP/1.0

zlatin-1)ÚwriteÚencodeÚflush)r   r   rj   r$   r$   r%   ri   ™   s   zTestCase.send_request_to_fdr$   )iA'  Tc              	   C   s¶   z0|   tj¡ }|  ¡ }| ¡  W d   ƒ n1 sw   Y  W d   ƒ n1 s*w   Y  W n ty=   |s:‚ Y d S w |j}|  |jd t	j
t	jt	jt	jf| j ||jf¡ d S r+   )rB   r   r<   r   r   r   Ú	exceptionÚassertInr=   ÚerrnoZECONNREFUSEDZEADDRNOTAVAILÚ
ECONNRESETÚECONNABORTEDÚLOCAL_CONN_REFUSED_ERRORS)r   Zin_proc_serverÚexcr7   r?   r$   r$   r%   ÚassertConnectionRefused§   s,   

ÿ€ÿ€÷ÿÿýz TestCase.assertConnectionRefusedc                 C   ó   | j  | ¡ d S r2   )r1   r:   rR   r$   r$   r%   r:   ½   rY   zTestCase.assert500c                 C   rv   r2   )r1   r@   rR   r$   r$   r%   r@   À   rY   zTestCase.assert503c                 C   rv   r2   )r1   r9   rR   r$   r$   r%   r9   Ã   rY   z&TestCase.assertAcceptedConnectionErrorc                 C   rv   r2   )r1   rD   rR   r$   r$   r%   rD   Æ   rY   zTestCase.assertPoolFullc              	   C   sÊ   zM| j dd=\}}| d¡ | ¡  d}z	 | d¡}|sn||7 }qW n tjy<   |  |¡ Y W d   ƒ W d S w W d   ƒ n1 sGw   Y  W n
 tyW   Y d S w |  | 	d¡t
|ƒ¡ d S )NT)rf   s   GET / HTTP/1.0

ó    r   s"   HTTP/1.0 500 Internal Server Error)r   rk   rm   r   r   r4   r5   r   Ú
assertTrueÚ
startswithÚrepr)r   r7   rg   r8   r#   r$   r$   r%   ÚassertNotAcceptedÉ   s2   

ü
ô
þø€þzTestCase.assertNotAcceptedc                 C   sX   | j |d}| d¡ | ¡ }W d   ƒ n1 sw   Y  |  | d¡t|ƒ¡ d S )NrA   s   GET /ping HTTP/1.0

s   

PONG)r   rk   r3   rx   Úendswithrz   )r   r4   r7   r8   r$   r$   r%   rC   ß   s
   

þzTestCase.assertRequestSucceededc                 C   s   | j  ¡  |  ¡  |  ¡  d S r2   )rO   ÚstartrC   rR   r$   r$   r%   Ústart_serveræ   s   
zTestCase.start_serverc                 C   s   | j  ¡  |  ¡  d S r2   )rO   rQ   ru   rR   r$   r$   r%   Ústop_serverë   s   
zTestCase.stop_serverc                 C   ó   d S r2   r$   )r   Z_msgr$   r$   r%   Úreport_netstatï   s   zTestCase.report_netstatc                 O   s6   |  d| j¡}|  dtjdf¡}||g|¢R i |¤ŽS )NÚserver_kindZserver_listen_addrr   )ÚpoprK   r>   ÚDEFAULT_BIND_ADDR)r   r=   rH   ÚkindÚaddrr$   r$   r%   Ú_create_serverô   s   zTestCase._create_serverc                 O   s&   | j |i |¤Ž| _| j ¡  tƒ  d S r2   )r‡   rO   r}   r0   ©r   r=   rH   r$   r$   r%   Úinit_serverù   s   

zTestCase.init_serverc                 C   ó   | j jS r2   ©rO   r   rR   r$   r$   r%   r   þ   ó   zTestCase.socketc                 C   sv   t jr|  d¡ z$|  dd„ ¡ |  ¡  |  ¡  |  t¡ W | j 	¡  dd l
}| ¡  d S | j 	¡  dd l
}| ¡  w )NzSometimes misses the errorc                   S   r€   r2   r$   r$   r$   r$   r%   Ú<lambda>	  ó    z1TestCase._test_invalid_callback.<locals>.<lambda>r   )r   ZRUNNING_ON_APPVEYORZskipTestr‰   Úexpect_one_errorr:   Úassert_errorÚ	TypeErrorrO   rQ   ÚgcZcollect)r   r’   r$   r$   r%   Ú_test_invalid_callback  s   


üzTestCase._test_invalid_callbackc                 C   s   | j  | |¡S r2   )r1   rI   )r   rH   r$   r$   r%   rI     ó   z!TestCase.fill_default_server_argsc                 O   ó   | j j|i |  |¡¤ŽS r2   )r1   rJ   rI   rˆ   r$   r$   r%   rJ     ó   
ÿzTestCase.ServerClassc                 O   r•   r2   )r1   rK   rI   rˆ   r$   r$   r%   rK     r–   zTestCase.ServerSubClassc                 C   r€   r2   r$   rR   r$   r$   r%   rG      ó   zTestCase.get_spawn)rh   )T))r'   r(   r)   r>   ZLARGE_TIMEOUTZ__timeout__r1   rO   rS   rX   r_   r   Ú_DEFAULT_SOCKET_TIMEOUTr   r;   ri   rs   ZOSXrp   Ú
EPROTOTYPEr
   ZPYPY3ru   r:   r@   r9   rD   r{   rC   r~   r   r   r‡   r‰   Úpropertyr   r“   rI   rJ   rK   rG   r$   r$   r$   r%   rN   b   sF    



rN   c                   @   sÀ   e Zd Zdd„ Zdd„ Zdd„ Ze d¡e d¡d	d
„ ƒƒZ	dd„ Z
e d¡dd„ ƒZdd„ Zdd„ Ze ej¡dd„ ƒZdd„ Zdd„ Ze ejd¡dd„ ƒZedd„ ƒZdd„ Zd d!„ Zd"S )#ÚTestDefaultSpawnc                 C   ó   t jS r2   ©r,   rE   rR   r$   r$   r%   rG   %  ó   zTestDefaultSpawn.get_spawnc                 C   s|   |   d¡ |  ¡  |   d¡ |r3| jjr3| j ¡  |   d¡ |  ¡  | j ¡  |   d¡ tƒ  |  	¡  |  
¡  |   d¡ d S )Nzbefore startzafter startzafter stop_acceptingzafter start_acceptingz
after stop)r   r~   r1   rL   rO   Zstop_acceptingr{   Zstart_acceptingr0   rC   r   )r   rL   r$   r$   r%   Ú_test_server_start_stop(  s   





z(TestDefaultSpawn._test_server_start_stopc                 C   sH   d| _ |  t¡ | j|  ¡ dd W d   ƒ d S 1 sw   Y  d S )NFé   rU   )Úswitch_expectedrB   r‘   rJ   rX   rR   r$   r$   r%   Ú'test_backlog_is_not_accepted_for_socket7  s   "ÿz8TestDefaultSpawn.test_backlog_is_not_accepted_for_socketzSometimes times outzSometimes times out.c                 C   s.   | j tjdfdd| _|  ¡  | jdd d S )Nr   r    rU   F©rL   ©rK   r>   r„   rO   ru   rŸ   rR   r$   r$   r%   Ú$test_backlog_is_accepted_for_address<  s   z5TestDefaultSpawn.test_backlog_is_accepted_for_addressc                 C   s   |   |  ¡ ¡| _|  ¡  d S r2   )rK   rX   rO   r{   rR   r$   r$   r%   Útest_subclass_just_createC  s   z*TestDefaultSpawn.test_subclass_just_createc                 C   s(   |   |  ¡ ¡| _|  ¡  | jdd d S )NTr£   )rK   rX   rO   r{   rŸ   rR   r$   r$   r%   Útest_subclass_with_socketG  s   z*TestDefaultSpawn.test_subclass_with_socketc                 C   s*   |   tjdf¡| _|  ¡  | jdd d S )Nr   Tr£   r¤   rR   r$   r$   r%   Útest_subclass_with_addressO  s   z+TestDefaultSpawn.test_subclass_with_addressc                 C   ó   |   ¡  d S r2   ©r“   rR   r$   r$   r%   Útest_invalid_callbackT  ó   z&TestDefaultSpawn.test_invalid_callbackc                 C   sz   t  | jj¡}z'tƒ  |  ¡  | j ¡  |  | jj¡ |  	¡  W | 
¡  | ¡  | j ¡  d S | 
¡  | ¡  | j ¡  w r2   )r,   rE   rO   Úserve_foreverr0   rC   rQ   r5   Ústartedru   ÚkillÚget)r   Úgr$   r$   r%   Ú_test_serve_foreverW  s   

þz$TestDefaultSpawn._test_serve_foreverc                 C   s4   |   tjdf¡| _|  | jj¡ |  ¡  |  ¡  d S r+   )rK   r>   r„   rO   r5   r®   ru   r²   rR   r$   r$   r%   Útest_serve_forevere  s   z#TestDefaultSpawn.test_serve_foreverc                 C   sL   |   tjdf¡| _|  ¡  |  | jj¡ | j ¡  |  | jj¡ |  	¡  d S r+   )
rK   r>   r„   rO   ru   r5   r®   r}   rx   r²   rR   r$   r$   r%   Útest_serve_forever_after_startk  s   
z/TestDefaultSpawn.test_serve_forever_after_startzSometimes spuriously failsc                 C   s  |   tjdfdd„ ¡| _| j ¡  tƒ  |  ¡ e}|  |¡ tj	 
d¡J z| ¡ }|r7| d¡s7J t|ƒƒ‚W n. tjyB   Y n% tjyf } z|jd dkrRn
|jd tjkr[n‚ W Y d }~nd }~ww W d   ƒ n1 sqw   Y  W d   ƒ n1 s€w   Y  |  ¡  d S )Nr   c                  W   s   g S r2   r$   )r=   r$   r$   r%   r   u  rŽ   zDTestDefaultSpawn.test_server_closes_client_sockets.<locals>.<lambda>r   z"HTTP/1.0 500 Internal Server ErroriE'  )rJ   r>   r„   rO   r}   r0   r   ri   r,   ÚTimeoutZ_start_new_or_dummyr3   ry   rz   r   r4   r<   r=   rp   rq   r   )r   r7   r8   r?   r$   r$   r%   Ú!test_server_closes_client_socketss  s4   


€€ú€ù€ýz2TestDefaultSpawn.test_server_closes_client_socketsc                 C   rŠ   r2   r‹   rR   r$   r$   r%   r   Œ  rŒ   zTestDefaultSpawn.socketc                    sR   |   ¡  |  | jj¡ tdƒ‰ ‡ fdd„}|| j_|  ¡  |  ¡  |  tˆ ¡ d S )NÚtest_error_in_spawnc                     s   t  ¡  ˆ ¡ d S r2   )r,   Z
getcurrentÚthrowr.   ©r<   r$   r%   Ú_spawn”  s   z4TestDefaultSpawn.test_error_in_spawn.<locals>._spawn)	r‰   rx   rO   r®   ÚExpectedErrorrº   r   r9   r   )r   rº   r$   r¹   r%   r·     s   z$TestDefaultSpawn.test_error_in_spawnc                 C   s¤   |   ¡  | jjs
J ‚|  dt| jƒ¡ | j | jj¡ |  dt| jƒ¡ |  dt| jƒ¡ | j | j¡ |  dt| jƒ¡ dd„ }| j |¡ |  dt| jƒ¡ d S )NÚServerzhandle=<bound methodzof self>Ú.test_server_repr_when_handle_is_instancemethodc                   S   r€   r2   r$   r$   r$   r$   r%   r&   ¨  r—   zOTestDefaultSpawn.test_server_repr_when_handle_is_instancemethod.<locals>.handlezhandle=<function)r‰   rO   r®   ro   rz   Z
set_handler&   r½   )r   r&   r$   r$   r%   r½   ›  s   z?TestDefaultSpawn.test_server_repr_when_handle_is_instancemethodN)r'   r(   r)   rG   rŸ   r¢   r>   ZskipOnLibuvOnCIOnPyPyÚskipOnAppVeyorr¥   r¦   r§   r¨   r«   Zreraises_flaky_timeoutr   r4   r²   r³   r´   ÚskipIfÚEXPECT_POOR_TIMER_RESOLUTIONr¶   rš   r·   r½   r$   r$   r$   r%   r›   #  s,    




r›   c                   @   r   )ÚTestRawSpawnc                 C   rœ   r2   )r,   Z	spawn_rawrR   r$   r$   r%   rG   °  rž   zTestRawSpawn.get_spawnN)r'   r(   r)   rG   r$   r$   r$   r%   rÁ   ®  r*   rÁ   c                   @   s0   e Zd Zdd„ Ze ejd¡dd„ ƒZde_dS )ÚTestPoolSpawnc                 C   s   dS )Né   r$   rR   r$   r$   r%   rG   ¶  r—   zTestPoolSpawn.get_spawnz™If we have bad timer resolution and hence increase timeouts, it can be hard to sleep for a correct amount of time that lets requests in the pool be full.c              	   C   sÜ   |   ¡  |  ¡ B}|  ¡ .}|  |d¡ |  |d¡ t ¡ j ¡  t td ¡ |  	¡  |  	¡  |  	¡  W d   ƒ n1 s>w   Y  W d   ƒ n1 sMw   Y  t t¡ z|  
¡  W d S  tjym   t ¡  Y d S w )Nr   r   g      $@)r‰   r   ri   r,   Zget_hubÚloopZ
update_nowr-   r˜   rD   rC   r   r4   r>   ZreraiseFlakyTestTimeout)r   Zlong_requestZshort_requestr$   r$   r%   Útest_pool_full¹  s&   


õ€ÿ
ÿzTestPoolSpawn.test_pool_fullFN)	r'   r(   r)   rG   r>   r¿   rÀ   rÅ   Zerror_fatalr$   r$   r$   r%   rÂ   ´  s    ÿ

rÂ   c                   @   s.   e Zd Zdd„ Zdd„ Ze d¡dd„ ƒZdS )	ÚTestNoneSpawnc                 C   r€   r2   r$   rR   r$   r$   r%   rG   Ý  r—   zTestNoneSpawn.get_spawnc                 C   r©   r2   rª   rR   r$   r$   r%   r«   à  r¬   z#TestNoneSpawn.test_invalid_callbackz Sometimes doesn't get the error.c                 C   s:   dd„ }| j || jd d |  ¡  |  ¡  |  td¡ d S )Nc                  W   s   t  t¡ d S r2   )r,   r-   r   r.   r$   r$   r%   r-   å  r”   z<TestNoneSpawn.test_assertion_in_blocking_func.<locals>.sleep)r‚   rE   z?Impossible to call blocking function in the event loop callback)r‰   rK   r   r:   r   ÚAssertionError)r   r-   r$   r$   r%   Útest_assertion_in_blocking_funcã  s
   z-TestNoneSpawn.test_assertion_in_blocking_funcN)r'   r(   r)   rG   r«   r>   r¾   rÈ   r$   r$   r$   r%   rÆ   Û  s
    rÆ   c                   @   ó   e Zd ZdS )r»   N©r'   r(   r)   r$   r$   r$   r%   r»   í  ó    r»   c                   @   s2   e Zd ZdZdd„ Ze eedƒd¡dd„ ƒZ	dS )	ÚTestSSLSocketNotAllowedFc                 C   rœ   r2   r   rR   r$   r$   r%   rG   ö  rž   z!TestSSLSocketNotAllowed.get_spawnÚsslzUses socket.sslc                 C   s8   ddl m} |  tdd¡}||ƒ}|  t| j|¡ d S )Nr   )rÍ   rT   rU   )Zgevent.socketrÍ   rW   r	   rB   r‘   rK   )r   rÍ   Úlistenerr$   r$   r%   Útestù  s   zTestSSLSocketNotAllowed.testN)
r'   r(   r)   r¡   rG   ÚunittestZ
skipUnlessÚhasattrr   rÏ   r$   r$   r$   r%   rÌ   ò  s
    rÌ   c                 C   s   t j t j || ¡¡S r2   )Úosr!   ÚabspathÚjoin)ÚnameÚherer$   r$   r%   Ú_file   s   r×   c                   @   rÉ   )ÚBadWrapExceptionNrÊ   r$   r$   r$   r%   rØ     rË   rØ   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTestSSLGetCertificatec                 C   s   | j tjdftdƒtdƒdS )Nr   z
server.keyz
server.crt)ÚkeyfileÚcertfile)rK   r>   r„   r×   rR   r$   r$   r%   r‡   
  s   þz$TestSSLGetCertificate._create_serverc                 C   rœ   r2   r   rR   r$   r$   r%   rG     rž   zTestSSLGetCertificate.get_spawnc                 C   sX   ddl m}m} |  | d¡¡ |  | d¡¡ |  ¡  |  ¡ \}}}| ||f¡ d S )Nr   )ÚmonkeyrÍ   rÍ   r   )r,   rÜ   rÍ   r5   Zis_module_patchedr‰   r_   Úget_server_certificate)r   rÜ   rÍ   rZ   r^   Z_familyr$   r$   r%   Útest_certificate  s   z&TestSSLGetCertificate.test_certificatec                 C   sV   |   ¡  dd„ }|| j_|  t¡ | j d d ¡ W d   ƒ d S 1 s$w   Y  d S )Nc                 [   s   t ƒ ‚r2   )rØ   )Z_client_socketZ
_wrap_argsr$   r$   r%   Úbad_wrap&  rž   zPTestSSLGetCertificate.test_wrap_socket_and_handle_wrap_failure.<locals>.bad_wrap)r‰   rO   Úwrap_socketrB   rØ   Ú_handle)r   rß   r$   r$   r%   Ú(test_wrap_socket_and_handle_wrap_failure  s   "ÿz>TestSSLGetCertificate.test_wrap_socket_and_handle_wrap_failureN)r'   r(   r)   r‡   rG   rÞ   râ   r$   r$   r$   r%   rÙ     s
    rÙ   Ú__main__)/Ú
__future__r   r   Ú
contextlibr   rÐ   rp   rÒ   Zgevent.testingÚtestingr>   r   r   r   r˜   Zgevent.testing.timingr   Zgevent.testing.socketsr	   r
   r,   r   Zgevent.serverr   Zgevent.exceptionsr   r   r0   Úobjectr1   rN   r›   rÁ   rÂ   rÆ   r   r»   rÌ   r!   ÚdirnameÚ__file__r×   ÚBaseExceptionrØ   rÙ   r'   Úmainr$   r$   r$   r%   Ú<module>   sD    & B '+ÿ