§
    o�’j¸  ã                  ó~   — 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dS )é    )ÚannotationsN)ÚASGI3ApplicationÚASGIReceiveCallableÚASGISendCallableÚScopec                  ó$   — e Zd ZdZddd	„Zdd„ZdS )Ú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>
    ú	127.0.0.1Úappr   Útrusted_hostsúlist[str] | strÚreturnÚNonec                ó<   — || _         t          |¦  «        | _        d S ©N)r   Ú_TrustedHostsr   )Úselfr   r   s      úNC:\Projects\DSCons\.venv\Lib\site-packages\uvicorn\middleware\proxy_headers.pyÚ__init__zProxyHeadersMiddleware.__init__   s   € ØˆŒÝ*¨=Ñ9Ô9ˆÔÐÐó    Úscoper   Úreceiver   Úsendr   c              ƒ  ó¢  K  — |d         dk    r|                       |||¦  «        ƒ d {V —†S |                     d¦  «        }|r|d         nd }|| j        v rÞd }g }|d         D ])\  }}	|dk    r|	}Œ|dk    r|                     |	¦  «         Œ*|�V|                     d¦  «                             ¦   «         }
|
d	v r+|d         d
k    r|
                     dd¦  «        |d<   n|
|d<   |rNd                     |¦  «                             d¦  «        }| j                             |¦  «        \  }}|r||f|d<   |                       |||¦  «        ƒ d {V —†S )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   r   r   r   Ú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Ð7Ð7Ð7Ð7Ð7Ð7à—i’i Ñ)Ô)ˆØ(3Ð=�k !”n�n¸ˆà˜$Ô,Ð,Ð,Ø48Ð#Ø24Ð"Ø$ YÔ/ð 9ð 9‘��eØÐ/Ò/Ð/Ø.3Ð+Ð+ØÐ/Ò/Ð/Ø*×1Ò1°%Ñ8Ô8Ð8øà&Ð2Ø$;×$BÒ$BÀ8Ñ$LÔ$L×$RÒ$RÑ$TÔ$TÐ!à$Ð(FÐFÐFØ˜V”}¨Ò3Ð3Ø*;×*CÒ*CÀFÈDÑ*QÔ*Q˜˜h™˜à*;˜˜h™à%ð 3Ø"'§*¢*Ð-CÑ"DÔ"D×"KÒ"KÈHÑ"UÔ"U�Ø!Ô/×JÒJÈ?Ñ[Ô[‘
��dàð 3ð (,¨T l�E˜(‘Oà—X’X˜e W¨dÑ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3r   N)r
   )r   r   r   r   r   r   )r   r   r   r   r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r7   © r   r   r	   r	   	   sK   € € € € € ðð ð:ð :ð :ð :ð :ð#4ð #4ð #4ð #4ð #4ð #4r   r	   r2   Ústrr   ú	list[str]c                ó@   — d„ |                       d¦  «        D ¦   «         S )Nc                ó6   — g | ]}|                      ¦   «         ‘ŒS r<   )r)   )Ú.0Úitems     r   ú
<listcomp>z$_parse_raw_hosts.<locals>.<listcomp>C   s    € Ð6Ð6Ð6˜TˆD�JŠJ‰LŒLÐ6Ð6Ð6r   ú,)Úsplit)r2   s    r   Ú_parse_raw_hostsrF   B   s"   € Ø6Ð6 U§[¢[°Ñ%5Ô%5Ð6Ñ6Ô6Ð6r   útuple[str, int]c                óê  — |                       d¦  «        rƒ|                      d¦  «        }|dk    r| dfS | d|…         }| |dz   d…         }|s|dfS |                      d¦  «        s| dfS 	 |t          |dd…         ¦  «        fS # t          $ r |dfcY S w xY w|                      d¦  «        dk    r?|                      dd¦  «        \  }}	 |t          |¦  «        fS # t          $ r | dfcY S w xY w| dfS )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)r2   Úbracket_endr5   Ú	remainderr6   s        r   Ú_parse_host_portrV   F   sO  € ð ×Ò˜ÑÔð Ø—j’j ‘o”oˆØ˜"ÒÐØ˜!�8ˆOà�Q�{�]Ô#ˆØ˜+¨™/Ð+Ð+Ô,ˆ	Øð 	Ø˜�7ˆNØ×#Ò# CÑ(Ô(ð 	Ø˜!�8ˆOð	Ø�˜Y q r rœ]Ñ+Ô+Ð+Ð+øÝð 	ð 	ð 	Ø˜�7ˆNˆNˆNð	øøøð ‡{‚{�3ÑÔ˜1ÒÐØ—\’\ # qÑ)Ô)‰
ˆˆdð	Ø�˜T™œ�?Ð"øÝð 	ð 	ð 	Ø˜!�8ˆOˆOˆOð	øøøð �!ˆ8€Os$   Á,B ÂBÂBÃC ÃC.Ã-C.c                  ó2   — e Zd ZdZdd„Zdd
„Zdd„Zdd„ZdS )r   z(Container for trusted hosts and networksr   r   r   r   c                ó¦  — |ddgfv | _         t          ¦   «         | _        t          ¦   «         | _        t          ¦   «         | _        | j         sÜt          |t          ¦  «        rt          |¦  «        }|D ]µ}d|v rX	 | j                             t          j
        |¦  «        ¦  «         Œ4# t          $ r | j                             |¦  «         Y ŒZw xY w	 | j                             t          j        |¦  «        ¦  «         ŒŒ# t          $ r | j                             |¦  «         Y Œ²w xY w t          j        d¬¦  «        | j        ¦  «        | _        d S )NÚ*ú/i   )Úmaxsize)Úalways_trustÚsetÚtrusted_literalsr   Útrusted_networksÚ
isinstancer=   rF   ÚaddÚ	ipaddressÚ
ip_networkrQ   Ú
ip_addressÚ	functoolsÚ	lru_cacheÚ_compute_trustÚ_trusts)r   r   r5   s      r   r   z_TrustedHosts.__init__l   sp  € Ø"/°C¸#¸°<Ð"?ˆÔå*-©%¬%ˆÔÝQTÑQVÔQVˆÔÝTWÑTYÔTYˆÔð Ô ð 	8Ý˜-­Ñ-Ô-ð @Ý 0°Ñ ?Ô ?�à%ð 8ð 8�ð
 ˜$�;�;ð8ØÔ-×1Ò1µ)Ô2FÀtÑ2LÔ2LÑMÔMÐMÐMøÝ%ð 8ð 8ð 8àÔ-×1Ò1°$Ñ7Ô7Ð7Ð7Ð7ð8øøøð8ØÔ*×.Ò.­yÔ/CÀDÑ/IÔ/IÑJÔJÐJÐJøÝ%ð 8ð 8ð 8àÔ-×1Ò1°$Ñ7Ô7Ð7Ð7Ð7ð8øøøð 9•yÔ*°4Ð8Ñ8Ô8¸Ô9LÑMÔMˆŒˆˆs$   Á:,B'Â'$CÃCÃ,C?Ã?$D&Ä%D&r5   ú
str | NoneÚboolc                ó–   — | j         rdS |sdS t          |¦  «        dk    r|                      |¦  «        S |                      |¦  «        S )NTFéý   )r\   Úlenrg   rh   )r   r5   s     r   Ú__contains__z_TrustedHosts.__contains__•   sV   € ØÔð 	Ø�4àð 	Ø�5õ ˆt‰9Œ9�sŠ?ˆ?Ø×&Ò& tÑ,Ô,Ð,à�|Š|˜DÑ!Ô!Ð!r   r=   c                ó²   ‡— 	 t          j        |¦  «        Š‰| j        v pt          ˆfd„| j        D ¦   «         ¦  «        S # t
          $ r || j        v cY S w xY w)Nc              3  ó    •K  — | ]}‰|v V — Œ	d S r   r<   )rA   ÚnetÚips     €r   ú	<genexpr>z/_TrustedHosts._compute_trust.<locals>.<genexpr>¥   s'   øè è € Ð2^Ð2^À°2¸°9Ð2^Ð2^Ð2^Ð2^Ð2^Ð2^r   )rb   rd   r   Úanyr_   rQ   r^   )r   r5   rr   s     @r   rg   z_TrustedHosts._compute_trust¢   sz   ø€ ð	1ÝÔ% dÑ+Ô+ˆBØ˜Ô+Ð+Ð^­sÐ2^Ð2^Ð2^Ð2^ÈÔH]Ð2^Ñ2^Ô2^Ñ/^Ô/^Ð^øÝð 	1ð 	1ð 	1Ø˜4Ô0Ð0Ð0Ð0Ð0ð	1øøøs   ƒ<A  Á AÁAr4   rG   c                óÞ   — t          |¦  «        }| j        rt          |d         ¦  «        S t          |¦  «        D ]}t          |¦  «        \  }}|| vr||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   )rF   r\   rV   Úreversed)r   r4   Úx_forwarded_for_hostsÚ	host_portr5   r6   s         r   r,   z(_TrustedHosts.get_trusted_client_address©   s’   € õ
 !1°Ñ AÔ AÐàÔð 	>Ý#Ð$9¸!Ô$<Ñ=Ô=Ð=õ "Ð"7Ñ8Ô8ð 	"ð 	"ˆIÝ)¨)Ñ4Ô4‰JˆD�$Ø˜4ÐÐØ˜T�zÐ!Ð!Ð!ð  õ
  Ð 5°aÔ 8Ñ9Ô9Ð9r   N)r   r   r   r   )r5   ri   r   rj   )r5   r=   r   rj   )r4   r=   r   rG   )r8   r9   r:   r;   r   rn   rg   r,   r<   r   r   r   r   i   so   € € € € € Ø2Ð2ð'Nð 'Nð 'Nð 'NðR"ð "ð "ð "ð1ð 1ð 1ð 1ð:ð :ð :ð :ð :ð :r   r   )r2   r=   r   r>   )r2   r=   r   rG   )Ú
__future__r   re   rb   Úuvicorn._typesr   r   r   r   r	   rF   rV   r   r<   r   r   ú<module>r{      sá   ðØ "Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø Ð Ð Ð à YÐ YÐ YÐ YÐ YÐ YÐ YÐ YÐ YÐ YÐ YÐ Yð64ð 64ð 64ð 64ð 64ñ 64ô 64ð 64ðr7ð 7ð 7ð 7ð ð  ð  ð  ðFR:ð R:ð R:ð R:ð R:ñ R:ô R:ð R:ð R:ð R:r   