Changelog
3.7.4.post0 (2021-03-06)
Misc
- Bumped upper bound of the
chardetruntime dependency to allow their v4.0 version stream. #5366
3.7.4 (2021-02-25)
Bugfixes
(SECURITY BUG) Started preventing open redirects in the
aiohttp.web.normalize_path_middlewaremiddleware. 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.URLobject for HTTP request-target.Before this fix, the Python parser would turn the URI's absolute-path for
//some-pathinto/while the Cython code preserved it as//some-path. Now, both do the latter. #5498
3.7.3 (2020-11-18)
Features
- Use Brotli instead of brotlipy #3803
- Made exceptions pickleable. Also changed the repr of some exceptions. #4077
Bugfixes
- Raise a ClientResponseError instead of an AssertionError for a blank HTTP Reason Phrase. #3532
- Fix
web_middlewares.normalize_path_middlewarebehavior 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_readtimeout each time data is received for aaiohttp.clientresponse. #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
Improved Documentation
- 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
Misc
3.7.2 (2020-10-27)
Bugfixes
- Fixed static files handling for loops without
.sendfile()support #5149
3.7.1 (2020-10-25)
Bugfixes
- 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_extensionslibrary. #5107 - Fix a variable-shadowing bug causing ThreadedResolver.resolve to
return the resolved IP as the
hostnamein 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
3.7.0 (2020-10-24)
Features
- Response headers are now prepared prior to running
on_response_preparehooks, directly before headers are sent to the client. #1958 - Add a
quote_cookieoption toCookieJar, a way to skip quotation wrapping of cookies containing special characters. #2571 - Call
AccessLogger.logwith 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_bufsizeargument. #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_parserto 2.9.4 #5070
Bugfixes
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-keepaliveoption.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.ClientResponseandmultipartmodule. #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
tracingmodule. #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+jsonresponses. #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
Improved Documentation
- Fix example code in client quick-start #3376
- Updated the docs so there is no contradiction in
ttl_dns_cachedefault 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_cachetype 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-clientlibrary to third party usage list. #5084
Misc
3.6.3 (2020-10-12)
Bugfixes
- Pin yarl to
<1.6.0to avoid buggy behavior that will be fixed by the next aiohttp release.
3.6.2 (2019-10-09)
Features
- Made exceptions pickleable. Also changed the repr of some exceptions. #4077
- Use
Iterabletype hint instead ofSequenceforApplicationmiddleware parameter. #4125
Bugfixes
- Reset the
sock_readtimeout 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 == Nonemeans default SSL context, not SSL disabled #4097 - Don't clobber HTTP status when using FileResponse. #4106
Improved Documentation
- 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
Misc
3.6.1 (2019-09-19)
Features
- Compatibility with Python 3.8. #4056
Bugfixes
- correct some exception string format #4068
- Emit a warning when
ssl.OP_NO_COMPRESSIONis unavailable because the runtime is built against an outdated OpenSSL. #4052 - Update multidict requirement to >= 4.5 #4057
Improved Documentation
- Provide pytest-aiohttp namespace for pytest fixtures in docs. #3723
3.6.0 (2019-09-06)
Features
- Add support for Named Pipes (Site and Connector) under Windows. This feature requires Proactor event loop to work. #3629
- Removed
Transfer-Encoding: chunkedheader from websocket responses to be compatible with more http proxy servers. #3798 - Accept non-GET request for starting websocket handshake on server side. #3980
Bugfixes
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(). #3587Signaltype 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.requestwhen 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_utilsclasses #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.requestmatchasyncio.ClientSession.requestaccording to the docs #3852Use correct style for re-exported imports, makes mypy
--strictmode 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
istrkeys inLooseHeaderstype 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
Improved Documentation
- 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.pathandweb.BaseRequest.raw_path. #3791 - Removed deprecation warning in tracing example docs #3964
3.5.4 (2019-01-12)
Bugfixes
- Fix stream
.read()/.readany()/.iter_any()which used to return a partial content only in case of compressed content #3525
3.5.3 (2019-01-10)
Bugfixes
- Fix type stubs for
aiohttp.web.run_app(access_log=True)and fix edge case ofaccess_log=Trueand the event loop being in debug mode. #3504 - Fix
aiohttp.ClientTimeouttype annotations to acceptNonefor fields #3511 - Send custom per-request cookies even if session jar is empty #3515
- Restore Linux binary wheels publishing on PyPI
3.5.2 (2019-01-08)
Features
FileResponsefromweb_fileresponse.pyuses aThreadPoolExecutorto work with files asynchronously. I/O based payloads frompayload.pyuses aThreadPoolExecutorto work with I/O objects asynchronously. #3313- Internal Server Errors in plain text if the browser does not support HTML. #3483
Bugfixes
- Preserve MultipartWriter parts headers on write. Refactor the way how
Payload.headersare 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.MutableMappingwithcollections.abc.MutableMappingto avoid a deprecation warning. #3480 Payload.sizetype annotation changed fromOptional[float]toOptional[int]. #3484- Ignore done tasks when cancels pending activities on
web.run_appfinalization. #3497
Improved Documentation
- Add documentation for
aiohttp.web.HTTPException. #3490
Misc
3.5.1 (2018-12-24)
- Fix a regression about
ClientSession._requote_redirect_urlmodification in debug mode.
3.5.0 (2018-12-22)
Features
- 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
appin the request returned bytest_utils.make_mocked_requestcan now have objects assigned to it and retrieved using the[]operator. (#3174) - Make
request.urlaccessible when transport is closed. (#3177) - Add
zlib_executor_sizeargument toResponseconstructor 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
ClientTimeoutinaiohttp.request(#3213) - Don't raise a warning if
NETRCenvironment variable is not set and~/.netrcfile doesn't exist. (#3267) - Add default logging handler to web.run_app If the
Application.debug`flag is set and the default loggeraiohttp.accessis used, access logs will now be output using a stderrStreamHandlerif 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 execneeds POST. (#3378) - Create a task per request handling. (#3406)
Bugfixes
- Enable passing
access_log_classviahandler_args(#3158) - Return empty bytes with end-of-chunk marker in empty stream reader. (#3186)
- Accept
CIMultiDictProxyinstances forheadersargument inweb.Responseconstructor. (#3207) - Don't uppercase HTTP method in parser (#3233)
- Make method match regexp RFC-7230 compliant (#3235)
- Add
app.pre_frozenstate 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_statusfor 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.TimeoutErrorwhich was not logged, when it is caught in the handler. (#3414)
Improved Documentation
- Improve documentation of
Application.make_handlerparameters. (#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)
Deprecations and Removals
- 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.loopandconnector.loopproperties. (#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_timeoutandconn_timeoutinClientSessionconstructor. (#3438)
Misc
- #3341, #3351