Ė
    #ļąjVŅ  ć                   ó   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mZ ddlmZ ddlmZ ddlZddlmZmZ ddlZddlmZmZmZmZ ddlmZm Z  exs eZ!d	Z"d
Z# G d d«      Z$ G d dejJ                  «      Z% G d d«      Z&ejN                  d «       Z(ejN                  d «       Z)ejN                  d «       Z*d Z+d Z,d Z-ej\                  j_                  dd«      d «       Z0ej\                  j_                  dd«      d «       Z1ej\                  j_                  dd ejd                  dej\                  jg                  exr edd¬ «      ¬!«      f«      d" «       Z4d# Z5ej\                  j_                  d$ ejd                  ejl                  ejn                  dd%¬&«       ejd                  ejl                  ejp                  dd'¬&«       ejd                  ejl                  ejr                  dd(¬&«       ejd                  dejr                  dd)ej\                  jg                  ed*¬+«      ¬,«       ejd                  ejl                  ejt                  dd-¬&«       ejd                  e;d.d/d0¬&«       ejd                  ejl                  d1d/d2¬&«      f ejd                  e<ejn                  dd3¬&«       ejd                  e=ejp                  dd4¬&«       ejd                  e=ejt                  dd5¬&«      fz   «      d6 «       Z>d7 Z?d8 Z@d9 ZAd: ZBej\                  j_                  d;d<«      d= «       ZCd> ZDd? ZEd@ ZFej\                  j_                  dAdB«      dC «       ZGdD ZHej\                  jg                   e edE«      «      ¬+«      dF «       ZIdG ZJdH ZKej\                  j_                  dIdJ«      dK «       ZLej\                  jg                  dL¬+«      dM «       ZMej\                  j_                  dNdO«      dP «       ZN G dQ dR«      ZO G dS dT«      ZPdU ZQy)VzETests for TCP connection handling, including proper and timely close.é    N)Ś
namedtuple)Śsuppress)Śmatch)ŚtrimŚunwrap)ŚIS_CIŚIS_MACOSŚIS_PYPYŚ
IS_WINDOWS)ŚhelperŚwebtesté   z(pPeErRsSiIsStTeEnNcCeE oOfF vViIsSiIoOnNc                   óĄ    e Zd ZdZed «       Zed «       Zed «       Zed «       Zed «       Z	ed «       Z
ed «       Zed	 «       Zed
 «       Zed «       Zed «       Zy)ŚWSGICallableszStandalone WSGI apps.c                  ó    y)zRender Hello world.zHello, world!© ©ŚreqŚresps     śE/srv/dav/.venv/lib/python3.12/site-packages/cheroot/test/test_conn.pyŚhellozWSGICallables.hello!   s    š ó    c                 ó    t         S )zRender ``pov`` value.)Śpovr   s     r   r   zWSGICallables.pov&   s	    ō 
r   c                 óh    d| j                   d   v rt        d«      |j                  d<   d } |«       S )zRender streaming response.Śset_clŚQUERY_STRINGé
   śContent-Lengthc               3   óF   K   t        d«      D ]  } t        | «        y ­w)Nr   )ŚrangeŚstr)Śxs    r   Ścontentz%WSGICallables.stream.<locals>.content1   s"   č ų Ü2Yņ Ü!fńłs   !)Śenvironr"   Śheaders)r   r   r$   s      r   ŚstreamzWSGICallables.stream+   s7    š s{{ >Ń2Ń2Ü-0°«WDLLŠ)Ń*ņ	ń yŠr   c                 óĄ    | j                   d   dk(  st        d| j                   d   z  «      | j                   d   j                  «       j                  d«      }d|dS )z%Process file upload and render thank.ŚREQUEST_METHODŚPOSTz'POST' != request.method %rz
wsgi.inputśutf-8śthanks for 'ś')r%   ŚAssertionErrorŚreadŚdecode)r   r   Śinput_contentss      r   ŚuploadzWSGICallables.upload7   si    š {{Š+Ń,°Ņ6Ü Ų-°·±Š<LŃ0MŃMóš š  \Ń2×7Ń7Ó9×@Ń@ĄÓIŲnŠ/ØqŠ1Š1r   c                 ó    d|_         y)z Render response with status 204.Ś204z
Code = 204©Śstatusr   s     r   Ś
custom_204zWSGICallables.custom_204A   ó    š Ųr   c                 ó    d|_         y)z Render response with status 304.Ś304z
Code = 304r5   r   s     r   Ś
custom_304zWSGICallables.custom_304G   r8   r   c                 ó    d|_         y)z Render response with status 500.z500 Internal Server ErrorŚokr5   r   s     r   Śerr_before_readzWSGICallables.err_before_readM   s    š 2Ųr   c                 ó    dgdz  S )zRender 1MB response.Į   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaé   r   r   s     r   Śone_megabyte_of_azWSGICallables.one_megabyte_of_aS   s    š |dŃ"Š"r   c                 ó"    d|j                   d<   y)z3Render buffered response with invalid length value.Ś5r   zI have too many bytes©r&   r   s     r   Śwrong_cl_bufferedzWSGICallables.wrong_cl_bufferedX   s    š *-Š%Ń&Ų&r   c                 ó(    d|j                   d<   ddgS )z5Render unbuffered response with invalid length value.rD   r   zI tooz have too many bytesrE   r   s     r   Śwrong_cl_unbufferedz!WSGICallables.wrong_cl_unbuffered^   s    š *-Š%Ń&ŲŠ/Š0Š0r   c                 óB    | j                  d«      j                  d«      S )z°Encode PATH_INFO correctly depending on Python version.

        WSGI 1.0 is a mess around Unicode. Create endpoints
        that match the PATH_INFO that it produces.
        r+   zlatin-1)Śencoder0   )Śstrings    r   Ś_mungezWSGICallables._munged   s    š }}WÓ%×,Ń,ØYÓ7Š7r   N)Ś__name__Ś
__module__Ś__qualname__Ś__doc__Śstaticmethodr   r   r'   r2   r7   r;   r>   rB   rF   rH   rL   r   r   r   r   r      sß    Łąńó šš ńó šš ń	ó š	š ń2ó š2š ńó šš
 ńó šš
 ńó šš
 ń#ó š#š ń'ó š'š
 ń1ó š1š
 ń8ó ń8r   r   c                   ó4   e Zd ZdZej
                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  dZy)Ś
Controllerz!Controller for serving WSGI apps.)ś/helloś/povś/page1ś/page2ś/page3ś/streamś/uploadś/custom/204ś/custom/304ś/err_before_readś/one_megabyte_of_aś/wrong_cl_bufferedś/wrong_cl_unbufferedN)rM   rN   rO   rP   r   r   r   r'   r2   r7   r;   r>   rB   rF   rH   Śhandlersr   r   r   rS   rS   n   s    Ł+š  ×%Ń%Ų×!Ń!Ų×#Ń#Ų×#Ń#Ų×#Ń#Ų ×'Ń'Ų ×'Ń'Ų$×/Ń/Ų$×/Ń/Ų)×9Ń9Ų+×=Ń=Ų+×=Ń=Ų -× AŃ AńHr   rS   c                   óN    e Zd ZdZ edg d¢«      Zd Zdej                  dfdZ	y)	ŚErrorLogMonitorzCMock class to access the server error_log calls made by the server.ŚErrorLogCall)ŚmsgŚlevelŚ	tracebackc                 ó     g | _         g | _        y)z×Initialize the server error log monitor/interceptor.

        If you need to ignore a particular error message use the property
        ``ignored_msgs`` by appending to the list the expected error messages.
        N)ŚcallsŚignored_msgs)Śselfs    r   Ś__init__zErrorLogMonitor.__init__   s    š 
ąÕr   Ś Fc                 ó    |rt        j                  «       }nd}| j                  j                  t        j                  |||«      «       y)z2Intercept the call to the server error_log method.rm   N)Ś
traceback_Ś
format_excri   Śappendrc   rd   )rk   re   rf   rg   Śtbliness        r   Ś__call__zErrorLogMonitor.__call__   s9    įÜ ×+Ń+Ó-GąGŲ

×Ń/×6Ń6°søEĄ7ÓKÕLr   N)
rM   rN   rO   rP   r   rd   rl   ŚloggingŚINFOrs   r   r   r   rc   rc      s*    ŁMįnŅ.KÓLLņš  W§\”\øUō Mr   rc   c                 óŖ    t        «       }fd}||j                  d<   | j                  |_        d_        t
        _        | _        d_        S )z:Attach a WSGI app to the given server and preconfigure it.c                 ó.    t        j                  «      S ©N)r"   Śtimeout)r   r   Śwsgi_servers     r   Ś_timeoutz$raw_testing_server.<locals>._timeout   s   ų Ü;×&Ń&Ó'Š'r   z/timeoutéé  é   )rS   ra   Śserver_instanceŚwsgi_appŚmax_request_body_sizery   Śserver_clientŚkeep_alive_conn_limit)Śwsgi_server_clientŚappr{   rz   s      @r   Śraw_testing_serverr      sZ   ų ō ,Cō(š  (CLLŃŲ$×4Ń4KŲKŌŲ(,KŌ%Ü!KŌŲ 2KŌŲ()KŌ%ąŠr   c              #   ó  K   |j                  | dt        «       «       |  | j                  j                  D ]C  \  }}}|t        j
                  k  r|| j                  j                  v r4J d| d| d| f«        y­w)zóModify the "raw" base server to monitor the error_log messages.

    If you need to ignore a particular error message use the property
    ``testing_server.error_log.ignored_msgs`` by appending to the list
    the expected error messages.
    Ś	error_logz)Found error in the error log: message = 'z', level = 'z'
N)Śsetattrrc   r   ri   rt   ŚWARNINGrj   )r   ŚmonkeypatchŚc_msgŚc_levelŚc_tracebacks        r   Śtesting_serverr   ­   s   č ų š ×ŃŠ*ØK¼Ó9JŌKą
Ņš
 (:×'CŃ'C×'IŃ'Iņ 
Ń#wŲgooŅ%ŲąŠ*×4Ń4×AŃAŅAš 	
šŲ ØWØI°SŲmššD
ó 	
ŠAń	
łs   A)A?Į,A?c                 ó    | j                   S )z5Get and return a test client out of the given server.)r   )r   s    r   Śtest_clientr   Č   s    š ×'Ń'Š'r   c                 ó4    | j                  «       d |D «       v S )zCheck that a header is present.c              3   óB   K   | ]  \  }}|j                  «         y ­wrx   ©Ślower)Ś.0ŚkŚ_s      r   ś	<genexpr>z header_exists.<locals>.<genexpr>Š   s   č ų Ņ"C±°!°Q 1§7”7§9Ń"Cłs   r   )Śheader_namer&   s     r   Śheader_existsr   Ī   s    ą×ŃÓŃ"Cø7Ō"CŠCŠCr   c                 ó:    | j                  «       fd|D «       v S )z2Check that a header with a given value is present.c              3   óP   K   | ]  \  }}|k(  s|j                  «         y ­wrx   r   )r   r   ŚvŚheader_values      r   r   z#header_has_value.<locals>.<genexpr>Õ   s'   ųč ų ņ #Łq!Ø1°Ó+<	ń#łs   &&r   )r   r   r&   s    ` r   Śheader_has_valuer   Ó   s&   ų ą×ŃÓó #Ų 'ō#š š r   c                 ó0   | j                  «       }d|_        |j                  «        | j                  d|¬«      \  }}}t	        |dd «      }|dk(  sJ |dd dk(  sJ |t
        j                  «       k(  sJ t        d	|«      rJ | j                  d
|¬«      \  }}}t	        |dd «      }|dk(  sJ |dd dk(  sJ |t
        j                  «       k(  sJ t        d	|«      rJ | j                  d|dg¬«      \  }}}t	        |dd «      }|dk(  sJ |dd dk(  sJ |t
        j                  «       k(  sJ t        d	d|«      sJ t        j                  t        j                  j                  «      5  | j                  d|¬«       ddd«       y# 1 sw Y   yxY w)z%Test persistent HTTP/1.1 connections.FrU   ©Ś	http_connNé   éČ   é   ŚOKŚ
ConnectionrV   rW   )r§   Śclose)r¢   r&   rØ   )Śget_connectionŚ	auto_openŚconnectŚgetŚintr   rJ   r   r   ŚpytestŚraisesŚhttpŚclientŚNotConnected©r   Śhttp_connectionŚstatus_lineŚactual_headersŚactual_resp_bodyŚactual_statuss         r   Ś"test_HTTP11_persistent_connectionsr¹   Ś   sā   š "×0Ń0Ó2OŲ %OŌŲ×ŃŌš 5@·O±OŲŲ!š 5Dó 5Ń1KŠ!1ō  B QÓ(MŲCŅŠŠŲqr?dŅ"Š"Š"Ųszz|Ņ+Š+Š+Ü\Ø>Ō:Š:Š:š 5@·O±OŲŲ!š 5Dó 5Ń1KŠ!1ō  B QÓ(MŲCŅŠŠŲqr?dŅ"Š"Š"Ųszz|Ņ+Š+Š+Ü\Ø>Ō:Š:Š:š 5@·O±OŲŲ!Ų(Š)š 5Dó 5Ń1KŠ!1ō
  B QÓ(MŲCŅŠŠŲqr?dŅ"Š"Š"Ųszz|Ņ+Š+Š+ÜLØ'°>ŌBŠBŠBō 
t{{×/Ń/Ó	0ń ;ŲØ/Ō:÷;÷ ;ń ;śs   Å/FĘFr   )FTc                 ó&   | j                  «       }d|_        |j                  «        | j                  d|¬«      \  }}}t	        |dd «      }|dk(  sJ |dd dk(  sJ |t
        j                  «       k(  sJ t        d	|«      rJ |r[| j                  d
|¬«      \  }}}t        d|«      sJ t        d	d|«      rJ t        d|«      rJ |dk(  sJ |dd dk(  sJ |dk(  sJ | j                  d|¬«      \  }}}t        d|«      rJ |dk(  sJ |dd dk(  sJ |dk(  sJ d}|D ]*  \  }}	|j                  «       dk(  st        |	«      dk(  s)d}, |rt        d	d|«      rZJ t        d	d|«      sJ t        j                  t        j                  j                  «      5  | j                  d|¬«       ddd«       | j!                  d|¬«      \  }}}|dk(  sJ |dd dk(  sJ |dk(  sJ t        d|«      rJ |j#                  «        y# 1 sw Y   WxY w)z;Test serving of streaming responses with HTTP/1.1 protocol.FrU   r”   Nr£   r¤   r„   r¦   r§   ś/stream?set_cl=Yesr   rØ   śTransfer-Encodingó
   0123456789rY   ztransfer-encodingŚchunkedTr   )r©   rŖ   r«   r¬   r­   r   rJ   r   r   r   r"   r®   rÆ   r°   r±   r²   ŚheadrØ   )
r   r   r“   rµ   r¶   r·   rø   Śchunked_responser   r   s
             r   Śtest_streaming_11rĮ     s·   š "×0Ń0Ó2OŲ %OŌŲ×ŃŌš 5@·O±OŲŲ!š 5Dó 5Ń1KŠ!1ō  B QÓ(MŲCŅŠŠŲqr?dŅ"Š"Š"Ųszz|Ņ+Š+Š+Ü\Ø>Ō:Š:Š:ń š 9Dæ¹Ų Ų%š 9Hó 9
Ń5^Š%5ō Š-Ø~Ō>Š>Š>Ü# L°'ø>ŌJŠJŠJÜ Š!4°nŌEŠEŠEą Ņ#Š#Š#Ų12 $Ņ&Š&Š&Ų =Ó0Š0Š0š
 9Dæ¹ŲŲ%š 9Hó 9
Ń5^Š%5ō !Š!1°>ŌBŠBŠBŲ Ņ#Š#Š#Ų12 $Ņ&Š&Š&Ų =Ņ0Š0Š0ą ŠŲ"ņ 	,DAqŲwwyŠ/Ó/Üq6YÓ&Ų'+Ń$š	,ń
 Ü'Ø°gø~ŌNŠNŠNä# L°'ø>ŌJŠJŠJō t{{×7Ń7Ó8ń CŲ °/ŌB÷Cš 9D×8HŃ8HŲŲ%š 9Ió 9
Ń5^Š%5š  Ņ#Š#Š#Ų12 $Ņ&Š&Š&Ų 3Ņ&Š&Š&Ü Š!4°nŌEŠEŠEš ×ŃÕ÷#Cš Cśs   ĘHČHc                 ó    | j                   j                  }d| j                   _        | j                  «       }d|_        |j	                  «        | j                  d|dgd¬«      \  }}}t        |dd «      }|dk(  sJ |d	d d
k(  sJ |t        j                  «       k(  sJ t        dd|«      sJ |rk| j                  d|dgd¬«      \  }}}t        |dd «      }|dk(  sJ |d	d d
k(  sJ |dk(  sJ t        d|«      sJ t        dd|«      sJ t        d|«      r·J | j                  d|dgd¬«      \  }}}t        |dd «      }|dk(  sJ |d	d d
k(  sJ |dk(  sJ t        d|«      rJ t        dd|«      rJ t        d|«      rJ t        j                  t        j                  j                  «      5  | j                  d|d¬«       ddd«       || j                   _        |j!                  «        y# 1 sw Y   +xY w)z;Test serving of streaming responses with HTTP/1.0 protocol.śHTTP/1.0FrU   ©r§   ś
Keep-Alive)r¢   r&   ŚprotocolNr£   r¤   r„   r¦   r§   rÅ   r»   r½   r   r¼   rY   ©r¢   rĘ   )r~   rĘ   r©   rŖ   r«   r¬   r­   r   rJ   r   r   r®   rÆ   r°   r±   r²   rØ   )r   r   Śoriginal_server_protocolr“   rµ   r¶   r·   rø   s           r   Śtest_streaming_10rÉ   ^  s   š  +×:Ń:×CŃCŠŲ+5K×ŃŌ(š "×0Ń0Ó2OŲ %OŌŲ×ŃŌš 5@·O±OŲŲ!Ų-Š.Ųš	 5Dó 5Ń1KŠ!1ō  B QÓ(MŲCŅŠŠŲqr?dŅ"Š"Š"Ųszz|Ņ+Š+Š+ÜLØ,øŌGŠGŠGń š 9Dæ¹Ų Ų%Ų1Š2Ųš	 9Hó 9
Ń5^Š%5ō KØØOÓ,Ų Ņ#Š#Š#Ų12 $Ņ&Š&Š&Ų =Ņ0Š0Š0äŠ-Ø~Ō>Š>Š>Ü ØløNŌKŠKŠKÜ Š!4°nŌEŠEŠEš 9Dæ¹ŲŲ%Ų1Š2Ųš	 9Hó 9
Ń5^Š%5ō KØØOÓ,Ų Ņ#Š#Š#Ų12 $Ņ&Š&Š&Ų =Ņ0Š0Š0ä Š!1°>ŌBŠBŠBÜ# L°,ĄŌOŠOŠOÜ Š!4°nŌEŠEŠEō ]]4;;×3Ń3Ó4ń 	ŲOOŲŲ)Ų#š ō ÷	š ,DK×ŃŌ(š ×ŃÕ÷	š 	śs   Ę5G4Ē4G=Śhttp_server_protocolrĆ   zHTTP/1.1z)Fails under PyPy in CI for unknown reasonF)ŚreasonŚstrict)Śmarksc           	      ó   | j                   j                  }|| j                   _        d}| j                  «       }d|_        |j	                  «        | j                  d|¬«      \  }}}t        |dd «      }|dk(  sJ |dd d	k(  sJ |t        j                  «       k(  sJ t        d
|«      rJ | j                  ddg||¬«      \  }}}t        |dd «      }|dk(  sJ |dd d	k(  sJ |t        j                  «       k(  sJ t        d
d|«      sJ t        d dj                  di t        «       ¤|«      sJ | j                  d||¬«      \  }}}t        |dd «      }|dk(  sJ |dd d	k(  sJ |t        j                  «       k(  sJ t        d
|«      rJ t        d|«      rJ || j                   _        |j                  «        y)z$Test Keep-Alive enabled connections.rĆ   FrW   )rĘ   Nr£   r¤   r„   r¦   r§   rX   rÄ   ©r&   r¢   rĘ   rÅ   ś-timeout={test_client.server_instance.timeout}rĒ   r   )r~   rĘ   r©   rŖ   r«   r¬   r­   r   rJ   r   r   ŚformatŚlocalsrØ   )	r   rŹ   rČ   Śhttp_client_protocolr“   rµ   r¶   r·   rø   s	            r   Śtest_keepaliverŌ   ®  s-   š   +×:Ń:×CŃCŠŲ+?K×ŃŌ(ą%Šš "×0Ń0Ó2OŲ %OŌŲ×ŃŌš 5@·O±OŲŲ%š 5Dó 5Ń1KŠ!1ō  B QÓ(MŲCŅŠŠŲqr?dŅ"Š"Š"Ųszz|Ņ+Š+Š+Ü\Ø>Ō:Š:Š:š 5@·O±OŲŲ-Š.Ų!Ų%š	 5Dó 5Ń1KŠ!1ō  B QÓ(MŲCŅŠŠŲqr?dŅ"Š"Š"Ųszz|Ņ+Š+Š+ÜLØ,øŌGŠGŠGÜŲŲ>Š7×>Ń>ŃJÄĆŃJŲōš š š 5@·O±OŲŲ!Ų%š 5Dó 5Ń1KŠ!1ō
  B QÓ(MŲCŅŠŠŲqr?dŅ"Š"Š"Ųszz|Ņ+Š+Š+Ü\Ø>Ō:Š:Š:Ü\Ø>Ō:Š:Š:ą+CK×ŃŌ(š ×ŃÕr   c                 óØ    d j                   _         fd}d fd	}d fd	}t        j                  j                  t        j                  j
                  t        j                  j                  f} |«       } ||«        |d«        |«       } ||«        |d«        ||«        |d«        |«       } ||d¬«        |d«       t        j                  |«      5   ||«       d	d	d	«        |d«       t        j                  d
«        ||«        |d«       t        j                  d
«        |d«       t        j                  |«      5   ||«       d	d	d	«        |d«        ||«        |d«       t         j                   _        |j                  «        |j                  «        |j                  «        y	# 1 sw Y   ×xY w# 1 sw Y   sxY w)z*Test management of Keep-Alive connections.r£   c                  óV    j                  «       } d| _        | j                  «        | S )NF)r©   rŖ   r«   )r“   r   s    r   Ś
connectionz2test_keepalive_conn_management.<locals>.connectionż  s+   ų ą%×4Ń4Ó6Ų$)Ō!Ų×ŃŌ!ŲŠr   c           	      óT   j                  ddg| d¬«      \  }}}t        |d d «      }|dk(  sJ |dd  dk(  sJ |t        j                  «       k(  sJ |r7t	        d	d
|«      sJ t	        d
 dj
                  di t        «       ¤|«      sJ y t        d	|«      rJ t        d
|«      rJ y )NrX   rÄ   rĆ   rĻ   r£   r¤   r„   r¦   r§   rÅ   rŠ   r   )r¬   r­   r   rJ   r   rŃ   rŅ   r   )ŚconnŚ	keepaliverµ   r¶   r·   rø   r   s         r   Śrequestz/test_keepalive_conn_management.<locals>.request  så   ų Ų8Cæ¹ŲŲ1Š2ŲŲš	 9Hó 9
Ń5^Š%5ō KØØOÓ,Ų Ņ#Š#Š#Ų12 $Ņ&Š&Š&Ų¤3§:”:£<Ņ/Š/Š/ŁÜ# L°,ĄŌOŠOŠOÜ#ŲŲFŠ?×FŃFń Ühńš ōš ń ō % \°>ŌBŠBŠBÜ$ \°>ŌBŠBŠBŠBr   c                 óš    t        j                   «       |z   }	 j                  j                  j                  }|| k(  ry t        j                   «       |k  s J  dj                  di t        «       ¤f«       ^)Nz1idle conn count mismatch, wanted {count}, got {n}r   )Śtimer~   Ś_connectionsŚ_num_connectionsrŃ   rŅ   )Ścountry   ŚdeadlineŚnr   s       r   Ścheck_server_idle_conn_countzDtest_keepalive_conn_management.<locals>.check_server_idle_conn_count  sw   ų Ü99; Ń(ŲŲ×+Ń+×8Ń8×IŃIAŲEzŲÜ99; (Ņ*š ŲJŠC×JŃJń Ühńš-ó Š*š	 r   r   r}   F)rŚ   Ng333333ó?)T)g      š?)r~   ry   r°   r±   ŚBadStatusLineŚCannotSendRequestr²   r®   rÆ   rŻ   ŚsleeprØ   )r   r×   rŪ   rć   Śdisconnect_errorsŚc1Śc2Śc3s   `       r   Śtest_keepalive_conn_managementrė   ł  s  ų ą*+K×ŃŌ'ōõCõ0
ō 	×!Ń!Ü×%Ń%Ü× Ń šŠń 
BŁBKŁ  Ō#ń 
BŁBKŁ  Ō#ń BKŁ  Ō#ń
 
BŁB%Õ Ł  Ō#ō 
Š(Ó	)ń Ł÷į  Ō#ō 	JJsOń BKŁ  Ō#ō 	JJsOŁ  Ō#ō 
Š(Ó	)ń Ł÷į  Ō#ń BKŁ  Ō#ō +2K×ŃŌ'š HHJŲHHJŲHHJ÷=š ś÷ š śs   Ć	F<Å	GĘ<GĒG)Śsimulated_exceptionŚerror_numberŚexception_leakszsocket.error(ECONNRESET))Śidzsocket.error(EPIPE)z simulated socket.error(ENOTCONN)zreal socket.error(ENOTCONN)z$Now reproducible this way on Windows)rĖ   )rļ   rĶ   zsocket.error(ESHUTDOWN)é  TzRuntimeError(666)é’’’’zsocket.error(-1)z ConnectionResetError(ECONNRESET)zBrokenPipeError(EPIPE)zBrokenPipeError(ESHUTDOWN)c                 ó4  	
 dn | d«      	|j                   j                  j                  
	
fdj                  |j                   j                  d«       |j	                  «       }d|_        |j                  «        |j                  d«       |j                  d|j                  z  j                  d«      «       |j                  «        t        d	t        rd
ndz  «      D ]%  }t        j                  d«       t        d«      s% n 	j                   j"                  	u sWJ t%        j                   j"                  t&        j(                  «      sJ j                   j"                  j*                  | k(  sJ j,                  |u sJ y)a  Test there's no traceback on broken connection during close.

    It artificially causes :py:data:`~errno.ECONNRESET` /
    :py:data:`~errno.EPIPE` / :py:data:`~errno.ESHUTDOWN` /
    :py:data:`~errno.ENOTCONN` as well as unrelated :py:exc:`RuntimeError`
    and :py:exc:`socket.error(-1) <socket.error>` on the server socket when
    :py:meth:`socket.shutdown() <socket.socket.shutdown>` is called. It's
    triggered by closing the client socket before the server had a chance
    to respond.

    The expectation is that only :py:exc:`RuntimeError` and a
    :py:exc:`socket.error` with an unusual error code would leak.

    With the :py:data:`None`-parameter, a real non-simulated
    :py:exc:`OSError(107, 'Transport endpoint is not connected')
    <OSError>` happens.
    NzSimulated socket errorc                 ól   j                  | dj                  j                  | j                  ¬«      «       7j                  | j                  dj                  j                  ¬«      «       j	                  | j                  d«      _        	  | «       d_        y # $ r
 d_        Y y w xY w)NŚsocket)ŚwrapsŚshutdown)Śside_effectFT)r   Śmock_moduleŚMockrō   ŚspyŚfin_spyŚexception_leaked)rk   Ś_close_kernel_socketŚexc_instanceŚmockerr   Śold_close_kernel_socketrģ   s    r   rż   zCtest_broken_connection_during_tcp_fin.<locals>._close_kernel_socketÅ  sµ   ų Ų×ŃŲŲŲ×Ń×#Ń#Ø$Æ+©+Š#Ó6ō	
š
 Š#Ų×ŃŲŲŲ×"Ń"×'Ń'°LŠ'ÓAōš
 (.§z”z°$·+±+øzÓ'JŠŌ$š	:Ł# DŌ)š 5:Š Õ1ųš #ņ 	9Ų48Š Ö1š	9śs   ĀB$ Ā$B3Ā2B3rż   Fó   GET /hello HTTP/1.1śHost: %sŚasciir   r}   r   g¹?rü   )r~   ŚConnectionClassrż   r   r©   rŖ   r«   ŚsendŚhostrJ   rØ   r!   ŚIS_SLOW_ENVrŻ   rę   Śhasattrrū   Śspy_exceptionŚ
isinstancerō   ŚerrorŚerrnorü   )rķ   rī   r’   r   rģ   r   rŁ   r   rż   rž   r   s     ```   @@@r   Ś%test_broken_connection_during_tcp_finr  e  s{  ż šr Š&ń 	į  Š/GÓHš š 	×#Ń#×3Ń3×HŃHš ÷:ń :š* ×ŃŲ×#Ń#×3Ń3ŲŲōš ×%Ń%Ó'DŲDNŲLLNŲIIŠ$Ō%ŲIIzDIIŃ%×-Ń-ØgÓ6Ō7ŲJJLō 2kØqŃ1Ó2ņ Ü

3ÜŠ'Š);Õ<Łšš
 ŠŲ#×+Ń+×9Ń9ø\ŃIŠIŠIäŲ ×(Ń(×6Ń6ÜLLō
š 	
š 
š $×+Ń+×9Ń9×?Ń?Ą<ŅOŠOŠOą×0Ń0°OŃCŠCŃCr   c                 ód    d  fd} j                  |j                  j                  j                  d|«       |j	                  «       j                  d«       |j                  «        |j                  j                  dd }|j                  j                  j                  «        t        j                  dft        j                  dft        j                  dff}t        |«      t        |«      k(  sJ t        ||«      D ]+  \  \  }}\  }	}
}||
k(  sJ t!        ||	«      !J |	d	|«        y)
z:Test that unhandled internal error cascades into shutdown.c                  ó    t        d«      ©Nrš   )ŚConnectionResetError)Ś_argsŚ_kwargss     r   Ś_raise_connection_resetzZtest_broken_connection_during_http_communication_fallback.<locals>._raise_connection_reset  s    Ü" 3Ó'Š'r   c                 ó°    j                  | j                  j                  d«       j                  | j                  j                  d«        «        y )NrØ   Śwrite)r   rŁ   ŚrfileŚwfile)rk   r  r   s    r   Ś_read_request_linezUtest_broken_connection_during_http_communication_fallback.<locals>._read_request_line  s?   ų Ų×ŃDIIOOØWŠ6MŌNŲ×ŃDIIOOØWŠ6MŌNŁÕ!r   Śread_request_lineó   GET / HTTP/1.1Nz^socket\.error 666$zK^Got a connection error while handling a connection from .*:\d{1,5} \(666\)a&  A fatal exception happened\. Setting the server interrupt flag to ConnectionResetError\(666,?\) and giving up\.\n\nPlease, report this on the Cheroot tracker at <https://github\.com/cherrypy/cheroot/issues/new/choose>, providing a full reproducer with as much context and details as possible\.$ś does not match )r   r~   r  ŚRequestHandlerClassr©   r  Śjoinr   ri   Śclearrt   r   ru   ŚCRITICALŚlenŚzipŚ_matches_pattern)r   r   r   Śwsgi_server_threadr  Śactual_log_entriesŚexpected_log_entriesŚexpected_log_levelŚexpected_msg_regexŚ
actual_msgŚactual_log_levelŚ_tbr  s   `           @r   Ś9test_broken_connection_during_http_communication_fallbackr,  ł  sQ  ł ņ(õ"š
 ×ŃŲ×#Ń#×3Ń3×GŃGŲŲōš ×ŃÓ ×%Ń%Š&7Ō8Ų×ŃŌą'×1Ń1×7Ń7¹Š:ŠŲ×Ń×"Ń"×(Ń(Ō*ō 
Š0Š1äLLš'š	
ō ×Ńšš	
šŠō$ Š!Ó"¤cŠ*>Ó&?Ņ?Š?Š?ō
 
Š!Š#5Ó	6ņ
ń 	Ł0Š	Š/Ł+Š% są!Š%5Ņ5Š5Š5ÜŠ 2°JÓ?ŃKš 	
ŲnŠ,Š-?Š,BŠCó	
ŠKń
r   c                 ó   d }||j                   j                  d<   | j                  «       }|j                  ddd¬«       |j	                  d|j
                  «       |j                  «        |j                  «        |j                  j                  dd }|j                  j                  j                  «        t        j                  dft        j                  d	ft        j                  d
ff}t        |«      t        |«      k(  sJ t        ||«      D ]+  \  \  }}\  }	}
}||
k(  sJ t!        ||	«      !J |	d|«        y)zATest that a keyboard interrupt from HTTP handler causes shutdown.c                 ó    t        d«      )Nz)simulated test handler keyboard interrupt)ŚKeyboardInterrupt)Ś_reqŚ_resps     r   Ś_trigger_kb_intrz7test_kb_int_from_http_handler.<locals>._trigger_kb_intr:  s    ÜŠ KÓLŠLr   z/kb_intrŚGETT©Ś	skip_hostŚHostNzy^Got a server shutdown request while handling a connection from .*:\d{1,5} \(simulated test handler keyboard interrupt\)$zi^Setting the server interrupt flag to KeyboardInterrupt\('simulated test handler keyboard interrupt',?\)$z#^Keyboard Interrupt: shutting down$r  )r   ra   r©   Ś
putrequestŚ	putheaderr  Ś
endheadersr  r   ri   r  rt   ŚDEBUGru   r!  r"  r#  )r   r   r$  r2  r¢   r%  r&  r'  r(  r)  r*  r+  s               r   Śtest_kb_int_from_http_handlerr;  3  sg   ņMš 4DN×Ń×$Ń$ ZŃ0ą×*Ń*Ó,IŲ×Ń 
°dŠŌ;Ų×Ń 	§”Ō/Ų×ŃŌŲ×ŃŌą'×1Ń1×7Ń7¹Š:ŠŲ×Ń×"Ń"×(Ń(Ō*ō MMšNš	
ō MMšBš	
ō LLŲ1š	
šŠō" Š!Ó"¤cŠ*>Ó&?Ņ?Š?Š?ō
 
Š!Š#5Ó	6ņ
ń 	Ł0Š	Š/Ł+Š% są!Š%5Ņ5Š5Š5ÜŠ 2°JÓ?ŃKš 	
ŲnŠ,Š-?Š,BŠCó	
ŠKń
r   c                 óP    G d dt         «      fd}||j                  j                  d<   | j                  |j                  j
                  d«      }|j                  «       }|j                  ddd¬«       |j                  d	|j                  «       |j                  «        |j                  s	 |j                  st        |j                  j                  «      d
k(  sJ |j                  j                  d
k  r	 |j                  j                  d
k  rt        |j                  j                  «      d
k(  sJ t!        d«      |_        |j                  j                  rJ |j%                  «        |j&                  j(                  dd }|j&                  j(                  j+                  «        t,        j.                  dft,        j0                  dff}	t        |«      t        |	«      k(  sJ t3        |	|«      D ]+  \  \  }
}\  }}}|
|k(  sJ t5        ||«      !J |d|«        y)z=Ensure worker threads are resilient to in-handler exceptions.c                   ó    e Zd ZdZy)śAtest_unhandled_exception_in_request_handler.<locals>.SillyMistakez)A simulated crash within an HTTP handler.N©rM   rN   rO   rP   r   r   r   ŚSillyMistaker>  n  s    Ś7r   r@  c                 ó     d«      )Nu2   simulated unhandled exception š£ in test handlerr   )r0  r1  r@  s     r   Ś_trigger_scary_exczGtest_unhandled_exception_in_request_handler.<locals>._trigger_scary_excq  s   ų ŁŠOÓPŠPr   z
/scary_excrØ   r3  Tr4  r6  r   śtest requesting shutdownNu   ^Unhandled error while processing an incoming connection SillyMistake\('simulated unhandled exception š£ in test handler',?\)$ś"^SystemExit raised: shutting down$r  )ŚBaseExceptionr   ra   rś   r~   r  r©   r7  r8  r  r9  Ścalledr!  ŚrequestsŚ_threadsŚidleŚ
SystemExitŚ	interruptr  r   ri   r  rt   ŚERRORru   r"  r#  )r’   r   r   r   r$  rB  Śserver_connection_close_spyr¢   r%  r&  r'  r(  r)  r*  r+  r@  s                  @r   Ś+test_unhandled_exception_in_request_handlerrN  e  s,  ų ō8}ō 8ōQš 6HN×Ń×$Ń$ \Ń2ą"(§*”*Ų×#Ń#×3Ń3Ųó#Šš
 ×*Ń*Ó,IŲ×Ń øŠŌ=Ų×Ń 	§”Ō/Ų×ŃŌš
 *×0Ņ0Ųš *×0Ó0ō ~×&Ń&×/Ń/Ó0°BŅ6Š6Š6Ų
×
!Ń
!×
&Ń
&ØŅ
+Ųš ×
!Ń
!×
&Ń
&ØÓ
+ä~×&Ń&×/Ń/Ó0°BŅ6Š6Š6Ü)Š*DÓENŌŲ×&Ń&×/Ņ/Š/Š/Ų×ŃŌą'×1Ń1×7Ń7¹Š:ŠŲ×Ń×"Ń"×(Ń(Ō*ō MMšKš	
ō LLŲ0š	
šŠō Š!Ó"¤cŠ*>Ó&?Ņ?Š?Š?ō
 
Š!Š#5Ó	6ņ
ń 	Ł0Š	Š/Ł+Š% są!Š%5Ņ5Š5Š5ÜŠ 2°JÓ?ŃKš 	
ŲnŠ,Š-?Š,BŠCó	
ŠKń
r   c                 ój    G d dt         «      |j                  j                  }|j                  }|j                  fd}|j                  |d|«       | j                  |d«      }t        |j                  j                  «      dk(  sJ |j                  «       j                  d«       |j                  s	 |j                  s|j                  j                  dk  r	 |j                  j                  dk  rt        |j                  j                  «      dk(  sJ t        d |j                  j                  D «       «      sJ t        d	«      |_        |j                  j                  rJ |j#                  «        |j$                  j&                  d
d
 }	|j$                  j&                  j)                  «        t*        j,                  dft*        j.                  dff}
t        |	«      t        |
«      k(  sJ t1        |
|	«      D ]+  \  \  }}\  }}}||k(  sJ t3        ||«      !J |d|«        y
)z<Ensure worker threads are resilient to unhandled exceptions.c                   ó    e Zd ZdZy)ś?test_remains_alive_post_unhandled_exception.<locals>.ScaryCrashz&A simulated crash during HTTP parsing.Nr?  r   r   r   Ś
ScaryCrashrQ  ³  s    Ś4r   rR  c                 ól    t        t        «      5   | «       d d d «        d«      # 1 sw Y   xY wr  )Ś_suppress_exceptionsŚTimeoutError)rk   rR  Ś_orig_read_request_lines    r   r  zGtest_remains_alive_post_unhandled_exception.<locals>._read_request_lineŗ  s4   ų Ü!¤,Ó/ń 	*Ł# DŌ)÷	*ń oŠ÷	*š 	*śs   	*Ŗ3r  rØ   r   r  c              3   ó<   K   | ]  }|j                  «         y ­wrx   )Śis_alive)r   Śworker_threads     r   r   z>test_remains_alive_post_unhandled_exception.<locals>.<genexpr>Ś  s!   č ų ņ ąš 	×Ń× ńłs   rC  NzM^Unhandled error while processing an incoming connection ScaryCrash\(666,?\)$rD  r  )rE  r~   r  r  r  r   rś   r!  rG  rH  r©   r  rF  rI  ŚallrJ  rK  r  r   ri   r  rt   rL  ru   r"  r#  )r’   r   r   r   r$  Ś_orig_conn_classŚ_orig_req_handler_classr  rM  r%  r&  r'  r(  r)  r*  r+  rR  rV  s                   @@r   Ś+test_remains_alive_post_unhandled_exceptionr]  Ŗ  sN  ł ō5]ō 5š #×2Ń2×BŃBŠŲ.×BŃBŠŲ5×GŃGŠõš ×ŃŲŲŲōš #)§*”*ŲŲó#Šō ~×&Ń&×/Ń/Ó0°BŅ6Š6Š6ą×ŃÓ ×%Ń%Š&7Ō8š
 *×0Ņ0Ųš *×0Ó0š ×
!Ń
!×
&Ń
&ØŅ
+Ųš ×
!Ń
!×
&Ń
&ØÓ
+ä~×&Ń&×/Ń/Ó0°BŅ6Š6Š6Üń ą+×4Ń4×=Ń=ōō š š ō  *Š*DÓENŌŲ×&Ń&×/Ņ/Š/Š/Ų×ŃŌą'×1Ń1×7Ń7¹Š:ŠŲ×Ń×"Ń"×(Ń(Ō*ō MMš$š	
ō LLŲ0š	
š
Šō Š!Ó"¤cŠ*>Ó&?Ņ?Š?Š?ō
 
Š!Š#5Ó	6ņ
ń 	Ł0Š	Š/Ł+Š% są!Š%5Ņ5Š5Š5ÜŠ 2°JÓ?ŃKš 	
ŲnŠ,Š-?Š,BŠCó	
ŠKń
r   Śtimeout_before_headers)TFc                 ó¦   | j                  «       }d|_        |j                  «        |s>|j                  d«       |j                  d|j                  z  j                  d«      «       t        j                  t        dz  «       |j                  |j                  d¬«      }|j                  «        |j                  dk(  sJ |j                  «        y	)
zbCheck timeout without sending any data.

    The server will close the connection with a 408.
    Fr  r  r  r}   r3  ©Śmethodé  N)r©   rŖ   r«   r  r  rJ   rŻ   rę   ry   Śresponse_classŚsockŚbeginr6   rØ   )r   r^  rŁ   Śresponses       r   Śtest_HTTP11_Timeoutrg  ż  s¤    š ×%Ń%Ó'DŲDNŲLLNį!ą		Š(Ō)Ų		: §	”	Ń)×1Ń1°'Ó:Ō;ō 	JJw{Ōš ×"Ń" 4§9”9°UŠ"Ó;HŲNNŌŲ??cŅ!Š!Š!ŲJJLr   c                 ó^
   d}| j                  «       }|j                  ddt        z  d¬«       |j                  d|j                  «       |j                  «        |j                  |j                  d¬«      }|j                  «        |j                  dk(  sJ |j                  «       }t        t        «      j                  «       }||k(  sJ |j                  d	«       |j                  d
|j                  z  j                  d«      «       |j                  «        |j                  |j                  d¬«      }|j                  «        |j                  dk(  sJ |j                  «       }d}||k(  sJ t        j                   t        dz  «       |j                  d	«       |j                  d
|j                  z  j                  d«      «       |j                  «        |j                  |j                  d¬«      }	 |j                  «        |j                  dk7  r't#        j$                  ||j                  «       z  «       	 |j3                  «        | j                  «       }|j                  ddd¬«       |j                  d|j                  «       |j                  «        |j                  |j                  d¬«      }|j                  «        |j                  dk(  sJ |j                  «       }t4        j                  «       }||k(  sJ |j7                  d	«       t        j                   t        dz  «       |j                  |j                  d¬«      }	 |j                  «        |j                  dk7  r't#        j$                  ||j                  «       z  «       	 |j3                  «        | j                  «       }|j                  ddd¬«       |j                  d|j                  «       |j                  «        |j                  |j                  d¬«      }|j                  «        |j                  dk(  sJ |j                  «       }t4        j                  «       }||k(  sJ |j3                  «        y# t&        j(                  t*        j,                  j.                  f$ r Y dt0        $ r#}t#        j$                  ||z  «       Y d}~d}~ww xY w# t&        j(                  t*        j,                  j.                  f$ r Y ht0        $ r#}t#        j$                  ||z  «       Y d}~d}~ww xY w)zuCheck timeout after at least one request has succeeded.

    The server should close the connection without 408.
    z=Writing to timed out socket didn't fail as it should have: %sr3  z/timeout?t=%sTr4  r6  r`  r¤   r  r  r  ó   Hello, world!r}   rb  NrU   )r©   r7  ry   r8  r  r9  rc  rd  re  r6   r/   r"   rJ   Ś_outputŚ_send_outputrŻ   rę   r®   Śfailrō   r  r°   r±   rä   Ś	ExceptionrØ   r   r  )r   Śfail_msgrŁ   rf  Śactual_bodyŚexpected_bodyŚexs          r   Ś!test_HTTP11_Timeout_after_requestrr    s   š
 OHš ×%Ń%Ó'DŲOOE?¬WŃ4ĄOŌEŲNN6499Ō%ŲOOŌŲ×"Ń" 4§9”9°UŠ"Ó;HŲNNŌŲ??cŅ!Š!Š!Ų--/KÜL×'Ń'Ó)MŲ-Ņ'Š'Š'š 	LLŠ'Ō(ŲLL*tyyŃ(×0Ń0°Ó9Ō:Ų×ŃŌŲ×"Ń" 4§9”9°UŠ"Ó;HŲNNŌŲ??cŅ!Š!Š!Ų--/KŲ$MŲ-Ņ'Š'Š'ō 	JJw{Ōš 	LLŠ'Ō(ŲLL*tyyŃ(×0Ń0°Ó9Ō:Ų×ŃŌŲ×"Ń" 4§9”9°UŠ"Ó;Hš4ŲŌš ??cŅ!ÜKK 8§=”=£?Ń2Õ3ąJJLš ×%Ń%Ó'DŲOOE6ØTOŌ2ŲNN6499Ō%ŲOOŌŲ×"Ń" 4§9”9°UŠ"Ó;HŲNNŌŲ??cŅ!Š!Š!Ų--/KÜJJLMŲ-Ņ'Š'Š'š 	IIŠ$Ō%äJJw{ŌŲ×"Ń" 4§9”9°UŠ"Ó;Hš4ŲŌš ??cŅ!ÜKK 8§=”=£?Ń2Õ3ąJJLš ×%Ń%Ó'DŲOOE6ØTOŌ2ŲNN6499Ō%ŲOOŌŲ×"Ń" 4§9”9°UŠ"Ó;HŲNNŌŲ??cŅ!Š!Š!Ų--/KÜJJLMŲ-Ņ'Š'Š'ŲJJLųōg LL$++×3Ń3Š4ņ ŚÜņ #ÜHrM×"Ņ"ūš#ūō8 LL$++×3Ń3Š4ņ ŚÜņ #ÜHrM×"Ņ"ūš#śs<   Ē9Q3 ĶS Ń3-SŅ#SŅ+S	Ó	SÓ-T,ŌT,Ō	T'Ō'T,c                 ó<   | j                  «       }|j                  ddd¬«       |j                  d|j                  «       |j	                  «        t        d«      D ]Ł  }|j                  d|z  j                  d«      «       |j                  d	|j                  z  j                  d
«      «       |j                  «        |j                  |j                  d¬«      }|j                  j                  dd«      |_        |j                  «        |j                  d«      }|j                  dk(  sJ |dk(  rŁJ  |j                  |j                  d¬«      }|j                  «        |j                  «       }|j                  dk(  sJ |dk(  sJ |j!                  «        y)zXTest HTTP/1.1 pipelining.

    :py:mod:`http.client` doesn't support this directly.
    r3  rT   Tr4  r6  é   zGET /hello?%s HTTP/1.1z
iso-8859-1r  r  r`  Śrbr   é   r¤   ri  N)r©   r7  r8  r  r9  r!   rj  rJ   rk  rc  rd  ŚmakefileŚfpre  r/   r6   rØ   )r   rŁ   Śtrialrf  Śbodys        r   Śtest_HTTP11_pipeliningr{  {  sj   š
 ×%Ń%Ó'Dš 	OOE8ØtOŌ4ŲNN6499Ō%ŲOOŌäqņ (ąŲ%ØŃ-×5Ń5°lÓCō	
š 	j 4§9”9Ń,×4Ń4°WÓ=Ō>Ų×ŃŌš ×&Ń& t§y”yøŠ&Ó?š
 ii×(Ń(ØØqÓ1ŲŌŲ}}RÓ Ų #Ņ%Š%Š%ŲŠ'Ó'Š'Š'š%(š* ×"Ń" 4§9”9°UŠ"Ó;HŲNNŌŲ==?DŲ??cŅ!Š!Š!ŲŠ#Ņ#Š#Š#ąJJLr   c                 óŗ   | j                  «       }|j                  ddd¬«       |j                  d|j                  «       |j                  dd«       |j                  dd	«       |j	                  «        |j                  d
«       |j                  |j                  d¬«      }|j                  «       \  }}}|dk7  sJ |j                  «        |j                  «        |j                  ddd¬«       |j                  d|j                  «       |j                  dd«       |j                  dd«       |j                  dd«       |j	                  «        |j                  |j                  d¬«      }|j                  «       \  }}}|dk(  sJ 	 |j                  j                  «       j                  «       }|rt        j                  d|z  «       nnEd}|j                  |«       |j!                  «        t#        j$                  |«      \  }}	}
t'        |dd «      }|dk(  sJ d|j)                  «       dj+                  «       }|
|k(  sJ |j                  «        y)z$Test 100-continue header processing.r*   rZ   Tr4  r6  śContent-Typeś
text/plainr   Ś4s   d'ohr`  éd   Ś17ŚExpectś100-continuez2100 Continue should not output any headers. Got %ró   I am a small fileNr£   r¤   r,   r-   )r©   r7  r8  r  r9  r  rc  rd  Ś_read_statusrØ   r«   rx  ŚreadlineŚstripr®   rl  re  r   Śshbr­   r0   rJ   )r   rŁ   rf  Ś_versionr6   Ś_reasonŚlinerz  rµ   Ś_actual_headersr·   rø   Śexpected_resp_bodys                r   Śtest_100_Continuer  „  s   ą×%Ń%Ó'Dš
 	OOFI°OŌ6ŲNN6499Ō%ŲNN> <Ō0ŲNNŠ# SŌ)ŲOOŌŲIIgŌŲ×"Ń" 4§9”9°VŠ"Ó<HŲ (× 5Ń 5Ó 7ŃHfgŲS=Š=ŲJJLš 	LLNŲOOFI°OŌ6ŲNN6499Ō%ŲNN> <Ō0ŲNNŠ# TŌ*ŲNN8^Ō,ŲOOŌŲ×"Ń" 4§9”9°VŠ"Ó<Hš !)× 5Ń 5Ó 7ŃHfgŲS=Š=Ų
Ų{{×#Ń#Ó%×+Ń+Ó-ŁÜKKŲDĄtŃKõš š š  DŲIIdOš NNŌÜ5<·[±[ĄÓ5JŃ2KŠ"2Ü B QÓ(MŲCŅŠŠŲ'ØÆ©«Š'8øŠ:×AŃAÓCŠŲŠ1Ņ1Š1Š1ŲJJLr   r   )r   r|   c                 óŠ   | j                   j                  }|| j                   _        | j                  «       }|j                  ddd¬«       |j	                  d|j
                  «       |j	                  dd«       |j	                  dd	«       |j	                  d
d«       |j                  «        |j                  |j                  d¬«      }|j                  «       \  }}}|dk(  sJ d}|r+|j                  j                  «       j                  «       }|r+|j                  d«       |j                  «        t        j                   |«      \  }	}
}t#        |	dd «      }|dk(  sJ |j%                  d«       |j%                  d|j
                  z  j'                  d«      «       |j%                  d«       |j%                  d«       |j%                  d«       |j)                  «        |j                  |j                  d¬«      }|j                  «       \  }}}|dk(  sJ d}|r+|j                  j                  «       j                  «       }|r+d}|j                  |«       |j                  «        t        j                   |«      \  }	}
}t#        |	dd «      }|dk(  sJ d|j+                  «       dj'                  «       }||k(  sJ |j-                  «        || j                   _        y)z9Test a max_request_body_size of 0 (the default) and 1001.r*   r]   Tr4  r6  r}  r~  r   Ś1000r  r  r`  r  sč  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxNr£   éō  s   POST /upload HTTP/1.1r  r  s   Content-Type: text/plains   Content-Length: 17s   Expect: 100-continuer  r¤   r,   r-   )r~   r   r©   r7  r8  r  r9  rc  rd  r  rx  r  r  r  re  r   r  r­   rj  rJ   rk  r0   rØ   )r   r   Śold_maxrŁ   rf  r  r6   r  Śskiprµ   r  r·   rø   rz  r  s                  r   Śtest_readall_or_closer  Ū  s   š ×)Ń)×?Ń?Gą8MK×ŃŌ5ą×%Ń%Ó'Dš 	OOFŠ.ø$OŌ?ŲNN6499Ō%ŲNN> <Ō0ŲNNŠ# VŌ,ŲNN8^Ō,ŲOOŌŲ×"Ń" 4§9”9°VŠ"Ó<Hš !)× 5Ń 5Ó 7ŃHfgŲS=Š=ŲDŁ
Ų{{×#Ń#Ó%×+Ń+Ó-ņ š 	IIkŌš NNŌÜ5<·[±[ĄÓ5JŃ2KŠ"2Ü B QÓ(MŲCŅŠŠš 	LLŠ)Ō*ŲLL*tyyŃ(×0Ń0°Ó9Ō:ŲLLŠ,Ō-ŲLLŠ&Ō'ŲLLŠ(Ō)Ų×ŃŌŲ×"Ń" 4§9”9°VŠ"Ó<Hš !)× 5Ń 5Ó 7ŃHfgŲS=Š=ŲDŁ
Ų{{×#Ń#Ó%×+Ń+Ó-ņ š  DŲIIdOš NNŌÜ5<·[±[ĄÓ5JŃ2KŠ"2Ü B QÓ(MŲCŅŠŠŲ'ØÆ©«Š'8øŠ:×AŃAÓCŠŲŠ1Ņ1Š1Š1ŲJJLą8?K×ŃÕ5r   c                 óh   | j                  «       }d|_        |j                  «        | j                  d|¬«      \  }}}t	        |dd «      }|dk(  sJ |dd dk(  sJ |t
        j                  «       k(  sJ t        d	|«      rJ | j                  d
|¬«      \  }}}t	        |dd «      }|dk(  sJ t        d|«      rJ |dk(  sJ t        d	|«      rJ | j                  d|¬«      \  }}}t	        |dd «      }|dk(  sJ t        d|«      rJ |dk(  sJ t        d	|«      rJ |j                  «        y)z.Test HTTP queries with an empty response body.FrU   r”   Nr£   r¤   r„   r¦   r§   r[   éĢ   r   r   r\   i0  )	r©   rŖ   r«   r¬   r­   r   rJ   r   rØ   r³   s         r   Śtest_No_Message_Bodyr  #  s   š "×0Ń0Ó2OŲ %OŌŲ×ŃŌš 5@·O±OŲŲ!š 5Dó 5Ń1KŠ!1ō  B QÓ(MŲCŅŠŠŲqr?dŅ"Š"Š"Ųszz|Ņ+Š+Š+Ü\Ø>Ō:Š:Š:š 5@·O±OŲŲ!š 5Dó 5Ń1KŠ!1ō  B QÓ(MŲCŅŠŠÜŠ-Ø~Ō>Š>Š>ŲsŅ"Š"Š"Ü\Ø>Ō:Š:Š:š 5@·O±OŲŲ!š 5Dó 5Ń1KŠ!1ō  B QÓ(MŲCŅŠŠÜŠ-Ø~Ō>Š>Š>ŲsŅ"Š"Š"Ü\Ø>Ō:Š:Š:š ×ŃÕr   z¹
        Headers from earlier request leak into the request
        line for a subsequent request, resulting in 400
        instead of 413. See cherrypy/cheroot#69 for details.
        c                 ó¢   | j                  «       }d}|j                  ddd¬«       |j                  d|j                  «       |j                  dd«       |j                  d	d
«       |j                  dd«       |j	                  «        |j                  |«       |j                  «       }t        j                  |«      \  }}}t        |dd «      }|dk(  sJ |dd dk(  sJ ddz  j                  «       }||k(  sJ dj                  d«      }|j                  ddd¬«       |j                  d|j                  «       |j                  dd«       |j                  d
d«       |j	                  «        |j                  |«       |j                  «       }t        j                  |«      \  }}}t        |dd «      }|dk(  sJ |j                  «        y)z1Test HTTP uploads with chunked transfer-encoding.sF   8;key=value
xx
xxxx
5
yyyyy
0
Content-Type: application/json

r*   rZ   Tr4  r6  r¼   r¾   ŚTrailerr}  r   Ś3Nr£   r¤   r„   r¦   zthanks for '%s's   xx
xxxxyyyyys   
)s   3e3sć  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxó   0r   r   r~  é  )r©   r7  r8  r  r9  r  Śgetresponser   r  r­   rJ   r  rØ   )	r   rŁ   rz  rf  rµ   r  r·   rø   r  s	            r   Śtest_Chunked_Encodingr  O  s³   š ×%Ń%Ó'Dš	š 	š
 	OOFI°OŌ6ŲNN6499Ō%ŲNNŠ&Ø	Ō2ŲNN9nŌ-š 	NNŠ# SŌ)ŲOOŌŲIIdOŲ×ŃÓ!HÜ5<·[±[ĄÓ5JŃ2KŠ"2Ü B QÓ(MŲCŅŠŠŲqr?dŅ"Š"Š"Ų+Š.@Ń@×HŃHÓJŠŲŠ1Ņ1Š1Š1š <<Š<Ó=DŲOOFI°OŌ6ŲNN6499Ō%ŲNNŠ&Ø	Ō2ŲNN> <Ō0š 	OOŌŲIIdOŲ×ŃÓ!HÜ5<·[±[ĄÓ5JŃ2KŠ"2Ü B QÓ(MŲCŅŠŠŲJJLr   c                 ó   | j                  «       }|j                  ddd¬«       |j                  d|j                  «       |j                  dd«       |j                  dd	«       |j	                  «        |j                  «       }t        j                  |«      \  }}}t        |d
d «      }|dk(  sJ d}||k(  sJ |j                  «        y
)zTry a non-chunked request where Content-Length exceeds limit.

    (server.max_request_body_size).
    Assert error before body send.
    r*   rZ   Tr4  r6  r}  r~  r   Ś9999Nr£   r  sC   The entity sent with the request exceeds the maximum allowed bytes.)
r©   r7  r8  r  r9  r  r   r  r­   rØ   )r   rŁ   rf  rµ   r  r·   rø   r  s           r   Śtest_Content_Length_inr”    sĮ    š ×%Ń%Ó'DąOOFI°OŌ6ŲNN6499Ō%ŲNN> <Ō0ŲNNŠ# VŌ,ŲOOŌŲ×ŃÓ!HÜ5<·[±[ĄÓ5JŃ2KŠ"2Ü B QÓ(MŲCŅŠŠąNš š Š1Ņ1Š1Š1ŲJJLr   c                 ón    | j                  dddg¬«      \  }}}t        |dd «      }|dk(  sJ |dk(  sJ y)	z6Test that malicious Content-Length header returns 400.rZ   )r}  r~  )r   znot-an-integerrE   Nr£   i  s    Malformed Content-Length Header.)Śpostr­   )r   rµ   r  r·   rø   s        r   Śtest_Content_Length_not_intr¤     s]    ą5@×5EŃ5EŲą*Ų0š
š 6Fó 6Ń2KŠ"2ō  B QÓ(MąCŅŠŠŲŠBŅBŠBŃBr   )ŚuriŚexpected_resp_statusr  ))r_   r  sL   The requested resource returned more bytes than the declared Content-Length.)r`   r¤   s   I tooc                 ó¬   | j                  «       }|j                  d|d¬«       |j                  d|j                  «       |j	                  «        |j                  «       }t        j                  |«      \  }}}t        |dd «      }	|	|k(  sJ ||k(  sJ |j                  «        | j                  j                  j                  j                  d«       y)z_Test response with Content-Length less than the response body.

    (non-chunked response)
    r3  Tr4  r6  Nr£   )z@ValueError('Response body exceeds the declared Content-Length.')zAValueError('Response body exceeds the declared Content-Length.',))r©   r7  r8  r  r9  r  r   r  r­   rØ   r~   r   rj   Śextend)
r   r„  r¦  r  rŁ   rf  rµ   r  r·   rø   s
             r   Śtest_Content_Length_outr©  Æ  sĀ    š0 ×%Ń%Ó'DŲOOE3Ø$OŌ/ŲNN6499Ō%ŲOOŌą×ŃÓ!HÜ5<·[±[ĄÓ5JŃ2KŠ"2Ü B QÓ(MąŠ0Ņ0Š0Š0ŲŠ1Ņ1Š1Š1ąJJLš
 ×Ń×)Ń)×6Ń6×=Ń=š	
õr   zbSometimes this test fails due to low timeout. Ref: https://github.com/cherrypy/cherrypy/issues/598c                 ó°   | j                  «       }t        j                  j                  d|j                  d|j
                  d«      }|j                  d«      }t        j                  t        dz  «       d}|r*|j                  |«      }|sn||z  }|t        |«      z  }|r*t        |«      dk(  sJ |dd	z  k(  sJ |d
k(  sJ |j                  «        y)z5Test serving large file with a read timeout in place.zhttp://ś:r^   i   g333333ć?i ž i   s   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarA   r   N)r©   ŚurllibrŪ   Śurlopenr  Śportr/   rŻ   rę   ry   r!  rØ   )r   rŁ   Śremote_data_connŚbufŚ	remainingŚdatas         r   Śtest_598r³  ā  sŻ    š ×%Ń%Ó'DÜ~~×-Ń-Ų
$))a §	”	}Š,>Š?óŠš ×
Ń
 Ó
$CÜJJw}ŌŲ#IŁ
Ų×$Ń$ YÓ/ŁŲŲtŲSYŃ	ņ ō s8{Ņ"Š"Š"Ų+ Ń$Ņ$Š$Š$Ų>Š>Ų×ŃÕr   Śinvalid_terminator)s   

s   

c                 óų    | j                  «       }|j                  d|z  «       |j                  |j                  d¬«      }|j	                  «        |j                  «       }d}||k(  sJ |j                  «        y)z1Test HTTP queries with no valid CRLF terminators.s   GET /hello HTTP/1.1%sr3  r`  s   HTTP requires CRLF terminatorsN)r©   r  rc  rd  re  r/   rØ   )r   r“  rŁ   rf  r·   r  s         r   Śtest_No_CRLFr¶  ż  sr    š ×%Ń%Ó'DąIIŠ&Š);Ń;Ō<Ų×"Ń" 4§9”9°UŠ"Ó;HŲNNŌŲ}}ŠŲ:ŠŲŠ1Ņ1Š1Š1ŲJJLr   c                   ó    e Zd ZdZd Zd Zy)ŚFaultySelectz:Mock class to insert errors in the selector.select method.c                 ó.    || _         d| _        d| _        y)z:Initilize helper class to wrap the selector.select method.FN)Śoriginal_selectŚrequest_servedŚos_error_triggered)rk   rŗ  s     r   rl   zFaultySelect.__init__  s    ą.ŌŲ#ŌŲ"'Õr   c                 ó`    | j                   rd| _        t        d«      | j                  |«      S )z'Intercept the calls to selector.select.Tz(Error while selecting the client socket.)r»  r¼  ŚOSErrorrŗ  )rk   ry   s     r   rs   zFaultySelect.__call__  s0    ą×ŅŲ&*DŌ#ÜŠDÓEŠEą×#Ń# GÓ,Š,r   N©rM   rN   rO   rP   rl   rs   r   r   r   rø  rø    s    ŁDņ(ó-r   rø  c                   ó    e Zd ZdZd Zd Zy)ŚFaultyGetMapz;Mock class to insert errors in the selector.get_map method.c                 ó.    || _         d| _        d| _        y)z;Initilize helper class to wrap the selector.get_map method.FN)Śoriginal_get_mapŚsabotage_connŚconn_closed)rk   rĆ  s     r   rl   zFaultyGetMap.__init__'  s    ą 0ŌŲ"ŌŲ Õr   c                 óÜ    | j                   r1| j                  s%d | j                  «       j                  «       D «       nd}|D ]  }|j	                  «        d| _         | j                  «       S )z(Intercept the calls to selector.get_map.c              3   óx   K   | ]2  \  }\  }}}}t        |t        j                  j                  «      r| 4 y ­wrx   )r
  ŚcherootŚserverŚHTTPConnection)r   r   rŁ   s      r   r   z(FaultyGetMap.__call__.<locals>.<genexpr>0  s8   č ų ņ į&A1a Üd¤G§N”N×$AŃ$AŌBō ńłs   8:r   T)rÄ  rÅ  rĆ  ŚitemsrØ   )rk   Śsabotage_targetsrŁ   s      r   rs   zFaultyGetMap.__call__-  sq    š ×!Ņ!Ø$×*:Ņ*:ńą*.×*?Ń*?Ó*A×*GŃ*GÓ*Iõš š 	š %ņ 	$DąJJLŲ#DÕš	$š
 ×$Ń$Ó&Š&r   Nræ  r   r   r   rĮ  rĮ  $  s    ŁEņ!ó'r   rĮ  c                 ó¦   t        | j                  j                  j                  j                  «      }|j                  | j                  j                  j                  d|«       t        | j                  j                  j                  j                  j                  «      }|j                  | j                  j                  j                  j                  d|«       | j                  ddg¬«      \  }}}|dk(  sJ dx|_	        |_
        t        j                  | j                  j                  dz  «       |j                  sJ |j                  sJ y	)
zTest the error handling segment of HTTP connection selection.

    See :py:meth:`cheroot.connections.ConnectionManager.get_conn`.
    ŚselectŚget_maprV   rÄ   rE   z200 OKTr}   N)rø  r~   rŽ   Ś	_selectorrĪ  r   rĮ  rĻ  rŪ   rÄ  r»  rŻ   rę   Śexpiration_intervalr¼  rÅ  )r   r   Śfaux_selectŚfaux_get_mapŚresp_statusŚ_resp_headersŚ
_resp_bodys          r   Ś test_invalid_selected_connectionr×  A  s5   ō Ų×#Ń#×0Ń0×:Ń:×AŃAóKš ×ŃŲ×#Ń#×0Ń0×:Ń:ŲŲōō  Ų×#Ń#×0Ń0×:Ń:×DŃD×LŃLóLš ×ŃŲ×#Ń#×0Ń0×:Ń:×DŃDŲŲōš .9×-@Ń-@ŲŲ-Š.š .Aó .Ń*K 
š
 (Ņ"Š"Š"ą>BŠBLŌ Ō!;äJJ{×*Ń*×>Ń>ĄŃBŌCŲ×)Ņ)Š)Š)Ų×#Ņ#Š#Ń#r   )RrP   r  Śhttp.clientr°   rt   rō   rŻ   rg   ro   Śurllib.requestr¬  Ścollectionsr   Ś
contextlibr   rT  Śrer   r#  r®   Śjaraco.textr   r   Ścheroot.serverrČ  Ścheroot._compatr   r	   r
   r   Ścheroot.testr   r   r  ry   r   r   rS   rc   Śfixturer   r   r   r   r   r¹   ŚmarkŚparametrizerĮ   rÉ   ŚparamŚxfailrŌ   rė   r  Ś
ECONNRESETŚEPIPEŚENOTCONNŚ	ESHUTDOWNŚRuntimeErrorr  ŚBrokenPipeErrorr  r,  r;  rN  r]  rg  rr  r{  r  r  r  r  r”  r¤  r©  r³  r¶  rø  rĮ  r×  r   r   r   ś<module>rģ     s­  šŁ Kć Ū Ū Ū Ū Ū Ū Ż "Ż 7Ż (ć ē $ć ß @Ó @ß (š Ņ$*š Ų0÷M8ń M8ō`×"Ń"ō ÷(Mń Mš0 ńó šš$ ń
ó š
š4 ń(ó š(ņ
Dņ
ņ+;š\ ×ŃŲšóńLóšLš^ ×ŃŲšóńFóšFšR ×ŃŲąŲŲŲ++×#Ń#ŲŅ!EŲBŲš $ó ō	
š
óń:óš:ņzišX ×ŃŲ>ąŲLLŲ×ŃŲŲ)ō		
š 	ŲLLŲKKŲŲ$ō		
š 	ŲLLŲNNŲŲ1ō		
š 	ŲŲNNŲŲ,Ų++×#Ń#ŲŲ=š $ó ō		
š 	ŲLLŲOOŲŲ(ō		
š 	\ 3ØŠ1DŌEŲV\\ 2 tŠ0BŌCšI%šN 	Ų Ų×ŃŲŲ1ō		
š 	ŲŲKKŲŲ'ō		
š 	ŲŲOOŲŲ+ō		
šńM9ó<ń|SDó}<š|SDņl7
ņt/
ņdB
ņJP
šf ×ŃŲšóńóšņ2[ņ|'ņT3šl ×ŃŲšóń>@óš>@ņB)šX ×ŃŁŁš ó 	óš ó ń,óš,ņ^ņ2Cš ×ŃŲ9š
óń"óš"šJ ×Ńš;š ó ńó	šš. ×ŃŲšóńóš÷-ń -÷$'ń 'ó:'$r   