diff --git a/examples/__globals__.py b/examples/__globals__.py index 9893ba9..afce5cd 100644 --- a/examples/__globals__.py +++ b/examples/__globals__.py @@ -26,7 +26,8 @@ async def _on_request(self, **server): async def _on_response(self, **server): response = server['response'] - del response.headers[b'x-debug'] + if not response.headers_sent(): + del response.headers[b'x-debug'] app.logger.info('entering %s', __file__) diff --git a/httpout/httpout.py b/httpout/httpout.py index bade490..63d71a4 100644 --- a/httpout/httpout.py +++ b/httpout/httpout.py @@ -231,11 +231,6 @@ async def _on_request(self, **server): else: server['websocket'] = None - excludes = (server['response'].print, - server['response'].run_coroutine, - g.wait, - *server.values()) - server['REQUEST_METHOD'] = request.method.decode('latin-1') server['SCRIPT_NAME'] = module_path[len(document_root):].replace( os.sep, '/' @@ -278,7 +273,7 @@ async def _on_request(self, **server): await server['response'].handle_exception(exc) finally: await g.executor.submit( - cleanup_modules, server['modules'], excludes + cleanup_modules, server['modules'], g.options['debug'] ) await server['response'].join() server['modules'].clear() diff --git a/httpout/utils/modules.py b/httpout/utils/modules.py index d0e1696..fd74768 100644 --- a/httpout/utils/modules.py +++ b/httpout/utils/modules.py @@ -1,6 +1,7 @@ # Copyright (c) 2024 nggit import os +import sys from types import ModuleType @@ -19,13 +20,24 @@ def exec_module(module, code=None, max_size=8 * 1048576): exec(code, module.__dict__) # nosec B102 -def cleanup_modules(modules, excludes=()): +def cleanup_modules(modules, debug=0): + if debug: + if debug == 1: + print(' cleanup_modules:') + + debug += 4 + for module_name, module in modules.items(): module_dict = getattr(module, '__dict__', None) if module_dict: for name, value in module_dict.items(): - if value in excludes or name.startswith('__'): + if name.startswith('__'): + continue + + value_module = getattr(value, '__module__', '__main__') + + if value_module != '__main__' and value_module in sys.modules: continue if not (value is module or @@ -33,9 +45,16 @@ def cleanup_modules(modules, excludes=()): value_dict = getattr(value, '__dict__', None) if value_dict: - cleanup_modules(value_dict, excludes) + cleanup_modules(value_dict, debug) module_dict[name] = None + if debug: + print(' ' * debug, ',-- deleted:', name, value) + if not module_name.startswith('__'): modules[module_name] = None + + if debug: + print(' ' * debug, '|') + print(' ' * debug, 'deleted:', module_name, module) diff --git a/httpout/utils/modules.pyx b/httpout/utils/modules.pyx index b2b0198..32fcb5f 100644 --- a/httpout/utils/modules.pyx +++ b/httpout/utils/modules.pyx @@ -1,5 +1,7 @@ # Copyright (c) 2024 nggit +import sys + from types import ModuleType from libc.stdio cimport (FILE, fopen, fclose, fread, feof, ferror, @@ -50,16 +52,27 @@ def exec_module(module, code=None, size_t max_size=8 * 1048576): exec(code, module.__dict__) -def cleanup_modules(modules, tuple excludes=()): +def cleanup_modules(modules, int debug=0): cdef str module_name, name cdef dict module_dict, value_dict + if debug: + if debug == 1: + print(' cleanup_modules:') + + debug += 4 + for module_name, module in modules.items(): module_dict = getattr(module, '__dict__', None) if module_dict: for name, value in module_dict.items(): - if value in excludes or name.startswith('__'): + if name.startswith('__'): + continue + + value_module = getattr(value, '__module__', '__main__') + + if value_module != '__main__' and value_module in sys.modules: continue if not (value is module or @@ -67,9 +80,16 @@ def cleanup_modules(modules, tuple excludes=()): value_dict = getattr(value, '__dict__', None) if value_dict: - cleanup_modules(value_dict, excludes) + cleanup_modules(value_dict, debug) module_dict[name] = None + if debug: + print(' ' * debug, ',-- deleted:', name, value) + if not module_name.startswith('__'): modules[module_name] = None + + if debug: + print(' ' * debug, '|') + print(' ' * debug, 'deleted:', module_name, module)