# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
from __future__ import annotations

from urllib.parse import urlparse

from flask import Flask
from werkzeug.middleware.dispatcher import DispatcherMiddleware
from werkzeug.middleware.proxy_fix import ProxyFix

from airflow.configuration import conf


def _root_app(_, resp):
    resp(b'404 Not Found', [('Content-Type', 'text/plain')])
    return [b'Apache Airflow is not at this location']


def init_wsgi_middleware(flask_app: Flask):
    """Handle X-Forwarded-* headers and base_url support"""
    # Apply DispatcherMiddleware
    base_url = urlparse(conf.get('webserver', 'base_url'))[2]
    if not base_url or base_url == '/':
        base_url = ""
    if base_url:
        flask_app.wsgi_app = DispatcherMiddleware(  # type: ignore
            _root_app, mounts={base_url: flask_app.wsgi_app}  # type: ignore
        )

    # Apply ProxyFix middleware
    if conf.getboolean('webserver', 'ENABLE_PROXY_FIX'):
        flask_app.wsgi_app = ProxyFix(  # type: ignore
            flask_app.wsgi_app,
            x_for=conf.getint("webserver", "PROXY_FIX_X_FOR", fallback=1),
            x_proto=conf.getint("webserver", "PROXY_FIX_X_PROTO", fallback=1),
            x_host=conf.getint("webserver", "PROXY_FIX_X_HOST", fallback=1),
            x_port=conf.getint("webserver", "PROXY_FIX_X_PORT", fallback=1),
            x_prefix=conf.getint("webserver", "PROXY_FIX_X_PREFIX", fallback=1),
        )

@@ -778,16 +778,17 @@
 icense.%0A
+%0A
 from __f
@@ -815,16 +815,59 @@
 ations%0A%0A
+from typing import TYPE_CHECKING, Iterable%0A
 from url
@@ -1077,31 +1077,165 @@
 nf%0A%0A
-%0Adef _root_app(_, resp)
+if TYPE_CHECKING:%0A    from _typeshed.wsgi import StartResponse, WSGIEnvironment%0A%0A%0Adef _root_app(env: WSGIEnvironment, resp: StartResponse) -%3E Iterable%5Bbytes%5D
 :%0A  
@@ -1241,17 +1241,16 @@
    resp(
-b
 '404 Not
@@ -1391,16 +1391,24 @@
 : Flask)
+ -%3E None
 :%0A    %22%22
@@ -1639,34 +1639,24 @@
 rl:%0A        
-flask_app.
 wsgi_app = D
@@ -1679,37 +1679,8 @@
 are(
-  # type: ignore%0A            
 _roo
@@ -1723,16 +1723,55 @@
 sgi_app%7D
+)%0A        flask_app.wsgi_app = wsgi_app
   # type
@@ -1778,26 +1778,28 @@
 : ignore
-%0A        )
+%5Bassignment%5D
 %0A%0A    # 

fix WSGI root app (#26549)