ó
    Ð]jg  ã                  ól   • S SK Jr  S SKrS SKJrJrJrJr   " S S5      rS
S jr	SS jr
 " S S	5      rg)é    )ÚannotationsN)ÚASGI3ApplicationÚASGIReceiveCallableÚASGISendCallableÚScopec                  ó0   • \ rS rSrSrSSS jjrS	S jrSrg)
ÚProxyHeadersMiddlewareé   a  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                ó0   • Xl         [        U5      U l        g ©N)ÚappÚ_TrustedHostsÚtrusted_hosts)Úselfr   r   s      Ú]/home/mande/repo/quber/.venv/lib/python3.13/site-packages/uvicorn/middleware/proxy_headers.pyÚ__init__ÚProxyHeadersMiddleware.__init__   s   € ØŒÜ*¨=Ó9ˆÕó    c              ƒ  ó.  #   • US   S:X  a  U R                  XU5      I S h  v•N $ UR                  S5      nU(       a  US   OS nXPR                  ;   a£  [        US   5      nSU;   aK  US   R	                  S5      R                  5       nUS;   a#  US   S	:X  a  UR                  S
S5      US'   OXqS'   SU;   a>  US   R	                  S5      nU R                  R                  U5      u  pšU	(       a  Xš4US'   U R                  XU5      I S h  v•N $  Nï N7f)NÚtypeÚlifespanÚclientr   Úheaderss   x-forwarded-protoÚlatin1>   ÚwsÚwssÚhttpÚhttpsÚ	websocketr   r   Úschemes   x-forwarded-for)r   Úgetr   ÚdictÚdecodeÚstripÚreplaceÚget_trusted_client_address)r   ÚscopeÚreceiveÚsendÚclient_addrÚclient_hostr   Úx_forwarded_protoÚx_forwarded_forÚhostÚports              r   Ú__call__ÚProxyHeadersMiddleware.__call__   s  é € Ø�‰=˜JÓ&ØŸ™ %°$Ó7×7Ð7à—i‘i Ó)ˆÞ(3�k !’n¸ˆà×,Ñ,Ó,Ü˜5 Ñ+Ó,ˆGà# wÓ.Ø$+Ð,@Ñ$A×$HÑ$HÈÓ$R×$XÑ$XÓ$ZÐ!à$Ð(FÓFØ˜V‘}¨Ó3Ø*;×*CÑ*CÀFÈDÓ*Q˜˜hšà*;˜h™à! WÓ,Ø")Ð*<Ñ"=×"DÑ"DÀXÓ"N�Ø!×/Ñ/×JÑJÈ?Ó[‘
�æð (, l�E˜(‘Oà—X‘X˜e¨dÓ3×3Ð3ñ7 8ñ6 4ùs"   ‚D¡D¢C*DÄDÄDÄD)r   r   N)z	127.0.0.1)r   r   r   úlist[str] | strÚreturnÚNone)r'   r   r(   r   r)   r   r3   r4   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r0   Ú__static_attributes__© r   r   r	   r	      s   † ñö:÷4r   r	   c                ój   • U R                  S5       Vs/ s H  oR                  5       PM     sn$ s  snf )NÚ,)Úsplitr$   )ÚvalueÚitems     r   Ú_parse_raw_hostsrA   ;   s)   € Ø%*§[¡[°Ô%5Ó6Ò%5˜T�J‰JŽLÑ%5Ñ6Ð6ùÒ6s   ”0c                ó®  • U R                  S5      (       a]  U R                  S5      nUS:X  a  U S4$ U SU nXS-   S nU(       d  US4$ UR                  S5      (       d  U S4$  U[        USS 5      4$ U R	                  S5      S:X  a"  U R                  SS5      u  p$ U[        U5      4$ U S4$ ! [         a    US4s $ f = f! [         a    U S4s $ f = f)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_endr.   Ú	remainderr/   s        r   Ú_parse_host_portrP   ?   s  € ð ×Ñ˜×ÑØ—j‘j “oˆØ˜"ÓØ˜!�8ˆOà�Q�{Ð#ˆØ¨™/Ð+Ð,ˆ	ÞØ˜�7ˆNØ×#Ñ# C×(Ñ(Ø˜!�8ˆOð	Øœ˜Y q r˜]Ó+Ð+Ð+ð ‡{�{�3Ó˜1ÓØ—\‘\ # qÓ)‰
ˆð	Øœ˜T›�?Ð"ð �!ˆ8€Oøô ó 	Ø˜�7ŠNð	ûô ó 	Ø˜!�8ŠOð	ús$   Á$B/ ÂC Â/C Â?C ÃCÃCc                  ó6   • \ rS rSrSrSS jrS	S jrS
S jrSrg)r   éb   z(Container for trusted hosts and networksc                ón  • USS/4;   U l         [        5       U l        [        5       U l        [        5       U l        U R                   (       d’  [        U[        5      (       a  [        U5      nU Hk  nSU;   a2   U R                  R                  [        R                  " U5      5        M;   U R                  R                  [        R                  " U5      5        Mm     g g ! [         a    U R                  R                  U5         M™  f = f! [         a    U R                  R                  U5         MÅ  f = f)NÚ*Ú/)Úalways_trustÚsetÚtrusted_literalsr   Útrusted_networksÚ
isinstanceÚstrrA   ÚaddÚ	ipaddressÚ
ip_networkrK   Ú
ip_address)r   r   r.   s      r   r   Ú_TrustedHosts.__init__e   s   € Ø"/°C¸#¸°<Ñ"?ˆÔä*-«%ˆÔÜQTÓQVˆÔÜTWÓTYˆÔð × × Ü˜-¬×-Ñ-Ü 0°Ó ?�ã%�ð
 ˜$“;ð8Ø×-Ñ-×1Ñ1´)×2FÒ2FÀtÓ2LÖMð
8Ø×*Ñ*×.Ñ.¬y×/CÒ/CÀDÓ/IÖJò &ð	 !øô &ó 8à×-Ñ-×1Ñ1°$×7ð8ûô &ó 8à×-Ñ-×1Ñ1°$×7ð8ús$   Á8/CÂ*/DÃ%DÄDÄ%D4Ä3D4c                ó  ^• U R                   (       a  gU(       d  g [        R                  " U5      mTU R                  ;   a  g[	        U4S jU R
                   5       5      $ ! [         a    XR                  ;   s $ f = f)NTFc              3  ó.   >#   • U  H
  nTU;   v •  M     g 7fr   r;   )Ú.0ÚnetÚips     €r   Ú	<genexpr>Ú-_TrustedHosts.__contains__.<locals>.<genexpr>—   s   øé € ÐBÒ,A S�r˜S–yÒ,Aùs   ƒ)rV   r]   r_   r   ÚanyrY   rK   rX   )r   r.   re   s     @r   Ú__contains__Ú_TrustedHosts.__contains__Œ   sp   ø€ Ø××ØæØð	1Ü×%Ò% dÓ+ˆBØ�T×'Ñ'Ó'ØÜÔB¨D×,AÒ,AÓBÓBÐBøäó 	1Ø×0Ñ0Ñ0Ò0ð	1ús   �&A# ÁA# Á#A>Á=A>c                óÄ   • [        U5      nU R                  (       a  [        US   5      $ [        U5       H  n[        U5      u  pEX@;  d  M  XE4s  $    [        US   5      $ )z‚Extract the client address from x_forwarded_for header.

In general this is the first "untrusted" host in the forwarded for list.
r   )rA   rV   rP   Úreversed)r   r-   Úx_forwarded_for_hostsÚ	host_portr.   r/   s         r   r&   Ú(_TrustedHosts.get_trusted_client_addressœ   sh   € ô
 !1°Ó AÐà××Ü#Ð$9¸!Ñ$<Ó=Ð=ô "Ð"7Ö8ˆIÜ)¨)Ó4‰JˆDØÕØ�zÒ!ñ 9ô  Ð 5°aÑ 8Ó9Ð9r   )rV   r   rX   rY   N)r   r2   r3   r4   )r.   z
str | Noner3   Úbool)r-   r[   r3   útuple[str, int])	r5   r6   r7   r8   r9   r   ri   r&   r:   r;   r   r   r   r   b   s   † Ù2ô%8ôN1÷ :r   r   )r?   r[   r3   z	list[str])r?   r[   r3   rq   )Ú
__future__r   r]   Úuvicorn._typesr   r   r   r   r	   rA   rP   r   r;   r   r   Ú<module>rt      s3   ðÝ "ã ç YÓ Y÷04ñ 04ôf7ô ÷FL:ò L:r   