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   zzf|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rz | j
j| j|| jdI dH }W n tk
r   d}Y nX | j | q |tj	k	stqq |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"   