o
    .jr'                    @  s  d dl mZ d dlZd dlZd dlZd dlmZmZ d dlmZm	Z	 d dlm
Z ddlmZ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d
lmZmZmZmZmZmZm Z  ddl!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( ddl)m*Z*m+Z+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4 ddl5m6Z6m7Z7m8Z8 ddl9m:Z: ddl;m<Z< ddl=m>Z>m?Z?m@Z@mAZA ddlBmCZCmDZD ddl=mEZEmFZFmGZG ejHrddlImJZJ e, ZKG dd deEZLdS )    )annotationsN)datetimetimezone)
SOCK_DGRAMSOCK_STREAM)timeout   )sslCertificate)HTTPHeaderDict)DEFAULT_BLOCKSIZEDEFAULT_KEEPALIVE_DELAYUDP_DEFAULT_BLOCKSIZE	responsesHTTP1_ONLY_HEADERSDEFAULT_BACKGROUND_WATCH_WINDOWDEFAULT_KEEPALIVE_IDLE_WINDOW)HTTP1ProtocolHTTP2ProtocolHTTP3ProtocolHTTPOverQUICProtocolHTTPOverTCPProtocolHTTPProtocolFactoryQuicTLSConfig)ConnectionTerminatedDataReceivedEarlyHeadersReceivedEventHandshakeCompletedHeadersReceivedStreamResetReceived)AsyncSocketSSLAsyncSocket_has_complete_support_dgram)EarlyResponseIncompleteReadInvalidHeaderMustDowngradeErrorProtocolErrorResponseNotReadySSLError)parse_alt_svcresolve_cert_reqs	parse_url)enable_keepalive)AsyncSubTimeout   )ConnectionInfoHttpVersionQuicPreemptiveCacheTypeResponsePromise)_HAS_HTTP3_SUPPORT_HAS_SYS_AUDIT   )AsyncBaseBackendAsyncDirectStreamAccessAsyncLowLevelResponse)_TYPE_SOCKET_OPTIONSc                      s  e Zd ZejejejgZdddefe	j
ddeeedd fddZedddZedddZedd d!Zedd"d#Zdd%d&Zdd(d)Z												ddd<d=Zddd@dAZddBdCZ			DdddHdIZddJdKZdddNdOZdLddPddddQdd]d^Z	L	LdddcddZddgdhZ	ddLdLdiddodpZ	LdddudvZ ddwdxZ!	P	Lddd}d~Z"ddddddZ#dLddddZ$dddZ%dddZ&  Z'S )AsyncHfaceBackendNsocket_optionsdisabled_svnpreemptive_quic_cachekeepalive_delaybackground_watch_delaykeepalive_idle_windowhoststrport
int | Noner   int | float | Nonesource_addresstuple[str, int] | None	blocksizeintr?   _TYPE_SOCKET_OPTIONS | Noner@   set[HttpVersion] | NonerA   QuicPreemptiveCacheType | NonerB   float | int | NonerC   rD   c                  s   t  rts|d u rt }|tj t j|||||||||	|
|d d | _d | _	d | _
d | _g | _d | _d | _d| _d | _d| _d | _d | _d | _d | _d S )Nr>   F)r5   _HAS_DGRAM_SUPPORTsetaddr2   h3super__init___proxy_protocol	_protocol_svn
_stream_id_AsyncHfaceBackend__headers(_AsyncHfaceBackend__expected_body_length)_AsyncHfaceBackend__remaining_body_length%_AsyncHfaceBackend__authority_bit_set%_AsyncHfaceBackend__legacy_host_entry$_AsyncHfaceBackend__protocol_bit_set'_AsyncHfaceBackend__custom_tls_settings!_AsyncHfaceBackend__alt_authority_AsyncHfaceBackend__origin_port _max_tolerable_delay_for_upgrade)selfrE   rG   r   rJ   rL   r?   r@   rA   rB   rC   rD   	__class__ Q/home/thesage/.local/lib/python3.10/site-packages/urllib3/backend/_async/hface.pyrW   G   s>   

zAsyncHfaceBackend.__init__returnboolc                 C  s(   | j d u rdS | j  s| j   S dS NF)rY   is_availablehas_expiredrf   ri   ri   rj   is_saturated   s
   

zAsyncHfaceBackend.is_saturatedc                 C  s   | j d u rdS | j  S rm   )rY   expect_pongrp   ri   ri   rj   rr      s   

zAsyncHfaceBackend.expect_pongc                 C  s   | j d uo| j jS N)rY   multiplexedrp   ri   ri   rj   is_multiplexed   s   z AsyncHfaceBackend.is_multiplexedc                 C  sL   | j du r| jS z| j  }W n ty   | j Y S w | j|kr#|S | jS )z
        The remote may require us to a lower blocksize
        than defined. This property will avoid relying
        too much on defined blocksize.
        N)rY   rL   max_frame_sizeNotImplementedError)rf   remote_max_sizeri   ri   rj   rv      s   

z AsyncHfaceBackend.max_frame_sizeAsyncSocket | Nonec                   s"  | j d u rVtj| jvrV| jdkrV| jr7| j| jf| jv r7| j| j| jp%df | _| jr6tj| _ | jd | _ntj	| jv rVtj
| jv rV| j| jpIdf| _tj| _ | jd | _| j tjkr| jtkrdt| _t| _| jr| jj| jkrd | _ d | _| jtkrt| _t| _d S | jtkrt| _t| _d S )Nhttps  r7   )rZ   r2   rU   _disabled_svnscheme_preemptive_quic_cacherE   rG   rc   h11h2rL   r   r   r   socket_kind	_response	authorityr   rp   ri   ri   rj   	_new_conn   sD   




zAsyncHfaceBackend._new_connNonec                   s  | j d us
J d| jd usJ | jd usJ | jd urd S t }t| jtu }tj| j	v }tj
| j	v }d }|rN|sA| jtj
krCd S tj
}| jdd| _n)| jtjkrVd S |sd|rdtj}| jdd| _| jsw| jtjkrwtj
}| jdd| _| jr| jd ur| jjd ur| jj | _| jjd ur|  j| jj 7  _t| jd| _nd| _|tjkr| jd ur| j| j| j| jpdf< | j| jpdf| jvrd S || _| jpd| _| jd | _|  I d H  d S d S )	Nz<attempt to call _upgrade() prior to successful getresponse()h2c)svcrU   r   g      ?r{   r7   )r   sockrZ   rc   r5   typer!   r2   rU   r|   r    _AsyncHfaceBackend__altsvc_prober   	conn_infoestablished_latencytotal_secondsre   tls_handshake_latencymaxr~   rE   rG   rd   close)rf   has_h3_supportis_plain_socketis_h3_disabledis_h2_disabledupgradable_svnri   ri   rj   _upgrade   sj   






zAsyncHfaceBackend._upgradessl_contextssl.SSLContext | Noneca_certs
str | Noneca_cert_dirca_cert_dataNone | str | bytesssl_minimum_versionssl_maximum_version	cert_filestr | bytes | Nonekey_filekey_passwordcert_fingerprintassert_hostname"None | str | typing.Literal[False]	cert_reqsint | str | Nonec                 C  s  | j tjurdS d}d}|st|tjkrd}z|dur | nd}|duo/d|v o/|d dk}W n ttfy>   d}Y nw |sa|du ra|du ra|du ra|sat	tj
}t|dr_|  nd}|rt|ddpjd}|jtjkrsd}|du r|du r|du rz|d}W n ttfy   g }Y nw |rdd	d
 |D }|du rt|dr|jdu rd}t|drz|  W n ty   |d Y n	 ty   Y nw t| jd| t|||t|tr| n||||	|
|t|tr|ndt|tr|nd| jpd| jd| _| jj | _ dS )z^Meant to support TLS over QUIC meanwhile cpython does not ship with its native implementation.FTNx509_car   load_default_certshostname_checks_common_name
c                 s  s    | ]}t |V  qd S rs   )r	   DER_cert_to_PEM_cert).0certri   ri   rj   	<genexpr>v  s    

z0AsyncHfaceBackend._custom_tls.<locals>.<genexpr>check_hostnameset_fingerprintzchrome:stablecontextg     r@)insecurecafilecapathcadatacertfilekeyfilekeypasswordr   cert_use_common_nameverify_hostnamer   idle_timeoutech_config_list)!rZ   r2   rU   r,   r	   	CERT_NONEcert_store_statsAttributeErrorrw   
SSLContextPROTOCOL_TLS_CLIENThasattrr   getattrverify_modeget_ca_certsjoinr   http_header_for_fingerprint
ValueErrorr   setattrr   r   
isinstancerF   encoderl   _keepalive_delay_ech_configrb   r   is_verified)rf   r   r   r   r   r   r   r   r   r   r   r   r   r   allow_insecure
cert_statsssl_ctx_have_certsctx_root_certificatesri   ri   rj   _custom_tls-  s   









zAsyncHfaceBackend._custom_tlsrU   r   c              
   C  s   | j dusJ | j jdD ]3}t|D ],\}}||krq|d\}}|r,|| jkr,qz|t|fW     S  ty@   Y qw qdS )zFDetermine if remote yield support for an alternative service protocol.Nzalt-svc:)r   msggetlistr+   splitrE   rM   r   )rf   r   alt_svcprotocolalt_authorityserverrG   ri   ri   rj   __altsvc_probe  s   z AsyncHfaceBackend.__altsvc_probec                   sX  | j d urd | _d | _n	| jd u sJ d| jd usJ d| jd u rt| jt}|r| j }|d ur[|dkrDtt	| _t
j| _n|dkrStt| _t
j| _ntd| dt
j| jvrltt| _t
j| _nt
j| jvr}tt	| _t
j| _nptdt
j| jvrtt| _t
j| _n[t
j| jvrtt	| _t
j| _nJtd| jt
jkrtt	| _n9| jt
jkr| jd usJ | jd ur| j\}}| j}n| j| j}}tjt| jjr| jjn|t|f|| jd	| _t | _| j| j_t| d
r| jr| jd | j_| jd | j_| jt
jurHd }t| jdrt| jj dr0| jj j!dk| j_"nt| jj drA| jj # | j_"nd| j_"| jj j$dd| j_%z| jj j$dd| j_&W n t'yi   d | j_&Y nw d | j_(| jj ) }t| jj drt| jj j*dr| jj j*+ }t,|}t-d urt.dd |D nd}	|	r| jj&s|r|d / | j_&|dkr|d 0 }
t|
t1r|
| j_2ntt3drt34|
| j_2|d / | j_5n|dkr|d | j_2|r/|d | j_)|d dkrt3j6j7| j_8n.|d dkrt3j6j9| j_8n |d dkrt3j6j:| j_8n|d dkr+t3j6j;| j_8nd | j_8| jj(d u rHt| jdrH| j< d d | j_(| jd u sU| jt
jkr| jd u rmt
j| jv rmtt	| _t
j| _ntt| _t
j| _| j=r| j>rt?| jt| j>t| j= | j| j_| jj%rt| d
r| jrt@jAtBjCd| jd   | j_DtEF | _Gd S | jHd ur| jI| jH z| jJtKdd!I d H  W nX ttLtMtNtOfy& } zF| jd ur!| jt
jkr| jPd ur| j| jQpd"f}|| jPv r| jP|= d | _t
j| jRvst
j| jRvr!tSd#| j d$| j d%| d }~ww tEF | _G| jHd ur9| jI| jT d | _Ht| jtUr| jj$dd| j_%| jj$dd| j_&| j< d d | j_(| j) | j_)t3j6j;| j_8| j# | j_"| jjVdd| j_5| jjVdd| j_2| jj%rt| d
r| jjDst@jAtBjCd| jd   | j_Dd S d S d S d S )&Nz:_post_conn() must be called when socket is closed or unsetzEprobable attempt to call _post_conn() prior to successful _new_conn()r   zhttp/1.1zUnsupported ALPN 'z<' during handshake. Did you try to reach a non-HTTP server ?zNo compatible protocol are enabled to emit request. You currently are connected using TCP TLS and must have HTTP/1.1 or/and HTTP/2 enabled to pursue.zNo compatible protocol are enabled to emit request. You currently are connected using TCP Unencrypted and must have HTTP/1.1 or/and HTTP/2 enabled to pursue.)remote_addressserver_name
tls_config_connect_timingsr   r7   sslobj
ech_statusacceptedech_acceptedFT)binary_form_sslobjget_verified_chainc                 s      | ]}t |tV  qd S rs   )r   r
   )r   crtri   ri   rj   r   A      z/AsyncHfaceBackend._post_conn.<locals>.<genexpr>PEM_cert_to_DER_certzTLSv1.0zTLSv1.1zTLSv1.2zTLSv1.3getpeernamer0   tzr=   )receive_firstr{   z#The server yielded its support for z[ through the Alt-Svc header while unable to do so. To remediate that issue, either disable z" or reach out to the server admin.)W_tunnel_hostrZ   rY   r   r   r"   selected_alpn_protocolr   newr   r2   r   r   r   r(   r|   RuntimeErrorrU   rb   rc   rE   rG   r   r   rM   r1   r   http_versionr   r   resolution_latencyr   r   r   tls_ech_acceptedr   getpeercertcertificate_dercertificate_dictr   destination_addresscipherr   r   lenr
   allget_infopublic_bytesbytesissuer_certificate_derr	   r   issuer_certificate_dict
TLSVersionTLSv1tls_versionTLSv1_1TLSv1_2TLSv1_3r   _background_watch_delay_keepalive_idle_windowr.   r   nowr   utcr   time	monotonic_connected_atre   
settimeout"_AsyncHfaceBackend__exchange_untilr   TimeoutErrorSocketTimeoutConnectionRefusedErrorConnectionResetErrorr~   rd   r@   r'   r   r   getissuercert)rf   is_tcp_tls_connalpn_rG   r   cipher_tuplechaincert_in_chain_countparsed_certsissuer_public_bytesealt_keyri   ri   rj   
_post_conn  s  























!




zAsyncHfaceBackend._post_connhttpheaderstyping.Mapping[str, str] | Noner}   c                 C  sL   | j rtdtj| jvr| jtj || _|| _|r!|| _d S i | _d S )Nz.Can't set up tunnel for established connection)	r   r   r2   rU   r|   rT   r   _tunnel_port_tunnel_headers)rf   rE   rG   r%  r}   ri   ri   rj   
set_tunnel  s   

zAsyncHfaceBackend.set_tunnelc                   s  | j d usJ | jd usJ | jd usJ | jd usJ | jtjkr'td| j  | _	dd| j d| j 
dfg}| j D ]\}}|| 
 |
df qB| j | j	|d | jtdtfdd	I d H }d }|D ]}t|tr|jD ]\}}|d
krt| } nqyqo|d uod|  kodk n  }	|	s|  I d H  |r|tv rt| nd}
td| d|
 d | _d | _ d | _d S )Nz7Unable to establish a tunnel using other than HTTP/1.1.)   :method   CONNECT
   :authorityr   ascii
iso-8859-1TF)r   event_type_collectablerespect_end_stream_signal   :status   ,  UnknownzTunnel connection failed:  )rY   r   r   r'  rZ   r2   r   rw   get_available_stream_idr[   r   r(  itemsappendlowersubmit_headersr  r   r   r%  rM   decoder   r   OSError_protocol_factory)rf   req_contextheadervalueeventsstatusevent
raw_header	raw_valuetunnel_acceptedmessageri   ri   rj   _tunnel  s\   
 
zAsyncHfaceBackend._tunnelFexpect_framec              	     s`  | j du s| jdu rdS | j  }| j |sdnd z2z| j | jI dH }W n ty:   Y W | j | dS  ttfyF   d}Y nw W | j | n| j | w |s_| j	  dS zt
|trq|D ]}| j| qgn| j| W n | j y   Y dS w 	 | j }|snz| j |I dH  W n
 ty   Y dS w qt | _| j S )a  This method should be called by a thread using TrafficPolice when it is idle.
        Multiplexed protocols can receive incoming data unsolicited. Like when using QUIC
        or when reaching a WebSocket.
        This method return True if there is any event ready to unpack for the connection.
        Some server implementation may be aggressive toward "idle" session
        this is especially true when using QUIC.
        For example, google/quiche expect regular ACKs, otherwise will
        deduct that network conn is dead.
        see: https://github.com/google/quiche/commit/c4bb0723f0a03e135bc9328b59a39382761f3de6
             https://github.com/google/quiche/blob/92b45f743288ea2f43ae8cdc4a783ef252e41d93/quiche/quic/core/quic_connection.cc#L6322
        NFgMbP?g?    )r   rY   
gettimeoutr  recvrL   r  ConnectionAbortedErrorr  connection_lostr   listbytes_received
exceptionsbytes_to_sendsendallr<  r  r  _last_used_athas_pending_event)rf   rI  bck_timeout	peek_datagro_segmentdata_outri   ri   rj   peek_and_react1  sP   





z AsyncHfaceBackend.peek_and_reactT)r   r/  r0  maximal_data_in_readdata_in_len_from	stream_id
event_type%type[Event] | tuple[type[Event], ...]r   r/  ,type[Event] | tuple[type[Event], ...] | Noner0  r[  r\  $typing.Callable[[Event], int] | Noner]  list[Event]c                  s  | j dur| jdusJ | j| j | j}| jtju  td}	 }
d( fdd}|dur<|dks<|dks<d}d}g }g }|dkrH|S |rT|dk rTd	}d}d}	 d	}j|ds|sf| I dH  |	rl	 nd}t
||}z&|4 I dH  |I dH }W d  I dH  n1 I dH sw   Y  W n+ tttfy } zt|tr|tu st|trt|v r|d}W Y d}~nd}~ww |jrqTd
}|s|s| jdurtdrz  W n |
y } zt||d}~ww   nt|tr<|D ];}|du r|t|7 }z| W q |
y: } zt|dr1t|dr1t|j|jd|t||d}~ww nFt|}| jd |d  | _|du rS||7 }z| W n' |
y } zt|drxt|drxt|j|jd|t||d}~ww |r| I dH  j|dD ]}t|d}|s_t|tr_d| _|   I dH  |j!dkr|dur|t"u st|trt"|v r|#t"|dd
d |  S |r|dkrt|trt$|v s|t$u rt%dd |D std|j!dkr|j&rd|j&v rt'|j&|j!dkr!| jtjkr!t(dz,|j&rLd|j&v rL|j&)dd*d}d d t|+d!D \}}t||| dW n t,t-fyY   Y nw t|j&|rt|t.r| jtj/kru|j!d"ks| jtjkr|j!d#krtj0| j1vrt2d$| j td%|j3 d&t4|j! d'|s|#| n't||r|#| |rz|||7 }W n t5y   Y nw n|#| |duo||k}|rt||s|r|s |r |r |j6r|rj7|  |  S q|rj7|  |  S |r"|j6r"|r"|rj7|  |  S |rE|j6rE|du rE|durE||j3krE|rAj7|  |  S qqU))zThis method simplify socket exchange in/out based on what the protocol state machine orders.
        Can be used for the initial handshake for instance.N
next_timerrk   r   c                    sd   g } 	   }|sn| | q r#t| dkr#| I d H  d S | D ]
}|I d H  q%d S )NTr7   )rR  r8  r   rS  )tbsrY  chunkis_h3r   r   ri   rj   send_pending  s   
z8AsyncHfaceBackend.__exchange_until.<locals>.send_pendingr   r=   FTr]  rJ  eof_receivedexpected_lengthactual_length)partialexpectedgffffff?g333333?r]  
end_streamc                 s  r   rs   )r   r   r   r!  ri   ri   rj   r   ,  r   z5AsyncHfaceBackend.__exchange_until.<locals>.<genexpr>z-Remote end closed connection without responsei  r?  i*  zQTLS over QUIC did not succeed (Error 298). Chain certificate verification failed.z%without sending complete message bodyz=peer closed connection without sending complete message body  z()c                 s  s,    | ]}t d dd |D  V  qdS )rr  c                 s  s    | ]	}|  r|V  qd S rs   )isdigit)r   cri   ri   rj   r   M  s    z?AsyncHfaceBackend.__exchange_until.<locals>.<genexpr>.<genexpr>N)rM   r   strip)r   r  ri   ri   rj   r   L  s
    
z,    i  z8The remote server is unable to serve this resource over zStream z# was reset by remote peer. Reason: .rk   r   )8r   rY   rL   rZ   r2   rU   r   rQ  rU  rc  r/   rL  rM  r  r  r   r   tupletimer_firedr   rj  r(   rN  rO  r   rP  r%   rl  rk  _recv_size_emarA  r   r   
error_coder   r8  r   anyrG  r&   r*   replaceru  r   r   
IndexErrorr    r   r   r@   r'   r]  hexr   rp  reshelve)rf   r^  r   r/  r0  r[  r\  r]  rL   _has_next_timer
_proto_excrh  data_in_lenrA  reshelve_eventsreach_socketrc  subdata_inr!  udp_gro_segmentincoming_buffer_sizerC  stream_related_eventr   receivedrn  target_cap_reachedri   rf  rj   __exchange_untilj  s  
(


























 z"AsyncHfaceBackend.__exchange_untilmethodurl	skip_hostskip_accept_encodingc           	      C  s$  g | _ d| _d| _d| _d| _d| _tjtj	d| _
| jdur'| j| j}}n| j| j}}|drFt|}|j|krF|j|jpC| j}}d|dfg| _ |ss|d}| j d|| jksc|du re|n|d	|   f d
| _| j d| jdfd|dfg |s| j d dS dS )zNInternally fhace translate this into what putrequest does. e.g. initial trame.NFr   r$  r*  r-  idnar,  r   Ts   :schemes   :path)s   accept-encodings   identity)r\   r]   r^   r`   r_   ra   r   r  r   r  _start_last_requestr   r'  rE   rG   
startswithr-   default_portr   r8  extendr}   )	rf   r  r  r  r  rE   rG   
parsed_urlr   ri   ri   rj   
putrequest  sL   





zAsyncHfaceBackend.putrequestr?  valuesc           
      G  s  |  }t|tr|dn|}| jtjk}|s|tv rd S | jd u rB|dkrBz	t	|d | _W nE t
yA   td|d  dw | jd u rv|dkrvt|d tr\|d d| _d S t|d trj|d | _d S t|d d| _d S |D ]_}t|tr|d}nt|tr|}nt|d}|d	r|d
krd| _d }| jD ]\}}	|d	s n||kr||	f} nq|d ur| j| | jd||f qx| j||f qxd S )Nr-  s   content-lengthr   z#Invalid content-length set. Given 'z' when only digits are allowed.s   hostr  r.     :s	   :protocolT)r9  r   rF   r   rZ   r2   r   r   r]   rM   r   r(   r`   r  r  ra   r\   removeinsertr8  )
rf   r?  r  encoded_headersupport_te_chunkedr@  encoded_valueitem_to_remove_k_vri   ri   rj   	putheader  sl   




zAsyncHfaceBackend.putheader)encode_chunkedexpect_body_afterwardmessage_bodybytes | Noner  r  ResponsePromise | Nonec             
     sF  | j d u r|  I d H  | jd u r|  I d H  | j d ur#| jd us%J | j | _| o1| j }| jd urid }| jD ]\}}|dkrJ||f} n|	dsQ nq<|d ur\| j
| | jdd| jf d| _| jsptdz| jj| j| j|d W n | j y } zt||d }~ww z7g }		 | j }
|
sn|	|
 q| jtju rt|	dkr| j |	I d H  n|	D ]}| j |I d H  qW n% ty } zt| | j| j}|| j|j< || j|j< ||_|d }~ww t | _ |s!| j!r| j"rt#j$t%j&d| j! | j"_'t| | j| j}|| j|j< || j|j< |S d S )	Nr,  r  r   T)zOurllib3.future do not support emitting HTTP requests without the `Host` header zKIt was only permitted in HTTP/1.0 and prior. This client support HTTP/1.1+.ro  r7   r   )(r   connectrY   r#  r6  r[   ra   r`   r\   r  r  r  r_   r(   r:  rQ  rR  r8  rZ   r2   rU   r   rS  BrokenPipeErrorr4   	_promisesuid_promises_per_streamr]  promiser  r  rT  r  r   r   r  r   r  request_sent_latency)rf   r  r  r  should_end_streamexisting_authoritycursor_headercursor_valuer!  rd  bufre  rpri   ri   rj   
endheaders+  s   








zAsyncHfaceBackend.endheaders_AsyncHfaceBackend__bufr  _AsyncHfaceBackend__stream_id _AsyncHfaceBackend__close_streamc              	     sX   j d usJ  jd usJ t j d}d fdd} j |t|du r|r. j  nd }t j||}|4 I d H   j jI d H }W d   I d H  n1 I d H sXw   Y  |j	raqt
|trr|D ]}	 j |	 qhn j | | I d H   j |t|du s' j j|||d 	  j  }
|
sn
 j|
I d H  qt  _d S )	Nrc  rk   r   c                    *   	  j  } | sd S  j| I d H  qrs   rY   rR  r   rS  rY  rp   ri   rj   rh       
z2AsyncHfaceBackend.__write_st.<locals>.send_pendingTro  rx  )rY   r   r   should_wait_remote_flow_controlr   rc  r/   rL  rL   rz  r   rO  rP  submit_datarR  rS  r  r  rT  )rf   r  r  r  r  rh  rc  r  r  rX  rY  ri   rp   rj   
__write_st  sH   (

zAsyncHfaceBackend.__write_stc                   s   | j dusJ | jdusJ | j j|d 	 | j  }|sn
| j|I dH  qz| j|= W n	 ty8   Y nw | j  rE|  I dH  t	
 | _dS )zKill a stream properly.Nri  )rY   r   submit_stream_resetrR  rS  _pending_responsesKeyErrorro   r   r  r  rT  )rf   r  rY  ri   ri   rj   
__abort_st  s$   

zAsyncHfaceBackend.__abort_st_AsyncHfaceBackend__amt&_AsyncHfaceBackend__respect_end_signal#_AsyncHfaceBackend__dummy_operation/tuple[list[bytes], bool, HTTPHeaderDict | None]c              	     s  |r.z| j |= W n	 ty   Y nw | jdur)| j r)| j r)|  I dH  g ddfS d}| jtdttf|dd ||dI dH }t	
 | _|r|d jrd}z| j |= W n	 ty`   Y nw | jdur| j rx| j rx|  I dH  n
| jr|  I dH  d}|rd}t|d trd}nt|dkrt|d	 trd	}|durt }|| jD ]\}	}
|	d
 dkrq||	d|
d q|| |sg d|fS dd |D ||fS )af  Allows us to defer the body loading after constructing the response object.

        Returns the body as a list of per-frame chunks (not concatenated):
        the caller feeds them straight into its ``BytesQueueBuffer`` so
        contiguity is produced lazily and, for frame-aligned reads,
        zero-copy. Joining here would defeat that buffer.
        NTFc                 S  s
   t | jS rs   )r   data)xri   ri   rj   <lambda>  s   
 z-AsyncHfaceBackend.__read_st.<locals>.<lambda>)r   r/  r[  r\  r]  r0  r=   r0   r   :   r-  r.  c                 S  s   g | ]}|j qS ri   )r  rq  ri   ri   rj   
<listcomp>4  s    z/AsyncHfaceBackend.__read_st.<locals>.<listcomp>)r  r  rY   is_idlero   r   r  r   r   r  r  rT  rp  r   r   r   r   r%  rT   r;  pop)rf   r  r  r  r  eotrA  trailersidxrD  rE  ri   ri   rj   	__read_st  st   





zAsyncHfaceBackend.__read_str  early_response_callbackr  r  Gtyping.Callable[[AsyncLowLevelResponse], typing.Awaitable[None]] | Noner:   c                  s  | j d u s| jd u s| jst t }d }| js| j}n|r"|jnd }| jt	t
fdt	t
fd|dI d H  }t | _|jD ]#\}}|d u rV|d dkrV|dkrUt|}q?||d|d q?t|t
ok|d	k}	|d u rz|	rz| j|j }n| j|j}W n ty }
 z
td
|j d|
d }
~
ww |	s| j|j= |d u rtd|j}d}|jD ]\}}|dkr|} nq|d	ks|dkrd|  krdk rn n
t|j| j| j}nd }zt| }W n ty   d}Y nw |	r |d urt|d|| j||d | j| j |jd	}||_!||I d H  t"j#| ||dI d H S t|d|| j|||s5|d u r5| jnd | j| j |j|| j$d| _%| j%|_&|| j%_!| j|j'= |rq| j( rc| ) I d H  | j%S | j*rn| + I d H  | j%S | j%| j,|j< | j%S )NTF)r   r/  r0  r]  r   r  r1  r-  r.  e   zResponse received (stream: z) but no promise in-flightz@Got an HTTP response without a status code. This is a violation.rJ  r*  r+  r2  r3  r4  )bodyr   rG   r]  r  )r   rG   r]  dsastream_abort)-r   rY   r  r)   r   ru   r[   r]  r  r   r   r  r  r  rT  r%  rM   rT   r;  r   r  r  r(   rp  request_headersr9   _AsyncHfaceBackend__read_st_AsyncHfaceBackend__write_str   r:   	_http_vsnrE   rG   from_promiser<   getresponse_AsyncHfaceBackend__abort_str   responser  ro   r   r  r   r  )rf   r  r  r%  rB  r]  
head_eventrD  rE  is_early_responser!  r  	http_verbr  reasonearly_responseri   ri   rj   r  9  s   	


(

zAsyncHfaceBackend.getresponse)r  r  bytes | bytearrayr  c             
     s   j du s jdu s jdu rtd jdu r" jdur" j _t jd}d fdd}z, j jt|du r|rD j	 nd}t
 j ||}|4 I dH   j  jI dH }W d  I dH  n1 I dH snw   Y  |jrwq1t|ts j| n|D ]} j| q jj jtfd	rÈ jr jrtjtjd
 j  j_t  j j}	|	 j|	j< |	 j|	j< t |	d| I dH   j jt|du s= jr  jt|8  _ jj! j||d t"rt#$d | d}
	  j% }|sn"z j &|I dH  W n t'y } z|}
W Y d}~nd}~ww q|s'|
rZ jr; jr;tjtjd
 j  j_t  j j}	|	 j|	j< |	 j|	j< |
rW|	|
_(|
|	W S W dS   j) yq } zt*||d}~ww )z4We might be receiving a chunk constructed downstreamNz,Trying to send data from a closed connectionrc  rk   r   c                    r  rs   r  r  rp   ri   rj   rh    r  z,AsyncHfaceBackend.send.<locals>.send_pendingT)r]  
excl_eventr   )r  ro  zhttp.client.sendrx  )+r   r[   rY   r   r^   r]   r   r  r   rc  r/   rL  rL   rz  r   rO  rP  rU  r   r  r   r   r  r   r  r  r4   r\   r  r  r  r]  r$   r  r6   sysauditrR  rS  r  r  rQ  r(   )rf   r  r  r  rh  rc  r  r  rX  r  remote_pipe_shutdownrY  r!  ri   rp   rj   send  s   


(


$
zAsyncHfaceBackend.sendc              	     s   | j du s| jdu rdS | j rdS z| j  W n ty%   Y dS  | j y1   Y dS w 	 | j }|s;nz| j |I dH  W n tt	j
fyR   Y nw q3t | _dS )z8Send a ping frame if possible. Otherwise, fail silently.N)r   rY   ro   pingrw   rQ  rR  rS  r<  r	   r*   r  r  rT  )rf   
ping_frameri   ri   rj   r  ?  s4   


zAsyncHfaceBackend.pingc              
     s"  | j r`| jd urGz| j  W n | j y$ } zt||d }~ww 	 | j }|s.nz| j |I d H  W n ttj	fyE   Y nw q&z| j 
  | j  I d H  W n	 ty_   Y nw d | _d | _i | _i | _i | _d | _d | _d | _d | _d | _d | _d | _t | _d| _d | _d S )NTg        )r   rY   submit_closerQ  r(   rR  rS  r<  r	   SSLEOFErrorr   wait_for_closer[   r  r  r  rb   r   r]   r^   r  _cached_http_vsnr  r  r  rT  r{  r   )rf   r!  goodbye_frameri   ri   rj   r   ^  sV   






zAsyncHfaceBackend.close)rE   rF   rG   rH   r   rI   rJ   rK   rL   rM   r?   rN   r@   rO   rA   rP   rB   rQ   rC   rI   rD   rI   )rk   rl   )rk   rM   )rk   ry   rx  )NNNNNNNNNNNN)r   r   r   r   r   r   r   r   r   rH   r   rH   r   r   r   r   r   r   r   r   r   r   r   r   rk   rl   )rU   )r   rF   rk   rK   )NNr$  )
rE   rF   rG   rH   r%  r&  r}   rF   rk   r   )F)rI  rl   rk   rl   )r^  r_  r   rl   r/  r`  r0  rl   r[  rH   r\  ra  r]  rH   rk   rb  )FF)
r  rF   r  rF   r  rl   r  rl   rk   r   )r?  rF   r  rF   rk   r   rs   )r  r  r  rl   r  rl   rk   r  )r  r  r  rM   r  rl   rk   r   )r  rM   rk   r   )TF)
r  rH   r  rH   r  rl   r  rl   rk   r  )r  r  r  r  rk   r:   )r  r  r  rl   rk   r  )(__name__
__module____qualname__r2   r   r   rU   supported_svnr   r8   default_socket_optionsr   r   r   rW   propertyrq   rr   ru   rv   r   r   r   r   r#  r)  rH  rZ  r  r  r  r  r  r  r  r  r  r  r   __classcell__ri   ri   rg   rj   r<   D   s    	;	

.Z}
  
>=  <
BK`
3e 
sr<   )M
__future__r   r  r  typingr   r   socketr   r   r   r  contrib.anytlsr	   r
   _collectionsr   	_constantr   r   r   r   r   r   r   contrib.hfacer   r   r   r   r   r   r   contrib.hface.eventsr   r   r   r   r   r   r    contrib.ssar!   r"   r#   rQ  r$   r%   r&   r'   r(   r)   r*   utilr+   r,   r-   util.socket_stater.   util.sub_timeoutr/   _baser1   r2   r3   r4   hfacer5   r6   r8   r9   r:   TYPE_CHECKING_typingr;   rR   r<   ri   ri   ri   rj   <module>   s0    $$	$		$	