From 9401f6c8217821489d7950d0c27e3a94d46591e3 Mon Sep 17 00:00:00 2001 From: Jun Siang Cheah Date: Sun, 8 Sep 2024 11:54:56 +0100 Subject: [PATCH] fix: workaround socketio upstream bug when websockets are not available --- backend/open_webui/main.py | 18 ++++++++++++++++++ src/routes/+layout.svelte | 13 +++---------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index 9e6aa6fab..73f51c7d7 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -812,6 +812,24 @@ async def update_embedding_function(request: Request, call_next): return response +@app.middleware("http") +async def inspect_websocket(request: Request, call_next): + if ( + "/ws/socket.io" in request.url.path + and request.query_params.get("transport") == "websocket" + ): + upgrade = (request.headers.get("Upgrade") or "").lower() + connection = (request.headers.get("Connection") or "").lower().split(",") + # Check that there's the correct headers for an upgrade, else reject the connection + # This is to work around this upstream issue: https://github.com/miguelgrinberg/python-engineio/issues/367 + if upgrade != "websocket" or "upgrade" not in connection: + return JSONResponse( + status_code=status.HTTP_400_BAD_REQUEST, + content={"detail": "Invalid WebSocket upgrade request"}, + ) + return await call_next(request) + + app.mount("/ws", socket_app) app.mount("/ollama", ollama_app) diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 9b209fec0..b71ac0d79 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -38,27 +38,20 @@ let loaded = false; const BREAKPOINT = 768; - const setupSocket = (websocket = true) => { + const setupSocket = () => { const _socket = io(`${WEBUI_BASE_URL}` || undefined, { reconnection: true, reconnectionDelay: 1000, reconnectionDelayMax: 5000, randomizationFactor: 0.5, path: '/ws/socket.io', - auth: { token: localStorage.token }, - transports: websocket ? ['websocket'] : ['polling'] + auth: { token: localStorage.token } }); socket.set(_socket); _socket.on('connect_error', (err) => { - if (err.message.includes('websocket')) { - console.log('WebSocket connection failed, falling back to polling'); - _socket.close(); - setupSocket(false); - } else { - console.log('connect_error', err); - } + console.log('connect_error', err); }); _socket.on('connect', () => {