U
    ]S'                     @   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                	   @   s@  e Zd ZdZd&eeejdddZd'e	e
edddZdd	d
dZdd	ddZd(e	eedddZd)eeje eddddZd*eeeddddZd+eeddddZd,eeejeejejeef  f dddZd-eeeje dddZd.eeejjdddZeddd d!Ze e!d	d"d#Z"e!d	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   h2Z
connectionZH2Connectionh2_stateeventstimeout_flagsinitializedwindow_update_received)selfr   r   r    r   t/var/www/html/staging.mfahmagazine.net/magazine_api/magazine_env/lib/python3.8/site-packages/httpx/dispatch/http2.py__init__   s    zHTTP2Connection.__init__)requesttimeoutreturnc           
   
      s   |d krd nt |}| js"|   | ||I d H }g | j|< t | j|< | j | j	|< | j
|| |g }}| jj|f| 4 I d H  | ||I d H \}}W 5 Q I d H R X | ||}tj| j|d}	t|d|||	|dS )N)	stream_idzHTTP/2)status_codeZ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.send)r    c                    s   | j  I d H  d S N)r   closer   r   r   r   r2   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   )Z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   r6   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urlZ	authorityscheme	full_pathr#   rawloggerdebugr'   r6   r   write)r   r   r   r!   r#   r6   r   r   r   r'   `   s    
 
zHTTP2Connection.send_headers)r!   r   r   r    c                    sT   z>|2 z 3 d H W }| |||I d H  q6 | ||I d H  W 5 | j |   X d S r1   )r   set_read_timeouts	send_data
end_stream)r   r!   r   r   datar   r   r   r(   w   s
    z!HTTP2Connection.send_request_data)r!   rH   r   r    c                    s   |r| j |}tt||| j j}|dkrP| j|  I d H  | j|   q |d | ||d   }}| j || | j 	 }| j
||I d H  q d S )Nr   )r   Zlocal_flow_control_windowminlenZmax_outbound_frame_sizer   waitclearrF   r6   r   rD   )r   r!   rH   r   Zflow_control
chunk_sizechunkr6   r   r   r   rF      s      
zHTTP2Connection.send_data)r!   r   r    c                    s>   t d|  | j| | j }| j||I d H  d S )Nzend_stream stream_id=)rB   rC   r   rG   r6   r   rD   )r   r!   r   r6   r   r   r   rG      s    
zHTTP2Connection.end_streamc                    s   |  ||I dH }| j|   t|tjjr q2q d}g }|jD ]<\}}|dkrdt|j	ddd}q@|
ds@|||f q@||fS )zH
        Read the response status and headers from the network.
        N   s   :statusr7   ignore)errors   :)receive_eventr   rE   
isinstancer   r   ZResponseReceivedr#   intdecode
startswithappend)r   r!   r   eventr"   r#   r9   r:   r   r   r   r)      s    
z HTTP2Connection.receive_responsec                 C  sX   |  ||I d H }t|tjjr:| j|j| |jV  q t|tjj	tjj
fr qTq d S r1   )rS   rT   r   r   ZDataReceivedr   Zacknowledge_received_dataZflow_controlled_lengthrH   ZStreamEndedZStreamReset)r   r!   r   rY   r   r   r   r*      s     
zHTTP2Connection.body_iterc           
   	      s  | j | s| j| }| jj| j||dI d H }| j|}|D ]}t|dd}t	d| d| t
|drxt|t|tj jr|dkr| j D ]}|  qn(z| j|   W n tk
r   Y nX |r@| j |j | q@| j }	| j|	|I d H  q | 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getattrrB   rC   hasattrr   rT   r   ZWindowUpdatedr   valuessetKeyErrorr!   rX   r6   rD   pop)
r   r!   r   rZ   rH   r   rY   Zevent_stream_idZwindow_update_eventr6   r   r   r   rS      s0    


zHTTP2Connection.receive_event)r!   r    c                    s:   | j |= | j|= | j|= | j s6| jd k	r6|  I d H  d S r1   )r   r   r   r   )r   r!   r   r   r   r-      s
    zHTTP2Connection.response_closedc                 C   s   dS r   r   r3   r   r   r   	is_closed   s    zHTTP2Connection.is_closedc                 C   s
   | j  S r1   )r   is_connection_droppedr3   r   r   r   rd      s    z%HTTP2Connection.is_connection_dropped)N)N)N)N)N)N)N)N)N)$__name__
__module____qualname__r\   r   r   typingCallabler   r   r
   r   r0   r2   r&   r	   rU   r'   AsyncIteratorbytesr(   rF   rG   ZTupleZListr)   r*   r   r   EventrS   r-   propertyboolrc   rd   r   r   r   r   r      st                  %r   )r+   rh   Zh2.connectionr   Z	h2.eventsZh2.settingsr   r   Zconcurrency.baser   r   r   r   configr	   r
   
exceptionsr   Zmodelsr   r   utilsr   re   rB   r   r   r   r   r   <module>   s   