Merge branch 'main' of github.com:sanic-org/sanic into http3

This commit is contained in:
Adam Hopkins 2022-02-22 09:24:46 +02:00
commit 067316af16
No known key found for this signature in database
GPG Key ID: 9F85EE6C807303FB
5 changed files with 32 additions and 8 deletions

View File

@ -1268,10 +1268,9 @@ class Sanic(BaseSanic, RunnerMixin, metaclass=TouchUpMeta):
... ...
def purge_tasks(self): def purge_tasks(self):
for task in self.tasks: for key, task in self._task_registry.items():
if task.done() or task.cancelled(): if task.done() or task.cancelled():
name = task.get_name() self._task_registry[key] = None
self._task_registry[name] = None
self._task_registry = { self._task_registry = {
k: v for k, v in self._task_registry.items() if v is not None k: v for k, v in self._task_registry.items() if v is not None

View File

@ -18,7 +18,7 @@ Options = Dict[str, Union[int, str]] # key=value fields in various headers
OptionsIterable = Iterable[Tuple[str, str]] # May contain duplicate keys OptionsIterable = Iterable[Tuple[str, str]] # May contain duplicate keys
_token, _quoted = r"([\w!#$%&'*+\-.^_`|~]+)", r'"([^"]*)"' _token, _quoted = r"([\w!#$%&'*+\-.^_`|~]+)", r'"([^"]*)"'
_param = re.compile(fr";\s*{_token}=(?:{_token}|{_quoted})", re.ASCII) _param = re.compile(rf";\s*{_token}=(?:{_token}|{_quoted})", re.ASCII)
_firefox_quote_escape = re.compile(r'\\"(?!; |\s*$)') _firefox_quote_escape = re.compile(r'\\"(?!; |\s*$)')
_ipv6 = "(?:[0-9A-Fa-f]{0,4}:){2,7}[0-9A-Fa-f]{0,4}" _ipv6 = "(?:[0-9A-Fa-f]{0,4}:){2,7}[0-9A-Fa-f]{0,4}"
_ipv6_re = re.compile(_ipv6) _ipv6_re = re.compile(_ipv6)

View File

@ -16,9 +16,9 @@ class MiddlewareMixin(metaclass=SanicMeta):
self, middleware_or_request, attach_to="request", apply=True self, middleware_or_request, attach_to="request", apply=True
): ):
""" """
Decorate and register middleware to be called before a request. Decorate and register middleware to be called before a request
Can either be called as *@app.middleware* or is handled or after a response is created. Can either be called as
*@app.middleware('request')* *@app.middleware* or *@app.middleware('request')*.
`See user guide re: middleware `See user guide re: middleware
<https://sanicframework.org/guide/basics/middleware.html>`__ <https://sanicframework.org/guide/basics/middleware.html>`__
@ -47,12 +47,25 @@ class MiddlewareMixin(metaclass=SanicMeta):
) )
def on_request(self, middleware=None): def on_request(self, middleware=None):
"""Register a middleware to be called before a request is handled.
This is the same as *@app.middleware('request')*.
:param: middleware: A callable that takes in request.
"""
if callable(middleware): if callable(middleware):
return self.middleware(middleware, "request") return self.middleware(middleware, "request")
else: else:
return partial(self.middleware, attach_to="request") return partial(self.middleware, attach_to="request")
def on_response(self, middleware=None): def on_response(self, middleware=None):
"""Register a middleware to be called after a response is created.
This is the same as *@app.middleware('response')*.
:param: middleware:
A callable that takes in a request and its response.
"""
if callable(middleware): if callable(middleware):
return self.middleware(middleware, "response") return self.middleware(middleware, "response")
else: else:

View File

@ -80,6 +80,18 @@ async def test_purge_tasks(app: Sanic):
assert len(app._task_registry) == 0 assert len(app._task_registry) == 0
async def test_purge_tasks_with_create_task(app: Sanic):
app.add_task(asyncio.create_task(dummy(3)), name="dummy")
await app.cancel_task("dummy")
assert len(app._task_registry) == 1
app.purge_tasks()
assert len(app._task_registry) == 0
def test_shutdown_tasks_on_app_stop(): def test_shutdown_tasks_on_app_stop():
class TestSanic(Sanic): class TestSanic(Sanic):
shutdown_tasks = Mock() shutdown_tasks = Mock()