U
    ˜¤Œ]Ó"  ã                   @   sê   d dl Z d dlZddl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 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 d	d
lmZ d	dlmZ d	dlm Z  d	dl!m"Z" ee#ƒZ$G dd„ de j%ƒZ&G dd„ deƒZ'dS )é    Né   )ÚConcurrencyBackend)ÚDEFAULT_POOL_LIMITSÚDEFAULT_TIMEOUT_CONFIGÚ	CertTypesÚHTTPVersionTypesÚ
PoolLimitsÚ	SSLConfigÚTimeoutTypesÚVerifyTypes)Ú
ProxyError)Úbuild_basic_auth_header)ÚURLÚAsyncRequestÚAsyncResponseÚHeadersÚHeaderTypesÚOriginÚURLTypes)Ú
get_loggeré   )ÚHTTPConnection)ÚConnectionPool)ÚHTTP2Connection)ÚHTTP11Connectionc                   @   s   e Zd ZdZdZdZdS )ÚHTTPProxyModeÚDEFAULTÚFORWARD_ONLYÚTUNNEL_ONLYN)Ú__name__Ú
__module__Ú__qualname__r   r   r   © r"   r"   úy/var/www/html/staging.mfahmagazine.net/magazine_api/magazine_env/lib/python3.8/site-packages/httpx/dispatch/proxy_http.pyr   $   s   r   c                       sÐ   e Zd ZdZdejdddeedddœ	ee	ee
eeeeeedœ
‡ fdd„Zeedœ‡ fd	d
„Zeedœdd„Zeedœdd„Zeeddœdd„Zeedœdd„Zdee
eeedœ‡ fdd„Zedœdd„Z‡  ZS )Ú	HTTPProxyz`A proxy that sends requests to the recipient server
    on behalf of the connecting client.
    NT)	Úproxy_headersÚ
proxy_modeÚverifyÚcertÚ	trust_envÚtimeoutÚpool_limitsÚhttp_versionsÚbackend)
Ú	proxy_urlr%   r&   r'   r(   r)   r*   r+   r,   r-   c       	      	      s†   t t| ƒj|||||
||	d� t|ƒ| _|| _t|ƒ| _| j}|jsJ|j	r‚| j 
dt|j|j	ƒ¡ |j d¡\}}}|j|d�| _d S )N)r'   r(   r*   r+   r-   r)   r,   zProxy-Authorizationú@)Ú	authority)Úsuperr$   Ú__init__r   r.   r&   r   r%   ÚusernameÚpasswordÚ
setdefaultr   r0   Ú
rpartitionÚ	copy_with)Úselfr.   r%   r&   r'   r(   r)   r*   r+   r,   r-   ÚurlZcredentialsÚ_r0   ©Ú	__class__r"   r#   r2   /   s(    
ù


þzHTTPProxy.__init__)ÚoriginÚreturnc                 ƒ   sd   |   |¡r8t d| j›d|›�¡ tƒ  | jj¡I d H S t d| j›d|›�¡ |  |¡I d H S d S )Nzforward_connection proxy_url=ú origin=ztunnel_connection proxy_url=)Úshould_forward_originÚloggerÚdebugr.   r1   Úacquire_connectionr=   Útunnel_connection©r8   r=   r;   r"   r#   rC   W   s    
ÿÿzHTTPProxy.acquire_connectionc                 Ã   sd   |   |¡}|dkrT|  |¡I dH }| j |¡ ||_| j |¡ |  ||¡I dH  n| j |¡ |S )zuCreates a new HTTPConnection via the CONNECT method
        usually reserved for proxying HTTPS connections.
        N)Zpop_connectionÚrequest_tunnel_proxy_connectionÚactive_connectionsÚremover=   ÚaddÚtunnel_start_tls)r8   r=   Ú
connectionr"   r"   r#   rD   c   s    
zHTTPProxy.tunnel_connectionc              
   Ã   s  | j  ¡ }| dd¡ td| j ¡ |d�}|j› d|j› �|j_	| j
 ¡ I dH  t| jj| j| j| j| jdg| j| jd�}| j |¡ | |¡I dH }t d	| j›d
|›d|›�¡ d|j  krÊdksôn | ¡ I dH  td|j› d�||d�‚nd|_| ¡ I dH  |S )z4Creates an HTTPConnection by setting up a TCP tunnelZAcceptz*/*ZCONNECT)Úmethodr9   Úheadersú:NúHTTP/1.1)r'   r(   r*   r-   r,   r)   Zrelease_funcztunnel_response proxy_url=r?   z
 response=éÈ   i+  z+Non-2XX response received from HTTP proxy (ú))ÚrequestÚresponse)r%   Úcopyr5   r   r.   r7   ÚhostÚportr9   Ú	full_pathZmax_connectionsÚacquirer   r=   r'   r(   r*   r-   r)   Zrelease_connectionrG   rI   ÚsendrA   rB   Zstatus_codeÚreadr   Zon_close)r8   r=   r%   Zproxy_requestrK   Zproxy_responser"   r"   r#   rF   y   sD    
  ÿø
ÿüz)HTTPProxy.request_tunnel_proxy_connection)r=   rK   r>   c           
      Ã   s  d}|j }|dk	st‚|jjtjks(t‚|j}|j}|jrÆt	| j
| jd�}|j}| |¡I dH }	|	dk	slt‚t d| j›d|›�¡ | jj||j|	|d�I dH }| ¡ }t d| j›d|›d|›�¡ |d	krât|| j|d
�|_n|dksît‚t|| j|d
�|_ dS )z-Runs start_tls() on a TCP-tunneled connectionrO   N)r(   r'   ztunnel_start_tls proxy_url=r?   )ÚstreamÚhostnameÚssl_contextr*   ztunnel_tls_complete proxy_url=z http_version=zHTTP/2)Ú
on_release)Zh11_connectionÚAssertionErrorZ	h11_stateZ	our_stateÚh11ZSWITCHED_PROTOCOLr^   r[   Úis_sslr	   r(   r'   r*   Zget_ssl_contextrA   rB   r.   r-   Z	start_tlsrU   Zget_http_versionr   Zh2_connectionr   )
r8   r=   rK   Zhttp_versionZhttp_connectionr^   r[   Z
ssl_configr*   r]   r"   r"   r#   rJ   ¦   sH    ÿüÿ  ÿ
  ÿzHTTPProxy.tunnel_start_tlsc                 C   s    | j tjkr|j p| j tjkS )zÎDetermines if the given origin should
        be forwarded or tunneled. If 'proxy_mode' is 'DEFAULT'
        then the proxy will forward all 'HTTP' requests and
        tunnel all 'HTTPS' requests.
        )r&   r   r   ra   r   rE   r"   r"   r#   r@   Û   s    ÿ
þzHTTPProxy.should_forward_origin)rR   r'   r(   r*   r>   c                 ƒ   sh   |   |jj¡rNt|jƒ}| j ¡ |_||j_| j ¡ D ]\}}|j	 
||¡ q6tƒ j||||d�I d H S )N)rR   r'   r(   r*   )r@   r9   r=   Ústrr.   r7   rW   r%   ÚitemsrM   r5   r1   rY   )r8   rR   r'   r(   r*   Z
target_urlÚnameÚvaluer;   r"   r#   rY   å   s    
   ÿzHTTPProxy.send)r>   c                 C   s   d| j ›d| j›d| j›d�S )NzHTTPProxy(proxy_url=z proxy_headers=z proxy_mode=rQ   )r.   r%   r&   )r8   r"   r"   r#   Ú__repr__û   s    ÿzHTTPProxy.__repr__)NNN)r   r    r!   Ú__doc__r   r   r   r   r   r   r   r   Úboolr
   r   r   r   r2   r   r   rC   rD   rF   rJ   r@   r   r   rY   rb   rf   Ú__classcell__r"   r"   r;   r#   r$   *   sR   ôô(. þ5   ûúr$   )(Úenumr`   Zconcurrency.baser   Úconfigr   r   r   r   r   r	   r
   r   Ú
exceptionsr   Zmiddleware.basic_authr   Zmodelsr   r   r   r   r   r   r   Úutilsr   rK   r   Zconnection_poolr   Zhttp2r   Zhttp11r   r   rA   ÚEnumr   r$   r"   r"   r"   r#   Ú<module>   s   (
$	