Features
- [2347](https://github.com/sanic-org/sanic/pull/2347) API for multi-application server
- 🚨 *BREAKING CHANGE*: The old `sanic.worker.GunicornWorker` has been **removed**. To run Sanic with `gunicorn`, you should use it thru `uvicorn` [as described in their docs](https://www.uvicorn.org/#running-with-gunicorn).
- 🧁 *SIDE EFFECT*: Named background tasks are now supported, even in Python 3.7
- [2357](https://github.com/sanic-org/sanic/pull/2357) Parse `Authorization` header as `Request.credentials`
- [2361](https://github.com/sanic-org/sanic/pull/2361) Add config option to skip `Touchup` step in application startup
- [2372](https://github.com/sanic-org/sanic/pull/2372) Updates to CLI help messaging
- [2382](https://github.com/sanic-org/sanic/pull/2382) Downgrade warnings to backwater debug messages
- [2396](https://github.com/sanic-org/sanic/pull/2396) Allow for `multidict` v0.6
- [2401](https://github.com/sanic-org/sanic/pull/2401) Upgrade CLI catching for alternative application run types
- [2402](https://github.com/sanic-org/sanic/pull/2402) Conditionally inject CLI arguments into factory
- [2413](https://github.com/sanic-org/sanic/pull/2413) Add new start and stop event listeners to reloader process
- [2414](https://github.com/sanic-org/sanic/pull/2414) Remove loop as required listener arg
- [2415](https://github.com/sanic-org/sanic/pull/2415) Better exception for bad URL parsing
- [sanic-routing47](https://github.com/sanic-org/sanic-routing/pull/47) Add a new extention parameter type: `<file:ext>`, `<file:ext=jpg>`, `<file:ext=jpg|png|gif|svg>`, `<file=int:ext>`, `<file=int:ext=jpg|png|gif|svg>`, `<file=float:ext=tar.gz>`
- 👶 *BETA FEATURE*: This feature will not work with `path` type matching, and is being released as a beta feature only.
- [sanic-routing57](https://github.com/sanic-org/sanic-routing/pull/57) Change `register_pattern` to accept a `str` or `Pattern`
- [sanic-routing58](https://github.com/sanic-org/sanic-routing/pull/58) Default matching on non-empty strings only, and new `strorempty` pattern type
- 🚨 *BREAKING CHANGE*: Previously a route with a dynamic string parameter (`/<foo>` or `/<foo:str>`) would match on any string, including empty strings. It will now **only** match a non-empty string. To retain the old behavior, you should use the new parameter type: `/<foo:strorempty>`.
Bugfixes
- [2373](https://github.com/sanic-org/sanic/pull/2373) Remove `error_logger` on websockets
- [2381](https://github.com/sanic-org/sanic/pull/2381) Fix newly assigned `None` in task registry
- [sanic-routing52](https://github.com/sanic-org/sanic-routing/pull/52) Add type casting to regex route matching
- [sanic-routing60](https://github.com/sanic-org/sanic-routing/pull/60) Add requirements check on regex routes (this resolves, for example, multiple static directories with differing `host` values)
Deprecations and Removals
- [2362](https://github.com/sanic-org/sanic/pull/2362) 22.3 Deprecations and changes
1. `debug=True` and `--debug` do _NOT_ automatically run `auto_reload`
2. Default error render is with plain text (browsers still get HTML by default because `auto` looks at headers)
3. `config` is required for `ErrorHandler.finalize`
4. `ErrorHandler.lookup` requires two positional args
5. Unused websocket protocol args removed
- [2344](https://github.com/sanic-org/sanic/pull/2344) Deprecate loading of lowercase environment variables
Developer infrastructure
- [2363](https://github.com/sanic-org/sanic/pull/2363) Revert code coverage back to Codecov
- [2405](https://github.com/sanic-org/sanic/pull/2405) Upgrade tests for `sanic-routing` changes
- [sanic-testing35](https://github.com/sanic-org/sanic-testing/pull/35) Allow for httpx v0.22
Improved Documentation
- [2350](https://github.com/sanic-org/sanic/pull/2350) Fix link in README for ASGI
- [2398](https://github.com/sanic-org/sanic/pull/2398) Document middleware on_request and on_response
- [2409](https://github.com/sanic-org/sanic/pull/2409) Add missing documentation for `Request.respond`
Miscellaneous
- [2376](https://github.com/sanic-org/sanic/pull/2376) Fix typing for `ListenerMixin.listener`
- [2383](https://github.com/sanic-org/sanic/pull/2383) Clear deprecation warning in `asyncio.wait`
- [2387](https://github.com/sanic-org/sanic/pull/2387) Cleanup `__slots__` implementations
- [2390](https://github.com/sanic-org/sanic/pull/2390) Clear deprecation warning in `asyncio.get_event_loop`