Merge branch 'main' of github.com:sanic-org/sanic into http3
This commit is contained in:
commit
067316af16
@ -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
|
||||||
|
@ -42,7 +42,7 @@ DEFAULT_CONFIG = {
|
|||||||
"REQUEST_TIMEOUT": 60, # 60 seconds
|
"REQUEST_TIMEOUT": 60, # 60 seconds
|
||||||
"RESPONSE_TIMEOUT": 60, # 60 seconds
|
"RESPONSE_TIMEOUT": 60, # 60 seconds
|
||||||
"USE_UVLOOP": _default,
|
"USE_UVLOOP": _default,
|
||||||
"WEBSOCKET_MAX_SIZE": 2 ** 20, # 1 megabyte
|
"WEBSOCKET_MAX_SIZE": 2**20, # 1 megabyte
|
||||||
"WEBSOCKET_PING_INTERVAL": 20,
|
"WEBSOCKET_PING_INTERVAL": 20,
|
||||||
"WEBSOCKET_PING_TIMEOUT": 20,
|
"WEBSOCKET_PING_TIMEOUT": 20,
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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:
|
||||||
|
@ -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()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user