ó
    0/¡jý  ã                  ót   • S SK Jr  S SK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      Úy/var/www/html/health-monitoring.indevconsultancy.in/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Ñ  S n/ nUS    H(  u  p‰US:X  a  U	nM  US:X  d  M  UR                  U	5        M*     UbH  UR	                  S5      R                  5       n
U
S	;   a#  US   S
:X  a  U
R                  SS5      US'   OX¡S'   U(       aJ  SR                  U5      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 $  GN N7f)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__ÚProxyHeadersMiddleware.__call__   sH  é € Ø�‰=˜JÓ&ØŸ™ %°$Ó7×7Ð7à—i‘i Ó)ˆÞ(3�k !’n¸ˆà×,Ñ,Ó,Ø48Ð#Ø24Ð"Ø$ YÔ/‘�ØÐ/Ó/Ø.3Ò+ØÐ/Õ/Ø*×1Ñ1°%Ö8ñ	  0ð 'Ñ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È?Ó[‘
�æð (, l�E˜(‘Oà—X‘X˜e¨dÓ3×3Ð3òC 8ñB 4ùs)   ‚E¡D?¢AEÁ4CEÄ:EÄ;EÅE)r   r   N)z	127.0.0.1)r   r   r   úlist[str] | strÚreturnÚNone)r(   r   r)   r   r*   r   r8   r9   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r5   Ú__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$   )r0   Úitems     r   Ú_parse_raw_hostsrE   B   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)r0   Úbracket_endr3   Ú	remainderr4   s        r   Ú_parse_host_portrT   F   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                  ó@   • \ rS rSrSrS	S jrS
S jrSS jrSS jrSr	g)r   éi   z(Container for trusted hosts and networksc                ó¾  • 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     [        R                  " SS9" U R                  5      U l        g ! [         a    U R                  R                  U5         MÁ  f = f! [         a    U R                  R                  U5         Mí  f = f)NÚ*Ú/i   )Úmaxsize)Úalways_trustÚsetÚtrusted_literalsr   Útrusted_networksÚ
isinstanceÚstrrE   ÚaddÚ	ipaddressÚ
ip_networkrO   Ú
ip_addressÚ	functoolsÚ	lru_cacheÚ_compute_trustÚ_trusts)r   r   r3   s      r   r   Ú_TrustedHosts.__init__l   s  € Ø"/°C¸#¸°<Ñ"?ˆÔä*-«%ˆÔÜQTÓQVˆÔÜTWÓTYˆÔð × × Ü˜-¬×-Ñ-Ü 0°Ó ?�ã%�ð
 ˜$“;ð8Ø×-Ñ-×1Ñ1´)×2FÒ2FÀtÓ2LÖMð
8Ø×*Ñ*×.Ñ.¬y×/CÒ/CÀDÓ/IÖJñ &ô& !×*Ò*°4Ò8¸×9LÑ9LÓMˆ�øô &ó 8à×-Ñ-×1Ñ1°$×7ð8ûô &ó 8à×-Ñ-×1Ñ1°$×7ð8ús$   Á8/DÂ*/D3Ä%D0Ä/D0Ä3%EÅEc                ó˜   • U R                   (       a  gU(       d  g[        U5      S:”  a  U R                  U5      $ U R                  U5      $ )NTFéý   )r[   Úlenrg   rh   )r   r3   s     r   Ú__contains__Ú_TrustedHosts.__contains__•   sA   € Ø××ØæØô ˆt‹9�s‹?Ø×&Ñ& tÓ,Ð,à�|‰|˜DÓ!Ð!r   c                óØ   ^•  [         R                  " U5      mTU R                  ;   =(       d    [        U4S jU R                   5       5      $ ! [
         a    XR                  ;   s $ f = f)Nc              3  ó.   >#   • U  H
  nTU;   v •  M     g 7fr   r@   )Ú.0ÚnetÚips     €r   Ú	<genexpr>Ú/_TrustedHosts._compute_trust.<locals>.<genexpr>¥   s   øé € Ð2^ÒH]À°2¸¶9ÒH]ùs   ƒ)rb   rd   r   Úanyr^   rO   r]   )r   r3   rs   s     @r   rg   Ú_TrustedHosts._compute_trust¢   s]   ø€ ð	1Ü×%Ò% dÓ+ˆBØ˜×+Ñ+Ñ+×^¬sÔ2^È×H]ÒH]Ó2^Ó/^Ð^øÜó 	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   )rE   r[   rT   Úreversed)r   r2   Úx_forwarded_for_hostsÚ	host_portr3   r4   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   )rh   r[   r   r]   r^   N)r   r7   r8   r9   )r3   z
str | Noner8   Úbool)r3   r`   r8   r}   )r2   r`   r8   útuple[str, int])
r:   r;   r<   r=   r>   r   rm   rg   r'   r?   r@   r   r   r   r   i   s   † Ù2ô'NôR"ô1÷:r   r   )r0   r`   r8   z	list[str])r0   r`   r8   r~   )Ú
__future__r   re   rb   Úuvicorn._typesr   r   r   r   r	   rE   rT   r   r@   r   r   Ú<module>r�      s6   ðÝ "ã Û ç YÓ Y÷64ñ 64ôr7ô ÷FR:ò R:r   