o
    hS'                     @   s   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	m
Z
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 eeZG d	d
 d
ZdS )    N)SettingCodesSettings   )	BaseEventBaseTCPStreamConcurrencyBackendTimeoutFlag)TimeoutConfigTimeoutTypes)ProtocolError)AsyncRequestAsyncResponse)
get_loggerc                   @   sr  e Zd ZdZ	d'dededejfddZ	d'de	d	e
d
efddZd(ddZd(ddZ	d'de	d	ed
efddZ	d'dedeje d	ed
dfddZ	d'deded	ed
dfddZd'ded	ed
dfddZ	d'ded	ed
ejeejejeef  f fddZ	d'ded	ed
eje fddZ	d'ded	ed
ejjfdd Zded
dfd!d"Ze d
e!fd#d$Z"d
e!fd%d&Z#dS ))HTTP2Connectioni   Nstreambackend
on_releasec                 C   s:   || _ || _|| _tj | _i | _i | _d| _	i | _
d S NF)r   r   r   h2
connectionZH2Connectionh2_stateeventstimeout_flagsinitializedwindow_update_received)selfr   r   r    r   \/var/www/html/magazine_api/magazine_env/lib/python3.10/site-packages/httpx/dispatch/http2.py__init__   s   
zHTTP2Connection.__init__requesttimeoutreturnc           
   	      s   |d u rd nt |}| js|   | ||I d H }g | j|< t | j|< | j | j	|< | j
|| |g}}| jj|g|R  4 I d H  | ||I d H \}}W d   I d H  n1 I d H scw   Y  | ||}tj| j|d}	t|d|||	|dS )N)	stream_idzHTTP/2)status_codehttp_versionheaderscontenton_closer   )r	   r   initiate_connectionsend_headersr   r   r   r   Zcreate_eventr   send_request_datar   Zbackground_managerreceive_response	body_iter	functoolspartialresponse_closedr   )
r   r   r    r"   taskargsr#   r%   r&   r'   r   r   r   send#   s,   
(zHTTP2Connection.sendc                    s   | j  I d H  d S N)r   closer   r   r   r   r4   A   s   zHTTP2Connection.closec                 C   s\   t dtjdtjdtjdid| j_| jjtjjj	= | j
  | j }| j| d| _d S )NTr   d   i   )clientZinitial_values)r   r   ZENABLE_PUSHZMAX_CONCURRENT_STREAMSZMAX_HEADER_LIST_SIZEr   Zlocal_settingsr   settingsZENABLE_CONNECT_PROTOCOLr(   data_to_sendr   Zwrite_no_blockr   )r   r9   r   r   r   r(   D   s   



z#HTTP2Connection.initiate_connectionc              
      s   | j  }d|jdfd|jjdfd|jjdfd|jjdfgdd |jj	D  }t
d| d	|jd
|jjd| | j || | j  }| j||I d H  |S )Ns   :methodasciis
   :authoritys   :schemes   :pathc                 S   s    g | ]\}}|d kr||fqS )s   hostr   ).0kvr   r   r   
<listcomp>i   s     z0HTTP2Connection.send_headers.<locals>.<listcomp>zsend_headers stream_id=z method=z target=z	 headers=)r   Zget_next_available_stream_idmethodencodeurl	authorityscheme	full_pathr%   rawloggerdebugr)   r9   r   write)r   r   r    r"   r%   r9   r   r   r   r)   `   s0   

zHTTP2Connection.send_headersr"   c                    sb   z'|2 z3 d H W }|  |||I d H  q6 | ||I d H  W | j|   d S | j|   w r3   )	send_data
end_streamr   set_read_timeouts)r   r"   r   r    datar   r   r   r*   w   s   "z!HTTP2Connection.send_request_datarL   c                    s   |rP| j |}tt||| j j}|dkr)| j|  I d H  | j|   n#|d | ||d  }}| j || | j 	 }| j
||I d H  |sd S d S )Nr   )r   Zlocal_flow_control_windowminlenZmax_outbound_frame_sizer   waitclearrI   r9   r   rH   )r   r"   rL   r    Zflow_control
chunk_sizechunkr9   r   r   r   rI      s   
zHTTP2Connection.send_datac                    s@   t d|  | j| | j }| j||I d H  d S )Nzend_stream stream_id=)rF   rG   r   rJ   r9   r   rH   )r   r"   r    r9   r   r   r   rJ      s
   
zHTTP2Connection.end_streamc                    s   	 |  ||I dH }| j|   t|tjjrnqd}g }|jD ]\}}|dkr4t|j	ddd}q"|
ds@|||f q"||fS )	zH
        Read the response status and headers from the network.
        TN   s   :statusr:   ignore)errors   :)receive_eventr   rK   
isinstancer   r   ZResponseReceivedr%   intdecode
startswithappend)r   r"   r    eventr#   r%   r<   r=   r   r   r   r+      s    
z HTTP2Connection.receive_responsec                 C  sZ   	 |  ||I d H }t|tjjr| j|j| |jV  nt|tjj	tjj
fr,d S qr3   )rW   rX   r   r   ZDataReceivedr   Zacknowledge_received_dataZflow_controlled_lengthrL   ZStreamEndedZStreamReset)r   r"   r    r]   r   r   r   r,      s   
zHTTP2Connection.body_iterc           
   	      s  | j | s| j| }| jj| j||dI d H }| j|}|D ]R}t|dd}t	d| d| t
|dr<t|t|tj jrg|dkrT| j D ]}|  qLnz	| j|   W n	 tyf   Y nw |rr| j |j | q | j }	| j|	|I d H  | j | r| j | dS )N)flagr"   r   zreceive_event stream_id=z event=Z
error_code)r   r   r   readREAD_NUM_BYTESr   Zreceive_datagetattrrF   rG   hasattrr   rX   r   ZWindowUpdatedr   valuessetKeyErrorr"   r\   r9   rH   pop)
r   r"   r    r^   rL   r   r]   Zevent_stream_idZwindow_update_eventr9   r   r   r   rW      s:   





 zHTTP2Connection.receive_eventc                    sD   | j |= | j|= | j|= | j s| jd ur |  I d H  d S d S d S r3   )r   r   r   r   )r   r"   r   r   r   r/      s   zHTTP2Connection.response_closedc                 C   s   dS r   r   r5   r   r   r   	is_closed   s   zHTTP2Connection.is_closedc                 C   s
   | j  S r3   )r   is_connection_droppedr5   r   r   r   rh      s   
z%HTTP2Connection.is_connection_droppedr3   )r!   N)$__name__
__module____qualname__r`   r   r   typingCallabler   r   r
   r   r2   r4   r(   r	   rY   r)   AsyncIteratorbytesr*   rI   rJ   TupleListr+   r,   r   r   EventrW   r/   propertyboolrg   rh   r   r   r   r   r      s    









%r   )r-   rl   Zh2.connectionr   Z	h2.eventsZh2.settingsr   r   Zconcurrency.baser   r   r   r   configr	   r
   
exceptionsr   modelsr   r   utilsr   ri   rF   r   r   r   r   r   <module>   s    