U a@sTdZddlZddlmZejrBddlmZddlmZddlm Z Gdd d Z dS) a; X-Forwarded-For Proxy Fix ========================= This module provides a middleware that adjusts the WSGI environ based on ``X-Forwarded-`` headers that proxies in front of an application may set. When an application is running behind a proxy server, WSGI may see the request as coming from that server rather than the real client. Proxies set various headers to track where the request actually came from. This middleware should only be used if the application is actually behind such a proxy, and should be configured with the number of proxies that are chained in front of it. Not all proxies set all the headers. Since incoming headers can be faked, you must set how many proxies are setting each header so the middleware knows what to trust. .. autoclass:: ProxyFix :copyright: 2007 Pallets :license: BSD-3-Clause N)parse_list_header) StartResponse)WSGIApplication)WSGIEnvironmentc @sbeZdZdZddeeeeeddddZeejeejed d d Z d d ej e dddZ dS)ProxyFixa$ Adjust the WSGI environ based on ``X-Forwarded-`` that proxies in front of the application may set. - ``X-Forwarded-For`` sets ``REMOTE_ADDR``. - ``X-Forwarded-Proto`` sets ``wsgi.url_scheme``. - ``X-Forwarded-Host`` sets ``HTTP_HOST``, ``SERVER_NAME``, and ``SERVER_PORT``. - ``X-Forwarded-Port`` sets ``HTTP_HOST`` and ``SERVER_PORT``. - ``X-Forwarded-Prefix`` sets ``SCRIPT_NAME``. You must tell the middleware how many proxies set each header so it knows what values to trust. It is a security issue to trust values that came from the client rather than a proxy. The original values of the headers are stored in the WSGI environ as ``werkzeug.proxy_fix.orig``, a dict. :param app: The WSGI application to wrap. :param x_for: Number of values to trust for ``X-Forwarded-For``. :param x_proto: Number of values to trust for ``X-Forwarded-Proto``. :param x_host: Number of values to trust for ``X-Forwarded-Host``. :param x_port: Number of values to trust for ``X-Forwarded-Port``. :param x_prefix: Number of values to trust for ``X-Forwarded-Prefix``. .. code-block:: python from werkzeug.middleware.proxy_fix import ProxyFix # App is behind one proxy that sets the -For and -Host headers. app = ProxyFix(app, x_for=1, x_host=1) .. versionchanged:: 1.0 Deprecated code has been removed: * The ``num_proxies`` argument and attribute. * The ``get_remote_addr`` method. * The environ keys ``orig_remote_addr``, ``orig_wsgi_url_scheme``, and ``orig_http_host``. .. versionchanged:: 0.15 All headers support multiple values. The ``num_proxies`` argument is deprecated. Each header is configured with a separate number of trusted proxies. .. versionchanged:: 0.15 Original WSGI environ values are stored in the ``werkzeug.proxy_fix.orig`` dict. ``orig_remote_addr``, ``orig_wsgi_url_scheme``, and ``orig_http_host`` are deprecated and will be removed in 1.0. .. versionchanged:: 0.15 Support ``X-Forwarded-Port`` and ``X-Forwarded-Prefix``. .. versionchanged:: 0.15 ``X-Forwarded-Host`` and ``X-Forwarded-Port`` modify ``SERVER_NAME`` and ``SERVER_PORT``. rrN)appx_forx_protox_hostx_portx_prefixreturncCs(||_||_||_||_||_||_dS)N)r r r r r r)selfr r r r r rr^C:\Users\vtejo\AppData\Local\Temp\pip-unpacked-wheel-1tps7o9u\werkzeug\middleware\proxy_fix.py__init__]s zProxyFix.__init__)trustedvaluercCs.|r|s dSt|}t||kr*|| SdS)aGet the real value from a list header based on the configured number of trusted proxies. :param trusted: Number of values to trust in the header. :param value: Comma separated list header value to parse. :return: The real value, or ``None`` if there are fewer values than the number of trusted proxies. .. versionchanged:: 1.0 Renamed from ``_get_trusted_comma``. .. versionadded:: 0.15 N)rlen)rrrvaluesrrr_get_real_valuems   zProxyFix._get_real_valuerr)environstart_responserc Csd|j}|d}|d}|d}|d||||d|d|ddi||j|d }|rd||d<||j|d }|r||d<||j|d } | r| |d<| d d } | d|d<t| dkr| d |d<||j|d} | r8|d} | r0| d d } t| dkr| dn| } | d | |d<| |d<||j |d} | rX| |d<| ||S)zModify the WSGI environ based on the various ``Forwarded`` headers before calling the wrapped application. Store the original environ values in ``werkzeug.proxy_fix.orig_{key}``. REMOTE_ADDRwsgi.url_scheme HTTP_HOSTzwerkzeug.proxy_fix.orig SERVER_NAME SERVER_PORT SCRIPT_NAME)rrrrrr ZHTTP_X_FORWARDED_FORZHTTP_X_FORWARDED_PROTOZHTTP_X_FORWARDED_HOST:rrrZHTTP_X_FORWARDED_PORTZHTTP_X_FORWARDED_PREFIX) getupdaterr r r splitrr rr )rrrZ environ_getZorig_remote_addrZorig_wsgi_url_schemeZorig_http_hostr r r partsr hostrrrr__call__s\       zProxyFix.__call__)rrrrr) __name__ __module__ __qualname____doc__intrtOptionalstrrIterablebytesr'rrrrr"s(= r) r+typingr-httpr TYPE_CHECKINGZ_typeshed.wsgirrrrrrrrs