diff --git a/examples/middleware.py b/examples/middleware.py index 6122959..dd4de03 100644 --- a/examples/middleware.py +++ b/examples/middleware.py @@ -1,33 +1,5 @@ -from socketify import App +from socketify import App, middleware import inspect - -def middleware(*functions): - async def middleware_route(res, req): - data = None - some_async_as_run = False - #cicle to all middlewares - for function in functions: - #detect if is coroutine or not - if inspect.iscoroutinefunction(function): - #in async query string, arguments and headers are only valid until the first await - if not some_async_as_run: - #get_headers will preserve headers (and cookies) inside req, after await - headers = req.get_headers() - #get_parameters will preserve all params inside req after await - params = req.get_parameters() - #get queries will preserve all queries inside req after await - queries = req.get_queries() - #mark to only grab header, params and queries one time - some_async_as_run = True - data = await function(res, req, data) - else: - #call middlewares - data = function(res, req, data) - #stops if returns Falsy - if not data: - break - - return middleware_route async def get_user(authorization): if authorization: diff --git a/examples/middleware_async.py b/examples/middleware_async.py index 54f6a84..9164775 100644 --- a/examples/middleware_async.py +++ b/examples/middleware_async.py @@ -1,5 +1,6 @@ from socketify import App +#this is just an example of implementation you can just import using from socketify import middleware for an more complete version async def get_user(authorization): if authorization: diff --git a/examples/middleware_sync.py b/examples/middleware_sync.py index 682bc2d..0059e06 100644 --- a/examples/middleware_sync.py +++ b/examples/middleware_sync.py @@ -1,5 +1,6 @@ from socketify import App +#this is just an example of implementation you can just import using from socketify import middleware for an more complete version def middleware(*functions): def middleware_route(res, req): diff --git a/src/socketify/__init__.py b/src/socketify/__init__.py index 280b85b..ced0b45 100644 --- a/src/socketify/__init__.py +++ b/src/socketify/__init__.py @@ -1,2 +1,2 @@ -from .socketify import App, AppOptions, AppListenOptions, OpCode, SendStatus, CompressOptions +from .socketify import App, AppOptions, AppListenOptions, OpCode, SendStatus, CompressOptions, middleware from .helpers import sendfile \ No newline at end of file diff --git a/src/socketify/socketify.py b/src/socketify/socketify.py index 7fa2e1d..44a45f9 100644 --- a/src/socketify/socketify.py +++ b/src/socketify/socketify.py @@ -1826,3 +1826,30 @@ class AppOptions: self.ssl_ciphers = ssl_ciphers self.ssl_prefer_low_memory_usage = ssl_prefer_low_memory_usage +def middleware(*functions): + async def middleware_route(res, req): + data = None + some_async_as_run = False + #cicle to all middlewares + for function in functions: + #detect if is coroutine or not + if inspect.iscoroutinefunction(function): + #in async query string, arguments and headers are only valid until the first await + if not some_async_as_run: + #get_headers will preserve headers (and cookies) inside req, after await + headers = req.get_headers() + #get_parameters will preserve all params inside req after await + params = req.get_parameters() + #get queries will preserve all queries inside req after await + queries = req.get_queries() + #mark to only grab header, params and queries one time + some_async_as_run = True + data = await function(res, req, data) + else: + #call middlewares + data = function(res, req, data) + #stops if returns Falsy + if not data: + break + + return middleware_route \ No newline at end of file