U
    øŠ]Ó  ã                   @   sº   d dl Z ddlmZ ddlmZ ddlmZmZmZm	Z	m
Z
mZmZ ddlmZmZmZ ddlmZ dd	lmZ dd
lmZ e jee je f ZeeƒZG dd„ dƒZG dd„ deƒZdS )é    Né   )ÚAsyncioBackend)ÚConcurrencyBackend)ÚDEFAULT_POOL_LIMITSÚDEFAULT_TIMEOUT_CONFIGÚ	CertTypesÚHTTPVersionTypesÚ
PoolLimitsÚTimeoutTypesÚVerifyTypes)ÚAsyncRequestÚAsyncResponseÚOrigin)Ú
get_loggeré   )ÚAsyncDispatcher)ÚHTTPConnectionc                   @   sˆ   e Zd ZdZddœdd„Zdeeeje	 dœdd	„Z
e	dd
œdd„Ze	dd
œdd„Zddœdd„Zeje	 dœdd„Zedœdd„ZdS )ÚConnectionStorezÙ
    We need to maintain collections of connections in a way that allows us to:

    * Lookup connections by origin.
    * Iterate over connections by insertion time.
    * Return the total number of connections.
    N©Úreturnc                 C   s   i | _ i | _d S ©N)ÚallÚ	by_origin©Úself© r   ú~/var/www/html/staging.mfahmagazine.net/magazine_api/magazine_env/lib/python3.8/site-packages/httpx/dispatch/connection_pool.pyÚ__init__"   s    zConnectionStore.__init__F)ÚoriginÚ
http2_onlyr   c                 C   sf   z| j | }W n tk
r$   Y d S X ttt| ¡ ƒƒƒ}|rH|jsHd S ||= |sZ| j |= | j|= |S r   )r   ÚKeyErrorÚnextÚreversedÚlistÚkeysZis_http2r   )r   r   r   ÚconnectionsÚ
connectionr   r   r   Úpop_by_origin&   s    
zConnectionStore.pop_by_origin©r&   r   c                 C   sH   d| j |< zd| j|j |< W n$ tk
rB   |di| j|j< Y nX d S )Ng        )r   r   r   r    ©r   r&   r   r   r   Úadd9   s
    
zConnectionStore.addc                 C   s0   | j |= | j|j |= | j|j s,| j|j= d S r   )r   r   r   r)   r   r   r   Úremove@   s    zConnectionStore.removec                 C   s   | j  ¡  | j ¡  d S r   )r   Úclearr   r   r   r   r   r,   F   s    
zConnectionStore.clearc                 C   s   t | j ¡ ƒS r   )Úiterr   r$   r   r   r   r   Ú__iter__J   s    zConnectionStore.__iter__c                 C   s
   t | jƒS r   )Úlenr   r   r   r   r   Ú__len__M   s    zConnectionStore.__len__)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   ÚboolÚtypingÚOptionalr   r'   r*   r+   r,   ÚIteratorr.   Úintr0   r   r   r   r   r      s    ÿ þr   c                	   @   s¦   e Zd Zdddeedddœeeeee	e
edœdd„Zeedœdd„ƒZdeeeeed	œd
d„Zeedœdd„Zeddœdd„Zddœdd„Zeeje dœdd„ZdS )ÚConnectionPoolTN)ÚverifyÚcertÚ	trust_envÚtimeoutÚpool_limitsÚhttp_versionsÚbackendc                C   s`   || _ || _|| _|| _|| _d| _|| _tƒ | _tƒ | _	|d krHt
ƒ n|| _| j |¡| _d S )NF)r;   r<   r>   r?   r@   Ú	is_closedr=   r   Úkeepalive_connectionsÚactive_connectionsr   rA   Zget_semaphoreÚmax_connections)r   r;   r<   r=   r>   r?   r@   rA   r   r   r   r   R   s    zConnectionPool.__init__r   c                 C   s   t | jƒt | jƒ S r   )r/   rC   rD   r   r   r   r   Únum_connectionsk   s    zConnectionPool.num_connections)Úrequestr;   r<   r>   r   c              
   Ã   st   | j |jjd�I d H }z|j||||d�I d H }W n< tk
rn } z| j |¡ | j ¡  |‚W 5 d }~X Y nX |S )N)r   )r;   r<   r>   )	Úacquire_connectionÚurlr   ÚsendÚBaseExceptionrD   r+   rE   Úrelease)r   rG   r;   r<   r>   r&   ÚresponseÚexcr   r   r   rJ   o   s       ÿ
zConnectionPool.send)r   r   c              
   Ã   sŠ   t  d|›�¡ |  |¡}|d krj| j ¡ I d H  t|| j| j| j| j	| j
| j| jd�}t  d|›�¡ nt  d|›�¡ | j |¡ |S )Nzacquire_connection origin=)r;   r<   r>   r@   rA   Zrelease_funcr=   znew_connection connection=zreuse_connection connection=)ÚloggerÚdebugÚpop_connectionrE   Úacquirer   r;   r<   r>   r@   rA   Úrelease_connectionr=   rD   r*   ©r   r   r&   r   r   r   rH   ‚   s$    
ø
z!ConnectionPool.acquire_connectionr(   c                 Ã   sŠ   t  d|›�¡ |jr.| j |¡ | j ¡  nX| jjd k	rn| j	| jjkrn| j |¡ | j ¡  | 
¡ I d H  n| j |¡ | j |¡ d S )Nzrelease_connection connection=)rO   rP   rB   rD   r+   rE   rL   r?   Z
soft_limitrF   ÚcloserC   r*   r)   r   r   r   rS   š   s    
ÿþ
z!ConnectionPool.release_connectionc                 Ã   s6   d| _ t| jƒ}| j ¡  |D ]}| ¡ I d H  qd S )NT)rB   r#   rC   r,   rU   )r   r%   r&   r   r   r   rU   ª   s
    

zConnectionPool.closec                 C   sF   | j j|dd�}|d kr$| j |¡}|d k	rB| ¡ rB| j ¡  d }|S )NT)r   )rD   r'   rC   Zis_connection_droppedrE   rL   rT   r   r   r   rQ   ±   s    
zConnectionPool.pop_connection)NNN)r1   r2   r3   r   r   r   r   r5   r
   r	   r   r   r   Úpropertyr9   rF   r   r   rJ   r   r   rH   rS   rU   r6   r7   rQ   r   r   r   r   r:   Q   s@   ÷÷   ûúr:   )r6   Zconcurrency.asyncior   Zconcurrency.baser   Úconfigr   r   r   r   r	   r
   r   Zmodelsr   r   r   Úutilsr   Úbaser   r&   r   ÚDictZListZCONNECTIONS_DICTr1   rO   r   r:   r   r   r   r   Ú<module>   s   $	8