From 36faba9c95002a455555988bf142c4bc932f8f1b Mon Sep 17 00:00:00 2001 From: marc-ckl Date: Wed, 11 Jun 2025 17:25:20 -0300 Subject: [PATCH 1/2] remove websocket from backend --- .swirl | 1 + .vscode/settings.json | 7 ++++ DevUtils/nginx/nginx.conf | 1 - swirl/consumers.py | 87 --------------------------------------- swirl/middleware.py | 60 --------------------------- swirl_server/routing.py | 15 +------ 6 files changed, 10 insertions(+), 161 deletions(-) create mode 100644 .swirl create mode 100644 .vscode/settings.json delete mode 100644 swirl/consumers.py diff --git a/.swirl b/.swirl new file mode 100644 index 000000000..ca7c9b499 --- /dev/null +++ b/.swirl @@ -0,0 +1 @@ +{"django": 79498, "celery-worker": 79534} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..5bbc76b1e --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "python.testing.pytestArgs": [ + "swirl" + ], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true +} \ No newline at end of file diff --git a/DevUtils/nginx/nginx.conf b/DevUtils/nginx/nginx.conf index ebd5dc9c4..25d12aae6 100644 --- a/DevUtils/nginx/nginx.conf +++ b/DevUtils/nginx/nginx.conf @@ -18,7 +18,6 @@ server { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; - # WebSocket specific proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; diff --git a/swirl/consumers.py b/swirl/consumers.py deleted file mode 100644 index 635c641e7..000000000 --- a/swirl/consumers.py +++ /dev/null @@ -1,87 +0,0 @@ -import json -from channels.generic.websocket import AsyncWebsocketConsumer -from channels.db import database_sync_to_async -from swirl.models import Result, Search -from swirl.processors import * -import asyncio - -import logging -logger = logging.getLogger(__name__) - -instances = {} - -class Consumer(AsyncWebsocketConsumer): - async def connect(self): - try: - if not self.scope['user'].is_authenticated or not self.scope['search_id']: - await self.close(code=403) - - await self.accept() - except Exception as e: - await self.close(code=403) - - - @database_sync_to_async - def get_rag_result(self, search_id, rag_query_items): - isRagItemsUpdated = False - try: - rag_result = Result.objects.get(search_id=search_id, searchprovider='ChatGPT') - isRagItemsUpdated = True - isRagItemsUpdated = not(set(rag_result.json_results[0]['rag_query_items']) == set(rag_query_items)) - except: - pass - try: - rag_result = Result.objects.get(search_id=search_id, searchprovider='ChatGPT') - isRagItemsUpdated = not(set(rag_result.json_results[0]['rag_query_items']) == set(rag_query_items)) - if rag_result and not isRagItemsUpdated: - if rag_result.json_results[0]['body'][0]: - return rag_result.json_results[0]['body'][0] - return False - except: - pass - rag_processor = RAGPostResultProcessor(search_id=search_id, request_id='', should_get_results=True, rag_query_items=rag_query_items) - instances[search_id] = rag_processor - if rag_processor.validate(): - result = rag_processor.process(should_return=True) - try: - if search_id in instances: - del instances[search_id] - return result.json_results[0]['body'][0] - except: - if search_id in instances: - del instances[search_id] - return False - - async def process_rag(self, search_id, rag_query_items): - result = await self.get_rag_result(search_id, rag_query_items) - if result: - await self.send(text_data=json.dumps({ - 'message': result - })) - else: - await self.send(text_data=json.dumps({ - 'message': 'No data' - })) - - def stop_rag_processor(self, search_id): - if search_id in instances: - instance = instances[search_id] - if instance.tasks: - for task in instance.tasks: - task.revoke() - instance.stop_processing() - - async def receive(self, text_data): - data = json.loads(text_data) - message = data.get('message', '') - search_id = str(self.scope['search_id']) - if message == 'stop': - self.stop_rag_processor(search_id=search_id) - else: - try: - rag_query_items = self.scope['rag_query_items'] - asyncio.create_task(self.process_rag(search_id, rag_query_items)) - except: - await self.send(text_data=json.dumps({ - 'message': 'No data' - })) \ No newline at end of file diff --git a/swirl/middleware.py b/swirl/middleware.py index 596e8b447..c54e8e851 100644 --- a/swirl/middleware.py +++ b/swirl/middleware.py @@ -1,11 +1,6 @@ from rest_framework.authtoken.models import Token from django.http import HttpResponseForbidden, HttpResponse -from swirl.models import Search from swirl.authenticators import * -from channels.middleware import BaseMiddleware -from channels.db import database_sync_to_async -from urllib.parse import parse_qs -from django.core.exceptions import ObjectDoesNotExist import json import yaml import jwt @@ -59,61 +54,6 @@ def __call__(self, request): logger.debug(f'SpyglassAuthenticatorsMiddleware - No action') return self.get_response(request) - -class WebSocketTokenMiddleware(BaseMiddleware): - async def __call__(self, scope, receive, send): - query_string = scope.get("query_string", b"").decode("utf-8") - query_params = parse_qs(query_string) - token_key = query_params.get("token", [""])[0] - rag_query_items = query_params.get("rag_items", [""])[0] - if rag_query_items: - scope['rag_query_items'] = rag_query_items.split(',') - else: - scope['rag_query_items'] = [] - - ### DJANGO TOKEN CHECKING - - if token_key: - logger.debug(f'WebSocketTokenMiddleware - Token exists') - user = await self.get_user_from_token(token_key) - if user: - logger.debug(f'WebSocketTokenMiddleware - Token is valid') - scope["user"] = user - print(user.username) - - search_id = query_params.get("search_id", [""])[0] - if search_id: - logger.debug(f'WebSocketTokenMiddleware - Search ID exists') - found = await self.get_search_by_id_and_user(search_id, user) - if found: - logger.debug(f'WebSocketTokenMiddleware - Search for current user {user} was found') - scope["search_id"] = search_id - else: - logger.debug(f'WebSocketTokenMiddleware - Search for current user {user} was not found') - else: - logger.debug(f'WebSocketTokenMiddleware - Search ID does not exist') - else: - logger.debug(f'WebSocketTokenMiddleware - Token is not valid') - else: - logger.debug(f'WebSocketTokenMiddleware - Token does not exist') - - return await super().__call__(scope, receive, send) - - - @database_sync_to_async - def get_user_from_token(self, token_key): - try: - return Token.objects.get(key=token_key).user - except Token.DoesNotExist: - return None - - @database_sync_to_async - def get_search_by_id_and_user(self, search_id, user): - try: - return Search.objects.filter(pk=search_id, owner=user).exists() - except ObjectDoesNotExist: - return None - class SwaggerMiddleware: def __init__(self, get_response): self.get_response = get_response diff --git a/swirl_server/routing.py b/swirl_server/routing.py index 6fcef0623..c29a31f13 100644 --- a/swirl_server/routing.py +++ b/swirl_server/routing.py @@ -1,17 +1,6 @@ -from channels.routing import ProtocolTypeRouter, URLRouter -from channels.auth import AuthMiddlewareStack -from swirl.middleware import WebSocketTokenMiddleware # Import the TokenAuthMiddleware -from django.urls import path +from channels.routing import ProtocolTypeRouter from django.core.asgi import get_asgi_application -from swirl.consumers import Consumer application = ProtocolTypeRouter({ - 'http': get_asgi_application(), - 'websocket': WebSocketTokenMiddleware( - AuthMiddlewareStack( - URLRouter([ - path('chatgpt-data', Consumer.as_asgi()), - ]) - ) - ) + 'http': get_asgi_application() }) \ No newline at end of file From 76c5859e08bed19ad606a7e005b31dcdf334fc45 Mon Sep 17 00:00:00 2001 From: marc-ckl Date: Mon, 30 Jun 2025 18:58:52 -0300 Subject: [PATCH 2/2] remove files --- .swirl | 1 - .vscode/settings.json | 7 ------- 2 files changed, 8 deletions(-) delete mode 100644 .swirl delete mode 100644 .vscode/settings.json diff --git a/.swirl b/.swirl deleted file mode 100644 index ca7c9b499..000000000 --- a/.swirl +++ /dev/null @@ -1 +0,0 @@ -{"django": 79498, "celery-worker": 79534} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 5bbc76b1e..000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "python.testing.pytestArgs": [ - "swirl" - ], - "python.testing.unittestEnabled": false, - "python.testing.pytestEnabled": true -} \ No newline at end of file