| 48 | # Support reverse proxying |
| 49 | ########################################################################## |
| 50 | class ReverseProxied(): |
| 51 | def __init__(self, app): |
| 52 | self.app = app |
| 53 | # https://werkzeug.palletsprojects.com/en/0.15.x/middleware/proxy_fix |
| 54 | try: |
| 55 | from werkzeug.middleware.proxy_fix import ProxyFix |
| 56 | self.app = ProxyFix(app, |
| 57 | x_for=config.PROXY_X_FOR_COUNT, |
| 58 | x_proto=config.PROXY_X_PROTO_COUNT, |
| 59 | x_host=config.PROXY_X_HOST_COUNT, |
| 60 | x_port=config.PROXY_X_PORT_COUNT, |
| 61 | x_prefix=config.PROXY_X_PREFIX_COUNT |
| 62 | ) |
| 63 | except ImportError: |
| 64 | pass |
| 65 | |
| 66 | def __call__(self, environ, start_response): |
| 67 | script_name = environ.get("HTTP_X_SCRIPT_NAME", "") |
| 68 | if script_name: |
| 69 | environ["SCRIPT_NAME"] = script_name |
| 70 | path_info = environ["PATH_INFO"] |
| 71 | if path_info.startswith(script_name): |
| 72 | environ["PATH_INFO"] = path_info[len(script_name):] |
| 73 | scheme = environ.get("HTTP_X_SCHEME", "") |
| 74 | if scheme: |
| 75 | environ["wsgi.url_scheme"] = scheme |
| 76 | return self.app(environ, start_response) |
| 77 | |
| 78 | |
| 79 | ########################################################################## |