U
    ÑŠ]¬  ã                   @   s    d dl Z d dlZddlmZmZmZ ddlmZmZ ddl	m
Z
mZ ddlmZ e jejejejejejejf Ze jg e jd f ZeeƒZG dd„ dƒZdS )	é    Né   )ÚBaseTCPStreamÚConcurrencyBackendÚTimeoutFlag)ÚTimeoutConfigÚTimeoutTypes)ÚAsyncRequestÚAsyncResponse)Ú
get_loggerc                	   @   s  e Zd ZdZd!eeeje dœdd„Z	d"e
eedœdd„Zdd	œd
d„Zd#e
eddœdd„Zd$eje eddœdd„Zd%eeddœdd„Zd&eejeeejejeef  f dœdd„Zd'eeje dœdd„Zd(eedœdd„Zdd	œdd„Zeed	œdd„ƒZ ed	œdd „Z!dS ))ÚHTTP11Connectioni   N)ÚstreamÚbackendÚ
on_releasec                 C   s.   || _ || _|| _tjtjd�| _tƒ | _d S )N)Zour_role)	r   r   r   Úh11Ú
ConnectionZCLIENTÚ	h11_stater   Útimeout_flag)Úselfr   r   r   © r   úu/var/www/html/staging.mfahmagazine.net/magazine_api/magazine_env/lib/python3.8/site-packages/httpx/dispatch/http11.pyÚ__init__    s
    zHTTP11Connection.__init__)ÚrequestÚtimeoutÚreturnc           	   
   Ã   sœ   |d krd nt |ƒ}|  ||¡I d H  | j| ¡ |g }}| jj|f|žŽ 4 I d H š |  |¡I d H \}}}W 5 Q I d H R X |  |¡}t||||| j	|d�S )N)Ústatus_codeÚhttp_versionÚheadersÚcontentZon_closer   )
r   Ú_send_requestÚ_send_request_datar   r   Zbackground_managerÚ_receive_responseÚ_receive_response_datar	   Úresponse_closed)	r   r   r   ÚtaskÚargsr   r   r   r   r   r   r   Úsend,   s    &
úzHTTP11Connection.send)r   c                 Ã   sT   t  ¡ }z t d|›�¡ | j |¡ W n t jk
r>   Y nX | j ¡ I d H  d S )Nzsend_event event=)	r   ÚConnectionClosedÚloggerÚdebugr   r%   ZLocalProtocolErrorr   Úclose)r   Úeventr   r   r   r)   A   s    zHTTP11Connection.closec                 Ã   sl   t  d|j›d|jj›d|j›�¡ |j d¡}|jj d¡}|jj}tj	|||d�}|  
||¡I dH  dS )zK
        Send the request method, URL, and headers to the network.
        zsend_headers method=z target=z	 headers=Úascii)ÚmethodÚtargetr   N)r'   r(   r,   ÚurlÚ	full_pathr   ÚencodeÚrawr   ÚRequestÚ_send_event)r   r   r   r,   r-   r   r*   r   r   r   r   K   s    ÿzHTTP11Connection._send_request)Údatar   r   c                 Ã   sœ   zŠzf|2 z@3 dH W }t dt|ƒ› d�¡ tj|d�}|  ||¡I dH  q6 t ¡ }|  ||¡I dH  W n t	k
r†   | j
 ¡  Y nX W 5 | j  ¡  X dS )z7
        Send the request body to the network.
        Nzsend_data data=Data(<ú bytes>))r4   )r   Úset_read_timeoutsr'   r(   Úlenr   ÚDatar3   ÚEndOfMessageÚOSErrorr   Zsend_failed)r   r4   r   Úchunkr*   r   r   r   r   ]   s    z#HTTP11Connection._send_request_data)r*   r   r   c                 Ã   s$   | j  |¡}| j ||¡I dH  dS )zs
        Send a single `h11` event to the network, waiting for the data to
        drain before returning.
        N)r   r%   r   Úwrite)r   r*   r   Zbytes_to_sendr   r   r   r3   v   s    zHTTP11Connection._send_event)r   r   c                 Ã   s`   |   |¡I dH }| j ¡  t|tjƒr*q q t|tjƒs>t‚q>q d|jj	ddd� }||j
|jfS )zH
        Read the response status and headers from the network.
        NzHTTP/%szlatin-1Úignore)Úerrors)Ú_receive_eventr   r6   Ú
isinstancer   ÚInformationalResponseÚResponseÚAssertionErrorr   Údecoder   r   )r   r   r*   r   r   r   r   r    ~   s    
z"HTTP11Connection._receive_responsec                 C  sL   |   |¡I dH }t|tjƒr*t|jƒV  q t|tjƒsH|tjksHt‚qHq dS )z:
        Read the response data from the network.
        N)	r?   r@   r   r8   Úbytesr4   r9   ZPAUSEDrC   )r   r   r*   r   r   r   r!   ‘   s
    z'HTTP11Connection._receive_response_datac                 Ã   s¨   | j  ¡ }t|tjƒr0t dt|jƒ› d�¡ nt d|›�¡ |tj	kr’z | j
j| j|| jd�I dH }W n tk
r‚   d}Y nX | j  |¡ q |tj	k	s¤t‚q¤q |S )zZ
        Read a single `h11` event, reading more data from the network if needed.
        zreceive_event event=Data(<r5   zreceive_event event=)ÚflagNó    )r   Z
next_eventr@   r   r8   r'   r(   r7   r4   Z	NEED_DATAr   ÚreadÚREAD_NUM_BYTESr   r:   Zreceive_datarC   )r   r   r*   r4   r   r   r   r?   Ÿ   s"    

  ÿ
zHTTP11Connection._receive_eventc                 Ã   sz   t  d| jj›d| jj› �¡ | jjtjkrP| jjtjkrP| j ¡  | j 	¡  n|  
¡ I d H  | jd k	rv|  ¡ I d H  d S )Nzresponse_closed our_state=z their_state=)r'   r(   r   Ú	our_stateZtheir_stater   ZDONEZstart_next_cycler   Zset_write_timeoutsr)   r   ©r   r   r   r   r"   ¸   s    ÿÿþ

z HTTP11Connection.response_closedc                 C   s   | j jtjtjfkS ©N)r   rJ   r   ZCLOSEDÚERRORrK   r   r   r   Ú	is_closedË   s    zHTTP11Connection.is_closedc                 C   s
   | j  ¡ S rL   )r   Úis_connection_droppedrK   r   r   r   rO   Ï   s    z&HTTP11Connection.is_connection_dropped)N)N)N)N)N)N)N)N)"Ú__name__Ú
__module__Ú__qualname__rI   r   r   ÚtypingÚOptionalÚOnReleaseCallbackr   r   r   r	   r%   r)   r   r   ÚAsyncIteratorrE   r   ÚH11Eventr3   ZTupleÚstrÚintZListr    r!   r?   r"   ÚpropertyÚboolrN   rO   r   r   r   r   r      sT    üü ÿ þ ÿ þ ÿ þ	 ÿþ ÿþr   )rS   r   Zconcurrency.baser   r   r   Úconfigr   r   Zmodelsr   r	   Úutilsr
   ÚUnionr2   rB   rA   r8   r9   r&   rW   ÚCallableÚ	AwaitablerU   rP   r'   r   r   r   r   r   Ú<module>   s"   ûÿ