From 88bc6d896618900e64aa1b9752bc049588241715 Mon Sep 17 00:00:00 2001 From: Adam Hopkins Date: Wed, 2 Feb 2022 10:41:55 +0200 Subject: [PATCH 1/3] Upgrade black and isort changes (#2397) --- sanic/config.py | 2 +- sanic/headers.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sanic/config.py b/sanic/config.py index ac147ef3..2e387ebd 100644 --- a/sanic/config.py +++ b/sanic/config.py @@ -39,7 +39,7 @@ DEFAULT_CONFIG = { "REQUEST_TIMEOUT": 60, # 60 seconds "RESPONSE_TIMEOUT": 60, # 60 seconds "USE_UVLOOP": _default, - "WEBSOCKET_MAX_SIZE": 2 ** 20, # 1 megabyte + "WEBSOCKET_MAX_SIZE": 2**20, # 1 megabyte "WEBSOCKET_PING_INTERVAL": 20, "WEBSOCKET_PING_TIMEOUT": 20, } diff --git a/sanic/headers.py b/sanic/headers.py index b4457653..5e4ded03 100644 --- a/sanic/headers.py +++ b/sanic/headers.py @@ -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 _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*$)') _ipv6 = "(?:[0-9A-Fa-f]{0,4}:){2,7}[0-9A-Fa-f]{0,4}" _ipv6_re = re.compile(_ipv6) From 68b654d98173f66f2a52aec3c846d688aefa0a5b Mon Sep 17 00:00:00 2001 From: Ryu juheon Date: Tue, 8 Feb 2022 15:33:09 +0900 Subject: [PATCH 2/3] fix(tasks): newly assigned ``None`` in registry (#2381) --- sanic/app.py | 5 ++--- tests/test_tasks.py | 12 ++++++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/sanic/app.py b/sanic/app.py index 5f3a0438..625962a7 100644 --- a/sanic/app.py +++ b/sanic/app.py @@ -1268,10 +1268,9 @@ class Sanic(BaseSanic, RunnerMixin, metaclass=TouchUpMeta): ... def purge_tasks(self): - for task in self.tasks: + for key, task in self._task_registry.items(): if task.done() or task.cancelled(): - name = task.get_name() - self._task_registry[name] = None + self._task_registry[key] = None self._task_registry = { k: v for k, v in self._task_registry.items() if v is not None diff --git a/tests/test_tasks.py b/tests/test_tasks.py index 63de50af..8396a9f9 100644 --- a/tests/test_tasks.py +++ b/tests/test_tasks.py @@ -80,6 +80,18 @@ async def test_purge_tasks(app: Sanic): 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(): class TestSanic(Sanic): shutdown_tasks = Mock() From d4fb44e9862c367c2bf1426a011c47e7df57abe5 Mon Sep 17 00:00:00 2001 From: Bluenix Date: Sun, 13 Feb 2022 20:08:08 +0100 Subject: [PATCH 3/3] Document middleware `on_request` and `on_response` (#2398) --- sanic/mixins/middleware.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/sanic/mixins/middleware.py b/sanic/mixins/middleware.py index 1049aacf..5ef9dc77 100644 --- a/sanic/mixins/middleware.py +++ b/sanic/mixins/middleware.py @@ -16,9 +16,9 @@ class MiddlewareMixin(metaclass=SanicMeta): self, middleware_or_request, attach_to="request", apply=True ): """ - Decorate and register middleware to be called before a request. - Can either be called as *@app.middleware* or - *@app.middleware('request')* + Decorate and register middleware to be called before a request + is handled or after a response is created. Can either be called as + *@app.middleware* or *@app.middleware('request')*. `See user guide re: middleware `__ @@ -47,12 +47,25 @@ class MiddlewareMixin(metaclass=SanicMeta): ) 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): return self.middleware(middleware, "request") else: return partial(self.middleware, attach_to="request") 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): return self.middleware(middleware, "response") else: