Browse Source

Merge pull request #1501 from zauberzeug/redirect_middleware

adhere forwarded-prefix for redirects
Falko Schindler 1 year ago
parent
commit
040f531ed5
3 changed files with 20 additions and 6 deletions
  1. 14 0
      nicegui/middlewares.py
  2. 5 5
      nicegui/nicegui.py
  3. 1 1
      nicegui/storage.py

+ 14 - 0
nicegui/middlewares.py

@@ -0,0 +1,14 @@
+from starlette.middleware.base import BaseHTTPMiddleware, RequestResponseEndpoint
+from starlette.requests import Request
+from starlette.responses import Response
+
+
+class RedirectWithPrefixMiddleware(BaseHTTPMiddleware):
+
+    async def dispatch(self, request: Request, call_next: RequestResponseEndpoint) -> Response:
+        prefix = request.headers.get('X-Forwarded-Prefix', '')
+        response = await call_next(request)
+        if 'Location' in response.headers:
+            new_location = prefix + response.headers['Location']
+            response.headers['Location'] = new_location
+        return response

+ 5 - 5
nicegui/nicegui.py

@@ -10,17 +10,16 @@ from fastapi.responses import FileResponse, Response
 from fastapi.staticfiles import StaticFiles
 from fastapi_socketio import SocketManager
 
-from nicegui import json
-from nicegui.json import NiceGUIJSONResponse
-
-from . import (__version__, background_tasks, binding, favicon, globals, outbox,  # pylint: disable=redefined-builtin
-               welcome)
+from . import (__version__, background_tasks, binding, favicon, globals, json,  # pylint: disable=redefined-builtin
+               outbox, welcome)
 from .app import App
 from .client import Client
 from .dependencies import js_components, libraries
 from .element import Element
 from .error import error_content
 from .helpers import is_file, safe_invoke
+from .json import NiceGUIJSONResponse
+from .middlewares import RedirectWithPrefixMiddleware
 from .page import page
 
 globals.app = app = App(default_response_class=NiceGUIJSONResponse)
@@ -29,6 +28,7 @@ socket_manager = SocketManager(app=app, mount_location='/_nicegui_ws/', json=jso
 globals.sio = sio = socket_manager._sio  # pylint: disable=protected-access
 
 app.add_middleware(GZipMiddleware)
+app.add_middleware(RedirectWithPrefixMiddleware)
 static_files = StaticFiles(
     directory=(Path(__file__).parent / 'static').resolve(),
     follow_symlink=True,

+ 1 - 1
nicegui/storage.py

@@ -6,8 +6,8 @@ from pathlib import Path
 from typing import Any, Dict, Iterator, Optional, Union
 
 import aiofiles
-from fastapi import Request
 from starlette.middleware.base import BaseHTTPMiddleware, RequestResponseEndpoint
+from starlette.requests import Request
 from starlette.responses import Response
 
 from . import background_tasks, globals, observables  # pylint: disable=redefined-builtin