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rdksn | 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rt	| 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rt|| j|d
|_n|dkst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 )zDetermines 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   (
$	