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 ]}| ¡  q˜n(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   