Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion examples/__globals__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__)
Expand Down
7 changes: 1 addition & 6 deletions httpout/httpout.py
Original file line number Diff line number Diff line change
Expand Up @@ -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, '/'
Expand Down Expand Up @@ -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()
Expand Down
25 changes: 22 additions & 3 deletions httpout/utils/modules.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Copyright (c) 2024 nggit

import os
import sys

from types import ModuleType

Expand All @@ -19,23 +20,41 @@ 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
isinstance(value, (type, ModuleType))):
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)
26 changes: 23 additions & 3 deletions httpout/utils/modules.pyx
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# Copyright (c) 2024 nggit

import sys

from types import ModuleType

from libc.stdio cimport (FILE, fopen, fclose, fread, feof, ferror,
Expand Down Expand Up @@ -50,26 +52,44 @@ 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
isinstance(value, (type, ModuleType))):
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)