§
    Étºf²¤ ã                   ó^  — d Z ddlZddlmZmZ ddlmZmZmZm	Z	 ddl
mZ ddlmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZmZmZmZmZmZm Z  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'm(Z(m)Z) ddl*m+Z+ n# e,$ r dZ!Y nw xY w G d„ d¦  «        Z- G d„ d¦  «        Z.d.d„Z/d.d„Z0d„ Z1 G d„ dej2        ¦  «        Z3 e e3¦  «        Z4 G d„ dej2        ¦  «        Z5 e e5¦  «        Z6 G d„ de5¦  «        Z7 e e7¦  «        Z8 G d„ dej2        ¦  «        Z9 e e9¦  «        Z: G d „ d!¦  «        Z; e e;¦  «        Z< G d"„ d#¦  «        Z= G d$„ d%ej>        e=¦  «        Z? G d&„ d'ej>        e=¦  «        Z@ G d(„ d)ej>        e=¦  «        ZA G d*„ d+ej>        e=¦  «        ZB G d,„ d-ej>        e=¦  «        ZCdS )/z
Test HTTP/2 support.
é    N)ÚdirectlyProvidesÚ
providedBy)ÚdeferÚerrorÚreactorÚtask)ÚIPv4Address)ÚMemoryReactorClockÚStringTransport)Úfailure)Ú	iterbytes)ÚDummyProducer)Úunittest)Úhttp)ÚDelayedHTTPHandlerÚDelayedHTTPHandlerProxyÚDummyHTTPHandlerÚDummyHTTPHandlerProxyÚDummyPullProducerHandlerProxyÚ._IDeprecatedHTTPChannelToRequestInterfaceProxyÚ_makeRequestProxyFactory)ÚDecoderÚEncoder)ÚH2ConnectionzHTTP/2 support not enabledc                   óh   — e Zd ZdZd„ Zd„ Zd„ Zg dfd„Zdd„Zdd
„Z	d„ Z
dd„Zdd„Zdd„Zg fd„ZdS )ÚFrameFactoryz¨
    A class containing lots of helper methods and state to build frames. This
    allows test cases to easily build correct HTTP/2 frames to feed to
    hyper-h2.
    c                 ó,   — t          ¦   «         | _        d S ©N©r   Úencoder©Úselfs    úZ/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/web/test/test_http2.pyÚ__init__zFrameFactory.__init__8   ó   € Ý‘y”yˆŒˆˆó    c                 ó,   — t          ¦   «         | _        d S r   r   r!   s    r#   ÚrefreshEncoderzFrameFactory.refreshEncoder;   r%   r&   c                 ó   — dS )Ns   PRI * HTTP/2.0

SM

© r!   s    r#   ÚclientConnectionPrefacez$FrameFactory.clientConnectionPreface>   s   € Ø2Ð2r&   é   c                 óJ  — t           j                             |¦  «        }| j                             |¦  «        |_        |j                             d¦  «         |D ]}|j                             |¦  «         Œ|                     ¦   «         D ]\  }}t          |||¦  «         Œ|S )zS
        Builds a single valid headers frame out of the contained headers.
        ÚEND_HEADERS)
Ú
hyperframeÚframeÚHeadersFramer    ÚencodeÚdataÚflagsÚaddÚitemsÚsetattr)	r"   Úheadersr4   ÚstreamIDÚpriorityKwargsÚfÚflagÚkÚvs	            r#   ÚbuildHeadersFramezFrameFactory.buildHeadersFrameA   s¤   € õ Ô×)Ò)¨(Ñ3Ô3ˆØ”×$Ò$ WÑ-Ô-ˆŒØ	Œ�Š�MÑ"Ô"Ð"Øð 	ð 	ˆDØŒG�KŠK˜ÑÔÐÐà"×(Ò(Ñ*Ô*ð 	ð 	‰DˆAˆqÝ�A�q˜!ÑÔÐÐàˆr&   Nc                 óž   — |�t          |¦  «        nt          ¦   «         }t          j                             |¦  «        }||_        ||_        |S )zD
        Builds a single data frame out of a chunk of data.
        )Úsetr/   r0   Ú	DataFramer3   r4   )r"   r3   r4   r9   r;   s        r#   ÚbuildDataFramezFrameFactory.buildDataFrameP   sE   € ð $Ð/•�E‘
”
�
µS±U´UˆÝÔ×&Ò& xÑ0Ô0ˆØˆŒØˆŒØˆr&   Fc                 óŠ   — t           j                             d¦  «        }|r|j                             d¦  «         ||_        |S )z1
        Builds a single settings frame.
        r   ÚACK)r/   r0   ÚSettingsFramer4   r5   Úsettings)r"   rG   Úackr;   s       r#   ÚbuildSettingsFramezFrameFactory.buildSettingsFrameZ   sB   € õ Ô×*Ò*¨1Ñ-Ô-ˆØð 	ØŒG�KŠK˜ÑÔÐàˆŒ
Øˆr&   c                 óR   — t           j                             |¦  «        }||_        |S )z5
        Builds a single WindowUpdate frame.
        )r/   r0   ÚWindowUpdateFrameÚwindow_increment)r"   r9   Ú	incrementr;   s       r#   ÚbuildWindowUpdateFramez#FrameFactory.buildWindowUpdateFramee   s'   € õ Ô×.Ò.¨xÑ8Ô8ˆØ&ˆÔØˆr&   r   r&   c                 ón   — t           j                             d¦  «        }||_        ||_        ||_        |S )z/
        Builds a single GOAWAY frame.
        r   )r/   r0   ÚGoAwayFrameÚ
error_codeÚlast_stream_idÚadditional_data)r"   ÚlastStreamIDÚ	errorCodeÚadditionalDatar;   s        r#   ÚbuildGoAwayFramezFrameFactory.buildGoAwayFramem   s6   € õ Ô×(Ò(¨Ñ+Ô+ˆØ ˆŒØ'ˆÔØ*ˆÔØˆr&   c                 óR   — t           j                             |¦  «        }||_        |S )z3
        Builds a single RST_STREAM frame.
        )r/   r0   ÚRstStreamFramerQ   )r"   r9   rU   r;   s       r#   ÚbuildRstStreamFramez FrameFactory.buildRstStreamFramew   s&   € õ Ô×+Ò+¨HÑ5Ô5ˆØ ˆŒØˆr&   c                 ón   — t           j                             |¦  «        }||_        ||_        ||_        |S )z1
        Builds a single priority frame.
        )r/   r0   ÚPriorityFrameÚ
depends_onÚstream_weightÚ	exclusive)r"   r9   ÚweightÚ	dependsOnr_   r;   s         r#   ÚbuildPriorityFramezFrameFactory.buildPriorityFrame   s4   € õ Ô×*Ò*¨8Ñ4Ô4ˆØ ˆŒØ ˆŒØˆŒØˆr&   c                 óì   — t           j                             |¦  «        }||_        | j                             |¦  «        |_        t          |¦  «        |_        |j         	                    d¦  «         |S )z5
        Builds a single Push Promise frame.
        r.   )
r/   r0   ÚPushPromiseFrameÚpromised_stream_idr    r2   r3   rA   r4   r5   )r"   r9   ÚpromisedStreamIDr8   r4   r;   s         r#   ÚbuildPushPromiseFramez"FrameFactory.buildPushPromiseFrame‰   s_   € õ Ô×-Ò-¨hÑ7Ô7ˆØ/ˆÔØ”×$Ò$ WÑ-Ô-ˆŒÝ�e‘*”*ˆŒØ	Œ�Š�MÑ"Ô"Ð"Øˆr&   ©Nr,   )F)r   r&   )r   )r   F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r$   r(   r+   r?   rC   rI   rN   rW   rZ   rb   rg   r*   r&   r#   r   r   1   sô   € € € € € ðð ð!ð !ð !ð!ð !ð !ð3ð 3ð 3ð 02¸Að ð ð ð ðð ð ð ð	ð 	ð 	ð 	ðð ð ðð ð ð ðð ð ð ðð ð ð ð PRð 	ð 	ð 	ð 	ð 	ð 	r&   r   c                   ó.   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZeZdS )ÚFrameBufferaÞ  
    A test object that converts data received from Twisted's HTTP/2 stack and
    turns it into a sequence of hyperframe frame objects.

    This is primarily used to make it easier to write and debug tests: rather
    than have to serialize the expected frames and then do byte-level
    comparison (which can be unclear in debugging output), this object makes it
    possible to work with the frames directly.

    It also ensures that headers are properly decompressed.
    c                 ó:   — t          ¦   «         | _        d| _        d S )Nr&   )r   ÚdecoderÚ_datar!   s    r#   r$   zFrameBuffer.__init__¢   s   € Ý‘y”yˆŒØˆŒ
ˆ
ˆ
r&   c                 ó&   — | xj         |z  c_         d S r   )rq   )r"   r3   s     r#   ÚreceiveDatazFrameBuffer.receiveData¦   s   € Øˆ
Œ
�dÑˆ
Œ
ˆ
ˆ
r&   c                 ó   — | S r   r*   r!   s    r#   Ú__iter__zFrameBuffer.__iter__©   s   € Øˆr&   c                 ó(  — t          | j        ¦  «        dk     rt          ¦   «         ‚t          j        j                             | j        d d…         ¦  «        \  }}t          | j        ¦  «        |dz   k     rt          ¦   «         ‚|                     t          | j        dd|z   …         ¦  «        ¦  «         | j        d|z   d …         | _        t          |t          j        j
        ¦  «        r&| j                             |j        d¬¦  «        |_        |S )Né	   T)Úraw)Úlenrq   ÚStopIterationr/   r0   ÚFrameÚparse_frame_headerÚ
parse_bodyÚ
memoryviewÚ
isinstancer1   rp   Údecoder3   )r"   r0   Úlengths      r#   ÚnextzFrameBuffer.next¬   sä   € ÝˆtŒz‰?Œ?˜QÒÐÝ‘/”/Ð!å"Ô(Ô.×AÒAÀ$Ä*ÈRÈaÈRÄ.ÑQÔQ‰ˆˆvÝˆtŒz‰?Œ?˜V a™ZÒ'Ð'Ý‘/”/Ð!à×Ò� D¤J¨q°1°v±:¨~Ô$>Ñ?Ô?Ñ@Ô@Ð@Ø”Z  F¡
  Ô-ˆŒ
å�e�ZÔ-Ô:Ñ;Ô;ð 	CØœ×,Ò,¨U¬Z¸TÐ,ÑBÔBˆEŒJàˆr&   N)	ri   rj   rk   rl   r$   rs   ru   r‚   Ú__next__r*   r&   r#   rn   rn   •   s[   € € € € € ð
ð 
ðð ð ðð ð ðð ð ðð ð ð  €H€H€Hr&   rn   r,   c                 ó  ‡‡— ‰€t          ¦   «         Šg }|                     ‰                     | ‰¬¦  «        ¦  «         |                     ˆˆfd„|D ¦   «         ¦  «         |d         j                             d¦  «         |S )aæ  
    Provides a sequence of HTTP/2 frames that encode a single HTTP request.
    This should be used when you want to control the serialization yourself,
    e.g. because you want to interleave other frames with these. If that's not
    necessary, prefer L{buildRequestBytes}.

    @param headers: The HTTP/2 headers to send.
    @type headers: L{list} of L{tuple} of L{bytes}

    @param data: The HTTP data to send. Each list entry will be sent in its own
    frame.
    @type data: L{list} of L{bytes}

    @param frameFactory: The L{FrameFactory} that will be used to construct the
    frames.
    @type frameFactory: L{FrameFactory}

    @param streamID: The ID of the stream on which to send the request.
    @type streamID: L{int}
    N©r8   r9   c              3   óF   •K  — | ]}‰                      |‰¬ ¦  «        V — ŒdS )©r9   N)rC   )Ú.0ÚchunkÚframeFactoryr9   s     €€r#   ú	<genexpr>z%buildRequestFrames.<locals>.<genexpr>Ù   sG   øè è € ð ð ØBGˆ×#Ò# E°HÐ#Ñ=Ô=ðð ð ð ð ð r&   éÿÿÿÿÚ
END_STREAM)r   Úappendr?   Úextendr4   r5   ©r8   r3   rŠ   r9   Úframess     `` r#   ÚbuildRequestFramesr’   ¿   s¢   øø€ ð* ÐÝ#‘~”~ˆà€FØ
‡M‚M�,×0Ò0¸È8Ð0ÑTÔTÑUÔUÐUØ
‡M‚Mð ð ð ð ð ØKOðñ ô ñ ô ð ð ˆ2„JÔ×Ò˜Ñ&Ô&Ð&Ø€Mr&   c                 ód   — t          | |||¦  «        }d                     d„ |D ¦   «         ¦  «        S )a:  
    Provides the byte sequence for a collection of HTTP/2 frames representing
    the provided request.

    @param headers: The HTTP/2 headers to send.
    @type headers: L{list} of L{tuple} of L{bytes}

    @param data: The HTTP data to send. Each list entry will be sent in its own
    frame.
    @type data: L{list} of L{bytes}

    @param frameFactory: The L{FrameFactory} that will be used to construct the
    frames.
    @type frameFactory: L{FrameFactory}

    @param streamID: The ID of the stream on which to send the request.
    @type streamID: L{int}
    r&   c              3   ó>   K  — | ]}|                      ¦   «         V — Œd S r   ©Ú	serialize©rˆ   r;   s     r#   r‹   z$buildRequestBytes.<locals>.<genexpr>ô   s*   è è € Ð2Ð2 a�A—K’K‘M”MÐ2Ð2Ð2Ð2Ð2Ð2r&   )r’   Újoinr�   s        r#   ÚbuildRequestBytesr™   à   s8   € õ&   ¨¨|¸XÑFÔF€FØ�8Š8Ð2Ð2¨6Ð2Ñ2Ô2Ñ2Ô2Ð2r&   c                 óf   — t          ¦   «         }|                     | ¦  «         t          |¦  «        S )aÞ  
    Given a sequence of bytes, decodes them into frames.

    Note that this method should almost always be called only once, before
    making some assertions. This is because decoding HTTP/2 frames is extremely
    stateful, and this function doesn't preserve any of that state between
    calls.

    @param data: The serialized HTTP/2 frames.
    @type data: L{bytes}

    @returns: A list of HTTP/2 frames.
    @rtype: L{list} of L{hyperframe.frame.Frame} subclasses.
    )rn   rs   Úlist)r3   Úbuffers     r#   ÚframesFromBytesr�   ÷   s-   € õ ‰]Œ]€FØ
×Ò�tÑÔÐÝ�‰<Œ<Ðr&   c                   ó   — e Zd ZdZdZd„ ZdS )ÚChunkedHTTPHandlerzš
    A HTTP request object that writes chunks of data back to the network based
    on the URL.

    Must be called with a path /chunked/<num_chunks>
    s   hello world!c                 ó
  — t          | j                             d¦  «        d         ¦  «        }|                      d¦  «         t	          |¦  «        D ]}|                      | j        ¦  «         Œ|                      ¦   «          d S )Nó   /rŒ   éÈ   )ÚintÚuriÚsplitÚsetResponseCodeÚrangeÚwriteÚ	chunkDataÚfinish)r"   ÚchunksÚ_s      r#   ÚprocesszChunkedHTTPHandler.process  ss   € Ý�T”X—^’^ DÑ)Ô)¨"Ô-Ñ.Ô.ˆØ×Ò˜SÑ!Ô!Ð!å�v‘”ð 	'ð 	'ˆAØ�JŠJ�t”~Ñ&Ô&Ð&Ð&à�Š‰Œˆˆˆr&   N)ri   rj   rk   rl   r©   r­   r*   r&   r#   rŸ   rŸ     s4   € € € € € ðð ð  €Iðð ð ð ð r&   rŸ   c                   ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )ÚConsumerDummyHandlera  
    This is a HTTP request handler that works with the C{IPushProducer}
    implementation in the L{H2Stream} object. No current IRequest object does
    that, but in principle future implementations could: that codepath should
    therefore be tested.
    c                 óˆ   — t          j        j        | g|¢R i |¤Ž | j                             ¦   «          d| _        d | _        d S )NF)r   ÚRequestr$   ÚchannelÚpauseProducingÚ_requestReceivedrq   ©r"   ÚargsÚkwargss      r#   r$   zConsumerDummyHandler.__init__*  sN   € ÝŒÔ˜dÐ4 TÐ4Ð4Ð4¨VÐ4Ð4Ð4ð 	Œ×#Ò#Ñ%Ô%Ð%Ø %ˆÔØˆŒ
ˆ
ˆ
r&   c                 ó8   — | j                              ¦   «          dS )z&
        Start the data pipe.
        N)r²   ÚresumeProducingr!   s    r#   Ú
acceptDatazConsumerDummyHandler.acceptData2  s   € ð 	Œ×$Ò$Ñ&Ô&Ð&Ð&Ð&r&   c                 óD   — d| _         t          j        j        | g|¢R i |¤ŽS )NT)r´   r   r±   ÚrequestReceivedrµ   s      r#   r¼   z$ConsumerDummyHandler.requestReceived8  s-   € Ø $ˆÔÝŒ|Ô+¨DÐB°4ÐBÐBÐB¸6ÐBÐBÐBr&   c                 óÂ   — |                       d¦  «         | j                             ¦   «         | _        d}|                      |¦  «         |                      ¦   «          d S )Nr¢   s0   this is a response from a consumer dummy handler)r¦   ÚcontentÚreadrq   r¨   rª   )r"   Ú
returnDatas     r#   r­   zConsumerDummyHandler.process<  sS   € Ø×Ò˜SÑ!Ô!Ð!Ø”\×&Ò&Ñ(Ô(ˆŒ
ØHˆ
Ø�
Š
�:ÑÔÐØ�Š‰Œˆˆˆr&   N)ri   rj   rk   rl   r$   rº   r¼   r­   r*   r&   r#   r¯   r¯   "  s]   € € € € € ðð ðð ð ð'ð 'ð 'ðCð Cð Cðð ð ð ð r&   r¯   c                   ó   — e Zd ZdZd„ ZdS )ÚAbortingConsumerDummyHandlerzþ
    This is a HTTP request handler that works with the C{IPushProducer}
    implementation in the L{H2Stream} object. The difference between this and
    the ConsumerDummyHandler is that after resuming production it immediately
    aborts it again.
    c                 ój   — | j                              ¦   «          | j                              ¦   «          dS )z@
        Start and then immediately stop the data pipe.
        N)r²   r¹   ÚstopProducingr!   s    r#   rº   z'AbortingConsumerDummyHandler.acceptDataO  s2   € ð 	Œ×$Ò$Ñ&Ô&Ð&ØŒ×"Ò"Ñ$Ô$Ð$Ð$Ð$r&   N)ri   rj   rk   rl   rº   r*   r&   r#   rÂ   rÂ   G  s-   € € € € € ðð ð%ð %ð %ð %ð %r&   rÂ   c                   ó   — e Zd ZdZd„ ZdS )ÚDummyProducerHandlerz‘
    An HTTP request handler that registers a dummy producer to serve the body.

    The owner must call C{finish} to complete the response.
    c                 ót   — |                       d¦  «         |                      t          ¦   «         d¦  «         d S )Nr¢   T)r¦   ÚregisterProducerr   r!   s    r#   r­   zDummyProducerHandler.processc  s6   € Ø×Ò˜SÑ!Ô!Ð!Ø×Ò�m™oœo¨tÑ4Ô4Ð4Ð4Ð4r&   N)ri   rj   rk   rl   r­   r*   r&   r#   rÆ   rÆ   \  s-   € € € € € ðð ð5ð 5ð 5ð 5ð 5r&   rÆ   c                   ó   — e Zd ZdZd„ Zd„ ZdS )ÚNotifyingRequestFactorya(  
    A L{http.Request} factory that calls L{http.Request.notifyFinish} on all
    L{http.Request} objects before it returns them, and squirrels the resulting
    L{defer.Deferred} away on the class for later use. This is done as early
    as possible to ensure that we always see the result.
    c                 óp   — g | _         || _        t          | j        ¦  «        D ]}t          | |¦  «         Œd S r   )ÚresultsÚ_wrappedFactoryr   r   )r"   ÚwrappedFactoryÚ	interfaces      r#   r$   z NotifyingRequestFactory.__init__s  sJ   € ØˆŒØ-ˆÔõ
 $ DÔ$8Ñ9Ô9ð 	.ð 	.ˆIÝ˜T 9Ñ-Ô-Ð-Ð-ð	.ð 	.r&   c                 ó’   —  | j         |i |¤Ž}| j                             |                     ¦   «         ¦  «         t	          |¦  «        S r   )rÍ   rÌ   rŽ   ÚnotifyFinishr   )r"   r¶   r·   Úreqs       r#   Ú__call__z NotifyingRequestFactory.__call__}  sI   € Ø"ˆdÔ" DÐ3¨FÐ3Ð3ˆØŒ×Ò˜C×,Ò,Ñ.Ô.Ñ/Ô/Ð/Ý=¸cÑBÔBÐBr&   N)ri   rj   rk   rl   r$   rÓ   r*   r&   r#   rÊ   rÊ   k  sA   € € € € € ðð ð.ð .ð .ðCð Cð Cð Cð Cr&   rÊ   c                   ó    — e Zd ZdZereZd„ ZdS )ÚHTTP2TestHelpersz]
    A superclass that contains no tests but provides test helpers for HTTP/2
    tests.
    c                 ó\   — |                       t          j        t          |j        ¦  «         dS )z•
        Confirm that all streams are blocked: that is, the priority tree
        believes that none of the streams have data ready to send.
        N)ÚassertRaisesÚpriorityÚDeadlockErrorr‚   )r"   Ú
connections     r#   ÚassertAllStreamsBlockedz(HTTP2TestHelpers.assertAllStreamsBlocked�  s(   € ð
 	×Ò�(Ô0µ$¸
Ô8KÑLÔLÐLÐLÐLr&   N)ri   rj   rk   rl   ÚskipH2ÚskiprÛ   r*   r&   r#   rÕ   rÕ   †  sA   € € € € € ðð ð
 ð ØˆðMð Mð Mð Mð Mr&   rÕ   c                   ó  — e Zd Zg d¢Zg d¢Zg d¢Zg d¢ZdZg 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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!d „ Z"d!„ Z#d"„ Z$d#„ Z%d$„ Z&d%„ Z'd&„ Z(d'„ Z)d(„ Z*d)S )*ÚHTTP2ServerTests©©ó   :methodó   GET©s
   :authoritys	   localhost©ó   :pathr¡   ©s   :schemes   https©s
   user-agents   twisted-test-code)ó   custom-headeró   1)ré   ó   2©)râ   ó   POSTrä   )ræ   ó   /post_endpointrç   rè   )ó   content-lengths   25©s   hello s   world, s   it's s   http/2!)©ó   :statuss   200)ó   requestr¡   )ó   commandrã   ©s   versions   HTTP/2)rï   s   13ó   '''
None
'''
)rñ   ©ró   rî   ©rô   rí   rõ   )rï   s   36ó$   '''
25
hello world, it's http/2!'''
c                 ó
  — t          ¦   «         }t          ¦   «         }|                     ¦   «         }|t          |||¦  «        z  }|                     |¦  «         t          |¦  «        D ]}|                     |¦  «         Œ||fS )a!  
        Takes a single L{H2Connection} object and connects it to a
        L{StringTransport} using a brand new L{FrameFactory}.

        @param connection: The L{H2Connection} object to connect.
        @type connection: L{H2Connection}

        @param headers: The headers to send on the first request.
        @type headers: L{Iterable} of L{tuple} of C{(bytes, bytes)}

        @param body: Chunks of body to send, if any.
        @type body: L{Iterable} of L{bytes}

        @return: A tuple of L{FrameFactory}, L{StringTransport}
        )r   r   r+   r™   ÚmakeConnectionr   ÚdataReceived)r"   rÚ   r8   ÚbodyrŠ   Ú	transportÚrequestBytesÚbytes           r#   ÚconnectAndReceivez"HTTP2ServerTests.connectAndReceiveÁ  s�   € õ  $‘~”~ˆÝ#Ñ%Ô%ˆ	à#×;Ò;Ñ=Ô=ˆØÕ)¨'°4¸ÑFÔFÑFˆà×!Ò! )Ñ,Ô,Ð,å˜lÑ+Ô+ð 	*ð 	*ˆDØ×#Ò# DÑ)Ô)Ð)Ð)à˜YÐ&Ð&r&   c                 óÄ   ‡ ‡— t          ¦   «         }t          |_        ‰                      |‰ j        g ¦  «        \  }Šˆ ˆfd„}|j        d                              |¦  «        S )z�
        Send request over a TCP connection and confirm that we get back the
        expected data in the order and style we expect.
        c                 óš  •— t          ‰                     ¦   «         ¦  «        }‰                     t          |¦  «        d¦  «         ‰                     t          d„ |dd …         D ¦   «         ¦  «        ¦  «         ‰                     t          |d         t          j        j	        ¦  «        ¦  «         ‰                     t          |d         t          j        j
        ¦  «        ¦  «         ‰                     t          |d         t          j        j
        ¦  «        ¦  «         ‰                     t          |d         j        ¦  «        t          ‰j        ¦  «        ¦  «         ‰                     |d         j        ‰j        ¦  «         ‰                     |d         j        d¦  «         ‰                     d|d         j        v ¦  «         d S )Né   c              3   ó,   K  — | ]}|j         d k    V — ŒdS ©r,   N©Ú	stream_idr—   s     r#   r‹   zGHTTP2ServerTests.test_basicRequest.<locals>.validate.<locals>.<genexpr>í  ó)   è è € ÐEÐE°Q ¤¨qÒ 0ÐEÐEÐEÐEÐEÐEr&   r,   é   é   r&   r�   )r�   ÚvalueÚassertEqualry   Ú
assertTrueÚallr   r/   r0   r1   rB   Údictr3   ÚgetResponseHeadersÚgetResponseDatar4   ©r9   r‘   r"   rþ   s     €€r#   Úvalidatez4HTTP2ServerTests.test_basicRequest.<locals>.validateé  sf  ø€ Ý$ Y§_¢_Ñ%6Ô%6Ñ7Ô7ˆFà×Ò�S ™[œ[¨!Ñ,Ô,Ð,Ø�OŠO�CÐEÐE¸&ÀÀÀ¼*ÐEÑEÔEÑEÔEÑFÔFÐFà�OŠO�J v¨a¤yµ*Ô2BÔ2OÑPÔPÑQÔQÐQØ�OŠO�J v¨a¤yµ*Ô2BÔ2LÑMÔMÑNÔNÐNØ�OŠO�J v¨a¤yµ*Ô2BÔ2LÑMÔMÑNÔNÐNà×Ò�T &¨¤)¤.Ñ1Ô1µ4¸Ô8OÑ3PÔ3PÑQÔQÐQØ×Ò˜V AœYœ^¨TÔ-AÑBÔBÐBØ×Ò˜V AœYœ^¨SÑ1Ô1Ð1Ø�OŠO˜L¨F°1¬I¬OÐ;Ñ<Ô<Ð<Ð<Ð<r&   r,   )r   r   ÚrequestFactoryr  ÚgetRequestHeadersÚ_streamCleanupCallbacksÚaddCallback©r"   rÚ   r¬   r  rþ   s   `   @r#   Útest_basicRequestz"HTTP2ServerTests.test_basicRequestÞ  sr   øø€ õ "‘^”^ˆ
Ý$9ˆ
Ô!Ø×-Ò-¨j¸$Ô:PÐRTÑUÔU‰ˆˆ9ð	=ð 	=ð 	=ð 	=ð 	=ð 	=ð Ô1°!Ô4×@Ò@ÀÑJÔJÐJr&   c                 óÎ   ‡ ‡— t          ¦   «         }t          |_        ‰                      |‰ j        ‰ j        ¦  «        \  }Šˆ ˆfd„}|j        d                              |¦  «        S )zV
        Send a POST request and confirm that the data is safely transferred.
        c                 óš  •— t          ‰                     ¦   «         ¦  «        }‰                     t          |¦  «        d¦  «         ‰                     t          d„ |dd …         D ¦   «         ¦  «        ¦  «         ‰                     t          |d         t          j        j	        ¦  «        ¦  «         ‰                     t          |d         t          j        j
        ¦  «        ¦  «         ‰                     t          |d         t          j        j
        ¦  «        ¦  «         ‰                     t          |d         j        ¦  «        t          ‰j        ¦  «        ¦  «         ‰                     |d         j        ‰j        ¦  «         ‰                     |d         j        d¦  «         ‰                     d|d         j        v ¦  «         d S )Nr  c              3   ó,   K  — | ]}|j         d k    V — ŒdS r  r  r—   s     r#   r‹   zFHTTP2ServerTests.test_postRequest.<locals>.validate.<locals>.<genexpr>	  ó)   è è € ÐFÐF°Q ¤¨qÒ 0ÐFÐFÐFÐFÐFÐFr&   éýÿÿÿéþÿÿÿrŒ   r&   r�   )r�   r  r  ry   r  r  r   r/   r0   r1   rB   r  r3   ÚpostResponseHeadersÚpostResponseDatar4   r  s     €€r#   r  z3HTTP2ServerTests.test_postRequest.<locals>.validate  si  ø€ Ý$ Y§_¢_Ñ%6Ô%6Ñ7Ô7ˆFð ×Ò�S ™[œ[¨!Ñ,Ô,Ð,Ø�OŠO�CÐFÐF¸&ÀÀÀ¼+ÐFÑFÔFÑFÔFÑGÔGÐGà�OŠO�J v¨b¤zµ:Ô3CÔ3PÑQÔQÑRÔRÐRØ�OŠO�J v¨b¤zµ:Ô3CÔ3MÑNÔNÑOÔOÐOØ�OŠO�J v¨b¤zµ:Ô3CÔ3MÑNÔNÑOÔOÐOà×Ò�T &¨¤*¤/Ñ2Ô2µD¸Ô9QÑ4RÔ4RÑSÔSÐSØ×Ò˜V BœZœ_¨dÔ.CÑDÔDÐDØ×Ò˜V BœZœ_¨cÑ2Ô2Ð2Ø�OŠO˜L¨F°2¬JÔ,<Ð<Ñ=Ô=Ð=Ð=Ð=r&   r,   )r   r   r  r  ÚpostRequestHeadersÚpostRequestDatar  r  r  s   `   @r#   Útest_postRequestz!HTTP2ServerTests.test_postRequestú  sy   øø€ õ "‘^”^ˆ
Ý$9ˆ
Ô!Ø×-Ò-Ø˜Ô/°Ô1Eñ
ô 
‰ˆˆ9ð	>ð 	>ð 	>ð 	>ð 	>ð 	>ð  Ô1°!Ô4×@Ò@ÀÑJÔJÐJr&   c                 óú   ‡ ‡‡‡— g d¢ŠdŠd„ ‰ j         D ¦   «         }t          ¦   «         }t          |_        ‰                      ||‰ j        ¦  «        \  }Šˆˆˆ ˆfd„}|j        d                              |¦  «        S )zm
        Send a POST request without length and confirm that the data is safely
        transferred.
        )rñ   r÷   rø   rõ   )rï   s   38s&   '''
None
hello world, it's http/2!'''
c                 ó(   — g | ]\  }}|d k    ¯||f‘ŒS )rï   r*   )rˆ   ÚxÚys      r#   ú
<listcomp>z=HTTP2ServerTests.test_postRequestNoLength.<locals>.<listcomp>%  s2   € ð 
ð 
ð 
Ù�q˜!¸!Ð?PÒ:PÐ:PˆQ�ˆFÐ:PÐ:PÐ:Pr&   c                 ó†  •— t          ‰                     ¦   «         ¦  «        }‰                     t          |¦  «        d¦  «         ‰                     t          d„ |dd …         D ¦   «         ¦  «        ¦  «         ‰                     t          |d         t          j        j	        ¦  «        ¦  «         ‰                     t          |d         t          j        j
        ¦  «        ¦  «         ‰                     t          |d         t          j        j
        ¦  «        ¦  «         ‰                     t          |d         j        ¦  «        t          ‰¦  «        ¦  «         ‰                     |d         j        ‰¦  «         ‰                     |d         j        d¦  «         ‰                     d|d         j        v ¦  «         d S )Nr  c              3   ó,   K  — | ]}|j         d k    V — ŒdS r  r  r—   s     r#   r‹   zNHTTP2ServerTests.test_postRequestNoLength.<locals>.validate.<locals>.<genexpr>4  r  r&   r  r   rŒ   r&   r�   )r�   r  r  ry   r  r  r   r/   r0   r1   rB   r  r3   r4   )r9   r‘   r"  r!  r"   rþ   s     €€€€r#   r  z;HTTP2ServerTests.test_postRequestNoLength.<locals>.validate/  se  ø€ Ý$ Y§_¢_Ñ%6Ô%6Ñ7Ô7ˆFð ×Ò�S ™[œ[¨!Ñ,Ô,Ð,Ø�OŠO�CÐFÐF¸&ÀÀÀ¼+ÐFÑFÔFÑFÔFÑGÔGÐGà�OŠO�J v¨b¤zµ:Ô3CÔ3PÑQÔQÑRÔRÐRØ�OŠO�J v¨b¤zµ:Ô3CÔ3MÑNÔNÑOÔOÐOØ�OŠO�J v¨b¤zµ:Ô3CÔ3MÑNÔNÑOÔOÐOà×Ò�T &¨¤*¤/Ñ2Ô2µDÐ9LÑ4MÔ4MÑNÔNÐNØ×Ò˜V BœZœ_Ð.>Ñ?Ô?Ð?Ø×Ò˜V BœZœ_¨cÑ2Ô2Ð2Ø�OŠO˜L¨F°2¬JÔ,<Ð<Ñ=Ô=Ð=Ð=Ð=r&   r,   )r#  r   r   r  r  r$  r  r  )r"   r#  rÚ   r¬   r  r"  r!  rþ   s   `    @@@r#   Útest_postRequestNoLengthz)HTTP2ServerTests.test_postRequestNoLength  sÀ   øøøø€ ð

ð 
ð 
Ðð HÐð
ð 
Ø#Ô6ð
ñ 
ô 
Ðõ "‘^”^ˆ
Ý$9ˆ
Ô!Ø×-Ò-ØÐ*¨DÔ,@ñ
ô 
‰ˆˆ9ð	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð  Ô1°!Ô4×@Ò@ÀÑJÔJÐJr&   c                 ó®  ‡ ‡‡‡	— d}t          ¦   «         Št          ¦   «         Št          ¦   «         }t          |_        t          t          d|dz  d¦  «        ¦  «        Š	ˆˆ fd„‰	D ¦   «         }‰                     ¦   «         }t          j	         
                    t          |Ž ¦  «        }|d                     d„ |D ¦   «         ¦  «        z  }|                     ‰¦  «         t          |¦  «        D ]}|                     |¦  «         Œˆˆ ˆ	fd„}t!          j        t          |j                             ¦   «         ¦  «        ¦  «                             |¦  «        S )zi
        Many interleaved POST requests all get received and responded to
        appropriately.
        é(   r,   r
  c                 óH   •— g | ]}t          ‰j        ‰j        ‰|¦  «        ‘ŒS r*   )r’   r#  r$  )rˆ   r9   r;   r"   s     €€r#   r*  z=HTTP2ServerTests.test_interleavedRequests.<locals>.<listcomp>P  sD   ø€ ð 
ð 
ð 
ð õ ØÔ'¨Ô)=¸qÀ(ñô ð
ð 
ð 
r&   r&   c              3   ó>   K  — | ]}|                      ¦   «         V — Œd S r   r•   ©rˆ   r0   s     r#   r‹   z<HTTP2ServerTests.test_interleavedRequests.<locals>.<genexpr>\  ó,   è è € Ð GÐ G°u §¢Ñ!2Ô!2Ð GÐ GÐ GÐ GÐ GÐ Gr&   c                 óP  •‡— t          ‰                     ¦   «         ¦  «        }‰                     t          |¦  «        d¦  «         ‰D ]ÜŠˆfd„|D ¦   «         }‰                     t          |¦  «        d¦  «         ‰                     t	          |d         j        ¦  «        t	          ‰j        ¦  «        ¦  «         ‰                     |d         j        ‰j        ¦  «         ‰                     |d         j        d¦  «         ‰                     d|d         j	        v ¦  «         ŒÝd S )	Néy   c                 óh   •— g | ].}|j         ‰k    ¯t          |t          j        j        ¦  «        °,|‘Œ/S r*   )r  r   r/   r0   rK   )rˆ   r;   r9   s     €r#   r*  zOHTTP2ServerTests.test_interleavedRequests.<locals>.validate.<locals>.<listcomp>m  sH   ø€ ð  ð  ð  àØ”{ hÒ.Ð.Ý& q­*Ô*:Ô*LÑMÔMð /ð à.Ð.Ð.r&   r  r   r,   r
  r&   r�   )
r�   r  r  ry   r  r3   r!  r"  r  r4   )rÌ   r‘   ÚstreamFramesr9   Úbr"   Ú	streamIDss      @€€€r#   r  z;HTTP2ServerTests.test_interleavedRequests.<locals>.validateb  s5  øø€ Ý$ Q§W¢W¡Y¤YÑ/Ô/ˆFð
 ×Ò�S ™[œ[¨,Ñ7Ô7Ð7ð &ð Gð G�ð ð  ð  ð  à#ð ñ  ô  �ð × Ò ¥ \Ñ!2Ô!2°AÑ6Ô6Ð6à× Ò Ý˜ aœÔ-Ñ.Ô.µ°TÔ5MÑ0NÔ0Nñô ð ð × Ò  ¨a¤Ô!5°tÔ7LÑMÔMÐMØ× Ò  ¨a¤Ô!5°sÑ;Ô;Ð;Ø—’ °¸Q´Ô0EÐ EÑFÔFÐFÐFðGð Gr&   )r   r   r   r   r  r›   r§   r+   Ú	itertoolsÚchainÚfrom_iterableÚzipr˜   rû   r   rü   r   ÚDeferredListr  Úvaluesr  )
r"   ÚREQUEST_COUNTÚar‘   rÿ   r   r  r8  r;   r9  s
   `      @@@r#   Útest_interleavedRequestsz)HTTP2ServerTests.test_interleavedRequestsA  s}  øøøø€ ð ˆå‰NŒNˆÝÑÔˆÝ‰NŒNˆÝ0ˆÔõ �˜q -°!Ñ"3°QÑ7Ô7Ñ8Ô8ˆ	ð
ð 
ð 
ð 
ð 
ð &ð	
ñ 
ô 
ˆð ×0Ò0Ñ2Ô2ˆõ ”×.Ò.­s°F¨|Ñ<Ô<ˆØ˜ŸšÐ GÐ GÀÐ GÑ GÔ GÑGÔGÑGˆØ	×Ò˜ÑÔÐå˜lÑ+Ô+ð 	!ð 	!ˆDØ�NŠN˜4Ñ Ô Ð Ð ð	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gõ6 Ô!¥$ qÔ'@×'GÒ'GÑ'IÔ'IÑ"JÔ"JÑKÔK×WÒWØñ
ô 
ð 	
r&   c                 ó¾  ‡ ‡‡‡	— t          ¦   «         Št          ¦   «         Št          ¦   «         }t          |_        ‰ j        Š	d‰	d<   ˆˆ	fd„dD ¦   «         }|d         d         j                             d¦  «         d|d         d         _        |d         d         j                             d¦  «         d	|d         d         _        ‰ 	                    d
ddd¬¦  «        }|d          
                    d|¦  «         t          j                             |¦  «        }‰                     ¦   «         }|d                     d„ |D ¦   «         ¦  «        z  }|                     ‰¦  «         t#          |¦  «        D ]}|                     |¦  «         Œˆˆ fd„}t'          j        t+          |j                             ¦   «         ¦  «        ¦  «                             |¦  «        S )zR
        Data in responses is interleaved according to HTTP/2 priorities.
        )z:pathz
/chunked/4r
  c                 ó4   •— g | ]}t          ‰g ‰|¦  «        ‘ŒS r*   )r’   )rˆ   r9   r;   r  s     €€r#   r*  zAHTTP2ServerTests.test_sendAccordingToPriority.<locals>.<listcomp>™  s8   ø€ ð 
ð 
ð 
àõ Ð0°"°a¸ÑBÔBð
ð 
ð 
r&   )r,   r  é   r   ÚPRIORITYé@   r,   é    rE  é   T)r9   r`   ra   r_   r&   c              3   ó>   K  — | ]}|                      ¦   «         V — Œd S r   r•   r2  s     r#   r‹   z@HTTP2ServerTests.test_sendAccordingToPriority.<locals>.<genexpr>°  r3  r&   c                 óÜ   •— t          ‰                     ¦   «         ¦  «        }‰                     t          |¦  «        d¦  «         d„ |D ¦   «         }g d¢}‰                     ||¦  «         d S )Né   c                 óZ   — g | ](}t          |t          j        j        ¦  «        ¯!|j        ‘Œ)S r*   )r   r/   r0   rB   r  r—   s     r#   r*  zSHTTP2ServerTests.test_sendAccordingToPriority.<locals>.validate.<locals>.<listcomp>¾  s?   € ð ð ð Ø !­z¸!½ZÔ=MÔ=WÑ/XÔ/XðØ”ðð ð r&   )r,   r  r,   r,   r  r,   r,   r  rE  r  rE  r  rE  rE  rE  )r�   r  r  ry   )rÌ   r‘   r9  ÚexpectedOrderr8  r"   s       €€r#   r  z?HTTP2ServerTests.test_sendAccordingToPriority.<locals>.validate·  s~   ø€ Ý$ Q§W¢W¡Y¤YÑ/Ô/ˆFð ×Ò�S ™[œ[¨"Ñ-Ô-Ð-ðð Ø%+ðñ ô ˆIð JÐIÐIˆMØ×Ò˜Y¨Ñ6Ô6Ð6Ð6Ð6r&   )r   r   r   ÚChunkedHTTPHandlerProxyr  r  r4   r5   r^   rb   Úinsertr:  r;  r<  r+   r˜   rû   r   rü   r   r>  r›   r  r?  r  )
r"   rA  r‘   ÚpriorityFramerÿ   r   r  r8  r;   r  s
   `      @@@r#   Útest_sendAccordingToPriorityz-HTTP2ServerTests.test_sendAccordingToPriority�  sø  øøøø€ õ" ‰NŒNˆÝÑÔˆÝ‰NŒNˆÝ2ˆÔØ Ô2ÐØ6Ð˜!Ñð
ð 
ð 
ð 
ð 
à%ð
ñ 
ô 
ˆð 	ˆqŒ	�!ŒÔ×Ò˜zÑ*Ô*Ð*Ø%'ˆˆqŒ	�!ŒÔ"àˆqŒ	�!ŒÔ×Ò˜zÑ*Ô*Ð*Ø%'ˆˆqŒ	�!ŒÔ"à×,Ò,ØØØØð	 -ñ 
ô 
ˆð 	ˆqŒ	×Ò˜˜MÑ*Ô*Ð*å”×.Ò.¨vÑ6Ô6ˆØ×0Ò0Ñ2Ô2ˆØ˜ŸšÐ GÐ GÀÐ GÑ GÔ GÑGÔGÑGˆà	×Ò˜ÑÔÐå˜lÑ+Ô+ð 	!ð 	!ˆDØ�NŠN˜4Ñ Ô Ð Ð ð	7ð 	7ð 	7ð 	7ð 	7ð 	7õ Ô!¥$ qÔ'@×'GÒ'GÑ'IÔ'IÑ"JÔ"JÑKÔK×WÒWØñ
ô 
ð 	
r&   c                 óê  — t          ¦   «         }t          ¦   «         }t          ¦   «         }t          |_        |                     ¦   «         }|t          | j        g |¦  «        z  }||                     dd| j        dg¬¦  «         	                    ¦   «         z  }| 
                    |¦  «         t          |¦  «        D ] }|                     |¦  «         |j        r nŒ!t          |                     ¦   «         ¦  «        }|                      t#          |¦  «        d¦  «         |                      t'          |d         t(          j        j        ¦  «        ¦  «         |                      |j        ¦  «         dS )zR
        A protocol error from the remote peer terminates the connection.
        r,   r
  r.   )r9   rf   r8   r4   r  rŒ   N)r   r   r   r   r  r+   r™   r  rg   r–   rû   r   rü   Údisconnectingr�   r  r  ry   r  r   r/   r0   rP   )r"   r;   r8  rA  rÿ   r   r‘   s          r#   Ú&test_protocolErrorTerminatesConnectionz7HTTP2ServerTests.test_protocolErrorTerminatesConnectionÈ  s]  € õ ‰NŒNˆÝÑÔˆÝ‰NŒNˆÝ0ˆÔð ×0Ò0Ñ2Ô2ˆØÕ)¨$Ô*@À"ÀaÑHÔHÑHˆØ˜×/Ò/ØØØÔ*Ø �/ð	 0ñ 
ô 
÷
 Š)‰+Œ+ñ	ˆð 	
×Ò˜ÑÔÐå˜lÑ+Ô+ð 	ð 	ˆDØ�NŠN˜4Ñ Ô Ð ð Œð Ø�ðõ ! §¢¡¤Ñ+Ô+ˆð
 	×Ò�˜V™œ aÑ(Ô(Ð(Ø�Š�
 6¨"¤:­zÔ/?Ô/KÑLÔLÑMÔMÐMØ�Š˜œÑ(Ô(Ð(Ð(Ð(r&   c                 óÒ  ‡ ‡— t          ¦   «         }t          |_        ‰                      |‰ j        ‰ j        ¦  «        \  }Š|j        d         j        j        }‰  	                    |j
        ¦  «         t          ‰                     ¦   «         ¦  «        }‰                      t          |¦  «        d¦  «         |                     ¦   «          ‰                      |j
        ¦  «         ‰                      |j        d¦  «         t          ‰                     ¦   «         ¦  «        }‰                      t          |¦  «        d¦  «         ˆ ˆfd„}|j        d                              |¦  «        S )z›
        The H2Stream data implements IPushProducer, and can have its data
        production controlled by the Request if the Request chooses to.
        r,   s   hello world, it's http/2!r
  c                 óÔ   •— t          ‰                     ¦   «         ¦  «        }‰                     t          |¦  «        d¦  «         ‰                     d|d         j        v ¦  «         d S ©Nr  r�   rŒ   ©r�   r  r  ry   r  r4   r  s     €€r#   r  z;HTTP2ServerTests.test_streamProducingData.<locals>.validate  s\   ø€ å$ Y§_¢_Ñ%6Ô%6Ñ7Ô7ˆFð ×Ò�S ™[œ[¨!Ñ,Ô,Ð,Ø�OŠO˜L¨F°2¬JÔ,<Ð<Ñ=Ô=Ð=Ð=Ð=r&   )r   ÚConsumerDummyHandlerProxyr  r  r#  r$  ÚstreamsÚ_requestÚoriginalÚassertFalser´   r�   r  r  ry   rº   r  rq   r  r  )r"   rÚ   r¬   Úrequestr‘   r  rþ   s   `     @r#   Útest_streamProducingDataz)HTTP2ServerTests.test_streamProducingDataï  sO  øø€ õ
 "‘^”^ˆ
Ý$=ˆ
Ô!Ø×-Ò-Ø˜Ô/°Ô1Eñ
ô 
‰ˆˆ9ð Ô$ QÔ'Ô0Ô9ˆØ×Ò˜Ô1Ñ2Ô2Ð2õ
 ! §¢Ñ!2Ô!2Ñ3Ô3ˆØ×Ò�˜V™œ aÑ(Ô(Ð(ð
 	×ÒÑÔÐØ�Š˜Ô0Ñ1Ô1Ð1Ø�Š˜œÐ'CÑDÔDÐDõ
 ! §¢Ñ!2Ô!2Ñ3Ô3ˆØ×Ò�˜V™œ aÑ(Ô(Ð(ð	>ð 	>ð 	>ð 	>ð 	>ð 	>ð Ô1°!Ô4×@Ò@ÀÑJÔJÐJr&   c                 ó˜  ‡ ‡	— t          ¦   «         }t          ¦   «         Š	t          ¦   «         }t          |_        t          ‰ j        ‰ j        |¦  «        }t          ¦   «         |d         _	        | 
                    ¦   «         }|d                     d„ |D ¦   «         ¦  «        z  }|                     ‰	¦  «         t          |¦  «        D ]}|                     |¦  «         Œ|j        d         j        j        }‰                      |j        ¦  «         |j        d         }|                     ¦   «          ˆ	ˆ fd„}|                     |¦  «        S )zù
        The H2Stream data implements IPushProducer, and can have its data
        production controlled by the Request if the Request chooses to.
        When the production is stopped, that causes the stream connection to
        be lost.
        rŒ   r&   c              3   ó>   K  — | ]}|                      ¦   «         V — Œd S r   r•   r—   s     r#   r‹   zAHTTP2ServerTests.test_abortStreamProducingData.<locals>.<genexpr>,  ó*   è è € Ð ?Ð ?°1 §¢¡¤Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?r&   r,   c                 óB  •— t          ‰                     ¦   «         ¦  «        }‰                     t          |¦  «        d¦  «         ‰                     t          |d         t          j        j        ¦  «        ¦  «         ‰                     |d         j	        d¦  «         d S )Nr
  rŒ   r,   )
r�   r  r  ry   r  r   r/   r0   rY   r  )r9   r‘   r8  r"   s     €€r#   r  z@HTTP2ServerTests.test_abortStreamProducingData.<locals>.validate?  s   ø€ å$ Q§W¢W¡Y¤YÑ/Ô/ˆFð ×Ò�S ™[œ[¨!Ñ,Ô,Ð,Ø�OŠO�J v¨b¤zµ:Ô3CÔ3RÑSÔSÑTÔTÐTØ×Ò˜V BœZÔ1°1Ñ5Ô5Ð5Ð5Ð5r&   )r   r   r   Ú!AbortingConsumerDummyHandlerProxyr  r’   r#  r$  rA   r4   r+   r˜   rû   r   rü   r[  r\  r]  r^  r´   r  rº   r  )
r"   r;   rA  r‘   rÿ   r   r_  ÚcleanupCallbackr  r8  s
   `        @r#   Útest_abortStreamProducingDataz.HTTP2ServerTests.test_abortStreamProducingData  sL  øø€ õ ‰NŒNˆÝÑÔˆÝ‰NŒNˆÝ<ˆÔõ $ DÔ$;¸TÔ=QÐSTÑUÔUˆÝ™5œ5ˆˆrŒ
ÔØ×0Ò0Ñ2Ô2ˆØ˜ŸšÐ ?Ð ?¸Ð ?Ñ ?Ô ?Ñ?Ô?Ñ?ˆØ	×Ò˜ÑÔÐå˜lÑ+Ô+ð 	!ð 	!ˆDØ�NŠN˜4Ñ Ô Ð Ð ð ”)˜A”,Ô'Ô0ˆØ×Ò˜Ô1Ñ2Ô2Ð2ð Ô3°AÔ6ˆð 	×ÒÑÔÐð	6ð 	6ð 	6ð 	6ð 	6ð 	6ð ×*Ò*¨8Ñ4Ô4Ð4r&   c                 óX  ‡ ‡— t          ¦   «         }t          |_        ‰                      |‰ j        g ¦  «        \  }Š|j        d         j        j        }|                     d¦  «         |                     d¦  «         |j	        d         }| 
                    |                     dd¬¦  «                             ¦   «         ¦  «         ‰                      |j        ¦  «         ‰                      |j        du ¦  «         |                     d¦  «         ˆ ˆfd„}|                     |¦  «        S )z³
        When a RstStream frame is received, the L{H2Connection} and L{H2Stream}
        objects tear down the L{http.Request} and swallow all outstanding
        writes.
        r,   ó   first chunkó   second chunk)rU   Ns   third chunkc                 óB  •— t          ‰                     ¦   «         ¦  «        }‰                     t          |¦  «        d¦  «         ‰                     |d         j        d¦  «         ‰                     t          |d         t          j        j	        ¦  «        ¦  «         d S ©Nr
  r,   ©
r�   r  r  ry   r  r  r   r/   r0   r1   r  s     €€r#   r  z9HTTP2ServerTests.test_terminatedRequest.<locals>.validateu  ó   ø€ Ý$ Y§_¢_Ñ%6Ô%6Ñ7Ô7ˆFà×Ò�S ™[œ[¨!Ñ,Ô,Ð,Ø×Ò˜V AœYÔ0°!Ñ4Ô4Ð4à�OŠO�J v¨a¤yµ*Ô2BÔ2OÑPÔPÑQÔQÐQÐQÐQr&   )r   ÚDummyProducerHandlerProxyr  r  r  r[  r\  r]  r¨   r  rü   rZ   r–   r  Ú_disconnectedr²   r  ©r"   rÚ   rŠ   r_  rf  r  rþ   s   `     @r#   Útest_terminatedRequestz'HTTP2ServerTests.test_terminatedRequestJ  s?  øø€ õ "‘^”^ˆ
Ý$=ˆ
Ô!Ø"&×"8Ò"8Ø˜Ô.°ñ#
ô #
Ñˆ�ið
 Ô$ QÔ'Ô0Ô9ˆð 	�Š�nÑ%Ô%Ð%Ø�Š�oÑ&Ô&Ð&ð %Ô<¸QÔ?ˆð 	×ÒØ×,Ò,¨Q¸!Ð,Ñ<Ô<×FÒFÑHÔHñ	
ô 	
ð 	
ð
 	�Š˜Ô-Ñ.Ô.Ð.Ø�Š˜œ¨4Ð/Ñ0Ô0Ð0ð 	�Š�nÑ%Ô%Ð%ð	Rð 	Rð 	Rð 	Rð 	Rð 	Rð ×*Ò*¨8Ñ4Ô4Ð4r&   c                 ó`  ‡ ‡— t          ¦   «         }t          |_        ‰                      |‰ j        g ¦  «        \  }Š|j        d         j        j        }|                     d¦  «         |                     d¦  «         |j	        d         }| 
                    |                     d¬¦  «                             ¦   «         ¦  «         ‰                      |j        ¦  «         ‰                      |j        du ¦  «         ‰                      |j        ¦  «         ˆ ˆfd„}|                     |¦  «        S )z¶
        When a GoAway frame is received, the L{H2Connection} and L{H2Stream}
        objects tear down all outstanding L{http.Request} objects and stop all
        writing.
        r,   ri  rj  r   ©rT   Nc                 óB  •— t          ‰                     ¦   «         ¦  «        }‰                     t          |¦  «        d¦  «         ‰                     |d         j        d¦  «         ‰                     t          |d         t          j        j	        ¦  «        ¦  «         d S rl  rm  r  s     €€r#   r  z<HTTP2ServerTests.test_terminatedConnection.<locals>.validate©  rn  r&   )r   ro  r  r  r  r[  r\  r]  r¨   r  rü   rW   r–   r  rp  r²   r^  Ú_stillProducingr  rq  s   `     @r#   Útest_terminatedConnectionz*HTTP2ServerTests.test_terminatedConnection  sB  øø€ õ "‘^”^ˆ
Ý$=ˆ
Ô!Ø"&×"8Ò"8Ø˜Ô.°ñ#
ô #
Ñˆ�ið
 Ô$ QÔ'Ô0Ô9ˆð 	�Š�nÑ%Ô%Ð%Ø�Š�oÑ&Ô&Ð&ð %Ô<¸QÔ?ˆð 	×ÒØ×)Ò)°qÐ)Ñ9Ô9×CÒCÑEÔEñ	
ô 	
ð 	
ð
 	�Š˜Ô-Ñ.Ô.Ð.Ø�Š˜œ¨4Ð/Ñ0Ô0Ð0ð 	×Ò˜Ô3Ñ4Ô4Ð4ð	Rð 	Rð 	Rð 	Rð 	Rð 	Rð ×*Ò*¨8Ñ4Ô4Ð4r&   c                 óÐ   ‡ ‡— t          ¦   «         }t          |_        ‰ j        dgz   }‰                      ||g ¦  «        \  }Šˆ ˆfd„}|j        d                              |¦  «        S )zq
        Requests containing Expect: 100-continue cause provisional 100
        responses to be emitted.
        )s   expects   100-continuec                 óð  •— t          ‰                     ¦   «         ¦  «        }‰                     t          |¦  «        d¦  «         ‰                     t          d„ |dd …         D ¦   «         ¦  «        ¦  «         ‰                     t          |d         t          j        j	        ¦  «        ¦  «         ‰                     |d         j
        dg¦  «         ‰                     d|d         j        v ¦  «         d S )NrE  c              3   ó,   K  — | ]}|j         d k    V — ŒdS r  r  r—   s     r#   r‹   zQHTTP2ServerTests.test_respondWith100Continue.<locals>.validate.<locals>.<genexpr>Ç  r	  r&   r,   )rò   s   100r�   rŒ   )r�   r  r  ry   r  r  r   r/   r0   r1   r3   r4   r  s     €€r#   r  z>HTTP2ServerTests.test_respondWith100Continue.<locals>.validateÃ  sÑ   ø€ Ý$ Y§_¢_Ñ%6Ô%6Ñ7Ô7ˆFà×Ò�S ™[œ[¨!Ñ,Ô,Ð,Ø�OŠO�CÐEÐE¸&ÀÀÀ¼*ÐEÑEÔEÑEÔEÑFÔFÐFà�OŠO�J v¨a¤yµ*Ô2BÔ2OÑPÔPÑQÔQÐQØ×Ò˜V AœYœ^Ð.BÐ-CÑDÔDÐDØ�OŠO˜L¨F°2¬JÔ,<Ð<Ñ=Ô=Ð=Ð=Ð=r&   r,   )r   r   r  r  r  r  r  )r"   rÚ   r8   r¬   r  rþ   s   `    @r#   Útest_respondWith100Continuez,HTTP2ServerTests.test_respondWith100Continue³  s�   øø€ õ
 "‘^”^ˆ
Ý$9ˆ
Ô!ð Ô(Ð,HÐ+IÑIˆà×-Ò-¨j¸'À2ÑFÔF‰ˆˆ9ð
	>ð 	>ð 	>ð 	>ð 	>ð 	>ð Ô1°!Ô4×@Ò@ÀÑJÔJÐJr&   c                 óŽ  ‡ ‡— t          ¦   «         }t          |_        ‰                      |‰ j        g ¦  «        \  }Š|j        d         }|j        j        }|j        d         }| 	                    ¦   «          ‰  
                    |j        ¦  «         ‰  
                    |j        du ¦  «         ˆ ˆfd„}|                     |¦  «        S )z´
        Triggering the call to L{H2Stream._respondToBadRequestAndDisconnect}
        leads to a 400 error being sent automatically and the stream being torn
        down.
        r,   Nc                 óˆ  •— t          ‰                     ¦   «         ¦  «        }‰                     t          |¦  «        d¦  «         ‰                     t          |d         t          j        j        ¦  «        ¦  «         ‰                     |d         j	        dg¦  «         ‰                     d|d         j
        v ¦  «         d S )Nr
  r,   )rò   s   400r�   rŒ   )r�   r  r  ry   r  r   r/   r0   r1   r3   r4   r  s     €€r#   r  z6HTTP2ServerTests.test_respondWith400.<locals>.validateë  s    ø€ Ý$ Y§_¢_Ñ%6Ô%6Ñ7Ô7ˆFà×Ò�S ™[œ[¨!Ñ,Ô,Ð,à�OŠO�J v¨a¤yµ*Ô2BÔ2OÑPÔPÑQÔQÐQØ×Ò˜V AœYœ^Ð.BÐ-CÑDÔDÐDØ�OŠO˜L¨F°2¬JÔ,<Ð<Ñ=Ô=Ð=Ð=Ð=r&   )r   ro  r  r  r  r[  r\  r]  r  Ú!_respondToBadRequestAndDisconnectr  rp  r²   r  )r"   rÚ   r¬   Ústreamr_  rf  r  rþ   s   `      @r#   Útest_respondWith400z$HTTP2ServerTests.test_respondWith400Ï  sÔ   øø€ õ "‘^”^ˆ
Ý$=ˆ
Ô!Ø×-Ò-¨j¸$Ô:PÐRTÑUÔU‰ˆˆ9ð Ô# AÔ&ˆØ”/Ô*ˆØ$Ô<¸QÔ?ˆð 	×0Ò0Ñ2Ô2Ð2ð 	�Š˜Ô-Ñ.Ô.Ð.Ø�Š˜œ¨4Ð/Ñ0Ô0Ð0ð	>ð 	>ð 	>ð 	>ð 	>ð 	>ð ×*Ò*¨8Ñ4Ô4Ð4r&   c                 ó^  ‡ ‡‡— t          ¦   «         }t          |_        ‰                      |‰ j        g ¦  «        \  }Š|j        d         }|j        j        }g d¢Š‰D ]}|                     |¦  «         Œ| 	                    ¦   «          ˆˆ ˆfd„}|j
        d                              |¦  «        S )zœ
        Calling L{Request.loseConnection} causes all data that has previously
        been sent to be flushed, and then the stream cleanly closed.
        r,   )ó   helloó   worldó   hereó   areó   someó   writesc                 óø  •— t          ‰                     ¦   «         ¦  «        }‰                     t          |¦  «        d¦  «         ‰                     t          d„ |dd …         D ¦   «         ¦  «        ¦  «         ‰                     t          |d         t          j        j	        ¦  «        ¦  «         ‰                     d|d         j
        v ¦  «         d„ |D ¦   «         }‰                     |‰dgz   ¦  «         d S )Nrw   c              3   ó,   K  — | ]}|j         d k    V — ŒdS r  r  r—   s     r#   r‹   zQHTTP2ServerTests.test_loseH2StreamConnection.<locals>.validate.<locals>.<genexpr>  r	  r&   r,   r�   rŒ   c                 óZ   — g | ](}t          |t          j        j        ¦  «        ¯!|j        ‘Œ)S r*   ©r   r/   r0   rB   r3   r—   s     r#   r*  zRHTTP2ServerTests.test_loseH2StreamConnection.<locals>.validate.<locals>.<listcomp>  ó?   € ð "ð "ð "Ø­*°Q½
Ô8HÔ8RÑ*SÔ*Sð"Ø”ð"ð "ð "r&   r&   ©r�   r  r  ry   r  r  r   r/   r0   r1   r4   )r9   r‘   ÚreceivedDataChunksÚ
dataChunksr"   rþ   s      €€€r#   r  z>HTTP2ServerTests.test_loseH2StreamConnection.<locals>.validate  sý   ø€ Ý$ Y§_¢_Ñ%6Ô%6Ñ7Ô7ˆFð ×Ò�S ™[œ[¨!Ñ,Ô,Ð,Ø�OŠO�CÐEÐE¸&ÀÀÀ¼*ÐEÑEÔEÑEÔEÑFÔFÐFà�OŠO�J v¨a¤yµ*Ô2BÔ2OÑPÔPÑQÔQÐQØ�OŠO˜L¨F°2¬JÔ,<Ð<Ñ=Ô=Ð=ð"ð "Ø &ð"ñ "ô "Ðð ×ÒØ"Ø˜c˜UÑ"ñô ð ð ð r&   )r   ro  r  r  r  r[  r\  r]  r¨   ÚloseConnectionr  r  )	r"   rÚ   r¬   r  r_  r‰   r  r�  rþ   s	   `      @@r#   Útest_loseH2StreamConnectionz,HTTP2ServerTests.test_loseH2StreamConnectionö  s×   øøø€ õ "‘^”^ˆ
Ý$=ˆ
Ô!Ø×-Ò-¨j¸$Ô:PÐRTÑUÔU‰ˆˆ9ð Ô# AÔ&ˆØ”/Ô*ˆð OÐNÐNˆ
Øð 	!ð 	!ˆEØ�MŠM˜%Ñ Ô Ð Ð ð 	×ÒÑ Ô Ð ð	ð 	ð 	ð 	ð 	ð 	ð 	ð$ Ô1°!Ô4×@Ò@ÀÑJÔJÐJr&   c                 óè   — t          ¦   «         }t          |_        |                      || j        g ¦  «         |j        d         }|j        j        }|                      t          |j
        |d¦  «         dS )zK
        The L{H2Stream} object forbids registering two producers.
        r,   TN)r   ro  r  r  r  r[  r\  r]  r×   Ú
ValueErrorrÈ   )r"   rÚ   r  r_  s       r#   Útest_cannotRegisterTwoProducersz0HTTP2ServerTests.test_cannotRegisterTwoProducers#  sl   € õ "‘^”^ˆ
Ý$=ˆ
Ô!Ø×Ò˜z¨4Ô+AÀ2ÑFÔFÐFð Ô# AÔ&ˆØ”/Ô*ˆà×Ò�* fÔ&=¸wÈÑMÔMÐMÐMÐMr&   c                 ó@  ‡ ‡‡— t          ¦   «         }t          |_        ‰                      |‰ j        g ¦  «        \  }Š|j        d         }|j        j        Š‰j        j	        }| 
                    ˆfd„¦  «         ˆ ˆfd„}|j        d          
                    |¦  «        S )zŒ
        L{Request} objects that have registered pull producers get blocked and
        unblocked according to HTTP/2 flow control.
        r,   c                 ó,   •— ‰                      ¦   «         S r   )rª   )r(  r_  s    €r#   ú<lambda>z;HTTP2ServerTests.test_handlesPullProducer.<locals>.<lambda>?  s   ø€ ¨w¯~ª~Ñ/?Ô/?€ r&   c                 óÖ   •— t          ‰                     ¦   «         ¦  «        }‰                     d|d         j        v ¦  «         d„ |D ¦   «         }‰                     |g d¢¦  «         d S )Nr�   rŒ   c                 óZ   — g | ](}t          |t          j        j        ¦  «        ¯!|j        ‘Œ)S r*   r‹  r—   s     r#   r*  zOHTTP2ServerTests.test_handlesPullProducer.<locals>.validate.<locals>.<listcomp>I  ó?   € ð ð ð Ø­*°Q½
Ô8HÔ8RÑ*SÔ*SðØ”ðð ð r&   )ó   0rê   rë   ó   3ó   4ó   5ó   6ó   7ó   8ó   9r&   ©r�   r  r  r4   r  ©r9   r‘   r�  r"   rþ   s      €€r#   r  z;HTTP2ServerTests.test_handlesPullProducer.<locals>.validateB  sˆ   ø€ Ý$ Y§_¢_Ñ%6Ô%6Ñ7Ô7ˆFð �OŠO˜L¨F°2¬JÔ,<Ð<Ñ=Ô=Ð=ðð Ø &ðñ ô ˆJð ×ÒØØQÐQÐQñô ð ð ð r&   )r   r   r  r  r  r[  r\  r]  Ú_actualProducerÚresultr  r  )r"   rÚ   r¬   r  ÚproducerCompleter  r_  rþ   s   `     @@r#   Útest_handlesPullProducerz)HTTP2ServerTests.test_handlesPullProducer1  s¶   øøø€ õ
 "‘^”^ˆ
Ý$Aˆ
Ô!Ø×-Ò-¨j¸$Ô:PÐRTÑUÔU‰ˆˆ9ð Ô# AÔ&ˆØ”/Ô*ˆØ"Ô2Ô9ÐØ×$Ò$Ð%?Ð%?Ð%?Ð%?Ñ@Ô@Ð@ð	ð 	ð 	ð 	ð 	ð 	ð Ô1°!Ô4×@Ò@ÀÑJÔJÐJr&   c                 ó,  — t          ¦   «         }t          |_        |                      || j        g ¦  «         |j        d         j        j        }|                      | 	                    ¦   «         ¦  «         |j        d          
                    ¦   «          dS )zJ
        L{Request} objects can correctly ask isSecure on HTTP/2.
        r,   N)r   r   r  r  r  r[  r\  r]  r^  ÚisSecureÚabortConnection)r"   rÚ   r_  s      r#   Útest_isSecureWorksProperlyz+HTTP2ServerTests.test_isSecureWorksProperlyS  sƒ   € õ "‘^”^ˆ
Ý$;ˆ
Ô!Ø×Ò˜z¨4Ô+AÀ2ÑFÔFÐFàÔ$ QÔ'Ô0Ô9ˆØ×Ò˜×)Ò)Ñ+Ô+Ñ,Ô,Ð,ØÔ˜1Ô×-Ò-Ñ/Ô/Ð/Ð/Ð/r&   c                 ó&  ‡ ‡— t          ¦   «         }t          |_        ‰                      |‰ j        g ¦  «        \  }Š|j        d         j        j        }t          j	        d|j
        ¦  «         ˆ ˆfd„}|j        d                              |¦  «        S )zL
        L{H2Connection} correctly unblocks when a stream is ended.
        r,   ç{®Gáz„?c                  óÔ   •— t          ‰                     ¦   «         ¦  «        }‰                     t          |¦  «        d¦  «         ‰                     d|d         j        v ¦  «         d S )Nr  r�   rŒ   rY  )r¶   r‘   r"   rþ   s     €€r#   ÚvalidateCompletezCHTTP2ServerTests.test_lateCompletionWorks.<locals>.validateCompletel  s\   ø€ Ý$ Y§_¢_Ñ%6Ô%6Ñ7Ô7ˆFð ×Ò�S ™[œ[¨!Ñ,Ô,Ð,Ø�OŠO˜L¨F°2¬JÔ,<Ð<Ñ=Ô=Ð=Ð=Ð=r&   )r   r   r  r  r  r[  r\  r]  r   Ú	callLaterrª   r  r  )r"   rÚ   r¬   r_  r°  rþ   s   `    @r#   Útest_lateCompletionWorksz)HTTP2ServerTests.test_lateCompletionWorks_  s�   øø€ õ "‘^”^ˆ
Ý$;ˆ
Ô!Ø×-Ò-¨j¸$Ô:PÐRTÑUÔU‰ˆˆ9ð Ô$ QÔ'Ô0Ô9ˆÝÔ˜$ ¤Ñ/Ô/Ð/ð	>ð 	>ð 	>ð 	>ð 	>ð 	>ð Ô1°!Ô4×@Ò@ÐAQÑRÔRÐRr&   c                 óz  ‡ ‡— t          ¦   «         }t          |_        ‰                      |‰ j        g ¦  «        \  }Š|j        d         }|j        j        }|                     d¦  «         | 	                    g d¢¦  «         | 
                    ¦   «          |j        d         }ˆ ˆfd„}|                     |¦  «        S )zW
        L{H2Stream} objects can send a series of frames via C{writeSequence}.
        r,   r¢   )ó   Helloó   ,ó   world!c                 óÖ   •— t          ‰                     ¦   «         ¦  «        }‰                     d|d         j        v ¦  «         d„ |D ¦   «         }‰                     |g d¢¦  «         d S )Nr�   rŒ   c                 óZ   — g | ](}t          |t          j        j        ¦  «        ¯!|j        ‘Œ)S r*   r‹  r—   s     r#   r*  zTHTTP2ServerTests.test_writeSequenceForChannels.<locals>.validate.<locals>.<listcomp>�  rš  r&   )r´  rµ  r¶  r&   r£  r¤  s      €€r#   r  z@HTTP2ServerTests.test_writeSequenceForChannels.<locals>.validate†  s}   ø€ Ý$ Y§_¢_Ñ%6Ô%6Ñ7Ô7ˆFð �OŠO˜L¨F°2¬JÔ,<Ð<Ñ=Ô=Ð=ðð Ø &ðñ ô ˆJð ×Ò˜ZÐ)IÐ)IÐ)IÑJÔJÐJÐJÐJr&   )r   r   r  r  r  r[  r\  r]  r¦   ÚwriteSequencerª   r  r  )r"   rÚ   r¬   r  r_  ÚcompletionDeferredr  rþ   s   `      @r#   Útest_writeSequenceForChannelsz.HTTP2ServerTests.test_writeSequenceForChannelsu  sÔ   øø€ õ "‘^”^ˆ
Ý$;ˆ
Ô!Ø×-Ò-¨j¸$Ô:PÐRTÑUÔU‰ˆˆ9àÔ# AÔ&ˆØ”/Ô*ˆà×Ò Ñ$Ô$Ð$Ø×ÒÐ8Ð8Ð8Ñ9Ô9Ð9Ø�ŠÑÔÐà'Ô?ÀÔBÐð
	Kð 
	Kð 
	Kð 
	Kð 
	Kð 
	Kð "×-Ò-¨hÑ7Ô7Ð7r&   c                 óò  ‡ ‡‡‡	‡
‡— t          ¦   «         Š
t          ¦   «         Št          ¦   «         Št          ‰_        ‰
                     ¦   «         }|‰
                     t          j        j	        j
        di¦  «                             ¦   «         z  }|t          ‰ j        g ‰
¦  «        z  }‰                     ‰¦  «         t          |¦  «        D ]}‰                     |¦  «         Œ‰j        d         }|j        j        Š‰                     d¦  «         g d¢Š	ˆ	ˆfd„}t+          j        t.          d|¦  «        }|                     ˆˆ
fd„¦  «         ˆˆ	ˆ fd„}‰j        d                              |¦  «        S )	zÔ
        Delaying writes from L{Request} causes the L{H2Connection} to block on
        sending until data is available. However, data is *not* sent if there's
        no room in the flow control window.
        rE  r,   ó   fiver)r„  r…  r†  r‡  c                  ód   •— ‰D ]} ‰                      | ¦  «         Œ‰                     ¦   «          d S r   )r¨   rª   )r‰   r�  r_  s    €€r#   Úwrite_chunksz7HTTP2ServerTests.test_delayWrites.<locals>.write_chunks³  s=   ø€ à#ð %ð %�Ø—’˜eÑ$Ô$Ð$Ð$Ø�NŠNÑÔÐÐÐr&   r®  c                  ó|   •— ‰                      ‰                     dd¬¦  «                             ¦   «         ¦  «        S )Nr,   é2   ©r9   rM   )rü   rN   r–   )r¶   rA  r;   s    €€r#   r—  z3HTTP2ServerTests.test_delayWrites.<locals>.<lambda>»  s7   ø€ ˜!Ÿ.š.Ø×(Ò(°!¸rÐ(ÑBÔB×LÒLÑNÔNñô € r&   c                 ó   •— t          ‰                     ¦   «         ¦  «        }‰                     t          |¦  «        d¦  «         ‰                     t          d„ |dd …         D ¦   «         ¦  «        ¦  «         ‰                     t          |d         t          j        j	        ¦  «        ¦  «         ‰                     d|d         j
        v ¦  «         d„ |D ¦   «         }‰                     |dg‰z   dgz   ¦  «         d S )	Nrw   c              3   ó,   K  — | ]}|j         d k    V — ŒdS r  r  r—   s     r#   r‹   zFHTTP2ServerTests.test_delayWrites.<locals>.validate.<locals>.<genexpr>Ç  r	  r&   r
  r�   rŒ   c                 óZ   — g | ](}t          |t          j        j        ¦  «        ¯!|j        ‘Œ)S r*   r‹  r—   s     r#   r*  zGHTTP2ServerTests.test_delayWrites.<locals>.validate.<locals>.<listcomp>Ì  rŒ  r&   r½  r&   r�  )r9   r‘   rŽ  r8  r�  r"   s      €€€r#   r  z3HTTP2ServerTests.test_delayWrites.<locals>.validateÂ  s  ø€ Ý$ Q§W¢W¡Y¤YÑ/Ô/ˆFð ×Ò�S ™[œ[¨!Ñ,Ô,Ð,Ø�OŠO�CÐEÐE¸&ÀÀÀ¼*ÐEÑEÔEÑEÔEÑFÔFÐFà�OŠO�J v¨a¤yµ*Ô2BÔ2OÑPÔPÑQÔQÐQØ�OŠO˜L¨F°2¬JÔ,<Ð<Ñ=Ô=Ð=ð"ð "Ø &ð"ñ "ô "Ðð ×ÒØ"Ø�
˜ZÑ'¨3¨%Ñ/ñô ð ð ð r&   )r   r   r   r   r  r+   rI   Úh2rG   ÚSettingCodesÚINITIAL_WINDOW_SIZEr–   r™   r  rû   r   rü   r[  r\  r]  r¨   r   Ú
deferLaterr   r  r  )r"   rÿ   r   r  r¿  Údr  rA  r8  r�  r;   r_  s   `      @@@@@r#   Útest_delayWritesz!HTTP2ServerTests.test_delayWrites”  sª  øøøøøø€ õ ‰NŒNˆÝÑÔˆÝ‰NŒNˆÝ2ˆÔà×0Ò0Ñ2Ô2ˆØ˜×,Ò,ÝŒ[Ô%Ô9¸1Ð=ñ
ô 
ç
Š)‰+Œ+ñ	ˆð 	Õ)¨$Ô*@À"ÀaÑHÔHÑHˆØ	×Ò˜ÑÔÐå˜lÑ+Ô+ð 	!ð 	!ˆDØ�NŠN˜4Ñ Ô Ð Ð ð ”˜1”ˆØ”/Ô*ˆð 	�Š�hÑÔÐØ:Ð:Ð:ˆ
ð	ð 	ð 	ð 	ð 	ð 	õ ŒO�G T¨<Ñ8Ô8ˆØ	�Šðð ð ð ð ñ	
ô 	
ð 	
ð	ð 	ð 	ð 	ð 	ð 	ð 	ð$ Ô(¨Ô+×7Ò7¸ÑAÔAÐAr&   c                 ó6  — t          ¦   «         }t          ¦   «         }t          ¦   «         }t          |_        |                     ¦   «         }|t          | j        g |¬¦  «        z  }||                     d¬¦  «         	                    ¦   «         z  }| 
                    |¦  «         |                     |¦  «         t          |                     ¦   «         ¦  «        }|                      t          |¦  «        d¦  «         |                      d|j        ¦  «         dS )zu
        A client that immediately resets after sending the body causes Twisted
        to send no response.
        ©r8   r3   rŠ   r,   r‡   N)r   r   r   r   r  r+   r™   r  rZ   r–   rû   rü   r�   r  r  ry   ÚassertNotInr  )r"   rŠ   rþ   rA  rÿ   r‘   s         r#   Útest_resetAfterBodyz$HTTP2ServerTests.test_resetAfterBodyÖ  s  € õ
 $‘~”~ˆÝ#Ñ%Ô%ˆ	Ý‰NŒNˆÝ0ˆÔà#×;Ò;Ñ=Ô=ˆØÕ)ØÔ*°À,ð
ñ 
ô 
ñ 	
ˆð 	˜×8Ò8À!Ð8ÑDÔD×NÒNÑPÔPÑPˆØ	×Ò˜Ñ#Ô#Ð#Ø	�Š�|Ñ$Ô$Ð$å  §¢Ñ!2Ô!2Ñ3Ô3ˆà×Ò�˜V™œ aÑ(Ô(Ð(Ø×Ò˜˜AÔ5Ñ6Ô6Ð6Ð6Ð6r&   c                 óª  ‡ ‡‡— t          j        ¦   «         Š G ˆfd„dt          ¦  «        }t          ¦   «         Št	          j        ¦   «         }t          |¦  «        ‰_        |‰_        t          ¦   «         ‰_
        ‰                      ‰‰ j        g ¦  «         ˆˆ fd„}‰                     |¦  «         ‰j        d         }t          j        ‰|g¦  «        S )z�
        A custom L{Request} subclass that requires the site and factory in the
        constructor is able to get them.
        c                   ó   •— e Zd Zˆ fd„ZdS )úTHTTP2ServerTests.test_RequestRequiringFactorySiteInConstructor.<locals>.SuperRequestc                 óˆ   •— t          j        | g|¢R i |¤Ž ‰                     | j        j        | j        j        f¦  «         d S r   )r   r$   Úcallbackr²   ÚsiteÚfactory)r"   r¶   r·   rÊ  s      €r#   r$   z]HTTP2ServerTests.test_RequestRequiringFactorySiteInConstructor.<locals>.SuperRequest.__init__õ  sK   ø€ Ý Ô)¨$Ð@°Ð@Ð@Ð@¸Ð@Ð@Ð@Ø—
’
˜DœLÔ-¨t¬|Ô/CÐDÑEÔEÐEÐEÐEr&   N)ri   rj   rk   r$   )rÊ  s   €r#   ÚSuperRequestrÒ  ô  s5   ø€ € € € € ðFð Fð Fð Fð Fð Fð Fr&   r×  c                 ó~   •— | \  }}‰                      |‰j        ¦  «         ‰                      |‰j        ¦  «         d S r   )ÚassertIsrÕ  rÖ  )r¶   rÕ  rÖ  rÚ   r"   s      €€r#   ÚvalidateFactoryAndSitez^HTTP2ServerTests.test_RequestRequiringFactorySiteInConstructor.<locals>.validateFactoryAndSite  s?   ø€ Ø ‰MˆD�'Ø�MŠM˜$ 
¤Ñ0Ô0Ð0Ø�MŠM˜' :Ô#5Ñ6Ô6Ð6Ð6Ð6r&   r,   )r   ÚDeferredr   r   r   ÚHTTPFactoryr   r  rÖ  ÚobjectrÕ  r  r  r  r  ÚgatherResults)r"   r×  ÚhttpFactoryrÚ  rf  rÚ   rÊ  s   `    @@r#   Ú-test_RequestRequiringFactorySiteInConstructorz>HTTP2ServerTests.test_RequestRequiringFactorySiteInConstructorí  s  øøø€ õ
 ŒNÑÔˆð	Fð 	Fð 	Fð 	Fð 	Fð 	Fð 	FÕ+ñ 	Fô 	Fð 	Fõ
 "‘^”^ˆ
ÝÔ&Ñ(Ô(ˆÝ$<¸\Ñ$JÔ$Jˆ
Ô!ð )ˆ
ÔÝ ™(œ(ˆ
Œà×Ò˜z¨4Ô+AÀ2ÑFÔFÐFð	7ð 	7ð 	7ð 	7ð 	7ð 	7ð
 	
�ŠÐ,Ñ-Ô-Ð-ð %Ô<¸QÔ?ˆÝÔ" A Ð#7Ñ8Ô8Ð8r&   c                 óx  ‡ — t          ¦   «         }t          t          ¦  «        |_        ‰                      |‰ j        g ¦  «        \  }}|j        j        }‰                      t          |¦  «        d¦  «         ˆ fd„}|d         }| 	                    |¦  «         |j
        d         }t          j        ||g¦  «        S )z…
        A request sent to a HTTP/2 connection fires the
        L{http.Request.notifyFinish} callback with a L{None} value.
        r,   c                 ó2   •— ‰                      | ¦  «         d S r   )ÚassertIsNone)r¦  r"   s    €r#   r  z?HTTP2ServerTests.test_notifyOnCompleteRequest.<locals>.validate  s   ø€ Ø×Ò˜fÑ%Ô%Ð%Ð%Ð%r&   r   )r   rÊ   r   r  r  r  rÌ   r  ry   r  r  r   rÞ  )r"   rÚ   r¬   rþ   Ú	deferredsr  rÊ  rf  s   `       r#   Útest_notifyOnCompleteRequestz-HTTP2ServerTests.test_notifyOnCompleteRequest  sÀ   ø€ õ
 "‘^”^ˆ
Ý$;Õ<LÑ$MÔ$Mˆ
Ô!Ø×-Ò-¨j¸$Ô:PÐRTÑUÔU‰ˆˆ9àÔ-Ô5ˆ	Ø×Ò�˜Y™œ¨Ñ+Ô+Ð+ð	&ð 	&ð 	&ð 	&ð 	&ð �aŒLˆØ	�Š�hÑÔÐð %Ô<¸QÔ?ˆÝÔ" A Ð#7Ñ8Ô8Ð8r&   c                 ó¼  ‡ — t          ¦   «         }t          t          ¦  «        |_        ‰                      |‰ j        g ¦  «        \  }}|j        j        }‰                      t          |¦  «        d¦  «         ˆ fd„}ˆ fd„}|d         }| 	                    ||¦  «         | 
                    d¬¦  «                             ¦   «         }|                     |¦  «         |S )zw
        A HTTP/2 reset stream fires the L{http.Request.notifyFinish} deferred
        with L{ConnectionLost}.
        r,   c                 ó2   •— ‰                      d¦  «         d S ©Nz#Didn't errback, called back instead©Úfail©Úignr"   s    €r#   rÔ  z;HTTP2ServerTests.test_notifyOnResetStream.<locals>.callback6  ó   ø€ Ø�IŠIÐ;Ñ<Ô<Ð<Ð<Ð<r&   c                 ó’   •— ‰                      | t          j        ¦  «         ‰                     | j        t
          j        ¦  «         d S r   ©ÚassertIsInstancer   ÚFailurerÙ  Útyper   ÚConnectionLost©Úreasonr"   s    €r#   Úerrbackz:HTTP2ServerTests.test_notifyOnResetStream.<locals>.errback9  ó9   ø€ Ø×!Ò! &­'¬/Ñ:Ô:Ð:Ø�MŠM˜&œ+¥uÔ';Ñ<Ô<Ð<Ø�4r&   r   r‡   )r   rÊ   r   r  r  r  rÌ   r  ry   ÚaddCallbacksrZ   r–   rü   )	r"   rÚ   rŠ   rþ   rä  rÔ  rö  rÊ  ÚinvalidDatas	   `        r#   Útest_notifyOnResetStreamz)HTTP2ServerTests.test_notifyOnResetStream&  sú   ø€ õ
 "‘^”^ˆ
Ý$;Õ<NÑ$OÔ$Oˆ
Ô!Ø"&×"8Ò"8Ø˜Ô.°ñ#
ô #
Ñˆ�ið Ô-Ô5ˆ	Ø×Ò�˜Y™œ¨Ñ+Ô+Ð+ð	=ð 	=ð 	=ð 	=ð 	=ð	ð 	ð 	ð 	ð 	ð
 �aŒLˆØ	�Š�x Ñ)Ô)Ð)ð #×6Ò6ÀÐ6ÑBÔB×LÒLÑNÔNˆØ×Ò Ñ,Ô,Ð,àˆr&   c                 ó6  ‡ — t          ¦   «         }t          t          ¦  «        |_        ‰                      |‰ j        g ¦  «        \  }}t          ‰ j        g |d¬¦  «        }|                     |¦  «         |j        j        }‰  	                    t          |¦  «        d¦  «         ˆ fd„}ˆ fd„}|D ]}|                     ||¦  «         Œ|                     dd¬¦  «                             ¦   «         }	|                     |	¦  «         t          j        |¦  «        S )	zÀ
        A HTTP/2 protocol error triggers the L{http.Request.notifyFinish}
        deferred for all outstanding requests with a Failure that contains the
        underlying exception.
        r  ©rŠ   r9   r
  c                 ó2   •— ‰                      d¦  «         d S rè  ré  rë  s    €r#   rÔ  z=HTTP2ServerTests.test_failWithProtocolError.<locals>.callbacka  rí  r&   c                 óœ   •— ‰                      | t          j        ¦  «         ‰                      | j        t          j        j        ¦  «         d S r   )rð  r   rñ  r  rÆ  Ú
exceptionsÚProtocolErrorrô  s    €r#   rö  z<HTTP2ServerTests.test_failWithProtocolError.<locals>.errbackd  s=   ø€ Ø×!Ò! &­'¬/Ñ:Ô:Ð:Ø×!Ò! &¤,µ´Ô0KÑLÔLÐLØ�4r&   ó   yoéð   ©r3   r9   )r   rÊ   r   r  r  r  r™   rü   rÌ   r  ry   rø  rC   r–   r   rÞ  ©
r"   rÚ   rŠ   rþ   ÚsecondRequesträ  rÔ  rö  rÊ  rù  s
   `         r#   Útest_failWithProtocolErrorz+HTTP2ServerTests.test_failWithProtocolErrorG  sI  ø€ õ "‘^”^ˆ
Ý$;Õ<NÑ$OÔ$Oˆ
Ô!Ø"&×"8Ò"8Ø˜Ô.°ñ#
ô #
Ñˆ�iõ *ØÔ" B°\ÈAð
ñ 
ô 
ˆð 	×Ò Ñ.Ô.Ð.ð Ô-Ô5ˆ	Ø×Ò�˜Y™œ¨Ñ+Ô+Ð+ð	=ð 	=ð 	=ð 	=ð 	=ð	ð 	ð 	ð 	ð 	ð
 ð 	.ð 	.ˆAØ�NŠN˜8 WÑ-Ô-Ð-Ð-ð #×1Ò1°uÀtÐ1ÑLÔL×VÒVÑXÔXˆØ×Ò Ñ,Ô,Ð,åÔ" 9Ñ-Ô-Ð-r&   c                 ó4  ‡ — t          ¦   «         }t          t          ¦  «        |_        ‰                      |‰ j        g ¦  «        \  }}t          ‰ j        g |d¬¦  «        }|                     |¦  «         |j        j        }‰  	                    t          |¦  «        d¦  «         ˆ fd„}ˆ fd„}|D ]}|                     ||¦  «         Œ|                     d¬¦  «                             ¦   «         }	|                     |	¦  «         t          j        |¦  «        S )z´
        A HTTP/2 GoAway triggers the L{http.Request.notifyFinish}
        deferred for all outstanding requests with a Failure that contains a
        RemoteGoAway error.
        r  rü  r
  c                 ó2   •— ‰                      d¦  «         d S rè  ré  rë  s    €r#   rÔ  z4HTTP2ServerTests.test_failOnGoaway.<locals>.callbackŒ  rí  r&   c                 ó’   •— ‰                      | t          j        ¦  «         ‰                     | j        t
          j        ¦  «         d S r   rï  rô  s    €r#   rö  z3HTTP2ServerTests.test_failOnGoaway.<locals>.errback�  r÷  r&   rt  )r   rÊ   r   r  r  r  r™   rü   rÌ   r  ry   rø  rW   r–   r   rÞ  r  s
   `         r#   Útest_failOnGoawayz"HTTP2ServerTests.test_failOnGoaways  sG  ø€ õ "‘^”^ˆ
Ý$;Õ<NÑ$OÔ$Oˆ
Ô!Ø"&×"8Ò"8Ø˜Ô.°ñ#
ô #
Ñˆ�iõ *ØÔ" B°\ÈAð
ñ 
ô 
ˆð 	×Ò Ñ.Ô.Ð.ð Ô-Ô5ˆ	Ø×Ò�˜Y™œ¨Ñ+Ô+Ð+ð	=ð 	=ð 	=ð 	=ð 	=ð	ð 	ð 	ð 	ð 	ð
 ð 	.ð 	.ˆAØ�NŠN˜8 WÑ-Ô-Ð-Ð-ð #×3Ò3ÀÐ3ÑCÔC×MÒMÑOÔOˆØ×Ò Ñ,Ô,Ð,åÔ" 9Ñ-Ô-Ð-r&   c                 óâ  ‡ — t          ¦   «         }t          t          ¦  «        |_        ‰                      |‰ j        g ¦  «        \  }}t          ‰ j        g |d¬¦  «        }|                     |¦  «         |j        j        }‰  	                    t          |¦  «        d¦  «         ˆ fd„}ˆ fd„}|D ]}|                     ||¦  «         Œ|                     ¦   «          t          j        |¦  «        S )zš
        The transport telling the HTTP/2 connection to stop producing will
        fire all L{http.Request.notifyFinish} errbacks with L{error.}
        r  rü  r
  c                 ó2   •— ‰                      d¦  «         d S rè  ré  rë  s    €r#   rÔ  z;HTTP2ServerTests.test_failOnStopProducing.<locals>.callback¶  rí  r&   c                 ó’   •— ‰                      | t          j        ¦  «         ‰                     | j        t
          j        ¦  «         d S r   rï  rô  s    €r#   rö  z:HTTP2ServerTests.test_failOnStopProducing.<locals>.errback¹  r÷  r&   )r   rÊ   r   r  r  r  r™   rü   rÌ   r  ry   rø  rÄ   r   rÞ  )	r"   rÚ   rŠ   rþ   r  rä  rÔ  rö  rÊ  s	   `        r#   Útest_failOnStopProducingz)HTTP2ServerTests.test_failOnStopProducing�  s#  ø€ õ "‘^”^ˆ
Ý$;Õ<NÑ$OÔ$Oˆ
Ô!Ø"&×"8Ò"8Ø˜Ô.°ñ#
ô #
Ñˆ�iõ *ØÔ" B°\ÈAð
ñ 
ô 
ˆð 	×Ò Ñ.Ô.Ð.ð Ô-Ô5ˆ	Ø×Ò�˜Y™œ¨Ñ+Ô+Ð+ð	=ð 	=ð 	=ð 	=ð 	=ð	ð 	ð 	ð 	ð 	ð
 ð 	.ð 	.ˆAØ�NŠN˜8 WÑ-Ô-Ð-Ð-ð 	× Ò Ñ"Ô"Ð"åÔ" 9Ñ-Ô-Ð-r&   c                 ó„  ‡ — t          ¦   «         }t          t          ¦  «        |_        ‰                      |‰ j        g ¦  «        \  }}|j        j        }‰                      t          |¦  «        d¦  «         ˆ fd„}ˆ fd„}|d         }| 	                    ||¦  «         |j
        d         }|                     ¦   «          |S )zË
        A HTTP/2 stream that has had _respondToBadRequestAndDisconnect called
        on it from a request handler calls the L{http.Request.notifyFinish}
        errback with L{ConnectionLost}.
        r,   c                 ó2   •— ‰                      d¦  «         d S rè  ré  rë  s    €r#   rÔ  z7HTTP2ServerTests.test_notifyOnFast400.<locals>.callback×  rí  r&   c                 ó’   •— ‰                      | t          j        ¦  «         ‰                     | j        t
          j        ¦  «         d S r   rï  rô  s    €r#   rö  z6HTTP2ServerTests.test_notifyOnFast400.<locals>.errbackÚ  r÷  r&   r   )r   rÊ   r   r  r  r  rÌ   r  ry   rø  r[  r~  )	r"   rÚ   rŠ   rþ   rä  rÔ  rö  rÊ  r  s	   `        r#   Útest_notifyOnFast400z%HTTP2ServerTests.test_notifyOnFast400Æ  sã   ø€ õ "‘^”^ˆ
Ý$;Õ<NÑ$OÔ$Oˆ
Ô!Ø"&×"8Ò"8Ø˜Ô.°ñ#
ô #
Ñˆ�ið Ô-Ô5ˆ	Ø×Ò�˜Y™œ¨Ñ+Ô+Ð+ð	=ð 	=ð 	=ð 	=ð 	=ð	ð 	ð 	ð 	ð 	ð
 �aŒLˆØ	�Š�x Ñ)Ô)Ð)ð Ô# AÔ&ˆØ×0Ò0Ñ2Ô2Ð2àˆr&   c                 ó  — t          ¦   «         }t          |¦  «        }|j        |_        t          |_        d}t          ¦   «         }t          ¦   «         }|                     ¦   «         }|                     |¦  «         | 	                    |¦  «         | 	                    t          | j        g ||¬¦  «        ¦  «         |                     ¦   «          d|_        |                     |¦  «         |                      |j        ¦  «         dS )zà
        A HTTP/2 stream that has had _respondToBadRequestAndDisconnect
        called on it does not write control frame data if its
        transport is paused and its control frame limit has been
        reached.
        r,   r‡   r   N)r
   r   r±  r   r  r   r   r+   rû   rü   r™   r  r³   Ú_maxBufferedControlFrameBytesr~  r  Údisconnected)r"   ÚmemoryReactorrÚ   r9   rŠ   rþ   r+   s          r#   Útest_fast400WithCircuitBreakerz/HTTP2ServerTests.test_fast400WithCircuitBreakerí  s  € õ +Ñ,Ô,ˆÝ! -Ñ0Ô0ˆ
Ø,Ô6ˆ
Ôõ %7ˆ
Ô!àˆå#‘~”~ˆÝ#Ñ%Ô%ˆ	ð #/×"FÒ"FÑ"HÔ"HÐØ×!Ò! )Ñ,Ô,Ð,Ø×ÒÐ 7Ñ8Ô8Ð8à×ÒÝØÔ&¨¨LÀ8ðñ ô ñ	
ô 	
ð 	
ð 	×!Ò!Ñ#Ô#Ð#Ø34ˆ
Ô0à×4Ò4°XÑ>Ô>Ð>à�Š˜	Ô.Ñ/Ô/Ð/Ð/Ð/r&   c                 óè  — t          ¦   «         }t          |_        t          ¦   «         }t	          ¦   «         }|                     ¦   «         }|                     |¦  «         |                     |¦  «         |                     ¦   «          t          dd¦  «        D ]<}|                     | 
                    i ¦  «                             ¦   «         ¦  «         Œ=t          |                     ¦   «         ¦  «        }|                      t          |¦  «        d¦  «         |                     ¦   «          t          |                     ¦   «         ¦  «        }|                      t          |¦  «        d¦  «         dS )z�
        If a the L{H2Connection} has been paused by the transport, it will
        not write automatic frame data triggered by writes.
        r   éd   r,   ée   N)r   r   r  r   r   r+   rû   rü   r³   r§   rI   r–   r�   r  r  ry   r¹   )r"   rÚ   rŠ   rþ   r+   r¬   r‘   s          r#   Ú test_bufferingAutomaticFrameDataz1HTTP2ServerTests.test_bufferingAutomaticFrameData  sD  € õ "‘^”^ˆ
Ý$9ˆ
Ô!Ý#‘~”~ˆÝ#Ñ%Ô%ˆ	à".×"FÒ"FÑ"HÔ"HÐØ×!Ò! )Ñ,Ô,Ð,Ø×ÒÐ 7Ñ8Ô8Ð8ð 	×!Ò!Ñ#Ô#Ð#õ �q˜#‘”ð 	Uð 	UˆAØ×#Ò# L×$CÒ$CÀBÑ$GÔ$G×$QÒ$QÑ$SÔ$SÑTÔTÐTÐTå  §¢Ñ!2Ô!2Ñ3Ô3ˆØ×Ò�˜V™œ aÑ(Ô(Ð(ð 	×"Ò"Ñ$Ô$Ð$Ý  §¢Ñ!2Ô!2Ñ3Ô3ˆØ×Ò�˜V™œ cÑ*Ô*Ð*Ð*Ð*r&   c                 óÎ  — t          ¦   «         }t          |_        t          ¦   «         }t	          ¦   «         }|                     ¦   «         }|                     |¦  «         |                     |¦  «         |                     ¦   «          d|_	        |  
                    |j        ¦  «         t          dd¦  «        D ]<}|                     |                     i ¦  «                             ¦   «         ¦  «         Œ=|  
                    |j        ¦  «         |                     |                     i ¦  «                             ¦   «         ¦  «         |                      |j        ¦  «         dS )zÕ
        If the L{H2Connection} has been paused by the transport, it will
        not write automatic frame data triggered by writes. If this buffer
        gets too large, the connection will be dropped.
        r  r   é   N)r   r   r  r   r   r+   rû   rü   r³   r  r^  rT  r§   rI   r–   r  r  )r"   rÚ   rŠ   rþ   r+   r¬   s         r#   Ú2test_bufferingAutomaticFrameDataWithCircuitBreakerzCHTTP2ServerTests.test_bufferingAutomaticFrameDataWithCircuitBreaker6  sG  € õ "‘^”^ˆ
Ý$9ˆ
Ô!Ý#‘~”~ˆÝ#Ñ%Ô%ˆ	à".×"FÒ"FÑ"HÔ"HÐØ×!Ò! )Ñ,Ô,Ð,Ø×ÒÐ 7Ñ8Ô8Ð8ð 	×!Ò!Ñ#Ô#Ð#ð 47ˆ
Ô0ð 	×Ò˜Ô0Ñ1Ô1Ð1Ý�q˜"‘”ð 	Uð 	UˆAØ×#Ò# L×$CÒ$CÀBÑ$GÔ$G×$QÒ$QÑ$SÔ$SÑTÔTÐTÐTØ×Ò˜Ô0Ñ1Ô1Ð1ð 	×Ò × ?Ò ?ÀÑ CÔ C× MÒ MÑ OÔ OÑPÔPÐPØ�Š˜	Ô.Ñ/Ô/Ð/Ð/Ð/r&   c                 óh  —  G d„ dt           ¦  «        }t          ¦   «         }t          |_        t	          ¦   «         } |¦   «         }|                     |d¦  «         |                     ¦   «         }|                     |¦  «         |                     |¦  «         |  	                    |j
        ¦  «         t          |                     ¦   «         ¦  «        }|                      t          |¦  «        d¦  «         |                      |j        d¦  «         t!          dd¦  «        D ]<}|                     |                     i ¦  «                             ¦   «         ¦  «         Œ=t          |                     ¦   «         ¦  «        }|                      t          |¦  «        d¦  «         |                      |j        d¦  «         |                     ¦   «          t          |                     ¦   «         ¦  «        }|                      t          |¦  «        d¦  «         |                      |j        d	¦  «         d
S )z¯
        If the L{H2Connection} has buffered control frames, is unpaused, and then
        paused while unbuffering, it persists the buffer and stops trying to write.
        c                   ó   — e Zd Zd„ ZdS )úeHTTP2ServerTests.test_bufferingContinuesIfProducerIsPausedOnWrite.<locals>.AutoPausingStringTransportc                 ób   — t          j        | g|¢R i |¤Ž | j                             ¦   «          d S r   )r   r¨   Úproducerr³   rµ   s      r#   r¨   zkHTTP2ServerTests.test_bufferingContinuesIfProducerIsPausedOnWrite.<locals>.AutoPausingStringTransport.write_  s=   € ÝÔ% dÐ<¨TÐ<Ð<Ð<°VÐ<Ð<Ð<Ø”×,Ò,Ñ.Ô.Ð.Ð.Ð.r&   N)ri   rj   rk   r¨   r*   r&   r#   ÚAutoPausingStringTransportr!  ^  s#   € € € € € ð/ð /ð /ð /ð /r&   r$  Tr,   r   r  éc   r
  éZ   N)r   r   r   r  r   rÈ   r+   rû   rü   ÚassertIsNotNoneÚ_consumerBlockedr�   r  r  ry   Ú_bufferedControlFrameBytesr§   rI   r–   r¹   )r"   r$  rÚ   rŠ   rþ   r+   r‘   r¬   s           r#   Ú0test_bufferingContinuesIfProducerIsPausedOnWritezAHTTP2ServerTests.test_bufferingContinuesIfProducerIsPausedOnWriteX  s
  € ð	/ð 	/ð 	/ð 	/ð 	/­ñ 	/ô 	/ð 	/õ "‘^”^ˆ
Ý$9ˆ
Ô!Ý#‘~”~ˆØ.Ð.Ñ0Ô0ˆ	Ø×"Ò" :¨tÑ4Ô4Ð4à".×"FÒ"FÑ"HÔ"HÐØ×!Ò! )Ñ,Ô,Ð,Ø×ÒÐ 7Ñ8Ô8Ð8ð 	×Ò˜ZÔ8Ñ9Ô9Ð9Ý  §¢Ñ!2Ô!2Ñ3Ô3ˆØ×Ò�˜V™œ aÑ(Ô(Ð(Ø×Ò˜Ô>ÀÑBÔBÐBõ �q˜"‘”ð 	Uð 	UˆAØ×#Ò# L×$CÒ$CÀBÑ$GÔ$G×$QÒ$QÑ$SÔ$SÑTÔTÐTÐTå  §¢Ñ!2Ô!2Ñ3Ô3ˆØ×Ò�˜V™œ aÑ(Ô(Ð(Ø×Ò˜Ô>ÀÑGÔGÐGð 	×"Ò"Ñ$Ô$Ð$å  §¢Ñ!2Ô!2Ñ3Ô3ˆØ×Ò�˜V™œ aÑ(Ô(Ð(Ø×Ò˜Ô>ÀÑGÔGÐGÐGÐGr&   c                 óò  — t          ¦   «         }t          |¦  «        }|j        |_        t          ¦   «         }t	          ¦   «         }|                     ¦   «         }|                     |¦  «         |                     |¦  «         |                     ¦   «          d|_	        | 
                    dd¬¦  «                             ¦   «         }|                     |¦  «         |                      |j        ¦  «         dS )zÈ
        A client that triggers a L{h2.exceptions.ProtocolError} over a
        paused connection that's reached its buffered control frame
        limit causes that connection to be aborted.
        r   r  r  r  N)r
   r   r±  r   r   r+   rû   rü   r³   r  rC   r–   r  r  )r"   r  rÚ   rŠ   rþ   r+   rù  s          r#   Ú+test_circuitBreakerAbortsAfterProtocolErrorz<HTTP2ServerTests.test_circuitBreakerAbortsAfterProtocolError…  së   € õ +Ñ,Ô,ˆÝ! -Ñ0Ô0ˆ
Ø,Ô6ˆ
Ôå#‘~”~ˆÝ#Ñ%Ô%ˆ	ð #/×"FÒ"FÑ"HÔ"HÐØ×!Ò! )Ñ,Ô,Ð,Ø×ÒÐ 7Ñ8Ô8Ð8ð 	×!Ò!Ñ#Ô#Ð#Ø34ˆ
Ô0ð #×1Ò1°uÀtÐ1ÑLÔL×VÒVÑXÔXˆð 	×Ò Ñ,Ô,Ð,Ø�Š˜	Ô.Ñ/Ô/Ð/Ð/Ð/r&   N)+ri   rj   rk   r  r#  r$  r  r  r!  r"  r  r  r%  r-  rB  rR  rU  r`  rg  rr  rw  r{  r€  r‘  r”  r¨  r¬  r²  r»  rË  rÏ  rà  rå  rú  r  r
  r  r  r  r  r  r*  r,  r*   r&   r#   rß   rß   —  s¥  € € € € € ðð ð Ððð ð Ðð DÐCÐC€Oðð ð Ðð *€Oðð ð Ðð BÐð'ð 'ð 'ð:Kð Kð Kð8Kð Kð Kð8)Kð )Kð )KðV>
ð >
ð >
ð@E
ð E
ð E
ðN%)ð %)ð %)ðN+Kð +Kð +KðZ,5ð ,5ð ,5ð\35ð 35ð 35ðj25ð 25ð 25ðhKð Kð Kð8%5ð %5ð %5ðN+Kð +Kð +KðZNð Nð Nð Kð  Kð  KðD
0ð 
0ð 
0ðSð Sð Sð,8ð 8ð 8ð>@Bð @Bð @BðD7ð 7ð 7ð. 9ð  9ð  9ðD9ð 9ð 9ð.ð ð ðB*.ð *.ð *.ðX(.ð (.ð (.ðT'.ð '.ð '.ðR%ð %ð %ðN(0ð (0ð (0ðT+ð +ð +ð> 0ð  0ð  0ðD+Hð +Hð +HðZ0ð 0ð 0ð 0ð 0r&   rß   c                   ó€   — e Zd ZdZg d¢ZdZg d¢Zg 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d„ Zd„ ZdS )ÚH2FlowControlTestszT
    Tests that ensure that we handle HTTP/2 flow control limits appropriately.
    )rá   rä   rå   rç   rè   rö   rì   rð   rù   c                 óÞ  ‡ ‡	— t          ¦   «         }t          ¦   «         Š	t          ¦   «         }t          |_        |                     ¦   «         }||                     t          j        j	        j
        di¦  «                             ¦   «         z  }|t          ‰ j        g |¦  «        z  }|                     ‰	¦  «         t          |¦  «        D ]}|                     |¦  «         Œt#          ‰ j        ¦  «        dz
  }t'          |¦  «        D ]@}|                     dd¬¦  «        }|                     |                     ¦   «         ¦  «         ŒAˆ	ˆ fd„}|j        d                              |¦  «        S )zç
        When a L{Request} object is not using C{IProducer} to generate data and
        so is not having backpressure exerted on it, the L{H2Stream} object
        will buffer data until the flow control window is opened.
        rE  r,   rÂ  c                 ó  •— t          ‰                     ¦   «         ¦  «        }‰                     d|d         j        v ¦  «         d                     d„ |D ¦   «         ¦  «        }‰                     ‰j        |¦  «         d S )Nr�   rŒ   r&   c              3   ób   K  — | ]*}t          |t          j        j        ¦  «        ¯!|j        V — Œ+d S r   r‹  r—   s     r#   r‹   zMH2FlowControlTests.test_bufferExcessData.<locals>.validate.<locals>.<genexpr>ç  óM   è è € ð *ð *Ø­*°Q½
Ô8HÔ8RÑ*SÔ*Sð*Ø”ð*ð *ð *ð *ð *ð *r&   )r�   r  r  r4   r˜   r  r  ©r9   r‘   ÚactualResponseDatar8  r"   s      €€r#   r  z:H2FlowControlTests.test_bufferExcessData.<locals>.validateà  sŒ   ø€ Ý$ Q§W¢W¡Y¤YÑ/Ô/ˆFð �OŠO˜L¨F°2¬JÔ,<Ð<Ñ=Ô=Ð=ð "%§¢ð *ð *Ø &ð*ñ *ô *ñ "ô "Ðð ×Ò˜TÔ1Ð3EÑFÔFÐFÐFÐFr&   )r   r   r   r   r  r+   rI   rÆ  rG   rÇ  rÈ  r–   r™   r  rû   r   rü   ry   r  r§   rN   r  r  )
r"   r;   rA  rÿ   r   ÚbonusFramesr¬   r0   r  r8  s
   `        @r#   Útest_bufferExcessDataz(H2FlowControlTests.test_bufferExcessDataÁ  sv  øø€ õ ‰NŒNˆÝÑÔˆÝ‰NŒNˆÝ0ˆÔð ×0Ò0Ñ2Ô2ˆØ˜×,Ò,ÝŒ[Ô%Ô9¸1Ð=ñ
ô 
ç
Š)‰+Œ+ñ	ˆð 	Õ)¨$Ô*@À"ÀaÑHÔHÑHˆØ	×Ò˜ÑÔÐå˜lÑ+Ô+ð 	!ð 	!ˆDØ�NŠN˜4Ñ Ô Ð Ð õ
 ˜$Ô.Ñ/Ô/°!Ñ3ˆÝ�{Ñ#Ô#ð 	.ð 	.ˆAØ×,Ò,°aÀ1Ð,ÑEÔEˆEØ�NŠN˜5Ÿ?š?Ñ,Ô,Ñ-Ô-Ð-Ð-ð
	Gð 
	Gð 
	Gð 
	Gð 
	Gð 
	Gð Ô(¨Ô+×7Ò7¸ÑAÔAÐAr&   c                 óÄ  ‡ ‡— t          ¦   «         }t          ¦   «         Št          ¦   «         }t          |_        |                     ¦   «         }||                     t          j        j	        j
        di¦  «                             ¦   «         z  }|t          ‰ j        g |¦  «        z  }|                     ‰¦  «         t          |¦  «        D ]}|                     |¦  «         Œ|j        d         }|j        j        }‰                      |j        ¦  «         |                     d¦  «         ‰                      |j        ¦  «         ‰                      |j        j        dg¦  «         |                     |                     dd¬¦  «                             ¦   «         ¦  «         ‰                      |j        ¦  «         ‰                      |j        j        dg¦  «         |                     |                     dd¬¦  «                             ¦   «         ¦  «         ‰                      |j        ¦  «         ‰                      |j        j        dg¦  «         |                     |                     dd¬¦  «                             ¦   «         ¦  «         ‰                      |j        ¦  «         ‰                      |j        j        ddg¦  «         |                     d¦  «         ‰                      |j        ¦  «         ‰                      |j        j        g d¢¦  «         |                     |                     dd	¬¦  «                             ¦   «         ¦  «         ‰                      |j        ¦  «         ‰                      |j        j        g d
¢¦  «         |                     ¦   «          |                     ¦   «          ˆˆ fd„}|j        d                              |¦  «        S )z‡
        L{Request} objects that have registered producers get blocked and
        unblocked according to HTTP/2 flow control.
        rE  r,   ó
   helloworldÚpauserÂ  r   Úresume)r9  r:  r9  rÁ  )r9  r:  r9  r:  c                 óÖ   •— t          ‰                     ¦   «         ¦  «        }‰                     d|d         j        v ¦  «         d„ |D ¦   «         }‰                     |g d¢¦  «         d S )Nr�   rŒ   c                 óZ   — g | ](}t          |t          j        j        ¦  «        ¯!|j        ‘Œ)S r*   r‹  r—   s     r#   r*  zXH2FlowControlTests.test_producerBlockingUnblocking.<locals>.validate.<locals>.<listcomp>:  rš  r&   )r8  r8  r&   r£  ©r9   r‘   r�  r8  r"   s      €€r#   r  zDH2FlowControlTests.test_producerBlockingUnblocking.<locals>.validate3  s{   ø€ Ý$ Q§W¢W¡Y¤YÑ/Ô/ˆFð �OŠO˜L¨F°2¬JÔ,<Ð<Ñ=Ô=Ð=ðð Ø &ðñ ô ˆJð ×Ò˜ZÐ)LÐ)LÐ)LÑMÔMÐMÐMÐMr&   ) r   r   r   ro  r  r+   rI   rÆ  rG   rÇ  rÈ  r–   r™   r  rû   r   rü   r[  r\  r]  r  Ú_producerProducingr¨   r^  r  r#  ÚeventsrN   ÚunregisterProducerrª   r  r  ©	r"   r;   rA  rÿ   r   r  r_  r  r8  s	   `       @r#   Útest_producerBlockingUnblockingz2H2FlowControlTests.test_producerBlockingUnblockingî  s§  øø€ õ
 ‰NŒNˆÝÑÔˆÝ‰NŒNˆÝ4ˆÔð ×0Ò0Ñ2Ô2ˆØ˜×,Ò,ÝŒ[Ô%Ô9¸1Ð=ñ
ô 
ç
Š)‰+Œ+ñ	ˆð 	Õ)¨$Ô*@À"ÀaÑHÔHÑHˆØ	×Ò˜ÑÔÐå˜lÑ+Ô+ð 	!ð 	!ˆDØ�NŠN˜4Ñ Ô Ð Ð ð ”˜1”ˆØ”/Ô*ˆð 	�Š˜Ô1Ñ2Ô2Ð2ð 	�Š�mÑ$Ô$Ð$ð 	×Ò˜Ô2Ñ3Ô3Ð3Ø×Ò˜Ô)Ô0°7°)Ñ<Ô<Ð<ð 	
�Š�q×/Ò/¸ÀaÐ/ÑHÔH×RÒRÑTÔTÑUÔUÐUØ×Ò˜Ô2Ñ3Ô3Ð3Ø×Ò˜Ô)Ô0°7°)Ñ<Ô<Ð<ð 	
�Š�q×/Ò/¸ÀaÐ/ÑHÔH×RÒRÑTÔTÑUÔUÐUØ×Ò˜Ô2Ñ3Ô3Ð3Ø×Ò˜Ô)Ô0°7°)Ñ<Ô<Ð<ð 	
�Š�q×/Ò/¸ÀaÐ/ÑHÔH×RÒRÑTÔTÑUÔUÐUØ�Š˜Ô1Ñ2Ô2Ð2Ø×Ò˜Ô)Ô0°7¸HÐ2EÑFÔFÐFð
 	�Š�mÑ$Ô$Ð$Ø×Ò˜Ô2Ñ3Ô3Ð3Ø×Ò˜Ô)Ô0Ð2NÐ2NÐ2NÑOÔOÐOð 	
�Š�q×/Ò/¸ÀbÐ/ÑIÔI×SÒSÑUÔUÑVÔVÐVØ�Š˜Ô1Ñ2Ô2Ð2Ø×ÒØÔÔ#Ð%KÐ%KÐ%Kñ	
ô 	
ð 	
ð 	×"Ò"Ñ$Ô$Ð$Ø�ŠÑÔÐð
	Nð 
	Nð 
	Nð 
	Nð 
	Nð 
	Nð Ô(¨Ô+×7Ò7¸ÑAÔAÐAr&   c                 ó¼  ‡ ‡‡‡	‡
‡— t          ¦   «         Š	t          ¦   «         Št          ¦   «         Št          ‰_        ‰	                     ¦   «         }|‰	                     t          j        j	        j
        di¦  «                             ¦   «         z  }|t          ‰ j        g ‰	¦  «        z  }‰                     ‰¦  «         t          |¦  «        D ]}‰                     |¦  «         Œ‰j        d         Š‰j        j        Š
‰                      ‰j        ¦  «         ‰
                     d¦  «         ‰                      ‰j        ¦  «         ‰                      ‰
j        j        dg¦  «         ‰
                     d¦  «         ˆˆ	ˆ
ˆ ˆfd„}t7          j        t:          d|¦  «        }ˆˆ fd„}‰j        d                              |¦  «        }tA          j!        ||g¦  «        S )	zQ
        Exactly filling the flow control window still blocks producers.
        rE  r,   r8  r9  ó   hc                  óH  •— ‰                       ‰                     dd¬¦  «                             ¦   «         ¦  «         ‰                     ‰j        ¦  «         ‰                     ‰j        j        ddg¦  «         ‰                     ¦   «          ‰ 	                    ¦   «          d S )Nr,   rÁ  rÂ  r9  r:  )
rü   rN   r–   r  r>  r  r#  r?  r@  rª   )rA  r;   r_  r"   r  s   €€€€€r#   Úwindow_openz=H2FlowControlTests.test_flowControlExact.<locals>.window_openh  s›   ø€ Ø�NŠNØ×(Ò(°!¸rÐ(ÑBÔB×LÒLÑNÔNñô ð ð �OŠO˜FÔ5Ñ6Ô6Ð6Ø×Ò˜WÔ-Ô4°wÀÐ6IÑJÔJÐJØ×&Ò&Ñ(Ô(Ð(Ø�NŠNÑÔÐÐÐr&   r   c                 óÖ   •— t          ‰                     ¦   «         ¦  «        }‰                     d|d         j        v ¦  «         d„ |D ¦   «         }‰                     |g d¢¦  «         d S )Nr�   rŒ   c                 óZ   — g | ](}t          |t          j        j        ¦  «        ¯!|j        ‘Œ)S r*   r‹  r—   s     r#   r*  zNH2FlowControlTests.test_flowControlExact.<locals>.validate.<locals>.<listcomp>{  rš  r&   )r‚  rƒ  rD  r&   r£  r=  s      €€r#   r  z:H2FlowControlTests.test_flowControlExact.<locals>.validatet  s{   ø€ Ý$ Q§W¢W¡Y¤YÑ/Ô/ˆFð �OŠO˜L¨F°2¬JÔ,<Ð<Ñ=Ô=Ð=ðð Ø &ðñ ô ˆJð ×Ò˜ZÐ)HÐ)HÐ)HÑIÔIÐIÐIÐIr&   )"r   r   r   ro  r  r+   rI   rÆ  rG   rÇ  rÈ  r–   r™   r  rû   r   rü   r[  r\  r]  r  r>  r¨   r^  r  r#  r?  r   rÉ  r   r  r  r   r>  )r"   rÿ   r   rF  ÚwindowDeferr  ÚvalidateDeferrA  r8  r;   r_  r  s   `      @@@@@r#   Útest_flowControlExactz(H2FlowControlTests.test_flowControlExactA  s÷  øøøøøø€ õ ‰NŒNˆÝÑÔˆÝ‰NŒNˆÝ4ˆÔð ×0Ò0Ñ2Ô2ˆØ˜×,Ò,ÝŒ[Ô%Ô9¸1Ð=ñ
ô 
ç
Š)‰+Œ+ñ	ˆð 	Õ)¨$Ô*@À"ÀaÑHÔHÑHˆØ	×Ò˜ÑÔÐå˜lÑ+Ô+ð 	!ð 	!ˆDØ�NŠN˜4Ñ Ô Ð Ð ð ”˜1”ˆØ”/Ô*ˆð 	�Š˜Ô1Ñ2Ô2Ð2ð 	�Š�mÑ$Ô$Ð$Ø×Ò˜Ô2Ñ3Ô3Ð3Ø×Ò˜Ô)Ô0°7°)Ñ<Ô<Ð<ð 	�Š�dÑÔÐð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	õ ”o¥g¨q°+Ñ>Ô>ˆð
	Jð 
	Jð 
	Jð 
	Jð 
	Jð 
	Jð Ô1°!Ô4×@Ò@ÀÑJÔJˆÝÔ! ;°Ð">Ñ?Ô?Ð?r&   c                 ó¨  ‡ ‡— t          ¦   «         }t          ¦   «         Št          ¦   «         }t          |_        |                     ¦   «         }||                     t          j        j	        j
        di¦  «                             ¦   «         z  }|t          ‰ j        g |¦  «        z  }|                     ‰¦  «         t          |¦  «        D ]}|                     |¦  «         Œ|j        d         }|j        j        }‰                      |j        ¦  «         |                     d¦  «         |                     ¦   «          |                     ¦   «          ‰                      |j        ¦  «         t5          j        d|j        |                     dd¬¦  «                             ¦   «         ¦  «         ˆˆ fd„}|j        d                              |¦  «        S )z™
        L{Request} objects that end a stream that is currently blocked behind
        flow control can still end the stream and get cleaned up.
        rE  r,   r8  r   rÁ  rÂ  c                 óÖ   •— t          ‰                     ¦   «         ¦  «        }‰                     d|d         j        v ¦  «         d„ |D ¦   «         }‰                     |g d¢¦  «         d S )Nr�   rŒ   c                 óZ   — g | ](}t          |t          j        j        ¦  «        ¯!|j        ‘Œ)S r*   r‹  r—   s     r#   r*  zQH2FlowControlTests.test_endingBlockedStream.<locals>.validate.<locals>.<listcomp>¶  rš  r&   )r‚  rƒ  r&   r£  r=  s      €€r#   r  z=H2FlowControlTests.test_endingBlockedStream.<locals>.validate¯  s{   ø€ Ý$ Q§W¢W¡Y¤YÑ/Ô/ˆFð �OŠO˜L¨F°2¬JÔ,<Ð<Ñ=Ô=Ð=ðð Ø &ðñ ô ˆJð ×Ò˜ZÐ)BÐ)BÐ)BÑCÔCÐCÐCÐCr&   )r   r   r   ro  r  r+   rI   rÆ  rG   rÇ  rÈ  r–   r™   r  rû   r   rü   r[  r\  r]  r  r>  r¨   r@  rª   Úfinishedr   r±  rN   r  r  rA  s	   `       @r#   Útest_endingBlockedStreamz+H2FlowControlTests.test_endingBlockedStreamƒ  sÍ  øø€ õ
 ‰NŒNˆÝÑÔˆÝ‰NŒNˆÝ4ˆÔð ×0Ò0Ñ2Ô2ˆØ˜×,Ò,ÝŒ[Ô%Ô9¸1Ð=ñ
ô 
ç
Š)‰+Œ+ñ	ˆð 	Õ)¨$Ô*@À"ÀaÑHÔHÑHˆØ	×Ò˜ÑÔÐå˜lÑ+Ô+ð 	!ð 	!ˆDØ�NŠN˜4Ñ Ô Ð Ð ð ”˜1”ˆØ”/Ô*ˆð 	�Š˜Ô1Ñ2Ô2Ð2ð 	�Š�mÑ$Ô$Ð$Ø×"Ò"Ñ$Ô$Ð$Ø�ŠÑÔÐð 	�Š˜Ô(Ñ)Ô)Ð)õ 	ÔØØŒNØ×$Ò$¨a¸2Ð$Ñ>Ô>×HÒHÑJÔJñ	
ô 	
ð 	
ð
	Dð 
	Dð 
	Dð 
	Dð 
	Dð 
	Dð Ô(¨Ô+×7Ò7¸ÑAÔAÐAr&   c                 óJ  ‡ ‡	— t          ¦   «         }t          ¦   «         Š	t          ¦   «         }t          |_        |                     ¦   «         }|t          ‰ j        g |¦  «        z  }|                     ‰	¦  «         t          |¦  «        D ]}| 
                    |¦  «         Œ|j        d         }|j        j        }|j        d         }|                     ¦   «          |                     ¦   «          ‰                      |j        ¦  «         ˆ	ˆ fd„}|                     |¦  «        S )z<
        We safely handle responses without bodies.
        r,   c                 ó  •— t          ‰                     ¦   «         ¦  «        }‰                     t          |¦  «        d¦  «         ‰                     d|d         j        v ¦  «         d„ |D ¦   «         }‰                     |dg¦  «         d S )Nr  r�   rŒ   c                 óZ   — g | ](}t          |t          j        j        ¦  «        ¯!|j        ‘Œ)S r*   r‹  r—   s     r#   r*  zQH2FlowControlTests.test_responseWithoutBody.<locals>.validate.<locals>.<listcomp>ç  rš  r&   r&   rY  r=  s      €€r#   r  z=H2FlowControlTests.test_responseWithoutBody.<locals>.validateÞ  óž   ø€ Ý$ Q§W¢W¡Y¤YÑ/Ô/ˆFà×Ò�S ™[œ[¨!Ñ,Ô,Ð,ð �OŠO˜L¨F°2¬JÔ,<Ð<Ñ=Ô=Ð=ðð Ø &ðñ ô ˆJð ×ÒØØ�ñô ð ð ð r&   )r   r   r   ro  r  r+   r™   r  rû   r   rü   r[  r\  r]  r  r@  rª   r  rO  r  ©
r"   r;   rA  rÿ   r   r  r_  rf  r  r8  s
   `        @r#   Útest_responseWithoutBodyz+H2FlowControlTests.test_responseWithoutBody½  s-  øø€ õ ‰NŒNˆÝÑÔˆÝ‰NŒNˆõ 5ˆÔð ×0Ò0Ñ2Ô2ˆØÕ)¨$Ô*@À"ÀaÑHÔHÑHˆØ	×Ò˜ÑÔÐå˜lÑ+Ô+ð 	!ð 	!ˆDØ�NŠN˜4Ñ Ô Ð Ð ð ”˜1”ˆØ”/Ô*ˆØÔ3°AÔ6ˆð 	×"Ò"Ñ$Ô$Ð$Ø�ŠÑÔÐð 	�Š˜Ô(Ñ)Ô)Ð)ð	ð 	ð 	ð 	ð 	ð 	ð" ×*Ò*¨8Ñ4Ô4Ð4r&   c                 óÂ  ‡ ‡	— t          ¦   «         }t          ¦   «         Š	t          ¦   «         }t          |_        |                     ¦   «         }|t          ‰ j        g |¦  «        z  }|                     ‰	¦  «         t          |¦  «        D ]}| 
                    |¦  «         Œ|j        d         }|j        j        }|j        d         }|                     ¦   «          |                     ¦   «          ‰                      |j        ¦  «         | 
                    |                     dd¬¦  «                             ¦   «         ¦  «         ˆ	ˆ fd„}|                     |¦  «        S )zk
        WindowUpdate frames received after we've completed the stream are
        safely handled.
        r,   rÁ  rÂ  c                 ó  •— t          ‰                     ¦   «         ¦  «        }‰                     t          |¦  «        d¦  «         ‰                     d|d         j        v ¦  «         d„ |D ¦   «         }‰                     |dg¦  «         d S )Nr  r�   rŒ   c                 óZ   — g | ](}t          |t          j        j        ¦  «        ¯!|j        ‘Œ)S r*   r‹  r—   s     r#   r*  z[H2FlowControlTests.test_windowUpdateForCompleteStream.<locals>.validate.<locals>.<listcomp>"  rš  r&   r&   rY  r=  s      €€r#   r  zGH2FlowControlTests.test_windowUpdateForCompleteStream.<locals>.validate  rT  r&   )r   r   r   ro  r  r+   r™   r  rû   r   rü   r[  r\  r]  r  r@  rª   r  rO  rN   r–   r  rU  s
   `        @r#   Ú"test_windowUpdateForCompleteStreamz5H2FlowControlTests.test_windowUpdateForCompleteStreamñ  s`  øø€ õ ‰NŒNˆÝÑÔˆÝ‰NŒNˆõ 5ˆÔð ×0Ò0Ñ2Ô2ˆØÕ)¨$Ô*@À"ÀaÑHÔHÑHˆØ	×Ò˜ÑÔÐå˜lÑ+Ô+ð 	!ð 	!ˆDØ�NŠN˜4Ñ Ô Ð Ð ð ”˜1”ˆØ”/Ô*ˆØÔ3°AÔ6ˆð 	×"Ò"Ñ$Ô$Ð$Ø�ŠÑÔÐð 	�Š˜Ô(Ñ)Ô)Ð)ð 	
�Š�q×/Ò/¸ÀbÐ/ÑIÔI×SÒSÑUÔUÑVÔVÐVð	ð 	ð 	ð 	ð 	ð 	ð" ×*Ò*¨8Ñ4Ô4Ð4r&   c                 óP  ‡ ‡— t          ¦   «         }t          ¦   «         Št          ¦   «         }t          |_        |                     ¦   «         }||                     t          j        j	        j
        di¦  «                             ¦   «         z  }|t          ‰ j        g |¦  «        z  }|                     ‰¦  «         t          |¦  «        D ]}|                     |¦  «         Œ|j        d         }|j        j        }‰                      |j        ¦  «         |                     d¦  «         ‰                      |j        ¦  «         ‰                      |j        j        g ¦  «         |                     |                     dd¬¦  «                             ¦   «         ¦  «         ‰                      |j        ¦  «         ‰                      |j        j        g ¦  «         |                     ¦   «          |                     ¦   «          ˆˆ fd„}|j        d                              |¦  «        S )z™
        L{Request} objects that have registered producers that are not blocked
        behind flow control do not have their producer notified.
        rE  r,   ó   wordrÂ  c                 óÖ   •— t          ‰                     ¦   «         ¦  «        }‰                     d|d         j        v ¦  «         d„ |D ¦   «         }‰                     |ddg¦  «         d S )Nr�   rŒ   c                 óZ   — g | ](}t          |t          j        j        ¦  «        ¯!|j        ‘Œ)S r*   r‹  r—   s     r#   r*  zOH2FlowControlTests.test_producerUnblocked.<locals>.validate.<locals>.<listcomp>a  rš  r&   r\  r&   r£  r=  s      €€r#   r  z;H2FlowControlTests.test_producerUnblocked.<locals>.validateZ  sx   ø€ Ý$ Q§W¢W¡Y¤YÑ/Ô/ˆFð �OŠO˜L¨F°2¬JÔ,<Ð<Ñ=Ô=Ð=ðð Ø &ðñ ô ˆJð ×Ò˜Z¨'°3¨Ñ8Ô8Ð8Ð8Ð8r&   )r   r   r   ro  r  r+   rI   rÆ  rG   rÇ  rÈ  r–   r™   r  rû   r   rü   r[  r\  r]  r  r>  r¨   r  r#  r?  rN   r@  rª   r  r  rA  s	   `       @r#   Útest_producerUnblockedz)H2FlowControlTests.test_producerUnblocked,  s  øø€ õ
 ‰NŒNˆÝÑÔˆÝ‰NŒNˆÝ4ˆÔð ×0Ò0Ñ2Ô2ˆØ˜×,Ò,ÝŒ[Ô%Ô9¸1Ð=ñ
ô 
ç
Š)‰+Œ+ñ	ˆð 	Õ)¨$Ô*@À"ÀaÑHÔHÑHˆØ	×Ò˜ÑÔÐå˜lÑ+Ô+ð 	!ð 	!ˆDØ�NŠN˜4Ñ Ô Ð Ð ð ”˜1”ˆØ”/Ô*ˆð 	�Š˜Ô1Ñ2Ô2Ð2ð 	�Š�gÑÔÐð 	�Š˜Ô1Ñ2Ô2Ð2Ø×Ò˜Ô)Ô0°"Ñ5Ô5Ð5ð 	
�Š�q×/Ò/¸ÀaÐ/ÑHÔH×RÒRÑTÔTÑUÔUÐUØ�Š˜Ô1Ñ2Ô2Ð2Ø×Ò˜Ô)Ô0°"Ñ5Ô5Ð5ð 	×"Ò"Ñ$Ô$Ð$Ø�ŠÑÔÐð
	9ð 
	9ð 
	9ð 
	9ð 
	9ð 
	9ð Ô(¨Ô+×7Ò7¸ÑAÔAÐAr&   c                 ó.  ‡ ‡— t          ¦   «         }t          ¦   «         Št          ¦   «         }t          |_        t          ‰ j        ‰ j        |¦  «        }|                     d| 	                    dd¬¦  «        ¦  «         | 
                    ¦   «         }|d                     d„ |D ¦   «         ¦  «        z  }|                     ‰¦  «         t          |¦  «        D ]}|                     |¦  «         Œˆˆ fd„}|j        d                              |¦  «        S )z”
        When a WindowUpdate frame is received for the whole connection but no
        data is currently waiting, nothing exciting happens.
        r,   r   rE  rÂ  r&   c              3   ó>   K  — | ]}|                      ¦   «         V — Œd S r   r•   r—   s     r#   r‹   zBH2FlowControlTests.test_unnecessaryWindowUpdate.<locals>.<genexpr>v  rc  r&   c                 ó  •— t          ‰                     ¦   «         ¦  «        }‰                     d|d         j        v ¦  «         d                     d„ |D ¦   «         ¦  «        }‰                     ‰j        |¦  «         d S )Nr�   rŒ   r&   c              3   ób   K  — | ]*}t          |t          j        j        ¦  «        ¯!|j        V — Œ+d S r   r‹  r—   s     r#   r‹   zTH2FlowControlTests.test_unnecessaryWindowUpdate.<locals>.validate.<locals>.<genexpr>„  r2  r&   )r�   r  r  r4   r˜   r  r"  r3  s      €€r#   r  zAH2FlowControlTests.test_unnecessaryWindowUpdate.<locals>.validate}  sŒ   ø€ Ý$ Q§W¢W¡Y¤YÑ/Ô/ˆFð �OŠO˜L¨F°2¬JÔ,<Ð<Ñ=Ô=Ð=ð "%§¢ð *ð *Ø &ð*ñ *ô *ñ "ô "Ðð ×Ò˜TÔ2Ð4FÑGÔGÐGÐGÐGr&   )r   r   r   r   r  r’   r#  r$  rP  rN   r+   r˜   rû   r   rü   r  r  )r"   r;   rA  r‘   rÿ   r   r  r8  s   `      @r#   Útest_unnecessaryWindowUpdatez/H2FlowControlTests.test_unnecessaryWindowUpdateh  s$  øø€ õ
 ‰NŒNˆÝÑÔˆÝ‰NŒNˆÝ0ˆÔõ $ DÔ$;¸TÔ=QÐSTÑUÔUˆØ�Š�a˜×1Ò1¸1ÈÐ1ÑJÔJÑKÔKÐKØ×0Ò0Ñ2Ô2ˆØ˜ŸšÐ ?Ð ?¸Ð ?Ñ ?Ô ?Ñ?Ô?Ñ?ˆØ	×Ò˜ÑÔÐå˜lÑ+Ô+ð 	!ð 	!ˆDØ�NŠN˜4Ñ Ô Ð Ð ð
	Hð 
	Hð 
	Hð 
	Hð 
	Hð 
	Hð Ô(¨Ô+×7Ò7¸ÑAÔAÐAr&   c                 ó  — t          ¦   «         }t          ¦   «         }t          ¦   «         }t          |_        g }|                     |                     | j        d¬¦  «        ¦  «         |                     |                     dd¬¦  «        ¦  «         | 	                    ¦   «         }|d 
                    d„ |D ¦   «         ¦  «        z  }|                     |¦  «         |                     |¦  «         |                      |¦  «         dS )zä
        When a WindowUpdate frame is received for a stream but no data is
        currently waiting, that stream is not marked as unblocked and the
        priority tree continues to assert that no stream can progress.
        r,   r…   rE  rÂ  r&   c              3   ó>   K  — | ]}|                      ¦   «         V — Œd S r   r•   r—   s     r#   r‹   zKH2FlowControlTests.test_unnecessaryWindowUpdateForStream.<locals>.<genexpr>�  s*   è è € Ð7Ð7¨1˜Ÿš™œÐ7Ð7Ð7Ð7Ð7Ð7r&   N)r   r   r   r   r  rŽ   r?   r#  rN   r+   r˜   rû   rü   rÛ   )r"   r;   rþ   Úconnr‘   r3   s         r#   Ú%test_unnecessaryWindowUpdateForStreamz8H2FlowControlTests.test_unnecessaryWindowUpdateForStream‹  sö   € õ ‰NŒNˆÝ#Ñ%Ô%ˆ	Ý‰~Œ~ˆÝ3ˆÔð
 ˆØ�Š�a×)Ò)°$Ô2IÐTUÐ)ÑVÔVÑWÔWÐWØ�Š�a×.Ò.¸ÀQÐ.ÑGÔGÑHÔHÐHØ×(Ò(Ñ*Ô*ˆØ�—’Ð7Ð7°Ð7Ñ7Ô7Ñ7Ô7Ñ7ˆà×Ò˜IÑ&Ô&Ð&Ø×Ò˜$ÑÔÐà×$Ò$ TÑ*Ô*Ð*Ð*Ð*r&   c                 óø  — t          ¦   «         }t          ¦   «         }t          ¦   «         }t          |_        t          | j        | j        |¦  «        }|                     ¦   «         }|d 	                    d„ |D ¦   «         ¦  «        z  }| 
                    |¦  «         t          |¦  «        D ]}|                     |¦  «         Œ|j        d                              ¦   «          |                     dd¬¦  «        }|                     |                     ¦   «         ¦  «         t#          |                     ¦   «         ¦  «        }|                      t)          |d         t*          j        j        ¦  «        ¦  «         dS )zq
        When a WindowUpdate frame is received for a stream that has been
        aborted it is ignored.
        r&   c              3   ó>   K  — | ]}|                      ¦   «         V — Œd S r   r•   r—   s     r#   r‹   zEH2FlowControlTests.test_windowUpdateAfterTerminate.<locals>.<genexpr>±  rc  r&   r,   rE  rÂ  rŒ   N)r   r   r   r   r  r’   r#  r$  r+   r˜   rû   r   rü   r[  r«  rN   r–   r�   r  r  r   r/   r0   rY   )r"   r;   r8  rA  r‘   rÿ   r   ÚwindowUpdateFrames           r#   Útest_windowUpdateAfterTerminatez2H2FlowControlTests.test_windowUpdateAfterTerminate¤  sR  € õ
 ‰NŒNˆÝÑÔˆÝ‰NŒNˆÝ0ˆÔõ $ DÔ$;¸TÔ=QÐSTÑUÔUˆØ×0Ò0Ñ2Ô2ˆØ˜ŸšÐ ?Ð ?¸Ð ?Ñ ?Ô ?Ñ?Ô?Ñ?ˆØ	×Ò˜ÑÔÐå˜lÑ+Ô+ð 	!ð 	!ˆDØ�NŠN˜4Ñ Ô Ð Ð ð 	
Œ	�!Œ×$Ò$Ñ&Ô&Ð&ð ×4Ò4¸aÈ1Ð4ÑMÔMÐØ	�ŠÐ(×2Ò2Ñ4Ô4Ñ5Ô5Ð5õ ! §¢¡¤Ñ+Ô+ˆð 	�Š�
 6¨"¤:­zÔ/?Ô/NÑOÔOÑPÔPÐPÐPÐPr&   c                 ó  ‡ ‡‡‡	— t          ¦   «         Š	t          ¦   «         Št          ¦   «         Št          ‰_        t          ‰ j        ‰ j        ‰	¦  «        }‰	                     ¦   «         }|d 	                    d„ |D ¦   «         ¦  «        z  }‰ 
                    ‰¦  «         t          |¦  «        D ]}‰                     |¦  «         Œˆˆ	fd„}ˆˆ fd„}‰j        d                              |¦  «        }|                     |¦  «        S )zs
        When a WindowUpdate frame is received for a stream that has been
        completed it is ignored.
        r&   c              3   ó>   K  — | ]}|                      ¦   «         V — Œd S r   r•   r—   s     r#   r‹   zDH2FlowControlTests.test_windowUpdateAfterComplete.<locals>.<genexpr>Ñ  rc  r&   c                  ó„   •— ‰                      dd¬¦  «        }‰                     |                     ¦   «         ¦  «         d S )Nr,   rE  rÂ  )rN   rü   r–   )r¶   rk  rA  r;   s     €€r#   Úupdate_windowzHH2FlowControlTests.test_windowUpdateAfterComplete.<locals>.update_window×  sA   ø€ à !× 8Ò 8À!ÈqÐ 8Ñ QÔ QÐØ�NŠNÐ,×6Ò6Ñ8Ô8Ñ9Ô9Ð9Ð9Ð9r&   c                  óŒ   •— t          ‰                     ¦   «         ¦  «        }‰                     d|d         j        ¦  «         d S )Nr�   rŒ   )r�   r  ÚassertInr4   ©r¶   r‘   r8  r"   s     €€r#   r  zCH2FlowControlTests.test_windowUpdateAfterComplete.<locals>.validateÜ  s;   ø€ å$ Q§W¢W¡Y¤YÑ/Ô/ˆFð �MŠM˜,¨¨r¬
Ô(8Ñ9Ô9Ð9Ð9Ð9r&   r,   )r   r   r   r   r  r’   r#  r$  r+   r˜   rû   r   rü   r  r  )
r"   r‘   rÿ   r   rp  r  rÊ  rA  r8  r;   s
   `      @@@r#   Útest_windowUpdateAfterCompletez1H2FlowControlTests.test_windowUpdateAfterCompleteÄ  s(  øøøø€ õ
 ‰NŒNˆÝÑÔˆÝ‰NŒNˆÝ0ˆÔõ $ DÔ$;¸TÔ=QÐSTÑUÔUˆØ×0Ò0Ñ2Ô2ˆØ˜ŸšÐ ?Ð ?¸Ð ?Ñ ?Ô ?Ñ?Ô?Ñ?ˆØ	×Ò˜ÑÔÐå˜lÑ+Ô+ð 	!ð 	!ˆDØ�NŠN˜4Ñ Ô Ð Ð ð	:ð 	:ð 	:ð 	:ð 	:ð 	:ð
	:ð 	:ð 	:ð 	:ð 	:ð 	:ð Ô% aÔ(×4Ò4°]ÑCÔCˆØ�}Š}˜XÑ&Ô&Ð&r&   c                 óT  — t          ¦   «         }t          ¦   «         }t          ¦   «         }t          |_        ddz  gdz  }t          d„ |D ¦   «         ¦  «        › }| j        dd…         d|fgz   }t          |||¬¦  «        }|d= |                     | 	                    d	t          j        j        j        ¬
¦  «        ¦  «         |                     ¦   «         }|d                     d„ |D ¦   «         ¦  «        z  }|                     |¦  «         |                     |¦  «         t%          |                     ¦   «         ¦  «        }d„ |D ¦   «         }	|                      dg|	¦  «         d„ |D ¦   «         }
d„ |D ¦   «         }|                      |
¦  «         |                      |¦  «         dS )z’
        When a DATA frame is received at the same time as RST_STREAM,
        Twisted does not send WINDOW_UPDATE frames for the stream.
        ó    i @  r  c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r   )ry   )rˆ   r3   s     r#   r‹   z;H2FlowControlTests.test_dataAndRstStream.<locals>.<genexpr>ô  s(   è è € Ð<Ð<¨$�C ™IœIÐ<Ð<Ð<Ð<Ð<Ð<r&   NrŒ   zcontent-lengthrÍ  r,   )r9   rU   r&   c              3   ó>   K  — | ]}|                      ¦   «         V — Œd S r   r•   r—   s     r#   r‹   z;H2FlowControlTests.test_dataAndRstStream.<locals>.<genexpr>	  rc  r&   c                 óZ   — g | ](}t          |t          j        j        ¦  «        ¯!|j        ‘Œ)S r*   )r   r/   r0   rK   r  r—   s     r#   r*  z<H2FlowControlTests.test_dataAndRstStream.<locals>.<listcomp>	  s@   € ð  
ð  
ð  
àÝ˜!�ZÔ-Ô?Ñ@Ô@ð 
ØŒKð 
ð  
ð  
r&   r   c                 óP   — g | ]#}t          |t          j        j        ¦  «        ¯!|‘Œ$S r*   )r   r/   r0   r1   r—   s     r#   r*  z<H2FlowControlTests.test_dataAndRstStream.<locals>.<listcomp>	  s=   € ð 
ð 
ð 
Ø¥¨A­zÔ/?Ô/LÑ!MÔ!Mð
Øð
ð 
ð 
r&   c                 óP   — g | ]#}t          |t          j        j        ¦  «        ¯!|‘Œ$S r*   )r   r/   r0   rB   r—   s     r#   r*  z<H2FlowControlTests.test_dataAndRstStream.<locals>.<listcomp>	  s-   € ÐUÐUÐU˜A­:°a½Ô9IÔ9SÑ+TÔ+TÐU�aÐUÐUÐUr&   )r   r   r   r   r  Úsumr#  r’   rŽ   rZ   rÆ  ÚerrorsÚ
ErrorCodesÚINTERNAL_ERRORr+   r˜   rû   rü   r�   r  r  r^  )r"   rŠ   rþ   rA  Ú	frameDataÚ
bodyLengthr8   r‘   rÿ   ÚwindowUpdateFrameIDsÚheadersFramesÚ
dataFramess               r#   Útest_dataAndRstStreamz(H2FlowControlTests.test_dataAndRstStreamæ  sï  € õ
 $‘~”~ˆÝ#Ñ%Ô%ˆ	Ý‰NŒNˆÝ0ˆÔð
  Ñ&Ð'¨!Ñ+ˆ	ÝÐ<Ð<°)Ð<Ñ<Ô<Ñ<Ô<Ð>ˆ
ØÔ)¨#¨2¨#Ô.Ð3CÀZÐ2PÐ1QÑQˆÝ#Ø )¸,ð
ñ 
ô 
ˆð �2ˆJØ�ŠØ×,Ò,Ø¥b¤iÔ&:Ô&Ið -ñ ô ñ	
ô 	
ð 	
ð $×;Ò;Ñ=Ô=ˆØ˜ŸšÐ ?Ð ?¸Ð ?Ñ ?Ô ?Ñ?Ô?Ñ?ˆØ	×Ò˜Ñ#Ô#Ð#ð 	
�Š�|Ñ$Ô$Ð$õ ! §¢Ñ!2Ô!2Ñ3Ô3ˆð 
ð  
àð 
ñ  
ô  
Ðð
 	×Ò˜!˜Ð2Ñ3Ô3Ð3ð
ð 
Øð
ñ 
ô 
ˆð VÐU ÐUÑUÔUˆ
Ø×Ò˜Ñ'Ô'Ð'Ø×Ò˜Ñ$Ô$Ð$Ð$Ð$r&   c                 ó¸  — t          ¦   «         }t          |¦  «        }|j        |_        t          |_        t          ¦   «         }t          ¦   «         }|                     ¦   «         }|                     |¦  «         | 	                    |¦  «         d}| 
                    | j        |¬¦  «                             ¦   «         }| 	                    |¦  «         |                     ¦   «          d|_        |                     ¦   «          |                     |¦  «         |                      |                     ¦   «         ¦  «         |                      |j        ¦  «         dS )z®
        Aborting a request associated with a paused connection that's
        reached its buffered control frame limit causes that
        connection to be aborted.
        r,   r…   r   N)r
   r   r±  r   r  r   r   r+   rû   rü   r?   r#  r–   r³   r  ÚclearÚabortRequestr^  r  r  r  )r"   r  rÚ   rŠ   rþ   r+   r9   ÚheadersFrameDatas           r#   Ú#test_abortRequestWithCircuitBreakerz6H2FlowControlTests.test_abortRequestWithCircuitBreaker	  sM  € õ +Ñ,Ô,ˆÝ! -Ñ0Ô0ˆ
Ø,Ô6ˆ
ÔÝ$9ˆ
Ô!å#‘~”~ˆÝ#Ñ%Ô%ˆ	ð #/×"FÒ"FÑ"HÔ"HÐØ×!Ò! )Ñ,Ô,Ð,Ø×ÒÐ 7Ñ8Ô8Ð8ð ˆØ'×9Ò9ØÔ+°hð :ñ 
ô 
ç
Š)‰+Œ+ð 	ð 	×ÒÐ 0Ñ1Ô1Ð1ð 	×!Ò!Ñ#Ô#Ð#Ø34ˆ
Ô0ð 	�ŠÑÔÐð 	×Ò Ñ)Ô)Ð)ð 	×Ò˜ŸšÑ*Ô*Ñ+Ô+Ð+ð 	�Š˜	Ô.Ñ/Ô/Ð/Ð/Ð/r&   N)ri   rj   rk   rl   r  r  r#  r$  r"  r6  rB  rK  rP  rV  rZ  r_  rd  rh  rl  rt  r…  rŠ  r*   r&   r#   r.  r.  ¥  sF  € € € € € ðð ðð ð Ðð *€Oðð ð Ðð DÐCÐC€OàAÐð+Bð +Bð +BðZQBð QBð QBðf@@ð @@ð @@ðD8Bð 8Bð 8Bðt25ð 25ð 25ðh95ð 95ð 95ðv:Bð :Bð :Bðx!Bð !Bð !BðF+ð +ð +ð2Qð Qð Qð@ 'ð  'ð  'ðD5%ð 5%ð 5%ðn)0ð )0ð )0ð )0ð )0r&   r.  c                   ó.   — e Zd Zg d¢Zd„ Zd„ Zd„ Zd„ ZdS )ÚHTTP2TransportCheckingrà   c                 óº   — t          ¦   «         }t          ¦   «         }t          |_        |                     |d¦  «         |                      |j        |u ¦  «         dS )zU
        L{H2Connection} can be registered with the transport as a producer.
        TN)r   r   r   r  rÈ   r  r#  )r"   r8  rA  s      r#   Ú"test_registerProducerWithTransportz9HTTP2TransportChecking.test_registerProducerWithTransportT	  sT   € õ ÑÔˆÝ‰NŒNˆÝ0ˆÔà	×Ò˜1˜dÑ#Ô#Ð#Ø�Š˜œ
 a˜Ñ(Ô(Ð(Ð(Ð(r&   c                 ót  ‡ ‡‡	‡
— t          ¦   «         }t          ¦   «         Š	t          ¦   «         Št          ‰_        t          ‰ j        g |¦  «        }|                     ¦   «         }|d                     d„ |D ¦   «         ¦  «        z  }‰ 	                    ‰	¦  «         ‰	 
                    ‰d¦  «         t          |¦  «        D ]}‰                     |¦  «         Œ‰                     ¦   «          ‰j        d         Š
ˆˆ	ˆ
ˆ fd„}ˆ	ˆ fd„}t          j        t"          d|¦  «        }|                     |¦  «         |S )z|
        L{H2Connection} can be paused by its consumer. When paused it stops
        sending data to the transport.
        r&   c              3   ó>   K  — | ]}|                      ¦   «         V — Œd S r   r•   r—   s     r#   r‹   zNHTTP2TransportChecking.test_pausingProducerPreventsDataSend.<locals>.<genexpr>l	  rc  r&   Tr,   c                  óÈ  •— t          ‰                     ¦   «         ¦  «        }‰                     t          |¦  «        d¦  «         ‰                     t          |d         t          j        j        ¦  «        ¦  «         ‰ 	                    ¦   «          ‰ 	                    ¦   «          ‰ 	                    ¦   «          ‰ 	                    ¦   «          ‰ 	                    ¦   «          ‰S )Nr
  rŒ   )
r�   r  r  ry   r^  r   r/   r0   rB   r¹   )r¶   r‘   rA  r8  rf  r"   s     €€€€r#   ÚvalidateNotSentzTHTTP2TransportChecking.test_pausingProducerPreventsDataSend.<locals>.validateNotSentƒ	  s¾   ø€ Ý$ Q§W¢W¡Y¤YÑ/Ô/ˆFà×Ò�S ™[œ[¨!Ñ,Ô,Ð,Ø×Ò�Z¨¨r¬
µJÔ4DÔ4NÑOÔOÑPÔPÐPØ×ÒÑÔÐð ×ÒÑÔÐØ×ÒÑÔÐØ×ÒÑÔÐØ×ÒÑÔÐØ"Ð"r&   c                  óÔ   •— t          ‰                     ¦   «         ¦  «        }‰                     t          |¦  «        d¦  «         ‰                     d|d         j        v ¦  «         d S rX  rY  rs  s     €€r#   r°  zUHTTP2TransportChecking.test_pausingProducerPreventsDataSend.<locals>.validateComplete‘	  sZ   ø€ Ý$ Q§W¢W¡Y¤YÑ/Ô/ˆFð ×Ò�S ™[œ[¨!Ñ,Ô,Ð,Ø�OŠO˜L¨F°2¬JÔ,<Ð<Ñ=Ô=Ð=Ð=Ð=r&   r®  )r   r   r   r   r  r’   r  r+   r˜   rû   rÈ   r   rü   r³   r  r   rÉ  r   r  )r"   r;   r‘   rÿ   r   r’  r°  rÊ  rA  r8  rf  s   `       @@@r#   Ú$test_pausingProducerPreventsDataSendz;HTTP2TransportChecking.test_pausingProducerPreventsDataSend_	  sg  øøøø€ õ
 ‰NŒNˆÝÑÔˆÝ‰NŒNˆÝ0ˆÔõ $ DÔ$:¸BÀÑBÔBˆØ×0Ò0Ñ2Ô2ˆØ˜ŸšÐ ?Ð ?¸Ð ?Ñ ?Ô ?Ñ?Ô?Ñ?ˆØ	×Ò˜ÑÔÐØ	×Ò˜1˜dÑ#Ô#Ð#õ ˜lÑ+Ô+ð 	!ð 	!ˆDØ�NŠN˜4Ñ Ô Ð Ð ð
 	
×ÒÑÔÐð Ô3°AÔ6ˆð	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð	>ð 	>ð 	>ð 	>ð 	>ð 	>õ ŒO�G T¨?Ñ;Ô;ˆØ	�ŠÐ&Ñ'Ô'Ð'àˆr&   c                 ó  — t          ¦   «         }t          ¦   «         }t          ¦   «         }t          |_        t          | j        g |¦  «        }|                     ¦   «         }|d                     d„ |D ¦   «         ¦  «        z  }| 	                    |¦  «         | 
                    |d¦  «         t          |¦  «        D ]}|                     |¦  «         Œ|                     ¦   «          t          |                     ¦   «         ¦  «        }|                      t#          |¦  «        d¦  «         |                      t'          |d         t(          j        j        ¦  «        ¦  «         |                      |j        ¦  «         dS )zo
        L{H2Connection} can be stopped by its producer. That causes it to lose
        its transport.
        r&   c              3   ó>   K  — | ]}|                      ¦   «         V — Œd S r   r•   r—   s     r#   r‹   z<HTTP2TransportChecking.test_stopProducing.<locals>.<genexpr>ª	  rc  r&   Tr
  rŒ   N)r   r   r   r   r  r’   r  r+   r˜   rû   rÈ   r   rü   rÄ   r�   r  r  ry   r^  r   r/   r0   rB   rv  )r"   r;   r8  rA  r‘   rÿ   r   s          r#   Útest_stopProducingz)HTTP2TransportChecking.test_stopProducing�	  sU  € õ
 ‰NŒNˆÝÑÔˆÝ‰NŒNˆÝ0ˆÔõ $ DÔ$:¸BÀÑBÔBˆØ×0Ò0Ñ2Ô2ˆØ˜ŸšÐ ?Ð ?¸Ð ?Ñ ?Ô ?Ñ?Ô?Ñ?ˆØ	×Ò˜ÑÔÐØ	×Ò˜1˜dÑ#Ô#Ð#õ ˜lÑ+Ô+ð 	!ð 	!ˆDØ�NŠN˜4Ñ Ô Ð Ð ð 	
�ŠÑÔÐå  §¢¡¤Ñ+Ô+ˆà×Ò�˜V™œ aÑ(Ô(Ð(Ø×Ò� F¨2¤Jµ
Ô0@Ô0JÑKÔKÑLÔLÐLØ×Ò˜Ô*Ñ+Ô+Ð+Ð+Ð+r&   c                 óÞ  ‡ ‡	‡
‡— t          ddd¦  «        Š	t          ddd¦  «        Š
t          ¦   «         }t          ‰	‰
¬¦  «        }t          ¦   «         }t          |_        |                     |¦  «         t          ‰ j        g |¦  «        }| 	                    ¦   «         }|d 
                    d„ |D ¦   «         ¦  «        z  }t          |¦  «        D ]}|                     |¦  «         Œ|j        d	         Š‰                      ‰                     ¦   «         ‰	¦  «         ‰                      ‰                     ¦   «         ‰
¦  «         |j        d	         }ˆ	ˆ
ˆ ˆfd
„}|                     |¦  «        S )z{
        A L{H2Stream} object correctly passes through host and peer information
        from its L{H2Connection}.
        ÚTCPz
17.52.24.8i»  z17.188.0.12i}  )ÚhostAddressÚpeerAddressr&   c              3   ó>   K  — | ]}|                      ¦   «         V — Œd S r   r•   r2  s     r#   r‹   zEHTTP2TransportChecking.test_passthroughHostAndPeer.<locals>.<genexpr>Ì	  r3  r&   r,   c                  ó¨   •— ‰                      ‰                     ¦   «         ‰¦  «         ‰                      ‰                     ¦   «         ‰¦  «         d S r   )r  ÚgetHostÚgetPeer)r¶   rš  r›  r"   r  s    €€€€r#   r  zDHTTP2TransportChecking.test_passthroughHostAndPeer.<locals>.validateÙ	  sI   ø€ Ø×Ò˜VŸ^š^Ñ-Ô-¨{Ñ;Ô;Ð;Ø×Ò˜VŸ^š^Ñ-Ô-¨{Ñ;Ô;Ð;Ð;Ð;r&   )r	   r   r   r   r   r  rû   r’   r  r+   r˜   r   rü   r[  r  rž  rŸ  r  r  )r"   rŠ   rþ   rÚ   r‘   rÿ   r   rf  r  rš  r›  r  s   `        @@@r#   Útest_passthroughHostAndPeerz2HTTP2TransportChecking.test_passthroughHostAndPeer¼	  s~  øøøø€ õ
 " %¨°sÑ;Ô;ˆÝ! %¨¸Ñ>Ô>ˆå#‘~”~ˆÝ#°ÈÐUÑUÔUˆ	Ý!‘^”^ˆ
Ý$9ˆ
Ô!Ø×!Ò! )Ñ,Ô,Ð,å# DÔ$:¸BÀÑMÔMˆØ#×;Ò;Ñ=Ô=ˆØ˜ŸšÐ GÐ GÀÐ GÑ GÔ GÑGÔGÑGˆå˜lÑ+Ô+ð 	*ð 	*ˆDØ×#Ò# DÑ)Ô)Ð)Ð)ð Ô# AÔ&ˆØ×Ò˜ŸšÑ)Ô)¨;Ñ7Ô7Ð7Ø×Ò˜ŸšÑ)Ô)¨;Ñ7Ô7Ð7ð %Ô<¸QÔ?ˆð	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð ×*Ò*¨8Ñ4Ô4Ð4r&   N)ri   rj   rk   r  rŽ  r”  r—  r   r*   r&   r#   rŒ  rŒ  I	  sc   € € € € € ðð ð Ðð	)ð 	)ð 	)ð<ð <ð <ð|,ð ,ð ,ð>!5ð !5ð !5ð !5ð !5r&   rŒ  c                   ó   — e Zd ZdZd„ ZdS )ÚHTTP2SchedulingTestszÀ
    The H2Connection object schedules certain events (mostly its data sending
    loop) using callbacks from the reactor. These tests validate that the calls
    are scheduled correctly.
    c                 óî  — t          j        ¦   «         }t          |¦  «        } |j        ¦   «         }|                      t          |¦  «        d¦  «         |d         }|                      |                     ¦   «         ¦  «         |                      |j        d¦  «         |                      |j	        |j
        ¦  «         |                      |j        d¦  «         |                      |j        i ¦  «         dS )z}
        When a H2Connection is established it schedules one call to be run as
        soon as the reactor has time.
        r,   r   r*   N)r   ÚClockr   ÚgetDelayedCallsr  ry   r  ÚactiveÚtimeÚfuncÚ_sendPrioritisedDatar¶   Úkw)r"   r   rA  ÚcallsÚcalls        r#   Ú"test_initiallySchedulesOneDataCallz7HTTP2SchedulingTests.test_initiallySchedulesOneDataCallç	  sÖ   € õ
 ”*‘,”,ˆÝ˜Ñ!Ô!ˆà'�Ô'Ñ)Ô)ˆØ×Ò�˜U™œ QÑ'Ô'Ð'Ø�QŒxˆð 	�Š˜Ÿš™œÑ&Ô&Ð&Ø×Ò˜œ AÑ&Ô&Ð&Ø×Ò˜œ AÔ$:Ñ;Ô;Ð;Ø×Ò˜œ BÑ'Ô'Ð'Ø×Ò˜œ "Ñ%Ô%Ð%Ð%Ð%r&   N)ri   rj   rk   rl   r­  r*   r&   r#   r¢  r¢  à	  s-   € € € € € ðð ð&ð &ð &ð &ð &r&   r¢  c                   ó†   — e Zd ZdZg d¢Z e¦   «         Zd„ Zd„ Zd„ Z	efd„Z
d„ Zd„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚHTTP2TimeoutTestsz@
    The L{H2Connection} object times out idle connections.
    rà   c                 ó   — |j         |_         dS )aá  
        Unfortunately, TimeoutMixin does not allow passing an explicit reactor
        to test timeouts. For that reason, we need to monkeypatch the method
        set up by the TimeoutMixin.

        @param connection: The HTTP/2 connection object to patch.
        @type connection: L{H2Connection}

        @param reactor: The reactor whose callLater method we want.
        @type reactor: An object implementing
            L{twisted.internet.interfaces.IReactorTime}
        N)r±  )r"   rÚ   r   s      r#   Úpatch_TimeoutMixin_clockz*HTTP2TimeoutTests.patch_TimeoutMixin_clock
  s   € ð  'Ô0ˆ
ÔÐÐr&   c                 óF  — t          j        ¦   «         }t          |¦  «        }d|_        |                      ||¦  «         t          ¦   «         }t          |¦  «        |_        |                     |¦  «         t          |¦  «        D ]}| 
                    |¦  «         Œ|||fS )a¥  
        Performs test setup by building a HTTP/2 connection object, a transport
        to back it, a reactor to run in, and sending in some initial data as
        needed.

        @param initialData: The initial HTTP/2 data to be fed into the
            connection after setup.
        @type initialData: L{bytes}

        @param requestFactory: The L{Request} factory to use with the
            connection.
        r  )r   r¤  r   ÚtimeOutr±  r   r   r  rû   r   rü   )r"   ÚinitialDatar  r   rg  rþ   r   s          r#   ÚinitiateH2Connectionz&HTTP2TimeoutTests.initiateH2Connection
  s¥   € õ ”*‘,”,ˆÝ˜GÑ$Ô$ˆØˆŒØ×%Ò% d¨GÑ4Ô4Ð4å#Ñ%Ô%ˆ	Ý6°~ÑFÔFˆÔØ×Ò˜IÑ&Ô&Ð&õ ˜kÑ*Ô*ð 	$ð 	$ˆDØ×Ò˜dÑ#Ô#Ð#Ð#à˜˜yÐ)Ð)r&   c                 ó^  — t          |¦  «        }|                      t          |¦  «        |¦  «         |                      t	          |d         t
          j        j        ¦  «        ¦  «         |                      |d         j        |¦  «         |                      |d         j	        |¦  «         dS )zÌ
        Confirm that the data that was sent matches what we expect from a
        timeout: namely, that it ends with a GOAWAY frame carrying an
        appropriate error code and last stream ID.
        rŒ   N)
r�   r  ry   r  r   r/   r0   rP   rQ   rR   )r"   r3   Ú
frameCountrU   rT   r‘   s         r#   ÚassertTimedOutz HTTP2TimeoutTests.assertTimedOut9
  s“   € õ ! Ñ&Ô&ˆà×Ò�˜V™œ jÑ1Ô1Ð1Ø�Š�
 6¨"¤:­zÔ/?Ô/KÑLÔLÑMÔMÐMØ×Ò˜ œÔ.°	Ñ:Ô:Ð:Ø×Ò˜ œÔ2°LÑAÔAÐAÐAÐAr&   c                 óÎ  — || j         u rt          j        }t          ¦   «         }|                     ¦   «         }|                      |t          ¬¦  «        \  }}}||_         |j        d¦  «         |                      | 	                    ¦   «         dt          j        j        j        d¬¦  «         |                      |j        ¦  «         |                      |j        ¦  «         |||fS )aµ  
        Does the common setup for tests that want to test the aborting
        functionality of the HTTP/2 stack.

        @param abortTimeout: The value to use for the abortTimeout. Defaults to
            whatever is set on L{H2Connection.abortTimeout}.
        @type abortTimeout: L{int} or L{None}

        @return: A tuple of the reactor being used for the connection, the
            connection itself, and the transport.
        ©r  r  r
  r   ©r·  rU   rT   )Ú_DEFAULTr   ÚabortTimeoutr   r+   rµ  r   Úadvancer¸  r  rÆ  r}  r~  ÚNO_ERRORr  rT  r^  r  )r"   r½  rŠ   r´  r   rg  rþ   s          r#   ÚprepareAbortTestz"HTTP2TimeoutTests.prepareAbortTestF
  sî   € ð ˜4œ=Ð(Ð(Ý'Ô4ˆLå#‘~”~ˆØ"×:Ò:Ñ<Ô<ˆà#'×#<Ò#<ØÝ+ð $=ñ $
ô $
Ñ ˆ��yð )ˆÔð 	ˆŒ˜ÑÔÐà×ÒØ�OŠOÑÔØÝ”iÔ*Ô3Øð	 	ñ 	
ô 	
ð 	
ð 	�Š˜	Ô/Ñ0Ô0Ð0Ø×Ò˜Ô/Ñ0Ô0Ð0à˜˜iÐ'Ð'r&   c                 ó(  — t          ¦   «         }|                     ¦   «         }|                      |t          ¬¦  «        \  }}}|                     ¦   «         } |j        d¦  «         |                      ||                     ¦   «         ¦  «         |                      |j        ¦  «          |j        d¦  «         |  	                    |                     ¦   «         dt          j        j        j        d¬¦  «         |                      |j        ¦  «         dS )z‘
        When a L{H2Connection} does not receive any data for more than the
        time out interval, it closes the connection cleanly.
        rº  r%  r
  r   r»  N)r   r+   rµ  r   r  r¾  r  r^  rT  r¸  rÆ  r}  r~  r¿  r  )r"   rŠ   r´  r   rg  rþ   Úpreambles          r#   Útest_timeoutAfterInactivityz-HTTP2TimeoutTests.test_timeoutAfterInactivityl
  s  € õ
 $‘~”~ˆØ"×:Ò:Ñ<Ô<ˆà#'×#<Ò#<ØÝ+ð $=ñ $
ô $
Ñ ˆ��yð —?’?Ñ$Ô$ˆð 	ˆŒ˜ÑÔÐð 	×Ò˜ 9§?¢?Ñ#4Ô#4Ñ5Ô5Ð5Ø×Ò˜Ô0Ñ1Ô1Ð1ð 	ˆŒ˜ÑÔÐà×ÒØ�OŠOÑÔØÝ”iÔ*Ô3Øð	 	ñ 	
ô 	
ð 	
ð 	�Š˜	Ô/Ñ0Ô0Ð0Ð0Ð0r&   c                 óþ  — t          ¦   «         }d}|                      |t          ¬¦  «        \  }}}t          |                     ¦   «         ¦  «        D ]A}|                     |¦  «          |j        d¦  «         |                      |j        ¦  «         ŒB |j        d¦  «         |  	                    | 
                    ¦   «         dt          j        j        j        d¬¦  «         |                      |j        ¦  «         dS )zM
        When a L{H2Connection} receives data, the timeout is reset.
        r&   rº  r%  r
  r   r»  N)r   rµ  r   r   r+   rü   r¾  r^  rT  r¸  r  rÆ  r}  r~  r¿  r  )r"   rŠ   r´  r   rg  rþ   r   s          r#   Útest_timeoutResetByRequestDataz0HTTP2TimeoutTests.test_timeoutResetByRequestDataŽ
  s  € õ
 $‘~”~ˆØˆà#'×#<Ò#<ØÝ+ð $=ñ $
ô $
Ñ ˆ��yõ ˜l×BÒBÑDÔDÑEÔEð 	6ð 	6ˆDØ×Ò˜dÑ#Ô#Ð#ð ˆGŒO˜BÑÔÐð ×Ò˜YÔ4Ñ5Ô5Ð5Ð5ð 	ˆŒ˜ÑÔÐà×ÒØ�OŠOÑÔØÝ”iÔ*Ô3Øð	 	ñ 	
ô 	
ð 	
ð 	�Š˜	Ô/Ñ0Ô0Ð0Ð0Ð0r&   c                 ó  ‡	— t          ¦   «         }d}g Š	t          | j        g |¦  «        }|                     ¦   «         }|d                     d„ |D ¦   «         ¦  «        z  }ˆ	fd„}|                      ||¬¦  «        \  }}}|                     |                     ¦   «         ¦  «          |j        d¦  «         |                      t          ‰	¦  «        d¦  «         t          d¦  «        D ]G}‰	d                              d	¦  «          |j        d¦  «         |                      |j        ¦  «         ŒH |j        d
¦  «         |                      |                     ¦   «         dt           j        j        j        d¬¦  «         dS )zJ
        When a L{H2Connection} sends data, the timeout is reset.
        r&   c              3   ó>   K  — | ]}|                      ¦   «         V — Œd S r   r•   r—   s     r#   r‹   zDHTTP2TimeoutTests.test_timeoutResetByResponseData.<locals>.<genexpr>»
  ó*   è è € Ð>Ð>°! §¢¡¤Ð>Ð>Ð>Ð>Ð>Ð>r&   c                 óT   •— t          | |¬¦  «        }‰                     |¦  «         |S )N)Úqueued)r   rŽ   )r  rÊ  rÒ   Úrequestss      €r#   ÚsaveRequestzFHTTP2TimeoutTests.test_timeoutResetByResponseData.<locals>.saveRequest½
  s,   ø€ Ý$ V°FÐ;Ñ;Ô;ˆCØ�OŠO˜CÑ Ô Ð ØˆJr&   rº  r%  r,   é
   r   s
   some bytesr
  é   r»  N)r   r’   r  r+   r˜   rµ  rü   r¾  ÚassertEqualsry   r§   r¨   r^  rT  r¸  r  rÆ  r}  r~  ÚPROTOCOL_ERROR)
r"   rŠ   r´  r‘   rÌ  r   rg  rþ   r(  rË  s
            @r#   Útest_timeoutResetByResponseDataz1HTTP2TimeoutTests.test_timeoutResetByResponseData°
  s¨  ø€ õ
 $‘~”~ˆØˆØˆå# DÔ$:¸BÀÑMÔMˆØ"×:Ò:Ñ<Ô<ˆØ�s—x’xÐ>Ð>°vÐ>Ñ>Ô>Ñ>Ô>Ñ>ˆð	ð 	ð 	ð 	ð 	ð
 $(×#<Ò#<ØØ&ð $=ñ $
ô $
Ñ ˆ��yð
 	×Ò˜,×>Ò>Ñ@Ô@ÑAÔAÐAð 	ˆŒ˜ÑÔÐØ×Ò�#˜h™-œ-¨Ñ+Ô+Ð+å�r‘”ð 	6ð 	6ˆAà�QŒK×Ò˜mÑ,Ô,Ð,ØˆGŒO˜BÑÔÐØ×Ò˜YÔ4Ñ5Ô5Ð5Ð5ð 	ˆŒ˜ÑÔÐØ×ÒØ�OŠOÑÔØÝ”iÔ*Ô9Øð	 	ñ 	
ô 	
ð 	
ð 	
ð 	
r&   c                 óÌ  — t          ¦   «         }t          | j        g |¦  «        }|                     ¦   «         }|d                     d„ |D ¦   «         ¦  «        z  }|                      |t          ¬¦  «        \  }}} |j        d¦  «         |                      | 	                    ¦   «         dt          j        j        j        d¬¦  «         |                      |j        ¦  «         dS )	z’
        When a L{H2Connection} times out with active streams, the error code
        returned is L{h2.errors.ErrorCodes.PROTOCOL_ERROR}.
        r&   c              3   ó>   K  — | ]}|                      ¦   «         V — Œd S r   r•   r—   s     r#   r‹   zOHTTP2TimeoutTests.test_timeoutWithProtocolErrorIfStreamsOpen.<locals>.<genexpr>ä
  rÈ  r&   rº  r  r
  r,   r»  N)r   r’   r  r+   r˜   rµ  rÆ   r¾  r¸  r  rÆ  r}  r~  rÐ  r  rT  )r"   rŠ   r‘   r´  r   rg  rþ   s          r#   Ú*test_timeoutWithProtocolErrorIfStreamsOpenz<HTTP2TimeoutTests.test_timeoutWithProtocolErrorIfStreamsOpenÜ
  sê   € õ
 $‘~”~ˆÝ# DÔ$:¸BÀÑMÔMˆØ"×:Ò:Ñ<Ô<ˆØ�s—x’xÐ>Ð>°vÐ>Ñ>Ô>Ñ>Ô>Ñ>ˆà#'×#<Ò#<ØÝ/ð $=ñ $
ô $
Ñ ˆ��yð 	ˆŒ˜ÑÔÐà×ÒØ�OŠOÑÔØÝ”iÔ*Ô9Øð	 	ñ 	
ô 	
ð 	
ð 	�Š˜	Ô/Ñ0Ô0Ð0Ð0Ð0r&   c                 ó^  — t          ¦   «         }t          | j        g |¦  «        }|                     ¦   «         }|d                     d„ |D ¦   «         ¦  «        z  }|                      |t          ¬¦  «        \  }}}|                     ¦   «         }t           |j	        ¦   «         ¦  «        }| 
                    d¦  «         t           |j	        ¦   «         ¦  «        }	|                      |dz
  |	¦  «          |j        d¦  «         |                      |                     ¦   «         |¦  «         dS )zU
        When a L{H2Connection} loses its connection it cancels its timeout.
        r&   c              3   ó>   K  — | ]}|                      ¦   «         V — Œd S r   r•   r—   s     r#   r‹   zCHTTP2TimeoutTests.test_noTimeoutIfConnectionLost.<locals>.<genexpr>ý
  rÈ  r&   rº  rõ  r,   r  N)r   r’   r  r+   r˜   rµ  rÆ   r  ry   r¥  ÚconnectionLostr  r¾  )
r"   rŠ   r‘   r´  r   rg  rþ   ÚsentDataÚoldCallCountÚcurrentCallCounts
             r#   Útest_noTimeoutIfConnectionLostz0HTTP2TimeoutTests.test_noTimeoutIfConnectionLostö
  s0  € õ $‘~”~ˆÝ# DÔ$:¸BÀÑMÔMˆØ"×:Ò:Ñ<Ô<ˆØ�s—x’xÐ>Ð>°vÐ>Ñ>Ô>Ñ>Ô>Ñ>ˆà#'×#<Ò#<ØÝ/ð $=ñ $
ô $
Ñ ˆ��yð
 —?’?Ñ$Ô$ˆÝÐ2˜7Ô2Ñ4Ô4Ñ5Ô5ˆð 	×Ò˜HÑ%Ô%Ð%õ Ð6˜wÔ6Ñ8Ô8Ñ9Ô9ÐØ×Ò˜¨Ñ)Ð+;Ñ<Ô<Ð<ð 	ˆŒ˜ÑÔÐØ×Ò˜ŸšÑ*Ô*¨HÑ5Ô5Ð5Ð5Ð5r&   c                 óF  — |                       ¦   «         \  }}} |j        d¦  «         |                      |j        ¦  «         |                      |j        ¦  «          |j        d¦  «         |                      |j        ¦  «         |                      |j        ¦  «         dS )z¢
        When a L{H2Connection} has timed the connection out, and the transport
        doesn't get torn down within 15 seconds, it gets forcibly closed.
        é   r,   N©rÀ  r¾  r  rT  r^  r  ©r"   r   rg  rþ   s       r#   Ú,test_timeoutEventuallyForcesConnectionClosedz>HTTP2TimeoutTests.test_timeoutEventuallyForcesConnectionClosed  sž   € ð
 $(×#8Ò#8Ñ#:Ô#:Ñ ˆ��yð 	ˆŒ˜ÑÔÐØ�Š˜	Ô/Ñ0Ô0Ð0Ø×Ò˜Ô/Ñ0Ô0Ð0ØˆŒ˜ÑÔÐØ�Š˜	Ô/Ñ0Ô0Ð0Ø�Š˜	Ô.Ñ/Ô/Ð/Ð/Ð/r&   c                 ó  — |                       ¦   «         \  }}} |j        d¦  «         |                     d¦  «          |j        d¦  «         |                      |j        ¦  «         |                      |j        ¦  «         dS )zœ
        When a L{H2Connection} has timed the connection out, getting
        C{connectionLost} called on it cancels the forcible connection close.
        rÝ  Nr,   )rÀ  r¾  r×  r  rT  r^  r  rß  s       r#   Ú$test_losingConnectionCancelsTheAbortz6HTTP2TimeoutTests.test_losingConnectionCancelsTheAbort!  sŠ   € ð
 $(×#8Ò#8Ñ#:Ô#:Ñ ˆ��yð 	ˆŒ˜ÑÔÐØ×Ò˜DÑ!Ô!Ð!ð 	ˆŒ˜ÑÔÐØ�Š˜	Ô/Ñ0Ô0Ð0Ø×Ò˜Ô/Ñ0Ô0Ð0Ð0Ð0r&   c                 óÂ   — |                       d¬¦  «        \  }}} |j        d¦  «         |                      |j        ¦  «         |                      |j        ¦  «         dS )z™
        When a L{H2Connection} has timed the connection out but the
        C{abortTimeout} is set to L{None}, the connection is never aborted.
        N)r½  l        rÞ  rß  s       r#   Ú'test_losingConnectionWithNoAbortTimeOutz9HTTP2TimeoutTests.test_losingConnectionWithNoAbortTimeOut1  sg   € ð
 $(×#8Ò#8ÀdÐ#8Ñ#KÔ#KÑ ˆ��yð 	ˆŒ˜ÑÔÐØ�Š˜	Ô/Ñ0Ô0Ð0Ø×Ò˜Ô/Ñ0Ô0Ð0Ð0Ð0r&   c                 óü   — |                       ¦   «         \  }}} |j        d¦  «         |                      |j        ¦  «         |                      |j        ¦  «         |                     t          j        ¦  «         dS )z}
        If a timed out transport doesn't close after 15 seconds, the
        L{HTTPChannel} will forcibly close it.
        é   N)rÀ  r¾  r  rT  r  r×  r   ÚConnectionDonerß  s       r#   Ú"test_connectionLostAfterForceClosez4HTTP2TimeoutTests.test_connectionLostAfterForceClose>  sy   € ð
 $(×#8Ò#8Ñ#:Ô#:Ñ ˆ��yð 	ˆŒ˜ÑÔÐØ�Š˜	Ô/Ñ0Ô0Ð0Ø�Š˜	Ô.Ñ/Ô/Ð/ð
 	×Ò�EÔ0Ñ1Ô1Ð1Ð1Ð1r&   c                 ó*  — t          ¦   «         }t          |¦  «        }|j        |_        d|_        t	          ¦   «         }t          ¦   «         }|                     ¦   «         }|                     |¦  «         |                     |¦  «         t          |j        |j
        z   ¦  «        D ]Q}|                     |                     d¦  «                             ¦   «         ¦  «         |                     d¦  «         ŒR|                      |j        ¦  «         dS )zR
        A client that sends only invalid frames is eventually timed out.
        é<   r,   N)r
   r   r±  r³  r   r   r+   rû   rü   r§   r½  rZ   r–   r¾  r  r  )r"   r  rÚ   rŠ   rþ   r+   r¬   s          r#   Ú,test_timeOutClientThatSendsOnlyInvalidFramesz>HTTP2TimeoutTests.test_timeOutClientThatSendsOnlyInvalidFramesO  s  € õ +Ñ,Ô,ˆå! -Ñ0Ô0ˆ
Ø,Ô6ˆ
ÔØˆ
Ôå#‘~”~ˆÝ#Ñ%Ô%ˆ	à".×"FÒ"FÑ"HÔ"HÐØ×!Ò! )Ñ,Ô,Ð,Ø×ÒÐ 7Ñ8Ô8Ð8õ �zÔ)¨JÔ,CÑCÑDÔDð 	%ð 	%ˆAØ×#Ò# L×$DÒ$DÀQÑ$GÔ$G×$QÒ$QÑ$SÔ$SÑTÔTÐTØ×!Ò! !Ñ$Ô$Ð$Ð$ð 	�Š˜	Ô.Ñ/Ô/Ð/Ð/Ð/r&   N)ri   rj   rk   rl   r  rÝ  r¼  r±  rµ  r¸  rÀ  rÃ  rÅ  rÑ  rÔ  rÛ  rà  râ  rä  rè  rë  r*   r&   r#   r¯  r¯  ü	  s   € € € € € ðð ðð ð Ðð ˆv‰xŒx€Hð1ð 1ð 1ð*ð *ð *ð8Bð Bð Bð -5ð $(ð $(ð $(ð $(ðL 1ð  1ð  1ðD 1ð  1ð  1ðD*
ð *
ð *
ðX1ð 1ð 1ð46ð 6ð 6ð80ð 0ð 0ð1ð 1ð 1ð 1ð 1ð 1ð2ð 2ð 2ð"0ð 0ð 0ð 0ð 0r&   r¯  rh   )Drl   r:  Úzope.interfacer   r   Útwisted.internetr   r   r   r   Útwisted.internet.addressr	   Útwisted.internet.testingr
   r   Útwisted.pythonr   Útwisted.python.compatr   Útwisted.test.test_internetr   Útwisted.trialr   Útwisted.webr   Útwisted.web.test.test_httpr   r   r   r   r   r   r   rÜ   rÆ  Ú	h2.errorsÚh2.exceptionsr/   rØ   Úhpack.hpackr   r   Útwisted.web._http2r   ÚImportErrorr   rn   r’   r™   r�   r±   rŸ   rO  r¯   rZ  rÂ   re  rÆ   ro  rÊ   ÚNotifyingRequestFactoryProxyrÕ   ÚTestCaserß   r.  rŒ  r¢  r¯  r*   r&   r#   ú<module>rý     sõ  ððð ð
 Ð Ð Ð à 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7à 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø HÐ HÐ HÐ HÐ HÐ HÐ HÐ HØ "Ð "Ð "Ð "Ð "Ð "Ø +Ð +Ð +Ð +Ð +Ð +Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø "Ð "Ð "Ð "Ð "Ð "Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð 
€ð*ð €I€I€IØÐÐÐØÐÐÐØÐÐÐØ€O€O€OØ,Ð,Ð,Ð,Ð,Ð,Ð,Ð,à/Ð/Ð/Ð/Ð/Ð/Ð/øØð *ð *ð *Ø)€F€F€Fð*øøøð
að að að að añ aô að aðH'ð 'ð 'ð 'ð 'ñ 'ô 'ð 'ðTð ð ð ðB3ð 3ð 3ð 3ð.ð ð ð(ð ð ð ð ˜œñ ô ð ð( 3Ð2Ð3EÑFÔFÐ ðð ð ð ð ˜4œ<ñ ô ð ðD 5Ð4Ð5IÑJÔJÐ ð%ð %ð %ð %ð %Ð#7ñ %ô %ð %ð  %=Ð$<Ø ñ%ô %Ð !ð
	5ð 	5ð 	5ð 	5ð 	5˜4œ<ñ 	5ô 	5ð 	5ð 5Ð4Ð5IÑJÔJÐ ðCð Cð Cð Cð Cñ Cô Cð Cð0  8Ð7Ð8OÑPÔPÐ ðMð Mð Mð Mð Mñ Mô Mð Mð"K0ð K0ð K0ð K0ð K0�xÔ(Ð*:ñ K0ô K0ð K0ð\(a
0ð a
0ð a
0ð a
0ð a
0˜Ô*Ð,<ñ a
0ô a
0ð a
0ðHT5ð T5ð T5ð T5ð T5˜XÔ.Ð0@ñ T5ô T5ð T5ðn&ð &ð &ð &ð &˜8Ô,Ð.>ñ &ô &ð &ð8l0ð l0ð l0ð l0ð l0˜Ô)Ð+;ñ l0ô l0ð l0ð l0ð l0s   Á"A? Á?B	ÂB	