o
    .jA                    @  s  d dl m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	 d dlm
Z
mZ d dlmZ ddlmZmZ edurEdd	lmZ nd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/m0Z0m1Z1m2Z2m3Z3 ddl4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z; ddl<m=Z=m>Z>m?Z? ddl@mAZA ddlBmCZC ddlDmEZEmFZFmGZGmHZHmIZImJZJmKZK ejLrddlMmNZN eOedZPe	dddddZQG dd deEZRdS )    )annotationsN)datetimetimezone)	lru_cache)
SOCK_DGRAMSOCK_STREAM)timeout   )sslCertificate)SSLTransport)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) GenericSegmentOffloadUnsupported_sock_has_gro_sock_has_gsosync_recv_grosync_send_dgramsync_sendmsg_gso)EarlyResponseIncompleteReadInvalidHeaderMustDowngradeErrorProtocolErrorResponseNotReadySSLError)parse_alt_svcresolve_cert_reqs	parse_url)enable_keepalive)
SubTimeout   )BaseBackendConnectionInfoDirectStreamAccessHttpVersionLowLevelResponseQuicPreemptiveCacheTypeResponsePromise)_TYPE_SOCKET_OPTIONSaudit)maxsizereturnboolc               
   C  sJ   ddl m}  | r
dS dd l}z	|jdd uW S  tttfy$   Y dS w )Nr	   )IS_FIPSFr   qh3)	util.ssl_rB   importlib.utilutil	find_specImportErrorModuleNotFoundError
ValueError)rB   	importlib rL   J/home/thesage/.local/lib/python3.10/site-packages/urllib3/backend/hface.py_HAS_HTTP3_SUPPORTS   s   rN   c                      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 )HfaceBackendN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intrR   _TYPE_SOCKET_OPTIONS | NonerS   set[HttpVersion] | NonerT   QuicPreemptiveCacheType | NonerU   float | int | NonerV   rW   c                  s   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| _d| _d S )NrQ   F)rN   setaddr9   h3super__init___proxy_protocol	_protocol_svn
_stream_id_HfaceBackend__headers#_HfaceBackend__expected_body_length$_HfaceBackend__remaining_body_length _HfaceBackend__authority_bit_set _HfaceBackend__legacy_host_entry_HfaceBackend__protocol_bit_set"_HfaceBackend__custom_tls_settings_HfaceBackend__alt_authority_HfaceBackend__origin_port _max_tolerable_delay_for_upgrade_dgram_gro_enabled_dgram_gso_enabled)selfrX   rZ   r   r]   r_   rR   rS   rT   rU   rV   rW   	__class__rL   rM   ri   e   sB   
zHfaceBackend.__init__r@   rA   c                 C  s(   | j d u rdS | j  s| j   S dS NF)rk   is_availablehas_expiredrz   rL   rL   rM   is_saturated   s
   

zHfaceBackend.is_saturatedc                 C  s   | j d uo| j jS N)rk   multiplexedr   rL   rL   rM   is_multiplexed   s   zHfaceBackend.is_multiplexedc                 C  s   | j d u rdS | j  S r}   )rk   expect_pongr   rL   rL   rM   r      s   

zHfaceBackend.expect_pongc                 C  sL   | j d u r| jS z| j  }W n ty   | j Y S w | j|kr#|S | jS r   )rk   r_   max_frame_sizeNotImplementedError)rz   remote_max_sizerL   rL   rM   r      s   

zHfaceBackend.max_frame_sizesocket.socket | Nonec                 C  s   | j d u rUtj| jvrU| jdkrU| jr6| j| jf| jv r6| j| j| jp$df | _| jr5tj| _ | jd | _ntj	| jv rUtj
| jv rU| j| jpHdf| _tj| _ | jd | _| j tjkr| jtkrct| _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  r5   )rl   r9   rg   _disabled_svnscheme_preemptive_quic_cacherX   rZ   ru   h11h2r_   r   r   r   socket_kind	_response	authorityr   r   rL   rL   rM   	_new_conn   sB   




zHfaceBackend._new_connNonec                 C  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j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| _| jd | _|   d S d S )	Nz<attempt to call _upgrade() prior to successful getresponse()h2c)svcrg   r   g      ?r   r5   )r   sockrl   ru   rN   typesocketr9   rg   r   r   _HfaceBackend__altsvc_probe	conn_infoestablished_latencytotal_secondsrw   tls_handshake_latencymaxr   rX   rZ   rv   close)rz   has_h3_supportis_plain_socketis_h3_disabledis_h2_disabledupgradable_svnrL   rL   rM   _upgrade   sh   






zHfaceBackend._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}d}|dur;z| }d|v o+|d dk}W n ttfy:   d}Y nw |s]|du r]|du r]|du r]|s]t	tj
}t|dr[|  nd}|rt|ddpfd}|jtjkrod}|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pd| 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 r   )r
   DER_cert_to_PEM_cert).0certrL   rL   rM   	<genexpr>  s    

z+HfaceBackend._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)!rl   r9   rg   r1   r
   	CERT_NONEcert_store_statsAttributeErrorr   
SSLContextPROTOCOL_TLS_CLIENThasattrr   getattrverify_modeget_ca_certsjoinr   http_header_for_fingerprintrJ   r   setattrr   r   
isinstancerY   encoderA   _keepalive_delay_ech_configrt   r   is_verified)rz   r   r   r   r   r   r   r   r   r   r   r   r   r   allow_insecuressl_ctx_have_certs
cert_statsctx_root_certificatesrL   rL   rM   _custom_tlsJ  s   







zHfaceBackend._custom_tlsrg   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getlistr0   splitrX   r`   rJ   )rz   r   alt_svcprotocolalt_authorityserverrZ   rL   rL   rM   __altsvc_probe  s   zHfaceBackend.__altsvc_probec                 C  s  | 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jtf}|rt| jtjr:| j n| jj	 }|d urj|dkrSt
t| _tj| _n|dkrbt
t| _tj| _ntd| dtj| jvr{t
t| _tj| _ntj| jvrt
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_| jjt krt!| j| _"t#| j| _$nd
| _"d
| _$t%| dr7| j&r7| j&d | j_'| j&d | j_(| jtjurd }t%| jdsNt%| jdrt)| jdt)| jdd }t%|drh|j*dk| j_+nt%|dru|, | j_+nd
| j_+| jj-dd| j_.z| jj-d
d| j_/W n t0y   d | j_/Y nw d | j_1|2 }t%|dr|3 }t4|}	t5d urt6dd |D nd
}
|
r| jj/s|	r|d 7 | j_/|	dkr |d 8 }t|t9r|| j_:nt%tdrt;|| j_:|d 7 | j_<n|	dkr| jj:s|d | j_:nt%| jdr| jj-dd| j_.z| jj-d
d| j_/W n t0y;   d | j_/Y nw t%| jdrH| j2 nd }t%| jdrt%| jj=dr| jj=3 }| jj/so|ro|d 7 | j_/t4|dkrt5d urt|d t5r|d 8 }t|t9r|| j_:nt%tdrt;|| j_:|d 7 | j_<|r|d | j_2|d dkrtj>j?| j_@n.|d dkrtj>jA| j_@n |d dkrtj>jB| j_@n|d dkrtj>jC| j_@nd | j_@| jj1d u rt%| jdr| jD d d  | j_1| jd u s| jtjkrt| jd u r,tj| jv r,t
t| _tj| _nt
t| _tj| _| jErK| jFrKtG| jt| jFt| jE | j| j_| jj.rmt%| drm| j&rmtHjItJjKd!| j&d"  | j_LtMN | _Od S | jPd ur| jQ| jP z	| jRtSd
d# W nX ttTtUtVtWfy } zF| jd ur| jtjkr| jXd ur| j| jYpd$f}|| jXv r| jX|= d | _tj| jZvstj| jZvrt[d%| j d&| j d'| d }~ww tMN | _O| jPd ur| jQ| j\ d | _Pt| jt]rB| jj-dd| j_.| jj-d
d| j_/| jD d d  | j_1| j2 | j_2| j, | j_+tj>jC| j_@| jj^d
d| j_<| jj^dd| j_:| jj.rft%| drh| jjLsj| j&rltHjItJjKd!| j&d"  | j_Ld S d 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_configF_connect_timingsr   r5   sslobj_sslobj
ech_statusacceptedech_acceptedT)binary_formget_verified_chainc                 s      | ]}t |tV  qd S r   )r   r   )r   crtrL   rL   rM   r   e      z*HfaceBackend._post_conn.<locals>.<genexpr>PEM_cert_to_DER_certgetpeercertcipherzTLSv1.0zTLSv1.1zTLSv1.2zTLSv1.3getpeernamer	   tzrP   )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.)__tunnel_hostrl   rk   r   r   r
   	SSLSocketr   selected_alpn_protocolr   r   newr   r9   r   r   r   r-   r   RuntimeErrorrg   rt   ru   rX   rZ   r   r   r`   r7   r   http_versionr   r   r$   rx   r%   ry   r   r   resolution_latencyr   r   r   tls_ech_acceptedr   r   certificate_dercertificate_dictrJ   destination_addressr   r   lenr   allget_infopublic_bytesbytesissuer_certificate_derr   issuer_certificate_dictr   
TLSVersionTLSv1tls_versionTLSv1_1TLSv1_2TLSv1_3r   _background_watch_delay_keepalive_idle_windowr3   r   nowr   utcr   time	monotonic_connected_atrw   
settimeout_HfaceBackend__exchange_untilr    TimeoutErrorSocketTimeoutConnectionRefusedErrorConnectionResetErrorr   rv   rS   r,   r   r   getissuercert)rz   is_tcp_tls_connalpn_rZ   r   cipher_tupler   chaincert_in_chain_countparsed_certsissuer_public_bytesealt_keyrL   rL   rM   
_post_conn  s  
























!




zHfaceBackend._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  r9   rg   r   rf   r  _tunnel_port_tunnel_headers)rz   rX   rZ   r6  r   rL   rL   rM   
set_tunnel'  s   

zHfaceBackend.set_tunnelc                 C  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 qA| j | j	|d | jtdtfdd	}d }|D ]}t|tr|jD ]\}}|d
krt| } nquqk|d uod|  kodk n  }	|	s|   |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:  )rk   r   r  r8  rl   r9   r   r   get_available_stream_idrm   r   r9  itemsappendlowersubmit_headersr$  r!   r   r6  r`   decoder   r   OSError_protocol_factory)rz   req_contextheadervalueeventsstatusevent
raw_header	raw_valuetunnel_acceptedmessagerL   rL   rM   _tunnel@  sZ   
 
zHfaceBackend._tunnelFexpect_framec              
   C  sp  | j du s
| jdu rdS | j  }| j |sdnd z>z| jr(t| j | j}n| j | j}W n! tt	t
jfyE   Y W | j | dS  ttfyQ   d}Y nw W | j | n| j | w |sj| j  dS zt|tr||D ]}| j| qrn| j| W n | j y   Y dS w 	 | j }|snz| j | 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 send regular unsolicited data and expect regular ACKs, otherwise will
        deduct that network conn is dead.
        see: https://github.com/google/quiche/commit/c4bb0723f0a03e135bc9328b59a39382761f3de6
        and: https://github.com/google/quiche/blob/92b45f743288ea2f43ae8cdc4a783ef252e41d93/quiche/quic/core/quic_connection.cc#L6322
        NFgMbP?g?    )r   rk   
gettimeoutr#  rx   r&   r_   recvrM  r%  r   r   ConnectionAbortedErrorr(  connection_lostr   listbytes_received
exceptionsbytes_to_sendsendallr   r!  _last_used_athas_pending_event)rz   rZ  bck_timeout	peek_datagro_segmentdata_outrL   rL   rM   peek_and_react~  sT   





zHfaceBackend.peek_and_reactT)r  r@  rA  maximal_data_in_readdata_in_len_from	stream_id
event_type%type[Event] | tuple[type[Event], ...]r  r@  ,type[Event] | tuple[type[Event], ...] | NonerA  rl  rm  $typing.Callable[[Event], int] | Nonern  list[Event]c                  s  j dur
jdusJ jj j j}j}	jtju td}
	 }d( fdd}|durC|dksC|dksCd}d}g }g }|dkrO|S |r[|dk r[d	}d}d}	 d	}j
|ds|sj|  |
rp nd}t||}z!| |rt|	}n|	}W d   n1 sw   Y  W nN tttfy } zt|tr|tu st|trt|v r|d}W Y d}~n(d}~w ty } zjtju r|tu st|trt|v rt | d}~ww |jrq[d
}|s|sjdurtdrz  W n |y } zt||d}~ww   nt|trc|D ]<}|du r2|t|7 }z | W q% |ya } zt|drXt|drXt!|j"|j#d|t||d}~ww n:|du rn|t|7 }z | W n' |y } zt|drt|drt!|j"|j#d|t||d}~ww |r|  j$|dD ]}t|d}|st|t%rd_&  |j'dkr|dur|t(u st|trt(|v rd_&  |)t(|dd
d |  S |r|dkrt|trt*|v s	|t*u rt+dd |D std|j'dkr,|j,r,d|j,v r,t-|j,|j'dkrOjtjkrO|j,rKd|j,v rKt.d|j, t.dz,|j,rzd|j,v rz|j,/dd0d}d d t|1d!D \}}t!||| dW n t2t3fy   Y nw t|j,|rt|t4rΈjtj5kr|j'd"ksjtjkr|j'd#krtj6j7vrt8d$j td%|j9 d&t:|j' d'|s|)| n)t||r|)| |durz|||7 }W n t;y   Y nw n|)| |duo||k}|rt||s|r<|s0|r0|r0|j<r.|r*j=|  |  S q|r8j=|  |  S |rR|j<rR|rR|rNj=|  |  S |ru|j<ru|du ru|duru||j9kru|rqj=|  |  S qq\))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_timerr@   r   c                    s    rGg } 	   }|sn| | qt| dkr:zt|  W d S  ty9   d _ | D ]}t| q.Y d S w | rEt| d  d S d S 	   }|sPd S rXt| n| qH)NTr5   Fr   )rc  rI  r  r(   r#   ry   r'   rd  )tbsrj  dgramgso_enabledis_quicr   rz   r   rL   rM   send_pending  s8   


z3HfaceBackend.__exchange_until.<locals>.send_pendingr   rP   FTrn  r[  eof_receivedexpected_lengthactual_length)partialexpectedrn  
end_streamc                 s  r   r   )r   r!   r   r2  rL   rL   rM   r     r   z0HfaceBackend.__exchange_until.<locals>.<genexpr>z-Remote end closed connection without responsei  rP  i*  FingerprintzTLS over QUIC did not succeed. zfTLS over QUIC did not succeed. Chain certificate verification failed or client cert validation 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 )r  c                 s  s    | ]	}|  r|V  qd S r   )isdigit)r   crL   rL   rM   r     s    z:HfaceBackend.__exchange_until.<locals>.<genexpr>.<genexpr>N)r`   r   strip)r   r,  rL   rL   rM   r     s
    
z,    i  z8The remote server is unable to serve this resource over zStream z# was reset by remote peer. Reason: .r@   r   )>r   rk   ry   rx   r_   rl   r9   rg   r   rb  rf  rt  r4   r&   r]  r^  r(  r'  r   r    tuplerM  r   r   r   timer_firedr   r|  r-   r_  r`  r  ra  r*   r~  r}  rR  r   r   
error_coder   rI  r!   anyrX  r+   r/   replacer  r   rJ   
IndexErrorr"   r   r   rS   r,   rn  hexr   r  reshelve)rz   ro  r  r@  rA  rl  rm  rn  gro_enabledr_   _has_next_timer
_proto_excrz  data_in_lenrR  reshelve_eventsreach_socketrt  subdata_inr2  udp_gro_segmentrT  stream_related_eventr   receivedr  target_cap_reachedrL   rw  rM   __exchange_until  s  






























  zHfaceBackend.__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  r5  r;  r>  idnar=  r   Ts   :schemes   :path)s   accept-encodings   identity)rn   ro   rp   rr   rq   rs   r   r  r   r  _start_last_requestr  r8  rX   rZ   
startswithr2   default_portr   rI  extendr   )	rz   r  r  r  r  rX   rZ   
parsed_urlr   rL   rL   rM   
putrequest  sL   





zHfaceBackend.putrequestrP  valuesc           
      G  s  |  }t|tr|dn|}| jtju p| jd u }|s#|tv r#d S | jd u rG|dkrGz	t	|d | _W nE t
yF   td|d  dw | jd u r{|dkr{t|d tra|d d| _d S t|d tro|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 q}| j||f q}d S )Nr>  s   content-lengthr   z#Invalid content-length set. Given 'z' when only digits are allowed.s   hostr  r?     :s	   :protocolT)rJ  r   rY   r   rl   r9   r   r   ro   r`   rJ   r-   rr   r  r  rs   rn   removeinsertrI  )
rz   rP  r  encoded_headersupport_te_chunkedrQ  encoded_valueitem_to_remove_k_vrL   rL   rM   	putheaderV  sl   




zHfaceBackend.putheader)encode_chunkedexpect_body_afterwardmessage_bodybytes | Noner  r  ResponsePromise | Nonec             
   C  s  | j d u r	|   | jd u r|   | j d ur| jd usJ | j | _| o*| j }| jd urbd }| jD ]\}}|dkrC||f} n|	dsJ nq5|d urU| j
| | jdd| jf d| _| jsitdz| jj| j| j|d W n | j y } zt||d }~ww zf| jrg }		 | j }
|
sn|	|
 qt|	dkrzt| j |	 W nA ty   d| _|	D ]}t| j | qY n+w |	rt| j |	d	  n| jtju }	 | j }
|
sn|rt| j |
 n| j |
 qW n& ty } zt| | j| j}|| j|j< || j|j < ||_!|d }~ww t"# | _$|sJ| j%r4| j&r4t'j(t)j*d
| j% | j&_+t| | j| j}|| j|j< || j|j < |S d S )Nr=  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+.r  r5   Fr   r  ),r   connectrk   r4  rG  rm   rs   rr   rn   r  r  r  rq   r-   rK  rb  ry   rc  rI  r  r(   r#   r'   rl   r9   rg   rd  BrokenPipeErrorr<   	_promisesuid_promises_per_streamrn  promiser   r!  re  r  r   r   r  r   r  request_sent_latency)rz   r  r  r  should_end_streamexisting_authoritycursor_headercursor_valuer2  ru  bufrv  ry  rprL   rL   rM   
endheaders  s   









zHfaceBackend.endheaders_HfaceBackend__bufr  _HfaceBackend__stream_id_HfaceBackend__close_streamc                   sF   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||}|  jrDt j j	}n j
 j	}W d    n1 sUw   Y  |jr^qt|tro|D ]}	 j |	 qen j | |   j |t|du s& j j|||d 	  j  }
|
sn j|
 qt  _d S )	Nrt  r@   r   c                    "   	  j  } | s
d S  j|  qr   rk   rc  r   rd  rj  r   rL   rM   rz       
z-HfaceBackend.__write_st.<locals>.send_pendingTr  r  )rk   r   r   should_wait_remote_flow_controlr  rt  r4   rx   r&   r_   r]  r  r   r`  ra  submit_datarc  rd  r   r!  re  )rz   r  r  r  r  rz  rt  r  r  ri  rj  rL   r   rM   
__write_st  sL   

zHfaceBackend.__write_stc                 C  s   | j dusJ | jdusJ | j j|d 	 | j  }|sn| j| qz| j|= W n	 ty4   Y nw | j  r>|   t	
 | _dS )zKill a stream properly.Nr{  )rk   r   submit_stream_resetrc  rd  _pending_responsesKeyErrorr   r   r   r!  re  )rz   r  rj  rL   rL   rM   
__abort_stA  s"   

zHfaceBackend.__abort_st_HfaceBackend__amt!_HfaceBackend__respect_end_signal_HfaceBackend__dummy_operation/tuple[list[bytes], bool, HTTPHeaderDict | None]c              	   C  s  |r*z| j |= W n	 ty   Y nw | jdur%| j r%| j r%|   g ddfS d}| jtdttf|dd ||d}t	
 | _|ru|d jrud}z| j |= W n	 tyY   Y nw | jduru| j rn| j rn|   n| jru|   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 r   )r  data)xrL   rL   rM   <lambda>  s   
 z(HfaceBackend.__read_st.<locals>.<lambda>)r  r@  rl  rm  rn  rA  rP   r	   r   :   r>  r?  c                 S  s   g | ]}|j qS rL   )r  r  rL   rL   rM   
<listcomp>  s    z*HfaceBackend.__read_st.<locals>.<listcomp>)r  r  rk   is_idler   r   r$  r   r!   r   r!  re  r  r   r   r  r   r6  rf   rL  pop)rz   r  r  r  r  eotrR  trailersidxrU  rV  rL   rL   rM   	__read_st[  sn   







zHfaceBackend.__read_str  early_response_callbackr  r  0typing.Callable[[LowLevelResponse], None] | Noner:   c                C  s  | j d u s| jd u s| jst | js| j}n|r|jnd }| jtt	fdtt	fd|d
 }t | _t }d }|jD ]#\}}|d u rR|d dkrR|dkrQt|}q;||d|d q;|d u rgtd	t|t	oo|d
k}	|d u rz|	r~| j|j }n| j
|j}W n ty }
 z
td|j d|
d }
~
ww |	s| j|j= d}|jD ]\}}|dkr|} nqzt| }W n ty   d}Y nw |	r|d urt|d|| j||d | j| j|jd	}||_|| tj| ||dS |j }|d
ks|dkrd|  kr
dk rn n
t!|j| j"| j#}nd }t|d|| j|||s-|d u r-| j"nd | j| j|j| jdkr=| j nd ||sE| j$nd d| _%| j%|_&|| j%_| j|j'= |rr| j( rg| )  | j%S | j*ro| +  | j%S | j%| j,|j< | j%S )NTF)r  r@  rA  rn  r   r  rB  r>  r?  z@Got an HTTP response without a status code. This is a violation.e   zResponse received (stream: z) but no promise in-flightr[  r;  rE  )bodyr   rZ   rn  r  r<  rC  rD     )r   rZ   rn  r   dsastream_abort)-r   rk   r  r.   r   rm   rn  r$  r!   r   r  r   r!  re  r   r6  r`   rf   rL  r-   r   r  r  request_headersr   r:   	_http_vsnrX   rZ   from_promiserO   getresponser  r8   _HfaceBackend__read_st_HfaceBackend__write_st_HfaceBackend__abort_str   responser  r   r   r  r   r  )rz   r  r  rn  
head_eventr6  rS  rU  rV  is_early_responser2  	http_verbreasonearly_responser  r  rL   rL   rM   r    s   



0
zHfaceBackend.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|rC j	 nd}t
 j ||}|  jrZt j  j}n j  j}W d   n1 skw   Y  |jrtq0t|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|   j jt|du s< jrۈ  jt|8  _ jj# j||d t$rt%&d | d}
zo j'r<g }	  j( }|sn|)| qt|dkr0zt* j | W nG t+y/   d _'|D ]	}t, j | q#Y n/w |r;t, j |d  n" j-t.j/u }	  j( }|sLn|rVt, j | n j 0| qCW n t1yt } z|}
W Y d}~nd}~ww |s{|
r jr jrtjtjd
 j  j_t  j j}	|	 j|	j< |	 j |	j!< |
r|	|
_2|
|	W S W dS   j3 y } zt4||d}~ww )z4We might be receiving a chunk constructed downstreamNz,Trying to send data from a closed connectionrt  r@   r   c                    r  r   r  r  r   rL   rM   rz  g  r  z'HfaceBackend.send.<locals>.send_pendingT)rn  
excl_eventr  )r  r  zhttp.client.sendr5   Fr   r  )5r   rm   rk   r  rp   ro   r   r  r  rt  r4   rx   r&   r_   r]  r  r   r`  ra  rf  r   r  r   r   r  r   r  r  r<   rn   r  r  r  rn  r)   r  _HAS_SYS_AUDITsysr>   ry   rc  rI  r(   r#   r'   rl   r9   rg   rd  r  r  rb  r-   )rz   r  r  r  rz  rt  r  r  ri  r  remote_pipe_shutdownru  rj  rv  ry  r2  rL   r   rM   sendQ  s   





(



zHfaceBackend.sendc              	   C  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 y0   Y dS w 	 | j }|s:nz| j | W n tt	j
fyN   Y nw q2t | _dS )z8Send a ping frame if possible. Otherwise, fail silently.N)r   rk   r   pingr   rb  rc  rd  rM  r
   r/   r   r!  re  )rz   
ping_framerL   rL   rM   r    s2   


zHfaceBackend.pingc              
   C  s8  | j rh| jd urCz| j  W n | j y# } zt||d }~ww 	 | j }|s-nz| j | W n ttj	fyA   Y nw q%z| j 
d W n ttfyV   Y nw z| j   W n	 tyg   Y nw d | _d | _i | _i | _i | _d | _d | _d | _d | _d | _d | _d | _t | _d| _d| _d | _d S )NTr   F)r   rk   submit_closerb  r-   rc  rd  rM  r
   SSLEOFErrorshutdownr   r   rm   r  r  r  rt   r   ro   rp   r  _cached_http_vsnr"  r   r!  re  rx   ry   r   )rz   r2  goodbye_framerL   rL   rM   r     s^   





zHfaceBackend.close)rX   rY   rZ   r[   r   r\   r]   r^   r_   r`   rR   ra   rS   rb   rT   rc   rU   rd   rV   r\   rW   r\   r@   rA   )r@   r`   )r@   r   r  )NNNNNNNNNNNN)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   )rg   )r   rY   r@   r^   )NNr5  )
rX   rY   rZ   r[   r6  r7  r   rY   r@   r   )F)rZ  rA   r@   rA   )ro  rp  r  rA   r@  rq  rA  rA   rl  r[   rm  rr  rn  r[   r@   rs  )FF)
r  rY   r  rY   r  rA   r  rA   r@   r   )rP  rY   r  rY   r@   r   r   )r  r  r  rA   r  rA   r@   r  )r  r  r  r`   r  rA   r@   r   )r  r`   r@   r   )TF)
r  r[   r  r[   r  rA   r  rA   r@   r  )r  r  r  r  r@   r:   )r  r  r  rA   r@   r  )(__name__
__module____qualname__r9   r   r   rg   supported_svnr   r6   default_socket_optionsr   r   r   ri   propertyr   r   r   r   r   r   r   r   r4  r:  rY  rk  r$  r  r  r  r  r  r  r  r  r  r   __classcell__rL   rL   r{   rM   rO   b   s    	?	

.Z{
  O
>@  a
AKm
6b  
rO   r  )S
__future__r   r   r  r   typingr   r   	functoolsr   r   r   r   r&  contrib.anytlsr
   r   util.ssltransportr   _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.ssa._gror#   r$   r%   r&   r'   r(   rb  r)   r*   r+   r,   r-   r.   r/   rF   r0   r1   r2   util.socket_stater3   util.sub_timeoutr4   _baser6   r7   r8   r9   r:   r;   r<   TYPE_CHECKING_typingr=   r   r   rN   rO   rL   rL   rL   rM   <module>   s:    $$	$	 	$	$

