U
    9Š](  ã                   @   sl   d dl mZ d dlmZmZmZ d dlmZmZm	Z	m
Z
mZmZmZmZ ddlmZmZ G dd„ deƒZdS )	é   )ÚConcurrencyBackend)Ú	CertTypesÚTimeoutTypesÚVerifyTypes)ÚAsyncRequestÚAsyncRequestDataÚAsyncResponseÚAsyncResponseContentÚRequestÚRequestDataÚResponseÚResponseContenté   )ÚAsyncDispatcherÚ
Dispatcherc                   @   sh   e Zd ZdZeeddœdd„Zdeee	e
edœdd„Zdd	œd
d„Zeedœdd„Zeedœdd„ZdS )ÚThreadedDispatcherz¢
    The ThreadedDispatcher class is used to mediate between the Client
    (which always uses async under the hood), and a synchronous `Dispatch`
    class.
    N)ÚdispatchÚbackendÚreturnc                 C   s   || _ || _d S ©N)Úsync_dispatcherr   )Úselfr   r   © r   úw/var/www/html/staging.mfahmagazine.net/magazine_api/magazine_env/lib/python3.8/site-packages/httpx/dispatch/threaded.pyÚ__init__   s    zThreadedDispatcher.__init__)ÚrequestÚverifyÚcertÚtimeoutr   c              	   ƒ   sÄ   | j ‰ t|dt|dd ƒƒ}|  |¡}t|j|j|j|d�}| jj}||||dœ}	| j j	|f|	ŽI d H ‰t
ˆtƒstt‚tˆdtˆdd ƒƒ}
|  |
¡}d dœ‡ ‡fdd	„}tˆjˆjˆj|||ˆjd
�S )NÚcontentZcontent_aiter)ÚmethodÚurlÚheadersÚdata)r   r   r   r   Z_raw_contentZ_raw_stream©r   c                   “   s   ˆ   ˆj¡I d H  d S r   )Úrun_in_threadpoolÚcloser   ©Zconcurrency_backendZsync_responser   r   Úasync_on_close>   s    z/ThreadedDispatcher.send.<locals>.async_on_close)Ústatus_codeÚhttp_versionr"   r   Zon_closer   Úhistory)r   ÚgetattrÚ_sync_request_datar
   r    r!   r"   r   Úsendr%   Ú
isinstancer   ÚAssertionErrorÚ_async_response_contentr   r)   r*   r+   )r   r   r   r   r   r#   Z	sync_dataZsync_requestÚfuncÚkwargsr   Zasync_contentr(   r   r'   r   r.      sB    
üü  
ÿ
ùzThreadedDispatcher.sendr$   c                 Ã   s   | j j}| j |¡I dH  dS )z‹
        The `.close()` method runs the `Dispatcher.close()` within a threadpool,
        so as not to block the async event loop.
        N)r   r&   r   r%   )r   r2   r   r   r   r&   L   s    zThreadedDispatcher.close)r   r   c                 C   s(   t |tƒr|S t|dƒst‚| j |¡S )NÚ__iter__)r/   ÚbytesÚhasattrr0   r   Ziterate_in_threadpool)r   r   r   r   r   r1   T   s    
z*ThreadedDispatcher._async_response_content)r#   r   c                 C   s   t |tƒr|S | j |¡S r   )r/   r5   r   Ziterate)r   r#   r   r   r   r-   ]   s    
z%ThreadedDispatcher._sync_request_data)NNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r   r   r.   r&   r   r	   r1   r   r   r-   r   r   r   r   r      s      ûú1	r   N)Zconcurrency.baser   Úconfigr   r   r   Zmodelsr   r   r   r	   r
   r   r   r   Úbaser   r   r   r   r   r   r   Ú<module>   s   (
