v3.8.0
Features
-
Added a
GunicornWebWorker
feature for extending the aiohttp server configuration by allowing the 'wsgi' coroutine to returnweb.AppRunner
object.
(#2988)_ -
Switch from
http-parser
tollhttp
(#3561)_ -
Use Brotli instead of brotlipy
(#3803)_ -
Disable implicit switch-back to pure python mode. The build fails loudly if aiohttp
cannot be compiled with C Accelerators. Use AIOHTTP_NO_EXTENSIONS=1 to explicitly
disable C Extensions complication and switch to Pure-Python mode. Note that Pure-Python
mode is significantly slower than compiled one.
(#3828)_ -
Make access log use local time with timezone
(#3853)_ -
Implemented
readuntil
inStreamResponse
(#4054)_ -
FileResponse now supports ETag.
(#4594)_ -
Add a request handler type alias
aiohttp.typedefs.Handler
.
(#4686)_ -
AioHTTPTestCase
is more async friendly now.For people who use unittest and are used to use :py:exc:
~unittest.TestCase
it will be easier to write new test cases like the sync version of the :py:exc:~unittest.TestCase
class,
without using the decorator@unittest_run_loop
, justasync def test_*
.
The only difference is that for the people using python3.7 and below a new dependency is needed, it isasynctestcase
.
(#4700)_ -
Add validation of HTTP header keys and values to prevent header injection.
(#4818)_ -
Add predicate to
AbstractCookieJar.clear
.
AddAbstractCookieJar.clear_domain
to clean all domain and subdomains cookies only.
(#4942)_ -
Add keepalive_timeout parameter to web.run_app.
(#5094)_ -
Tracing for client sent headers
(#5105)_ -
Make type hints for http parser stricter
(#5267)_ -
Add final declarations for constants.
(#5275)_ -
Switch to external frozenlist and aiosignal libraries.
(#5293)_ -
Don't send secure cookies by insecure transports.
By default, the transport is secure if https or wss scheme is used.
UseCookieJar(treat_as_secure_origin="http://127.0.0.1")
to override the default security checker.
(#5571)_ -
Always create a new event loop in
aiohttp.web.run_app()
.
This adds better compatibility withasyncio.run()
or if trying to run multiple apps in sequence.
(#5572)_ -
Add
aiohttp.pytest_plugin.AiohttpClient
for static typing of pytest plugin.
(#5585)_ -
Added a
socket_factory
argument toBaseTestServer
.
(#5844)_ -
Add compression strategy parameter to enable_compression method.
(#5909)_ -
Added support for Python 3.10 to Github Actions CI/CD workflows and fix the related deprecation warnings -- :user:
Hanaasagi
.
(#5927)_ -
Switched
chardet
tocharset-normalizer
for guessing the HTTP payload body encoding -- :user:Ousret
.
(#5930)_ -
Added optional auto_decompress argument for HttpRequestParser
(#5957)_ -
Added support for HTTPS proxies to the extent CPython's
:py:mod:asyncio
supports it -- by :user:bmbouter
,
:user:jborean93
and :user:webknjaz
.
(#5992)_ -
Added
base_url
parameter to the initializer of :class:~aiohttp.ClientSession
.
(#6013)_ -
Add Trove classifier and create binary wheels for 3.10. -- :user:
hugovk
.
(#6079)_ -
Started shipping platform-specific wheels with the
musl
tag targeting typical Alpine Linux runtimes — :user:asvetlov
.
(#6139)_ -
Started shipping platform-specific arm64 wheels for Apple Silicon — :user:
asvetlov
.
(#6139)_
Bugfixes
- Modify drain_helper() to handle concurrent
await resp.write(...)
orws.send_json(...)
calls without race-condition.
(#2934) - Started using
MultiLoopChildWatcher
when it's available under POSIX while setting up the test I/O loop.
(#3450)_ - Only encode content-disposition filename parameter using percent-encoding.
Other parameters are encoded to quoted-string or RFC2231 extended parameter
value.
(#4012)_ - Fixed HTTP client requests to honor
no_proxy
environment variables.
(#4431)_ - Fix supporting WebSockets proxies configured via environment variables.
(#4648)_ - Change return type on URLDispatcher to UrlMappingMatchInfo to improve type annotations.
(#4748)_ - Ensure a cleanup context is cleaned up even when an exception occurs during startup.
(#4799)_ - Added a new exception type for Unix socket client errors which provides a more useful error message.
(#4984)_ - Remove Transfer-Encoding and Content-Type headers for 204 in StreamResponse
(#5106)_ - Only depend on typing_extensions for Python <3.8
(#5107)_ - Add ABNORMAL_CLOSURE and BAD_GATEWAY to WSCloseCode
(#5192)_ - Fix cookies disappearing from HTTPExceptions.
(#5233)_ - StaticResource prefixes no longer match URLs with a non-folder prefix. For example
routes.static('/foo', '/foo')
no longer matches the URL/foobar
. Previously, this would attempt to load the file/foo/ar
.
(#5250)_ - Acquire the connection before running traces to prevent race condition.
(#5259)_ - Add missing slots to ```_RequestContextManager
and
WSRequestContextManager``
(#5329) - Ensure sending a zero byte file does not throw an exception (round 2)
(#5380)_ - Set "text/plain" when data is an empty string in client requests.
(#5392)_ - Stop automatically releasing the
ClientResponse
object on calls to theok
property for the failed requests.
(#5403)_ - Include query parameters from
params
keyword argument in tracingURL
.
(#5432)_ - Fix annotations
(#5466)_ - Fixed the multipart POST requests processing to always release file
descriptors for thetempfile.Temporaryfile
-created
_io.BufferedRandom
instances of files sent within multipart request
bodies via HTTP POST requests -- by :user:webknjaz
.
(#5494)_ - Fix 0 being incorrectly treated as an immediate timeout.
(#5527)_ - Fixes failing tests when an environment variable proxy is set.
(#5554) - Replace deprecated app handler design in
tests/autobahn/server.py
with call toweb.run_app
; replace deprecatedaiohttp.ws_connect
calls intests/autobahn/client.py
withaiohttp.ClienSession.ws_connect
.
(#5606)_ - Fixed test for
HTTPUnauthorized
that access thetext
argument. This is not used in any part of the code, so it's removed now.
(#5657)_ - Remove incorrect default from docs
(#5727)_ - Remove external test dependency to http://httpbin.org
(#5840)_ - Don't cancel current task when entering a cancelled timer.
(#5853)_ - Added
params
keyword argument toClientSession.ws_connect
. -- :user:hoh
.
(#5868)_ - Uses :py:class:
~asyncio.ThreadedChildWatcher
under POSIX to allow setting up test loop in non-main thread.
(#5877)_ - Fix the error in handling the return value of
getaddrinfo
.
getaddrinfo
will return an(int, bytes)
tuple, if CPython could not handle the address family.
It will cause a index out of range error in aiohttp. For example, if user compile CPython with
--disable-ipv6
option but his system enable the ipv6.
(#5901)_ - Removed the deprecated
loop
argument from theasyncio.sleep
/gather
calls
(#5905)_ - Return
None
fromrequest.if_modified_since
,request.if_unmodified_since
,request.if_range
andresponse.last_modified
when corresponding http date headers are invalid.
(#5925)_ - Fix resetting
SIGCHLD
signals in Gunicorn aiohttp Worker to fixsubprocesses
that capture output having an incorrectreturncode
.
(#6130)_ - Raise
400: Content-Length can't be present with Transfer-Encoding
if bothContent-Length
andTransfer-Encoding
are sent by peer by both C and Python implementations
(#6182)_
Improved Documentation
- Refactored OpenAPI/Swagger aiohttp addons, added
aio-openapi
(#5326)_ - Fixed docs on request cookies type, so it matches what is actually used in the code (a
read-only dictionary-like object).
(#5725)_ - Documented that the HTTP client
Authorization
header is removed
on redirects to a different host or protocol.
(#5850)_
Misc
- (#3927), (#4247), (#4247), (#5389), (#5457), (#5486), (#5494), (#5515), (#5625), (#5635), (#5648), (#5657), (#5890), (#5914), (#5932), (#6002), (#6045), (#6131), (#6156), (#6165), (#6166)_
3.7.4.post0 (2021-03-06)
Misc
- Bumped upper bound of the
chardet
runtime dependency
to allow their v4.0 version stream.
(#5366)_