§
    DfŠ  ć                   óB   d 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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mZ ddlmZmZ ddlmZmZmZmZ ddlZej        dd         d	k    Z epeZ!d
Z"dZ# G d dej$        ¦  «        Z$ G d d¦  «        Z%ej&        d ¦   «         Z'ej&        d ¦   «         Z(ej&        d ¦   «         Z)d Z*d Z+d Z,ej-         .                    dd¦  «        d ¦   «         Z/ej-         .                    dd¦  «        d ¦   «         Z0ej-         .                    dd ej1        dej-         2                    eoedd¬¦  «        ¬ ¦  «        f¦  «        d! ¦   «         Z3d" Z4ej-         .                    d# ej1        ej5        ej6        dd$¬%¦  «         ej1        ej5        ej7        dd&¬%¦  «         ej1        ej5        ej8        dd'¬%¦  «         ej1        dej8        dd(ej-         2                    ed)¬*¦  «        ¬+¦  «         ej1        ej5        ej9        dd,¬%¦  «         ej1        e:d-d.d/¬%¦  «         ej1        ej5        d0d.d1¬%¦  «        f ej1        e;ej6        dd2¬%¦  «         ej1        e<ej7        dd3¬%¦  «         ej1        e<ej9        dd4¬%¦  «        fz   ¦  «        d5 ¦   «         Z=d6 Z>d7 Z?ej-         2                    eoeoe oe! d8d¬¦  «        d9 ¦   «         Z@ej-         2                    eoeoe oe! d8d¬¦  «        d: ¦   «         ZAej-         .                    d;d<¦  «        d= ¦   «         ZBd> ZCd? ZDd@ ZEej-         .                    dAdB¦  «        dC ¦   «         ZFdD ZGej-         2                     e edE¦  «        ¦  «        ¬*¦  «        dF ¦   «         ZHdG ZIdH ZJej-         .                    dIdJ¦  «        dK ¦   «         ZKej-         2                    dL¬*¦  «        dM ¦   «         ZLej-         .                    dNdO¦  «        dP ¦   «         ZM G dQ dR¦  «        ZN G dS dT¦  «        ZOdU ZPdS )VzETests for TCP connection handling, including proper and timely close.é    N)Śmatch)Ś
namedtuple)ŚtrimŚunwrap)ŚhelperŚwebtest)ŚIS_CIŚIS_MACOSŚIS_PYPYŚ
IS_WINDOWSé   )é   é   é   z(pPeErRsSiIsStTeEnNcCeE oOfF vViIsSiIoOnNc                   ót    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zeeeeeeeee	e
eeedZdS )Ś
Controllerz!Controller for serving WSGI apps.c                 ó    dS )zRender Hello world.zHello, world!© ©ŚreqŚresps     śE/var/www/media/lib/python3.11/site-packages/cheroot/test/test_conn.pyŚhellozController.hello!   s    ąó    c                 ó    t           S )zRender ``pov`` value.)Śpovr   s     r   r   zController.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   óP   K   t          d¦  «        D ]} t          | ¦  «        V  d S )Nr    )ŚrangeŚstr)Śxs    r   Ścontentz"Controller.stream.<locals>.content.   s6   č č  Ż2YYš š Ż!ffšš r   )Śenvironr$   Śheaders)r   r   r&   s      r   ŚstreamzController.stream)   sD    ąs{ >Ō2Š2Š2Ż-0°©W¬WDLŠ)Ń*š	š 	š 	š wyyŠr   c                 óĪ    | j         d         dk    st          d| j         d         z  ¦  «        | j         d                              ¦   «                              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Controller.upload4   ss    ą{Š+Ō,°Ņ6Š6Ż Ų-ŲŠ,Ō-ń.ńō š š  \Ō2×7Ņ7Ń9Ō9×@Ņ@ĄŃIŌIŲ2nŠ2Š2Š2Š2r   c                 ó    d|_         dS )z Render response with status 204.Ś204z
Code = 204©Śstatusr   s     r   Ś
custom_204zController.custom_204>   ó    ąŲ|r   c                 ó    d|_         dS )z Render response with status 304.Ś304z
Code = 304r7   r   s     r   Ś
custom_304zController.custom_304C   r:   r   c                 ó    d|_         dS )z Render response with status 500.z500 Internal Server ErrorŚokr7   r   s     r   Śerr_before_readzController.err_before_readH   s    ą1Ųtr   c                 ó    dgdz  S )zRender 1MB response.Į   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaé   r   r   s     r   Śone_megabyte_of_azController.one_megabyte_of_aM   s    ą|dŃ"Š"r   c                 ó    d|j         d<   dS )z3Render buffered response with invalid length value.Ś5r!   zI have too many bytes©r(   r   s     r   Śwrong_cl_bufferedzController.wrong_cl_bufferedQ   s    ą),Š%Ń&Ų&Š&r   c                 ó    d|j         d<   ddgS )z5Render unbuffered response with invalid length value.rF   r!   zI tooz have too many bytesrG   r   s     r   Śwrong_cl_unbufferedzController.wrong_cl_unbufferedV   s    ą),Š%Ń&ŲŠ/Š0Š0r   c                 óR    |                       d¦  «                             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)Śencoder2   )Śstrings    r   Ś_mungezController._munge[   s$    š }}WŃ%Ō%×,Ņ,ØYŃ7Ō7Š7r   )ś/helloś/povś/page1ś/page2ś/page3ś/streamś/uploadś/custom/204ś/custom/304ś/err_before_readś/one_megabyte_of_aś/wrong_cl_bufferedś/wrong_cl_unbufferedN)Ś__name__Ś
__module__Ś__qualname__Ś__doc__r   r   r)   r4   r9   r=   r@   rD   rH   rJ   rN   Śhandlersr   r   r   r   r      sī        Ų+Š+šš š šš š š	š 	š 	š3š 3š 3šš š š
š š š
š š š
#š #š #š'š 'š 'š
1š 1š 1š
8š 8š 8š ŲŲŲŲŲŲŲ!Ų!Ų+Ų/Ų/Ų 3šš HHHr   r   c                   óL    e Zd ZdZ edg d¢¦  «        Zd Zdej        dfdZ	dS )	ŚErrorLogMonitorzCMock class to access the server error_log calls made by the server.ŚErrorLogCall)ŚmsgŚlevelŚ	tracebackc                 ó"    g | _         g | _        dS )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__y   s    š 
ąŌŠŠr   Ś Fc                 ó    |rt          j        ¦   «         }nd}| j                             t                               |||¦  «        ¦  «         dS )z2Intercept the call to the server error_log method.rl   N)Ś
traceback_Ś
format_excrh   Śappendrb   rc   )rj   rd   re   rf   Śtbliness        r   Ś__call__zErrorLogMonitor.__call__   sM    ąš 	Ż Ō+Ń-Ō-GGąGŲ
×Ņ/×6Ņ6°søEĄ7ŃKŌKŃLŌLŠLŠLŠLr   N)
r\   r]   r^   r_   r   rc   rk   ŚloggingŚINFOrr   r   r   r   rb   rb   t   sf        ŲMŠMą:nŠ.KŠ.KŠ.KŃLŌLLšš š š  W¤\øUš Mš Mš Mš Mš Mš Mr   rb   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éé  r   )r   r`   Śserver_instanceŚwsgi_appŚmax_request_body_sizerx   Śserver_clientŚkeep_alive_conn_limit)Śwsgi_server_clientŚapprz   ry   s      @r   Śraw_testing_serverr      si   ų õ ,,Cš(š (š (š (š (ą'CLŃŲ$Ō4KŲKŌŲ(,KŌ%Ż!KŌŲ 2KŌŲ()KŌ%ąŠr   c              #   ó   K   |                      | dt          ¦   «         ¦  «         | V  | j        j        D ]G\  }}}|t          j        k    r|| j        j        v s"J  dj        di t          ¦   «         ¤f¦   «         HdS )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_logzTFound error in the error log: message = '{c_msg}', level = '{c_level}'
{c_traceback}Nr   )	Śsetattrrb   r   rh   rs   ŚWARNINGri   ŚformatŚlocals)r   ŚmonkeypatchŚc_msgŚc_levelŚc_tracebacks        r   Śtesting_serverr      sŗ   č č  š ×ŅŠ*ØK½Ń9JŌ9JŃKŌKŠKą
ŠŠŠš
 (:Ō'CŌ'Iš 
š 
Ń#wŲgoŅ%Š%ŲąŠ*Ō4ŌAŠAŠAŠAš#š ä"š/š /å%+”X¤Xš/š /šD
ŃAŌAŠAŠAš	
š 
r   c                 ó    | j         S )z5Get and return a test client out of the given server.)r   )r   s    r   Śtest_clientr   ¹   s    š Ō'Š'r   c                 óB    |                       ¦   «         d |D ¦   «         v S )zCheck that a header is present.c              3   óD   K   | ]\  }}|                      ¦   «         V  d S rw   ©Ślower)Ś.0ŚkŚ_s      r   ś	<genexpr>z header_exists.<locals>.<genexpr>Į   s.   č č  Š"CŠ"C±°!°Q 1§7¢7”9¤9Š"CŠ"CŠ"CŠ"CŠ"CŠ"Cr   r   )Śheader_namer(   s     r   Śheader_existsr   æ   s(    ą×ŅŃŌŠ"CŠ"Cø7Š"CŃ"CŌ"CŠCŠCr   c                 óH    |                       ¦   «         fd|D ¦   «         v S )z2Check that a header with a given value is present.c              3   óR   K   | ]!\  }}|k    Æ|                      ¦   «         V  "d S rw   r   )r   r   ŚvŚheader_values      r   r   z#header_has_value.<locals>.<genexpr>Ę   sF   ųč č  š #š #Łq!ŲŅŠš 	
		ŲŠŠŠš#š #r   r   )r   r   r(   s    ` r   Śheader_has_valuer   Ä   sB   ų ą×ŅŃŌš #š #š #š #Ų 'š#ń #ō #š š r   c                 óņ   |                       ¦   «         }d|_        |                     ¦   «          |                      d|¬¦  «        \  }}}t	          |dd         ¦  «        }|dk    sJ |dd         dk    sJ |t
                               ¦   «         k    sJ t          d	|¦  «        rJ |                      d
|¬¦  «        \  }}}t	          |dd         ¦  «        }|dk    sJ |dd         dk    sJ |t
                               ¦   «         k    sJ t          d	|¦  «        rJ |                      d|dg¬¦  «        \  }}}t	          |dd         ¦  «        }|dk    sJ |dd         dk    sJ |t
                               ¦   «         k    sJ t          d	d|¦  «        sJ t          j
        t          j        j        ¦  «        5  |                      d|¬¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z%Test persistent HTTP/1.1 connections.FrP   ©Ś	http_connNr   éČ   é   ŚOKŚ
ConnectionrQ   rR   )r¦   Śclose)r¢   r(   r§   )Śget_connectionŚ	auto_openŚconnectŚgetŚintr   rL   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Ō2OŲ %OŌŲ×ŅŃŌŠš 5@·O²OŲ/š 5Dń 5ō 5Ń1KŠ!1õ  B Q BŃ(Ō(MŲCŅŠŠŠŲqrr?dŅ"Š"Š"Š"Ųszz||Ņ+Š+Š+Š+Ż\Ø>Ń:Ō:Š:Š:Š:š 5@·O²OŲOš 5Dń 5ō 5Ń1KŠ!1õ  B Q BŃ(Ō(MŲCŅŠŠŠŲqrr?dŅ"Š"Š"Š"Ųszz||Ņ+Š+Š+Š+Ż\Ø>Ń:Ō:Š:Š:Š:š 5@·O²OŲOŲ(Š)š 5Dń 5ō 5Ń1KŠ!1õ  B Q BŃ(Ō(MŲCŅŠŠŠŲqrr?dŅ"Š"Š"Š"Ųszz||Ņ+Š+Š+Š+ŻLØ'°>ŃBŌBŠBŠBŠBõ 
t{Ō/Ń	0Ō	0š ;š ;ŲØ/Ń:Ō:Š:š;š ;š ;ń ;ō ;š ;š ;š ;š ;š ;š ;š ;ųųųš ;š ;š ;š ;š ;š ;s   ĒG,Ē,G0Ē3G0r   )FTc                 ó   |                       ¦   «         }d|_        |                     ¦   «          |                      d|¬¦  «        \  }}}t	          |dd         ¦  «        }|dk    sJ |dd         dk    sJ |t
                               ¦   «         k    sJ t          d	|¦  «        rJ |rt|                      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 nL|                      d|¬¦  «        \  }}}t          d|¦  «        rJ |dk    sJ |dd         dk    sJ |dk    sJ d}|D ]2\  }}	| 	                    ¦   «         dk    rt          |	¦  «        dk    rd}3|rt          d	d|¦  «        rJ net          d	d|¦  «        sJ t          j        t          j        j        ¦  «        5  |                      d|¬¦  «         ddd¦  «         n# 1 swxY w Y   |                      d|¬¦  «        \  }}}|dk    sJ |dd         dk    sJ |dk    sJ t          d|¦  «        rJ |                     ¦   «          dS )z;Test serving of streaming responses with HTTP/1.1 protocol.FrP   r”   Nr   r£   r¤   r„   r¦   ś/stream?set_cl=Yesr!   r§   śTransfer-Encodingó
   0123456789rT   ztransfer-encodingŚchunkedTr   )rØ   r©   rŖ   r«   r¬   r   rL   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Ō2OŲ %OŌŲ×ŅŃŌŠš 5@·O²OŲ/š 5Dń 5ō 5Ń1KŠ!1õ  B Q BŃ(Ō(MŲCŅŠŠŠŲqrr?dŅ"Š"Š"Š"Ųszz||Ņ+Š+Š+Š+Ż\Ø>Ń:Ō:Š:Š:Š:š š 3Fš 9DæŗŲ ØOš 9Hń 9
ō 9
Ń5^Š%5õ Š-Ø~Ń>Ō>Š>Š>Š>Ż# L°'ø>ŃJŌJŠJŠJŠJŻ Š!4°nŃEŌEŠEŠEŠEą Ņ#Š#Š#Š#Ų122 $Ņ&Š&Š&Š&Ų =Ņ0Š0Š0Š0Ń0š
 9DæŗŲ š 9Hń 9
ō 9
Ń5^Š%5õ !Š!1°>ŃBŌBŠBŠBŠBŲ Ņ#Š#Š#Š#Ų122 $Ņ&Š&Š&Š&Ų =Ņ0Š0Š0Š0ą ŠŲ"š 	,š 	,DAqŲwwyyŠ/Ņ/Š/Żq66YŅ&Š&Ų'+Š$ųąš 	CŻ'Ø°gø~ŃNŌNŠNŠNŠNŠNå# L°'ø>ŃJŌJŠJŠJŠJõ t{Ō7Ń8Ō8š Cš CŲ °/ŃBŌBŠBšCš Cš Cń Cō Cš Cš Cš Cš Cš Cš Cųųųš Cš Cš Cš Cš 9D×8HŅ8HŲ š 9Iń 9
ō 9
Ń5^Š%5š  Ņ#Š#Š#Š#Ų122 $Ņ&Š&Š&Š&Ų 3Ņ&Š&Š&Š&Ż Š!4°nŃEŌEŠEŠEŠEš ×ŅŃŌŠŠŠs   Ē1HČHČHc                 ó®   | j         j        }d| j         _        |                      ¦   «         }d|_        |                     ¦   «          |                      d|dgd¬¦  «        \  }}}t          |dd         ¦  «        }|dk    sJ |d	d         d
k    sJ |t                               ¦   «         k    sJ t          dd|¦  «        sJ |r|                      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 nß|                      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  |                      d|d¬¦  «         ddd¦  «         n# 1 swxY w Y   || j         _        |                     ¦   «          dS )z;Test serving of streaming responses with HTTP/1.0 protocol.śHTTP/1.0FrP   ©r¦   ś
Keep-Alive)r¢   r(   ŚprotocolNr   r£   r¤   r„   r¦   rÄ   rŗ   r¼   r!   r»   rT   ©r¢   rÅ   )r|   rÅ   rØ   r©   rŖ   r«   r¬   r   rL   r   r   r­   r®   rÆ   r°   r±   r§   )r   r   Śoriginal_server_protocolr³   r“   rµ   r¶   r·   s           r   Śtest_streaming_10rČ   I  sD   š  +Ō:ŌCŠŲ+5KŌŌ(š "×0Ņ0Ń2Ō2OŲ %OŌŲ×ŅŃŌŠš 5@·O²OŲ/Ų-Š.Ųš 5Dń 5ō 5Ń1KŠ!1õ
  B Q BŃ(Ō(MŲCŅŠŠŠŲqrr?dŅ"Š"Š"Š"Ųszz||Ņ+Š+Š+Š+ŻLØ,øŃGŌGŠGŠGŠGš š &š 9DæŗŲ ØOŲ1Š2Ųš 9Hń 9
ō 9
Ń5^Š%5õ
 KØØØOŃ,Ō,Ų Ņ#Š#Š#Š#Ų122 $Ņ&Š&Š&Š&Ų =Ņ0Š0Š0Š0åŠ-Ø~Ń>Ō>Š>Š>Š>Ż ØløNŃKŌKŠKŠKŠKŻ Š!4°nŃEŌEŠEŠEŠEŠEš 9DæŗŲ Ų1Š2Ųš 9Hń 9
ō 9
Ń5^Š%5õ
 KØØØOŃ,Ō,Ų Ņ#Š#Š#Š#Ų122 $Ņ&Š&Š&Š&Ų =Ņ0Š0Š0Š0å Š!1°>ŃBŌBŠBŠBŠBŻ# L°,ĄŃOŌOŠOŠOŠOŻ Š!4°nŃEŌEŠEŠEŠEõ ]4;Ō3Ń4Ō4š 	š 	ŲOOŲ /Ų#š ń ō š š	š 	š 	ń 	ō 	š 	š 	š 	š 	š 	š 	ųųųš 	š 	š 	š 	š ,DKŌŌ(š ×ŅŃŌŠŠŠs   ČH*Č*H.Č1H.Śhttp_server_protocolrĀ   zHTTP/1.1z)Fails under PyPy in CI for unknown reasonF)ŚreasonŚstrict)Śmarksc           	      ó<   | j         j        }|| j         _        d}|                      ¦   «         }d|_        |                     ¦   «          |                      d|¬¦  «        \  }}}t          |dd         ¦  «        }|dk    sJ |dd         d	k    sJ |t                               ¦   «         k    sJ t          d
|¦  «        rJ |                      ddg||¬¦  «        \  }}}t          |dd         ¦  «        }|dk    sJ |dd         d	k    sJ |t                               ¦   «         k    sJ t          d
d|¦  «        sJ t          d dj        di t          ¦   «         ¤|¦  «        sJ |                      d||¬¦  «        \  }}}t          |dd         ¦  «        }|dk    sJ |dd         d	k    sJ |t                               ¦   «         k    sJ t          d
|¦  «        rJ t          d|¦  «        rJ || j         _        |                     ¦   «          dS )z$Test Keep-Alive enabled connections.rĀ   FrR   )rÅ   Nr   r£   r¤   r„   r¦   rS   rĆ   ©r(   r¢   rÅ   rÄ   ś-timeout={test_client.server_instance.timeout}rĘ   r   )r|   rÅ   rØ   r©   rŖ   r«   r¬   r   rL   r   r   r   r   r§   )	r   rÉ   rĒ   Śhttp_client_protocolr³   r“   rµ   r¶   r·   s	            r   Śtest_keepaliverŃ     s”   š   +Ō:ŌCŠŲ+?KŌŌ(ą%Šš "×0Ņ0Ń2Ō2OŲ %OŌŲ×ŅŃŌŠš 5@·O²OŲŲ%š 5Dń 5ō 5Ń1KŠ!1õ  B Q BŃ(Ō(MŲCŅŠŠŠŲqrr?dŅ"Š"Š"Š"Ųszz||Ņ+Š+Š+Š+Ż\Ø>Ń:Ō:Š:Š:Š:š 5@·O²OŲŠ7Š8Ų!Š,@š 5Dń 5ō 5Ń1KŠ!1õ  B Q BŃ(Ō(MŲCŅŠŠŠŲqrr?dŅ"Š"Š"Š"Ųszz||Ņ+Š+Š+Š+ŻLØ,øŃGŌGŠGŠGŠGŻŲŲ>Š7Ō>ŠJŠJÅĮÄŠJŠJŲńō š š š š 5@·O²OŲOŲ%š 5Dń 5ō 5Ń1KŠ!1õ  B Q BŃ(Ō(MŲCŅŠŠŠŲqr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
¦  «         n# 1 swxY w Y    |d¦  «         t          j
        d¦  «          ||¦  «          |d¦  «         t          j
        d¦  «          |d¦  «         t          j        |¦  «        5   ||¦  «         d
d
d
¦  «         n# 1 swxY w Y    |d¦  «          ||¦  «          |d¦  «         t           j         _        |                     ¦   «          |                     ¦   «          |                     ¦   «          d
S )z*Test management of Keep-Alive connections.r   c                  óf                          ¦   «         } d| _        |                      ¦   «          | S )NF)rØ   r©   rŖ   )r³   r   s    r   Ś
connectionz2test_keepalive_conn_management.<locals>.connectionį  s4   ų ą%×4Ņ4Ń6Ō6Ų$)Ō!Ų×ŅŃ!Ō!Š!ŲŠr   Tc           	      óŖ                         ddg| d¬¦  «        \  }}}t          |d d         ¦  «        }|dk    sJ |dd          dk    sJ |t                               ¦   «         k    sJ |r?t	          d	d
|¦  «        sJ t	          d
 dj        di t          ¦   «         ¤|¦  «        sJ d S t          d	|¦  «        rJ t          d
|¦  «        rJ d S )NrS   rĆ   rĀ   rĪ   r   r£   r¤   r„   r¦   rÄ   rĻ   r   )r«   r¬   r   rL   r   r   r   r   )ŚconnŚ	keepaliver“   rµ   r¶   r·   r   s         r   Śrequestz/test_keepalive_conn_management.<locals>.requestč  s3  ų Ų8CæŗŲŠ;Š<Ų Zš 9Hń 9
ō 9
Ń5^Š%5õ KØØØOŃ,Ō,Ų Ņ#Š#Š#Š#Ų122 $Ņ&Š&Š&Š&Ų„3§:¢:”<¤<Ņ/Š/Š/Š/Ųš 
	CŻ# L°,ĄŃOŌOŠOŠOŠOŻ#ŲšŠ?Üš#š #Żš#š #ąń	ō š š š š š õ % \°>ŃBŌBŠBŠBŠBŻ$ \°>ŃBŌBŠBŠBŠBŠBŠBr   ē      š?c                 óŲ    t          j         ¦   «         |z   }	 j        j        j        }|| k    rd S t          j         ¦   «         |k    s"J  dj        di t          ¦   «         ¤f¦   «         S)NTz1idle conn count mismatch, wanted {count}, got {n}r   )Śtimer|   Ś_connectionsŚ_num_connectionsr   r   )Ścountrx   ŚdeadlineŚnr   s       r   Ścheck_server_idle_conn_countzDtest_keepalive_conn_management.<locals>.check_server_idle_conn_countż  s   ų Ż9;; Ń(š	ŲŌ+Ō8ŌIAŲEzzŲŻ9;; (Ņ*Š*Š*šŠCÜš#š #Żš#š #š-Ń*Ō*Š*š		r   r   F)r×   Ng333333ó?)T)rŁ   )r|   rx   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š Cš Cš Cš Cš Cš*	š 	š 	š 	š 	š 	õ 	Ō!ŻŌ%ŻŌ šŠš 
BŲGBKKKŲ Š  Ń#Ō#Š#š 
BŲGBKKKŲ Š  Ń#Ō#Š#š GBKKKŲ Š  Ń#Ō#Š#š
 
BŲGB%Š Ń Ō Š Ų Š  Ń#Ō#Š#õ 
Š(Ń	)Ō	)š š Ųšš š ń ō š š š š š š ųųųš š š š ą Š  Ń#Ō#Š#õ 	JsOOOš GBKKKŲ Š  Ń#Ō#Š#õ 	JsOOOŲ Š  Ń#Ō#Š#õ 
Š(Ń	)Ō	)š š Ųšš š ń ō š š š š š š ųųųš š š š ą Š  Ń#Ō#Š#š GBKKKŲ Š  Ń#Ō#Š#õ +2KŌŌ'š HHJJJŲHHJJJŲHHJJJJJs$   ĆC5Ć5C9Ć<C9Å(F Ę FĘF)Ś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                 óų  	
 dn | d¦  «        	|j         j        j        
	
fd                     |j         j        d¦  «         |                     ¦   «         }d|_        |                     ¦   «          |                     d¦  «         |                     d|j        z   	                    d¦  «        ¦  «         | 
                    ¦   «          t          d	t          rd
ndz  ¦  «        D ](}t          j        d¦  «         t          d¦  «        r n)	j        j        	u sJ n=t%          j        j        t&          j        ¦  «        sJ j        j        j        | k    sJ j        |u sJ dS )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                         | dj                             | j        ¬¦  «        ¦  «         5                      | j        dj                             ¬¦  «        ¦  «                              | j        d¦  «        _        	  | ¦  «         d_        d S # $ r d_        Y d S w xY w)NŚsocket)ŚwrapsŚshutdown)Śside_effectFT)r   Śmock_moduleŚMockrņ   ŚspyŚfin_spyŚexception_leaked)rj   Ś_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Ō6ń	
ō 	
š 	
š Š#Ų×ŅŲZŲŌ"×'Ņ'°LŠ'ŃAŌAńō š š (.§z¢z°$“+øzŃ'JŌ'JŠŌ$š	:Ų#Š# DŃ)Ō)Š)š 5:Š Ō1Š1Š1ųš #š 	9š 	9š 	9Ų48Š Ō1Š1Š1Š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ŚhostrL   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Ś  ųųųųųų šH $Š+Ų Š  Š/GŃHŌHš š
 	Ō#ÜŌ,š š
:š :š :š :š :š :š :š :š :š :š& ×ŅŲŌ#Ō3ŲŲńō š š ×%Ņ%Ń'Ō'DŲDNŲLLNNNŲIIŠ$Ń%Ō%Š%ŲIIzDIŃ%×-Ņ-ØgŃ6Ō6Ń7Ō7Š7ŲJJLLLõ 2kŠ0ØqŃ1Ń2Ō2š š Ż
3ŻŠ'Š);Ń<Ō<š 	ŲEš	š ŠŲ#Ō+Ō9ø\ŠIŠIŠIŠIŠIåŲ Ō(Ō6½¼ń
ō 
š 	
š 	
š 	
š $Ō+Ō9Ō?Ą<ŅOŠOŠOŠOąŌ0°OŠCŠCŠCŠCŠCŠCr   c                 ó`    d  fd}                       |j        j        j        d|¦  «         |                     ¦   «                              d¦  «         |                     ¦   «          |j        j        dd         }|j        j         	                    ¦   «          t          j        dft          j        dft          j        dff}t          |¦  «        t          |¦  «        k    sJ t          ||¦  «        D ]3\  \  }}\  }	}
}||
k    sJ t!          ||	¦  «        J |	d	|¦   «         4dS )
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        d¦  «                               | j        j        d¦  «          ¦   «          d S )Nr§   Śwrite)r   rÖ   ŚrfileŚwfile)rj   r  r   s    r   Ś_read_request_linezUtest_broken_connection_during_http_communication_fallback.<locals>._read_request_lineĢ  sR   ų Ų×ŅDIOØWŠ6MŃNŌNŠNŲ×ŅDIOØWŠ6MŃNŌNŠ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   rh   Śclearrs   r   rt   Ś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*  Ā  s  ųų š(š (š (š"š "š "š "š "š "š
 ×ŅŲŌ#Ō3ŌGŲŲńō š š ×ŅŃ Ō ×%Ņ%Š&7Ń8Ō8Š8Ų×ŅŃŌŠą'Ō1Ō7øøøŌ:ŠŲŌŌ"×(Ņ(Ń*Ō*Š*õ 
Š0Š1åLš'š	
õ Ōšš	
šŠõ$ Š!Ń"Ō"„cŠ*>Ń&?Ō&?Ņ?Š?Š?Š?õ
 
Š!Š#5Ń	6Ō	6š
š 
ń 	Ł4ŠŠ!3Ł/ZŠ)Ø3ą!Š%5Ņ5Š5Š5Š5ŻŠ 2°JŃ?Ō?ŠKŠKŲŠEŠEŠ.@ŠEŠEń LŌKŠKŠKš
š 
r   c                 ó   d }||j         j        d<   |                      ¦   «         }|                     ddd¬¦  «         |                     d|j        ¦  «         |                     ¦   «          |                     ¦   «          |j        j	        dd         }|j        j	         
                    ¦   «          t          j        dft          j        d	ft          j        d
ff}t          |¦  «        t          |¦  «        k    sJ t          ||¦  «        D ]3\  \  }}\  }	}
}||
k    sJ t!          ||	¦  «        J |	d|¦   «         4dS )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Ō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}   r`   rØ   Ś
putrequestŚ	putheaderr  Ś
endheadersr  r   rh   r  rs   ŚDEBUGrt   r  r   r!  )r   r   r"  r0  r¢   r#  r$  r%  r&  r'  r(  r)  s               r   Śtest_kb_int_from_http_handlerr9  ū  s   šMš Mš Mą3CNŌŌ$ ZŃ0ą×*Ņ*Ń,Ō,IŲ×Ņ 
°dŠŃ;Ō;Š;Ų×Ņ 	¤Ń/Ō/Š/Ų×ŅŃŌŠŲ×ŅŃŌŠą'Ō1Ō7øøøŌ:ŠŲŌŌ"×(Ņ(Ń*Ō*Š*õ MšNš	
õ MšBš	
õ LŲ1š	
šŠõ" Š!Ń"Ō"„cŠ*>Ń&?Ō&?Ņ?Š?Š?Š?õ
 
Š!Š#5Ń	6Ō	6š
š 
ń 	Ł4ŠŠ!3Ł/ZŠ)Ø3ą!Š%5Ņ5Š5Š5Š5ŻŠ 2°JŃ?Ō?ŠKŠKŲŠEŠEŠ.@ŠEŠEń LŌKŠKŠKš
š 
r   z@Fails under PyPy 3.6 under Ubuntu 20.04 in CI for unknown reasonc                 óü    G d dt           ¦  «        fd}||j        j        d<   |                      |j        j        d¦  «        }|                     ¦   «         }|                     ddd¬¦  «         |                     d	|j	        ¦  «         | 
                    ¦   «          |j        s	 |j        Æt          |j        j        ¦  «        d
k    sJ |j        j        d
k     r	 |j        j        d
k     °t          |j        j        ¦  «        d
k    sJ t!          d¦  «        |_        |j        j        rJ |                     ¦   «          |j        j        dd         }|j        j                             ¦   «          t,          j        dft,          j        dff}	t          |¦  «        t          |	¦  «        k    sJ t3          |	|¦  «        D ]3\  \  }
}\  }}}|
|k    sJ t5          ||¦  «        J |d|¦   «         4dS )z=Ensure worker threads are resilient to in-handler exceptions.c                   ó    e Zd ZdZdS )śAtest_unhandled_exception_in_request_handler.<locals>.SillyMistakez)A simulated crash within an HTTP handler.N©r\   r]   r^   r_   r   r   r   ŚSillyMistaker<  :  s        Ų7Š7Š7Š7r   r>  c                 ó     d¦  «        )Nu2   simulated unhandled exception š£ in test handlerr   )r.  r/  r>  s     r   Ś_trigger_scary_exczGtest_unhandled_exception_in_request_handler.<locals>._trigger_scary_exc=  s   ų ŲlŠOŃPŌPŠPr   z
/scary_excr§   r1  Tr2  r4  r    śtest requesting shutdownNu   ^Unhandled error while processing an incoming connection SillyMistake\('simulated unhandled exception š£ in test handler',?\)$ś"^SystemExit raised: shutting down$r  )ŚBaseExceptionr}   r`   rų   r|   r  rØ   r5  r6  r  r7  Ścalledr  ŚrequestsŚ_threadsŚidleŚ
SystemExitŚ	interruptr  r   rh   r  rs   ŚERRORrt   r   r!  )rż   r   r   r   r"  r@  Śserver_connection_close_spyr¢   r#  r$  r%  r&  r'  r(  r)  r>  s                  @r   Ś+test_unhandled_exception_in_request_handlerrL  +  s  ų š8š 8š 8š 8š 8}ń 8ō 8š 8šQš Qš Qš Qš Qš 6HNŌŌ$ \Ń2ą"(§*¢*ŲŌ#Ō3Ųń#ō #Šš
 ×*Ņ*Ń,Ō,IŲ×Ņ øŠŃ=Ō=Š=Ų×Ņ 	¤Ń/Ō/Š/Ų×ŅŃŌŠš
 *Ō0š Ųš *Ō0š õ ~Ō&Ō/Ń0Ō0°BŅ6Š6Š6Š6Ų
Ō
!Ō
&ØŅ
+Š
+Ųš Ō
!Ō
&ØŅ
+Š
+å~Ō&Ō/Ń0Ō0°BŅ6Š6Š6Š6Ż)Š*DŃEŌENŌŲŌ&Ō/Š/Š/Š/Ų×ŅŃŌŠą'Ō1Ō7øøøŌ:ŠŲŌŌ"×(Ņ(Ń*Ō*Š*õ MšKš	
õ LŲ0š	
šŠõ Š!Ń"Ō"„cŠ*>Ń&?Ō&?Ņ?Š?Š?Š?õ
 
Š!Š#5Ń	6Ō	6š
š 
ń 	Ł4ŠŠ!3Ł/ZŠ)Ø3ą!Š%5Ņ5Š5Š5Š5ŻŠ 2°JŃ?Ō?ŠKŠKŲŠEŠEŠ.@ŠEŠEń LŌKŠKŠKš
š 
r   c                 ó<    G d dt           ¦  «        |j        j        j        j        fd}|                     |j        j        j        d|¦  «         |                      |j        j        d¦  «        }t          |j        j	        ¦  «        dk    sJ | 
                    ¦   «                              d¦  «         |j        s	 |j        Æ|j        j        dk     r	 |j        j        dk     °t          |j        j	        ¦  «        dk    sJ t          d |j        j	        D ¦   «         ¦  «        sJ t          d	¦  «        |_        |j        j	        rJ |                     ¦   «          |j        j        d
d
         }|j        j                             ¦   «          t*          j        dft*          j        dff}t          |¦  «        t          |¦  «        k    sJ t1          ||¦  «        D ]3\  \  }	}
\  }}}|	|k    sJ t3          |
|¦  «        J |d|
¦   «         4d
S )z<Ensure worker threads are resilient to unhandled exceptions.c                   ó    e Zd ZdZdS )ś?test_remains_alive_post_unhandled_exception.<locals>.ScaryCrashz&A simulated crash during HTTP parsing.Nr=  r   r   r   Ś
ScaryCrashrO    s        Ų4Š4Š4Š4r   rP  c                 ó0     | ¦  «          d¦  «        r  r   )rj   rP  Ś_orig_read_request_lines    r   r  zGtest_remains_alive_post_unhandled_exception.<locals>._read_request_line  s"   ų ŲŠ Ń%Ō%Š%ŲjooŠr   r  r§   r    r  c              3   ó>   K   | ]}|                      ¦   «         V  d S rw   )Śis_alive)r   Śworker_threads     r   r   z>test_remains_alive_post_unhandled_exception.<locals>.<genexpr>¬  sB   č č  š š ąš 	×ŅŃ Ō šš š š š š r   rA  NzM^Unhandled error while processing an incoming connection ScaryCrash\(666,?\)$rB  r  )rC  r|   r  r  r  r   rų   r  rE  rF  rØ   r  rD  rG  ŚallrH  rI  r  r   rh   r  rs   rJ  rt   r   r!  )rż   r   r   r   r"  r  rK  r#  r$  r%  r&  r'  r(  r)  rP  rR  s                 @@r   Ś+test_remains_alive_post_unhandled_exceptionrW  v  sŹ  ųų š5š 5š 5š 5š 5]ń 5ō 5š 5š 	Ō#ÜŌ+Üš šš š š š š š ×ŅŲŌ#Ō3ŌGŲŲńō š š #)§*¢*ŲŌ#Ō3Ųń#ō #Šõ ~Ō&Ō/Ń0Ō0°BŅ6Š6Š6Š6ą×ŅŃ Ō ×%Ņ%Š&7Ń8Ō8Š8š
 *Ō0š Ųš *Ō0š š Ō
!Ō
&ØŅ
+Š
+Ųš Ō
!Ō
&ØŅ
+Š
+å~Ō&Ō/Ń0Ō0°BŅ6Š6Š6Š6Żš š ą+Ō4Ō=šń ō ń ō š š š õ  *Š*DŃEŌENŌŲŌ&Ō/Š/Š/Š/Ų×ŅŃŌŠą'Ō1Ō7øøøŌ:ŠŲŌŌ"×(Ņ(Ń*Ō*Š*õ Mš$š	
õ LŲ0š	
š
Šõ Š!Ń"Ō"„cŠ*>Ń&?Ō&?Ņ?Š?Š?Š?õ
 
Š!Š#5Ń	6Ō	6š
š 
ń 	Ł4ŠŠ!3Ł/ZŠ)Ø3ą!Š%5Ņ5Š5Š5Š5ŻŠ 2°JŃ?Ō?ŠKŠKŲŠEŠEŠ.@ŠEŠEń LŌKŠKŠKš
š 
r   Śtimeout_before_headers)TFc                 óĢ   |                       ¦   «         }d|_        |                     ¦   «          |sE|                     d¦  «         |                     d|j        z                       d¦  «        ¦  «         t          j        t          dz  ¦  «         | 	                    |j
        d¬¦  «        }|                     ¦   «          |j        dk    sJ |                     ¦   «          d	S )
zbCheck timeout without sending any data.

    The server will close the connection with a 408.
    Fr’   r   r  r   r1  ©Śmethodé  N)rØ   r©   rŖ   r  r  rL   rŪ   rä   rx   Śresponse_classŚsockŚbeginr8   r§   )r   rX  rÖ   Śresponses       r   Śtest_HTTP11_Timeoutra  Ļ  sŃ    š ×%Ņ%Ń'Ō'DŲDNŲLLNNNą!š <ą		Š(Ń)Ō)Š)Ų		: ¤	Ń)×1Ņ1°'Ń:Ō:Ń;Ō;Š;õ 	Jw{ŃŌŠš ×"Ņ" 4¤9°UŠ"Ń;Ō;HŲNNŃŌŠŲ?cŅ!Š!Š!Š!ŲJJLLLLLr   c                 ó   d}|                       ¦   «         }|                     ddt          z  d¬¦  «         |                     d|j        ¦  «         |                     ¦   «          |                     |j        d¬¦  «        }|                     ¦   «          |j	        dk    sJ | 
                    ¦   «         }t          t          ¦  «                             ¦   «         }||k    sJ |                     d	¦  «         |                     d
|j        z                       d¦  «        ¦  «         |                     ¦   «          |                     |j        d¬¦  «        }|                     ¦   «          |j	        dk    sJ | 
                    ¦   «         }d}||k    sJ t          j        t          dz  ¦  «         |                     d	¦  «         |                     d
|j        z                       d¦  «        ¦  «         |                     ¦   «          |                     |j        d¬¦  «        }	 |                     ¦   «          |j	        dk    r)t#          j        || 
                    ¦   «         z  ¦  «         nO# t&          j        t*          j        j        f$ r Y n-t0          $ r!}t#          j        ||z  ¦  «         Y d}~nd}~ww xY w|                     ¦   «          |                       ¦   «         }|                     ddd¬¦  «         |                     d|j        ¦  «         |                     ¦   «          |                     |j        d¬¦  «        }|                     ¦   «          |j	        dk    sJ | 
                    ¦   «         }t4                               ¦   «         }||k    sJ |                     d	¦  «         t          j        t          dz  ¦  «         |                     |j        d¬¦  «        }	 |                     ¦   «          |j	        dk    r)t#          j        || 
                    ¦   «         z  ¦  «         nO# t&          j        t*          j        j        f$ r Y n-t0          $ r!}t#          j        ||z  ¦  «         Y d}~nd}~ww xY w|                     ¦   «          |                       ¦   «         }|                     ddd¬¦  «         |                     d|j        ¦  «         |                     ¦   «          |                     |j        d¬¦  «        }|                     ¦   «          |j	        dk    sJ | 
                    ¦   «         }t4                               ¦   «         }||k    sJ |                     ¦   «          dS )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: %sr1  z/timeout?t=%sTr2  r4  rZ  r£   r’   r   r  ó   Hello, world!r   r\  NrP   )rØ   r5  rx   r6  r  r7  r]  r^  r_  r8   r1   r$   rL   Ś_outputŚ_send_outputrŪ   rä   r­   Śfailrņ   r	  rÆ   r°   rā   Ś	Exceptionr§   r   r  )r   Śfail_msgrÖ   r`  Śactual_bodyŚexpected_bodyŚexs          r   Ś!test_HTTP11_Timeout_after_requestrl  ļ  s4   š
 OHš ×%Ņ%Ń'Ō'DŲOOE?­WŃ4ĄOŃEŌEŠEŲNN649Ń%Ō%Š%ŲOOŃŌŠŲ×"Ņ" 4¤9°UŠ"Ń;Ō;HŲNNŃŌŠŲ?cŅ!Š!Š!Š!Ų--//KŻLL×'Ņ'Ń)Ō)MŲ-Ņ'Š'Š'Š'š 	LLŠ'Ń(Ō(Š(ŲLL*tyŃ(×0Ņ0°Ń9Ō9Ń:Ō:Š:Ų×ŅŃŌŠŲ×"Ņ" 4¤9°UŠ"Ń;Ō;HŲNNŃŌŠŲ?cŅ!Š!Š!Š!Ų--//KŲ$MŲ-Ņ'Š'Š'Š'õ 	Jw{ŃŌŠš 	LLŠ'Ń(Ō(Š(ŲLL*tyŃ(×0Ņ0°Ń9Ō9Ń:Ō:Š:Ų×ŅŃŌŠŲ×"Ņ" 4¤9°UŠ"Ń;Ō;Hš4ŲŃŌŠš ?cŅ!Š!ŻK 8§=¢=”?¤?Ń2Ń3Ō3Š3ųųõ L$+Ō3Š4š š š ŲŻš #š #š #ŻHrMŃ"Ō"Š"Š"Š"Š"Š"Š"ųųųųš#ųųųš 	JJLLLš ×%Ņ%Ń'Ō'DŲOOE6ØTOŃ2Ō2Š2ŲNN649Ń%Ō%Š%ŲOOŃŌŠŲ×"Ņ" 4¤9°UŠ"Ń;Ō;HŲNNŃŌŠŲ?cŅ!Š!Š!Š!Ų--//KŻJJLLMŲ-Ņ'Š'Š'Š'š 	IIŠ$Ń%Ō%Š%åJw{ŃŌŠŲ×"Ņ" 4¤9°UŠ"Ń;Ō;Hš4ŲŃŌŠš ?cŅ!Š!ŻK 8§=¢=”?¤?Ń2Ń3Ō3Š3ųųõ L$+Ō3Š4š š š ŲŻš #š #š #ŻHrMŃ"Ō"Š"Š"Š"Š"Š"Š"ųųųųš#ųųųš 	JJLLLš ×%Ņ%Ń'Ō'DŲOOE6ØTOŃ2Ō2Š2ŲNN649Ń%Ō%Š%ŲOOŃŌŠŲ×"Ņ" 4¤9°UŠ"Ń;Ō;HŲNNŃŌŠŲ?cŅ!Š!Š!Š!Ų--//KŻJJLLMŲ-Ņ'Š'Š'Š'ŲJJLLLLLs<   Č+I4 É4 K Ź	K ŹJ;Ź;K Ļ2P; Š; RŃ	RŃ&RŅRc                 ó   |                       ¦   «         }|                     ddd¬¦  «         |                     d|j        ¦  «         |                     ¦   «          t          d¦  «        D ]ė}|                     d|z                       d¦  «        ¦  «         |                     d	|j        z                       d
¦  «        ¦  «         |                     ¦   «          | 	                    |j
        d¬¦  «        }|j
                             dd¦  «        |_        |                     ¦   «          |                     d¦  «        }|j        dk    sJ |dk    sJ ģ| 	                    |j
        d¬¦  «        }|                     ¦   «          |                     ¦   «         }|j        dk    sJ |dk    sJ |                     ¦   «          dS )zXTest HTTP/1.1 pipelining.

    :py:mod:`http.client` doesn't support this directly.
    r1  rO   Tr2  r4  é   zGET /hello?%s HTTP/1.1z
iso-8859-1r   r  rZ  Śrbr   é   r£   rc  N)rØ   r5  r6  r  r7  r#   rd  rL   re  r]  r^  ŚmakefileŚfpr_  r1   r8   r§   )r   rÖ   Śtrialr`  Śbodys        r   Śtest_HTTP11_pipeliningru  M  sĄ   š
 ×%Ņ%Ń'Ō'Dš 	OOE8ØtOŃ4Ō4Š4ŲNN649Ń%Ō%Š%ŲOOŃŌŠåqš (š (ąŲ%ØŃ-×5Ņ5°lŃCŌCń	
ō 	
š 	
š 	j 4¤9Ń,×4Ņ4°WŃ=Ō=Ń>Ō>Š>Ų×ŅŃŌŠš ×&Ņ& t¤yøŠ&Ń?Ō?š
 i×(Ņ(ØØqŃ1Ō1ŲŃŌŠŲ}}RŃ Ō Ų #Ņ%Š%Š%Š%ŲŠ'Ņ'Š'Š'Š'Š'š ×"Ņ" 4¤9°UŠ"Ń;Ō;HŲNNŃŌŠŲ==??DŲ?cŅ!Š!Š!Š!ŲŠ#Ņ#Š#Š#Š#ąJJLLLLLr   c                 óp   |                       ¦   «         }|                     ddd¬¦  «         |                     d|j        ¦  «         |                     dd¦  «         |                     dd	¦  «         |                     ¦   «          |                     d
¦  «         |                     |j        d¬¦  «        }|                     ¦   «         \  }}}|dk    sJ | 	                    ¦   «          | 
                    ¦   «          |                     ddd¬¦  «         |                     d|j        ¦  «         |                     dd¦  «         |                     dd¦  «         |                     dd¦  «         |                     ¦   «          |                     |j        d¬¦  «        }|                     ¦   «         \  }}}|dk    sJ 	 |j                             ¦   «                              ¦   «         }|rt          j        d|z  ¦  «         nnGd}	|                     |	¦  «         |                     ¦   «          t#          j        |¦  «        \  }
}}t'          |
dd         ¦  «        }|dk    sJ d|	                     ¦   «         d                     ¦   «         }||k    sJ | 	                    ¦   «          dS )z$Test 100-continue header processing.r,   rU   Tr2  r4  śContent-Typeś
text/plainr!   Ś4s   d'ohrZ  éd   Ś17ŚExpectś100-continuez2100 Continue should not output any headers. Got %ró   I am a small fileNr   r£   r.   r/   )rØ   r5  r6  r  r7  r  r]  r^  Ś_read_statusr§   rŖ   rr  ŚreadlineŚstripr­   rf  r_  r   Śshbr¬   r2   rL   )r   rÖ   r`  Ś_versionr8   Ś_reasonŚversionrŹ   Ślinert  r“   Ś_actual_headersr¶   r·   Śexpected_resp_bodys                  r   Śtest_100_Continuer  w  s¬   ą×%Ņ%Ń'Ō'Dš
 	OOFI°OŃ6Ō6Š6ŲNN649Ń%Ō%Š%ŲNN> <Ń0Ō0Š0ŲNNŠ# SŃ)Ō)Š)ŲOOŃŌŠŲIIgŃŌŠŲ×"Ņ" 4¤9°VŠ"Ń<Ō<HŲ (× 5Ņ 5Ń 7Ō 7ŃHfgŲS====ŲJJLLLš 	LLNNNŲOOFI°OŃ6Ō6Š6ŲNN649Ń%Ō%Š%ŲNN> <Ń0Ō0Š0ŲNNŠ# TŃ*Ō*Š*ŲNN8^Ń,Ō,Š,ŲOOŃŌŠŲ×"Ņ" 4¤9°VŠ"Ń<Ō<Hš '×3Ņ3Ń5Ō5ŃGVVŲS====šŲ{×#Ņ#Ń%Ō%×+Ņ+Ń-Ō-Ųš 	ŻKŲDŲńńō š š š
 šš  DŲIIdOOOš NNŃŌŠŻ5<“[ĄŃ5JŌ5JŃ2KŠ"2Ż B Q BŃ(Ō(MŲCŅŠŠŠŲ;ØÆŖ©¬Š;Š;Š;×BŅBŃDŌDŠŲŠ1Ņ1Š1Š1Š1ŲJJLLLLLr   r~   )r   r{   c                 ó|   | j         j        }|| j         _        |                      ¦   «         }|                     ddd¬¦  «         |                     d|j        ¦  «         |                     dd¦  «         |                     dd	¦  «         |                     d
d¦  «         |                     ¦   «          |                     |j        d¬¦  «        }| 	                    ¦   «         \  }}}|dk    sJ d}|r-|j
                             ¦   «                              ¦   «         }|°-|                     d¦  «         |                     ¦   «          t          j        |¦  «        \  }	}
}t#          |	dd         ¦  «        }|dk    sJ |                     d¦  «         |                     d|j        z                       d¦  «        ¦  «         |                     d¦  «         |                     d¦  «         |                     d¦  «         |                     ¦   «          |                     |j        d¬¦  «        }| 	                    ¦   «         \  }}}|dk    sJ d}|r-|j
                             ¦   «                              ¦   «         }|°-d}|                     |¦  «         |                     ¦   «          t          j        |¦  «        \  }	}}t#          |	dd         ¦  «        }|dk    sJ d|                     ¦   «         d                     ¦   «         }||k    sJ |                     ¦   «          || j         _        dS )z9Test a max_request_body_size of 0 (the default) and 1001.r,   rX   Tr2  r4  rw  rx  r!   Ś1000r|  r}  rZ  rz  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Ø   r5  r6  r  r7  r]  r^  r  rr  r  r  r  r_  r   r  r¬   rd  rL   re  r2   r§   )r   r~   Śold_maxrÖ   r`  r  r8   r  Śskipr“   r  r¶   r·   r  rŹ   rt  rµ   r  s                     r   Śtest_readall_or_closer  ®  s;   š Ō)Ō?Gą8MKŌŌ5ą×%Ņ%Ń'Ō'Dš 	OOFŠ.ø$OŃ?Ō?Š?ŲNN649Ń%Ō%Š%ŲNN> <Ń0Ō0Š0ŲNNŠ# VŃ,Ō,Š,ŲNN8^Ń,Ō,Š,ŲOOŃŌŠŲ×"Ņ" 4¤9°VŠ"Ń<Ō<Hš !)× 5Ņ 5Ń 7Ō 7ŃHfgŲS====ŲDŲ
š .Ų{×#Ņ#Ń%Ō%×+Ņ+Ń-Ō-š š .š 	IIkŃŌŠš NNŃŌŠŻ5<“[ĄŃ5JŌ5JŃ2KŠ"2Ż B Q BŃ(Ō(MŲCŅŠŠŠš 	LLŠ)Ń*Ō*Š*ŲLL*tyŃ(×0Ņ0°Ń9Ō9Ń:Ō:Š:ŲLLŠ,Ń-Ō-Š-ŲLLŠ&Ń'Ō'Š'ŲLLŠ(Ń)Ō)Š)Ų×ŅŃŌŠŲ×"Ņ" 4¤9°VŠ"Ń<Ō<Hš '×3Ņ3Ń5Ō5ŃGVVŲS====ŲDŲ
š .Ų{×#Ņ#Ń%Ō%×+Ņ+Ń-Ō-š š .š  DŲIIdOOOš NNŃŌŠŻ4;“KĄŃ4IŌ4IŃ1KŠ!1Ż B Q BŃ(Ō(MŲCŅŠŠŠŲ;ØÆŖ©¬Š;Š;Š;×BŅBŃDŌDŠŲŠ1Ņ1Š1Š1Š1ŲJJLLLą8?KŌŌ5Š5Š5r   c                 ó   |                       ¦   «         }d|_        |                     ¦   «          |                      d|¬¦  «        \  }}}t	          |dd         ¦  «        }|dk    sJ |dd         dk    sJ |t
                               ¦   «         k    sJ t          d	|¦  «        rJ |                      d
|¬¦  «        \  }}}t	          |dd         ¦  «        }|dk    sJ t          d|¦  «        rJ |dk    sJ t          d	|¦  «        rJ |                      d|¬¦  «        \  }}}t	          |dd         ¦  «        }|dk    sJ t          d|¦  «        rJ |dk    sJ t          d	|¦  «        rJ |                     ¦   «          dS )z.Test HTTP queries with an empty response body.FrP   r”   Nr   r£   r¤   r„   r¦   rV   éĢ   r!   r   rW   i0  )	rØ   r©   rŖ   r«   r¬   r   rL   r   r§   r²   s         r   Śtest_No_Message_Bodyr  ö  s    š "×0Ņ0Ń2Ō2OŲ %OŌŲ×ŅŃŌŠš 5@·O²OŲ/š 5Dń 5ō 5Ń1KŠ!1õ  B Q BŃ(Ō(MŲCŅŠŠŠŲqrr?dŅ"Š"Š"Š"Ųszz||Ņ+Š+Š+Š+Ż\Ø>Ń:Ō:Š:Š:Š:š 5@·O²OŲ š 5Dń 5ō 5Ń1KŠ!1õ  B Q BŃ(Ō(MŲCŅŠŠŠŻŠ-Ø~Ń>Ō>Š>Š>Š>ŲsŅ"Š"Š"Š"Ż\Ø>Ń:Ō:Š:Š:Š:š 5@·O²OŲ š 5Dń 5ō 5Ń1KŠ!1õ  B Q BŃ(Ō(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                 óZ   |                       ¦   «         }d}|                     ddd¬¦  «         |                     d|j        ¦  «         |                     dd¦  «         |                     d	d
¦  «         |                     dd¦  «         |                     ¦   «          |                     |¦  «         |                     ¦   «         }t          j        |¦  «        \  }}}t          |dd         ¦  «        }|dk    sJ |dd         dk    sJ ddz   
                    ¦   «         }||k    sJ d                     d¦  «        }|                     ddd¬¦  «         |                     d|j        ¦  «         |                     dd¦  «         |                     d
d¦  «         |                     ¦   «          |                     |¦  «         |                     ¦   «         }t          j        |¦  «        \  }}	}t          |dd         ¦  «        }|dk    sJ |                     ¦   «          dS )z1Test HTTP uploads with chunked transfer-encoding.sF   8;key=value
xx
xxxx
5
yyyyy
0
Content-Type: application/json

r,   rU   Tr2  r4  r»   r½   ŚTrailerrw  r!   Ś3Nr   r£   r¤   r„   zthanks for '%s's   xx
xxxxyyyyys   
)s   3e3sć  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxó   0r   r   rx  é  )rØ   r5  r6  r  r7  r  Śgetresponser   r  r¬   rL   r  r§   )
r   rÖ   rt  r`  r“   r  r¶   r·   r  rµ   s
             r   Śtest_Chunked_Encodingr    s*   š ×%Ņ%Ń'Ō'Dš	š 	š
 	OOFI°OŃ6Ō6Š6ŲNN649Ń%Ō%Š%ŲNNŠ&Ø	Ń2Ō2Š2ŲNN9nŃ-Ō-Š-š 	NNŠ# SŃ)Ō)Š)ŲOOŃŌŠŲIIdOOOŲ×ŅŃ!Ō!HŻ5<“[ĄŃ5JŌ5JŃ2KŠ"2Ż B Q BŃ(Ō(MŲCŅŠŠŠŲqrr?dŅ"Š"Š"Š"Ų+Š.@Ń@×HŅHŃJŌJŠŲŠ1Ņ1Š1Š1Š1š <<Š<Ń=Ō=DŲOOFI°OŃ6Ō6Š6ŲNN649Ń%Ō%Š%ŲNNŠ&Ø	Ń2Ō2Š2ŲNN> <Ń0Ō0Š0š 	OOŃŌŠŲIIdOOOŲ×ŅŃ!Ō!HŻ4;“KĄŃ4IŌ4IŃ1KŠ!1Ż B Q BŃ(Ō(MŲCŅŠŠŠŲJJLLLLLr   c                 óę   |                       ¦   «         }|                     ddd¬¦  «         |                     d|j        ¦  «         |                     dd¦  «         |                     dd	¦  «         |                     ¦   «          |                     ¦   «         }t          j        |¦  «        \  }}}t          |d
d         ¦  «        }|dk    sJ d}||k    sJ | 	                    ¦   «          d
S )zTry a non-chunked request where Content-Length exceeds limit.

    (server.max_request_body_size).
    Assert error before body send.
    r,   rU   Tr2  r4  rw  rx  r!   Ś9999Nr   r  sC   The entity sent with the request exceeds the maximum allowed bytes.)
rØ   r5  r6  r  r7  r  r   r  r¬   r§   )r   rÖ   r`  r“   r  r¶   r·   r  s           r   Śtest_Content_Length_inr  W  sł    š ×%Ņ%Ń'Ō'DąOOFI°OŃ6Ō6Š6ŲNN649Ń%Ō%Š%ŲNN> <Ń0Ō0Š0ŲNNŠ# VŃ,Ō,Š,ŲOOŃŌŠŲ×ŅŃ!Ō!HŻ5<“[ĄŃ5JŌ5JŃ2KŠ"2Ż B Q BŃ(Ō(MŲCŅŠŠŠš	&š š Š1Ņ1Š1Š1Š1ŲJJLLLLLr   c                 ó    |                       dddg¬¦  «        \  }}}t          |dd         ¦  «        }|dk    sJ |dk    sJ dS )	z6Test that malicious Content-Length header returns 400.rU   )rw  rx  )r!   znot-an-integerrG   Nr   i  s    Malformed Content-Length Header.)Śpostr¬   )r   r“   r  r¶   r·   s        r   Śtest_Content_Length_not_intr  q  ss    ą5@×5EŅ5EŲą*Ų0š
š 6Fń 6ō 6Ń2KŠ"2õ  B Q BŃ(Ō(MąCŅŠŠŠŲŠBŅBŠBŠBŠBŠBŠBr   )ŚuriŚexpected_resp_statusr  ))rZ   r  sL   The requested resource returned more bytes than the declared Content-Length.)r[   r£   s   I tooc                 óŅ   |                       ¦   «         }|                     d|d¬¦  «         |                     d|j        ¦  «         |                     ¦   «          |                     ¦   «         }t          j        |¦  «        \  }}}t          |dd         ¦  «        }	|	|k    sJ ||k    sJ | 	                    ¦   «          | j
        j        j                             d¦  «         dS )z_Test response with Content-Length less than the response body.

    (non-chunked response)
    r1  Tr2  r4  Nr   )z@ValueError('Response body exceeds the declared Content-Length.')zAValueError('Response body exceeds the declared Content-Length.',))rØ   r5  r6  r  r7  r  r   r  r¬   r§   r|   r   ri   Śextend)
r   r   r”  r  rÖ   r`  r“   r  r¶   r·   s
             r   Śtest_Content_Length_outr¤    só    š* ×%Ņ%Ń'Ō'DŲOOE3Ø$OŃ/Ō/Š/ŲNN649Ń%Ō%Š%ŲOOŃŌŠą×ŅŃ!Ō!HŻ5<“[ĄŃ5JŌ5JŃ2KŠ"2Ż B Q BŃ(Ō(MąŠ0Ņ0Š0Š0Š0ŲŠ1Ņ1Š1Š1Š1ąJJLLLš
 ŌŌ)Ō6×=Ņ=š ?ń ō š š š r   zbSometimes this test fails due to low timeout. Ref: https://github.com/cherrypy/cherrypy/issues/598c                 óÖ   |                       ¦   «         }t          j                             dd|j        d|j        d¦  «        }|                     d¦  «        }t          j        t          dz  ¦  «         d}|r1|                     |¦  «        }|sn||z  }|t          |¦  «        z  }|°1t          |¦  «        dk    sJ |d	d
z  k    sJ |dk    sJ |                     ¦   «          dS )z5Test serving large file with a read timeout in place.rÆ   z://ś:rY   i   g333333ć?i ž i   s   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarC   r   N)rØ   ŚurllibrŲ   Śurlopenr  Śportr1   rŪ   rä   rx   r  r§   )r   rÖ   Śremote_data_connŚbufŚ	remainingŚdatas         r   Śtest_598r®  ®  s   š ×%Ņ%Ń'Ō'DŻ~×-Ņ-ą664999diiiš	)ńō Šš ×
Ņ
 Ń
$Ō
$CŻJw}ŃŌŠŲ#IŲ
š Ų×$Ņ$ YŃ/Ō/Ųš 	ŲŲtŲSYYŃ	š š õ s88{Ņ"Š"Š"Š"Ų+ Ń$Ņ$Š$Š$Š$Ų>>>>Ų×ŅŃŌŠŠŠr   Śinvalid_terminator)s   

s   

c                 ó"   |                       ¦   «         }|                     d|z  ¦  «         |                     |j        d¬¦  «        }|                     ¦   «          |                     ¦   «         }d}||k    sJ |                     ¦   «          dS )z1Test HTTP queries with no valid CRLF terminators.s   GET /hello HTTP/1.1%sr1  rZ  s   HTTP requires CRLF terminatorsN)rØ   r  r]  r^  r_  r1   r§   )r   rÆ  rÖ   r`  r¶   r  s         r   Śtest_No_CRLFr±  Ź  s    š ×%Ņ%Ń'Ō'DąIIŠ&Š);Ń;Ń<Ō<Š<Ų×"Ņ" 4¤9°UŠ"Ń;Ō;HŲNNŃŌŠŲ}}ŠŲ:ŠŲŠ1Ņ1Š1Š1Š1ŲJJLLLLLr   c                   ó    e Zd ZdZd Zd ZdS )ŚFaultySelectz:Mock class to insert errors in the selector.select method.c                 ó0    || _         d| _        d| _        dS )z:Initilize helper class to wrap the selector.select method.FN)Śoriginal_selectŚrequest_servedŚos_error_triggered)rj   rµ  s     r   rk   zFaultySelect.__init__ā  s     ą.ŌŲ#ŌŲ"'ŌŠŠr   c                 óf    | j         rd| _        t          d¦  «        |                      |¦  «        S )z'Intercept the calls to selector.select.Tz(Error while selecting the client socket.)r¶  r·  ŚOSErrorrµ  )rj   rx   s     r   rr   zFaultySelect.__call__č  s9    ąŌš 	FŲ&*DŌ#ŻŠDŃEŌEŠEą×#Ņ# GŃ,Ō,Š,r   N©r\   r]   r^   r_   rk   rr   r   r   r   r³  r³  ß  s8        ŲDŠDš(š (š (š-š -š -š -š -r   r³  c                   ó    e Zd ZdZd Zd ZdS )ŚFaultyGetMapz;Mock class to insert errors in the selector.get_map method.c                 ó0    || _         d| _        d| _        dS )z;Initilize helper class to wrap the selector.get_map method.FN)Śoriginal_get_mapŚsabotage_connŚconn_closed)rj   r¾  s     r   rk   zFaultyGetMap.__init__ō  s     ą 0ŌŲ"ŌŲ ŌŠŠr   c                 óź    | j         r7| j        s0d |                      ¦   «                              ¦   «         D ¦   «         nd}|D ]}|                     ¦   «          d| _        |                      ¦   «         S )z(Intercept the calls to selector.get_map.c              3   óh   K   | ]-\  }\  }}}}t          |t          j        j        ¦  «        Æ)|V  .d S rw   )r  ŚcherootŚserverŚHTTPConnection)r   r   rÖ   s      r   r   z(FaultyGetMap.__call__.<locals>.<genexpr>ü  sW   č č  š 
š 
Ł'QAq $Ż$„¤Ō =Ń>Ō>š
Ųš
š 
š 
š 
š 
š 
r   r   T)ræ  rĄ  r¾  Śitemsr§   )rj   Śsabotage_targetsrÖ   s      r   rr   zFaultyGetMap.__call__ś  s    š
 ŌšAš )-Ō(8šAš 
š 
Ų+/×+@Ņ+@Ń+BŌ+B×+HŅ+HŃ+JŌ+Jš
ń 
ō 
š 
š ?Aš 	š
 %š 	$š 	$DąJJLLLŲ#DŌŠą×$Ņ$Ń&Ō&Š&r   Nrŗ  r   r   r   r¼  r¼  ń  s8        ŲEŠEš!š !š !š'š 'š 'š 'š 'r   r¼  c                 ó   t          | j        j        j        j        ¦  «        }|                     | j        j        j        d|¦  «         t          | j        j        j        j        j        ¦  «        }|                     | j        j        j        j        d|¦  «         |                      ddg¬¦  «        \  }}}|dk    sJ dx|_	        |_
        t          j        | j        j        dz  ¦  «         |j        sJ |j        sJ d	S )
zTest the error handling segment of HTTP connection selection.

    See :py:meth:`cheroot.connections.ConnectionManager.get_conn`.
    ŚselectŚget_maprQ   rĆ   rG   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Ņ  	  s/   õ ŲŌ#Ō0Ō:ŌAńō Kš ×ŅŲŌ#Ō0Ō:ŲŲńō š õ  ŲŌ#Ō0Ō:ŌDŌLńō Lš ×ŅŲŌ#Ō0Ō:ŌDŲŲńō š š .9×-@Ņ-@ŲŠ7Š8š .Ań .ō .Ń*K 
š (Ņ"Š"Š"Š"ą>BŠBLŌ Ō!;åJ{Ō*Ō>ĄŃBŃCŌCŠCŲŌ)Š)Š)Š)ŲŌ#Š#Š#Š#Š#Š#r   )Qr_   r
  Śrer   r!  rņ   ŚsysrŪ   rs   rf   rn   Ścollectionsr   Śhttp.clientrÆ   Śurllib.requestr§  r­   Śjaraco.textr   r   Ścheroot.testr   r   Ścheroot._compatr	   r
   r   r   Ścheroot.serverrĆ  Śversion_infoŚIS_PY36r  rx   r   r   rb   Śfixturer   r   r   r   r   rø   ŚmarkŚparametrizerĄ   rČ   ŚparamŚxfailrŃ   ré   r	  Ś
ECONNRESETŚEPIPEŚENOTCONNŚ	ESHUTDOWNŚRuntimeErrorr  ŚBrokenPipeErrorr  r*  r9  rL  rW  ra  rl  ru  r  r  r  r  r  r  r¤  r®  r±  r³  r¼  rŅ  r   r   r   ś<module>ré     sä  šŲ KŠ Ką Ų (Š (Š (Š (Š (Š (Ų Ų 



Ų Ų Ų Š Š Š Ų "Š "Š "Š "Š "Š "Ų Š Š Š Ų Š Š Š ą Ų $Š $Š $Š $Š $Š $Š $Š $ą (Š (Š (Š (Š (Š (Š (Š (Ų @Š @Š @Š @Š @Š @Š @Š @Š @Š @Š @Š @Ų Š Š Š š Ō
2A2Ō
 &Ņ
(ŲŠ$*š Ų0šSš Sš Sš Sš SŌ"ń Sō Sš SšlMš Mš Mš Mš Mń Mō Mš Mš0 šš ń šš" š
š 
ń š
š4 š(š (ń š(š
Dš Dš Dš
š š š(;š (;š (;šV ×ŅŲšńō šHš Hńō šHšV ×ŅŲšńō šBš Bńō šBšJ ×ŅŲąŲŲŲ+×#Ņ#ŲŠ!EŲBŲš $ń ō š	
ń 	
ō 	
š
ńō š7š 7ńō š7šteš eš ešP ×ŅŲ>ąŲL%Ō*ØEŲ)š	
ń 	
ō 	
š 	ŲL%+ uŲ$š	
ń 	
ō 	
š 	ŲL%.Ø%Ų1š	
ń 	
ō 	
š 	ŲŲNEŲ,Ų+×#Ņ#ŲŲ=š $ń ō š		
ń 	
ō 	
š 	ŲL%/Ø5Ų(š	
ń 	
ō 	
š 	\ 3ØŠ1DŠEŃEŌEŲV\ 2 tŠ0BŠCŃCŌCš7š: 	Ų  %Ō"2°EŲ1š	
ń 	
ō 	
š 	ŲU[Ø%Ų'š	
ń 	
ō 	
š 	ŲU_ØeŲ+š	
ń 	
ō 	
š	ń9)ń,ō ,šZMDš MDń[,ō ,šZMDš`6
š 6
š 6
šr-
š -
š -
š` ×ŅŲ	Š5gŠ5'Š5Ø+ oŲMąš	 ń ō šB
š B
ńō šB
šJ ×ŅŲ	Š5gŠ5'Š5Ø+ oŲMąš	 ń ō šP
š P
ńō šP
šf ×ŅŲšńō šš ńō šš2[š [š [š|'š 'š 'šT4š 4š 4šn ×ŅŲšńō š>@š >@ńō š>@šB&š &š &šR ×ŅŲ6Ųš ń 	ō 	ńō š ń ō š,š ,ńō š,š^š š š4Cš Cš Cš ×ŅŲ9š	ńō šš ńō ššB ×ŅšBš ń ō šš ń	ō šš0 ×ŅŲšńō šš ńō šš-š -š -š -š -ń -ō -š -š$'š 'š 'š 'š 'ń 'ō 'š 'š0&$š &$š &$š &$š &$r   