o
    7'h8  ã                   @  s>  d dl mZ d dlZd dlZd dlZd dlZddlmZ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 d
dlmZ d
dlm Z  ej!e"e#f Z$ej%ej&e$e$f  Z'ej(e$e$f Z)e *d¡Z+		dddd„Z,G dd„ deƒZ-G dd„ de ƒZ.G dd„ de ƒZ/dS )é    )ÚannotationsNé   )ÚSOCKET_OPTIONÚNetworkBackend)Ú
ProxyError)ÚURLÚOriginÚRequestÚResponseÚenforce_bytesÚenforce_headersÚenforce_url)Údefault_ssl_context)ÚLock)ÚTraceé   )ÚHTTPConnection)ÚConnectionPool)ÚHTTP11Connection)ÚConnectionInterfacezhttpcore.proxyÚdefault_headersú+typing.Sequence[tuple[bytes, bytes]] | NoneÚoverride_headersÚreturnúlist[tuple[bytes, bytes]]c                   sT   | du rg nt | ƒ} |du rg nt |ƒ}tdd„ |D ƒƒ‰ ‡ fdd„| D ƒ} | | S )zh
    Append default_headers and override_headers, de-duplicating if a key exists
    in both cases.
    Nc                 s  s   � | ]	\}}|  ¡ V  qd S ©N©Úlower©Ú.0ÚkeyÚvalue© r"   úOC:\Users\shubh\Videos\agent\nova\Lib\site-packages\httpcore/_sync/http_proxy.pyÚ	<genexpr>-   s   € z merge_headers.<locals>.<genexpr>c                   s$   g | ]\}}|  ¡ ˆ vr||f‘qS r"   r   r   ©Zhas_overrider"   r#   Ú
<listcomp>.   s
    þz!merge_headers.<locals>.<listcomp>)ÚlistÚset)r   r   r"   r%   r#   Úmerge_headers#   s   
þr)   c                      sJ   e Zd ZdZ														d*d+‡ fd#d$„Zd,d(d)„Z‡  ZS )-Ú	HTTPProxyzB
    A connection pool that sends requests via an HTTP proxy.
    Né
   TFr   Ú	proxy_urlúURL | bytes | strÚ
proxy_authú&tuple[bytes | str, bytes | str] | NoneÚproxy_headersú+HeadersAsMapping | HeadersAsSequence | NoneÚssl_contextússl.SSLContext | NoneÚproxy_ssl_contextÚmax_connectionsú
int | NoneÚmax_keepalive_connectionsÚkeepalive_expiryúfloat | NoneÚhttp1ÚboolÚhttp2ÚretriesÚintÚlocal_addressú
str | NoneÚudsÚnetwork_backendúNetworkBackend | NoneÚsocket_optionsú%typing.Iterable[SOCKET_OPTION] | Noner   ÚNonec                   sÂ   t ƒ j|||||	|
|||||d� t|dd�| _| jjdkr&|dur&tdƒ‚|| _|| _t|dd�| _	|dur_t
|d d	d�}t
|d
 d	d�}|d | }dt |¡ }d|fg| j	 | _	dS dS )aÅ  
        A connection pool for making HTTP requests.

        Parameters:
            proxy_url: The URL to use when connecting to the proxy server.
                For example `"http://127.0.0.1:8080/"`.
            proxy_auth: Any proxy authentication as a two-tuple of
                (username, password). May be either bytes or ascii-only str.
            proxy_headers: Any HTTP headers to use for the proxy requests.
                For example `{"Proxy-Authorization": "Basic <username>:<password>"}`.
            ssl_context: An SSL context to use for verifying connections.
                If not specified, the default `httpcore.default_ssl_context()`
                will be used.
            proxy_ssl_context: The same as `ssl_context`, but for a proxy server rather than a remote origin.
            max_connections: The maximum number of concurrent HTTP connections that
                the pool should allow. Any attempt to send a request on a pool that
                would exceed this amount will block until a connection is available.
            max_keepalive_connections: The maximum number of idle HTTP connections
                that will be maintained in the pool.
            keepalive_expiry: The duration in seconds that an idle HTTP connection
                may be maintained for before being expired from the pool.
            http1: A boolean indicating if HTTP/1.1 requests should be supported
                by the connection pool. Defaults to True.
            http2: A boolean indicating if HTTP/2 requests should be supported by
                the connection pool. Defaults to False.
            retries: The maximum number of retries when trying to establish
                a connection.
            local_address: Local address to connect from. Can also be used to
                connect using a particular address family. Using
                `local_address="0.0.0.0"` will connect using an `AF_INET` address
                (IPv4), while using `local_address="::"` will connect using an
                `AF_INET6` address (IPv6).
            uds: Path to a Unix Domain Socket to use instead of TCP sockets.
            network_backend: A backend instance to use for handling network I/O.
        )r2   r5   r7   r8   r:   r<   rB   r=   r?   rA   rD   r,   ©Únameó   httpNzCThe `proxy_ssl_context` argument is not allowed for the http schemer0   r   r.   r   ó   :s   Basic s   Proxy-Authorization)ÚsuperÚ__init__r   Ú
_proxy_urlÚschemeÚRuntimeErrorÚ_ssl_contextÚ_proxy_ssl_contextr   Ú_proxy_headersr   Úbase64Ú	b64encode)Úselfr,   r.   r0   r2   r4   r5   r7   r8   r:   r<   r=   r?   rA   rB   rD   ÚusernameÚpasswordZuserpassÚauthorization©Ú	__class__r"   r#   rL   ;   s>   5õÿÿ
þûzHTTPProxy.__init__Úoriginr   r   c                 C  sV   |j dkrt| jj| j|| j| j| jd�S t| jj| j|| j	| j| j| j
| j| jd�	S )NrI   )Úproxy_originr0   Úremote_originr8   rB   r4   )	r\   r0   r]   r2   r4   r8   r:   r<   rB   )rN   ÚForwardHTTPConnectionrM   r[   rR   Ú_keepalive_expiryZ_network_backendrQ   ÚTunnelHTTPConnectionrP   Ú_http1Ú_http2©rU   r[   r"   r"   r#   Úcreate_connection’   s(   
ú÷zHTTPProxy.create_connection)NNNNr+   NNTFr   NNNN) r,   r-   r.   r/   r0   r1   r2   r3   r4   r3   r5   r6   r7   r6   r8   r9   r:   r;   r<   r;   r=   r>   r?   r@   rA   r@   rB   rC   rD   rE   r   rF   )r[   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rL   rd   Ú__classcell__r"   r"   rY   r#   r*   6   s$    ðWr*   c                   @  s|   e Zd Z					d+d,dd„Zd-dd„Zd.dd„Zd/dd„Zd0dd „Zd1d!d"„Zd1d#d$„Z	d1d%d&„Z
d1d'd(„Zd0d)d*„ZdS )2r^   Nr\   r   r]   r0   r1   r8   r9   rB   rC   rD   rE   r4   r3   r   rF   c                 C  s2   t |||||d�| _|| _t|dd�| _|| _d S )N©r[   r8   rB   rD   r2   r0   rG   )r   Ú_connectionÚ_proxy_originr   rR   Ú_remote_origin)rU   r\   r]   r0   r8   rB   rD   r4   r"   r"   r#   rL   ª   s   
û
zForwardHTTPConnection.__init__Úrequestr	   r
   c                 C  sT   t | j|jƒ}t| jj| jj| jjt|j	ƒd�}t
|j|||j|jd�}| j |¡S )N©rN   ÚhostÚportÚtarget)ÚmethodÚurlÚheadersÚcontentÚ
extensions)r)   rR   ru   r   rl   rN   rp   rq   Úbytesrt   r	   rs   Ústreamrw   rk   Úhandle_request)rU   rn   ru   rt   Zproxy_requestr"   r"   r#   rz   ¿   s   üûz$ForwardHTTPConnection.handle_requestr[   r;   c                 C  ó
   || j kS r   ©rm   rc   r"   r"   r#   Úcan_handle_requestÐ   ó   
z(ForwardHTTPConnection.can_handle_requestc                 C  ó   | j  ¡  d S r   ©rk   Úclose©rU   r"   r"   r#   r�   Ó   ó   zForwardHTTPConnection.closeÚstrc                 C  ó
   | j  ¡ S r   ©rk   Úinfor‚   r"   r"   r#   r‡   Ö   r~   zForwardHTTPConnection.infoc                 C  r…   r   ©rk   Úis_availabler‚   r"   r"   r#   r‰   Ù   r~   z"ForwardHTTPConnection.is_availablec                 C  r…   r   ©rk   Úhas_expiredr‚   r"   r"   r#   r‹   Ü   r~   z!ForwardHTTPConnection.has_expiredc                 C  r…   r   ©rk   Úis_idler‚   r"   r"   r#   r�   ß   r~   zForwardHTTPConnection.is_idlec                 C  r…   r   ©rk   Ú	is_closedr‚   r"   r"   r#   r�   â   r~   zForwardHTTPConnection.is_closedc                 C  ó   d| j j› d|  ¡ › d�S ©Nú<z [z]>©rZ   re   r‡   r‚   r"   r"   r#   Ú__repr__å   ó   zForwardHTTPConnection.__repr__)NNNNN)r\   r   r]   r   r0   r1   r8   r9   rB   rC   rD   rE   r4   r3   r   rF   ©rn   r	   r   r
   ©r[   r   r   r;   ©r   rF   ©r   r„   ©r   r;   ©re   rf   rg   rL   rz   r}   r�   r‡   r‰   r‹   r�   r�   r”   r"   r"   r"   r#   r^   ©   s     ø







r^   c                   @  s‚   e Zd Z								d0d1dd„Zd2dd„Zd3dd „Zd4d!d"„Zd5d$d%„Zd6d&d'„Zd6d(d)„Z	d6d*d+„Z
d6d,d-„Zd5d.d/„ZdS )7r`   NTFr\   r   r]   r2   r3   r4   r0   r   r8   r9   r:   r;   r<   rB   rC   rD   rE   r   rF   c                 C  s^   t |||	|
|d�| _|| _|| _|| _|| _t|dd�| _|| _|| _	|| _
tƒ | _d| _d S )Nrj   r0   rG   F)r   rk   rl   rm   rP   rQ   r   rR   r_   ra   rb   r   Ú_connect_lockÚ
_connected)rU   r\   r]   r2   r4   r0   r8   r:   r<   rB   rD   r"   r"   r#   rL   ê   s"   û
zTunnelHTTPConnection.__init__rn   r	   r
   c              	   C  s  |j  di ¡}| dd ¡}| j�å | jsîd| jj| jjf }t| jj	| jj| jj|d�}t
d|fdg| jƒ}td|||j d�}| j |¡}|jd	k sO|jd
krm|j  dd¡}	|	jddd�}
d|j|
f }| j ¡  t|ƒ‚|j d }| jd u rztƒ n| j}| jr„ddgndg}| |¡ || jj d¡|dœ}tdt||ƒ�}|jdi |¤Ž}||_W d   ƒ n1 s´w   Y  | d¡}|d uoÇ| ¡ dk}|sÐ| jrá| jsáddlm} || j|| j d�| _n
t!| j|| j d�| _d| _W d   ƒ n1 søw   Y  | j |¡S )NÚtimeoutÚconnects   %b:%dro   s   Host)s   Accepts   */*s   CONNECT)rs   rt   ru   rw   éÈ   i+  Zreason_phraseó    ÚasciiÚignore)Úerrorsz%d %sZnetwork_streamzhttp/1.1Úh2)r2   Úserver_hostnamerž   Ú	start_tlsÚ
ssl_objectr   )ÚHTTP2Connection)r[   ry   r8   Tr"   )"rw   Úgetrœ   r�   rm   rp   rq   r   rl   rN   r)   rR   r	   rk   rz   ÚstatusÚdecoder�   r   rP   r   rb   Úset_alpn_protocolsr   Úloggerr§   Úreturn_valueÚget_extra_infoÚselected_alpn_protocolra   r<   r©   r_   r   )rU   rn   Ztimeoutsrž   rr   Zconnect_urlZconnect_headersZconnect_requestZconnect_responseZreason_bytesZ
reason_strÚmsgry   r2   Úalpn_protocolsÚkwargsÚtracer¨   Zhttp2_negotiatedr©   r"   r"   r#   rz   	  s€   üÿüÿ


ÿý
ýþ

þ
ýý€·Jz#TunnelHTTPConnection.handle_requestr[   c                 C  r{   r   r|   rc   r"   r"   r#   r}   Y  r~   z'TunnelHTTPConnection.can_handle_requestc                 C  r   r   r€   r‚   r"   r"   r#   r�   \  rƒ   zTunnelHTTPConnection.closer„   c                 C  r…   r   r†   r‚   r"   r"   r#   r‡   _  r~   zTunnelHTTPConnection.infoc                 C  r…   r   rˆ   r‚   r"   r"   r#   r‰   b  r~   z!TunnelHTTPConnection.is_availablec                 C  r…   r   rŠ   r‚   r"   r"   r#   r‹   e  r~   z TunnelHTTPConnection.has_expiredc                 C  r…   r   rŒ   r‚   r"   r"   r#   r�   h  r~   zTunnelHTTPConnection.is_idlec                 C  r…   r   rŽ   r‚   r"   r"   r#   r�   k  r~   zTunnelHTTPConnection.is_closedc                 C  r�   r‘   r“   r‚   r"   r"   r#   r”   n  r•   zTunnelHTTPConnection.__repr__)NNNNTFNN)r\   r   r]   r   r2   r3   r4   r3   r0   r   r8   r9   r:   r;   r<   r;   rB   rC   rD   rE   r   rF   r–   r—   r˜   r™   rš   r›   r"   r"   r"   r#   r`   é   s&    õ

P





r`   )NN)r   r   r   r   r   r   )0Ú
__future__r   rS   ÚloggingÚsslÚtypingZ_backends.baser   r   Ú_exceptionsr   Z_modelsr   r   r	   r
   r   r   r   Ú_sslr   Z_synchronizationr   Ú_tracer   Ú
connectionr   Zconnection_poolr   Zhttp11r   Z
interfacesr   ÚUnionrx   r„   Z	ByteOrStrÚSequenceÚTupleZHeadersAsSequenceÚMappingZHeadersAsMappingÚ	getLoggerr®   r)   r*   r^   r`   r"   r"   r"   r#   Ú<module>   s2    $	
þs@