Ë
    #ïàjÐH  ã                   óÌ  — d Z ddlZddlZddlZddlZddlZddlZ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ZddlZddlZddlmZ ddlmZmZmZmZmZmZ ddlmZmZmZ ddlm Z m!Z!m"Z"m#Z# dd	l$m%Z% exs eZ&ejN                  dd d
k  Z(ejR                  jU                   e+ed«       d¬«      Z,ejR                  jU                  ed¬«      Z- ej\                  d¬«      d„ «       Z/ej\                  d„ «       Z0ej\                  d„ «       Z1d„ Z2d„ Z3ejR                  ji                  de5e6e7e8f«      d„ «       Z9d„ Z:ejR                  ji                  de e!f«      d„ «       Z;e,d„ «       Z<e,d„ «       Z=dZ>dZ? G d„ d e«      Z@ej\                  d!„ «       ZAe,e-ejR                  j…                  d"d¬#«      d$„ «       «       «       ZCejR                  jU                  e d%¬«      e,e-d&„ «       «       «       ZDejR                  jU                  ed'¬«      ejR                  ji                  d(d)d*¬+«      ejR                  j‹                  d,«      d-„ «       «       «       ZFejR                  jU                   e+ed.«       d/¬«      ejR                  ji                  de e!f«      d0„ «       «       ZGej\                  d1„ «       ZHej\                  d2„ «       ZIej\                  d3„ «       ZJejR                  ji                  d4d5d6 eKd7«      fd5d8 eKd7«      fd9d:d5 eKd7«       eKd7«      fdd6 eKd7«      fdd8 eKd7«      fd;d eKd7«       eKd7«      ff	«      d<„ «       ZLejR                  ji                  d=d>«      d?„ «       ZMd@„ ZNdA„ ZOdB„ ZPy)CzTests for the HTTP server.é    N)Ú
HTTPStatus)Ú	DefaultGcé   )ÚIS_LINUXÚIS_MACOSÚ
IS_WINDOWSÚSYS_PLATFORMÚbtonÚntob)ÚIS_UID_GID_RESOLVABLEÚGatewayÚ
HTTPServer)ÚANY_INTERFACE_IPV4ÚANY_INTERFACE_IPV6ÚEPHEMERAL_PORTÚSUCCESSFUL_SUBPROCESS_EXIT)Ú
ThreadPool)é   é   ÚAF_UNIXz:UNIX domain sockets are only available under UNIX-based OS©Úreasonz9Peercreds lookup does not work under macOS/BSD currently.)ÚabstractÚfile)Úparamsc                 óŽ   — t         rt        j                  d«        dj                  di t	        «       ¤Ž}| j                  |«      S )ú9Check that bound UNIX socket address is stored in server.z1`requests-unixsocket` is defunct under Python 3.8zunix_{request.param}_sock© )ÚPY38_OR_LOWERÚpytestÚskipÚformatÚlocalsÚgetfixturevalue)ÚrequestÚnames     úG/srv/dav/.venv/lib/python3.12/site-packages/cheroot/test/test_server.pyÚunix_sock_filer(   1   s?   € õ ô 	�‰ÐGÔHØ-Ð&×-Ñ-Ñ9´³Ñ9€DØ×"Ñ" 4Ó(Ð(ó    c            	      óÐ   — t         st        j                  t        › d�«       dj	                  dt        t        t        j                  «       «      «      f«      j                  «       S )z'Return an abstract UNIX socket address.z. does not support an abstract socket namespacer)   s    cheroot-test-socket)
r   r    r!   r	   Újoinr   ÚstrÚuuidÚuuid4Údecoder   r)   r'   Úunix_abstract_sockr0   =   sU   € õ Ü�‰ÜˆnÐJÐKô	
ð �8‰8à&Ü””T—Z‘Z“\Ó"Ó#ð	
ó÷
 �fƒhðr)   c               #   ó–   K  — t        j                  «       \  } }|–— t        j                  | «       t        j                  |«       y­w)zYield a UNIX file socket.N)ÚtempfileÚmkstempÚosÚcloseÚunlink)Útmp_sock_fhÚtmp_sock_fnames     r'   Úunix_file_sockr9   L   s9   è ø€ ô #+×"2Ñ"2Ó"4Ñ€K�à
Òä‡H�Hˆ[ÔÜ‡I�IˆnÕùs   ‚AA	c                  ó°  — t        t        t        ft        ¬«      } | j                  rJ ‚| j
                  j                  rJ ‚| j                  «        | j                  sJ ‚| j
                  j                  sJ ‚| j
                  j                  D ]  }|j                  rŒJ ‚ | j                  «        | j
                  j                  rJ ‚| j                  rJ ‚y)zBCheck that prepare() makes the server ready, and stop() clears it.©Ú	bind_addrÚgatewayN)	r   r   r   r   ÚreadyÚrequestsÚ_threadsÚprepareÚstop)Ú
httpserverÚthrs     r'   Útest_prepare_makes_server_readyrE   W   sÇ   € äÜ%¤~Ð6Üô€Jð
 ×ÒÐÐØ×"Ñ"×+Ò+Ð+Ð+à×ÑÔà×ÒÐÐØ×Ñ×'Ò'Ð'Ð'Ø×"Ñ"×+Ñ+ò ˆØ�y‹yÐˆyðð ‡O�OÔà×"Ñ"×+Ò+Ð+Ð+Ø×ÒÐÐÐr)   c                  óf  — t        t        t        ft        ¬«      } | j	                  «        t        j                  | j                  ¬«      }|j                  «        |j                  d«       |j                  «       sJ ‚| j                  «        |j                  d«       |j                  «       rJ ‚y)ú0Check that stop() interrupts running of serve().r;   ©Útargetç      à?N)r   r   r   r   rA   Ú	threadingÚThreadÚserveÚstartr+   Úis_aliverB   )rC   Úserve_threads     r'   Útest_stop_interrupts_serverQ   n   s”   € äÜ%¤~Ð6Üô€Jð
 ×ÑÔÜ×#Ñ#¨:×+;Ñ+;Ô<€LØ×ÑÔà×Ñ�cÔØ× Ñ Ô"Ð"Ð"à‡O�OÔà×Ñ�cÔØ×$Ñ$Ô&Ð&Ð&Ð&r)   Úexc_clsc                 óú  ‡ ‡‡‡‡— dt        j                  «       ›�Št        «       Št        t        t
        ft        ¬«      Št        j                  «       Šˆ ˆˆˆˆfd„}‰j                  «        t        j                  |¬«      }|j                  «        |j                  d«       |j                  «       sJ ‚ ‰ ‰«      ‰_        |j                  d«       |j                  «       rJ ‚‰j!                  «       ‰u sJ ‚y)z0Check that assigning interrupt stops the server.zshould catch r;   c                  ó”   •— 	 ‰j                  «        y # ‰$ r.} t        | «      ‰k(  r‰j                  ‰«       Y d } ~ y Y d } ~ y d } ~ ww xY w©N)rM   r,   Úput)ÚerR   rC   Úinterrupt_msgÚraise_marker_sentinelÚresult_qs    €€€€€r'   rP   z+test_server_interrupt.<locals>.serve_thread—   sE   ø€ ð	4Ø×ÑÕøØò 	4Ü�1‹v˜Ò&Ø—‘Ð2×3Ñ3ô 'ûð	4ús   ƒ ”A™AÁArH   rJ   N)r-   r.   Úobjectr   r   r   r   ÚqueueÚQueuerA   rK   rL   rN   r+   rO   Ú	interruptÚ
get_nowait)rR   rP   rC   rX   rY   rZ   s   ` @@@@r'   Útest_server_interruptr`   ‚   sÝ   ü€ ð $¤D§J¡J£LÐ#3Ð4€MÜ"›HÐäÜ%¤~Ð6Üô€Jô
 �{‰{‹}€H÷4ð 4ð ×ÑÔÜ×#Ñ#¨<Ô8€LØ×ÑÔà×Ñ�cÔØ× Ñ Ô"Ð"Ð"ñ # =Ó1€JÔà×Ñ�cÔØ×$Ñ$Ô&Ð&Ð&Ø×ÑÓ Ð$9Ñ9Ð9Ñ9r)   c                  ó¶  — t        t        t        ft        ¬«      } | j	                  «        d„ }|| j
                  j                  _        t        j                  | j                  ¬«      }|j                  «        |j                  | j                  t        rdndz  «       |j                  «       rJ ‚| j
                  j                   rJ ‚| j#                  «        y)rG   r;   c                  ó   — t         ‚rU   )ÚKeyboardInterrupt)ÚargsÚkwargss     r'   Úraise_keyboard_interruptzTtest_serving_is_false_and_stop_returns_after_ctrlc.<locals>.raise_keyboard_interrupt¹   s   € ÜÐr)   rH   é   r   N)r   r   r   r   rA   Ú_connectionsÚ	_selectorÚselectrK   rL   rM   rN   r+   Úexpiration_intervalÚIS_SLOW_ENVrO   Ú_servingrB   )rC   rf   rP   s      r'   Ú2test_serving_is_false_and_stop_returns_after_ctrlcrn   ¯   s¸   € äÜ%¤~Ð6Üô€Jð
 ×ÑÔò ð 0H€J×Ñ×%Ñ%Ô,ä×#Ñ#¨:×+;Ñ+;Ô<€LØ×ÑÔð ×ÑØ×&Ñ&­{©!ÀÑBôð ×$Ñ$Ô&Ð&Ð&à×&Ñ&×/Ò/Ð/Ð/Ø‡O�OÕr)   Úip_addrc                 óŠ   — | j                  |t        f«      }|j                  d   |k(  sJ ‚|j                  d   t        k7  sJ ‚y)z0Check that bound IP address is stored in server.r   é   N)Úsendr   r<   )Úhttp_serverro   rC   s      r'   Útest_bind_addr_inetrt   Ë   sK   € ð ×!Ñ! 7¬NÐ";Ó<€Jà×Ñ Ñ" gÒ-Ð-Ð-Ø×Ñ Ñ"¤nÒ4Ð4Ñ4r)   c                 óH   — | j                  |«      }|j                  |k(  sJ ‚y)r   N©rr   r<   ©rs   r(   rC   s      r'   Útest_bind_addr_unixrx   Ú   s(   € ð ×!Ñ! .Ó1€Jà×Ñ >Ò1Ð1Ñ1r)   c                 óH   — | j                  |«      }|j                  |k(  sJ ‚y)zBCheck that bound UNIX abstract socket address is stored in server.Nrv   )rs   r0   rC   s      r'   Útest_bind_addr_unix_abstractrz   â   s*   € ð ×!Ñ!Ð"4Ó5€Jà×ÑÐ#5Ò5Ð5Ñ5r)   z/peer_creds/idsz/peer_creds/textsc                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )Ú_TestGatewayc                 ó¸  •— | j                   }|j                  }t        |j                  «      }|t        k(  rR|j
                  |j                  |j                  f}| j                  dj                  t        t        |«      «      «       y |t        k(  r7| j                  dj                  |j                  |j                  f«      «       y t        t         | �G  «       S )Nú|ú!)ÚreqÚconnr
   ÚuriÚPEERCRED_IDS_URIÚpeer_pidÚpeer_uidÚpeer_gidÚsend_payloadr+   Úmapr,   ÚPEERCRED_TEXTS_URIÚ	peer_userÚ
peer_groupÚsuperr|   Úrespond)Úselfr€   r�   Úreq_uriÚ
peer_credsÚ	__class__s        €r'   r�   z_TestGateway.respondï   s¤   ø€ Ø�h‰hˆØ�x‰xˆÜ�s—w‘w“-ˆØÔ&Ò&ØŸ™¨¯©°t·}±}ÐDˆJØ×Ñ˜cŸh™h¤s¬3°
Ó';Ó<Ô=ØØÔ(Ò(Ø×Ñ˜cŸh™h¨¯©¸¿¹Ð'HÓIÔJØÜ”\ 4Ñ0Ó2Ð2r)   c                 ó~   — | j                   }d|_        |j                  «        |j                  t	        |«      «       y )Ns   200 OK)r€   ÚstatusÚensure_headers_sentÚwriter   )rŽ   Úpayloadr€   s      r'   r‡   z_TestGateway.send_payloadü   s.   € Ø�h‰hˆØˆŒ
Ø×ÑÔ!Ø�	‰	”$�w“-Õ r)   )Ú__name__Ú
__module__Ú__qualname__r�   r‡   Ú__classcell__)r‘   s   @r'   r|   r|   î   s   ø„ ô3ö!r)   r|   c                 óL   — | j                  |«      }t        |_        d|_        |S )z3Construct a test server with ``peercreds_enabled``.T)rr   r|   r=   Úpeercreds_enabledrw   s      r'   Úpeercreds_enabled_serverr�     s*   € ð ×!Ñ! .Ó1€JÜ%€JÔØ#'€JÔ ØÐr)   r   )ÚrerunsÚreruns_delayc                 óº  — |}|j                   }t        |t        «      r|j                  «       }t        j
                  j                  |d¬«      } dj                  di t        «       ¤Ž}t        j                  «       t        j                  «       t        j                  «       f}dj                  t        t        |«      «      }t!        j"                  «       5  t%        j&                  |t(        z   | ¬«      }|j+                  «        |j,                  |k(  sJ ‚t%        j&                  |t.        z   | ¬«      }|j0                  dk(  sJ ‚	 ddd«       y# 1 sw Y   yxY w)	z2Check that ``PEERCRED`` lookup works when enabled.Ú ©Úsafeúhttp+unix://{quoted}r~   ©Útimeoutiô  Nr   )r<   Ú
isinstanceÚbytesr/   ÚurllibÚparseÚquoter"   r#   r4   ÚgetpidÚgetuidÚgetgidr+   rˆ   r,   Úrequests_unixsocketÚmonkeypatchr?   Úgetrƒ   Úraise_for_statusÚtextr‰   Ústatus_code)	Úhttp_request_timeoutr�   rC   r<   ÚquotedÚunix_base_uriÚexpected_peercredsÚpeercreds_respÚpeercreds_text_resps	            r'   Útest_peercreds_unix_sockr»     s$  € ð
 *€JØ×$Ñ$€Iä�)œUÔ#Ø×$Ñ$Ó&ˆ	ô �\‰\×Ñ 	°ÐÓ3€FØ1Ð*×1Ñ1Ñ=´F³HÑ=€MäŸ™›¤b§i¡i£k´2·9±9³;Ð>ÐØŸ™¤#¤cÐ+=Ó">Ó?Ðä	×	(Ñ	(Ó	*ñ 6Ü!Ÿ™ØÔ,Ñ,Ø(ô
ˆð 	×'Ñ'Ô)Ø×"Ñ"Ð&8Ò8Ð8Ð8ä&Ÿl™lØÔ.Ñ.Ø(ô
Ðð #×.Ñ.°#Ò5Ð5Ñ5÷6÷ 6ñ 6ús   ÃA/EÅEzDModules `grp` and `pwd` are not available under the current platformc                 ó¸  — |}d|_         |j                  }t        |t        «      r|j	                  «       }t
        j                  j                  |d¬«      } dj                  d	i t        «       ¤Ž}ddl
}ddl}|j                  t        j                  «       «      j                  |j!                  t        j"                  «       «      j$                  f}dj'                  t)        t*        |«      «      }t-        j.                  «       5  t1        j2                  |t4        z   | ¬«      }	|	j7                  «        |	j8                  |k(  sJ ‚	 ddd«       y# 1 sw Y   yxY w)
z6Check that ``PEERCRED`` resolution works when enabled.Tr¡   r¢   r¤   r   Nr   r¥   r   )Úpeercreds_resolve_enabledr<   r§   r¨   r/   r©   rª   r«   r"   r#   ÚgrpÚpwdÚgetpwuidr4   r­   Úpw_nameÚgetgrgidr®   Úgr_namer+   rˆ   r,   r¯   r°   r?   r±   r‰   r²   r³   )
rµ   r�   rC   r<   r¶   r·   r¾   r¿   Úexpected_textcredsrº   s
             r'   Ú$test_peercreds_unix_sock_with_lookuprÅ   -  s  € ð *€JØ+/€JÔ(à×$Ñ$€Iä�)œUÔ#Ø×$Ñ$Ó&ˆ	ô �\‰\×Ñ 	°ÐÓ3€FØ1Ð*×1Ñ1Ñ=´F³HÑ=€MãÛð 	�‰”R—Y‘Y“[Ó!×)Ñ)Ø�‰”R—Y‘Y“[Ó!×)Ñ)ðÐð Ÿ™¤#¤cÐ+=Ó">Ó?ÐÜ	×	(Ñ	(Ó	*ñ >Ü&Ÿl™lØÔ.Ñ.Ø(ô
Ðð 	×,Ñ,Ô.Ø"×'Ñ'Ð+=Ò=Ð=Ñ=÷>÷ >ñ >ús   ÄA EÅEz\This regression test is for a Linux bug, and the resource module is not available on WindowsÚresource_limit)i   i   )rÆ   )ÚindirectÚmany_open_socketsc                 ó  ‡‡‡— | j                   j                  Šˆˆfd„Št        «       ‰_        ‰| j                   _        | j	                  d«       t        ‰j                  «      dkD  sJ ‚t        ˆfd„‰j                  D «       «      sJ ‚y)a>  Test the server does not crash with a high file-descriptor value.

    This test shouldn't cause a server crash when trying to access
    file-descriptor higher than 1024.

    The earlier implementation used to rely on ``select()`` syscall that
    doesn't support file descriptors with numbers higher than 1024.
    c                 óz   •— ‰j                   j                  | j                  j                  «       «        ‰| «      S rU   )ÚfilenosÚaddÚsocketÚfileno)r�   Ú_old_process_connÚnative_process_conns    €€r'   rÐ   zAtest_high_number_of_file_descriptors.<locals>.native_process_conns  s/   ø€ Ø×#Ñ#×'Ñ'¨¯©×(:Ñ(:Ó(<Ô=Ù  Ó&Ð&r)   ú/r   c              3   ó(   •K  — | ]	  }|‰k\  –— Œ y ­wrU   r   )Ú.0ÚfnrÆ   s     €r'   ú	<genexpr>z7test_high_number_of_file_descriptors.<locals>.<genexpr>‚  s   øè ø€ ÒJ¨ˆr�^Õ#ÑJùs   ƒN)Úserver_instanceÚprocess_connÚsetrË   ÚconnectÚlenÚany)Únative_server_clientrÆ   rÏ   rÐ   s    `@@r'   Ú$test_high_number_of_file_descriptorsrÝ   V  s�   ú€ ð6 -×<Ñ<×IÑIÐõ'ô #&£%ÐÔØ8KÐ×(Ñ(Ô5ð × Ñ  Ô%ô Ð"×*Ñ*Ó+¨aÒ/Ð/Ð/ô ÓJÐ.A×.IÑ.IÔJÔJÐJÑJr)   ÚSO_REUSEPORTz5socket.SO_REUSEPORT is not supported on this platformc                 óà  — t        j                  |t        «      d   d   }t        j                   |«      }|j                  t         j                  t         j
                  d«       |j                  |t        f«       t        |j                  «       dd t        d¬«      }|j                  |d«      }|j                  «        |j                  «        |j                  «        |j                  �J ‚y)z5Check that port initialized externally can be reused.r   rq   Nr   T)r<   r=   Ú
reuse_portrA   )rÍ   Úgetaddrinfor   Ú
setsockoptÚ
SOL_SOCKETrÞ   Úbindr   Úgetsocknamer   ÚspyrA   rB   r5   Úspy_exception)rs   ro   ÚmockerÚfamilyÚsÚserverræ   s          r'   Útest_reuse_portrì   …  s»   € ô ×Ñ ¬Ó8¸Ñ;¸AÑ>€FÜ�‰�fÓ€AØ‡L�L”×"Ñ"¤F×$7Ñ$7¸Ô;Ø‡F�FˆG”^Ð$Ô%ÜØ—-‘-“/ " 1Ð%ÜØô€Fð
 �*‰*�V˜YÓ
'€CØ
‡N�NÔØ
‡K�K„MØ‡G�G„IØ×ÑÐ$Ð$Ñ$r)   c               #   ón   K  — t        «       j                  «       5  d–— ddd«       y# 1 sw Y   yxY w­w)z7Disable garbage collection when this fixture is in use.N)r   Únogcr   r)   r'   Ú_garbage_binrï   ¢  s-   è ø€ ô 
‹×	Ñ	Ó	ñ Û÷÷ ñ üs   ‚5›) 	5©2®5c              #   ól  K  — t        j                  dd¬«      }|j                  |j                  «      \  }}|j	                  |j                  | j
                  dz  |f«       	 | j
                  –— |j	                  |j                  ||f«       y# |j	                  |j                  ||f«       w xY w­w)z7Set the resource limit two times bigger then requested.Úresourcez&The "resource" module is Unix-specificr   r   N)r    ÚimportorskipÚ	getrlimitÚRLIMIT_NOFILEÚ	setrlimitÚparam)r%   rñ   Ú
soft_limitÚ
hard_limits       r'   rÆ   rÆ   ©  s­   è ø€ ô ×"Ñ"ØØ7ô€Hð &×/Ñ/°×0FÑ0FÓGÑ€J�
ð
 ×ÑØ×ÑØ	�‰˜Ñ	˜JÐ'ôð
MØ�m‰mÒð 	×Ñ˜8×1Ñ1°JÀ
Ð3KÕLøˆ×Ñ˜8×1Ñ1°JÀ
Ð3KÕLüs   ‚A!B4Á$B Á2B4Â B1Â1B4c              #   ój  K  — | j                  d«       g }	 t        |«      D ]<  }t        j                  «       }|j                  |«       |j	                  «       |k\  sŒ< n |d   j	                  «       }||k\  sJ ‚|–— |D ]  }|j                  «        Œ y# |D ]  }|j                  «        Œ w xY w­w)z<Allocate a lot of file descriptors by opening dummy sockets.rï   éÿÿÿÿN)r$   ÚrangerÍ   ÚappendrÎ   r5   )r%   rÆ   Útest_socketsÚ_ÚsockÚthe_highest_filenoÚtest_sockets          r'   rÈ   rÈ   Ã  sÂ   è ø€ ð ×Ñ˜NÔ+ð €Lð Ü�~Ó&ò 	ˆAÜ—=‘=“?ˆDØ×Ñ Ô%à�{‰{‹} Ó.Ùð	ð *¨"Ñ-×4Ñ4Ó6ÐØ! ^Ò3Ð3Ð3Ø Ò ð (ò 	 ˆKØ×ÑÕñ	 ø˜<ò 	 ˆKØ×ÑÕñ	 üs#   ‚B3—AB Á!B Á?B3ÂB0Â0B3)Ú
minthreadsÚ
maxthreadsÚinited_maxthreadsrq   éþÿÿÿÚinfrú   )rq   rq   rq   )rq   r   r   )r   r   r   c                 ód   — t        d| |¬«      }|j                  | k(  sJ ‚|j                  |k(  sJ ‚y)z´Test setting the number of threads in a ThreadPool.

    The ThreadPool should properly set the min+max number of the threads to use
    in the pool if those limits are valid.
    N©rë   ÚminÚmax)r   r	  r
  )r  r  r  Útps       r'   Útest_threadpool_threadrange_setr  à  s>   € ô4 
ØØØô
€Bð
 �6‰6�ZÒÐÐØ�6‰6Ð&Ò&Ð&Ñ&r)   ©r  r  Úerror))rú   rú   úmin=-1 must be > 0)rú   r   r  )rú   rq   r  )rú   r   r  )r   rú   úmin=0 must be > 0)r   r   r  )r   rq   r  )r   r   r  )rq   r   úKExpected an integer or the infinity value for the `max` argument but got 0.)rq   rJ   zMExpected an integer or the infinity value for the `max` argument but got 0.5.)r   r   r  )r   Ú1zMExpected an integer or the infinity value for the `max` argument but got '1'.)r   rq   zmax=1 must be > min=2c                 óŒ   — t        j                  t        t        f|¬«      5  t	        d| |¬«       ddd«       y# 1 sw Y   yxY w)z½Test that a ThreadPool rejects invalid min/max values.

    The ThreadPool should raise an error with the proper message when
    initialized with an invalid min+max number of threads.
    ©ÚmatchNr  )r    ÚraisesÚ
ValueErrorÚ	TypeErrorr   r  s      r'   Ú#test_threadpool_invalid_threadranger    s>   € ôP 
�‰œ
¤IÐ.°eÔ	<ñ 
ÜØØØõ	
÷
÷ 
ñ 
ús	   ¢:ºAc                 óì   — | j                  t        dd„ «       t        d¬«      }|j                  «        t        j                  t
        d¬«      5  |j                  «        ddd«       y# 1 sw Y   yxY w)z“Test for ThreadPool multi-start behavior.

    Tests that when calling start() on a ThreadPool multiple times raises a
    :exc:`RuntimeError`
    Ú_spawn_workerc                 ó.   — t        j                  d¬«      S )NT)r>   )ÚtypesÚSimpleNamespace)rþ   s    r'   ú<lambda>z7test_threadpool_multistart_validation.<locals>.<lambda>>  s   € ”%×'Ñ'¨dÔ3€ r)   N)rë   z%Threadpools can only be started once.r  )Úsetattrr   rN   r    r  ÚRuntimeError)r°   r  s     r'   Ú%test_threadpool_multistart_validationr"  3  sb   € ð ×ÑÜØÙ3ôô 
˜4Ô	 €BØ‡H�H„JÜ	�‰ÜØ5ô
ñ ð 	�‰Œ
÷	÷ ñ ús   ÁA*Á*A3c                 ó*  — d}t        |t        ft        ¬«      }t        dddd|¬«      |_        |j                  «        t        j                  |j                  ¬«      }|j                  «        | j                  |j                  «       |j                  j                  «        |j                  \  }}|j                  j                  j                  d«       t	        j                  d|› d	|› �d
¬«      }|j                   t"        j$                  k(  sJ ‚y)zCA server that can't keep up with requests returns a 503 HTTP error.z	127.0.0.1r;   rq   r   )r	  r
  Úaccepted_queue_sizeÚaccepted_queue_timeoutrë   rH   Nzhttp://ú:é   r¥   )r   r   r   r   r?   rA   rK   rL   rM   rN   ÚaddfinalizerrB   r<   Ú_queuerV   r±   r´   r   ÚSERVICE_UNAVAILABLE)r%   Ú	localhostrC   rP   Ú_hostÚportÚresponses          r'   Ú,test_overload_results_in_suitable_http_errorr/  J  sð   € à€IÜØœnÐ-Üô€Jô
 %ØØØØ Øô€JÔð ×ÑÔÜ×#Ñ#¨:×+;Ñ+;Ô<€LØ×ÑÔØ×Ñ˜Ÿ™Ô)à×Ñ×ÑÔà×&Ñ&�K€Eˆ4ð ×Ñ×Ñ×"Ñ" 4Ô(ä�|‰|˜g i [°°$°Ð8À"ÔE€HØ×Ñ¤:×#AÑ#AÒAÐAÑAr)   c                  óÈ   — t        j                  t        «      j                  dz  } t	        j
                  t        j                  | gd¬«      }|j                  t        k(  sJ ‚y)zOOn shutdown the overload thread exits.

    This is a test for issue #769.
    zthreadleakcheck.pyF)ÚcheckN)
ÚpathlibÚPathÚ__file__ÚparentÚ
subprocessÚrunÚsysÚ
executableÚ
returncoder   )ÚpathÚprocesss     r'   Ú"test_overload_thread_does_not_leakr=  k  sN   € ô
 �<‰<œÓ!×(Ñ(Ð+?Ñ?€DÜ�n‰nœcŸn™n¨dÐ3¸5ÔA€Gð ×ÑÔ!;Ò;Ð;Ñ;r)   )QÚ__doc__r4   r2  r\   rÍ   r6  r8  r2   rK   r  Úurllib.parser©   r-   Úhttpr   r    r?   r¯   Úpypytools.gc.customr   Ú_compatr   r   r   r	   r
   r   rë   r   r   r   Útestingr   r   r   r   Úworkers.threadpoolr   rl   Úversion_infor   ÚmarkÚskipifÚhasattrÚunix_only_sock_testÚnon_macos_sock_testÚfixturer(   r0   r9   rE   rQ   ÚparametrizeÚIOErrorrc   ÚOSErrorr!  r`   rn   rt   rx   rz   rƒ   r‰   r|   r�   Úflakyr»   rÅ   ÚusefixturesrÝ   rì   rï   rÆ   rÈ   Úfloatr  r  r"  r/  r=  r   r)   r'   ú<module>rR     s\  ðÙ  ã 	Û Û Û Û Û 
Û Û Û Û Û Ý ã ã Û Ý )ç N× Nß ?Ñ ?÷ó õ ,ð Ò$˜*€Ø× Ñ   !Ð$¨Ñ.€ð —k‘k×(Ñ(Ù�˜	Ó"Ð"ØGð )ó Ð ð —k‘k×(Ñ(ØØFð )ó Ð ð €‡�Ð+Ô,ñ)ó -ð)ð ‡�ñó ðð ‡�ñó ðò ò.'ð( ‡�×ÑØàØØØð	óñ!:óð!:òHð8 ‡�×ÑØàØðóñ5óð5ð ñ2ó ð2ð ñ6ó ð6ð %Ð Ø(Ð ô!�7ô !ð* ‡�ñó ðð ØØ‡�×Ñ˜!¨!ÐÓ,ñ6ó -ó ó ð6ð< ‡�×ÑØÐð!ð ó ð
 Øñ>ó ó óð>ðD ‡�×ÑØð:ð ó ð
 ‡�×ÑØðð !ð ó ð ‡�×ÑÐ,Ó-ñKó .óóðKðB ‡�×ÑÙ�˜Ó'Ð'ØBð ó ð ‡�×ÑØàØðóñ%óó	ð%ð$ ‡�ñó ðð ‡�ñMó ðMð2 ‡�ñ ó ð ð8 ‡�×ÑØ5ð
 ØÙ�%‹Lð	
ð 
ˆB‘�e“ÐØØØ	
‰E�%‹L™% ›,Ð'Ø	
ˆB‘�e“ÐØ	
ˆB‘�e“ÐØØ	
‰E�%‹L™% ›,Ð'ðóñ('ó)ð('ð ‡�×ÑØ)ðó!ñD
óE!ðD
òò.BóB	<r)   