a àMÒeöã@s¬ddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl m Z ddlmZmZmZmZmZGdd„deƒZGdd„deƒZGdd „d eƒZdS) éN)Ú NullContext)ÚQUIC_MAX_DATAGRAMÚAsyncQuicConnectionÚAsyncQuicManagerÚBaseQuicStreamÚ UnexpectedEOFcsXeZdZ‡fdd„Zdd„Zddd„Zdd d „Zd d „Zd d„Zdd„Z dd„Z ‡Z S)ÚTrioQuicStreamcstƒ ||¡t ¡|_dS©N)ÚsuperÚ__init__ÚtrioÚ ConditionÚ_wake_up)ÚselfÚ connectionÚ stream_id©Ú __class__©ú2/usr/lib/python3.9/site-packages/dns/quic/_trio.pyr szTrioQuicStream.__init__c Ãsl|j |¡rdS||_|j4IdHš&|j ¡IdHWdƒIdHq`1IdHsV0Yd|_qdS)Nr)Ú_bufferZhaveZ _expectingrÚwait)rÚamountrrrÚwait_fors  :zTrioQuicStream.wait_forNcÃsŽ|durtdƒ}n t |¡}|R| d¡IdHt d|j d¡¡\}| |¡IdH|j |¡WdƒS1sx0Ytj j ‚dS)Néz!H) rr Ú move_on_afterrÚstructÚunpackrÚgetÚdnsÚ exceptionÚTimeout)rÚtimeoutÚcontextÚsizerrrÚreceive's  *zTrioQuicStream.receiveFcÃs&| |¡}|j |j||¡IdHdSr )Z _encapsulateÚ _connectionÚwriteZ _stream_id)rÚdatagramÚis_endÚdatarrrÚsend3s zTrioQuicStream.sendc ÃsT| ||¡rP|j4IdHš |j ¡WdƒIdHqP1IdHsF0YdSr )Z_common_add_inputrÚnotify)rr*r)rrrÚ _add_input7s zTrioQuicStream._add_inputcÃs | ¡dSr )Z_close©rrrrÚclose<szTrioQuicStream.closecÃs|Sr rr.rrrÚ __aenter__AszTrioQuicStream.__aenter__c ÃsV| ¡IdH|j4IdHš |j ¡WdƒIdHqR1IdHsH0YdS©NF)r/rr,)rÚexc_typeÚexc_valÚexc_tbrrrÚ __aexit__Ds4zTrioQuicStream.__aexit__)N)F) Ú__name__Ú __module__Ú __qualname__r rr%r+r-r/r0r5Ú __classcell__rrrrrs  rcsReZdZd‡fdd„ Zdd„Zdd„Zdd d „Zd d „Zdd d„Zdd„Z ‡Z S)ÚTrioQuicConnectionNcsPtƒ ||||||¡tj |jtjd¡|_t ¡|_t ¡|_ d|_ d|_ dS)NrF) r r r ÚsocketÚ_afZ SOCK_DGRAMÚ_socketÚEventÚ_handshake_completeÚ _run_doneÚ _worker_scopeÚ _send_pending)rrÚaddressÚportÚsourceÚ source_portZmanagerrrrr Ls   zTrioQuicConnection.__init__cÃs<z"|jr*|j tj |j|j¡¡IdH|j |j¡IdH|j s|  d¡\}}|j r^d}t j t  ¡|d:|_|j t¡IdH}|j ||jt ¡¡Wdƒn1s²0Yd|_| |¡| ¡IdHd|_ |j t ¡¡}|D]\}}|j |¡IdHqôq>Wd|_ |j ¡nd|_ |j ¡0dS)NFg)ZdeadlineT)Ú_sourcer=ZbindrZinetZlow_level_address_tupler<ÚconnectÚ_peerÚ_doneZ_get_timer_valuesrBr Z CancelScopeZ current_timerAZrecvrr&Zreceive_datagramÚtimeZ _handle_timerÚ_handle_eventsZdatagrams_to_sendr+r?Úset)rZ expirationÚintervalr(Z datagramsÚ_rrrÚ_workerTs6ÿ  ÿ4   ÿzTrioQuicConnection._workercÃsðd}|j ¡}|durdSt|tjjjƒrT|j |j ¡}|rÆ|  |j |j ¡IdHnrt|tjjj ƒrp|j ¡nVt|tjjjƒr’d|_|j ¡n4t|tjjjƒrÆ|j |j ¡}|rÆ|  dd¡IdH|d7}|dkrd}t d¡IdHqdS)NrTóéé )r&Z next_eventÚ isinstanceÚaioquicZquicZeventsZStreamDataReceivedÚ_streamsrrr-r*Z end_streamZHandshakeCompletedr?rMZConnectionTerminatedrJr=r/Z StreamResetr Úsleep)rÚcountZeventÚstreamrrrrLxs*   z!TrioQuicConnection._handle_eventsFcÃs.|j |||¡d|_|jdur*|j ¡dS)NT)r&Zsend_stream_datarBrAÚcancel)rrYr*r)rrrr'‘s zTrioQuicConnection.writec Ãs`|jr dSt ¡4IdHš"}| |j¡WdƒIdHqR1IdHsH0Y|j ¡dSr )Ú_closedr Z open_nurseryÚ start_soonrPr@rM)rÚnurseryrrrÚrun—s 6zTrioQuicConnection.runcÃsŠ|durtdƒ}n t |¡}|N|j ¡IdH|jrs  2m