- 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