Ë
    ^Qêjý  ã                  óp   — d dl mZ d dlZd dlZd dlmZmZmZmZ  G d„ d«      Z	d
d„Z
dd„Z G d„ d	«      Zy)é    )ÚannotationsN)ÚASGI3ApplicationÚASGIReceiveCallableÚASGISendCallableÚScopec                  ó"   — e Zd ZdZddd„Zdd„Zy)ÚProxyHeadersMiddlewareaB  Middleware for handling known proxy headers

    This middleware can be used when a known proxy is fronting the application,
    and is trusted to be properly setting the `X-Forwarded-Proto` and
    `X-Forwarded-For` headers with the connecting client information.

    Modifies the `client` and `scheme` information so that they reference
    the connecting client, rather that the connecting proxy.

    References:
    - <https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers#Proxies>
    - <https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For>
    c                ó2   — || _         t        |«      | _        y ©N)ÚappÚ_TrustedHostsÚtrusted_hosts)Úselfr   r   s      úe/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/uvicorn/middleware/proxy_headers.pyÚ__init__zProxyHeadersMiddleware.__init__   s   € ØˆŒÜ*¨=Ó9ˆÕó    c              ƒ  ób  K  — |d   dk(  r| j                  |||«      ƒ d {  –—† S |j                  d«      }|r|d   nd }|| j                  v rÁd }g }|d   D ]$  \  }}	|dk(  r|	}Œ|dk(  sŒ|j                  |	«       Œ& |�F|j	                  d«      j                  «       }
|
d	v r#|d   d
k(  r|
j                  dd«      |d<   n|
|d<   |rGdj                  |«      j	                  d«      }| j                  j                  |«      \  }}|r||f|d<   | j                  |||«      ƒ d {  –—† S 7 �Œ	7 Œ­w)NÚtypeÚlifespanÚclientr   Úheaderss   x-forwarded-protos   x-forwarded-forÚlatin1>   ÚwsÚwssÚhttpÚhttpsÚ	websocketr   r   Úschemes   , )	r   Úgetr   ÚappendÚdecodeÚstripÚreplaceÚjoinÚget_trusted_client_address)r   ÚscopeÚreceiveÚsendÚclient_addrÚclient_hostÚx_forwarded_proto_valueÚx_forwarded_for_valuesÚnameÚvalueÚx_forwarded_protoÚx_forwarded_forÚhostÚports                 r   Ú__call__zProxyHeadersMiddleware.__call__   s]  è ø€ Ø�‰=˜JÒ&ØŸ™ %¨°$Ó7×7Ð7à—i‘i Ó)ˆÙ(3�k !’n¸ˆà˜$×,Ñ,Ñ,Ø48Ð#Ø24Ð"Ø$ YÑ/ò 9‘��eØÐ/Ò/Ø.3Ñ+ØÐ/Ó/Ø*×1Ñ1°%Õ8ð	9ð 'Ð2Ø$;×$BÑ$BÀ8Ó$L×$RÑ$RÓ$TÐ!à$Ð(FÑFØ˜V‘}¨Ò3Ø*;×*CÑ*CÀFÈDÓ*Q˜˜hšà*;˜˜h™á%Ø"'§*¡*Ð-CÓ"D×"KÑ"KÈHÓ"U�Ø!×/Ñ/×JÑJÈ?Ó[‘
��dáð (,¨T l�E˜(‘Oà—X‘X˜e W¨dÓ3×3Ð3ðC 8ùðB 4ús)   ‚D/¡D*¢AD/Á+B:D/Ä%D-Ä&D/Ä-D/N)z	127.0.0.1)r   r   r   úlist[str] | strÚreturnÚNone)r&   r   r'   r   r(   r   r5   r6   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r3   © r   r   r	   r	   	   s   „ ñô:ô#4r   r	   c                óf   — | j                  d«      D �cg c]  }|j                  «       ‘Œ c}S c c}w )Nú,)Úsplitr"   )r.   Úitems     r   Ú_parse_raw_hostsr@   B   s%   € Ø%*§[¡[°Ó%5Ö6˜TˆD�J‰J�LÒ6Ð6ùÒ6s   ”.c                óŒ  — | j                  d«      rS| j                  d«      }|dk(  r| dfS | d| }| |dz   d }|s|dfS |j                  d«      s| dfS 	 |t        |dd «      fS | j	                  d«      dk(  r#| j                  dd«      \  }}	 |t        |«      fS | dfS # t        $ r |dfcY S w xY w# t        $ r | dfcY S w xY w)a&  Parse a forwarded host value into host and optional port.

    Accepts bare IPs, IPv4 `host:port`, and bracketed IPv6 `[host]:port`.
    Any unrecognized or malformed value is treated conservatively and returned
    without a port so trust checks do not silently normalize arbitrary input.
    ú[ú]éÿÿÿÿr   é   Nú:)Ú
startswithÚfindÚintÚ
ValueErrorÚcountÚrsplit)r.   Úbracket_endr1   Ú	remainderr2   s        r   Ú_parse_host_portrO   F   s  € ð ×Ñ˜ÔØ—j‘j “oˆØ˜"ÒØ˜!�8ˆOà�Q�{Ð#ˆØ˜+¨™/Ð+Ð,ˆ	ÙØ˜�7ˆNØ×#Ñ# CÔ(Ø˜!�8ˆOð	Øœ˜Y q r˜]Ó+Ð+Ð+ð ‡{�{�3Ó˜1ÒØ—\‘\ # qÓ)‰
ˆˆdð	Øœ˜T›�?Ð"ð �!ˆ8€Oøô ò 	Ø˜�7ŠNð	ûô ò 	Ø˜!�8ŠOð	ús$   ÁB  ÂB3 Â B0Â/B0Â3CÃCc                  ó0   — e Zd ZdZdd„Zdd„Zd	d„Zd
d„Zy)r   z(Container for trusted hosts and networksc                ó–  — |ddgfv | _         t        «       | _        t        «       | _        t        «       | _        | j                   s…t        |t        «      rt        |«      }|D ]e  }d|v r0	 | j                  j                  t        j                  |«      «       Œ7	 | j                  j                  t        j                  |«      «       Œg  t        j                  d¬«      | j                  «      | _        y # t        $ r | j                  j                  |«       Y Œºw xY w# t        $ r | j                  j                  |«       Y Œäw xY w)NÚ*ú/i   )Úmaxsize)Úalways_trustÚsetÚtrusted_literalsr   Útrusted_networksÚ
isinstanceÚstrr@   ÚaddÚ	ipaddressÚ
ip_networkrJ   Ú
ip_addressÚ	functoolsÚ	lru_cacheÚ_compute_trustÚ_trusts)r   r   r1   s      r   r   z_TrustedHosts.__init__l   s  € Ø"/°C¸#¸°<Ð"?ˆÔä*-«%ˆÔÜQTÓQVˆÔÜTWÓTYˆÔð × Ò Ü˜-¬Ô-Ü 0°Ó ?�à%ò 8�ð
 ˜$‘;ð8Ø×-Ñ-×1Ñ1´)×2FÑ2FÀtÓ2LÕMð
8Ø×*Ñ*×.Ñ.¬y×/CÑ/CÀDÓ/IÕJð8ð& 9”y×*Ñ*°4Ô8¸×9LÑ9LÓMˆ�øô &ò 8à×-Ñ-×1Ñ1°$Ö7ð8ûô &ò 8à×-Ñ-×1Ñ1°$Ö7ð8ús$   Á+.C7Â.D!Ã7$DÄDÄ!$EÅEc                ó‚   — | j                   ry|syt        |«      dkD  r| j                  |«      S | j                  |«      S )NTFéý   )rU   Úlenra   rb   )r   r1   s     r   Ú__contains__z_TrustedHosts.__contains__•   sA   € Ø×ÒØáØô ˆt‹9�sŠ?Ø×&Ñ& tÓ,Ð,à�|‰|˜DÓ!Ð!r   c                óÆ   ‡— 	 t        j                  |«      Š‰| j                  v xs t        ˆfd„| j                  D «       «      S # t
        $ r || j                  v cY S w xY w)Nc              3  ó&   •K  — | ]  }‰|v –— Œ
 y ­wr   r;   )Ú.0ÚnetÚips     €r   ú	<genexpr>z/_TrustedHosts._compute_trust.<locals>.<genexpr>¥   s   øè ø€ Ò2^À°2¸´9Ñ2^ùs   ƒ)r\   r^   r   ÚanyrX   rJ   rW   )r   r1   rk   s     @r   ra   z_TrustedHosts._compute_trust¢   s_   ø€ ð	1Ü×%Ñ% dÓ+ˆBØ˜×+Ñ+Ð+Ò^¬sÓ2^È×H]ÑH]Ô2^Ó/^Ð^øÜò 	1Ø˜4×0Ñ0Ð0Ò0ð	1ús   ƒAA ÁA ÁA c                ó¸   — t        |«      }| j                  rt        |d   «      S t        |«      D ]  }t        |«      \  }}|| vsŒ||fc S  t        |d   «      S )z’Extract the client address from x_forwarded_for header.

        In general this is the first "untrusted" host in the forwarded for list.
        r   )r@   rU   rO   Úreversed)r   r0   Úx_forwarded_for_hostsÚ	host_portr1   r2   s         r   r%   z(_TrustedHosts.get_trusted_client_address©   ss   € ô
 !1°Ó AÐà×ÒÜ#Ð$9¸!Ñ$<Ó=Ð=ô "Ð"7Ó8ò 	"ˆIÜ)¨)Ó4‰JˆD�$Ø˜4ÒØ˜T�zÒ!ð	"ô  Ð 5°aÑ 8Ó9Ð9r   N)r   r4   r5   r6   )r1   z
str | Noner5   Úbool)r1   rZ   r5   rr   )r0   rZ   r5   útuple[str, int])r7   r8   r9   r:   r   rf   ra   r%   r;   r   r   r   r   i   s   „ Ù2ó'NóR"ó1ô:r   r   )r.   rZ   r5   z	list[str])r.   rZ   r5   rs   )Ú
__future__r   r_   r\   Úuvicorn._typesr   r   r   r   r	   r@   rO   r   r;   r   r   ú<module>rv      s6   ðÝ "ã Û ç YÓ Y÷64ñ 64ór7ó ÷FR:ò R:r   