o
    h"                     @   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"   a/var/www/html/magazine_api/magazine_env/lib/python3.10/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	dede	dede
d	ed
ededededef fddZdedef fddZdedefddZdedefddZdededdfddZdedefddZ			d#dede
d	ededef
 fdd Zdef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s%|j	rC| j
dt|j|j	 |jd\}}}|j|d| _d S 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-   urlcredentials_r0   	__class__r"   r#   r2   /   s*   



zHTTPProxy.__init__originreturnc                    sb   |  |rtd| jd| t | jjI d H S td| jd| | |I d H 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#   rD   W   s   
zHTTPProxy.acquire_connectionc                    sh   |  |}|du r,| |I dH }| j| ||_| j| | ||I dH  |S | 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#   rE   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rfdkszn | I dH  td|j d||dd|_| I dH  |S )z4Creates an HTTPConnection by setting up a TCP tunnel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_connectionrH   rJ   sendrB   rC   status_codereadr   Zon_close)r8   r>   r%   Zproxy_requestrL   Zproxy_responser"   r"   r#   rG   y   sR   

z)HTTPProxy.request_tunnel_proxy_connectionrL   c           
         s  d}|j }|dusJ |jjtjksJ |j}|j}|jrdt| j	| j
d}|j}||I dH }	|	dus7J td| jd| | jj||j|	|dI dH }| }td| jd|d| |d	krst|| j|d
|_dS |dksyJ t|| j|d
|_ dS )z-Runs start_tls() on a TCP-tunneled connectionrQ   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_connectionZ	h11_stateZ	our_stateh11ZSWITCHED_PROTOCOLra   r^   is_sslr	   r(   r'   r*   Zget_ssl_contextrB   rC   r.   r-   Z	start_tlsrW   Zget_http_versionr   Zh2_connectionr   )
r8   r>   rL   http_versionZhttp_connectionra   r^   Z
ssl_configr*   r`   r"   r"   r#   rK      sV   zHTTPProxy.tunnel_start_tlsc                 C   s    | j tjko	|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   rc   r   rF   r"   r"   r#   rA      s   
zHTTPProxy.should_forward_originrT   c                    sj   |  |jjr(t|j}| j |_||j_| j D ]\}}|j	
|| qt j||||dI d H S )N)rT   r'   r(   r*   )rA   r9   r>   strr.   r7   rY   r%   itemsrO   r5   r1   r[   )r8   rT   r'   r(   r*   
target_urlnamevaluer<   r"   r#   r[      s   
zHTTPProxy.sendc                 C   s   d| j d| jd| jdS )NzHTTPProxy(proxy_url=z proxy_headers=z proxy_mode=rS   )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   rD   rE   rG   rK   rA   r   r   r[   re   rj   __classcell__r"   r"   r<   r#   r$   *   st    	
(-
5r$   )(enumrb   Zconcurrency.baser   configr   r   r   r   r   r	   r
   r   
exceptionsr   Zmiddleware.basic_authr   modelsr   r   r   r   r   r   r   utilsr   rL   r   Zconnection_poolr   Zhttp2r   Zhttp11r   r   rB   Enumr   r$   r"   r"   r"   r#   <module>   s    (
$	