123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- import inspect
- from .sync import iscoroutinefunction
- def is_double_callable(application):
- """
- Tests to see if an application is a legacy-style (double-callable) application.
- """
-
- if getattr(application, "_asgi_single_callable", False):
- return False
- if getattr(application, "_asgi_double_callable", False):
- return True
-
- if inspect.isclass(application):
- return True
-
- if hasattr(application, "__call__"):
-
-
- if iscoroutinefunction(application.__call__):
- return False
-
- return not iscoroutinefunction(application)
- def double_to_single_callable(application):
- """
- Transforms a double-callable ASGI application into a single-callable one.
- """
- async def new_application(scope, receive, send):
- instance = application(scope)
- return await instance(receive, send)
- return new_application
- def guarantee_single_callable(application):
- """
- Takes either a single- or double-callable application and always returns it
- in single-callable style. Use this to add backwards compatibility for ASGI
- 2.0 applications to your server/test harness/etc.
- """
- if is_double_callable(application):
- application = double_to_single_callable(application)
- return application
|