
    g                    b    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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/home/matz/Project1/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      n	U	(       a  Sn
X4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_host)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ii)(3k!n,,,5+,G#w.$+,@$A$H$H$R$X$X$Z!$(FFV}3*;*C*CFD*Qh*;h!W,")*<"="D"DX"N))AA/R D'+lE(OXXed333? 8> 4s"   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%5TJJL%5666s   0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   C   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_network
ValueError
ip_address)r   r   r.   s      r   r   _TrustedHosts.__init__F   s    "/C#<"?*-%QTQVTWTY   --- 0 ?%
 $;8--11)2F2Ft2LM
8**..y/C/CD/IJ &	 ! & 8--11$78 & 8--11$78s$   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>x   s     B,ASrSy,As   )rG   rN   rQ   r   anyrJ   rP   rI   )r   r.   rW   s     @r   __contains___TrustedHosts.__contains__m   sp    	1%%d+BT'''BD,A,ABBB 	10000	1s   &A# A# #A>=A>c                    [        U5      nU R                  (       a  US   $ [        U5       H  nX0;  d  M
  Us  $    US   $ )z~Extract the client host from x_forwarded_for header

In general this is the first "untrusted" host in the forwarded for list.
r   )rA   rG   reversed)r   r-   x_forwarded_for_hostsr.   s       r   r&   %_TrustedHosts.get_trusted_client_host}   sM    
 !1 A(++ 23D 4 %Q''r   )rG   r   rI   rJ   N)r   r2   r3   r4   )r.   z
str | Noner3   bool)r-   rL   r3   rL   )	r5   r6   r7   r8   r9   r   r[   r&   r:   r;   r   r   r   r   C   s    2%8N1 (r   r   )r?   rL   r3   z	list[str])
__future__r   rN   uvicorn._typesr   r   r   r   r	   rA   r   r;   r   r   <module>rd      s-    "  Y Y44 44n7K( K(r   