- 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
- Do not install "examples" as a top-level package. #6189
- Restored ability to connect IPv6-only host. #6195
- Remove
Signal
from__all__
, replaceaiohttp.Signal
withaiosignal.Signal
in docs #6201 - Made chunked encoding HTTP header check stricter. #6305
- update quick starter demo codes. #6240
- Added an explanation of how tiny timeouts affect performance to the client reference document. #6274
- Add flake8-docstrings to flake8 configuration, enable subset of checks. #6276
- Added information on running complex applications with additional tasks/processes -- :user:`Dreamsorcerer`. #6278
Added a
GunicornWebWorker
feature for extending the aiohttp server configuration by allowing the 'wsgi' coroutine to returnweb.AppRunner
object. #2988Switch from
http-parser
tollhttp
#3561Use 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
#4054FileResponse now supports ETag. #4594
Add a request handler type alias
aiohttp.typedefs.Handler
. #4686AioHTTPTestCase
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, just async def test_*. The only difference is that for the people using python3.7 and below a new dependency is needed, it is
asynctestcase
. #4700Add 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. #4942Add 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. Use CookieJar(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. #5572Add
aiohttp.pytest_plugin.AiohttpClient
for static typing of pytest plugin. #5585Added a
socket_factory
argument toBaseTestServer
. #5844Add 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`. #5930Added 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`. #6013Add 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`. #6139Started shipping platform-specific arm64 wheels for Apple Silicon — :user:`asvetlov`. #6139
- Modify _drain_helper() to handle concurrent await resp.write(...) or ws.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 tracing URL. #5432
- Fix annotations #5466
- Fixed the multipart POST requests processing to always release file
descriptors for the
tempfile.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 <scheme>_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 fix subprocesses that capture output having an incorrect returncode. #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
- 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
- #3927, #4247, #4247, #5389, #5457, #5486, #5494, #5515, #5625, #5635, #5648, #5657, #5890, #5914, #5932, #6002, #6045, #6131, #6156, #6165, #6166
- Bumped upper bound of the
chardet
runtime dependency to allow their v4.0 version stream. #5366
(SECURITY BUG) Started preventing open redirects in the
aiohttp.web.normalize_path_middleware
middleware. For more details, see https://github.com/aio-libs/aiohttp/security/advisories/GHSA-v6wp-4m6f-gcjg.Thanks to Beast Glatisant for finding the first instance of this issue and Jelmer Vernooij for reporting and tracking it down in aiohttp. #5497
Fix interpretation difference of the pure-Python and the Cython-based HTTP parsers construct a
yarl.URL
object for HTTP request-target.Before this fix, the Python parser would turn the URI's absolute-path for
//some-path
into/
while the Cython code preserved it as//some-path
. Now, both do the latter. #5498
- Use Brotli instead of brotlipy #3803
- Made exceptions pickleable. Also changed the repr of some exceptions. #4077
- Raise a ClientResponseError instead of an AssertionError for a blank HTTP Reason Phrase. #3532
- Fix
web_middlewares.normalize_path_middleware
behavior for patch without slash. #3669 - Fix overshadowing of overlapped sub-applications prefixes. #3701
- Make BaseConnector.close() a coroutine and wait until the client closes all connections. Drop deprecated "with Connector():" syntax. #3736
- Reset the
sock_read
timeout each time data is received for aaiohttp.client
response. #3808 - Fixed type annotation for add_view method of UrlDispatcher to accept any subclass of View #3880
- Fixed querying the address families from DNS that the current host supports. #5156
- Change return type of MultipartReader.__aiter__() and BodyPartReader.__aiter__() to AsyncIterator. #5163
- Provide x86 Windows wheels. #5230
- Add documentation for
aiohttp.web.FileResponse
. #3958 - Removed deprecation warning in tracing example docs #3964
- Fixed wrong "Usage" docstring of
aiohttp.client.request
. #4603 - Add aiohttp-pydantic to third party libraries #5228
- Fixed static files handling for loops without
.sendfile()
support #5149
- Fixed a type error caused by the conditional import of Protocol. #5111
- Server doesn't send Content-Length for 1xx or 204 #4901
- Fix run_app typing #4957
- Always require
typing_extensions
library. #5107 - Fix a variable-shadowing bug causing ThreadedResolver.resolve to
return the resolved IP as the
hostname
in each record, which prevented validation of HTTPS connections. #5110 - Added annotations to all public attributes. #5115
- Fix flaky test_when_timeout_smaller_second #5116
- Ensure sending a zero byte file does not throw an exception #5124
- Fix a bug in
web.run_app()
about Python version checking on Windows #5127
- Response headers are now prepared prior to running
on_response_prepare
hooks, directly before headers are sent to the client. #1958 - Add a
quote_cookie
option toCookieJar
, a way to skip quotation wrapping of cookies containing special characters. #2571 - Call
AccessLogger.log
with the current exception available fromsys.exc_info()
. #3557 - web.UrlDispatcher.add_routes and web.Application.add_routes return a list of registered AbstractRoute instances. AbstractRouteDef.register (and all subclasses) return a list of registered resources registered resource. #3866
- Added properties of default ClientSession params to ClientSession class so it is available for introspection #3882
- Don't cancel web handler on peer disconnection, raise OSError on reading/writing instead. #4080
- Implement BaseRequest.get_extra_info() to access a protocol transports' extra info. #4189
- Added ClientSession.timeout property. #4191
- allow use of SameSite in cookies. #4224
- Use
loop.sendfile()
instead of custom implementation if available. #4269 - Apply SO_REUSEADDR to test server's socket. #4393
- Use .raw_host instead of slower .host in client API #4402
- Allow configuring the buffer size of input stream by passing
read_bufsize
argument. #4453 - Pass tests on Python 3.8 for Windows. #4513
- Add method and url attributes to TraceRequestChunkSentParams and TraceResponseChunkReceivedParams. #4674
- Add ClientResponse.ok property for checking status code under 400. #4711
- Don't ceil timeouts that are smaller than 5 seconds. #4850
- TCPSite now listens by default on all interfaces instead of just IPv4 when None is passed in as the host. #4894
- Bump
http_parser
to 2.9.4 #5070
Fix keepalive connections not being closed in time #3296
Fix failed websocket handshake leaving connection hanging. #3380
Fix tasks cancellation order on exit. The run_app task needs to be cancelled first for cleanup hooks to run with all tasks intact. #3805
Don't start heartbeat until _writer is set #4062
Fix handling of multipart file uploads without a content type. #4089
Preserve view handler function attributes across middlewares #4174
Fix the string representation of
ServerDisconnectedError
. #4175Raising RuntimeError when trying to get encoding from not read body #4214
Remove warning messages from noop. #4282
Raise ClientPayloadError if FormData re-processed. #4345
Fix a warning about unfinished task in
web_protocol.py
#4408Fixed 'deflate' compression. According to RFC 2616 now. #4506
Fixed OverflowError on platforms with 32-bit time_t #4515
Fixed request.body_exists returns wrong value for methods without body. #4528
Fix connecting to link-local IPv6 addresses. #4554
Fix a problem with connection waiters that are never awaited. #4562
Always make sure transport is not closing before reuse a connection.
Reuse a protocol based on keepalive in headers is unreliable. For example, uWSGI will not support keepalive even it serves a HTTP 1.1 request, except explicitly configure uWSGI with a
--http-keepalive
option.Servers designed like uWSGI could cause aiohttp intermittently raise a ConnectionResetException when the protocol poll runs out and some protocol is reused. #4587
Handle the last CRLF correctly even if it is received via separate TCP segment. #4630
Fix the register_resource function to validate route name before splitting it so that route name can include python keywords. #4691
Improve typing annotations for
web.Request
,aiohttp.ClientResponse
andmultipart
module. #4736Fix resolver task is not awaited when connector is cancelled #4795
Fix a bug "Aiohttp doesn't return any error on invalid request methods" #4798
Fix HEAD requests for static content. #4809
Fix incorrect size calculation for memoryview #4890
Add HTTPMove to _all__. #4897
Fixed the type annotations in the
tracing
module. #4912Fix typing for multipart
__aiter__
. #4931Fix for race condition on connections in BaseConnector that leads to exceeding the connection limit. #4936
Add forced UTF-8 encoding for
application/rdap+json
responses. #4938Fix inconsistency between Python and C http request parsers in parsing pct-encoded URL. #4972
Fix connection closing issue in HEAD request. #5012
Fix type hint on BaseRunner.addresses (from
List[str]
toList[Any]
) #5086Make web.run_app() more responsive to Ctrl+C on Windows for Python < 3.8. It slightly increases CPU load as a side effect. #5098
- Fix example code in client quick-start #3376
- Updated the docs so there is no contradiction in
ttl_dns_cache
default value #3512 - Add 'Deploy with SSL' to docs. #4201
- Change typing of the secure argument on StreamResponse.set_cookie from
Optional[str]
toOptional[bool]
#4204 - Changes
ttl_dns_cache
type from int to Optional[int]. #4270 - Simplify README hello word example and add a documentation page for people coming from requests. #4272
- Improve some code examples in the documentation involving websockets and starting a simple HTTP site with an AppRunner. #4285
- Fix typo in code example in Multipart docs #4312
- Fix code example in Multipart section. #4314
- Update contributing guide so new contributors read the most recent version of that guide. Update command used to create test coverage reporting. #4810
- Spelling: Change "canonize" to "canonicalize". #4986
- Add
aiohttp-sse-client
library to third party usage list. #5084
- Pin yarl to
<1.6.0
to avoid buggy behavior that will be fixed by the next aiohttp release.
- Made exceptions pickleable. Also changed the repr of some exceptions. #4077
- Use
Iterable
type hint instead ofSequence
forApplication
middleware parameter. #4125
- Reset the
sock_read
timeout each time data is received for aaiohttp.ClientResponse
. #3808 - Fix handling of expired cookies so they are not stored in CookieJar. #4063
- Fix misleading message in the string representation of
ClientConnectorError
;self.ssl == None
means default SSL context, not SSL disabled #4097 - Don't clobber HTTP status when using FileResponse. #4106
- Added minimal required logging configuration to logging documentation. #2469
- Update docs to reflect proxy support. #4100
- Fix typo in code example in testing docs. #4108
- Compatibility with Python 3.8. #4056
- correct some exception string format #4068
- Emit a warning when
ssl.OP_NO_COMPRESSION
is unavailable because the runtime is built against an outdated OpenSSL. #4052 - Update multidict requirement to >= 4.5 #4057
- Provide pytest-aiohttp namespace for pytest fixtures in docs. #3723
- Add support for Named Pipes (Site and Connector) under Windows. This feature requires Proactor event loop to work. #3629
- Removed
Transfer-Encoding: chunked
header from websocket responses to be compatible with more http proxy servers. #3798 - Accept non-GET request for starting websocket handshake on server side. #3980
Raise a ClientResponseError instead of an AssertionError for a blank HTTP Reason Phrase. #3532
Fix an issue where cookies would sometimes not be set during a redirect. #3576
Change normalize_path_middleware to use 308 redirect instead of 301.
This behavior should prevent clients from being unable to use PUT/POST methods on endpoints that are redirected because of a trailing slash. #3579
Drop the processed task from
all_tasks()
list early. It prevents logging about a task with unhandled exception when the server is used in conjunction withasyncio.run()
. #3587Signal
type annotation changed fromSignal[Callable[['TraceConfig'], Awaitable[None]]]
toSignal[Callable[ClientSession, SimpleNamespace, ...]
. #3595Use sanitized URL as Location header in redirects #3614
Improve typing annotations for multipart.py along with changes required by mypy in files that references multipart.py. #3621
Close session created inside
aiohttp.request
when unhandled exception occurs #3628Cleanup per-chunk data in generic data read. Memory leak fixed. #3631
Use correct type for add_view and family #3633
Fix _keepalive field in __slots__ of
RequestHandler
. #3644Properly handle ConnectionResetError, to silence the "Cannot write to closing transport" exception when clients disconnect uncleanly. #3648
Suppress pytest warnings due to
test_utils
classes #3660Fix overshadowing of overlapped sub-application prefixes. #3701
Fixed return type annotation for WSMessage.json() #3720
Properly expose TooManyRedirects publicly as documented. #3818
Fix missing brackets for IPv6 in proxy CONNECT request #3841
Make the signature of
aiohttp.test_utils.TestClient.request
matchasyncio.ClientSession.request
according to the docs #3852Use correct style for re-exported imports, makes mypy
--strict
mode happy. #3868Fixed type annotation for add_view method of UrlDispatcher to accept any subclass of View #3880
Made cython HTTP parser set Reason-Phrase of the response to an empty string if it is missing. #3906
Add URL to the string representation of ClientResponseError. #3959
Accept
istr
keys inLooseHeaders
type hints. #3976Fixed race conditions in _resolve_host caching and throttling when tracing is enabled. #4013
For URLs like "unix://localhost/..." set Host HTTP header to "localhost" instead of "localhost:None". #4039
- Modify documentation for Background Tasks to remove deprecated usage of event loop. #3526
- use
if __name__ == '__main__':
in server examples. #3775 - Update documentation reference to the default access logger. #3783
- Improve documentation for
web.BaseRequest.path
andweb.BaseRequest.raw_path
. #3791 - Removed deprecation warning in tracing example docs #3964
- Fix stream
.read()
/.readany()
/.iter_any()
which used to return a partial content only in case of compressed content #3525
- Fix type stubs for
aiohttp.web.run_app(access_log=True)
and fix edge case ofaccess_log=True
and the event loop being in debug mode. #3504 - Fix
aiohttp.ClientTimeout
type annotations to acceptNone
for fields #3511 - Send custom per-request cookies even if session jar is empty #3515
- Restore Linux binary wheels publishing on PyPI
FileResponse
fromweb_fileresponse.py
uses aThreadPoolExecutor
to work with files asynchronously. I/O based payloads frompayload.py
uses aThreadPoolExecutor
to work with I/O objects asynchronously. #3313- Internal Server Errors in plain text if the browser does not support HTML. #3483
- Preserve MultipartWriter parts headers on write. Refactor the way how
Payload.headers
are handled. Payload instances now always have headers and Content-Type defined. Fix Payload Content-Disposition header reset after initial creation. #3035 - Log suppressed exceptions in
GunicornWebWorker
. #3464 - Remove wildcard imports. #3468
- Use the same task for app initialization and web server handling in gunicorn workers. It allows to use Python3.7 context vars smoothly. #3471
- Fix handling of chunked+gzipped response when first chunk does not give uncompressed data #3477
- Replace
collections.MutableMapping
withcollections.abc.MutableMapping
to avoid a deprecation warning. #3480 Payload.size
type annotation changed fromOptional[float]
toOptional[int]
. #3484- Ignore done tasks when cancels pending activities on
web.run_app
finalization. #3497
- Add documentation for
aiohttp.web.HTTPException
. #3490
- Fix a regression about
ClientSession._requote_redirect_url
modification in debug mode.
- The library type annotations are checked in strict mode now.
- Add support for setting cookies for individual request (#2387)
- Application.add_domain implementation (#2809)
- The default
app
in the request returned bytest_utils.make_mocked_request
can now have objects assigned to it and retrieved using the[]
operator. (#3174) - Make
request.url
accessible when transport is closed. (#3177) - Add
zlib_executor_size
argument toResponse
constructor to allow compression to run in a background executor to avoid blocking the main thread and potentially triggering health check failures. (#3205) - Enable users to set
ClientTimeout
inaiohttp.request
(#3213) - Don't raise a warning if
NETRC
environment variable is not set and~/.netrc
file doesn't exist. (#3267) - Add default logging handler to web.run_app If the
Application.debug`
flag is set and the default loggeraiohttp.access
is used, access logs will now be output using a stderrStreamHandler
if no handlers are attached. Furthermore, if the default logger has no log level set, the log level will be set toDEBUG
. (#3324) - Add method argument to
session.ws_connect()
. Sometimes server API requires a different HTTP method for WebSocket connection establishment. For example,Docker exec
needs POST. (#3378) - Create a task per request handling. (#3406)
- Enable passing
access_log_class
viahandler_args
(#3158) - Return empty bytes with end-of-chunk marker in empty stream reader. (#3186)
- Accept
CIMultiDictProxy
instances forheaders
argument inweb.Response
constructor. (#3207) - Don't uppercase HTTP method in parser (#3233)
- Make method match regexp RFC-7230 compliant (#3235)
- Add
app.pre_frozen
state to properly handle startup signals in sub-applications. (#3237) - Enhanced parsing and validation of helpers.BasicAuth.decode. (#3239)
- Change imports from collections module in preparation for 3.8. (#3258)
- Ensure Host header is added first to ClientRequest to better replicate browser (#3265)
- Fix forward compatibility with Python 3.8: importing ABCs directly from the collections module will not be supported anymore. (#3273)
- Keep the query string by
normalize_path_middleware
. (#3278) - Fix missing parameter
raise_for_status
for aiohttp.request() (#3290) - Bracket IPv6 addresses in the HOST header (#3304)
- Fix default message for server ping and pong frames. (#3308)
- Fix tests/test_connector.py typo and tests/autobahn/server.py duplicate loop def. (#3337)
- Fix false-negative indicator end_of_HTTP_chunk in StreamReader.readchunk function (#3361)
- Release HTTP response before raising status exception (#3364)
- Fix task cancellation when
sendfile()
syscall is used by static file handling. (#3383) - Fix stack trace for
asyncio.TimeoutError
which was not logged, when it is caught in the handler. (#3414)
- Improve documentation of
Application.make_handler
parameters. (#3152) - Fix BaseRequest.raw_headers doc. (#3215)
- Fix typo in TypeError exception reason in
web.Application._handle
(#3229) - Make server access log format placeholder %b documentation reflect behavior and docstring. (#3307)
- Deprecate modification of
session.requote_redirect_url
(#2278) - Deprecate
stream.unread_data()
(#3260) - Deprecated use of boolean in
resp.enable_compression()
(#3318) - Encourage creation of aiohttp public objects inside a coroutine (#3331)
- Drop dead
Connection.detach()
andConnection.writer
. Both methods were broken for more than 2 years. (#3358) - Deprecate
app.loop
,request.loop
,client.loop
andconnector.loop
properties. (#3374) - Deprecate explicit debug argument. Use asyncio debug mode instead. (#3381)
- Deprecate body parameter in HTTPException (and derived classes) constructor. (#3385)
- Deprecate bare connector close, use
async with connector:
andawait connector.close()
instead. (#3417) - Deprecate obsolete
read_timeout
andconn_timeout
inClientSession
constructor. (#3438)
- #3341, #3351