Skip to content

Latest commit

 

History

History
910 lines (749 loc) · 43.4 KB

CHANGES.rst

File metadata and controls

910 lines (749 loc) · 43.4 KB

3.8.0 (2021-10-31)

Features

  • Added a GunicornWebWorker feature for extending the aiohttp server configuration by allowing the 'wsgi' coroutine to return web.AppRunner object. #2988
  • Switch from http-parser to llhttp #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 in StreamResponse #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~unittest.TestCase it will be easier to write new test cases like the sync version of the :py~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. #4700

  • Add validation of HTTP header keys and values to prevent header injection. #4818
  • Add predicate to AbstractCookieJar.clear. Add AbstractCookieJar.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. 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 with asyncio.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 to BaseTestServer. #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 -- Hanaasagi. #5927
  • Switched chardet to charset-normalizer for guessing the HTTP payload body encoding -- Ousret. #5930
  • Added optional auto_decompress argument for HttpRequestParser #5957
  • Added support for HTTPS proxies to the extent CPython's :pyasyncio supports it -- by bmbouter, jborean93 and webknjaz. #5992
  • Added base_url parameter to the initializer of ~aiohttp.ClientSession. #6013
  • Add Trove classifier and create binary wheels for 3.10. -- hugovk. #6079
  • Started shipping platform-specific wheels with the musl tag targeting typical Alpine Linux runtimes — asvetlov. #6139
  • Started shipping platform-specific arm64 wheels for Apple Silicon — asvetlov. #6139

Bugfixes

  • 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 the ok 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 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 to web.run_app; replace deprecated aiohttp.ws_connect calls in tests/autobahn/client.py with aiohttp.ClienSession.ws_connect. #5606
  • Fixed test for HTTPUnauthorized that access the text 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 to ClientSession.ws_connect. -- hoh. #5868
  • Uses :py~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 the asyncio.sleep/gather calls #5905
  • Return None from request.if_modified_since, request.if_unmodified_since, request.if_range and response.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 both Content-Length and Transfer-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


3.7.4.post0 (2021-03-06)

Misc

  • Bumped upper bound of the chardet runtime 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_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


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_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 a aiohttp.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

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_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

3.7.0 (2020-10-24)

Features

  • 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 to CookieJar, a way to skip quotation wrapping of cookies containing special characters. #2571
  • Call AccessLogger.log with the current exception available from sys.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

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. #4175
  • Raising 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 #4408
  • Fixed '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 and multipart module. #4736
  • Fix 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. #4912
  • Fix typing for multipart __aiter__. #4931
  • Fix 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. #4938
  • Fix 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] to List[Any]) #5086
  • Make 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_cache default value #3512
  • Add 'Deploy with SSL' to docs. #4201
  • Change typing of the secure argument on StreamResponse.set_cookie from Optional[str] to Optional[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

Misc


3.6.3 (2020-10-12)

Bugfixes

  • Pin yarl to <1.6.0 to 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 Iterable type hint instead of Sequence for Application middleware parameter. #4125

Bugfixes

  • Reset the sock_read timeout each time data is received for a aiohttp.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

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_COMPRESSION is 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: 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

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 with asyncio.run(). #3587
  • Signal type annotation changed from Signal[Callable[['TraceConfig'], Awaitable[None]]] to Signal[Callable[ClientSession, SimpleNamespace, ...]. #3595
  • Use 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 #3628
  • Cleanup 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. #3644
  • Properly handle ConnectionResetError, to silence the "Cannot write to closing transport" exception when clients disconnect uncleanly. #3648
  • Suppress pytest warnings due to test_utils classes #3660
  • Fix 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 match asyncio.ClientSession.request according to the docs #3852
  • Use correct style for re-exported imports, makes mypy --strict mode happy. #3868
  • Fixed 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 in LooseHeaders type hints. #3976
  • Fixed 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.path and web.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 of access_log=True and the event loop being in debug mode. #3504
  • Fix aiohttp.ClientTimeout type annotations to accept None for 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

  • FileResponse from web_fileresponse.py uses a ThreadPoolExecutor to work with files asynchronously. I/O based payloads from payload.py uses a ThreadPoolExecutor to 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.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 with collections.abc.MutableMapping to avoid a deprecation warning. #3480
  • Payload.size type annotation changed from Optional[float] to Optional[int]. #3484
  • Ignore done tasks when cancels pending activities on web.run_app finalization. #3497

Improved Documentation

  • Add documentation for aiohttp.web.HTTPException. #3490

Misc


3.5.1 (2018-12-24)

  • Fix a regression about ClientSession._requote_redirect_url modification 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 app in the request returned by test_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 to Response 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 in aiohttp.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 logger aiohttp.access is used, access logs will now be output using a *stderr* StreamHandler if no handlers are attached. Furthermore, if the default logger has no log level set, the log level will be set to DEBUG. (#3324 <aio-libs#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)

Bugfixes

  • Enable passing access_log_class via handler_args (#3158)
  • Return empty bytes with end-of-chunk marker in empty stream reader. (#3186)
  • Accept CIMultiDictProxy instances for headers argument in web.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)

Improved Documentation

  • 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)

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() and Connection.writer. Both methods were broken for more than 2 years. (#3358)
  • Deprecate app.loop, request.loop, client.loop and connector.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: and await connector.close() instead. (#3417)
  • Deprecate obsolete read_timeout and conn_timeout in ClientSession constructor. (#3438)

Misc

  • #3341, #3351