Full Code of aio-libs/aiohttp for AI

master 2602b711710d cached
437 files
3.9 MB
1.0M tokens
5344 symbols
1 requests
Download .txt
Showing preview only (4,135K chars total). Download the full file or copy to clipboard to get everything.
Repository: aio-libs/aiohttp
Branch: master
Commit: 2602b711710d
Files: 437
Total size: 3.9 MB

Directory structure:
gitextract_ex8k9ysz/

├── .cherry_picker.toml
├── .codecov.yml
├── .coveragerc.toml
├── .editorconfig
├── .git-blame-ignore-revs
├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   └── feature_request.yml
│   ├── ISSUE_TEMPLATE.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── codeql.yml
│   ├── config.yml
│   ├── dependabot.yml
│   ├── lock.yml
│   └── workflows/
│       ├── auto-merge.yml
│       ├── ci-cd.yml
│       ├── codeql.yml
│       ├── label-remove.yml
│       ├── labels.yml
│       └── stale.yml
├── .gitignore
├── .gitmodules
├── .lgtm.yml
├── .mypy.ini
├── .pip-tools.toml
├── .pre-commit-config.yaml
├── .readthedocs.yml
├── CHANGES/
│   ├── .TEMPLATE.rst
│   ├── .gitignore
│   ├── 10468.doc.rst
│   ├── 10596.bugfix.rst
│   ├── 10611.bugfix.rst
│   ├── 10665.feature.rst
│   ├── 10683.bugfix.rst
│   ├── 10753.bugfix.rst
│   ├── 10795.doc.rst
│   ├── 11012.breaking.rst
│   ├── 11268.feature.rst
│   ├── 11283.bugfix.rst
│   ├── 11601.breaking.rst
│   ├── 11681.feature.rst
│   ├── 11737.contrib.rst
│   ├── 11763.feature.rst
│   ├── 11766.feature.rst
│   ├── 11776.misc.rst
│   ├── 11826.contrib.rst
│   ├── 11859.bugfix.rst
│   ├── 11876.misc.rst
│   ├── 11898.bugfix.rst
│   ├── 11937.misc.rst
│   ├── 11955.feature.rst
│   ├── 11972.bugfix.rst
│   ├── 11989.feature.rst
│   ├── 11992.contrib.rst
│   ├── 12027.misc.rst
│   ├── 12030.bugfix.rst
│   ├── 12042.doc.rst
│   ├── 12069.packaging.rst
│   ├── 12088.bugfix.rst
│   ├── 12091.bugfix.rst
│   ├── 12096.bugfix.rst
│   ├── 12097.bugfix.rst
│   ├── 12106.feature.rst
│   ├── 12136.bugfix.rst
│   ├── 12170.misc.rst
│   ├── 12173.contrib.rst
│   ├── 12195.bugfix.rst
│   ├── 12231.bugfix.rst
│   ├── 12240.bugfix.rst
│   ├── 12249.bugfix.rst
│   ├── 2174.bugfix
│   ├── 2835.breaking.rst
│   ├── 2977.breaking.rst
│   ├── 3310.bugfix
│   ├── 3462.feature
│   ├── 3463.breaking.rst
│   ├── 3482.bugfix
│   ├── 3538.breaking.rst
│   ├── 3539.breaking.rst
│   ├── 3540.feature
│   ├── 3542.breaking.rst
│   ├── 3545.feature
│   ├── 3547.breaking.rst
│   ├── 3548.breaking.rst
│   ├── 3559.doc
│   ├── 3562.bugfix
│   ├── 3569.feature
│   ├── 3580.breaking.rst
│   ├── 3612.bugfix
│   ├── 3613.bugfix
│   ├── 3642.doc
│   ├── 3685.doc
│   ├── 3721.bugfix
│   ├── 3767.feature
│   ├── 3787.feature
│   ├── 3796.feature
│   ├── 3890.breaking.rst
│   ├── 3901.breaking.rst
│   ├── 3929.breaking.rst
│   ├── 3931.breaking.rst
│   ├── 3932.breaking.rst
│   ├── 3933.breaking.rst
│   ├── 3934.breaking.rst
│   ├── 3935.breaking.rst
│   ├── 3939.breaking.rst
│   ├── 3940.breaking.rst
│   ├── 3942.breaking.rst
│   ├── 3948.breaking.rst
│   ├── 3994.misc
│   ├── 4161.doc
│   ├── 4277.feature
│   ├── 4283.bugfix
│   ├── 4299.bugfix
│   ├── 4302.bugfix
│   ├── 4368.bugfix
│   ├── 4452.doc
│   ├── 4504.doc
│   ├── 4526.bugfix
│   ├── 4558.bugfix
│   ├── 4656.bugfix
│   ├── 4695.doc
│   ├── 4706.feature
│   ├── 5075.feature
│   ├── 5191.doc
│   ├── 5258.bugfix
│   ├── 5278.breaking.rst
│   ├── 5284.breaking.rst
│   ├── 5284.feature
│   ├── 5287.feature
│   ├── 5516.misc
│   ├── 5533.misc
│   ├── 5558.bugfix
│   ├── 5634.feature
│   ├── 5783.feature
│   ├── 5806.misc
│   ├── 5829.misc
│   ├── 5870.misc
│   ├── 5894.bugfix
│   ├── 6180.bugfix
│   ├── 6181.bugfix
│   ├── 6193.feature
│   ├── 6547.bugfix
│   ├── 6721.misc
│   ├── 6979.doc
│   ├── 6998.doc
│   ├── 7107.breaking.rst
│   ├── 7265.breaking.rst
│   ├── 7319.feature.rst
│   ├── 7677.bugfix
│   ├── 7772.bugfix
│   ├── 7815.bugfix
│   ├── 8048.breaking.rst
│   ├── 8139.contrib.rst
│   ├── 8197.doc
│   ├── 8303.breaking.rst
│   ├── 8596.breaking.rst
│   ├── 8698.breaking.rst
│   ├── 8957.breaking.rst
│   ├── 9109.breaking.rst
│   ├── 9212.packaging.rst
│   ├── 9254.breaking.rst
│   ├── 9292.breaking.rst
│   ├── 9413.misc.rst
│   └── README.rst
├── CHANGES.rst
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.rst
├── CONTRIBUTORS.txt
├── LICENSE.txt
├── MANIFEST.in
├── Makefile
├── README.rst
├── aiohttp/
│   ├── __init__.py
│   ├── _cookie_helpers.py
│   ├── _cparser.pxd
│   ├── _find_header.h
│   ├── _find_header.pxd
│   ├── _http_parser.pyx
│   ├── _http_writer.pyx
│   ├── _websocket/
│   │   ├── __init__.py
│   │   ├── helpers.py
│   │   ├── mask.pxd
│   │   ├── mask.pyx
│   │   ├── models.py
│   │   ├── reader.py
│   │   ├── reader_c.pxd
│   │   ├── reader_py.py
│   │   └── writer.py
│   ├── abc.py
│   ├── base_protocol.py
│   ├── client.py
│   ├── client_exceptions.py
│   ├── client_middleware_digest_auth.py
│   ├── client_middlewares.py
│   ├── client_proto.py
│   ├── client_reqrep.py
│   ├── client_ws.py
│   ├── compression_utils.py
│   ├── connector.py
│   ├── cookiejar.py
│   ├── formdata.py
│   ├── hdrs.py
│   ├── helpers.py
│   ├── http.py
│   ├── http_exceptions.py
│   ├── http_parser.py
│   ├── http_websocket.py
│   ├── http_writer.py
│   ├── log.py
│   ├── multipart.py
│   ├── payload.py
│   ├── py.typed
│   ├── pytest_plugin.py
│   ├── resolver.py
│   ├── streams.py
│   ├── tcp_helpers.py
│   ├── test_utils.py
│   ├── tracing.py
│   ├── typedefs.py
│   ├── web.py
│   ├── web_app.py
│   ├── web_exceptions.py
│   ├── web_fileresponse.py
│   ├── web_log.py
│   ├── web_middlewares.py
│   ├── web_protocol.py
│   ├── web_request.py
│   ├── web_response.py
│   ├── web_routedef.py
│   ├── web_runner.py
│   ├── web_server.py
│   ├── web_urldispatcher.py
│   ├── web_ws.py
│   └── worker.py
├── docs/
│   ├── Makefile
│   ├── _static/
│   │   └── css/
│   │       └── logo-adjustments.css
│   ├── abc.rst
│   ├── built_with.rst
│   ├── changes.rst
│   ├── client.rst
│   ├── client_advanced.rst
│   ├── client_middleware_cookbook.rst
│   ├── client_quickstart.rst
│   ├── client_reference.rst
│   ├── code/
│   │   └── client_middleware_cookbook.py
│   ├── conf.py
│   ├── contributing-admins.rst
│   ├── contributing.rst
│   ├── deployment.rst
│   ├── essays.rst
│   ├── external.rst
│   ├── faq.rst
│   ├── glossary.rst
│   ├── http_request_lifecycle.rst
│   ├── index.rst
│   ├── logging.rst
│   ├── make.bat
│   ├── migration_to_2xx.rst
│   ├── misc.rst
│   ├── multipart.rst
│   ├── multipart_reference.rst
│   ├── new_router.rst
│   ├── powered_by.rst
│   ├── spelling_wordlist.txt
│   ├── streams.rst
│   ├── structures.rst
│   ├── testing.rst
│   ├── third_party.rst
│   ├── tracing_reference.rst
│   ├── utilities.rst
│   ├── web.rst
│   ├── web_advanced.rst
│   ├── web_exceptions.rst
│   ├── web_lowlevel.rst
│   ├── web_quickstart.rst
│   ├── web_reference.rst
│   ├── websocket_utilities.rst
│   ├── whats_new_1_1.rst
│   └── whats_new_3_0.rst
├── examples/
│   ├── background_tasks.py
│   ├── basic_auth_middleware.py
│   ├── cli_app.py
│   ├── client_auth.py
│   ├── client_json.py
│   ├── client_ws.py
│   ├── combined_middleware.py
│   ├── curl.py
│   ├── digest_auth_qop_auth.py
│   ├── fake_server.py
│   ├── logging_middleware.py
│   ├── lowlevel_srv.py
│   ├── retry_middleware.py
│   ├── server.crt
│   ├── server.csr
│   ├── server.key
│   ├── server_simple.py
│   ├── static_files.py
│   ├── token_refresh_middleware.py
│   ├── web_classview.py
│   ├── web_cookies.py
│   ├── web_rewrite_headers_middleware.py
│   ├── web_srv.py
│   ├── web_srv_route_deco.py
│   ├── web_srv_route_table.py
│   ├── web_ws.py
│   └── websocket.html
├── pyproject.toml
├── requirements/
│   ├── base-ft.in
│   ├── base-ft.txt
│   ├── base.in
│   ├── base.txt
│   ├── constraints.in
│   ├── constraints.txt
│   ├── cython.in
│   ├── cython.txt
│   ├── dev.in
│   ├── dev.txt
│   ├── doc-spelling.in
│   ├── doc-spelling.txt
│   ├── doc.in
│   ├── doc.txt
│   ├── lint.in
│   ├── lint.txt
│   ├── multidict.in
│   ├── multidict.txt
│   ├── runtime-deps.in
│   ├── runtime-deps.txt
│   ├── sync-direct-runtime-deps.py
│   ├── test-common.in
│   ├── test-common.txt
│   ├── test-ft.in
│   ├── test-ft.txt
│   ├── test.in
│   └── test.txt
├── setup.cfg
├── setup.py
├── tests/
│   ├── autobahn/
│   │   ├── Dockerfile.aiohttp
│   │   ├── Dockerfile.autobahn
│   │   ├── client/
│   │   │   ├── client.py
│   │   │   └── fuzzingserver.json
│   │   ├── server/
│   │   │   ├── fuzzingclient.json
│   │   │   └── server.py
│   │   └── test_autobahn.py
│   ├── conftest.py
│   ├── data.unknown_mime_type
│   ├── data.zero_bytes
│   ├── github-urls.json
│   ├── isolated/
│   │   ├── check_for_client_response_leak.py
│   │   └── check_for_request_leak.py
│   ├── sample.txt
│   ├── test_base_protocol.py
│   ├── test_benchmarks_client.py
│   ├── test_benchmarks_client_request.py
│   ├── test_benchmarks_client_ws.py
│   ├── test_benchmarks_cookiejar.py
│   ├── test_benchmarks_http_websocket.py
│   ├── test_benchmarks_http_writer.py
│   ├── test_benchmarks_web_fileresponse.py
│   ├── test_benchmarks_web_middleware.py
│   ├── test_benchmarks_web_response.py
│   ├── test_benchmarks_web_urldispatcher.py
│   ├── test_circular_imports.py
│   ├── test_classbasedview.py
│   ├── test_client_connection.py
│   ├── test_client_exceptions.py
│   ├── test_client_fingerprint.py
│   ├── test_client_functional.py
│   ├── test_client_middleware.py
│   ├── test_client_middleware_digest_auth.py
│   ├── test_client_proto.py
│   ├── test_client_request.py
│   ├── test_client_response.py
│   ├── test_client_session.py
│   ├── test_client_ws.py
│   ├── test_client_ws_functional.py
│   ├── test_compression_utils.py
│   ├── test_connector.py
│   ├── test_cookie_helpers.py
│   ├── test_cookiejar.py
│   ├── test_flowcontrol_streams.py
│   ├── test_formdata.py
│   ├── test_helpers.py
│   ├── test_http_exceptions.py
│   ├── test_http_parser.py
│   ├── test_http_writer.py
│   ├── test_imports.py
│   ├── test_leaks.py
│   ├── test_loop.py
│   ├── test_multipart.py
│   ├── test_multipart_helpers.py
│   ├── test_payload.py
│   ├── test_proxy.py
│   ├── test_proxy_functional.py
│   ├── test_pytest_plugin.py
│   ├── test_resolver.py
│   ├── test_route_def.py
│   ├── test_run_app.py
│   ├── test_streams.py
│   ├── test_tcp_helpers.py
│   ├── test_test_utils.py
│   ├── test_tracing.py
│   ├── test_urldispatch.py
│   ├── test_web_app.py
│   ├── test_web_cli.py
│   ├── test_web_exceptions.py
│   ├── test_web_functional.py
│   ├── test_web_log.py
│   ├── test_web_middleware.py
│   ├── test_web_protocol.py
│   ├── test_web_request.py
│   ├── test_web_request_handler.py
│   ├── test_web_response.py
│   ├── test_web_runner.py
│   ├── test_web_sendfile.py
│   ├── test_web_sendfile_functional.py
│   ├── test_web_server.py
│   ├── test_web_urldispatcher.py
│   ├── test_web_websocket.py
│   ├── test_web_websocket_functional.py
│   ├── test_websocket_data_queue.py
│   ├── test_websocket_handshake.py
│   ├── test_websocket_parser.py
│   ├── test_websocket_writer.py
│   └── test_worker.py
├── tools/
│   ├── bench-asyncio-write.py
│   ├── check_changes.py
│   ├── check_sum.py
│   ├── cleanup_changes.py
│   ├── drop_merged_branches.sh
│   ├── gen.py
│   └── testing/
│       ├── Dockerfile
│       ├── Dockerfile.dockerignore
│       └── entrypoint.sh
└── vendor/
    └── README.rst

================================================
FILE CONTENTS
================================================

================================================
FILE: .cherry_picker.toml
================================================
team = "aio-libs"
repo = "aiohttp"
check_sha = "f382b5ffc445e45a110734f5396728da7914aeb6"
fix_commit_msg = false


================================================
FILE: .codecov.yml
================================================
codecov:
  branch: master
  notify:
    manual_trigger: true

comment:
  require_head: false
  require_base: false

coverage:
  range: "95..100"

  status:
    project: no

component_management:
  individual_components:
    - component_id: project
      paths:
        - aiohttp/**
    - component_id: tests
      paths:
        - tests/**

flags:
  library:
    paths:
    - aiohttp/
  configs:
    paths:
    - requirements/
    - ".git*"
    - "*.toml"
    - "*.yml"
  changelog:
    paths:
    - CHANGES/
    - CHANGES.rst
  docs:
    paths:
    - docs/
    - "*.md"
    - "*.rst"
    - "*.txt"
  tests:
    paths:
    - tests/
  tools:
    paths:
    - tools/
  third-party:
    paths:
    - vendor/


================================================
FILE: .coveragerc.toml
================================================
[run]
branch = true
# NOTE: `ctrace` tracing method is needed because the `sysmon` tracer
# NOTE: which is default on Python 3.14, causes unprecedented slow-down
# NOTE: of the test runs.
# Ref: https://github.com/coveragepy/coveragepy/issues/2099
core = 'ctrace'
source = [
  'aiohttp',
  'tests',
]
omit = [
  'site-packages',
]

[report]
exclude_also = [
  'if TYPE_CHECKING',
  'assert False',
  ': \.\.\.(\s*#.*)?$',
  '^ +\.\.\.$',
  'pytest.fail\('
]


================================================
FILE: .editorconfig
================================================
# EditorConfig is awesome: http://EditorConfig.org

# top-most EditorConfig file
root = true

# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 4
trim_trailing_whitespace = true
charset = utf-8

[Makefile]
indent_style = tab

[*.{yml,yaml}]
indent_size = 2

[*.rst]
max_line_length = 80


================================================
FILE: .git-blame-ignore-revs
================================================
# git hyper-blame master ignore list.
#
# This file contains a list of git hashes of revisions to be ignored by git
# hyper-blame (in depot_tools). These revisions are considered "unimportant" in
# that they are unlikely to be what you are interested in when blaming.
#
# Instructions:
# - Only large (generally automated) reformatting or renaming CLs should be
#   added to this list. Do not put things here just because you feel they are
#   trivial or unimportant. If in doubt, do not put it on this list.
# - Precede each revision with a comment containing the first line of its log.
#   For bulk work over many commits, place all commits in a block with a single
#   comment at the top describing the work done in those commits.
# - Only put full 40-character hashes on this list (not short hashes or any
#   other revision reference).
# - Append to the bottom of the file (revisions should be in chronological order
#   from oldest to newest).
# - Because you must use a hash, you need to append to this list in a follow-up
#   CL to the actual reformatting CL that you are trying to ignore.

# Black
6ab76b084bf5012b7185046162ed92bedcf073b5

# Apply new hooks
41c5467a62fb1041b77356ea22b81a74305941ef

# Tune C source generation
3f7d64798d46b8b166139811a377ba231b4f36bf

# Apply pyupgrade
32833c3fe081ff75c0b08ace9cc71e821a72fc5e


================================================
FILE: .gitattributes
================================================
tests/data.unknown_mime_type binary
tests/sample.* binary


================================================
FILE: .github/CODEOWNERS
================================================
* @asvetlov
/.github/* @webknjaz @asvetlov
/.circleci/* @webknjaz @asvetlov
/CHANGES/* @asvetlov
/docs/* @asvetlov
/examples/* @asvetlov
/requirements/* @webknjaz @asvetlov
/tests/* @asvetlov
/tools/* @webknjaz @asvetlov
/vendor/* @webknjaz @asvetlov
*.ini @webknjaz @asvetlov
*.md @webknjaz @asvetlov
*.rst @webknjaz @asvetlov
*.toml @webknjaz @asvetlov
*.txt @webknjaz @asvetlov
*.yml @webknjaz @asvetlov
*.yaml @webknjaz @asvetlov
.editorconfig @webknjaz @asvetlov
.git* @webknjaz
Makefile @webknjaz @asvetlov
setup.py @webknjaz @asvetlov
setup.cfg @webknjaz @asvetlov
tox.ini @webknjaz


================================================
FILE: .github/FUNDING.yml
================================================
---

github:
- asvetlov
- webknjaz
- Dreamsorcerer
open_collective: aiohttp
tidelift: pypi/aiohttp  # A single Tidelift platform-name/package-name e.g., npm/babel
custom:
- https://opencollective.com/aio-libs

...


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
---
name: Bug Report
description: Create a report to help us improve.
labels: [bug]
assignees: aio-libs/triagers
body:
- type: markdown
  attributes:
    value: |
      **Thanks for taking a minute to file a bug report!**

      ⚠
      Verify first that your issue is not [already reported on
      GitHub][issue search].

      _Please fill out the form below with as many precise
      details as possible._

      [issue search]: ../search?q=is%3Aissue&type=issues

- type: textarea
  attributes:
    label: Describe the bug
    description: >-
      A clear and concise description of what the bug is.
  validations:
    required: true

- type: textarea
  attributes:
    label: To Reproduce
    description: >-
      Describe the steps to reproduce this bug.
    placeholder: |
      1. Implement the following server or a client '...'
      2. Then run '...'
      3. An error occurs.
      The chances of someone looking at your issue are *vastly* improved if you provide
      complete code that can be copy/pasted and executed directly in Python.
  validations:
    required: true

- type: textarea
  attributes:
    label: Expected behavior
    description: >-
      A clear and concise description of what you expected to happen.
  validations:
    required: true

- type: textarea
  attributes:
    label: Logs/tracebacks
    description: |
      If applicable, add logs/tracebacks to help explain your problem.
      Paste the output of the steps above, including the commands
      themselves and their output/traceback etc.
    render: python-traceback
  validations:
    required: true

- type: textarea
  attributes:
    label: Python Version
    description: Attach your version of Python.
    render: console
    value: |
      $ python --version
  validations:
    required: true
- type: textarea
  attributes:
    label: aiohttp Version
    description: Attach your version of aiohttp.
    render: console
    value: |
      $ python -m pip show aiohttp
  validations:
    required: true
- type: textarea
  attributes:
    label: multidict Version
    description: Attach your version of multidict.
    render: console
    value: |
      $ python -m pip show multidict
  validations:
    required: true
- type: textarea
  attributes:
    label: propcache Version
    description: Attach your version of propcache.
    render: console
    value: |
      $ python -m pip show propcache
  validations:
    required: true
- type: textarea
  attributes:
    label: yarl Version
    description: Attach your version of yarl.
    render: console
    value: |
      $ python -m pip show yarl
  validations:
    required: true

- type: textarea
  attributes:
    label: OS
    placeholder: >-
      For example, Arch Linux, Windows, macOS, etc.
  validations:
    required: true

- type: dropdown
  attributes:
    label: Related component
    description: >-
      aiohttp is both server framework and client library.
      For getting rid of confusing make sure to select
      'server', 'client' or both.
    multiple: true
    options:
    - Server
    - Client
  validations:
    required: true

- type: textarea
  attributes:
    label: Additional context
    description: |
      Add any other context about the problem here.

      Describe the environment you have that lead to your issue.
      This includes proxy server and other bits that are related to your case.

- type: checkboxes
  attributes:
    label: Code of Conduct
    description: |
      Read the [aio-libs Code of Conduct][CoC] first.

      [CoC]: https://github.com/aio-libs/.github/blob/master/CODE_OF_CONDUCT.md
    options:
    - label: I agree to follow the aio-libs Code of Conduct
      required: true
...


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
# Ref: https://help.github.com/en/github/building-a-strong-community/configuring-issue-templates-for-your-repository#configuring-the-template-chooser
blank_issues_enabled: false  # default: true
contact_links:
- name: 🤷💻🤦 StackOverflow
  url: https://stackoverflow.com/questions/tagged/aiohttp
  about: Please ask typical Q&A here
- name: 💬 Github Discussions
  url: https://github.com/aio-libs/aiohttp/discussions
  about: Please start usage discussions here
- name: 💬 Gitter Chat
  url: https://gitter.im/aio-libs/Lobby
  about: Chat with devs and community


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
---
name: 🚀 Feature request
description: Suggest an idea for this project.
labels: enhancement
body:
- type: markdown
  attributes:
    value: |
      **Thanks for taking a minute to file a feature for aiohttp!**

      ⚠
      Verify first that your feature request is not [already reported on
      GitHub][issue search].

      _Please fill out the form below with as many precise
      details as possible._

      [issue search]: ../search?q=is%3Aissue&type=issues

- type: textarea
  attributes:
    label: Is your feature request related to a problem?
    description: >-
       Please add a clear and concise description of what
       the problem is. _Ex. I'm always frustrated when [...]_

- type: textarea
  attributes:
    label: Describe the solution you'd like
    description: >-
      A clear and concise description of what you want to happen.
  validations:
    required: true

- type: textarea
  attributes:
    label: Describe alternatives you've considered
    description: >-
      A clear and concise description of any alternative solutions
      or features you've considered.
  validations:
    required: true

- type: dropdown
  attributes:
    label: Related component
    description: >-
      aiohttp is both server framework and client library.
      For getting rid of confusing make sure to select
      'server', 'client' or both.
    multiple: true
    options:
    - Server
    - Client
  validations:
    required: true

- type: textarea
  attributes:
    label: Additional context
    description: >-
      Add any other context or screenshots about
      the feature request here.

- type: checkboxes
  attributes:
    label: Code of Conduct
    description: |
      Read the [aio-libs Code of Conduct][CoC] first.

      [CoC]: https://github.com/aio-libs/.github/blob/master/CODE_OF_CONDUCT.md
    options:
    - label: I agree to follow the aio-libs Code of Conduct
      required: true
...


================================================
FILE: .github/ISSUE_TEMPLATE.md
================================================
## Long story short

<!-- Please describe your problem and why the fix is important. -->

## Expected behaviour

<!-- What is the behaviour you expect? -->

## Actual behaviour

<!-- What's actually happening? -->

## Steps to reproduce

<!-- Please describe steps to reproduce the issue.
     If you have a script that does that please include it here within
     markdown code markup. The chances of someone looking at your issue
     are *vastly* improved if you provide complete code that can be
     copy/pasted and executed directly in Python. -->

## Your environment

<!-- Describe the environment you have that lead to your issue.
     This includes aiohttp version, OS, proxy server and other bits that
     are related to your case.

     IMPORTANT: aiohttp is both server framework and client library.
     For getting rid of confusing please put 'server', 'client' or 'both'
     word here.
     -->


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
<!-- Thank you for your contribution! -->

## What do these changes do?

<!-- Please give a short brief about these changes. -->

## Are there changes in behavior for the user?

<!-- Outline any notable behaviour for the end users. -->

## Is it a substantial burden for the maintainers to support this?

<!--
Stop right there! Pause. Just for a minute... Can you think of anything
obvious that would complicate the ongoing development of this project?

Try to consider if you'd be able to maintain it throughout the next
5 years. Does it seem viable? Tell us your thoughts! We'd very much
love to hear what the consequences of merging this patch might be...

This will help us assess if your change is something we'd want to
entertain early in the review process. Thank you in advance!
-->

## Related issue number

<!-- Will this resolve any open issues? -->
<!-- Remember to prefix with 'Fixes' if it closes an issue (e.g. 'Fixes #123'). -->

## Checklist

- [ ] I think the code is well written
- [ ] Unit tests for the changes exist
- [ ] Documentation reflects the changes
- [ ] If you provide code modification, please add yourself to `CONTRIBUTORS.txt`
  * The format is &lt;Name&gt; &lt;Surname&gt;.
  * Please keep alphabetical order, the file is sorted by names.
- [ ] Add a new news fragment into the `CHANGES/` folder
  * name it `<issue_or_pr_num>.<type>.rst` (e.g. `588.bugfix.rst`)
  * if you don't have an issue number, change it to the pull request
    number after creating the PR
    * `.bugfix`: A bug fix for something the maintainers deemed an
      improper undesired behavior that got corrected to match
      pre-agreed expectations.
    * `.feature`: A new behavior, public APIs. That sort of stuff.
    * `.deprecation`: A declaration of future API removals and breaking
      changes in behavior.
    * `.breaking`: When something public is removed in a breaking way.
      Could be deprecated in an earlier release.
    * `.doc`: Notable updates to the documentation structure or build
      process.
    * `.packaging`: Notes for downstreams about unobvious side effects
      and tooling. Changes in the test invocation considerations and
      runtime assumptions.
    * `.contrib`: Stuff that affects the contributor experience. e.g.
      Running tests, building the docs, setting up the development
      environment.
    * `.misc`: Changes that are hard to assign to any of the above
      categories.
  * Make sure to use full sentences with correct case and punctuation,
    for example:
    ```rst
    Fixed issue with non-ascii contents in doctest text files
    -- by :user:`contributor-gh-handle`.
    ```

    Use the past tense or the present tense a non-imperative mood,
    referring to what's changed compared to the last released version
    of this project.


================================================
FILE: .github/codeql.yml
================================================
query-filters:
  - exclude:
      id:
        - py/ineffectual-statement
        - py/unsafe-cyclic-import


================================================
FILE: .github/config.yml
================================================
chronographer:
  exclude:
    bots:
    - dependabot-preview
    - dependabot
    - patchback
    humans:
    - pyup-bot


================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:

  # Maintain dependencies for GitHub Actions
  - package-ecosystem: "github-actions"
    directory: "/"
    labels:
      - dependencies
    schedule:
      interval: "daily"

  # Maintain dependencies for Python
  - package-ecosystem: "pip"
    directory: "/"
    allow:
      - dependency-type: "all"
    labels:
      - dependencies
    schedule:
      interval: "daily"
    open-pull-requests-limit: 10

  # Maintain dependencies for GitHub Actions aiohttp backport
  - package-ecosystem: "github-actions"
    directory: "/"
    labels:
      - dependencies
    target-branch: "3.14"
    schedule:
      interval: "daily"
    open-pull-requests-limit: 10

  # Maintain dependencies for Python aiohttp backport
  - package-ecosystem: "pip"
    directory: "/"
    allow:
      - dependency-type: "all"
    labels:
      - dependencies
    target-branch: "3.14"
    schedule:
      interval: "daily"
    open-pull-requests-limit: 10

  - package-ecosystem: "docker"
    directory: "/tests/autobahn/"
    labels:
      - dependencies
    schedule:
      interval: "monthly"

  - package-ecosystem: "docker"
    directory: "/tests/autobahn/"
    labels:
      - dependencies
    target-branch: "3.14"
    schedule:
      interval: "monthly"


================================================
FILE: .github/lock.yml
================================================
# Configuration for Lock Threads - https://github.com/dessant/lock-threads
# GitHub App - https://github.com/apps/lock

---
# Number of days of inactivity before a closed issue or pull request is locked
daysUntilLock: 365

# Skip issues and pull requests created before a given timestamp. Timestamp must
# follow ISO 8601 (`YYYY-MM-DD`). Set to `false` to disable
skipCreatedBefore: false

# Issues and pull requests with these labels will be ignored.
# Set to `[]` to disable
exemptLabels: []

# Label to add before locking, such as `outdated`.
# Set to `false` to disable
lockLabel: outdated

# Comment to post before locking. Set to `false` to disable
lockComment: false

# Assign `resolved` as the reason for locking. Set to `false` to disable
setLockReason: true

# Limit to only `issues` or `pulls`
# only: issues

# Optionally, specify configuration settings just for `issues` or `pulls`
# issues:
#   exemptLabels:
#     - help-wanted
#   lockLabel: outdated

# pulls:
#   daysUntilLock: 30

# Repository to extend settings from
# _extends: repo


================================================
FILE: .github/workflows/auto-merge.yml
================================================
name: Dependabot auto-merge
on: pull_request_target

permissions:
  pull-requests: write
  contents: write

jobs:
  dependabot:
    runs-on: ubuntu-latest
    if: ${{ github.actor == 'dependabot[bot]' }}
    steps:
      - name: Dependabot metadata
        id: metadata
        uses: dependabot/fetch-metadata@v2
        with:
          github-token: "${{ secrets.GITHUB_TOKEN }}"
      - name: Enable auto-merge for Dependabot PRs
        run: gh pr merge --auto --squash "$PR_URL"
        env:
          PR_URL: ${{github.event.pull_request.html_url}}
          GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}


================================================
FILE: .github/workflows/ci-cd.yml
================================================
name: CI

on:
  merge_group:
  push:
    branches:
      - 'master'
      - '[0-9].[0-9]+'  # matches to backport branches, e.g. 3.6
    tags: [ 'v*' ]
  pull_request:
    branches:
      - 'master'
      - '[0-9].[0-9]+'
  schedule:
    - cron:  '0 6 * * *'  # Daily 6AM UTC build

concurrency:
  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
  cancel-in-progress: true

env:
  COLOR: yes
  FORCE_COLOR: 1  # Request colored output from CLI tools supporting it
  MYPY_FORCE_COLOR: 1
  PY_COLORS: 1
  UPSTREAM_REPOSITORY_ID: >-
    13258039

permissions: {}

jobs:

  pre-setup:
    name: Pre-Setup global build settings
    runs-on: ubuntu-latest
    outputs:
      upstream-repository-id: ${{ env.UPSTREAM_REPOSITORY_ID }}
      release-requested: >-
        ${{
          (
            github.event_name == 'push'
            && github.ref_type == 'tag'
          )
          && true
          || false
        }}
    steps:
      - name: Dummy
        if: false
        run: |
          echo "Pre-setup step"

  lint:
    permissions:
      contents: read # to fetch code (actions/checkout)

    name: Linter
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
    - name: Checkout
      uses: actions/checkout@v6
      with:
        submodules: true
    - name: >-
        Verify that `requirements/runtime-deps.in`
        is in sync with `pyproject.toml`
      run: |
        set -eEuo pipefail
        make sync-direct-runtime-deps
        git diff --exit-code -- requirements/runtime-deps.in
    - name: Setup Python
      uses: actions/setup-python@v6
      with:
        python-version: 3.11
    - name: Cache PyPI
      uses: actions/cache@v5.0.4
      with:
        key: pip-lint-${{ hashFiles('requirements/*.txt') }}
        path: ~/.cache/pip
        restore-keys: |
            pip-lint-
    - name: Update pip, wheel, setuptools, build, twine
      run: |
        python -m pip install -U pip wheel setuptools build twine
    - name: Install dependencies
      run: |
        python -m pip install -r requirements/lint.in -c requirements/lint.txt
    - name: Install self
      run: |
        python -m pip install . -c requirements/runtime-deps.txt
      env:
        AIOHTTP_NO_EXTENSIONS: 1
    - name: Run mypy
      run: |
        make mypy
    - name: Run slotscheck
      run: |
        # Some extra requirements are needed to ensure all modules
        # can be scanned by slotscheck.
        pip install -r requirements/base.in -c requirements/base.txt
        slotscheck -v -m aiohttp
    - name: Install spell checker
      run: |
        pip install -r requirements/doc-spelling.in -c requirements/doc-spelling.txt
    - name: Run docs spelling
      run: |
        # towncrier --yes  # uncomment me after publishing a release
        make doc-spelling
    - name: Build package
      run: |
        python -m build
      env:
        AIOHTTP_NO_EXTENSIONS: 1
    - name: Run twine checker
      run: |
        twine check --strict dist/*
    - name: Making sure that CONTRIBUTORS.txt remains sorted
      run: |
        LC_ALL=C sort --check --ignore-case CONTRIBUTORS.txt

  gen_llhttp:
    permissions:
      contents: read # to fetch code (actions/checkout)

    name: Generate llhttp sources
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
    - name: Checkout
      uses: actions/checkout@v6
      with:
        submodules: true
    - name: Cache llhttp generated files
      uses: actions/cache@v5.0.4
      id: cache
      with:
        key: llhttp-${{ hashFiles('vendor/llhttp/package*.json', 'vendor/llhttp/src/**/*') }}
        path:  vendor/llhttp/build
    - name: Setup NodeJS
      if: steps.cache.outputs.cache-hit != 'true'
      uses: actions/setup-node@v6
      with:
        node-version: 18
    - name: Generate llhttp sources
      if: steps.cache.outputs.cache-hit != 'true'
      run: |
        make generate-llhttp
    - name: Upload llhttp generated files
      uses: actions/upload-artifact@v6
      with:
        name: llhttp
        path: vendor/llhttp/build
        if-no-files-found: error

  test:
    permissions:
      contents: read # to fetch code (actions/checkout)

    name: Test
    needs: gen_llhttp
    strategy:
      matrix:
        pyver: ['3.10', '3.11', '3.12', '3.13', '3.14']
        no-extensions: ['', 'Y']
        os: [ubuntu, macos, windows]
        experimental: [false]
        exclude:
          - os: macos
            no-extensions: 'Y'
          - os: windows
            no-extensions: 'Y'
        include:
          - pyver: pypy-3.11
            no-extensions: 'Y'
            os: ubuntu
            experimental: false
          - os: ubuntu
            pyver: "3.14t"
            no-extensions: ''
            experimental: false
      fail-fast: true
    runs-on: ${{ matrix.os }}-latest
    continue-on-error: ${{ matrix.experimental }}
    steps:
    - name: Checkout
      uses: actions/checkout@v6
      with:
        submodules: true
    - name: Setup Python ${{ matrix.pyver }}
      id: python-install
      uses: actions/setup-python@v6
      with:
        allow-prereleases: true
        python-version: ${{ matrix.pyver }}
    - name: Get pip cache dir
      id: pip-cache
      run: |
        echo "dir=$(pip cache dir)" >> "${GITHUB_OUTPUT}"
      shell: bash
    - name: Cache PyPI
      uses: actions/cache@v5.0.4
      with:
        key: pip-ci-${{ runner.os }}-${{ matrix.pyver }}-${{ matrix.no-extensions }}-${{ hashFiles('requirements/*.txt') }}
        path: ${{ steps.pip-cache.outputs.dir }}
        restore-keys: |
            pip-ci-${{ runner.os }}-${{ matrix.pyver }}-${{ matrix.no-extensions }}-
    - name: Update pip, wheel, setuptools, build, twine
      run: |
        python -m pip install -U pip wheel setuptools build twine
    - name: Install dependencies
      env:
        DEPENDENCY_GROUP: test${{ endsWith(matrix.pyver, 't') && '-ft' || '' }}
      run: |
        python -Im pip install -r requirements/${{ env.DEPENDENCY_GROUP }}.in -c requirements/${{ env.DEPENDENCY_GROUP }}.txt
    - name: Set PYTHON_GIL=0 for free-threading builds
      if: ${{ endsWith(matrix.pyver, 't') }}
      run: echo "PYTHON_GIL=0" >> $GITHUB_ENV
    - name: Restore llhttp generated files
      if: ${{ matrix.no-extensions == '' }}
      uses: actions/download-artifact@v8
      with:
        name: llhttp
        path: vendor/llhttp/build/
    - name: Cythonize
      if: ${{ matrix.no-extensions == '' }}
      run: |
        make cythonize
    - name: Install self
      env:
        AIOHTTP_NO_EXTENSIONS: ${{ matrix.no-extensions }}
      run: python -m pip install -e .
    - name: Run unittests
      env:
        COLOR: yes
        AIOHTTP_NO_EXTENSIONS: ${{ matrix.no-extensions }}
        PIP_USER: 1
      run: >-
        PATH="${HOME}/Library/Python/3.11/bin:${HOME}/.local/bin:${PATH}"
        pytest --junitxml=junit.xml -m 'not dev_mode and not autobahn'
      shell: bash
    - name: Re-run the failing tests with maximum verbosity
      if: failure()
      env:
        COLOR: yes
        AIOHTTP_NO_EXTENSIONS: ${{ matrix.no-extensions }}
      run: >-  # `exit 1` makes sure that the job remains red with flaky runs
        pytest --no-cov --numprocesses=0 -vvvvv --lf && exit 1
      shell: bash
    - name: Run dev_mode tests
      env:
        COLOR: yes
        AIOHTTP_NO_EXTENSIONS: ${{ matrix.no-extensions }}
        PIP_USER: 1
        PYTHONDEVMODE: 1
      run: pytest -m dev_mode --cov-append --numprocesses=0
      shell: bash
    - name: Turn coverage into xml
      env:
        COLOR: 'yes'
        PIP_USER: 1
      run: |
        python -m coverage xml
    - name: Upload coverage
      uses: codecov/codecov-action@v5
      with:
        files: ./coverage.xml
        flags: >-
          CI-GHA,OS-${{
            runner.os
          }},VM-${{
            matrix.os
          }},Py-${{
            steps.python-install.outputs.python-version
          }}
        token: ${{ secrets.CODECOV_TOKEN }}
    - name: Upload test results to Codecov
      if: ${{ !cancelled() }}
      uses: codecov/test-results-action@v1
      with:
        token: ${{ secrets.CODECOV_TOKEN }}

  autobahn:
    permissions:
      contents: read # to fetch code (actions/checkout)

    name: Autobahn testsuite
    needs: gen_llhttp
    strategy:
      matrix:
        pyver: ['3.14']
        no-extensions: ['']
        os: [ubuntu]
      fail-fast: true
    runs-on: ${{ matrix.os }}-latest
    steps:
    - name: Checkout
      uses: actions/checkout@v6
      with:
        submodules: true
    - name: Setup Python ${{ matrix.pyver }}
      id: python-install
      uses: actions/setup-python@v6
      with:
        allow-prereleases: true
        python-version: ${{ matrix.pyver }}
    - name: Get pip cache dir
      id: pip-cache
      run: |
        echo "dir=$(pip cache dir)" >> "${GITHUB_OUTPUT}"
      shell: bash
    - name: Cache PyPI
      uses: actions/cache@v5.0.4
      with:
        key: pip-ci-${{ runner.os }}-${{ matrix.pyver }}-${{ matrix.no-extensions }}-${{ hashFiles('requirements/*.txt') }}
        path: ${{ steps.pip-cache.outputs.dir }}
        restore-keys: |
            pip-ci-${{ runner.os }}-${{ matrix.pyver }}-${{ matrix.no-extensions }}-
    - name: Update pip, wheel, setuptools, build, twine
      run: |
        python -m pip install -U pip wheel setuptools build twine
    - name: Install dependencies
      env:
        DEPENDENCY_GROUP: test${{ endsWith(matrix.pyver, 't') && '-ft' || '' }}
      run: |
        python -Im pip install -r requirements/${{ env.DEPENDENCY_GROUP }}.in -c requirements/${{ env.DEPENDENCY_GROUP }}.txt
    - name: Restore llhttp generated files
      if: ${{ matrix.no-extensions == '' }}
      uses: actions/download-artifact@v8
      with:
        name: llhttp
        path: vendor/llhttp/build/
    - name: Cythonize
      if: ${{ matrix.no-extensions == '' }}
      run: |
        make cythonize
    - name: Install self
      env:
        AIOHTTP_NO_EXTENSIONS: ${{ matrix.no-extensions }}
      run: python -m pip install -e .
    - name: Run unittests
      env:
        COLOR: yes
        AIOHTTP_NO_EXTENSIONS: ${{ matrix.no-extensions }}
        PIP_USER: 1
      run: >-
        PATH="${HOME}/Library/Python/3.11/bin:${HOME}/.local/bin:${PATH}"
        pytest --junitxml=junit.xml --numprocesses=0 -m autobahn
      shell: bash
    - name: Turn coverage into xml
      env:
        COLOR: 'yes'
        PIP_USER: 1
      run: |
        python -m coverage xml
    - name: Upload coverage
      uses: codecov/codecov-action@v5
      with:
        files: ./coverage.xml
        flags: >-
          CI-GHA,OS-${{
            runner.os
          }},VM-${{
            matrix.os
          }},Py-${{
            steps.python-install.outputs.python-version
          }}
        token: ${{ secrets.CODECOV_TOKEN }}
    - name: Upload test results to Codecov
      if: ${{ !cancelled() }}
      uses: codecov/test-results-action@v1
      with:
        token: ${{ secrets.CODECOV_TOKEN }}

  benchmark:
    name: Benchmark
    needs:
    - gen_llhttp
    - pre-setup  # transitive, for accessing settings
    if: >-
      needs.pre-setup.outputs.upstream-repository-id == github.repository_id
    runs-on: ubuntu-latest
    timeout-minutes: 12
    steps:
    - name: Checkout project
      uses: actions/checkout@v6
      with:
        submodules: true
    - name: Setup Python 3.13.2
      id: python-install
      uses: actions/setup-python@v6
      with:
        python-version: 3.13.2
        cache: pip
        cache-dependency-path: requirements/*.txt
    - name: Update pip, wheel, setuptools, build, twine
      run: |
        python -m pip install -U pip wheel setuptools build twine
    - name: Install dependencies
      run: |
        python -m pip install -r requirements/test.in -c requirements/test.txt
    - name: Restore llhttp generated files
      uses: actions/download-artifact@v8
      with:
        name: llhttp
        path: vendor/llhttp/build/
    - name: Cythonize
      run: |
        make cythonize
    - name: Install self
      run: python -m pip install -e .
    - name: Run benchmarks
      uses: CodSpeedHQ/action@v4
      with:
        mode: instrumentation
        run: python -Im pytest --no-cov --numprocesses=0 -vvvvv --codspeed


  check:  # This job does nothing and is only used for the branch protection
    if: always()

    needs:
    - lint
    - test
    - autobahn

    runs-on: ubuntu-latest

    steps:
    - name: Decide whether the needed jobs succeeded or failed
      uses: re-actors/alls-green@release/v1
      with:
        jobs: ${{ toJSON(needs) }}
    - name: Trigger codecov notification
      uses: codecov/codecov-action@v5
      with:
        token: ${{ secrets.CODECOV_TOKEN }}
        fail_ci_if_error: true
        run_command: send-notifications

  pre-deploy:
    name: Pre-Deploy
    runs-on: ubuntu-latest
    needs:
    - check
    - pre-setup  # transitive, for accessing settings
    if: fromJSON(needs.pre-setup.outputs.release-requested)
    steps:
      - name: Dummy
        run: |
            echo "Predeploy step"

  build-tarball:
    permissions:
      contents: read # to fetch code (actions/checkout)

    name: Tarball
    runs-on: ubuntu-latest
    needs: pre-deploy
    steps:
    - name: Checkout
      uses: actions/checkout@v6
      with:
        submodules: true
    - name: Setup Python
      uses: actions/setup-python@v6
    - name: Update pip, wheel, setuptools, build, twine
      run: |
        python -m pip install -U pip wheel setuptools build twine
    - name: Install cython
      run: >-
        python -m
        pip install -r requirements/cython.in -c requirements/cython.txt
    - name: Restore llhttp generated files
      uses: actions/download-artifact@v8
      with:
        name: llhttp
        path: vendor/llhttp/build/
    - name: Cythonize
      run: |
        make cythonize
    - name: Make sdist
      run: |
        python -m build --sdist
    - name: Upload artifacts
      uses: actions/upload-artifact@v6
      with:
        name: dist-sdist
        path: dist

  build-wheels:
    permissions:
      contents: read # to fetch code (actions/checkout)

    name: Build wheels on ${{ matrix.os }} ${{ matrix.qemu }} ${{ matrix.musl }}
    runs-on: ${{ matrix.os }}
    needs: pre-deploy
    strategy:
      matrix:
        os: ["ubuntu-latest", "windows-latest", "windows-11-arm", "macos-latest", "ubuntu-24.04-arm"]
        qemu: ['']
        musl: [""]
        include:
          # Split ubuntu/musl jobs for the sake of speed-up
        - os: ubuntu-latest
          qemu: ppc64le
          musl: ""
        - os: ubuntu-latest
          qemu: ppc64le
          musl: musllinux
        - os: ubuntu-latest
          qemu: riscv64
          musl: ""
        - os: ubuntu-latest
          qemu: riscv64
          musl: musllinux
        - os: ubuntu-latest
          qemu: s390x
          musl: ""
        - os: ubuntu-latest
          qemu: s390x
          musl: musllinux
        - os: ubuntu-latest
          qemu: armv7l
          musl: ""
        - os: ubuntu-latest
          qemu: armv7l
          musl: musllinux
        - os: ubuntu-latest
          musl: musllinux
        - os: ubuntu-24.04-arm
          musl: musllinux
    steps:
    - name: Checkout
      uses: actions/checkout@v6
      with:
        submodules: true
    - name: Set up QEMU
      if: ${{ matrix.qemu }}
      uses: docker/setup-qemu-action@v4
      with:
        platforms: all
        # This should be temporary
        # xref https://github.com/docker/setup-qemu-action/issues/188
        # xref https://github.com/tonistiigi/binfmt/issues/215
        image: tonistiigi/binfmt:qemu-v8.1.5
      id: qemu
    - name: Prepare emulation
      run: |
        if [[ -n "${{ matrix.qemu }}" ]]; then
          # Build emulated architectures only if QEMU is set,
          # use default "auto" otherwise
          echo "CIBW_ARCHS_LINUX=${{ matrix.qemu }}" >> $GITHUB_ENV
        fi
      shell: bash
    - name: Setup Python
      uses: actions/setup-python@v6
      with:
        python-version: 3.x
    - name: Update pip, wheel, setuptools, build, twine
      run: |
        python -m pip install -U pip wheel setuptools build twine
    - name: Install cython
      run: >-
        python -m
        pip install -r requirements/cython.in -c requirements/cython.txt
    - name: Restore llhttp generated files
      uses: actions/download-artifact@v8
      with:
        name: llhttp
        path: vendor/llhttp/build/
    - name: Cythonize
      run: |
        make cythonize
    - name: Build wheels
      uses: pypa/cibuildwheel@v3.4.0
      env:
        CIBW_SKIP: pp* ${{ matrix.musl == 'musllinux' && '*manylinux*' || '*musllinux*' }}
        CIBW_ARCHS_MACOS: x86_64 arm64 universal2
    - name: Upload wheels
      uses: actions/upload-artifact@v6
      with:
        name: >-
          dist-${{ matrix.os }}-${{ matrix.musl }}-${{
            matrix.qemu
            && matrix.qemu
            || 'native'
          }}
        path: ./wheelhouse/*.whl

  deploy:
    name: Deploy
    needs:
    - build-tarball
    - build-wheels
    - pre-setup  # transitive, for accessing settings
    runs-on: ubuntu-latest
    if: >-
      needs.pre-setup.outputs.upstream-repository-id == github.repository_id

    permissions:
      contents: write  # IMPORTANT: mandatory for making GitHub Releases
      id-token: write  # IMPORTANT: mandatory for trusted publishing & sigstore

    environment:
      name: pypi
      url: https://pypi.org/p/aiohttp

    steps:
    - name: Checkout
      uses: actions/checkout@v6
      with:
        submodules: true
    - name: Login
      run: |
        echo "${{ secrets.GITHUB_TOKEN }}" | gh auth login --with-token
    - name: Download distributions
      uses: actions/download-artifact@v8
      with:
        path: dist
        pattern: dist-*
        merge-multiple: true
    - name: Collected dists
      run: |
        tree dist
    - name: Make Release
      uses: aio-libs/create-release@v1.6.6
      with:
        changes_file: CHANGES.rst
        name: aiohttp
        version_file: aiohttp/__init__.py
        github_token: ${{ secrets.GITHUB_TOKEN }}
        dist_dir: dist
        fix_issue_regex: >-
          :issue:`(\d+)`
        fix_issue_repl: >-
          #\1

    - name: >-
        Publish 🐍📦 to PyPI
      uses: pypa/gh-action-pypi-publish@release/v1

    - name: Sign the dists with Sigstore
      uses: sigstore/gh-action-sigstore-python@v3.2.0
      with:
        inputs: >-
          ./dist/*.tar.gz
          ./dist/*.whl

    - name: Upload artifact signatures to GitHub Release
      # Confusingly, this action also supports updating releases, not
      # just creating them. This is what we want here, since we've manually
      # created the release above.
      uses: softprops/action-gh-release@v2
      with:
        # dist/ contains the built packages, which smoketest-artifacts/
        # contains the signatures and certificates.
        files: dist/**


================================================
FILE: .github/workflows/codeql.yml
================================================
name: "CodeQL"

on:
  push:
    branches:
      - 'master'
      - '[0-9].[0-9]+'  # matches to backport branches, e.g. 3.6
  pull_request:
    branches: [ "master" ]
  schedule:
    - cron: "9 1 * * 4"

jobs:
  analyze:
    name: Analyze
    runs-on: ubuntu-latest
    permissions:
      actions: read
      contents: read
      security-events: write

    strategy:
      fail-fast: false
      matrix:
        language: [ python, javascript ]

    steps:
      - name: Checkout
        uses: actions/checkout@v6

      - name: Initialize CodeQL
        uses: github/codeql-action/init@v4
        with:
          languages: ${{ matrix.language }}
          config-file: ./.github/codeql.yml
          queries: +security-and-quality

      - name: Autobuild
        uses: github/codeql-action/autobuild@v4
        if: ${{ matrix.language == 'python' || matrix.language == 'javascript' }}

      - name: Perform CodeQL Analysis
        uses: github/codeql-action/analyze@v4
        with:
          category: "/language:${{ matrix.language }}"


================================================
FILE: .github/workflows/label-remove.yml
================================================
name: Clear needs-info/pr-unfinished on activity
on:
  pull_request:
    types: [synchronize, review_requested]
  issue_comment:
    types: [created]
  pull_request_review_comment:
    types: [created]

jobs:
  clear-pr-unfinished:
    runs-on: ubuntu-latest
    permissions:
      pull-requests: write

    steps:
      - name: Remove label
        uses: actions-ecosystem/action-remove-labels@v1
        with:
          labels: |
            needs-info
            pr-unfinished


================================================
FILE: .github/workflows/labels.yml
================================================
name: Labels
on:
  pull_request:
    branches:
      - 'master'
    types: [labeled, opened, synchronize, reopened, unlabeled]

jobs:
  backport:
    runs-on: ubuntu-latest
    name: Backport label added
    if: ${{ github.event.pull_request.user.type != 'Bot' }}
    steps:
      - uses: actions/github-script@v8
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            const pr = await github.rest.pulls.get({
              owner: context.repo.owner,
              repo: context.repo.repo,
              pull_number: context.payload.pull_request.number
            });
            if (!pr.data.labels.find(l => l.name.startsWith("backport")))
              process.exit(1);


================================================
FILE: .github/workflows/stale.yml
================================================
name: 'Close stale issues'
on:
  schedule:
    - cron: '50 5 * * *'

permissions:
  issues: write

jobs:
  stale:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/stale@v10
        with:
          days-before-stale: 30
          any-of-labels: needs-info


================================================
FILE: .gitignore
================================================
*.bak
*.egg
*.egg-info
*.eggs
*.md5
*.pyc
*.pyd
*.pyo
*.so
*.swp
*.tar.gz
*~
.DS_Store
.Python
.cache
.codspeed
.coverage
.coverage.*
.develop
.direnv
.envrc
.flake
.gitconfig
.hash
.idea
.install-cython
.install-deps
.llhttp-gen
.installed.cfg
.mypy_cache
.noseids
.pytest_cache
.python-version
.test-results
.tox
.vimrc
.vscode
aiohttp/_find_header.c
aiohttp/_headers.html
aiohttp/_headers.pxi
aiohttp/_http_parser.c
aiohttp/_http_parser.html
aiohttp/_http_writer.c
aiohttp/_http_writer.html
aiohttp/_websocket.c
aiohttp/_websocket.html
aiohttp/_websocket/mask.c
aiohttp/_websocket/reader_c.c
bin
build
coverage.xml
develop-eggs
dist
docs/_build/
eggs
htmlcov
include/
lib/
man/
nosetests.xml
parts
pip-wheel-metadata
pyvenv
sources
var/*
venv
virtualenv.py


================================================
FILE: .gitmodules
================================================
[submodule "vendor/llhttp"]
    path = vendor/llhttp
    url = https://github.com/nodejs/llhttp.git
    branch = main


================================================
FILE: .lgtm.yml
================================================
queries:
- exclude: py/unsafe-cyclic-import


================================================
FILE: .mypy.ini
================================================
[mypy]
files = aiohttp, docs/code, examples, tests
check_untyped_defs = True
follow_imports_for_stubs = True
disallow_any_decorated = True
disallow_any_generics = True
disallow_any_unimported = True
disallow_incomplete_defs = True
disallow_subclassing_any = True
disallow_untyped_calls = True
disallow_untyped_decorators = True
disallow_untyped_defs = True
# TODO(PY312): explicit-override
enable_error_code = deprecated, exhaustive-match, ignore-without-code, possibly-undefined, redundant-expr, redundant-self, truthy-bool, truthy-iterable, unused-awaitable
extra_checks = True
follow_untyped_imports = True
implicit_reexport = False
no_implicit_optional = True
pretty = True
show_column_numbers = True
show_error_codes = True
show_error_code_links = True
strict_bytes = True
strict_equality = True
warn_incomplete_stub = True
warn_redundant_casts = True
warn_return_any = True
warn_unreachable = True
warn_unused_ignores = True

[mypy-brotli]
ignore_missing_imports = True

[mypy-brotlicffi]
ignore_missing_imports = True

[mypy-gunicorn.*]
ignore_missing_imports = True


================================================
FILE: .pip-tools.toml
================================================
[pip-tools]
allow-unsafe = true
resolver = "backtracking"
strip-extras = true


================================================
FILE: .pre-commit-config.yaml
================================================
repos:
- repo: local
  hooks:
  - id: changelogs-rst
    name: changelog filenames
    language: fail
    entry: >-
      Changelog files must be named
      ####.(
      bugfix
      | feature
      | deprecation
      | breaking
      | doc
      | packaging
      | contrib
      | misc
      )(.#)?(.rst)?
    exclude: >-
      (?x)
      ^
        CHANGES/(
          \.gitignore
          |(\d+|[0-9a-f]{8}|[0-9a-f]{7}|[0-9a-f]{40})\.(
            bugfix
            |feature
            |deprecation
            |breaking
            |doc
            |packaging
            |contrib
            |misc
          )(\.\d+)?(\.rst)?
          |README\.rst
          |\.TEMPLATE\.rst
        )
      $
    files: ^CHANGES/
  - id: changelogs-user-role
    name: Changelog files should use a non-broken :user:`name` role
    language: pygrep
    entry: :user:([^`]+`?|`[^`]+[\s,])
    pass_filenames: true
    types: [file, rst]
  - id: check-changes
    name: Check CHANGES
    language: system
    entry: ./tools/check_changes.py
    pass_filenames: false
- repo: https://github.com/pre-commit/pre-commit-hooks
  rev: 'v6.0.0'
  hooks:
  - id: check-merge-conflict
- repo: https://github.com/asottile/yesqa
  rev: v1.5.0
  hooks:
  - id: yesqa
    additional_dependencies:
      - flake8-docstrings==1.6.0
      - flake8-no-implicit-concat==0.3.4
      - flake8-requirements==1.7.8
- repo: https://github.com/PyCQA/isort
  rev: '8.0.1'
  hooks:
  - id: isort
- repo: https://github.com/psf/black-pre-commit-mirror
  rev: '26.3.1'
  hooks:
    - id: black
      language_version: python3 # Should be a command that runs python
- repo: https://github.com/pre-commit/pre-commit-hooks
  rev: 'v6.0.0'
  hooks:
  - id: end-of-file-fixer
    exclude: >-
      ^docs/[^/]*\.svg$
  - id: requirements-txt-fixer
    files: requirements/.*\.in$
  - id: trailing-whitespace
  - id: file-contents-sorter
    args: ['--ignore-case']
    files: |
      CONTRIBUTORS.txt|
      docs/spelling_wordlist.txt|
      .gitignore|
      .gitattributes
  - id: check-case-conflict
  - id: check-json
  - id: check-xml
  - id: check-executables-have-shebangs
  - id: check-toml
  - id: check-yaml
  - id: debug-statements
  - id: check-added-large-files
  - id: check-symlinks
  - id: fix-byte-order-marker
  - id: detect-aws-credentials
    args: ['--allow-missing-credentials']
  - id: detect-private-key
    exclude: ^examples/
- repo: https://github.com/asottile/pyupgrade
  rev: 'v3.21.2'
  hooks:
  - id: pyupgrade
    args: ['--py37-plus']
- repo: https://github.com/PyCQA/flake8
  rev: '7.3.0'
  hooks:
  - id: flake8
    additional_dependencies:
      - flake8-docstrings==1.6.0
      - flake8-no-implicit-concat==0.3.4
      - flake8-requirements==1.7.8
    exclude: "^docs/"
- repo: https://github.com/Lucas-C/pre-commit-hooks-markup
  rev: v1.0.1
  hooks:
  - id: rst-linter
    files: >-
      ^[^/]+[.]rst$
    exclude: >-
      ^CHANGES\.rst$
- repo: https://github.com/codespell-project/codespell
  rev: v2.4.2
  hooks:
  - id: codespell
    additional_dependencies:
    - tomli


================================================
FILE: .readthedocs.yml
================================================
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html
# for details

---
version: 2

sphinx:
  # Path to your Sphinx configuration file.
  configuration: docs/conf.py

submodules:
  include: all
  exclude: []
  recursive: true

build:
  os: ubuntu-24.04
  tools:
    python: "3.11"
  apt_packages:
    - graphviz

  jobs:
    post_create_environment:
    - >-
      pip install
      . -c requirements/runtime-deps.txt
      -r requirements/doc.in -c requirements/doc.txt

...


================================================
FILE: CHANGES/.TEMPLATE.rst
================================================
{# TOWNCRIER TEMPLATE #}
{% for section, _ in sections.items() %}
{% set underline = underlines[0] %}{% if section %}{{section}}
{{ underline * section|length }}{% set underline = underlines[1] %}

{% endif %}

{% if sections[section] %}
{% for category, val in definitions.items() if category in sections[section]%}
{{ definitions[category]['name'] }}
{{ underline * definitions[category]['name']|length }}

{% if definitions[category]['showcontent'] %}
{% for text, change_note_refs in sections[section][category].items() %}
- {{ text + '\n' }}

  {#
      NOTE: Replacing 'e' with 'f' is a hack that prevents Jinja's `int`
      NOTE: filter internal implementation from treating the input as an
      NOTE: infinite float when it looks like a scientific notation (with a
      NOTE: single 'e' char in between digits), raising an `OverflowError`,
      NOTE: subsequently. 'f' is still a hex letter so it won't affect the
      NOTE: check for whether it's a (short or long) commit hash or not.
      Ref: https://github.com/pallets/jinja/issues/1921
  -#}
  {%-
    set pr_issue_numbers = change_note_refs
    | map('lower')
    | map('replace', 'e', 'f')
    | map('int', default=None)
    | select('integer')
    | map('string')
    | list
  -%}
  {%- set arbitrary_refs = [] -%}
  {%- set commit_refs = [] -%}
  {%- with -%}
    {%- set commit_ref_candidates = change_note_refs | reject('in', pr_issue_numbers) -%}
    {%- for cf in commit_ref_candidates -%}
      {%- if cf | length in (7, 8, 40) and cf | int(default=None, base=16) is not none -%}
        {%- set _ = commit_refs.append(cf) -%}
      {%- else -%}
        {%- set _ = arbitrary_refs.append(cf) -%}
      {%- endif -%}
    {%- endfor -%}
  {%- endwith -%}

  {% if pr_issue_numbers -%}
  *Related issues and pull requests on GitHub:*
  :issue:`{{ pr_issue_numbers | join('`, :issue:`') }}`.
  {% endif %}

  {% if commit_refs -%}
  *Related commits on GitHub:*
  :commit:`{{ commit_refs | join('`, :commit:`') }}`.
  {% endif %}

  {% if arbitrary_refs -%}
  *Unlinked references:*
  {{ arbitrary_refs | join(', ') }}`.
  {% endif %}

{% endfor %}
{% else %}
- {{ sections[section][category]['']|join(', ') }}

{% endif %}
{% if sections[section][category]|length == 0 %}
No significant changes.

{% else %}
{% endif %}

{% endfor %}
{% else %}
No significant changes.


{% endif %}
{% endfor %}
----
{{ '\n' * 2 }}


================================================
FILE: CHANGES/.gitignore
================================================
*
!.TEMPLATE.rst
!.gitignore
!README.rst
!*.bugfix
!*.bugfix.rst
!*.bugfix.*.rst
!*.breaking
!*.breaking.rst
!*.breaking.*.rst
!*.contrib
!*.contrib.rst
!*.contrib.*.rst
!*.deprecation
!*.deprecation.rst
!*.deprecation.*.rst
!*.doc
!*.doc.rst
!*.doc.*.rst
!*.feature
!*.feature.rst
!*.feature.*.rst
!*.misc
!*.misc.rst
!*.misc.*.rst
!*.packaging
!*.packaging.rst
!*.packaging.*.rst


================================================
FILE: CHANGES/10468.doc.rst
================================================
Added ``:canonical:`` directives to documentation reference pages, enabling
``Intersphinx`` cross-referencing via fully-qualified module paths (e.g.
``aiohttp.client.ClientSession``) -- by :user:`danielalanbates`.


================================================
FILE: CHANGES/10596.bugfix.rst
================================================
Fixed server hanging indefinitely when chunked transfer encoding chunk-size
does not match actual data length. The server now raises
``TransferEncodingError`` instead of waiting forever for data that will
never arrive -- by :user:`Fridayai700`.


================================================
FILE: CHANGES/10611.bugfix.rst
================================================
Reject HTTP requests with duplicate ``chunked`` Transfer-Encoding
(e.g. ``Transfer-Encoding: chunked, chunked``) with a
``BadHttpMessage`` error, per :rfc:`9112` section 7.1 -- by :user:`worksbyfriday`.


================================================
FILE: CHANGES/10665.feature.rst
================================================
Added :py:attr:`~aiohttp.web.TCPSite.port` accessor for dynamic port allocations in :class:`~aiohttp.web.TCPSite` -- by :user:`twhittock-disguise` and :user:`rodrigobnogueira`.


================================================
FILE: CHANGES/10683.bugfix.rst
================================================
Fixed misleading TLS-in-TLS warning being emitted when sending HTTPS requests through an HTTP proxy. The warning now only fires when the proxy itself uses HTTPS, which is the only case where TLS-in-TLS actually applies -- by :user:`wavebyrd`.


================================================
FILE: CHANGES/10753.bugfix.rst
================================================
Widened ``trace_request_ctx`` parameter type from ``Mapping[str, Any] | None`` to ``object`` to allow passing instances of user-defined classes as trace context -- by :user:`nightcityblade`.


================================================
FILE: CHANGES/10795.doc.rst
================================================
Replaced the deprecated ``ujson`` library with ``orjson`` in the
client quickstart documentation. ``ujson`` has been put into
maintenance-only mode; ``orjson`` is the recommended alternative.
-- by :user:`indoor47`


================================================
FILE: CHANGES/11012.breaking.rst
================================================
Refactored ``ClientRequest`` class. This simplifies a lot of code and improves our type
checking accuracy. It also better aligns public/private attributes with what we expect
developers to access safely from a client middleware.

If code subclasses ``ClientRequest``, it is likely that the subclass will need tweaking
to be compatible with the new version. Similarly, subclasses of ``ClientResponse`` may
need to adjust ``__init__`` parameters.

-- by :user:`Dreamsorcerer`.


================================================
FILE: CHANGES/11268.feature.rst
================================================
Updated ``_TracingSignal`` to utilize a secondary generic variable for type hinting custom context variables
-- by :user:`Vizonex`.


================================================
FILE: CHANGES/11283.bugfix.rst
================================================
Fixed access log timestamps ignoring daylight saving time (DST) changes. The
previous implementation used :py:data:`time.timezone` which is a constant and
does not reflect DST transitions -- by :user:`nightcityblade`.


================================================
FILE: CHANGES/11601.breaking.rst
================================================
Dropped support for Python 3.9 -- by :user:`Dreamsorcerer`.


================================================
FILE: CHANGES/11681.feature.rst
================================================
Started accepting :term:`asynchronous context managers <asynchronous context manager>` for cleanup contexts.
Legacy single-yield :term:`asynchronous generator` cleanup contexts continue to be
supported; async context managers are adapted internally so they are
entered at startup and exited during cleanup.

-- by :user:`MannXo`.


================================================
FILE: CHANGES/11737.contrib.rst
================================================
The benchmark CI job now runs only in the upstream repository -- by :user:`Cycloctane`.

It used to always fail in forks, which this change fixed.


================================================
FILE: CHANGES/11763.feature.rst
================================================
Added ``decode_text`` parameter to :meth:`~aiohttp.ClientSession.ws_connect` and :class:`~aiohttp.web.WebSocketResponse` to receive WebSocket TEXT messages as raw bytes instead of decoded strings, enabling direct use with high-performance JSON parsers like ``orjson`` -- by :user:`bdraco`.


================================================
FILE: CHANGES/11766.feature.rst
================================================
Added ``RequestKey`` and ``ResponseKey`` classes,
which enable static type checking for request & response
context storages in the same way that ``AppKey`` does for ``Application``
-- by :user:`gsoldatov`.


================================================
FILE: CHANGES/11776.misc.rst
================================================
The warnings emitted when using ``str`` keys in ``web.Response``/``web.Request``
have been removed to avoid any performance concerns when frequently using these -- by :user:`Dreamsorcerer`.


================================================
FILE: CHANGES/11826.contrib.rst
================================================
The coverage tool is now configured using the new native
auto-discovered :file:`.coveragerc.toml` file
-- by :user:`webknjaz`.

It is also set up to use the ``ctrace`` core that works
around the performance issues in the ``sysmon`` tracer
which is default under Python 3.14.


================================================
FILE: CHANGES/11859.bugfix.rst
================================================
Removed support for ``ClientTimeout(total=0)`` to disable timeouts. Use ``None`` instead of ``0`` to disable the total timeout. Passing ``0`` now raises :exc:`ValueError` with a clear error message -- by :user:`veeceey`.


================================================
FILE: CHANGES/11876.misc.rst
================================================
Refactored tests to use ``create_autospec()`` for more robust mocking -- by :user:`soheil-star01`.


================================================
FILE: CHANGES/11898.bugfix.rst
================================================
Restored :py:meth:`~aiohttp.BodyPartReader.decode` as a synchronous method
for backward compatibility. The method was inadvertently changed to async
in 3.13.3 as part of the decompression bomb security fix. A new
:py:meth:`~aiohttp.BodyPartReader.decode_iter` method is now available
for non-blocking decompression of large payloads using an async generator.
Internal aiohttp code uses the async variant to maintain security protections.

Changed multipart processing chunk sizes from 64 KiB to 256KiB, to better
match aiohttp internals
-- by :user:`bdraco` and :user:`Dreamsorcerer`.


================================================
FILE: CHANGES/11937.misc.rst
================================================
Added win_arm64 to the wheels that gets pushed to PyPI
-- by :user:`AraHaan`.


================================================
FILE: CHANGES/11955.feature.rst
================================================
Added ``max_headers`` parameter to limit the number of headers that should be read from a response -- by :user:`Dreamsorcerer`.


================================================
FILE: CHANGES/11972.bugfix.rst
================================================
Fixed false-positive :py:class:`DeprecationWarning` for passing ``enable_cleanup_closed=True`` to :py:class:`~aiohttp.TCPConnector` specifically on Python 3.12.7.
-- by :user:`Robsdedude`.


================================================
FILE: CHANGES/11989.feature.rst
================================================
Added explicit APIs for bytes-returning JSON serializer:
``JSONBytesEncoder`` type, ``JsonBytesPayload``,
:func:`~aiohttp.web.json_bytes_response`,
:meth:`~aiohttp.web.WebSocketResponse.send_json_bytes` and
:meth:`~aiohttp.ClientWebSocketResponse.send_json_bytes` methods, and
``json_serialize_bytes`` parameter for :class:`~aiohttp.ClientSession`
-- by :user:`kevinpark1217`.


================================================
FILE: CHANGES/11992.contrib.rst
================================================
Fixed flaky performance tests by using appropriate fixed thresholds that account for CI variability -- by :user:`rodrigobnogueira`.


================================================
FILE: CHANGES/12027.misc.rst
================================================
Fixed ``test_invalid_idna`` to work with ``idna`` 3.11 by using an invalid character (``\u0080``) that is rejected by ``yarl`` during URL construction -- by :user:`rodrigobnogueira`.


================================================
FILE: CHANGES/12030.bugfix.rst
================================================
Reset the WebSocket heartbeat timer on inbound data to avoid false ping/pong timeouts while receiving large frames
-- by :user:`hoffmang9`.


================================================
FILE: CHANGES/12042.doc.rst
================================================
Documented :exc:`asyncio.TimeoutError` for ``WebSocketResponse.receive()``
and related methods -- by :user:`veeceey`.


================================================
FILE: CHANGES/12069.packaging.rst
================================================
Upgraded llhttp to 3.9.1 -- by :user:`Dreamsorcerer`.


================================================
FILE: CHANGES/12088.bugfix.rst
================================================
Fixed tests to pass when run after 2027-05-31 -- by :user:`bmwiedemann`.


================================================
FILE: CHANGES/12091.bugfix.rst
================================================
Switched :py:meth:`~aiohttp.CookieJar.save` to use JSON format and
:py:meth:`~aiohttp.CookieJar.load` to try JSON first with a fallback to
a restricted pickle unpickler that only allows cookie-related types
(``SimpleCookie``, ``Morsel``, ``defaultdict``, etc.), preventing
arbitrary code execution via malicious pickle payloads
(CWE-502) -- by :user:`YuvalElbar6`.


================================================
FILE: CHANGES/12096.bugfix.rst
================================================
Fixed _sendfile_fallback over-reading beyond requested count -- by :user:`bysiber`.


================================================
FILE: CHANGES/12097.bugfix.rst
================================================
Fixed digest auth dropping challenge fields with empty string values -- by :user:`bysiber`.


================================================
FILE: CHANGES/12106.feature.rst
================================================
Added a ``dns_cache_max_size`` parameter to ``TCPConnector`` to limit the size of the cache -- by :user:`Dreamsorcerer`.


================================================
FILE: CHANGES/12136.bugfix.rst
================================================
``ClientConnectorCertificateError.os_error`` no longer raises :exc:`AttributeError`
-- by :user:`themylogin`.


================================================
FILE: CHANGES/12170.misc.rst
================================================
Fixed race condition in ``test_data_file`` on Python 3.14 free-threaded builds -- by :user:`rodrigobnogueira`.


================================================
FILE: CHANGES/12173.contrib.rst
================================================
Fixed and reworked ``autobahn`` tests -- by :user:`Dreamsorcerer`.


================================================
FILE: CHANGES/12195.bugfix.rst
================================================
Fixed redirects with consumed non-rewindable request bodies to raise
:class:`aiohttp.ClientPayloadError` instead of silently sending an empty body.


================================================
FILE: CHANGES/12231.bugfix.rst
================================================
Adjusted pure-Python request header value validation to align with RFC 9110 control-character handling, while preserving lax response parser behavior, and added regression tests for Host/header control-character cases.
-- by :user:`rodrigobnogueira`.


================================================
FILE: CHANGES/12240.bugfix.rst
================================================
Rejected duplicate singleton headers (``Host``, ``Content-Type``,
``Content-Length``, etc.) in the C extension HTTP parser to match
the pure Python parser behavior, preventing potential host-based
access control bypasses via parser differentials
-- by :user:`rodrigobnogueira`.


================================================
FILE: CHANGES/12249.bugfix.rst
================================================
Aligned the pure-Python HTTP request parser with the C parser by splitting
comma-separated and repeated ``Connection`` header values for keep-alive,
close, and upgrade handling -- by :user:`rodrigobnogueira`.


================================================
FILE: CHANGES/2174.bugfix
================================================
Raise 400 Bad Request on server-side `await request.json()` if incorrect content-type received.


================================================
FILE: CHANGES/2835.breaking.rst
================================================
Drop lowercased enum items of ``WSMsgType`` (text, binary, ...), use uppercased items instead (TEXT, BINARY, ...).


================================================
FILE: CHANGES/2977.breaking.rst
================================================
Drop aiodns<1.1 support.


================================================
FILE: CHANGES/3310.bugfix
================================================
Docs clarification that aiohttp client does not support HTTP Pipelining.


================================================
FILE: CHANGES/3462.feature
================================================
``web.HTTPException`` and derived classes are not inherited from ``web.Response`` anymore.


================================================
FILE: CHANGES/3463.breaking.rst
================================================
Make ``ClientSession`` slot-based class, convert debug-mode warning about a wild session modification into a strict error.


================================================
FILE: CHANGES/3482.bugfix
================================================
Do not return `None` on `await response.json()` when body is empty. Instead, raise `json.JSONDecodeError` as expected.


================================================
FILE: CHANGES/3538.breaking.rst
================================================
Drop ``@aiohttp.streamer`` decorator, use async generators instead.


================================================
FILE: CHANGES/3539.breaking.rst
================================================
Disallow creation of aiohttp objects (``ClientSession``, ``Connector`` etc.) without running event loop.


================================================
FILE: CHANGES/3540.feature
================================================
Make sanity check for web-handler return value working in release mode


================================================
FILE: CHANGES/3542.breaking.rst
================================================
Setting ``web.Application`` custom attributes is now forbidden


================================================
FILE: CHANGES/3545.feature
================================================
Drop custom router support


================================================
FILE: CHANGES/3547.breaking.rst
================================================
Remove deprecated resp.url_obj


================================================
FILE: CHANGES/3548.breaking.rst
================================================
Drop deprecated SSL client settings.


================================================
FILE: CHANGES/3559.doc
================================================
Clarified ``WebSocketResponse`` closure in the quick start example.


================================================
FILE: CHANGES/3562.bugfix
================================================
Raise ``web_exceptions.HTTPUnsupportedMediaType`` when invalid `Content-Type` encoding passed.


================================================
FILE: CHANGES/3569.feature
================================================
Make new style middleware default, deprecate the @middleware decorator and
remove support for old-style middleware.


================================================
FILE: CHANGES/3580.breaking.rst
================================================
Drop explicit loop. Use ``asyncio.get_event_loop()`` instead if the loop instance is needed.
All aiohttp objects work with the currently running loop, a creation of aiohttp instances, e.g. ClientSession when the loop is not running is forbidden.
As a side effect of PR passing callables to ``aiohttp_server()`` and ``aiohttp_client()`` pytest fixtures are forbidden, please call these callables explicitly.


================================================
FILE: CHANGES/3612.bugfix
================================================
Fixed a grammatical error in documentation


================================================
FILE: CHANGES/3613.bugfix
================================================
Use sanitized URL as Location header in redirects


================================================
FILE: CHANGES/3642.doc
================================================
Modify documentation for Resolvers to make it clear that asynchronous resolver is not used by default when aiodns is installed.


================================================
FILE: CHANGES/3685.doc
================================================
Add documentation regarding creating and destroying persistent session.


================================================
FILE: CHANGES/3721.bugfix
================================================
Add the missing `TestClient.scheme` property.


================================================
FILE: CHANGES/3767.feature
================================================
Add ``AbstractAsyncAccessLogger`` to allow IO while logging.


================================================
FILE: CHANGES/3787.feature
================================================
Added ability to use contextvars in logger


================================================
FILE: CHANGES/3796.feature
================================================
Add a debug argument to `web.run_app()` for enabling debug mode on loop.


================================================
FILE: CHANGES/3890.breaking.rst
================================================
Drop deprecated `read_timeout` and `conn_timeout` in `ClientSession` constructor, please use `timeout` argument instead.


================================================
FILE: CHANGES/3901.breaking.rst
================================================
Drop sync context managers that raises ``TypeError`` already.


================================================
FILE: CHANGES/3929.breaking.rst
================================================
Drop processing sync web-handlers (deprecated since aiohttp 3.0)


================================================
FILE: CHANGES/3931.breaking.rst
================================================
Drop deprecated ``BaseRequest.message``, ``BaseRequest.loop``, ``BaseRequest.has_body``


================================================
FILE: CHANGES/3932.breaking.rst
================================================
Drop deprecated ``unused_port``, ``test_server``, ``raw_test_server`` and ``test_client`` pytest fixtures.


================================================
FILE: CHANGES/3933.breaking.rst
================================================
Forbid inheritance from ``ClientSession`` and ``Application``


================================================
FILE: CHANGES/3934.breaking.rst
================================================
Drop deprecated ``ClientResponseError.code`` attribute


================================================
FILE: CHANGES/3935.breaking.rst
================================================
Drop deprecated ``ClientSession.loop`` and ``Connection.loop``. Forbid changing ``ClientSession.requote_redirect_url``.


================================================
FILE: CHANGES/3939.breaking.rst
================================================
Drop deprecated ``Application.make_handler()``


================================================
FILE: CHANGES/3940.breaking.rst
================================================
Drop HTTP chunk size from client and server, remove deprecated `response.output_length`.


================================================
FILE: CHANGES/3942.breaking.rst
================================================
Make `web.BaseRequest`, `web.Request`, `web.StreamResponse`, `web.Response` and `web.WebSocketResponse` slot-based, prevent custom instance attributes.


================================================
FILE: CHANGES/3948.breaking.rst
================================================
Forbid changing frozen app properties.


================================================
FILE: CHANGES/3994.misc
================================================
correct the names of some functions in ``tests/test_client_functional.py``


================================================
FILE: CHANGES/4161.doc
================================================
Update contributing guide so new contributors can successfully install dependencies


================================================
FILE: CHANGES/4277.feature
================================================
Added ``set_cookie`` and ``del_cookie`` methods to ``HTTPException``


================================================
FILE: CHANGES/4283.bugfix
================================================
Fix incorrect code in example


================================================
FILE: CHANGES/4299.bugfix
================================================
Delete older code in example (:file:`examples/web_classview.py`)


================================================
FILE: CHANGES/4302.bugfix
================================================
Fixed the support of route handlers wrapped by :py:func:`functools.partial`


================================================
FILE: CHANGES/4368.bugfix
================================================
Make `web.BaseRequest`, `web.Request`, `web.StreamResponse`, `web.Response` and `web.WebSocketResponse` weak referenceable again.


================================================
FILE: CHANGES/4452.doc
================================================
Fixed a typo in the ``client_quickstart`` doc.


================================================
FILE: CHANGES/4504.doc
================================================
Updated the contribution guide to reflect the automatic thread locking policy.


================================================
FILE: CHANGES/4526.bugfix
================================================
Ignore protocol exceptions after it is closed.


================================================
FILE: CHANGES/4558.bugfix
================================================
Fixed body_size comparison to client_max_size for web request.


================================================
FILE: CHANGES/4656.bugfix
================================================
Propagate all warnings captured in coroutine test functions to pytest.


================================================
FILE: CHANGES/4695.doc
================================================
Added documentation on how to patch unittest cases with decorator for python < 3.8


================================================
FILE: CHANGES/4706.feature
================================================
Add a fixture ``aiohttp_client_cls`` that allows usage of ``aiohttp.test_utils.TestClient`` custom implementations in tests.


================================================
FILE: CHANGES/5075.feature
================================================
Multidict > 5 is now supported


================================================
FILE: CHANGES/5191.doc
================================================
Add pytest-aiohttp-client library to third party usage list


================================================
FILE: CHANGES/5258.bugfix
================================================
Fixed github workflow `update-pre-commit` on forks,
since this workflow should run only in the main repository and also because it was giving failed jobs on all the forks.
Now it will show up as skipped workflow.


================================================
FILE: CHANGES/5278.breaking.rst
================================================
Drop Python 3.6 support


================================================
FILE: CHANGES/5284.breaking.rst
================================================
``attrs`` library was replaced with ``dataclasses``.  Replace ``attr.evolve()`` with ``dataclasses.replace()`` if needed.


================================================
FILE: CHANGES/5284.feature
================================================
Use ``dataclasses`` instead of ``attrs`` for ``ClientTimeout``, client signals, and other few internal structures.


================================================
FILE: CHANGES/5287.feature
================================================
Before ``sentinel`` was processed as either ``object`` or ``Any``, both variants are far from perfectness.

Now ``sentinel`` has a dedicated type which is not equal to anything.


================================================
FILE: CHANGES/5516.misc
================================================
Removed @unittest_run_loop. This is now the default behaviour.


================================================
FILE: CHANGES/5533.misc
================================================
Add regression test for 0 timeouts.


================================================
FILE: CHANGES/5558.bugfix
================================================
Add parsing boundary from Content-Type header while making POST request


================================================
FILE: CHANGES/5634.feature
================================================
A warning was added, when a cookie's length exceeds the :rfc:`6265` minimum client support -- :user:`anesabml`.


================================================
FILE: CHANGES/5783.feature
================================================
Started keeping the ``Authorization`` header during HTTP -> HTTPS redirects when the host remains the same.


================================================
FILE: CHANGES/5806.misc
================================================
Remove last remnants of attrs library.


================================================
FILE: CHANGES/5829.misc
================================================
Disallow untyped defs on internal tests.


================================================
FILE: CHANGES/5870.misc
================================================
Simplify generator expression.


================================================
FILE: CHANGES/5894.bugfix
================================================
Fix JSON media type suffix matching with main types other than application.


================================================
FILE: CHANGES/6180.bugfix
================================================
Fixed matching the JSON media type to not accept arbitrary characters after ``application/json`` or the ``+json`` media type suffix.


================================================
FILE: CHANGES/6181.bugfix
================================================
Make JSON media type matching case insensitive per RFC 2045.


================================================
FILE: CHANGES/6193.feature
================================================
Bump async-timeout to >=4.0


================================================
FILE: CHANGES/6547.bugfix
================================================
Remove overlapping slots in ``RequestHandler``,
fix broken slots inheritance in :py:class:`~aiohttp.web.StreamResponse`.


================================================
FILE: CHANGES/6721.misc
================================================
Remove unused argument `max_headers` of HeadersParser.


================================================
FILE: CHANGES/6979.doc
================================================
Improve grammar and brevity in communication in the Policy for Backward Incompatible Changes section of ``docs/index.rst`` -- :user:`Paarth`.


================================================
FILE: CHANGES/6998.doc
================================================
Added documentation on client authentication and updating headers. -- by :user:`faph`


================================================
FILE: CHANGES/7107.breaking.rst
================================================
Removed deprecated ``.loop``, ``.setUpAsync()``, ``.tearDownAsync()`` and ``.get_app()`` from ``AioHTTPTestCase``.


================================================
FILE: CHANGES/7265.breaking.rst
================================================
Deleted ``size`` arg from ``StreamReader.feed_data`` -- by :user:`DavidRomanovizc`.


================================================
FILE: CHANGES/7319.feature.rst
================================================
Changed ``WSMessage`` to a tagged union of ``NamedTuple`` -- by :user:`Dreamsorcerer`.

This change allows type checkers to know the precise type of ``data``
after checking the ``type`` attribute.

If accessing messages by tuple indexes, the order has now changed.
Code such as:
``typ, data, extra = ws_message``
will need to be changed to:
``data, extra, typ = ws_message``

No changes are needed if accessing by attribute name.


================================================
FILE: CHANGES/7677.bugfix
================================================
Changed ``AppKey`` warning to ``web.NotAppKeyWarning`` and stop it being displayed by default. -- by :user:`Dreamsorcerer`


================================================
FILE: CHANGES/7772.bugfix
================================================
Fix CONNECT always being treated as having an empty body


================================================
FILE: CHANGES/7815.bugfix
================================================
Fixed an issue where the client could go into an infinite loop. -- by :user:`Dreamsorcerer`


================================================
FILE: CHANGES/8048.breaking.rst
================================================
Removed deprecated support for `ssl=None` -- by :user:`Dreamsorcerer`


================================================
FILE: CHANGES/8139.contrib.rst
================================================
Two definitions for "test_invalid_route_name" existed, only one was being run. Refactored them into a single parameterized test. Enabled lint rule to prevent regression. -- by :user:`alexmac`.


================================================
FILE: CHANGES/8197.doc
================================================
Fixed false behavior of base_url param for ClientSession in client documentation -- by :user:`alexis974`.


================================================
FILE: CHANGES/8303.breaking.rst
================================================
Removed ``content_transfer_encoding`` parameter in :py:meth:`FormData.add_field()
<aiohttp.FormData.add_field>` and passing bytes no longer creates a file
field unless the ``filename`` parameter is used -- by :user:`Dreamsorcerer`.


================================================
FILE: CHANGES/8596.breaking.rst
================================================
Removed old async compatibility from ``ClientResponse.release()`` -- by :user:`Dreamsorcerer`.


================================================
FILE: CHANGES/8698.breaking.rst
================================================
Changed signature of ``content_disposition_header()`` so ``params`` is now passed as a dict, in order to reduce typing errors -- by :user:`Dreamsorcerer`.


================================================
FILE: CHANGES/8957.breaking.rst
================================================
Removed ``version`` parameter from ``.set_cookie()`` (this shouldn't exist in cookies today) -- by :user:`Dreamsorcerer`.


================================================
FILE: CHANGES/9109.breaking.rst
================================================
Changed default value to ``compress`` from ``None`` to ``False`` (``None`` is no longer an expected value) -- by :user:`Dreamsorcerer`.


================================================
FILE: CHANGES/9212.packaging.rst
================================================
Removed remaining `make_mocked_coro` in the test suite -- by :user:`polkapolka`.


================================================
FILE: CHANGES/9254.breaking.rst
================================================
Stopped allowing use of ``ClientResponse.text()``/``ClientResponse.json()`` after leaving ``async with`` context.
This now matches the behaviour of ``ClientResponse.read()`` -- by :user:`Dreamsorcerer`.


================================================
FILE: CHANGES/9292.breaking.rst
================================================
Started rejecting non string values in `FormData`, to avoid unexpected results -- by :user:`Dreamsorcerer`.


================================================
FILE: CHANGES/9413.misc.rst
================================================
Reduced memory required many small objects by adding ``__slots__`` to dataclasses -- by :user:`bdraco`.


================================================
FILE: CHANGES/README.rst
================================================
.. _Adding change notes with your PRs:

Adding change notes with your PRs
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

It is very important to maintain a log for news of how
updating to the new version of the software will affect
end-users. This is why we enforce collection of the change
fragment files in pull requests as per `Towncrier philosophy`_.

The idea is that when somebody makes a change, they must record
the bits that would affect end-users, only including information
that would be useful to them. Then, when the maintainers publish
a new release, they'll automatically use these records to compose
a change log for the respective version. It is important to
understand that including unnecessary low-level implementation
related details generates noise that is not particularly useful
to the end-users most of the time. And so such details should be
recorded in the Git history rather than a changelog.

Alright! So how to add a news fragment?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

``aiohttp`` uses `towncrier <https://pypi.org/project/towncrier/>`_
for changelog management.
To submit a change note about your PR, add a text file into the
``CHANGES/`` folder. It should contain an
explanation of what applying this PR will change in the way
end-users interact with the project. One sentence is usually
enough but feel free to add as many details as you feel necessary
for the users to understand what it means.

**Use the past tense** for the text in your fragment because,
combined with others, it will be a part of the "news digest"
telling the readers **what changed** in a specific version of
the library *since the previous version*. You should also use
*reStructuredText* syntax for highlighting code (inline or block),
linking parts of the docs or external sites.
However, you do not need to reference the issue or PR numbers here
as *towncrier* will automatically add a reference to all of the
affected issues when rendering the news file.
If you wish to sign your change, feel free to add ``-- by
:user:`github-username``` at the end (replace ``github-username``
with your own!).

Finally, name your file following the convention that Towncrier
understands: it should start with the number of an issue or a
PR followed by a dot, then add a patch type, like ``feature``,
``doc``, ``contrib`` etc., and add ``.rst`` as a suffix. If you
need to add more than one fragment, you may add an optional
sequence number (delimited with another period) between the type
and the suffix.

In general the name will follow ``<pr_number>.<category>.rst`` pattern,
where the categories are:

- ``bugfix``: A bug fix for something we deemed an improper undesired
  behavior that got corrected in the release to match pre-agreed
  expectations.
- ``feature``: A new behavior, public APIs. That sort of stuff.
- ``deprecation``: A declaration of future API removals and breaking
  changes in behavior.
- ``breaking``: When something public gets removed in a breaking way.
  Could be deprecated in an earlier release.
- ``doc``: Notable updates to the documentation structure or build
  process.
- ``packaging``: Notes for downstreams about unobvious side effects
  and tooling. Changes in the test invocation considerations and
  runtime assumptions.
- ``contrib``: Stuff that affects the contributor experience. e.g.
  Running tests, building the docs, setting up the development
  environment.
- ``misc``: Changes that are hard to assign to any of the above
  categories.

A pull request may have more than one of these components, for example
a code change may introduce a new feature that deprecates an old
feature, in which case two fragments should be added. It is not
necessary to make a separate documentation fragment for documentation
changes accompanying the relevant code changes.

Examples for adding changelog entries to your Pull Requests
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File :file:`CHANGES/6045.doc.1.rst`:

.. code-block:: rst

    Added a ``:user:`` role to Sphinx config -- by :user:`webknjaz`.

File :file:`CHANGES/8074.bugfix.rst`:

.. code-block:: rst

    Fixed an unhandled exception in the Python HTTP parser on header
    lines starting with a colon -- by :user:`pajod`.

    Invalid request lines with anything but a dot between the HTTP
    major and minor version are now rejected. Invalid header field
    names containing question mark or slash are now rejected. Such
    requests are incompatible with :rfc:`9110#section-5.6.2` and are
    not known to be of any legitimate use.

File :file:`CHANGES/4594.feature.rst`:

.. code-block:: rst

    Added support for ``ETag`` to :py:class:`~aiohttp.web.FileResponse`
    -- by :user:`greshilov`, :user:`serhiy-storchaka` and
    :user:`asvetlov`.

.. tip::

   See :file:`pyproject.toml` for all available categories
   (``tool.towncrier.type``).

.. _Towncrier philosophy:
   https://towncrier.readthedocs.io/en/stable/#philosophy


================================================
FILE: CHANGES.rst
================================================
..
    You should *NOT* be adding new change log entries to this file, this
    file is managed by towncrier. You *may* edit previous change logs to
    fix problems like typo corrections or such.
    To add a new change log entry, please see
    https://pip.pypa.io/en/latest/development/#adding-a-news-entry
    we named the news folder "changes".

    WARNING: Don't drop the next directive!

.. towncrier release notes start

3.13.3 (2026-01-03)
===================

This release contains fixes for several vulnerabilities. It is advised to
upgrade as soon as possible.

Bug fixes
---------

- Fixed proxy authorization headers not being passed when reusing a connection, which caused 407 (Proxy authentication required) errors
  -- by :user:`GLeurquin`.


  *Related issues and pull requests on GitHub:*
  :issue:`2596`.



- Fixed multipart reading failing when encountering an empty body part -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`11857`.



- Fixed a case where the parser wasn't raising an exception for a websocket continuation frame when there was no initial frame in context.


  *Related issues and pull requests on GitHub:*
  :issue:`11862`.




Removals and backward incompatible breaking changes
---------------------------------------------------

- ``Brotli`` and ``brotlicffi`` minimum version is now 1.2.
  Decompression now has a default maximum output size of 32MiB per decompress call -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`11898`.




Packaging updates and notes for downstreams
-------------------------------------------

- Moved dependency metadata from :file:`setup.cfg` to :file:`pyproject.toml` per :pep:`621`
  -- by :user:`cdce8p`.


  *Related issues and pull requests on GitHub:*
  :issue:`11643`.




Contributor-facing changes
--------------------------

- Removed unused ``update-pre-commit`` github action workflow -- by :user:`Cycloctane`.


  *Related issues and pull requests on GitHub:*
  :issue:`11689`.




Miscellaneous internal changes
------------------------------

- Optimized web server performance when access logging is disabled by reducing time syscalls -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10713`.



- Added regression test for cached logging status -- by :user:`meehand`.


  *Related issues and pull requests on GitHub:*
  :issue:`11778`.




----


3.13.2 (2025-10-28)
===================

Bug fixes
---------

- Fixed cookie parser to continue parsing subsequent cookies when encountering a malformed cookie that fails regex validation, such as Google's ``g_state`` cookie with unescaped quotes -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`11632`.



- Fixed loading netrc credentials from the default :file:`~/.netrc` (:file:`~/_netrc` on Windows) location when the :envvar:`NETRC` environment variable is not set -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`11713`, :issue:`11714`.



- Fixed WebSocket compressed sends to be cancellation safe. Tasks are now shielded during compression to prevent compressor state corruption. This ensures that the stateful compressor remains consistent even when send operations are cancelled -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`11725`.




----


3.13.1 (2025-10-17)
===================

Features
--------

- Make configuration options in ``AppRunner`` also available in ``run_app()``
  -- by :user:`Cycloctane`.


  *Related issues and pull requests on GitHub:*
  :issue:`11633`.



Bug fixes
---------

- Switched to `backports.zstd` for Python <3.14 and fixed zstd decompression for chunked zstd streams -- by :user:`ZhaoMJ`.

  Note: Users who installed ``zstandard`` for support on Python <3.14 will now need to install
  ``backports.zstd`` instead (installing ``aiohttp[speedups]`` will do this automatically).


  *Related issues and pull requests on GitHub:*
  :issue:`11623`.



- Updated ``Content-Type`` header parsing to return ``application/octet-stream`` when header contains invalid syntax.
  See :rfc:`9110#section-8.3-5`.

  -- by :user:`sgaist`.


  *Related issues and pull requests on GitHub:*
  :issue:`10889`.



- Fixed Python 3.14 support when built without ``zstd`` support -- by :user:`JacobHenner`.


  *Related issues and pull requests on GitHub:*
  :issue:`11603`.



- Fixed blocking I/O in the event loop when using netrc authentication by moving netrc file lookup to an executor -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`11634`.



- Fixed routing to a sub-application added via ``.add_domain()`` not working
  if the same path exists on the parent app. -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`11673`.




Packaging updates and notes for downstreams
-------------------------------------------

- Moved core packaging metadata from :file:`setup.cfg` to :file:`pyproject.toml` per :pep:`621`
  -- by :user:`cdce8p`.


  *Related issues and pull requests on GitHub:*
  :issue:`9951`.




----


3.13.0 (2025-10-06)
===================

Features
--------

- Added support for Python 3.14.


  *Related issues and pull requests on GitHub:*
  :issue:`10851`, :issue:`10872`.



- Added support for free-threading in Python 3.14+ -- by :user:`kumaraditya303`.


  *Related issues and pull requests on GitHub:*
  :issue:`11466`, :issue:`11464`.



- Added support for Zstandard (aka Zstd) compression
  -- by :user:`KGuillaume-chaps`.


  *Related issues and pull requests on GitHub:*
  :issue:`11161`.



- Added ``StreamReader.total_raw_bytes`` to check the number of bytes downloaded
  -- by :user:`robpats`.


  *Related issues and pull requests on GitHub:*
  :issue:`11483`.



Bug fixes
---------

- Fixed pytest plugin to not use deprecated :py:mod:`asyncio` policy APIs.


  *Related issues and pull requests on GitHub:*
  :issue:`10851`.



- Updated `Content-Disposition` header parsing to handle trailing semicolons and empty parts
  -- by :user:`PLPeeters`.


  *Related issues and pull requests on GitHub:*
  :issue:`11243`.



- Fixed saved ``CookieJar`` failing to be loaded if cookies have ``partitioned`` flag when
  ``http.cookie`` does not have partitioned cookies supports. -- by :user:`Cycloctane`.


  *Related issues and pull requests on GitHub:*
  :issue:`11523`.




Improved documentation
----------------------

- Added ``Wireup`` to third-party libraries -- by :user:`maldoinc`.


  *Related issues and pull requests on GitHub:*
  :issue:`11233`.




Packaging updates and notes for downstreams
-------------------------------------------

- The `blockbuster` test dependency is now optional; the corresponding test fixture is disabled when it is unavailable
  -- by :user:`musicinybrain`.


  *Related issues and pull requests on GitHub:*
  :issue:`11363`.



- Added ``riscv64`` build to releases -- by :user:`eshattow`.


  *Related issues and pull requests on GitHub:*
  :issue:`11425`.




Contributor-facing changes
--------------------------



- Fixed ``test_send_compress_text`` failing when alternative zlib implementation
  is used. (``zlib-ng`` in python 3.14 windows build) -- by :user:`Cycloctane`.


  *Related issues and pull requests on GitHub:*
  :issue:`11546`.




----


3.12.15 (2025-07-28)
====================

Bug fixes
---------

- Fixed :class:`~aiohttp.DigestAuthMiddleware` to preserve the algorithm case from the server's challenge in the authorization response. This improves compatibility with servers that perform case-sensitive algorithm matching (e.g., servers expecting ``algorithm=MD5-sess`` instead of ``algorithm=MD5-SESS``)
  -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`11352`.




Improved documentation
----------------------

- Remove outdated contents of ``aiohttp-devtools`` and ``aiohttp-swagger``
  from Web_advanced docs.
  -- by :user:`Cycloctane`


  *Related issues and pull requests on GitHub:*
  :issue:`11347`.




Packaging updates and notes for downstreams
-------------------------------------------

- Started including the ``llhttp`` :file:`LICENSE` file in wheels by adding ``vendor/llhttp/LICENSE`` to ``license-files`` in :file:`setup.cfg` -- by :user:`threexc`.


  *Related issues and pull requests on GitHub:*
  :issue:`11226`.




Contributor-facing changes
--------------------------

- Updated a regex in `test_aiohttp_request_coroutine` for Python 3.14.


  *Related issues and pull requests on GitHub:*
  :issue:`11271`.




----


3.12.14 (2025-07-10)
====================

Bug fixes
---------

- Fixed file uploads failing with HTTP 422 errors when encountering 307/308 redirects, and 301/302 redirects for non-POST methods, by preserving the request body when appropriate per :rfc:`9110#section-15.4.3-3.1` -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`11270`.



- Fixed :py:meth:`ClientSession.close() <aiohttp.ClientSession.close>` hanging indefinitely when using HTTPS requests through HTTP proxies -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`11273`.



- Bumped minimum version of aiosignal to 1.4+ to resolve typing issues -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`11280`.




Features
--------

- Added initial trailer parsing logic to Python HTTP parser -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`11269`.




Improved documentation
----------------------

- Clarified exceptions raised by ``WebSocketResponse.send_frame`` et al.
  -- by :user:`DoctorJohn`.


  *Related issues and pull requests on GitHub:*
  :issue:`11234`.




----


3.12.13 (2025-06-14)
====================

Bug fixes
---------

- Fixed auto-created :py:class:`~aiohttp.TCPConnector` not using the session's event loop when :py:class:`~aiohttp.ClientSession` is created without an explicit connector -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`11147`.




----


3.12.12 (2025-06-09)
====================

Bug fixes
---------

- Fixed cookie unquoting to properly handle octal escape sequences in cookie values (e.g., ``\012`` for newline) by vendoring the correct ``_unquote`` implementation from Python's ``http.cookies`` module -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`11173`.



- Fixed ``Cookie`` header parsing to treat attribute names as regular cookies per :rfc:`6265#section-5.4` -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`11178`.




----


3.12.11 (2025-06-07)
====================

Features
--------

- Improved SSL connection handling by changing the default ``ssl_shutdown_timeout``
  from ``0.1`` to ``0`` seconds. SSL connections now use Python's default graceful
  shutdown during normal operation but are aborted immediately when the connector
  is closed, providing optimal behavior for both cases. Also added support for
  ``ssl_shutdown_timeout=0`` on all Python versions. Previously, this value was
  rejected on Python 3.11+ and ignored on earlier versions. Non-zero values on
  Python < 3.11 now trigger a ``RuntimeWarning`` -- by :user:`bdraco`.

  The ``ssl_shutdown_timeout`` parameter is now deprecated and will be removed in
  aiohttp 4.0 as there is no clear use case for changing the default.


  *Related issues and pull requests on GitHub:*
  :issue:`11148`.




Deprecations (removal in next major release)
--------------------------------------------

- Improved SSL connection handling by changing the default ``ssl_shutdown_timeout``
  from ``0.1`` to ``0`` seconds. SSL connections now use Python's default graceful
  shutdown during normal operation but are aborted immediately when the connector
  is closed, providing optimal behavior for both cases. Also added support for
  ``ssl_shutdown_timeout=0`` on all Python versions. Previously, this value was
  rejected on Python 3.11+ and ignored on earlier versions. Non-zero values on
  Python < 3.11 now trigger a ``RuntimeWarning`` -- by :user:`bdraco`.

  The ``ssl_shutdown_timeout`` parameter is now deprecated and will be removed in
  aiohttp 4.0 as there is no clear use case for changing the default.


  *Related issues and pull requests on GitHub:*
  :issue:`11148`.




----


3.12.10 (2025-06-07)
====================

Bug fixes
---------

- Fixed leak of ``aiodns.DNSResolver`` when :py:class:`~aiohttp.TCPConnector` is closed and no resolver was passed when creating the connector -- by :user:`Tasssadar`.

  This was a regression introduced in version 3.12.0 (:pr:`10897`).


  *Related issues and pull requests on GitHub:*
  :issue:`11150`.




----


3.12.9 (2025-06-04)
===================

Bug fixes
---------

- Fixed ``IOBasePayload`` and ``TextIOPayload`` reading entire files into memory when streaming large files -- by :user:`bdraco`.

  When using file-like objects with the aiohttp client, the entire file would be read into memory if the file size was provided in the ``Content-Length`` header. This could cause out-of-memory errors when uploading large files. The payload classes now correctly read data in chunks of ``READ_SIZE`` (64KB) regardless of the total content length.


  *Related issues and pull requests on GitHub:*
  :issue:`11138`.




----


3.12.8 (2025-06-04)
===================

Features
--------

- Added preemptive digest authentication to :class:`~aiohttp.DigestAuthMiddleware` -- by :user:`bdraco`.

  The middleware now reuses authentication credentials for subsequent requests to the same
  protection space, improving efficiency by avoiding extra authentication round trips.
  This behavior matches how web browsers handle digest authentication and follows
  :rfc:`7616#section-3.6`.

  Preemptive authentication is enabled by default but can be disabled by passing
  ``preemptive=False`` to the middleware constructor.


  *Related issues and pull requests on GitHub:*
  :issue:`11128`, :issue:`11129`.




----


3.12.7 (2025-06-02)
===================

.. warning::

   This release fixes an issue where the ``quote_cookie`` parameter was not being properly
   respected for shared cookies (domain="", path=""). If your server does not handle quoted
   cookies correctly, you may need to disable cookie quoting by setting ``quote_cookie=False``
   when creating your :class:`~aiohttp.ClientSession` or :class:`~aiohttp.CookieJar`.
   See :ref:`aiohttp-client-cookie-quoting-routine` for details.

Bug fixes
---------

- Fixed cookie parsing to be more lenient when handling cookies with special characters
  in names or values. Cookies with characters like ``{``, ``}``, and ``/`` in names are now
  accepted instead of causing a :exc:`~http.cookies.CookieError` and 500 errors. Additionally,
  cookies with mismatched quotes in values are now parsed correctly, and quoted cookie
  values are now handled consistently whether or not they include special attributes
  like ``Domain``. Also fixed :class:`~aiohttp.CookieJar` to ensure shared cookies (domain="", path="")
  respect the ``quote_cookie`` parameter, making cookie quoting behavior consistent for
  all cookies -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`2683`, :issue:`5397`, :issue:`7993`, :issue:`11112`.



- Fixed an issue where cookies with duplicate names but different domains or paths
  were lost when updating the cookie jar. The :class:`~aiohttp.ClientSession`
  cookie jar now correctly stores all cookies even if they have the same name but
  different domain or path, following the :rfc:`6265#section-5.3` storage model -- by :user:`bdraco`.

  Note that :attr:`ClientResponse.cookies <aiohttp.ClientResponse.cookies>` returns
  a :class:`~http.cookies.SimpleCookie` which uses the cookie name as a key, so
  only the last cookie with each name is accessible via this interface. All cookies
  can be accessed via :meth:`ClientResponse.headers.getall('Set-Cookie')
  <multidict.MultiDictProxy.getall>` if needed.


  *Related issues and pull requests on GitHub:*
  :issue:`4486`, :issue:`11105`, :issue:`11106`.




Miscellaneous internal changes
------------------------------

- Avoided creating closed futures in ``ResponseHandler`` that will never be awaited -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`11107`.



- Downgraded the logging level for connector close errors from ERROR to DEBUG, as these are expected behavior with TLS 1.3 connections -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`11114`.




----


3.12.6 (2025-05-31)
===================

Bug fixes
---------

- Fixed spurious "Future exception was never retrieved" warnings for connection lost errors when the connector is not closed -- by :user:`bdraco`.

  When connections are lost, the exception is now marked as retrieved since it is always propagated through other means, preventing unnecessary warnings in logs.


  *Related issues and pull requests on GitHub:*
  :issue:`11100`.




----


3.12.5 (2025-05-30)
===================

Features
--------

- Added ``ssl_shutdown_timeout`` parameter to :py:class:`~aiohttp.ClientSession` and :py:class:`~aiohttp.TCPConnector` to control the grace period for SSL shutdown handshake on TLS connections. This helps prevent "connection reset" errors on the server side while avoiding excessive delays during connector cleanup. Note: This parameter only takes effect on Python 3.11+ -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`11091`, :issue:`11094`.




Miscellaneous internal changes
------------------------------

- Improved performance of isinstance checks by using collections.abc types instead of typing module equivalents -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`11085`, :issue:`11088`.




----


3.12.4 (2025-05-28)
===================

Bug fixes
---------

- Fixed connector not waiting for connections to close before returning from :meth:`~aiohttp.BaseConnector.close` (partial backport of :pr:`3733`) -- by :user:`atemate` and :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`1925`, :issue:`11074`.




----


3.12.3 (2025-05-28)
===================

Bug fixes
---------

- Fixed memory leak in :py:meth:`~aiohttp.CookieJar.filter_cookies` that caused unbounded memory growth
  when making requests to different URL paths -- by :user:`bdraco` and :user:`Cycloctane`.


  *Related issues and pull requests on GitHub:*
  :issue:`11052`, :issue:`11054`.




----


3.12.2 (2025-05-26)
===================

Bug fixes
---------

- Fixed ``Content-Length`` header not being set to ``0`` for non-GET requests with ``None`` body -- by :user:`bdraco`.

  Non-GET requests (``POST``, ``PUT``, ``PATCH``, ``DELETE``) with ``None`` as the body now correctly set the ``Content-Length`` header to ``0``, matching the behavior of requests with empty bytes (``b""``). This regression was introduced in aiohttp 3.12.1.


  *Related issues and pull requests on GitHub:*
  :issue:`11035`.




----


3.12.1 (2025-05-26)
===================

Features
--------

- Added support for reusable request bodies to enable retries, redirects, and digest authentication -- by :user:`bdraco` and :user:`GLGDLY`.

  Most payloads can now be safely reused multiple times, fixing long-standing issues where POST requests with form data or file uploads would fail on redirects with errors like "Form data has been processed already" or "I/O operation on closed file". This also enables digest authentication to work with request bodies and allows retry mechanisms to resend requests without consuming the payload. Note that payloads derived from async iterables may still not be reusable in some cases.


  *Related issues and pull requests on GitHub:*
  :issue:`5530`, :issue:`5577`, :issue:`9201`, :issue:`11017`.




----


3.12.0 (2025-05-24)
===================

Bug fixes
---------

- Fixed :py:attr:`~aiohttp.web.WebSocketResponse.prepared` property to correctly reflect the prepared state, especially during timeout scenarios -- by :user:`bdraco`


  *Related issues and pull requests on GitHub:*
  :issue:`6009`, :issue:`10988`.



- Response is now always True, instead of using MutableMapping behaviour (False when map is empty)


  *Related issues and pull requests on GitHub:*
  :issue:`10119`.



- Fixed connection reuse for file-like data payloads by ensuring buffer
  truncation respects content-length boundaries and preventing premature
  connection closure race -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10325`, :issue:`10915`, :issue:`10941`, :issue:`10943`.



- Fixed pytest plugin to not use deprecated :py:mod:`asyncio` policy APIs.


  *Related issues and pull requests on GitHub:*
  :issue:`10851`.



- Fixed :py:class:`~aiohttp.resolver.AsyncResolver` not using the ``loop`` argument in versions 3.x where it should still be supported -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10951`.




Features
--------

- Added a comprehensive HTTP Digest Authentication client middleware (DigestAuthMiddleware)
  that implements RFC 7616. The middleware supports all standard hash algorithms
  (MD5, SHA, SHA-256, SHA-512) with session variants, handles both 'auth' and
  'auth-int' quality of protection options, and automatically manages the
  authentication flow by intercepting 401 responses and retrying with proper
  credentials -- by :user:`feus4177`, :user:`TimMenninger`, and :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`2213`, :issue:`10725`.



- Added client middleware support -- by :user:`bdraco` and :user:`Dreamsorcerer`.

  This change allows users to add middleware to the client session and requests, enabling features like
  authentication, logging, and request/response modification without modifying the core
  request logic. Additionally, the ``session`` attribute was added to ``ClientRequest``,
  allowing middleware to access the session for making additional requests.


  *Related issues and pull requests on GitHub:*
  :issue:`9732`, :issue:`10902`, :issue:`10945`, :issue:`10952`, :issue:`10959`, :issue:`10968`.



- Allow user setting zlib compression backend -- by :user:`TimMenninger`

  This change allows the user to call :func:`aiohttp.set_zlib_backend()` with the
  zlib compression module of their choice. Default behavior continues to use
  the builtin ``zlib`` library.


  *Related issues and pull requests on GitHub:*
  :issue:`9798`.



- Added support for overriding the base URL with an absolute one in client sessions
  -- by :user:`vivodi`.


  *Related issues and pull requests on GitHub:*
  :issue:`10074`.



- Added ``host`` parameter to ``aiohttp_server`` fixture -- by :user:`christianwbrock`.


  *Related issues and pull requests on GitHub:*
  :issue:`10120`.



- Detect blocking calls in coroutines using BlockBuster -- by :user:`cbornet`.


  *Related issues and pull requests on GitHub:*
  :issue:`10433`.



- Added ``socket_factory`` to :py:class:`aiohttp.TCPConnector` to allow specifying custom socket options
  -- by :user:`TimMenninger`.


  *Related issues and pull requests on GitHub:*
  :issue:`10474`, :issue:`10520`, :issue:`10961`, :issue:`10962`.



- Started building armv7l manylinux wheels -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10797`.



- Implemented shared DNS resolver management to fix excessive resolver object creation
  when using multiple client sessions. The new ``_DNSResolverManager`` singleton ensures
  only one ``DNSResolver`` object is created for default configurations, significantly
  reducing resource usage and improving performance for applications using multiple
  client sessions simultaneously -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10847`, :issue:`10923`, :issue:`10946`.



- Upgraded to LLHTTP 9.3.0 -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`10972`.



- Optimized small HTTP requests/responses by coalescing headers and body into a single TCP packet -- by :user:`bdraco`.

  This change enhances network efficiency by reducing the number of packets sent for small HTTP payloads, improving latency and reducing overhead. Most importantly, this fixes compatibility with memory-constrained IoT devices that can only perform a single read operation and expect HTTP requests in one packet. The optimization uses zero-copy ``writelines`` when coalescing data and works with both regular and chunked transfer encoding.

  When ``aiohttp`` uses client middleware to communicate with an ``aiohttp`` server, connection reuse is more likely to occur since complete responses arrive in a single packet for small payloads.

  This aligns ``aiohttp`` with other popular HTTP clients that already coalesce small requests.


  *Related issues and pull requests on GitHub:*
  :issue:`10991`.




Improved documentation
----------------------

- Improved documentation for middleware by adding warnings and examples about
  request body stream consumption. The documentation now clearly explains that
  request body streams can only be read once and provides best practices for
  sharing parsed request data between middleware and handlers -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`2914`.




Packaging updates and notes for downstreams
-------------------------------------------

- Removed non SPDX-license description from ``setup.cfg`` -- by :user:`devanshu-ziphq`.


  *Related issues and pull requests on GitHub:*
  :issue:`10662`.



- Added support for building against system ``llhttp`` library -- by :user:`mgorny`.

  This change adds support for :envvar:`AIOHTTP_USE_SYSTEM_DEPS` environment variable that
  can be used to build aiohttp against the system install of the ``llhttp`` library rather
  than the vendored one.


  *Related issues and pull requests on GitHub:*
  :issue:`10759`.



- ``aiodns`` is now installed on Windows with speedups extra -- by :user:`bdraco`.

  As of ``aiodns`` 3.3.0, ``SelectorEventLoop`` is no longer required when using ``pycares`` 4.7.0 or later.


  *Related issues and pull requests on GitHub:*
  :issue:`10823`.



- Fixed compatibility issue with Cython 3.1.1 -- by :user:`bdraco`


  *Related issues and pull requests on GitHub:*
  :issue:`10877`.




Contributor-facing changes
--------------------------

- Sped up tests by disabling ``blockbuster`` fixture for ``test_static_file_huge`` and ``test_static_file_huge_cancel`` tests -- by :user:`dikos1337`.


  *Related issues and pull requests on GitHub:*
  :issue:`9705`, :issue:`10761`.



- Updated tests to avoid using deprecated :py:mod:`asyncio` policy APIs and
  make it compatible with Python 3.14.


  *Related issues and pull requests on GitHub:*
  :issue:`10851`.



- Added Winloop to test suite to support in the future -- by :user:`Vizonex`.


  *Related issues and pull requests on GitHub:*
  :issue:`10922`.




Miscellaneous internal changes
------------------------------

- Added support for the ``partitioned`` attribute in the ``set_cookie`` method.


  *Related issues and pull requests on GitHub:*
  :issue:`9870`.



- Setting :attr:`aiohttp.web.StreamResponse.last_modified` to an unsupported type will now raise :exc:`TypeError` instead of silently failing -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10146`.




----


3.11.18 (2025-04-20)
====================

Bug fixes
---------

- Disabled TLS in TLS warning (when using HTTPS proxies) for uvloop and newer Python versions -- by :user:`lezgomatt`.


  *Related issues and pull requests on GitHub:*
  :issue:`7686`.



- Fixed reading fragmented WebSocket messages when the payload was masked -- by :user:`bdraco`.

  The problem first appeared in 3.11.17


  *Related issues and pull requests on GitHub:*
  :issue:`10764`.




----


3.11.17 (2025-04-19)
====================

Miscellaneous internal changes
------------------------------

- Optimized web server performance when access logging is disabled by reducing time syscalls -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10713`.



- Improved web server performance when connection can be reused -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10714`.



- Improved performance of the WebSocket reader -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10740`.



- Improved performance of the WebSocket reader with large messages -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10744`.




----


3.11.16 (2025-04-01)
====================

Bug fixes
---------

- Replaced deprecated ``asyncio.iscoroutinefunction`` with its counterpart from ``inspect``
  -- by :user:`layday`.


  *Related issues and pull requests on GitHub:*
  :issue:`10634`.



- Fixed :class:`multidict.CIMultiDict` being mutated when passed to :class:`aiohttp.web.Response` -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10672`.




----


3.11.15 (2025-03-31)
====================

Bug fixes
---------

- Reverted explicitly closing sockets if an exception is raised during ``create_connection`` -- by :user:`bdraco`.

  This change originally appeared in aiohttp 3.11.13


  *Related issues and pull requests on GitHub:*
  :issue:`10464`, :issue:`10617`, :issue:`10656`.




Miscellaneous internal changes
------------------------------

- Improved performance of WebSocket buffer handling -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10601`.



- Improved performance of serializing headers -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10625`.




----


3.11.14 (2025-03-16)
====================

Bug fixes
---------

- Fixed an issue where dns queries were delayed indefinitely when an exception occurred in a ``trace.send_dns_cache_miss``
  -- by :user:`logioniz`.


  *Related issues and pull requests on GitHub:*
  :issue:`10529`.



- Fixed DNS resolution on platforms that don't support ``socket.AI_ADDRCONFIG`` -- by :user:`maxbachmann`.


  *Related issues and pull requests on GitHub:*
  :issue:`10542`.



- The connector now raises :exc:`aiohttp.ClientConnectionError` instead of :exc:`OSError` when failing to explicitly close the socket after :py:meth:`asyncio.loop.create_connection` fails -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10551`.



- Break cyclic references at connection close when there was a traceback -- by :user:`bdraco`.

  Special thanks to :user:`availov` for reporting the issue.


  *Related issues and pull requests on GitHub:*
  :issue:`10556`.



- Break cyclic references when there is an exception handling a request -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10569`.




Features
--------

- Improved logging on non-overlapping WebSocket client protocols to include the remote address -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10564`.




Miscellaneous internal changes
------------------------------

- Improved performance of parsing content types by adding a cache in the same manner currently done with mime types -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10552`.




----


3.11.13 (2025-02-24)
====================

Bug fixes
---------

- Removed a break statement inside the finally block in :py:class:`~aiohttp.web.RequestHandler`
  -- by :user:`Cycloctane`.


  *Related issues and pull requests on GitHub:*
  :issue:`10434`.



- Changed connection creation to explicitly close sockets if an exception is raised in the event loop's ``create_connection`` method -- by :user:`top-oai`.


  *Related issues and pull requests on GitHub:*
  :issue:`10464`.




Packaging updates and notes for downstreams
-------------------------------------------

- Fixed test ``test_write_large_payload_deflate_compression_data_in_eof_writelines`` failing with Python 3.12.9+ or 3.13.2+ -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10423`.




Miscellaneous internal changes
------------------------------

- Added human-readable error messages to the exceptions for WebSocket disconnects due to PONG not being received -- by :user:`bdraco`.

  Previously, the error messages were empty strings, which made it hard to determine what went wrong.


  *Related issues and pull requests on GitHub:*
  :issue:`10422`.




----


3.11.12 (2025-02-05)
====================

Bug fixes
---------

- ``MultipartForm.decode()`` now follows RFC1341 7.2.1 with a ``CRLF`` after the boundary
  -- by :user:`imnotjames`.


  *Related issues and pull requests on GitHub:*
  :issue:`10270`.



- Restored the missing ``total_bytes`` attribute to ``EmptyStreamReader`` -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10387`.




Features
--------

- Updated :py:func:`~aiohttp.request` to make it accept ``_RequestOptions`` kwargs.
  -- by :user:`Cycloctane`.


  *Related issues and pull requests on GitHub:*
  :issue:`10300`.



- Improved logging of HTTP protocol errors to include the remote address -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10332`.




Improved documentation
----------------------

- Added ``aiohttp-openmetrics`` to list of third-party libraries -- by :user:`jelmer`.


  *Related issues and pull requests on GitHub:*
  :issue:`10304`.




Packaging updates and notes for downstreams
-------------------------------------------

- Added missing files to the source distribution to fix ``Makefile`` targets.
  Added a ``cythonize-nodeps`` target to run Cython without invoking pip to install dependencies.


  *Related issues and pull requests on GitHub:*
  :issue:`10366`.



- Started building armv7l musllinux wheels -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10404`.




Contributor-facing changes
--------------------------

- The CI/CD workflow has been updated to use `upload-artifact` v4 and `download-artifact` v4 GitHub Actions -- by :user:`silamon`.


  *Related issues and pull requests on GitHub:*
  :issue:`10281`.




Miscellaneous internal changes
------------------------------

- Restored support for zero copy writes when using Python 3.12 versions 3.12.9 and later or Python 3.13.2+ -- by :user:`bdraco`.

  Zero copy writes were previously disabled due to :cve:`2024-12254` which is resolved in these Python versions.


  *Related issues and pull requests on GitHub:*
  :issue:`10137`.




----


3.11.11 (2024-12-18)
====================

Bug fixes
---------

- Updated :py:meth:`~aiohttp.ClientSession.request` to reuse the ``quote_cookie`` setting from ``ClientSession._cookie_jar`` when processing cookies parameter.
  -- by :user:`Cycloctane`.


  *Related issues and pull requests on GitHub:*
  :issue:`10093`.



- Fixed type of ``SSLContext`` for some static type checkers (e.g. pyright).


  *Related issues and pull requests on GitHub:*
  :issue:`10099`.



- Updated :meth:`aiohttp.web.StreamResponse.write` annotation to also allow :class:`bytearray` and :class:`memoryview` as inputs -- by :user:`cdce8p`.


  *Related issues and pull requests on GitHub:*
  :issue:`10154`.



- Fixed a hang where a connection previously used for a streaming
  download could be returned to the pool in a paused state.
  -- by :user:`javitonino`.


  *Related issues and pull requests on GitHub:*
  :issue:`10169`.




Features
--------

- Enabled ALPN on default SSL contexts. This improves compatibility with some
  proxies which don't work without this extension.
  -- by :user:`Cycloctane`.


  *Related issues and pull requests on GitHub:*
  :issue:`10156`.




Miscellaneous internal changes
------------------------------

- Fixed an infinite loop that can occur when using aiohttp in combination
  with `async-solipsism`_ -- by :user:`bmerry`.

  .. _async-solipsism: https://github.com/bmerry/async-solipsism


  *Related issues and pull requests on GitHub:*
  :issue:`10149`.




----


3.11.10 (2024-12-05)
====================

Bug fixes
---------

- Fixed race condition in :class:`aiohttp.web.FileResponse` that could have resulted in an incorrect response if the file was replaced on the file system during ``prepare`` -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10101`, :issue:`10113`.



- Replaced deprecated call to :func:`mimetypes.guess_type` with :func:`mimetypes.guess_file_type` when using Python 3.13+ -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10102`.



- Disabled zero copy writes in the ``StreamWriter`` -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10125`.




----


3.11.9 (2024-12-01)
===================

Bug fixes
---------

- Fixed invalid method logging unexpected being logged at exception level on subsequent connections -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10055`, :issue:`10076`.




Miscellaneous internal changes
------------------------------

- Improved performance of parsing headers when using the C parser -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10073`.




----


3.11.8 (2024-11-27)
===================

Miscellaneous internal changes
------------------------------

- Improved performance of creating :class:`aiohttp.ClientResponse` objects when there are no cookies -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10029`.



- Improved performance of creating :class:`aiohttp.ClientResponse` objects -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10030`.



- Improved performances of creating objects during the HTTP request lifecycle -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10037`.



- Improved performance of constructing :class:`aiohttp.web.Response` with headers -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10043`.



- Improved performance of making requests when there are no auto headers to skip -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10049`.



- Downgraded logging of invalid HTTP method exceptions on the first request to debug level -- by :user:`bdraco`.

  HTTP requests starting with an invalid method are relatively common, especially when connected to the public internet, because browsers or other clients may try to speak SSL to a plain-text server or vice-versa. These exceptions can quickly fill the log with noise when nothing is wrong.


  *Related issues and pull requests on GitHub:*
  :issue:`10055`.




----


3.11.7 (2024-11-21)
===================

Bug fixes
---------

- Fixed the HTTP client not considering the connector's ``force_close`` value when setting the ``Connection`` header -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10003`.




Miscellaneous internal changes
------------------------------

- Improved performance of serializing HTTP headers -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`10014`.




----


3.11.6 (2024-11-19)
===================

Bug fixes
---------

- Restored the ``force_close`` method to the ``ResponseHandler`` -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9997`.




----


3.11.5 (2024-11-19)
===================

Bug fixes
---------

- Fixed the ``ANY`` method not appearing in :meth:`~aiohttp.web.UrlDispatcher.routes` -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9899`, :issue:`9987`.




----


3.11.4 (2024-11-18)
===================

Bug fixes
---------

- Fixed ``StaticResource`` not allowing the ``OPTIONS`` method after calling ``set_options_route`` -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9972`, :issue:`9975`, :issue:`9976`.




Miscellaneous internal changes
------------------------------

- Improved performance of creating web responses when there are no cookies -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9895`.




----


3.11.3 (2024-11-18)
===================

Bug fixes
---------

- Removed non-existing ``__author__`` from ``dir(aiohttp)`` -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`9918`.



- Restored the ``FlowControlDataQueue`` class -- by :user:`bdraco`.

  This class is no longer used internally, and will be permanently removed in the next major version.


  *Related issues and pull requests on GitHub:*
  :issue:`9963`.




Miscellaneous internal changes
------------------------------

- Improved performance of resolving resources when multiple methods are registered for the same route -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9899`.




----


3.11.2 (2024-11-14)
===================

Bug fixes
---------

- Fixed improperly closed WebSocket connections generating an unhandled exception -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9883`.




----


3.11.1 (2024-11-14)
===================

Bug fixes
---------

- Added a backward compatibility layer to :class:`aiohttp.RequestInfo` to allow creating these objects without a ``real_url`` -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9873`.




----


3.11.0 (2024-11-13)
===================

Bug fixes
---------

- Raise :exc:`aiohttp.ServerFingerprintMismatch` exception on client-side if request through http proxy with mismatching server fingerprint digest: `aiohttp.ClientSession(headers=headers, connector=TCPConnector(ssl=aiohttp.Fingerprint(mismatch_digest), trust_env=True).request(...)` -- by :user:`gangj`.


  *Related issues and pull requests on GitHub:*
  :issue:`6652`.



- Modified websocket :meth:`aiohttp.ClientWebSocketResponse.receive_str`, :py:meth:`aiohttp.ClientWebSocketResponse.receive_bytes`, :py:meth:`aiohttp.web.WebSocketResponse.receive_str` & :py:meth:`aiohttp.web.WebSocketResponse.receive_bytes` methods to raise new :py:exc:`aiohttp.WSMessageTypeError` exception, instead of generic :py:exc:`TypeError`, when websocket messages of incorrect types are received -- by :user:`ara-25`.


  *Related issues and pull requests on GitHub:*
  :issue:`6800`.



- Made ``TestClient.app`` a ``Generic`` so type checkers will know the correct type (avoiding unneeded ``client.app is not None`` checks) -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8977`.



- Fixed the keep-alive connection pool to be FIFO instead of LIFO -- by :user:`bdraco`.

  Keep-alive connections are more likely to be reused before they disconnect.


  *Related issues and pull requests on GitHub:*
  :issue:`9672`.




Features
--------

- Added ``strategy`` parameter to :meth:`aiohttp.web.StreamResponse.enable_compression`
  The value of this parameter is passed to the :func:`zlib.compressobj` function, allowing people
  to use a more sufficient compression algorithm for their data served by :mod:`aiohttp.web`
  -- by :user:`shootkin`


  *Related issues and pull requests on GitHub:*
  :issue:`6257`.



- Added ``server_hostname`` parameter to ``ws_connect``.


  *Related issues and pull requests on GitHub:*
  :issue:`7941`.



- Exported :py:class:`~aiohttp.ClientWSTimeout` to top-level namespace -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8612`.



- Added ``secure``/``httponly``/``samesite`` parameters to ``.del_cookie()`` -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8956`.



- Updated :py:class:`~aiohttp.ClientSession`'s auth logic to include default auth only if the request URL's origin matches _base_url; otherwise, the auth will not be included -- by :user:`MaximZemskov`


  *Related issues and pull requests on GitHub:*
  :issue:`8966`, :issue:`9466`.



- Added ``proxy`` and ``proxy_auth`` parameters to :py:class:`~aiohttp.ClientSession` -- by :user:`meshya`.


  *Related issues and pull requests on GitHub:*
  :issue:`9207`.



- Added ``default_to_multipart`` parameter to ``FormData``.


  *Related issues and pull requests on GitHub:*
  :issue:`9335`.



- Added :py:meth:`~aiohttp.ClientWebSocketResponse.send_frame` and :py:meth:`~aiohttp.web.WebSocketResponse.send_frame` for WebSockets -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9348`.



- Updated :py:class:`~aiohttp.ClientSession` to support paths in ``base_url`` parameter.
  ``base_url`` paths must end with a ``/``  -- by :user:`Cycloctane`.


  *Related issues and pull requests on GitHub:*
  :issue:`9530`.



- Improved performance of reading WebSocket messages with a Cython implementation -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9543`, :issue:`9554`, :issue:`9556`, :issue:`9558`, :issue:`9636`, :issue:`9649`, :issue:`9781`.



- Added ``writer_limit`` to the :py:class:`~aiohttp.web.WebSocketResponse` to be able to adjust the limit before the writer forces the buffer to be drained -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9572`.



- Added an :attr:`~aiohttp.abc.AbstractAccessLogger.enabled` property to :class:`aiohttp.abc.AbstractAccessLogger` to dynamically check if logging is enabled -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9822`.




Deprecations (removal in next major release)
--------------------------------------------

- Deprecate obsolete `timeout: float` and `receive_timeout: Optional[float]` in :py:meth:`~aiohttp.ClientSession.ws_connect`. Change default websocket receive timeout from `None` to `10.0`.


  *Related issues and pull requests on GitHub:*
  :issue:`3945`.




Removals and backward incompatible breaking changes
---------------------------------------------------

- Dropped support for Python 3.8 -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8797`.



- Increased minimum yarl version to 1.17.0 -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`8909`, :issue:`9079`, :issue:`9305`, :issue:`9574`.



- Removed the ``is_ipv6_address`` and ``is_ip4_address`` helpers are they are no longer used -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9344`.



- Changed ``ClientRequest.connection_key`` to be a `NamedTuple` to improve client performance -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9365`.



- ``FlowControlDataQueue`` has been replaced with the ``WebSocketDataQueue`` -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9685`.



- Changed ``ClientRequest.request_info`` to be a `NamedTuple` to improve client performance -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9692`.




Packaging updates and notes for downstreams
-------------------------------------------

- Switched to using the :mod:`propcache <propcache.api>` package for property caching
  -- by :user:`bdraco`.

  The :mod:`propcache <propcache.api>` package is derived from the property caching
  code in :mod:`yarl` and has been broken out to avoid maintaining it for multiple
  projects.


  *Related issues and pull requests on GitHub:*
  :issue:`9394`.



- Separated ``aiohttp.http_websocket`` into multiple files to make it easier to maintain -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9542`, :issue:`9552`.




Contributor-facing changes
--------------------------

- Changed diagram images generator from ``blockdiag`` to ``GraphViz``.
  Generating documentation now requires the GraphViz executable to be included in $PATH or sphinx build configuration.


  *Related issues and pull requests on GitHub:*
  :issue:`9359`.




Miscellaneous internal changes
------------------------------

- Added flake8 settings to avoid some forms of implicit concatenation. -- by :user:`booniepepper`.


  *Related issues and pull requests on GitHub:*
  :issue:`7731`.



- Enabled keep-alive support on proxies (which was originally disabled several years ago) -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8920`.



- Changed web entry point to not listen on TCP when only a Unix path is passed -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`9033`.



- Disabled automatic retries of failed requests in :class:`aiohttp.test_utils.TestClient`'s client session
  (which could potentially hide errors in tests) -- by :user:`ShubhAgarwal-dev`.


  *Related issues and pull requests on GitHub:*
  :issue:`9141`.



- Changed web ``keepalive_timeout`` default to around an hour in order to reduce race conditions on reverse proxies -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`9285`.



- Reduced memory required for stream objects created during the client request lifecycle -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9407`.



- Improved performance of the internal ``DataQueue`` -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9659`.



- Improved performance of calling ``receive`` for WebSockets for the most common message types -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9679`.



- Replace internal helper methods ``method_must_be_empty_body`` and ``status_code_must_be_empty_body`` with simple `set` lookups -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9722`.



- Improved performance of :py:class:`aiohttp.BaseConnector` when there is no ``limit_per_host`` -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9756`.



- Improved performance of sending HTTP requests when there is no body -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9757`.



- Improved performance of the ``WebsocketWriter`` when the protocol is not paused -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9796`.



- Implemented zero copy writes for ``StreamWriter`` -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9839`.




----


3.10.11 (2024-11-13)
====================

Bug fixes
---------

- Authentication provided by a redirect now takes precedence over provided ``auth`` when making requests with the client -- by :user:`PLPeeters`.


  *Related issues and pull requests on GitHub:*
  :issue:`9436`.



- Fixed :py:meth:`WebSocketResponse.close() <aiohttp.web.WebSocketResponse.close>` to discard non-close messages within its timeout window after sending close -- by :user:`lenard-mosys`.


  *Related issues and pull requests on GitHub:*
  :issue:`9506`.



- Fixed a deadlock that could occur while attempting to get a new connection slot after a timeout -- by :user:`bdraco`.

  The connector was not cancellation-safe.


  *Related issues and pull requests on GitHub:*
  :issue:`9670`, :issue:`9671`.



- Fixed the WebSocket flow control calculation undercounting with multi-byte data -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9686`.



- Fixed incorrect parsing of chunk extensions with the pure Python parser -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9851`.



- Fixed system routes polluting the middleware cache -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9852`.




Removals and backward incompatible breaking changes
---------------------------------------------------

- Improved performance of the connector when a connection can be reused -- by :user:`bdraco`.

  If ``BaseConnector.connect`` has been subclassed and replaced with custom logic, the ``ceil_timeout`` must be added.


  *Related issues and pull requests on GitHub:*
  :issue:`9600`.




Miscellaneous internal changes
------------------------------

- Improved performance of the client request lifecycle when there are no cookies -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9470`.



- Improved performance of sending client requests when the writer can finish synchronously -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9485`.



- Improved performance of serializing HTTP headers -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9603`.



- Passing ``enable_cleanup_closed`` to :py:class:`aiohttp.TCPConnector` is now ignored on Python 3.12.7+ and 3.13.1+ since the underlying bug that caused asyncio to leak SSL connections has been fixed upstream -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9726`, :issue:`9736`.



----




3.10.10 (2024-10-10)
====================

Bug fixes
---------

- Fixed error messages from :py:class:`~aiohttp.resolver.AsyncResolver` being swallowed -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9451`, :issue:`9455`.




Features
--------

- Added :exc:`aiohttp.ClientConnectorDNSError` for differentiating DNS resolution errors from other connector errors -- by :user:`mstojcevich`.


  *Related issues and pull requests on GitHub:*
  :issue:`8455`.




Miscellaneous internal changes
------------------------------

- Simplified DNS resolution throttling code to reduce chance of race conditions -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9454`.




----


3.10.9 (2024-10-04)
===================

Bug fixes
---------

- Fixed proxy headers being used in the ``ConnectionKey`` hash when a proxy was not being used -- by :user:`bdraco`.

  If default headers are used, they are also used for proxy headers. This could have led to creating connections that were not needed when one was already available.


  *Related issues and pull requests on GitHub:*
  :issue:`9368`.



- Widened the type of the ``trace_request_ctx`` parameter of
  :meth:`ClientSession.request() <aiohttp.ClientSession.request>` and friends
  -- by :user:`layday`.


  *Related issues and pull requests on GitHub:*
  :issue:`9397`.




Removals and backward incompatible breaking changes
---------------------------------------------------

- Fixed failure to try next host after single-host connection timeout -- by :user:`brettdh`.

  The default client :class:`aiohttp.ClientTimeout` params has changed to include a ``sock_connect`` timeout of 30 seconds so that this correct behavior happens by default.


  *Related issues and pull requests on GitHub:*
  :issue:`7342`.




Miscellaneous internal changes
------------------------------

- Improved performance of resolving hosts with Python 3.12+ -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9342`.



- Reduced memory required for timer objects created during the client request lifecycle -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9406`.




----


3.10.8 (2024-09-28)
===================

Bug fixes
---------

- Fixed cancellation leaking upwards on timeout -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9326`.




----


3.10.7 (2024-09-27)
===================

Bug fixes
---------

- Fixed assembling the :class:`~yarl.URL` for web requests when the host contains a non-default port or IPv6 address -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9309`.




Miscellaneous internal changes
------------------------------

- Improved performance of determining if a URL is absolute -- by :user:`bdraco`.

  The property :attr:`~yarl.URL.absolute` is more performant than the method ``URL.is_absolute()`` and preferred when newer versions of yarl are used.


  *Related issues and pull requests on GitHub:*
  :issue:`9171`.



- Replaced code that can now be handled by ``yarl`` -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9301`.




----


3.10.6 (2024-09-24)
===================

Bug fixes
---------

- Added :exc:`aiohttp.ClientConnectionResetError`. Client code that previously threw :exc:`ConnectionResetError`
  will now throw this -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`9137`.



- Fixed an unclosed transport ``ResourceWarning`` on web handlers -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8875`.



- Fixed resolve_host() 'Task was destroyed but is pending' errors -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8967`.



- Fixed handling of some file-like objects (e.g. ``tarfile.extractfile()``) which raise ``AttributeError`` instead of ``OSError`` when ``fileno`` fails for streaming payload data -- by :user:`ReallyReivax`.


  *Related issues and pull requests on GitHub:*
  :issue:`6732`.



- Fixed web router not matching pre-encoded URLs (requires yarl 1.9.6+) -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8898`, :issue:`9267`.



- Fixed an error when trying to add a route for multiple methods with a path containing a regex pattern -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8998`.



- Fixed ``Response.text`` when body is a ``Payload`` -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`6485`.



- Fixed compressed requests failing when no body was provided -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`9108`.



- Fixed client incorrectly reusing a connection when the previous message had not been fully sent -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8992`.



- Fixed race condition that could cause server to close connection incorrectly at keepalive timeout -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`9140`.



- Fixed Python parser chunked handling with multiple Transfer-Encoding values -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8823`.



- Fixed error handling after 100-continue so server sends 500 response instead of disconnecting -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8876`.



- Stopped adding a default Content-Type header when response has no content -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8858`.



- Added support for URL credentials with empty (zero-length) username, e.g. ``https://:password@host`` -- by :user:`shuckc`


  *Related issues and pull requests on GitHub:*
  :issue:`6494`.



- Stopped logging exceptions from ``web.run_app()`` that would be raised regardless -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`6807`.



- Implemented binding to IPv6 addresses in the pytest server fixture.


  *Related issues and pull requests on GitHub:*
  :issue:`4650`.



- Fixed the incorrect use of flags for ``getnameinfo()`` in the Resolver --by :user:`GitNMLee`

  Link-Local IPv6 addresses can now be handled by the Resolver correctly.


  *Related issues and pull requests on GitHub:*
  :issue:`9032`.



- Fixed StreamResponse.prepared to return True after EOF is sent -- by :user:`arthurdarcet`.


  *Related issues and pull requests on GitHub:*
  :issue:`5343`.



- Changed ``make_mocked_request()`` to use empty payload by default -- by :user:`rahulnht`.


  *Related issues and pull requests on GitHub:*
  :issue:`7167`.



- Used more precise type for ``ClientResponseError.headers``, fixing some type errors when using them -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8768`.



- Changed behavior when returning an invalid response to send a 500 response -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8845`.



- Fixed response reading from closed session to throw an error immediately instead of timing out -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8878`.



- Fixed ``CancelledError`` from one cleanup context stopping other contexts from completing -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8908`.



- Fixed changing scheme/host in ``Response.clone()`` for absolute URLs -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8990`.



- Fixed ``Site.name`` when host is an empty string -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8929`.



- Updated Python parser to reject messages after a close message, matching C parser behaviour -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`9018`.



- Fixed creation of ``SSLContext`` inside of :py:class:`aiohttp.TCPConnector` with multiple event loops in different threads -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9029`.



- Fixed (on Python 3.11+) some edge cases where a task cancellation may get incorrectly suppressed -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`9030`.



- Fixed exception information getting lost on ``HttpProcessingError`` -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`9052`.



- Fixed ``If-None-Match`` not using weak comparison -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`9063`.



- Fixed badly encoded charset crashing when getting response text instead of falling back to charset detector.


  *Related issues and pull requests on GitHub:*
  :issue:`9160`.



- Rejected `\n` in `reason` values to avoid sending broken HTTP messages -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`9167`.



- Changed :py:meth:`ClientResponse.raise_for_status() <aiohttp.ClientResponse.raise_for_status>` to only release the connection when invoked outside an ``async with`` context -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`9239`.




Features
--------

- Improved type on ``params`` to match the underlying type allowed by ``yarl`` -- by :user:`lpetre`.


  *Related issues and pull requests on GitHub:*
  :issue:`8564`.



- Declared Python 3.13 supported -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`8748`.




Removals and backward incompatible breaking changes
---------------------------------------------------

- Improved middleware performance -- by :user:`bdraco`.

  The ``set_current_app`` method was removed from ``UrlMappingMatchInfo`` because it is no longer used, and it was unlikely external caller would ever use it.


  *Related issues and pull requests on GitHub:*
  :issue:`9200`.



- Increased minimum yarl version to 1.12.0 -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9267`.




Improved documentation
----------------------

- Clarified that ``GracefulExit`` needs to be handled in ``AppRunner`` and ``ServerRunner`` when using ``handle_signals=True``. -- by :user:`Daste745`


  *Related issues and pull requests on GitHub:*
  :issue:`4414`.



- Clarified that auth parameter in ClientSession will persist and be included with any request to any origin, even during redirects to different origins.  -- by :user:`MaximZemskov`.


  *Related issues and pull requests on GitHub:*
  :issue:`6764`.



- Clarified which timeout exceptions happen on which timeouts -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8968`.



- Updated ``ClientSession`` parameters to match current code -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8991`.




Packaging updates and notes for downstreams
-------------------------------------------

- Fixed ``test_client_session_timeout_zero`` to not require internet access -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`9004`.




Miscellaneous internal changes
------------------------------

- Improved performance of making requests when there are no auto headers to skip -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`8847`.



- Exported ``aiohttp.TraceRequestHeadersSentParams`` -- by :user:`Hadock-is-ok`.


  *Related issues and pull requests on GitHub:*
  :issue:`8947`.



- Avoided tracing overhead in the http writer when there are no active traces -- by user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9031`.



- Improved performance of reify Cython implementation -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9054`.



- Use :meth:`URL.extend_query() <yarl.URL.extend_query>` to extend query params (requires yarl 1.11.0+) -- by :user:`bdraco`.

  If yarl is older than 1.11.0, the previous slower hand rolled version will be used.


  *Related issues and pull requests on GitHub:*
  :issue:`9068`.



- Improved performance of checking if a host is an IP Address -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9095`.



- Significantly improved performance of middlewares -- by :user:`bdraco`.

  The construction of the middleware wrappers is now cached and is built once per handler instead of on every request.


  *Related issues and pull requests on GitHub:*
  :issue:`9158`, :issue:`9170`.



- Improved performance of web requests -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9168`, :issue:`9169`, :issue:`9172`, :issue:`9174`, :issue:`9175`, :issue:`9241`.



- Improved performance of starting web requests when there is no response prepare hook -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9173`.



- Significantly improved performance of expiring cookies -- by :user:`bdraco`.

  Expiring cookies has been redesigned to use :mod:`heapq` instead of a linear search, to better scale.


  *Related issues and pull requests on GitHub:*
  :issue:`9203`.



- Significantly sped up filtering cookies -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`9204`.




----


3.10.5 (2024-08-19)
=========================

Bug fixes
---------

- Fixed :meth:`aiohttp.ClientResponse.json()` not setting ``status`` when :exc:`aiohttp.ContentTypeError` is raised -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`8742`.




Miscellaneous internal changes
------------------------------

- Improved performance of the WebSocket reader -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`8736`, :issue:`8747`.




----


3.10.4 (2024-08-17)
===================

Bug fixes
---------

- Fixed decoding base64 chunk in BodyPartReader -- by :user:`hyzyla`.


  *Related issues and pull requests on GitHub:*
  :issue:`3867`.



- Fixed a race closing the server-side WebSocket where the close code would not reach the client -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`8680`.



- Fixed unconsumed exceptions raised by the WebSocket heartbeat -- by :user:`bdraco`.

  If the heartbeat ping raised an exception, it would not be consumed and would be logged as an warning.


  *Related issues and pull requests on GitHub:*
  :issue:`8685`.



- Fixed an edge case in the Python parser when chunk separators happen to align with network chunks -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8720`.




Improved documentation
----------------------

- Added ``aiohttp-apischema`` to supported libraries -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8700`.




Miscellaneous internal changes
------------------------------

- Improved performance of starting request handlers with Python 3.12+ -- by :user:`bdraco`.

  This change is a followup to :issue:`8661` to make the same optimization for Python 3.12+ where the request is connected.


  *Related issues and pull requests on GitHub:*
  :issue:`8681`.




----


3.10.3 (2024-08-10)
========================

Bug fixes
---------

- Fixed multipart reading when stream buffer splits the boundary over several read() calls -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8653`.



- Fixed :py:class:`aiohttp.TCPConnector` doing blocking I/O in the event loop to create the ``SSLContext`` -- by :user:`bdraco`.

  The blocking I/O would only happen once per verify mode. However, it could cause the event loop to block for a long time if the ``SSLContext`` creation is slow, which is more likely during startup when the disk cache is not yet present.


  *Related issues and pull requests on GitHub:*
  :issue:`8672`.




Miscellaneous internal changes
------------------------------

- Improved performance of :py:meth:`~aiohttp.ClientWebSocketResponse.receive` and :py:meth:`~aiohttp.web.WebSocketResponse.receive` when there is no timeout. -- by :user:`bdraco`.

  The timeout context manager is now avoided when there is no timeout as it accounted for up to 50% of the time spent in the :py:meth:`~aiohttp.ClientWebSocketResponse.receive` and :py:meth:`~aiohttp.web.WebSocketResponse.receive` methods.


  *Related issues and pull requests on GitHub:*
  :issue:`8660`.



- Improved performance of starting request handlers with Python 3.12+ -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`8661`.



- Improved performance of HTTP keep-alive checks -- by :user:`bdraco`.

  Previously, when processing a request for a keep-alive connection, the keep-alive check would happen every second; the check is now rescheduled if it fires too early instead.


  *Related issues and pull requests on GitHub:*
  :issue:`8662`.



- Improved performance of generating random WebSocket mask -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`8667`.




----


3.10.2 (2024-08-08)
===================

Bug fixes
---------

- Fixed server checks for circular symbolic links to be compatible with Python 3.13 -- by :user:`steverep`.


  *Related issues and pull requests on GitHub:*
  :issue:`8565`.



- Fixed request body not being read when ignoring an Upgrade request -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8597`.



- Fixed an edge case where shutdown would wait for timeout when the handler was already completed -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8611`.



- Fixed connecting to ``npipe://``, ``tcp://``, and ``unix://`` urls -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`8632`.



- Fixed WebSocket ping tasks being prematurely garbage collected -- by :user:`bdraco`.

  There was a small risk that WebSocket ping tasks would be prematurely garbage collected because the event loop only holds a weak reference to the task. The garbage collection risk has been fixed by holding a strong reference to the task. Additionally, the task is now scheduled eagerly with Python 3.12+ to increase the chance it can be completed immediately and avoid having to hold any references to the task.


  *Related issues and pull requests on GitHub:*
  :issue:`8641`.



- Fixed incorrectly following symlinks for compressed file variants -- by :user:`steverep`.


  *Related issues and pull requests on GitHub:*
  :issue:`8652`.




Removals and backward incompatible breaking changes
---------------------------------------------------

- Removed ``Request.wait_for_disconnection()``, which was mistakenly added briefly in 3.10.0 -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8636`.




Contributor-facing changes
--------------------------

- Fixed monkey patches for ``Path.stat()`` and ``Path.is_dir()`` for Python 3.13 compatibility -- by :user:`steverep`.


  *Related issues and pull requests on GitHub:*
  :issue:`8551`.




Miscellaneous internal changes
------------------------------

- Improved WebSocket performance when messages are sent or received frequently -- by :user:`bdraco`.

  The WebSocket heartbeat scheduling algorithm was improved to reduce the ``asyncio`` scheduling overhead by decreasing the number of ``asyncio.TimerHandle`` creations and cancellations.


  *Related issues and pull requests on GitHub:*
  :issue:`8608`.



- Minor improvements to various type annotations -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8634`.




----


3.10.1 (2024-08-03)
========================

Bug fixes
---------

- Fixed WebSocket server heartbeat timeout logic to terminate :py:meth:`~aiohttp.ClientWebSocketResponse.receive` and return :py:class:`~aiohttp.ServerTimeoutError` -- by :user:`arcivanov`.

  When a WebSocket pong message was not received, the :py:meth:`~aiohttp.ClientWebSocketResponse.receive` operation did not terminate. This change causes ``_pong_not_received`` to feed the ``reader`` an error message, causing pending :py:meth:`~aiohttp.ClientWebSocketResponse.receive` to terminate and return the error message. The error message contains the exception :py:class:`~aiohttp.ServerTimeoutError`.


  *Related issues and pull requests on GitHub:*
  :issue:`8540`.



- Fixed url dispatcher index not matching when a variable is preceded by a fixed string after a slash -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`8566`.




Removals and backward incompatible breaking changes
---------------------------------------------------

- Creating :py:class:`aiohttp.TCPConnector`, :py:class:`aiohttp.ClientSession`, :py:class:`~aiohttp.resolver.ThreadedResolver` :py:class:`aiohttp.web.Server`, or :py:class:`aiohttp.CookieJar` instances without a running event loop now raises a :exc:`RuntimeError` -- by :user:`asvetlov`.

  Creating these objects without a running event loop was deprecated in :issue:`3372` which was released in version 3.5.0.

  This change first appeared in version 3.10.0 as :issue:`6378`.


  *Related issues and pull requests on GitHub:*
  :issue:`8555`, :issue:`8583`.




----


3.10.0 (2024-07-30)
========================

Bug fixes
---------

- Fixed server response headers for ``Content-Type`` and ``Content-Encoding`` for
  static compressed files -- by :user:`steverep`.

  Server will now respond with a ``Content-Type`` appropriate for the compressed
  file (e.g. ``"application/gzip"``), and omit the ``Content-Encoding`` header.
  Users should expect that most clients will no longer decompress such responses
  by default.


  *Related issues and pull requests on GitHub:*
  :issue:`4462`.



- Fixed duplicate cookie expiration calls in the CookieJar implementation


  *Related issues and pull requests on GitHub:*
  :issue:`7784`.



- Adjusted ``FileResponse`` to check file existence and access when preparing the response -- by :user:`steverep`.

  The :py:class:`~aiohttp.web.FileResponse` class was modified to respond with
   403 Forbidden or 404 Not Found as appropriate.  Previously, it would cause a
   server error if the path did not exist or could not be accessed.  Checks for
   existence, non-regular files, and permissions were expected to be done in the
   route handler.  For static routes, this now permits a compressed file to exist
   without its uncompressed variant and still be served.  In addition, this
   changes the response status for files without read permission to 403, and for
   non-regular files from 404 to 403 for consistency.


  *Related issues and pull requests on GitHub:*
  :issue:`8182`.



- Fixed ``AsyncResolver`` to match ``ThreadedResolver`` behavior
  -- by :user:`bdraco`.

  On system with IPv6 support, the :py:class:`~aiohttp.resolver.AsyncResolver` would not fallback
  to providing A records when AAAA records were not available.
  Additionally, unlike the :py:class:`~aiohttp.resolver.ThreadedResolver`, the :py:class:`~aiohttp.resolver.AsyncResolver`
  did not handle link-local addresses correctly.

  This change makes the behavior consistent with the :py:class:`~aiohttp.resolver.ThreadedResolver`.


  *Related issues and pull requests on GitHub:*
  :issue:`8270`.



- Fixed ``ws_connect`` not respecting `receive_timeout`` on WS(S) connection.
  -- by :user:`arcivanov`.


  *Related issues and pull requests on GitHub:*
  :issue:`8444`.



- Removed blocking I/O in the event loop for static resources and refactored
  exception handling -- by :user:`steverep`.

  File system calls when handling requests for static routes were moved to a
  separate thread to potentially improve performance. Exception handling
  was tightened in order to only return 403 Forbidden or 404 Not Found responses
  for expected scenarios; 500 Internal Server Error would be returned for any
  unknown errors.


  *Related issues and pull requests on GitHub:*
  :issue:`8507`.




Features
--------

- Added a Request.wait_for_disconnection() method, as means of allowing request handlers to be notified of premature client disconnections.


  *Related issues and pull requests on GitHub:*
  :issue:`2492`.



- Added 5 new exceptions: :py:exc:`~aiohttp.InvalidUrlClientError`, :py:exc:`~aiohttp.RedirectClientError`,
  :py:exc:`~aiohttp.NonHttpUrlClientError`, :py:exc:`~aiohttp.InvalidUrlRedirectClientError`,
  :py:exc:`~aiohttp.NonHttpUrlRedirectClientError`

  :py:exc:`~aiohttp.InvalidUrlRedirectClientError`, :py:exc:`~aiohttp.NonHttpUrlRedirectClientError`
  are raised instead of :py:exc:`ValueError` or :py:exc:`~aiohttp.InvalidURL` when the redirect URL is invalid. Classes
  :py:exc:`~aiohttp.InvalidUrlClientError`, :py:exc:`~aiohttp.RedirectClientError`,
  :py:exc:`~aiohttp.NonHttpUrlClientError` are base for them.

  The :py:exc:`~aiohttp.InvalidURL` now exposes a ``description`` property with the text explanation of the error details.

  -- by :user:`setla`, :user:`AraHaan`, and :user:`bdraco`


  *Related issues and pull requests on GitHub:*
  :issue:`2507`, :issue:`3315`, :issue:`6722`, :issue:`8481`, :issue:`8482`.



- Added a feature to retry closed connections automatically for idempotent methods. -- by :user:`Dreamsorcerer`


  *Related issues and pull requests on GitHub:*
  :issue:`7297`.



- Implemented filter_cookies() with domain-matching and path-matching on the keys, instead of testing every single cookie.
  This may break existing cookies that have been saved with `CookieJar.save()`. Cookies can be migrated with this script::

      import pickle
      with file_path.open("rb") as f:
          cookies = pickle.load(f)

      morsels = [(name, m) for c in cookies.values() for name, m in c.items()]
      cookies.clear()
      for name, m in morsels:
          cookies[(m["domain"], m["path"].rstrip("/"))][name] = m

      with file_path.open("wb") as f:
          pickle.dump(cookies, f, pickle.HIGHEST_PROTOCOL)


  *Related issues and pull requests on GitHub:*
  :issue:`7583`, :issue:`8535`.



- Separated connection and socket timeout errors, from ServerTimeoutError.


  *Related issues and pull requests on GitHub:*
  :issue:`7801`.



- Implemented happy eyeballs


  *Related issues and pull requests on GitHub:*
  :issue:`7954`.



- Added server capability to check for static files with Brotli compression via a ``.br`` extension -- by :user:`steverep`.


  *Related issues and pull requests on GitHub:*
  :issue:`8062`.




Removals and backward incompatible breaking changes
---------------------------------------------------

- The shutdown logic in 3.9 waited on all tasks, which caused issues with some libraries.
  In 3.10 we've changed this logic to only wait on request handlers. This means that it's
  important for developers to correctly handle the lifecycle of background tasks using a
  library such as ``aiojobs``. If an application is using ``handler_cancellation=True`` then
  it is also a good idea to ensure that any :func:`asyncio.shield` calls are replaced with
  :func:`aiojobs.aiohttp.shield`.

  Please read the updated documentation on these points: \
  https://docs.aiohttp.org/en/stable/web_advanced.html#graceful-shutdown \
  https://docs.aiohttp.org/en/stable/web_advanced.html#web-handler-cancellation

  -- by :user:`Dreamsorcerer`


  *Related issues and pull requests on GitHub:*
  :issue:`8495`.




Improved documentation
----------------------

- Added documentation for ``aiohttp.web.FileResponse``.


  *Related issues and pull requests on GitHub:*
  :issue:`3958`.



- Improved the docs for the `ssl` params.


  *Related issues and pull requests on GitHub:*
  :issue:`8403`.




Contributor-facing changes
--------------------------

- Enabled HTTP parser tests originally intended for 3.9.2 release -- by :user:`pajod`.


  *Related issues and pull requests on GitHub:*
  :issue:`8088`.




Miscellaneous internal changes
------------------------------

- Improved URL handler resolution time by indexing resources in the UrlDispatcher.
  For applications with a large number of handlers, this should increase performance significantly.
  -- by :user:`bdraco`


  *Related issues and pull requests on GitHub:*
  :issue:`7829`.



- Added `nacl_middleware <https://github.com/CosmicDNA/nacl_middleware>`_ to the list of middlewares in the third party section of the documentation.


  *Related issues and pull requests on GitHub:*
  :issue:`8346`.



- Minor improvements to static typing -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8364`.



- Added a 3.11-specific overloads to ``ClientSession``  -- by :user:`max-muoto`.


  *Related issues and pull requests on GitHub:*
  :issue:`8463`.



- Simplified path checks for ``UrlDispatcher.add_static()`` method -- by :user:`steverep`.


  *Related issues and pull requests on GitHub:*
  :issue:`8491`.



- Avoided creating a future on every websocket receive -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`8498`.



- Updated identity checks for all ``WSMsgType`` type compares -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`8501`.



- When using Python 3.12 or later, the writer is no longer scheduled on the event loop if it can finish synchronously. Avoiding event loop scheduling reduces latency and improves performance. -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`8510`.



- Restored :py:class:`~aiohttp.resolver.AsyncResolver` to be the default resolver. -- by :user:`bdraco`.

  :py:class:`~aiohttp.resolver.AsyncResolver` was disabled by default because
  of IPv6 compatibility issues. These issues have been resolved and
  :py:class:`~aiohttp.resolver.AsyncResolver` is again now the default resolver.


  *Related issues and pull requests on GitHub:*
  :issue:`8522`.




----


3.9.5 (2024-04-16)
==================

Bug fixes
---------

- Fixed "Unclosed client session" when initialization of
  :py:class:`~aiohttp.ClientSession` fails -- by :user:`NewGlad`.


  *Related issues and pull requests on GitHub:*
  :issue:`8253`.



- Fixed regression (from :pr:`8280`) with adding ``Content-Disposition`` to the ``form-data``
  part after appending to writer -- by :user:`Dreamsorcerer`/:user:`Olegt0rr`.


  *Related issues and pull requests on GitHub:*
  :issue:`8332`.



- Added default ``Content-Disposition`` in ``multipart/form-data`` responses to avoid broken
  form-data responses -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8335`.




----


3.9.4 (2024-04-11)
==================

Bug fixes
---------

- The asynchronous internals now set the underlying causes
  when assigning exceptions to the future objects
  -- by :user:`webknjaz`.


  *Related issues and pull requests on GitHub:*
  :issue:`8089`.



- Treated values of ``Accept-Encoding`` header as case-insensitive when checking
  for gzip files -- by :user:`steverep`.


  *Related issues and pull requests on GitHub:*
  :issue:`8104`.



- Improved the DNS resolution performance on cache hit -- by :user:`bdraco`.

  This is achieved by avoiding an :mod:`asyncio` task creation in this case.


  *Related issues and pull requests on GitHub:*
  :issue:`8163`.


- Changed the type annotations to allow ``dict`` on :meth:`aiohttp.MultipartWriter.append`,
  :meth:`aiohttp.MultipartWriter.append_json` and
  :meth:`aiohttp.MultipartWriter.append_form` -- by :user:`cakemanny`


  *Related issues and pull requests on GitHub:*
  :issue:`7741`.



- Ensure websocket transport is closed when client does not close it
  -- by :user:`bdraco`.

  The transport could remain open if the client did not close it. This
  change ensures the transport is closed when the client does not close
  it.


  *Related issues and pull requests on GitHub:*
  :issue:`8200`.



- Leave websocket transport open if receive times out or is cancelled
  -- by :user:`bdraco`.

  This restores the behavior prior to the change in #7978.


  *Related issues and pull requests on GitHub:*
  :issue:`8251`.



- Fixed content not being read when an upgrade request was not supported with the pure Python implementation.
  -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`8252`.



- Fixed a race condition with incoming connections during server shutdown -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8271`.



- Fixed ``multipart/form-data`` compliance with :rfc:`7578` -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8280`.



- Fixed blocking I/O in the event loop while processing files in a POST request
  -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`8283`.



- Escaped filenames in static view -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`8317`.



- Fixed the pure python parser to mark a connection as closing when a
  response has no length -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8320`.




Features
--------

- Upgraded *llhttp* to 9.2.1, and started rejecting obsolete line folding
  in Python parser to match -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8146`, :issue:`8292`.




Deprecations (removal in next major release)
--------------------------------------------

- Deprecated ``content_transfer_encoding`` parameter in :py:meth:`FormData.add_field()
  <aiohttp.FormData.add_field>` -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8280`.




Improved documentation
----------------------

- Added a note about canceling tasks to avoid delaying server shutdown -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8267`.




Contributor-facing changes
--------------------------

- The pull request template is now asking the contributors to
  answer a question about the long-term maintenance challenges
  they envision as a result of merging their patches
  -- by :user:`webknjaz`.


  *Related issues and pull requests on GitHub:*
  :issue:`8099`.



- Updated CI and documentation to use NPM clean install and upgrade
  node to version 18 -- by :user:`steverep`.


  *Related issues and pull requests on GitHub:*
  :issue:`8116`.



- A pytest fixture ``hello_txt`` was introduced to aid
  static file serving tests in
  :file:`test_web_sendfile_functional.py`. It dynamically
  provisions ``hello.txt`` file variants shared across the
  tests in the module.

  -- by :user:`steverep`


  *Related issues and pull requests on GitHub:*
  :issue:`8136`.




Packaging updates and notes for downstreams
-------------------------------------------

- Added an ``internal`` pytest marker for tests which should be skipped
  by packagers (use ``-m 'not internal'`` to disable them) -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8299`.




----


3.9.3 (2024-01-29)
==================

Bug fixes
---------

- Fixed backwards compatibility breakage (in 3.9.2) of ``ssl`` parameter when set outside
  of ``ClientSession`` (e.g. directly in ``TCPConnector``) -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`8097`, :issue:`8098`.




Miscellaneous internal changes
------------------------------

- Improved test suite handling of paths and temp files to consistently use pathlib and pytest fixtures.


  *Related issues and pull requests on GitHub:*
  :issue:`3957`.




----


3.9.2 (2024-01-28)
==================

Bug fixes
---------

- Fixed server-side websocket connection leak.


  *Related issues and pull requests on GitHub:*
  :issue:`7978`.



- Fixed ``web.FileResponse`` doing blocking I/O in the event loop.


  *Related issues and pull requests on GitHub:*
  :issue:`8012`.



- Fixed double compress when compression enabled and compressed file exists in server file responses.


  *Related issues and pull requests on GitHub:*
  :issue:`8014`.



- Added runtime type check for ``ClientSession`` ``timeout`` parameter.


  *Related issues and pull requests on GitHub:*
  :issue:`8021`.



- Fixed an unhandled exception in the Python HTTP parser on header lines starting with a colon -- by :user:`pajod`.

  Invalid request lines with anything but a dot between the HTTP major and minor version are now rejected.
  Invalid header field names containing question mark or slash are now rejected.
  Such requests are incompatible with :rfc:`9110#section-5.6.2` and are not known to be of any legitimate use.


  *Related issues and pull requests on GitHub:*
  :issue:`8074`.



- Improved validation of paths for static resources requests to the server -- by :user:`bdraco`.


  *Related issues and pull requests on GitHub:*
  :issue:`8079`.




Features
--------

- Added support for passing :py:data:`True` to ``ssl`` parameter in ``ClientSession`` while
  deprecating :py:data:`None` -- by :user:`xiangyan99`.


  *Related issues and pull requests on GitHub:*
  :issue:`7698`.



Breaking changes
----------------

- Fixed an unhandled exception in the Python HTTP parser on header lines starting with a colon -- by :user:`pajod`.

  Invalid request lines with anything but a dot between the HTTP major and minor version are now rejected.
  Invalid header field names containing question mark or slash are now rejected.
  Such requests are incompatible with :rfc:`9110#section-5.6.2` and are not known to be of any legitimate use.


  *Related issues and pull requests on GitHub:*
  :issue:`8074`.




Improved documentation
----------------------

- Fixed examples of ``fallback_charset_resolver`` function in the :doc:`client_advanced` document. -- by :user:`henry0312`.


  *Related issues and pull requests on GitHub:*
  :issue:`7995`.



- The Sphinx setup was updated to avoid showing the empty
  changelog draft section in the tagged release documentation
  builds on Read The Docs -- by :user:`webknjaz`.


  *Related issues and pull requests on GitHub:*
  :issue:`8067`.




Packaging updates and notes for downstreams
-------------------------------------------

- The changelog categorization was made clearer. The
  contributors can now mark their fragment files more
  accurately -- by :user:`webknjaz`.

  The new category tags are:

      * ``bugfix``

      * ``feature``

      * ``deprecation``

      * ``breaking`` (previously, ``removal``)

      * ``doc``

      * ``packaging``

      * ``contrib``

      * ``misc``


  *Related issues and pull requests on GitHub:*
  :issue:`8066`.




Contributor-facing changes
--------------------------

- Updated :ref:`contributing/Tests coverage <aiohttp-contributing>` section to show how we use ``codecov`` -- by :user:`Dreamsorcerer`.


  *Related issues and pull requests on GitHub:*
  :issue:`7916`.



- The changelog categorization was made clearer. The
  contributors can now mark their fragment files more
  accurately -- by :user:`webknjaz`.

  The new category tags are:

      * ``bugfix``

      * ``feature``

      * ``deprecation``

      * ``breaking`` (previously, ``removal``)

      * ``doc``

      * ``packaging``

      * ``contrib``

      * ``misc``


  *Related issues and pull requests on GitHub:*
  :issue:`8066`.




Miscellaneous internal changes
------------------------------

- Replaced all ``tmpdir`` fixtures with ``tmp_path`` in test suite.


  *Related issues and pull requests on GitHub:*
  :issue:`3551`.




----


3.9.1 (2023-11-26)
==================

Bugfixes
--------

- Fixed importing aiohttp under PyPy on Windows.

  `#7848 <https://github.com/aio-libs/aiohttp/issues/7848>`_

- Fixed async concurrency safety in websocket compressor.

  `#7865 <https://github.com/aio-libs/aiohttp/issues/7865>`_

- Fixed ``ClientResponse.close()`` releasing the connection instead of closing.

  `#7869 <https://github.com/aio-libs/aiohttp/issues/7869>`_

- Fixed a regression where connection may get closed during upgrade. -- by :user:`Dreamsorcerer`

  `#7879 <https://github.com/aio-libs/aiohttp/issues/7879>`_

- Fixed messages being reported as upgraded without an Upgrade header in Python parser. -- by :user:`Dreamsorcerer`

  `#7895 <https://github.com/aio-libs/aiohttp/issues/7895>`_



----


3.9.0 (2023-11-18)
==================

Features
--------

- Introduced ``AppKey`` for static typing support of ``Application`` storage.
  See https://docs.aiohttp.org/en/stable/web_advanced.html#application-s-config

  `#5864 <https://github.com/aio-libs/aiohttp/issues/5864>`_

- Added a graceful shutdown period which allows pending tasks to complete before the application's cleanup is called.
  The period can be adjusted with the ``shutdown_timeout`` parameter. -- by :user:`Dreamsorcerer`.
  See https://docs.aiohttp.org/en/latest/web_advanced.html#graceful-shutdown

  `#7188 <https://github.com/aio-libs/aiohttp/issues/7188>`_

- Added `handler_cancellation <https://docs.aiohttp.org/en/stable/web_advanced.html#web-handler-cancellation>`_ parameter to cancel web handler on client disconnection. -- by :user:`mosquito`
  This (optionally) reintroduces a feature removed in a previous release.
  Recommended for those looking for an extra level of protection against denial-of-service attacks.

  `#7056 <https://github.com/aio-libs/aiohttp/issues/7056>`_

- Added support for setting response header parameters ``max_line_size`` and ``max_field_size``.

  `#2304 <https://github.com/aio-libs/aiohttp/issues/2304>`_

- Added ``auto_decompress`` parameter to ``ClientSession.request`` to override ``ClientSession._auto_decompress``. -- by :user:`Daste745`

  `#3751 <https://github.com/aio-libs/aiohttp/issues/3751>`_

- Changed ``raise_for_status`` to allow a coroutine.

  `#3892 <https://github.com/aio-libs/aiohttp/issues/3892>`_

- Added client brotli compression support (optional with runtime check).

  `#5219 <https://github.com/aio-libs/aiohttp/issues/5219>`_

- Added ``client_max_size`` to ``BaseRequest.clone()`` to allow overriding the request body size. -- :user:`anesabml`.

  `#5704 <https://github.com/aio-libs/aiohttp/issues/5704>`_

- Added a middleware type alias ``aiohttp.typedefs.Middleware``.

  `#5898 <https://github.com/aio-libs/aiohttp/issues/5898>`_

- Exported ``HTTPMove`` which can be used to catch any redirection request
  that has a location -- :user:`dreamsorcerer`.

  `#6594 <https://github.com/aio-libs/aiohttp/issues/6594>`_

- Changed the ``path`` parameter in ``web.run_app()`` to accept a ``pathlib.Path`` object.

  `#6839 <https://github.com/aio-libs/aiohttp/issues/6839>`_

- Performance: Skipped filtering ``CookieJar`` when the jar is empty or all cookies have expired.

  `#7819 <https://github.com/aio-libs/aiohttp/issues/7819>`_

- Performance: Only check origin if insecure scheme and there are origins to treat as secure, in ``CookieJar.filter_cookies()``.

  `#7821 <https://github.com/aio-libs/aiohttp/issues/7821>`_

- Performance: Used timestamp instead of ``datetime`` to achieve faster cookie expiration in ``CookieJar``.

  `#7824 <https://github.com/aio-libs/aiohttp/issues/7824>`_

- Added support for passing a custom server name parameter to HTTPS connection.

  `#7114 <https://github.com/aio-libs/aiohttp/issues/7114>`_

- Added support for using Basic Auth credentials from :file:`.netrc` file when making HTTP requests with the
  :py:class:`~aiohttp.ClientSession` ``trust_env`` argument is set to ``True``. -- by :user:`yuvipanda`.

  `#7131 <https://github.com/aio-libs/aiohttp/issues/7131>`_

- Turned access log into no-op when the logger is disabled.

  `#7240 <https://github.com/aio-libs/aiohttp/issues/7240>`_

- Added typing information to ``RawResponseMessage``. -- by :user:`Gobot1234`

  `#7365 <https://github.com/aio-libs/aiohttp/issues/7365>`_

- Removed ``async-timeout`` for Python 3.11+ (replaced with ``asyncio.timeout()`` on newer releases).

  `#7502 <https://github.com/aio-libs/aiohttp/issues/7502>`_

- Added support for ``brotlicffi`` as an alternative to ``brotli`` (fixing Brotli support on PyPy).

  `#7611 <https://github.com/aio-libs/aiohttp/issues/7611>`_

- Added ``WebSocketResponse.get_extra_info()`` to access a protocol transport's extra info.

  `#7078 <https://github.com/aio-libs/aiohttp/issues/7078>`_

- Allow ``link`` argument to be set to None/empty in HTTP 451 exception.

  `#7689 <https://github.com/aio-libs/aiohttp/issues/7689>`_



Bugfixes
--------

- Implemented stripping the trailing dots from fully-qualified domain names in ``Host`` headers and TLS context when acting as an HTTP client.
  This allows the client to connect to URLs with FQDN host name like ``https://example.com./``.
  -- by :user:`martin-sucha`.

  `#3636 <https://github.com/aio-libs/aiohttp/issues/3636>`_

- Fixed client timeout not working when incoming data is always available without waiting. -- by :user:`Dreamsorcerer`.

  `#5854 <https://github.com/aio-libs/aiohttp/issues/5854>`_

- Fixed ``readuntil`` to work with a delimiter of more than one character.

  `#6701 <https://github.com/aio-libs/aiohttp/issues/6701>`_

- Added ``__repr__`` to ``EmptyStreamReader`` to avoid ``AttributeError``.

  `#6916 <https://github.com/aio-libs/aiohttp/issues/6916>`_

- Fixed bug when using ``TCPConnector`` with ``ttl_dns_cache=0``.

  `#7014 <https://github.com/aio-libs/aiohttp/issues/7014>`_

- Fixed response returned from expect handler being thrown away. -- by :user:`Dreamsorcerer`

  `#7025 <https://github.com/aio-libs/aiohttp/issues/7025>`_

- Avoided raising ``UnicodeDecodeError`` in multipart and in HTTP headers parsing.

  `#7044 <https://github.com/aio-libs/aiohttp/issues/7044>`_

- Changed ``sock_read`` timeout to start after writing has finished, avoiding read timeouts caused by an unfinished write. -- by :user:`dtrifiro`

  `#7149 <https://github.com/aio-libs/aiohttp/issues/7149>`_

- Fixed missing query in tracing method URLs when using ``yarl`` 1.9+.

  `#7259 <https://github.com/aio-libs/aiohttp/issues/7259>`_

- Changed max 32-bit timestamp to an aware datetime object, for consistency with the non-32-bit one, and to avoid a ``DeprecationWarning`` on Python 3.12.

  `#7302 <https://github.com/aio-libs/aiohttp/issues/7302>`_

- Fixed ``EmptyStreamReader.iter_chunks()`` never ending. -- by :user:`mind1m`

  `#7616 <https://github.com/aio-libs/aiohttp/issues/7616>`_

- Fixed a rare ``RuntimeError: await wasn't used with future`` exception. -- by :user:`stalkerg`

  `#7785 <https://github.com/aio-libs/aiohttp/issues/7785>`_

- Fixed issue with insufficient HTTP method and version validation.

  `#7700 <https://github.com/aio-libs/aiohttp/issues/7700>`_

- Added check to validate that absolute URIs have schemes.

  `#7712 <https://github.com/aio-libs/aiohttp/issues/7712>`_

- Fixed unhandled exception when Python HTTP parser encounters unpaired Unicode surrogates.

  `#7715 <https://github.com/aio-libs/aiohttp/issues/7715>`_

- Updated parser to disallow invalid characters in header field names and stop accepting LF as a request line separator.

  `#7719 <https://github.com/aio-libs/aiohttp/issues/7719>`_

- Fixed Python HTTP parser not treating 204/304/1xx as an empty body.

  `#7755 <https://github.com/aio-libs/aiohttp/issues/7755>`_

- Ensure empty body response for 1xx/204/304 per RFC 9112 sec 6.3.

  `#7756 <https://github.com/aio-libs/aiohttp/issues/7756>`_

- Fixed an issue when a client request is closed before completing a chunked payload. -- by :user:`Dreamsorcerer`

  `#7764 <https://github.com/aio-libs/aiohttp/issues/7764>`_

- Edge Case Handling for ResponseParser for missing reason value.

  `#7776 <https://github.com/aio-libs/aiohttp/issues/7776>`_

- Fixed ``ClientWebSocketResponse.close_code`` being erroneously set to ``None`` when there are concurrent async tasks receiving data and closing the connection.

  `#7306 <https://github.com/aio-libs/aiohttp/issues/7306>`_

- Added HTTP method validation.

  `#6533 <https://github.com/aio-libs/aiohttp/issues/6533>`_

- Fixed arbitrary sequence types being allowed to inject values via version parameter. -- by :user:`Dreamsorcerer`

  `#7835 <https://github.com/aio-libs/aiohttp/issues/7835>`_

- Performance: Fixed increase in latency with small messages from websocket compression changes.

  `#7797 <https://github.com/aio-libs/aiohttp/issues/7797>`_



Improved Documentation
----------------------

- Fixed the `ClientResponse.release`'s type in the doc. Changed from `comethod` to `method`.

  `#5836 <https://github.com/aio-libs/aiohttp/issues/5836>`_

- Added information on behavior of base_url parameter in `ClientSession`.

  `#6647 <https://github.com/aio-libs/aiohttp/issues/6647>`_

- Fixed `ClientResponseError` docs.

  `#6700 <https://github.com/aio-libs/aiohttp/issues/6700>`_

- Updated Redis code examples to follow the latest API.

  `#6907 <https://github.com/aio-libs/aiohttp/issues/6907>`_

- Added a note about possibly needing to update headers when using ``on_response_prepare``. -- by :user:`Dreamsorcerer`

  `#7283 <https://github.com/aio-libs/aiohttp/issues/7283>`_

- Completed ``trust_env`` parameter description to honor ``wss_proxy``, ``ws_proxy`` or ``no_proxy`` env.

  `#7325 <https://github.com/aio-libs/aiohttp/issues/7325>`_

- Expanded SSL documentation with more examples (e.g. how to use certifi). -- by :user:`Dreamsorcerer`

  `#7334 <https://github.com/aio-libs/aiohttp/issues/7334>`_

- Fix, update, and improve client exceptions documentation.

  `#7733 <https://github.com/aio-libs/aiohttp/issues/7733>`_



Deprecations and Removals
-------------------------

- Added ``shutdown_timeout`` parameter to ``BaseRunner``, while
  deprecating ``shutdown_timeout`` parameter from ``BaseSite``. -- by :user:`Dreamsorcerer`

  `#7718 <https://github.com/aio-libs/aiohttp/issues/7718>`_

- Dropped Python 3.6 support.

  `#6378 <https://github.com/aio-libs/aiohttp/issues/6378>`_

- Dropped Python 3.7 support. -- by :user:`Dreamsorcerer`

  `#7336 <https://github.com/aio-libs/aiohttp/issues/7336>`_

- Removed support for abandoned ``tokio`` event loop. -- by :user:`Dreamsorcerer`

  `#7281 <https://github.com/aio-libs/aiohttp/issues/7281>`_



Misc
----

- Made ``print`` argument in ``run_app()`` optional.

  `#3690 <https://github.com/aio-libs/aiohttp/issues/3690>`_

- Improved performance of ``ceil_timeout`` in some cases.

  `#6316 <https://github.com/aio-libs/aiohttp/issues/6316>`_

- Changed importing Gunicorn to happen on-demand, decreasing import time by ~53%. -- :user:`Dreamsorcerer`

  `#6591 <https://github.com/aio-libs/aiohttp/issues/6591>`_

- Improved import time by replacing ``http.server`` with ``http.HTTPStatus``.

  `#6903 <https://github.com/aio-libs/aiohttp/issues/6903>`_

- Fixed annotation of ``ssl`` parameter to disallow ``True``. -- by :user:`Dreamsorcerer`.

  `#7335 <https://github.com/aio-libs/aiohttp/issues/7335>`_


----


3.8.6 (2023-10-07)
==================

Security bugfixes
-----------------

- Upgraded the vendored copy of llhttp_ to v9.1.3 -- by :user:`Dreamsorcerer`

  Thanks to :user:`kenballus` for reporting this, see
  https://github.com/aio-libs/aiohttp/security/advisories/GHSA-pjjw-qhg8-p2p9.

  .. _llhttp: https://llhttp.org

  `#7647 <https://github.com/aio-libs/aiohttp/issues/7647>`_

- Updated Python parser to comply with RFCs 9110/9112 -- by :user:`Dreamorcerer`

  Thanks to :user:`kenballus` for reporting this, see
  https://github.com/aio-libs/aiohttp/security/advisories/GHSA-gfw2-4jvh-wgfg.

  `#7663 <https://github.com/aio-libs/aiohttp/issues/7663>`_


Deprecation
-----------

- Added ``fallback_charset_resolver`` parameter in ``ClientSession`` to allow a user-supplied
  character set detection function.

  Character set detection will no longer be included in 3.9 as a default. If this feature is needed,
  please use `fallback_charset_resolver <https://docs.aiohttp.org/en/stable/client_advanced.html#character-set-detection>`_.

  `#7561 <https://github.com/aio-libs/aiohttp/issues/7561>`_


Features
--------

- Enabled lenient response parsing for more flexible parsing in the client
  (this should resolve some regressions when dealing with badly formatted HTTP responses). -- by :user:`Dreamsorcerer`

  `#7490 <https://github.com/aio-libs/aiohttp/issues/7490>`_



Bugfixes
--------

- Fixed ``PermissionError`` when ``.netrc`` is unreadable due to permissions.

  `#7237 <https://github.com/aio-libs/aiohttp/issues/7237>`_

- Fixed output of parsing errors pointing to a ``\n``. -- by :user:`Dreamsorcerer`

  `#7468 <https://github.com/aio-libs/aiohttp/issues/7468>`_

- Fixed ``GunicornWebWorker`` max_requests_jitter not working.

  `#7518 <https://github.com/aio-libs/aiohttp/issues/7518>`_

- Fixed sorting in ``filter_cookies`` to use cookie with longest path. -- by :user:`marq24`.

  `#7577 <https://github.com/aio-libs/aiohttp/issues/7577>`_

- Fixed display of ``BadStatusLine`` messages from llhttp_. -- by :user:`Dreamsorcerer`

  `#7651 <https://github.com/aio-libs/aiohttp/issues/7651>`_


----


3.8.5 (2023-07-19)
==================

Security bugfixes
-----------------

- Upgraded the vendored copy of llhttp_ to v8.1.1 -- by :user:`webknjaz`
  and :user:`Dreamsorcerer`.

  Thanks to :user:`sethmlarson` for reporting this and providing us with
  comprehensive reproducer, workarounds and fixing details! For more
  information, see
  https://github.com/aio-libs/aiohttp/security/advisories/GHSA-45c4-8wx5-qw6w.

  .. _llhttp: https://llhttp.org

  `#7346 <https://github.com/aio-libs/aiohttp/issues/7346>`_


Features
--------

- Added information to C parser exceptions to show which character caused the error. -- by :user:`Dreamsorcerer`

  `#7366 <https://github.com/aio-libs/aiohttp/issues/7366>`_


Bugfixes
--------

- Fixed a transport is :data:`None` error -- by :user:`Dreamsorcerer`.

  `#3355 <https://github.com/aio-libs/aiohttp/issues/3355>`_


----


3.8.4 (2023-02-12)
==================

Bugfixes
--------

- Fixed incorrectly overwriting cookies with the same name and domain, but different path.
  `#6638 <https://github.com/aio-libs/aiohttp/issues/6638>`_
- Fixed ``ConnectionResetError`` not being raised after client disconnection in SSL environments.
  `#7180 <https://github.com/aio-libs/aiohttp/issues/7180>`_


----


3.8.3 (2022-09-21)
==================

.. attention::

   This is the last :doc:`aiohttp <index>` release tested under
   Python 3.6. The 3.9 stream is dropping it from the CI and the
   distribution package metadata.

Bugfixes
--------

- Increased the upper boundary of the :doc:`multidict:index` dependency
  to allow for the version 6 -- by :user:`hugovk`.

  It used to be limited below version 7 in :doc:`aiohttp <index>` v3.8.1 but
  was lowered in v3.8.2 via :pr:`6550` and never brought back, causing
  problems with dependency pins when upgrading. :doc:`aiohttp <index>` v3.8.3
  fixes that by recovering the original boundary of ``< 7``.
  `#6950 <https://github.com/aio-libs/aiohttp/issues/6950>`_


----


3.8.2 (2022-09-20, subsequently yanked on 2022-09-21)
=====================================================

Bugfixes
--------

- Support registering OPTIONS HTTP method handlers via RouteTableDef.
  `#4663 <https://github.com/aio-libs/aiohttp/issues/4663>`_
- Started supporting ``authority-form`` and ``absolute-form`` URLs on the server-side.
  `#6227 <https://github.com/aio-libs/aiohttp/issues/6227>`_
- Fix Python 3.11 alpha incompatibilities by using Cython 0.29.25
  `#6396 <https://github.com/aio-libs/aiohttp/issues/6396>`_
- Remove a deprecated usage of pytest.warns(None)
  `#6663 <https://github.com
Download .txt
gitextract_ex8k9ysz/

├── .cherry_picker.toml
├── .codecov.yml
├── .coveragerc.toml
├── .editorconfig
├── .git-blame-ignore-revs
├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   └── feature_request.yml
│   ├── ISSUE_TEMPLATE.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── codeql.yml
│   ├── config.yml
│   ├── dependabot.yml
│   ├── lock.yml
│   └── workflows/
│       ├── auto-merge.yml
│       ├── ci-cd.yml
│       ├── codeql.yml
│       ├── label-remove.yml
│       ├── labels.yml
│       └── stale.yml
├── .gitignore
├── .gitmodules
├── .lgtm.yml
├── .mypy.ini
├── .pip-tools.toml
├── .pre-commit-config.yaml
├── .readthedocs.yml
├── CHANGES/
│   ├── .TEMPLATE.rst
│   ├── .gitignore
│   ├── 10468.doc.rst
│   ├── 10596.bugfix.rst
│   ├── 10611.bugfix.rst
│   ├── 10665.feature.rst
│   ├── 10683.bugfix.rst
│   ├── 10753.bugfix.rst
│   ├── 10795.doc.rst
│   ├── 11012.breaking.rst
│   ├── 11268.feature.rst
│   ├── 11283.bugfix.rst
│   ├── 11601.breaking.rst
│   ├── 11681.feature.rst
│   ├── 11737.contrib.rst
│   ├── 11763.feature.rst
│   ├── 11766.feature.rst
│   ├── 11776.misc.rst
│   ├── 11826.contrib.rst
│   ├── 11859.bugfix.rst
│   ├── 11876.misc.rst
│   ├── 11898.bugfix.rst
│   ├── 11937.misc.rst
│   ├── 11955.feature.rst
│   ├── 11972.bugfix.rst
│   ├── 11989.feature.rst
│   ├── 11992.contrib.rst
│   ├── 12027.misc.rst
│   ├── 12030.bugfix.rst
│   ├── 12042.doc.rst
│   ├── 12069.packaging.rst
│   ├── 12088.bugfix.rst
│   ├── 12091.bugfix.rst
│   ├── 12096.bugfix.rst
│   ├── 12097.bugfix.rst
│   ├── 12106.feature.rst
│   ├── 12136.bugfix.rst
│   ├── 12170.misc.rst
│   ├── 12173.contrib.rst
│   ├── 12195.bugfix.rst
│   ├── 12231.bugfix.rst
│   ├── 12240.bugfix.rst
│   ├── 12249.bugfix.rst
│   ├── 2174.bugfix
│   ├── 2835.breaking.rst
│   ├── 2977.breaking.rst
│   ├── 3310.bugfix
│   ├── 3462.feature
│   ├── 3463.breaking.rst
│   ├── 3482.bugfix
│   ├── 3538.breaking.rst
│   ├── 3539.breaking.rst
│   ├── 3540.feature
│   ├── 3542.breaking.rst
│   ├── 3545.feature
│   ├── 3547.breaking.rst
│   ├── 3548.breaking.rst
│   ├── 3559.doc
│   ├── 3562.bugfix
│   ├── 3569.feature
│   ├── 3580.breaking.rst
│   ├── 3612.bugfix
│   ├── 3613.bugfix
│   ├── 3642.doc
│   ├── 3685.doc
│   ├── 3721.bugfix
│   ├── 3767.feature
│   ├── 3787.feature
│   ├── 3796.feature
│   ├── 3890.breaking.rst
│   ├── 3901.breaking.rst
│   ├── 3929.breaking.rst
│   ├── 3931.breaking.rst
│   ├── 3932.breaking.rst
│   ├── 3933.breaking.rst
│   ├── 3934.breaking.rst
│   ├── 3935.breaking.rst
│   ├── 3939.breaking.rst
│   ├── 3940.breaking.rst
│   ├── 3942.breaking.rst
│   ├── 3948.breaking.rst
│   ├── 3994.misc
│   ├── 4161.doc
│   ├── 4277.feature
│   ├── 4283.bugfix
│   ├── 4299.bugfix
│   ├── 4302.bugfix
│   ├── 4368.bugfix
│   ├── 4452.doc
│   ├── 4504.doc
│   ├── 4526.bugfix
│   ├── 4558.bugfix
│   ├── 4656.bugfix
│   ├── 4695.doc
│   ├── 4706.feature
│   ├── 5075.feature
│   ├── 5191.doc
│   ├── 5258.bugfix
│   ├── 5278.breaking.rst
│   ├── 5284.breaking.rst
│   ├── 5284.feature
│   ├── 5287.feature
│   ├── 5516.misc
│   ├── 5533.misc
│   ├── 5558.bugfix
│   ├── 5634.feature
│   ├── 5783.feature
│   ├── 5806.misc
│   ├── 5829.misc
│   ├── 5870.misc
│   ├── 5894.bugfix
│   ├── 6180.bugfix
│   ├── 6181.bugfix
│   ├── 6193.feature
│   ├── 6547.bugfix
│   ├── 6721.misc
│   ├── 6979.doc
│   ├── 6998.doc
│   ├── 7107.breaking.rst
│   ├── 7265.breaking.rst
│   ├── 7319.feature.rst
│   ├── 7677.bugfix
│   ├── 7772.bugfix
│   ├── 7815.bugfix
│   ├── 8048.breaking.rst
│   ├── 8139.contrib.rst
│   ├── 8197.doc
│   ├── 8303.breaking.rst
│   ├── 8596.breaking.rst
│   ├── 8698.breaking.rst
│   ├── 8957.breaking.rst
│   ├── 9109.breaking.rst
│   ├── 9212.packaging.rst
│   ├── 9254.breaking.rst
│   ├── 9292.breaking.rst
│   ├── 9413.misc.rst
│   └── README.rst
├── CHANGES.rst
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.rst
├── CONTRIBUTORS.txt
├── LICENSE.txt
├── MANIFEST.in
├── Makefile
├── README.rst
├── aiohttp/
│   ├── __init__.py
│   ├── _cookie_helpers.py
│   ├── _cparser.pxd
│   ├── _find_header.h
│   ├── _find_header.pxd
│   ├── _http_parser.pyx
│   ├── _http_writer.pyx
│   ├── _websocket/
│   │   ├── __init__.py
│   │   ├── helpers.py
│   │   ├── mask.pxd
│   │   ├── mask.pyx
│   │   ├── models.py
│   │   ├── reader.py
│   │   ├── reader_c.pxd
│   │   ├── reader_py.py
│   │   └── writer.py
│   ├── abc.py
│   ├── base_protocol.py
│   ├── client.py
│   ├── client_exceptions.py
│   ├── client_middleware_digest_auth.py
│   ├── client_middlewares.py
│   ├── client_proto.py
│   ├── client_reqrep.py
│   ├── client_ws.py
│   ├── compression_utils.py
│   ├── connector.py
│   ├── cookiejar.py
│   ├── formdata.py
│   ├── hdrs.py
│   ├── helpers.py
│   ├── http.py
│   ├── http_exceptions.py
│   ├── http_parser.py
│   ├── http_websocket.py
│   ├── http_writer.py
│   ├── log.py
│   ├── multipart.py
│   ├── payload.py
│   ├── py.typed
│   ├── pytest_plugin.py
│   ├── resolver.py
│   ├── streams.py
│   ├── tcp_helpers.py
│   ├── test_utils.py
│   ├── tracing.py
│   ├── typedefs.py
│   ├── web.py
│   ├── web_app.py
│   ├── web_exceptions.py
│   ├── web_fileresponse.py
│   ├── web_log.py
│   ├── web_middlewares.py
│   ├── web_protocol.py
│   ├── web_request.py
│   ├── web_response.py
│   ├── web_routedef.py
│   ├── web_runner.py
│   ├── web_server.py
│   ├── web_urldispatcher.py
│   ├── web_ws.py
│   └── worker.py
├── docs/
│   ├── Makefile
│   ├── _static/
│   │   └── css/
│   │       └── logo-adjustments.css
│   ├── abc.rst
│   ├── built_with.rst
│   ├── changes.rst
│   ├── client.rst
│   ├── client_advanced.rst
│   ├── client_middleware_cookbook.rst
│   ├── client_quickstart.rst
│   ├── client_reference.rst
│   ├── code/
│   │   └── client_middleware_cookbook.py
│   ├── conf.py
│   ├── contributing-admins.rst
│   ├── contributing.rst
│   ├── deployment.rst
│   ├── essays.rst
│   ├── external.rst
│   ├── faq.rst
│   ├── glossary.rst
│   ├── http_request_lifecycle.rst
│   ├── index.rst
│   ├── logging.rst
│   ├── make.bat
│   ├── migration_to_2xx.rst
│   ├── misc.rst
│   ├── multipart.rst
│   ├── multipart_reference.rst
│   ├── new_router.rst
│   ├── powered_by.rst
│   ├── spelling_wordlist.txt
│   ├── streams.rst
│   ├── structures.rst
│   ├── testing.rst
│   ├── third_party.rst
│   ├── tracing_reference.rst
│   ├── utilities.rst
│   ├── web.rst
│   ├── web_advanced.rst
│   ├── web_exceptions.rst
│   ├── web_lowlevel.rst
│   ├── web_quickstart.rst
│   ├── web_reference.rst
│   ├── websocket_utilities.rst
│   ├── whats_new_1_1.rst
│   └── whats_new_3_0.rst
├── examples/
│   ├── background_tasks.py
│   ├── basic_auth_middleware.py
│   ├── cli_app.py
│   ├── client_auth.py
│   ├── client_json.py
│   ├── client_ws.py
│   ├── combined_middleware.py
│   ├── curl.py
│   ├── digest_auth_qop_auth.py
│   ├── fake_server.py
│   ├── logging_middleware.py
│   ├── lowlevel_srv.py
│   ├── retry_middleware.py
│   ├── server.crt
│   ├── server.csr
│   ├── server.key
│   ├── server_simple.py
│   ├── static_files.py
│   ├── token_refresh_middleware.py
│   ├── web_classview.py
│   ├── web_cookies.py
│   ├── web_rewrite_headers_middleware.py
│   ├── web_srv.py
│   ├── web_srv_route_deco.py
│   ├── web_srv_route_table.py
│   ├── web_ws.py
│   └── websocket.html
├── pyproject.toml
├── requirements/
│   ├── base-ft.in
│   ├── base-ft.txt
│   ├── base.in
│   ├── base.txt
│   ├── constraints.in
│   ├── constraints.txt
│   ├── cython.in
│   ├── cython.txt
│   ├── dev.in
│   ├── dev.txt
│   ├── doc-spelling.in
│   ├── doc-spelling.txt
│   ├── doc.in
│   ├── doc.txt
│   ├── lint.in
│   ├── lint.txt
│   ├── multidict.in
│   ├── multidict.txt
│   ├── runtime-deps.in
│   ├── runtime-deps.txt
│   ├── sync-direct-runtime-deps.py
│   ├── test-common.in
│   ├── test-common.txt
│   ├── test-ft.in
│   ├── test-ft.txt
│   ├── test.in
│   └── test.txt
├── setup.cfg
├── setup.py
├── tests/
│   ├── autobahn/
│   │   ├── Dockerfile.aiohttp
│   │   ├── Dockerfile.autobahn
│   │   ├── client/
│   │   │   ├── client.py
│   │   │   └── fuzzingserver.json
│   │   ├── server/
│   │   │   ├── fuzzingclient.json
│   │   │   └── server.py
│   │   └── test_autobahn.py
│   ├── conftest.py
│   ├── data.unknown_mime_type
│   ├── data.zero_bytes
│   ├── github-urls.json
│   ├── isolated/
│   │   ├── check_for_client_response_leak.py
│   │   └── check_for_request_leak.py
│   ├── sample.txt
│   ├── test_base_protocol.py
│   ├── test_benchmarks_client.py
│   ├── test_benchmarks_client_request.py
│   ├── test_benchmarks_client_ws.py
│   ├── test_benchmarks_cookiejar.py
│   ├── test_benchmarks_http_websocket.py
│   ├── test_benchmarks_http_writer.py
│   ├── test_benchmarks_web_fileresponse.py
│   ├── test_benchmarks_web_middleware.py
│   ├── test_benchmarks_web_response.py
│   ├── test_benchmarks_web_urldispatcher.py
│   ├── test_circular_imports.py
│   ├── test_classbasedview.py
│   ├── test_client_connection.py
│   ├── test_client_exceptions.py
│   ├── test_client_fingerprint.py
│   ├── test_client_functional.py
│   ├── test_client_middleware.py
│   ├── test_client_middleware_digest_auth.py
│   ├── test_client_proto.py
│   ├── test_client_request.py
│   ├── test_client_response.py
│   ├── test_client_session.py
│   ├── test_client_ws.py
│   ├── test_client_ws_functional.py
│   ├── test_compression_utils.py
│   ├── test_connector.py
│   ├── test_cookie_helpers.py
│   ├── test_cookiejar.py
│   ├── test_flowcontrol_streams.py
│   ├── test_formdata.py
│   ├── test_helpers.py
│   ├── test_http_exceptions.py
│   ├── test_http_parser.py
│   ├── test_http_writer.py
│   ├── test_imports.py
│   ├── test_leaks.py
│   ├── test_loop.py
│   ├── test_multipart.py
│   ├── test_multipart_helpers.py
│   ├── test_payload.py
│   ├── test_proxy.py
│   ├── test_proxy_functional.py
│   ├── test_pytest_plugin.py
│   ├── test_resolver.py
│   ├── test_route_def.py
│   ├── test_run_app.py
│   ├── test_streams.py
│   ├── test_tcp_helpers.py
│   ├── test_test_utils.py
│   ├── test_tracing.py
│   ├── test_urldispatch.py
│   ├── test_web_app.py
│   ├── test_web_cli.py
│   ├── test_web_exceptions.py
│   ├── test_web_functional.py
│   ├── test_web_log.py
│   ├── test_web_middleware.py
│   ├── test_web_protocol.py
│   ├── test_web_request.py
│   ├── test_web_request_handler.py
│   ├── test_web_response.py
│   ├── test_web_runner.py
│   ├── test_web_sendfile.py
│   ├── test_web_sendfile_functional.py
│   ├── test_web_server.py
│   ├── test_web_urldispatcher.py
│   ├── test_web_websocket.py
│   ├── test_web_websocket_functional.py
│   ├── test_websocket_data_queue.py
│   ├── test_websocket_handshake.py
│   ├── test_websocket_parser.py
│   ├── test_websocket_writer.py
│   └── test_worker.py
├── tools/
│   ├── bench-asyncio-write.py
│   ├── check_changes.py
│   ├── check_sum.py
│   ├── cleanup_changes.py
│   ├── drop_merged_branches.sh
│   ├── gen.py
│   └── testing/
│       ├── Dockerfile
│       ├── Dockerfile.dockerignore
│       └── entrypoint.sh
└── vendor/
    └── README.rst
Download .txt
Showing preview only (519K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (5344 symbols across 155 files)

FILE: aiohttp/__init__.py
  function __dir__ (line 240) | def __dir__() -> tuple[str, ...]:
  function __getattr__ (line 244) | def __getattr__(name: str) -> object:

FILE: aiohttp/_cookie_helpers.py
  function preserve_morsel_with_coded_value (line 85) | def preserve_morsel_with_coded_value(cookie: Morsel[str]) -> Morsel[str]:
  function _unquote_replace (line 118) | def _unquote_replace(m: re.Match[str]) -> str:
  function _unquote (line 131) | def _unquote(value: str) -> str:
  function parse_cookie_header (line 160) | def parse_cookie_header(header: str) -> list[tuple[str, Morsel[str]]]:
  function parse_set_cookie_headers (line 248) | def parse_set_cookie_headers(headers: Sequence[str]) -> list[tuple[str, ...

FILE: aiohttp/_websocket/helpers.py
  function _xor_table (line 27) | def _xor_table() -> list[bytes]:
  function _websocket_mask_python (line 31) | def _websocket_mask_python(mask: bytes, data: bytearray) -> None:
  function ws_ext_parse (line 78) | def ws_ext_parse(extstr: str | None, isserver: bool = False) -> tuple[in...
  function ws_ext_gen (line 129) | def ws_ext_gen(

FILE: aiohttp/_websocket/models.py
  class WSCloseCode (line 11) | class WSCloseCode(IntEnum):
  class WSMsgType (line 27) | class WSMsgType(IntEnum):
  class WSMessageContinuation (line 42) | class WSMessageContinuation(NamedTuple):
  class WSMessageText (line 49) | class WSMessageText(NamedTuple):
    method json (line 55) | def json(
  class WSMessageTextBytes (line 62) | class WSMessageTextBytes(NamedTuple):
    method json (line 70) | def json(self, *, loads: Callable[[bytes], Any] = json.loads) -> Any:
  class WSMessageBinary (line 75) | class WSMessageBinary(NamedTuple):
    method json (line 81) | def json(
  class WSMessagePing (line 88) | class WSMessagePing(NamedTuple):
  class WSMessagePong (line 95) | class WSMessagePong(NamedTuple):
  class WSMessageClose (line 102) | class WSMessageClose(NamedTuple):
  class WSMessageClosing (line 109) | class WSMessageClosing(NamedTuple):
  class WSMessageClosed (line 116) | class WSMessageClosed(NamedTuple):
  class WSMessageError (line 123) | class WSMessageError(NamedTuple):
  class WebSocketError (line 155) | class WebSocketError(Exception):
    method __init__ (line 158) | def __init__(self, code: int, message: str) -> None:
    method __str__ (line 162) | def __str__(self) -> str:
  class WSHandshakeError (line 166) | class WSHandshakeError(Exception):

FILE: aiohttp/_websocket/reader_py.py
  class WebSocketDataQueue (line 60) | class WebSocketDataQueue:
    method __init__ (line 66) | def __init__(
    method is_eof (line 80) | def is_eof(self) -> bool:
    method exception (line 83) | def exception(self) -> type[BaseException] | BaseException | None:
    method set_exception (line 86) | def set_exception(
    method _release_waiter (line 97) | def _release_waiter(self) -> None:
    method feed_eof (line 104) | def feed_eof(self) -> None:
    method feed_data (line 109) | def feed_data(self, data: "WSMessage") -> None:
    method read (line 117) | async def read(self) -> WSMessage:
    method _read_from_buffer (line 128) | def _read_from_buffer(self) -> WSMessage:
  class WebSocketReader (line 141) | class WebSocketReader:
    method __init__ (line 142) | def __init__(
    method feed_eof (line 172) | def feed_eof(self) -> None:
    method feed_data (line 178) | def feed_data(self, data: bytes | bytearray | memoryview) -> tuple[boo...
    method _handle_frame (line 194) | def _handle_frame(
    method _feed_data (line 345) | def _feed_data(self, data: bytes) -> None:

FILE: aiohttp/_websocket/writer.py
  class WebSocketWriter (line 40) | class WebSocketWriter:
    method __init__ (line 49) | def __init__(
    method send_frame (line 74) | async def send_frame(
    method _write_websocket_frame (line 124) | def _write_websocket_frame(self, message: bytes, opcode: int, rsv: int...
    method _get_compressor (line 174) | def _get_compressor(self, compress: int | None) -> ZLibCompressor:
    method _send_compressed_frame_sync (line 191) | def _send_compressed_frame_sync(
    method _send_compressed_frame_async_locked (line 219) | async def _send_compressed_frame_async_locked(
    method close (line 253) | async def close(self, code: int = 1000, message: bytes | str = b"") ->...

FILE: aiohttp/abc.py
  class AbstractRouter (line 24) | class AbstractRouter(ABC):
    method __init__ (line 25) | def __init__(self) -> None:
    method post_init (line 28) | def post_init(self, app: Application) -> None:
    method frozen (line 37) | def frozen(self) -> bool:
    method freeze (line 40) | def freeze(self) -> None:
    method resolve (line 45) | async def resolve(self, request: Request) -> "AbstractMatchInfo":
  class AbstractMatchInfo (line 49) | class AbstractMatchInfo(ABC):
    method handler (line 55) | def handler(self) -> Callable[[Request], Awaitable[StreamResponse]]:
    method expect_handler (line 60) | def expect_handler(
    method http_exception (line 67) | def http_exception(self) -> HTTPException | None:
    method get_info (line 71) | def get_info(self) -> dict[str, Any]:
    method apps (line 76) | def apps(self) -> tuple[Application, ...]:
    method add_app (line 84) | def add_app(self, app: Application) -> None:
    method freeze (line 88) | def freeze(self) -> None:
  class AbstractView (line 98) | class AbstractView(ABC):
    method __init__ (line 101) | def __init__(self, request: Request) -> None:
    method request (line 105) | def request(self) -> Request:
    method __await__ (line 110) | def __await__(self) -> Generator[None, None, StreamResponse]:
  class ResolveResult (line 114) | class ResolveResult(TypedDict):
  class AbstractResolver (line 136) | class AbstractResolver(ABC):
    method resolve (line 140) | async def resolve(
    method close (line 146) | async def close(self) -> None:
  class AbstractCookieJar (line 153) | class AbstractCookieJar(Sized, Iterable[Morsel[str]]):
    method quote_cookie (line 158) | def quote_cookie(self) -> bool:
    method clear (line 162) | def clear(self, predicate: ClearCookiePredicate | None = None) -> None:
    method clear_domain (line 166) | def clear_domain(self, domain: str) -> None:
    method update_cookies (line 170) | def update_cookies(self, cookies: LooseCookies, response_url: URL = UR...
    method update_cookies_from_headers (line 173) | def update_cookies_from_headers(
    method filter_cookies (line 181) | def filter_cookies(self, request_url: URL) -> BaseCookie[str]:
  class AbstractStreamWriter (line 185) | class AbstractStreamWriter(ABC):
    method write (line 193) | async def write(
    method write_eof (line 199) | async def write_eof(self, chunk: bytes = b"") -> None:
    method drain (line 203) | async def drain(self) -> None:
    method enable_compression (line 207) | def enable_compression(
    method enable_chunking (line 213) | def enable_chunking(self) -> None:
    method write_headers (line 217) | async def write_headers(self, status_line: str, headers: CIMultiDict[s...
    method send_headers (line 220) | def send_headers(self) -> None:
  class AbstractAccessLogger (line 228) | class AbstractAccessLogger(ABC):
    method __init__ (line 233) | def __init__(self, logger: logging.Logger, log_format: str) -> None:
    method log (line 238) | def log(self, request: BaseRequest, response: StreamResponse, time: fl...
    method enabled (line 242) | def enabled(self) -> bool:
  class AbstractAsyncAccessLogger (line 247) | class AbstractAsyncAccessLogger(ABC):
    method log (line 253) | async def log(
    method enabled (line 259) | def enabled(self) -> bool:

FILE: aiohttp/base_protocol.py
  class BaseProtocol (line 9) | class BaseProtocol(asyncio.Protocol):
    method __init__ (line 19) | def __init__(self, loop: asyncio.AbstractEventLoop) -> None:
    method connected (line 28) | def connected(self) -> bool:
    method writing_paused (line 33) | def writing_paused(self) -> bool:
    method pause_writing (line 36) | def pause_writing(self) -> None:
    method resume_writing (line 40) | def resume_writing(self) -> None:
    method pause_reading (line 50) | def pause_reading(self) -> None:
    method resume_reading (line 58) | def resume_reading(self) -> None:
    method connection_made (line 66) | def connection_made(self, transport: asyncio.BaseTransport) -> None:
    method connection_lost (line 71) | def connection_lost(self, exc: BaseException | None) -> None:
    method _drain_helper (line 91) | async def _drain_helper(self) -> None:

FILE: aiohttp/client.py
  class _RequestOptions (line 176) | class _RequestOptions(TypedDict, total=False):
  class _WSConnectOptions (line 206) | class _WSConnectOptions(TypedDict, total=False):
  class ClientTimeout (line 228) | class ClientTimeout:
    method __post_init__ (line 248) | def __post_init__(self) -> None:
  class ClientSession (line 272) | class ClientSession:
    method __init__ (line 309) | def __init__(
    method __init_subclass__ (line 436) | def __init_subclass__(cls: type["ClientSession"]) -> None:
    method __del__ (line 441) | def __del__(self, _warnings: Any = warnings) -> None:
    method request (line 455) | def request(
    method request (line 464) | def request(
    method _build_url (line 470) | def _build_url(self, str_or_url: StrOrURL) -> URL:
    method _request (line 476) | async def _request(
    method ws_connect (line 948) | def ws_connect(
    method ws_connect (line 957) | def ws_connect(
    method ws_connect (line 966) | def ws_connect(
    method ws_connect (line 974) | def ws_connect(
    method _ws_connect (line 1027) | async def _ws_connect(
    method _ws_connect (line 1036) | async def _ws_connect(
    method _ws_connect (line 1045) | async def _ws_connect(
    method _ws_connect (line 1053) | async def _ws_connect(
    method _prepare_headers (line 1267) | def _prepare_headers(self, headers: LooseHeaders | None) -> "CIMultiDi...
    method _get_netrc_auth (line 1283) | def _get_netrc_auth(self, host: str) -> BasicAuth | None:
    method get (line 1298) | def get(
    method options (line 1304) | def options(
    method head (line 1310) | def head(
    method post (line 1316) | def post(
    method put (line 1322) | def put(
    method patch (line 1328) | def patch(
    method delete (line 1334) | def delete(
    method get (line 1342) | def get(
    method options (line 1352) | def options(
    method head (line 1362) | def head(
    method post (line 1372) | def post(
    method put (line 1380) | def put(
    method patch (line 1388) | def patch(
    method delete (line 1396) | def delete(self, url: StrOrURL, **kwargs: Any) -> "_RequestContextMana...
    method close (line 1402) | async def close(self) -> None:
    method closed (line 1413) | def closed(self) -> bool:
    method connector (line 1421) | def connector(self) -> BaseConnector | None:
    method cookie_jar (line 1426) | def cookie_jar(self) -> AbstractCookieJar:
    method version (line 1431) | def version(self) -> tuple[int, int]:
    method requote_redirect_url (line 1436) | def requote_redirect_url(self) -> bool:
    method timeout (line 1441) | def timeout(self) -> ClientTimeout:
    method headers (line 1446) | def headers(self) -> "CIMultiDict[str]":
    method skip_auto_headers (line 1451) | def skip_auto_headers(self) -> frozenset[istr]:
    method auth (line 1456) | def auth(self) -> BasicAuth | None:
    method json_serialize (line 1461) | def json_serialize(self) -> JSONEncoder:
    method connector_owner (line 1466) | def connector_owner(self) -> bool:
    method raise_for_status (line 1471) | def raise_for_status(
    method auto_decompress (line 1478) | def auto_decompress(self) -> bool:
    method trust_env (line 1483) | def trust_env(self) -> bool:
    method trace_configs (line 1493) | def trace_configs(self) -> list[TraceConfig[Any]]:
    method detach (line 1497) | def detach(self) -> None:
    method __aenter__ (line 1504) | async def __aenter__(self) -> "ClientSession":
    method __aexit__ (line 1507) | async def __aexit__(
  class _BaseRequestContextManager (line 1516) | class _BaseRequestContextManager(
    method __init__ (line 1521) | def __init__(self, coro: Coroutine[asyncio.Future[Any], None, _RetType...
    method send (line 1524) | def send(self, arg: None) -> asyncio.Future[Any]:
    method throw (line 1527) | def throw(self, *args: Any, **kwargs: Any) -> asyncio.Future[Any]:
    method close (line 1530) | def close(self) -> None:
    method __await__ (line 1533) | def __await__(self) -> Generator[Any, None, _RetType_co]:
    method __iter__ (line 1537) | def __iter__(self) -> Generator[Any, None, _RetType_co]:
    method __aenter__ (line 1540) | async def __aenter__(self) -> _RetType_co:
    method __aexit__ (line 1544) | async def __aexit__(
  class _SessionRequestContextManager (line 1557) | class _SessionRequestContextManager:
    method __init__ (line 1560) | def __init__(
    method __aenter__ (line 1569) | async def __aenter__(self) -> ClientResponse:
    method __aexit__ (line 1578) | async def __aexit__(
  function request (line 1591) | def request(
  function request (line 1602) | def request(

FILE: aiohttp/client_exceptions.py
  class ClientError (line 55) | class ClientError(Exception):
  class ClientResponseError (line 59) | class ClientResponseError(ClientError):
    method __init__ (line 69) | def __init__(
    method __str__ (line 88) | def __str__(self) -> str:
    method __repr__ (line 91) | def __repr__(self) -> str:
  class ContentTypeError (line 102) | class ContentTypeError(ClientResponseError):
  class WSServerHandshakeError (line 106) | class WSServerHandshakeError(ClientResponseError):
  class ClientHttpProxyError (line 110) | class ClientHttpProxyError(ClientResponseError):
  class TooManyRedirects (line 119) | class TooManyRedirects(ClientResponseError):
  class ClientConnectionError (line 123) | class ClientConnectionError(ClientError):
  class ClientConnectionResetError (line 127) | class ClientConnectionResetError(ClientConnectionError, ConnectionResetE...
  class ClientOSError (line 131) | class ClientOSError(ClientConnectionError, OSError):
  class ClientConnectorError (line 135) | class ClientConnectorError(ClientOSError):
    method __init__ (line 142) | def __init__(self, connection_key: ConnectionKey, os_error: OSError) -...
    method os_error (line 149) | def os_error(self) -> OSError:
    method host (line 153) | def host(self) -> str:
    method port (line 157) | def port(self) -> int | None:
    method ssl (line 161) | def ssl(self) -> Union[SSLContext, bool, "Fingerprint"]:
    method __str__ (line 164) | def __str__(self) -> str:
  class ClientConnectorDNSError (line 173) | class ClientConnectorDNSError(ClientConnectorError):
  class ClientProxyConnectionError (line 181) | class ClientProxyConnectionError(ClientConnectorError):
  class UnixClientConnectorError (line 189) | class UnixClientConnectorError(ClientConnectorError):
    method __init__ (line 196) | def __init__(
    method path (line 203) | def path(self) -> str:
    method __str__ (line 206) | def __str__(self) -> str:
  class ServerConnectionError (line 212) | class ServerConnectionError(ClientConnectionError):
  class ServerDisconnectedError (line 216) | class ServerDisconnectedError(ServerConnectionError):
    method __init__ (line 219) | def __init__(self, message: RawResponseMessage | str | None = None) ->...
  class ServerTimeoutError (line 227) | class ServerTimeoutError(ServerConnectionError, asyncio.TimeoutError):
  class ConnectionTimeoutError (line 231) | class ConnectionTimeoutError(ServerTimeoutError):
  class SocketTimeoutError (line 235) | class SocketTimeoutError(ServerTimeoutError):
  class ServerFingerprintMismatch (line 239) | class ServerFingerprintMismatch(ServerConnectionError):
    method __init__ (line 242) | def __init__(self, expected: bytes, got: bytes, host: str, port: int) ...
    method __repr__ (line 249) | def __repr__(self) -> str:
  class ClientPayloadError (line 253) | class ClientPayloadError(ClientError):
  class InvalidURL (line 257) | class InvalidURL(ClientError, ValueError):
    method __init__ (line 266) | def __init__(self, url: StrOrURL, description: str | None = None) -> N...
    method url (line 278) | def url(self) -> StrOrURL:
    method description (line 282) | def description(self) -> "str | None":
    method __repr__ (line 285) | def __repr__(self) -> str:
    method __str__ (line 288) | def __str__(self) -> str:
  class InvalidUrlClientError (line 294) | class InvalidUrlClientError(InvalidURL):
  class RedirectClientError (line 298) | class RedirectClientError(ClientError):
  class NonHttpUrlClientError (line 302) | class NonHttpUrlClientError(ClientError):
  class InvalidUrlRedirectClientError (line 306) | class InvalidUrlRedirectClientError(InvalidUrlClientError, RedirectClien...
  class NonHttpUrlRedirectClientError (line 310) | class NonHttpUrlRedirectClientError(NonHttpUrlClientError, RedirectClien...
  class ClientSSLError (line 314) | class ClientSSLError(ClientConnectorError):
  class ClientConnectorSSLError (line 338) | class ClientConnectorSSLError(*ssl_error_bases):  # type: ignore[misc]
  class ClientConnectorCertificateError (line 342) | class ClientConnectorCertificateError(*cert_errors_bases):  # type: igno...
    method __init__ (line 347) | def __init__(
    method certificate_error (line 364) | def certificate_error(self) -> Exception:
    method host (line 368) | def host(self) -> str:
    method port (line 372) | def port(self) -> int | None:
    method ssl (line 376) | def ssl(self) -> bool:
    method __str__ (line 379) | def __str__(self) -> str:
  class WSMessageTypeError (line 387) | class WSMessageTypeError(TypeError):

FILE: aiohttp/client_middleware_digest_auth.py
  class DigestAuthChallenge (line 27) | class DigestAuthChallenge(TypedDict, total=False):
  function escape_quotes (line 108) | def escape_quotes(value: str) -> str:
  function unescape_quotes (line 113) | def unescape_quotes(value: str) -> str:
  function parse_header_pairs (line 118) | def parse_header_pairs(header: str) -> dict[str, str]:
  class DigestAuthMiddleware (line 145) | class DigestAuthMiddleware:
    method __init__ (line 176) | def __init__(
    method _encode (line 202) | async def _encode(self, method: str, url: URL, body: Payload | Literal...
    method _in_protection_space (line 363) | def _in_protection_space(self, url: URL) -> bool:
    method _authenticate (line 383) | def _authenticate(self, response: ClientResponse) -> bool:
    method __call__ (line 442) | async def __call__(

FILE: aiohttp/client_middlewares.py
  function build_client_middlewares (line 18) | def build_client_middlewares(

FILE: aiohttp/client_proto.py
  class _Payload (line 27) | class _Payload(ErrorableProtocol, Protocol):
    method is_eof (line 28) | def is_eof(self) -> bool: ...
  class ResponseHandler (line 31) | class ResponseHandler(BaseProtocol, DataQueue[tuple[RawResponseMessage, ...
    method __init__ (line 34) | def __init__(self, loop: asyncio.AbstractEventLoop) -> None:
    method closed (line 60) | def closed(self) -> None | asyncio.Future[None]:
    method upgraded (line 78) | def upgraded(self) -> bool:
    method should_close (line 82) | def should_close(self) -> bool:
    method force_close (line 93) | def force_close(self) -> None:
    method close (line 96) | def close(self) -> None:
    method abort (line 105) | def abort(self) -> None:
    method is_connected (line 114) | def is_connected(self) -> bool:
    method connection_lost (line 117) | def connection_lost(self, exc: BaseException | None) -> None:
    method eof_received (line 192) | def eof_received(self) -> None:
    method pause_reading (line 196) | def pause_reading(self) -> None:
    method resume_reading (line 200) | def resume_reading(self) -> None:
    method set_exception (line 204) | def set_exception(
    method set_parser (line 213) | def set_parser(
    method set_response_params (line 229) | def set_response_params(
    method _drop_timeout (line 267) | def _drop_timeout(self) -> None:
    method _reschedule_timeout (line 272) | def _reschedule_timeout(self) -> None:
    method start_timeout (line 284) | def start_timeout(self) -> None:
    method read_timeout (line 288) | def read_timeout(self) -> float | None:
    method read_timeout (line 292) | def read_timeout(self, read_timeout: float | None) -> None:
    method _on_read_timeout (line 295) | def _on_read_timeout(self) -> None:
    method data_received (line 301) | def data_received(self, data: bytes) -> None:

FILE: aiohttp/client_reqrep.py
  function _gen_default_accept_encoding (line 83) | def _gen_default_accept_encoding() -> str:
  class ContentDisposition (line 96) | class ContentDisposition:
  class _RequestInfo (line 102) | class _RequestInfo(NamedTuple):
  class RequestInfo (line 109) | class RequestInfo(_RequestInfo):
    method __new__ (line 111) | def __new__(
  class Fingerprint (line 127) | class Fingerprint:
    method __init__ (line 134) | def __init__(self, fingerprint: bytes) -> None:
    method fingerprint (line 145) | def fingerprint(self) -> bytes:
    method check (line 148) | def check(self, transport: asyncio.Transport) -> None:
  class ConnectionKey (line 172) | class ConnectionKey(NamedTuple):
  class ClientResponse (line 184) | class ClientResponse(HeadersMixin):
    method __init__ (line 215) | def __init__(
    method __reset_writer (line 261) | def __reset_writer(self, _: object = None) -> None:
    method _writer (line 265) | def _writer(self) -> asyncio.Task[None] | None:
    method _writer (line 274) | def _writer(self, writer: asyncio.Task[None] | None) -> None:
    method cookies (line 288) | def cookies(self) -> SimpleCookie:
    method cookies (line 302) | def cookies(self, cookies: SimpleCookie) -> None:
    method url (line 313) | def url(self) -> URL:
    method real_url (line 317) | def real_url(self) -> URL:
    method host (line 321) | def host(self) -> str:
    method headers (line 326) | def headers(self) -> "CIMultiDictProxy[str]":
    method raw_headers (line 330) | def raw_headers(self) -> RawHeaders:
    method request_info (line 334) | def request_info(self) -> RequestInfo:
    method content_disposition (line 342) | def content_disposition(self) -> ContentDisposition | None:
    method __del__ (line 351) | def __del__(self, _warnings: Any = warnings) -> None:
    method __repr__ (line 368) | def __repr__(self) -> str:
    method connection (line 385) | def connection(self) -> "Connection | None":
    method history (line 389) | def history(self) -> tuple["ClientResponse", ...]:
    method links (line 394) | def links(self) -> "MultiDictProxy[MultiDictProxy[str | URL]]":
    method start (line 427) | async def start(self, connection: "Connection") -> "ClientResponse":
    method _response_eof (line 476) | def _response_eof(self) -> None:
    method closed (line 490) | def closed(self) -> bool:
    method close (line 493) | def close(self) -> None:
    method release (line 506) | def release(self) -> None:
    method ok (line 516) | def ok(self) -> bool:
    method raise_for_status (line 524) | def raise_for_status(self) -> None:
    method _release_connection (line 542) | def _release_connection(self) -> None:
    method _wait_released (line 550) | async def _wait_released(self) -> None:
    method _cleanup_writer (line 563) | def _cleanup_writer(self) -> None:
    method _notify_content (line 568) | def _notify_content(self) -> None:
    method wait_for_close (line 575) | async def wait_for_close(self) -> None:
    method read (line 588) | async def read(self) -> bytes:
    method get_encoding (line 608) | def get_encoding(self) -> str:
    method text (line 631) | async def text(self, encoding: str | None = None, errors: str = "stric...
    method json (line 640) | async def json(
    method __aenter__ (line 668) | async def __aenter__(self) -> "ClientResponse":
    method __aexit__ (line 672) | async def __aexit__(
  class ClientRequestBase (line 686) | class ClientRequestBase:
    method __init__ (line 712) | def __init__(
    method _reset_writer (line 743) | def _reset_writer(self, _: object = None) -> None:
    method _get_content_length (line 746) | def _get_content_length(self) -> int | None:
    method _writer (line 764) | def _writer(self) -> asyncio.Task[None] | None:
    method _writer (line 768) | def _writer(self, writer: asyncio.Task[None]) -> None:
    method is_ssl (line 774) | def is_ssl(self) -> bool:
    method ssl (line 778) | def ssl(self) -> "SSLContext | bool | Fingerprint":
    method connection_key (line 782) | def connection_key(self) -> ConnectionKey:
    method _update_auth (line 797) | def _update_auth(self, auth: BasicAuth | None, trust_env: bool = False...
    method _update_host (line 809) | def _update_host(self, url: URL) -> None:
    method _update_headers (line 819) | def _update_headers(self, headers: CIMultiDict[str]) -> None:
    method _create_response (line 832) | def _create_response(self, task: asyncio.Task[None] | None) -> ClientR...
    method _create_writer (line 846) | def _create_writer(self, protocol: BaseProtocol) -> StreamWriter:
    method _should_write (line 849) | def _should_write(self, protocol: BaseProtocol) -> bool:
    method _send (line 852) | async def _send(self, conn: "Connection") -> ClientResponse:
    method _write_bytes (line 920) | async def _write_bytes(
  class ClientRequestArgs (line 930) | class ClientRequestArgs(TypedDict, total=False):
  class ClientRequest (line 954) | class ClientRequest(ClientRequestBase):
    method __init__ (line 970) | def __init__(
    method body (line 1029) | def body(self) -> payload.Payload:
    method skip_auto_headers (line 1033) | def skip_auto_headers(self) -> CIMultiDict[None]:
    method connection_key (line 1037) | def connection_key(self) -> ConnectionKey:
    method session (line 1057) | def session(self) -> "ClientSession":
    method _update_auto_headers (line 1066) | def _update_auto_headers(self, skip_auto_headers: Iterable[str] | None...
    method _update_cookies (line 1085) | def _update_cookies(self, cookies: BaseCookie[str]) -> None:
    method _update_content_encoding (line 1102) | def _update_content_encoding(self, data: Any, compress: bool | str) ->...
    method _update_transfer_encoding (line 1118) | def _update_transfer_encoding(self) -> None:
    method _update_body_from_data (line 1137) | def _update_body_from_data(self, body: Any) -> None:
    method _update_body (line 1182) | def _update_body(self, body: Any) -> None:
    method update_body (line 1199) | async def update_body(self, body: Any) -> None:
    method _update_expect_continue (line 1261) | def _update_expect_continue(self, expect: bool = False) -> None:
    method _update_proxy (line 1273) | def _update_proxy(
    method _create_response (line 1290) | def _create_response(self, task: asyncio.Task[None] | None) -> ClientR...
    method _create_writer (line 1304) | def _create_writer(self, protocol: BaseProtocol) -> StreamWriter:
    method _should_write (line 1327) | def _should_write(self, protocol: BaseProtocol) -> bool:
    method _write_bytes (line 1332) | async def _write_bytes(
    method _close (line 1407) | async def _close(self) -> None:
    method _terminate (line 1419) | def _terminate(self) -> None:
    method _on_chunk_request_sent (line 1426) | async def _on_chunk_request_sent(self, method: str, url: URL, chunk: b...
    method _on_headers_request_sent (line 1430) | async def _on_headers_request_sent(

FILE: aiohttp/client_ws.py
  class ClientWSTimeout (line 50) | class ClientWSTimeout:
  class ClientWebSocketResponse (line 60) | class ClientWebSocketResponse(Generic[_DecodeText]):
    method __init__ (line 61) | def __init__(
    method _cancel_heartbeat (line 106) | def _cancel_heartbeat(self) -> None:
    method _cancel_pong_response_cb (line 119) | def _cancel_pong_response_cb(self) -> None:
    method _on_data_received (line 124) | def _on_data_received(self) -> None:
    method _flush_heartbeat_reset (line 134) | def _flush_heartbeat_reset(self) -> None:
    method _reset_heartbeat (line 141) | def _reset_heartbeat(self) -> None:
    method _send_heartbeat (line 162) | def _send_heartbeat(self) -> None:
    method _ping_task_done (line 202) | def _ping_task_done(self, task: "asyncio.Task[None]") -> None:
    method _pong_not_received (line 208) | def _pong_not_received(self) -> None:
    method _handle_ping_pong_exception (line 213) | def _handle_ping_pong_exception(self, exc: BaseException) -> None:
    method _set_closed (line 224) | def _set_closed(self) -> None:
    method _set_closing (line 232) | def _set_closing(self) -> None:
    method closed (line 241) | def closed(self) -> bool:
    method close_code (line 245) | def close_code(self) -> int | None:
    method protocol (line 249) | def protocol(self) -> str | None:
    method compress (line 253) | def compress(self) -> int:
    method client_notakeover (line 257) | def client_notakeover(self) -> bool:
    method get_extra_info (line 260) | def get_extra_info(self, name: str, default: Any = None) -> Any:
    method exception (line 270) | def exception(self) -> BaseException | None:
    method ping (line 273) | async def ping(self, message: bytes = b"") -> None:
    method pong (line 276) | async def pong(self, message: bytes = b"") -> None:
    method send_frame (line 279) | async def send_frame(
    method send_str (line 285) | async def send_str(self, data: str, compress: int | None = None) -> None:
    method send_bytes (line 292) | async def send_bytes(self, data: bytes, compress: int | None = None) -...
    method send_json (line 297) | async def send_json(
    method send_json_bytes (line 306) | async def send_json_bytes(
    method close (line 320) | async def close(self, *, code: int = WSCloseCode.OK, message: bytes = ...
    method receive (line 370) | async def receive(
    method receive (line 375) | async def receive(
    method receive (line 380) | async def receive(
    method receive (line 384) | async def receive(
    method receive_str (line 460) | async def receive_str(
    method receive_str (line 465) | async def receive_str(
    method receive_str (line 470) | async def receive_str(
    method receive_str (line 474) | async def receive_str(self, *, timeout: float | None = None) -> str | ...
    method receive_bytes (line 486) | async def receive_bytes(self, *, timeout: float | None = None) -> bytes:
    method receive_json (line 495) | async def receive_json(
    method receive_json (line 503) | async def receive_json(
    method receive_json (line 511) | async def receive_json(
    method receive_json (line 518) | async def receive_json(
    method __aiter__ (line 527) | def __aiter__(self) -> Self:
    method __anext__ (line 531) | async def __anext__(
    method __anext__ (line 536) | async def __anext__(
    method __anext__ (line 541) | async def __anext__(
    method __anext__ (line 545) | async def __anext__(self) -> WSMessageDecodeText | WSMessageNoDecodeText:
    method __aenter__ (line 551) | async def __aenter__(self) -> Self:
    method __aexit__ (line 554) | async def __aexit__(

FILE: aiohttp/compression_utils.py
  class ZLibCompressObjProtocol (line 44) | class ZLibCompressObjProtocol(Protocol):
    method compress (line 45) | def compress(self, data: Buffer) -> bytes: ...
    method flush (line 46) | def flush(self, mode: int = ..., /) -> bytes: ...
  class ZLibDecompressObjProtocol (line 49) | class ZLibDecompressObjProtocol(Protocol):
    method decompress (line 50) | def decompress(self, data: Buffer, max_length: int = ...) -> bytes: ...
    method flush (line 51) | def flush(self, length: int = ..., /) -> bytes: ...
    method eof (line 54) | def eof(self) -> bool: ...
  class ZLibBackendProtocol (line 57) | class ZLibBackendProtocol(Protocol):
    method compressobj (line 64) | def compressobj(
    method decompressobj (line 73) | def decompressobj(
    method compress (line 77) | def compress(
    method decompress (line 80) | def decompress(
  class CompressObjArgs (line 85) | class CompressObjArgs(TypedDict, total=False):
  class ZLibBackendWrapper (line 91) | class ZLibBackendWrapper:
    method __init__ (line 92) | def __init__(self, _zlib_backend: ZLibBackendProtocol):
    method name (line 96) | def name(self) -> str:
    method MAX_WBITS (line 100) | def MAX_WBITS(self) -> int:
    method Z_FULL_FLUSH (line 104) | def Z_FULL_FLUSH(self) -> int:
    method Z_SYNC_FLUSH (line 108) | def Z_SYNC_FLUSH(self) -> int:
    method Z_BEST_SPEED (line 112) | def Z_BEST_SPEED(self) -> int:
    method Z_FINISH (line 116) | def Z_FINISH(self) -> int:
    method compressobj (line 119) | def compressobj(self, *args: Any, **kwargs: Any) -> ZLibCompressObjPro...
    method decompressobj (line 122) | def decompressobj(self, *args: Any, **kwargs: Any) -> ZLibDecompressOb...
    method compress (line 125) | def compress(self, data: Buffer, *args: Any, **kwargs: Any) -> bytes:
    method decompress (line 128) | def decompress(self, data: Buffer, *args: Any, **kwargs: Any) -> bytes:
    method __getattr__ (line 132) | def __getattr__(self, attrname: str) -> Any:
  function set_zlib_backend (line 139) | def set_zlib_backend(new_zlib_backend: ZLibBackendProtocol) -> None:
  function encoding_to_mode (line 143) | def encoding_to_mode(
  class DecompressionBaseHandler (line 153) | class DecompressionBaseHandler(ABC):
    method __init__ (line 154) | def __init__(
    method decompress_sync (line 164) | def decompress_sync(
    method decompress (line 169) | async def decompress(
  class ZLibCompressor (line 183) | class ZLibCompressor:
    method __init__ (line 184) | def __init__(
    method compress_sync (line 211) | def compress_sync(self, data: Buffer) -> bytes:
    method compress (line 214) | async def compress(self, data: Buffer) -> bytes:
    method flush (line 242) | def flush(self, mode: int | None = None) -> bytes:
  class ZLibDecompressor (line 258) | class ZLibDecompressor(DecompressionBaseHandler):
    method __init__ (line 259) | def __init__(
    method decompress_sync (line 271) | def decompress_sync(
    method flush (line 276) | def flush(self, length: int = 0) -> bytes:
    method eof (line 284) | def eof(self) -> bool:
  class BrotliDecompressor (line 288) | class BrotliDecompressor(DecompressionBaseHandler):
    method __init__ (line 292) | def __init__(
    method decompress_sync (line 306) | def decompress_sync(
    method flush (line 314) | def flush(self) -> bytes:
  class ZSTDDecompressor (line 321) | class ZSTDDecompressor(DecompressionBaseHandler):
    method __init__ (line 322) | def __init__(
    method decompress_sync (line 335) | def decompress_sync(
    method flush (line 347) | def flush(self) -> bytes:

FILE: aiohttp/connector.py
  class Connection (line 99) | class Connection:
    method __init__ (line 111) | def __init__(
    method __repr__ (line 127) | def __repr__(self) -> str:
    method __del__ (line 130) | def __del__(self, _warnings: Any = warnings) -> None:
    method __bool__ (line 145) | def __bool__(self) -> Literal[True]:
    method transport (line 150) | def transport(self) -> asyncio.Transport | None:
    method protocol (line 156) | def protocol(self) -> ResponseHandler | None:
    method add_callback (line 159) | def add_callback(self, callback: Callable[[], None]) -> None:
    method _notify_release (line 163) | def _notify_release(self) -> None:
    method close (line 170) | def close(self) -> None:
    method release (line 177) | def release(self) -> None:
    method closed (line 185) | def closed(self) -> bool:
  class _ConnectTunnelConnection (line 189) | class _ConnectTunnelConnection(Connection):
    method release (line 199) | def release(self) -> None:
  class _TransportPlaceholder (line 209) | class _TransportPlaceholder:
    method __init__ (line 214) | def __init__(self, closed_future: asyncio.Future[Exception | None]) ->...
    method close (line 219) | def close(self) -> None:
    method abort (line 222) | def abort(self) -> None:
  class BaseConnector (line 226) | class BaseConnector:
    method __init__ (line 249) | def __init__(
    method __del__ (line 326) | def __del__(self, _warnings: Any = warnings) -> None:
    method __aenter__ (line 346) | async def __aenter__(self) -> "BaseConnector":
    method __aexit__ (line 349) | async def __aexit__(
    method force_close (line 358) | def force_close(self) -> bool:
    method limit (line 363) | def limit(self) -> int:
    method limit_per_host (line 372) | def limit_per_host(self) -> int:
    method _cleanup (line 380) | def _cleanup(self) -> None:
    method _cleanup_closed (line 419) | def _cleanup_closed(self) -> None:
    method close (line 442) | async def close(self, *, abort_ssl: bool = False) -> None:
    method _close_immediately (line 457) | def _close_immediately(self, *, abort_ssl: bool = False) -> list[Await...
    method closed (line 521) | def closed(self) -> bool:
    method _available_connections (line 528) | def _available_connections(self, key: "ConnectionKey") -> int:
    method _update_proxy_auth_header_and_build_proxy_req (line 553) | def _update_proxy_auth_header_and_build_proxy_req(
    method connect (line 577) | async def connect(
    method _wait_for_available_connection (line 636) | async def _wait_for_available_connection(
    method _get (line 678) | async def _get(
    method _release_waiter (line 720) | def _release_waiter(self) -> None:
    method _release_acquired (line 746) | def _release_acquired(self, key: "ConnectionKey", proto: ResponseHandl...
    method _release (line 759) | def _release(
    method _create_connection (line 790) | async def _create_connection(
  class _DNSCacheTable (line 796) | class _DNSCacheTable:
    method __init__ (line 797) | def __init__(self, ttl: float | None = None, max_size: int = 1000) -> ...
    method __contains__ (line 805) | def __contains__(self, host: object) -> bool:
    method add (line 808) | def add(self, key: tuple[str, int], addrs: list[ResolveResult]) -> None:
    method remove (line 821) | def remove(self, key: tuple[str, int]) -> None:
    method clear (line 825) | def clear(self) -> None:
    method next_addrs (line 829) | def next_addrs(self, key: tuple[str, int]) -> list[ResolveResult]:
    method expired (line 837) | def expired(self, key: tuple[str, int]) -> bool:
  function _make_ssl_context (line 844) | def _make_ssl_context(verified: bool) -> SSLContext:
  class TCPConnector (line 875) | class TCPConnector(BaseConnector):
    method __init__ (line 916) | def __init__(
    method close (line 999) | async def close(self, *, abort_ssl: bool = False) -> None:
    method _close_immediately (line 1013) | def _close_immediately(self, *, abort_ssl: bool = False) -> list[Await...
    method family (line 1026) | def family(self) -> int:
    method use_dns_cache (line 1031) | def use_dns_cache(self) -> bool:
    method clear_dns_cache (line 1035) | def clear_dns_cache(self, host: str | None = None, port: int | None = ...
    method _resolve_host (line 1044) | async def _resolve_host(
    method _resolve_host_with_throttle (line 1134) | async def _resolve_host_with_throttle(
    method _create_connection (line 1175) | async def _create_connection(
    method _get_ssl_context (line 1189) | def _get_ssl_context(self, req: ClientRequestBase) -> SSLContext | None:
    method _get_fingerprint (line 1222) | def _get_fingerprint(self, req: ClientRequestBase) -> "Fingerprint | N...
    method _wrap_create_connection (line 1231) | async def _wrap_create_connection(
    method _warn_about_tls_in_tls (line 1269) | def _warn_about_tls_in_tls(
    method _start_tls_connection (line 1318) | async def _start_tls_connection(
    method _convert_hosts_to_addr_infos (line 1404) | def _convert_hosts_to_addr_infos(
    method _create_direct_connection (line 1425) | async def _create_direct_connection(
    method _create_proxy_connection (line 1499) | async def _create_proxy_connection(
  class UnixConnector (line 1578) | class UnixConnector(BaseConnector):
    method __init__ (line 1592) | def __init__(
    method path (line 1609) | def path(self) -> str:
    method _create_connection (line 1613) | async def _create_connection(
  class NamedPipeConnector (line 1631) | class NamedPipeConnector(BaseConnector):
    method __init__ (line 1648) | def __init__(
    method path (line 1672) | def path(self) -> str:
    method _create_connection (line 1676) | async def _create_connection(

FILE: aiohttp/cookiejar.py
  class _RestrictedCookieUnpickler (line 41) | class _RestrictedCookieUnpickler(pickle.Unpickler):
    method find_class (line 66) | def find_class(self, module: str, name: str) -> type:
  class CookieJar (line 76) | class CookieJar(AbstractCookieJar):
    method __init__ (line 112) | def __init__(
    method quote_cookie (line 147) | def quote_cookie(self) -> bool:
    method save (line 150) | def save(self, file_path: PathLike) -> None:
    method load (line 176) | def load(self, file_path: PathLike) -> None:
    method _load_json_data (line 197) | def _load_json_data(
    method clear (line 230) | def clear(self, predicate: ClearCookiePredicate | None = None) -> None:
    method clear_domain (line 253) | def clear_domain(self, domain: str) -> None:
    method __iter__ (line 256) | def __iter__(self) -> "Iterator[Morsel[str]]":
    method __len__ (line 261) | def __len__(self) -> int:
    method _do_expiration (line 269) | def _do_expiration(self) -> None:
    method _delete_cookies (line 312) | def _delete_cookies(self, to_del: list[tuple[str, str, str]]) -> None:
    method _expire_cookie (line 319) | def _expire_cookie(self, when: float, domain: str, path: str, name: st...
    method update_cookies (line 327) | def update_cookies(self, cookies: LooseCookies, response_url: URL = UR...
    method filter_cookies (line 401) | def filter_cookies(self, request_url: URL) -> "BaseCookie[str]":
    method _build_morsel (line 487) | def _build_morsel(self, cookie: Morsel[str]) -> Morsel[str]:
    method _is_domain_match (line 504) | def _is_domain_match(domain: str, hostname: str) -> bool:
    method _parse_date (line 520) | def _parse_date(cls, date_str: str) -> int | None:
  class DummyCookieJar (line 583) | class DummyCookieJar(AbstractCookieJar):
    method __iter__ (line 590) | def __iter__(self) -> "Iterator[Morsel[str]]":
    method __len__ (line 594) | def __len__(self) -> int:
    method quote_cookie (line 598) | def quote_cookie(self) -> bool:
    method clear (line 601) | def clear(self, predicate: ClearCookiePredicate | None = None) -> None:
    method clear_domain (line 604) | def clear_domain(self, domain: str) -> None:
    method update_cookies (line 607) | def update_cookies(self, cookies: LooseCookies, response_url: URL = UR...
    method filter_cookies (line 610) | def filter_cookies(self, request_url: URL) -> "BaseCookie[str]":

FILE: aiohttp/formdata.py
  class FormData (line 16) | class FormData:
    method __init__ (line 22) | def __init__(
    method is_multipart (line 45) | def is_multipart(self) -> bool:
    method add_field (line 48) | def add_field(
    method add_fields (line 84) | def add_fields(self, *fields: Any) -> None:
    method _gen_form_urlencoded (line 108) | def _gen_form_urlencoded(self) -> payload.BytesPayload:
    method _gen_form_data (line 128) | def _gen_form_data(self) -> multipart.MultipartWriter:
    method __call__ (line 163) | def __call__(self) -> Payload:

FILE: aiohttp/helpers.py
  class BasicAuth (line 121) | class BasicAuth(namedtuple("BasicAuth", ["login", "password", "encoding"...
    method __new__ (line 124) | def __new__(
    method decode (line 139) | def decode(cls, auth_header: str, encoding: str = "latin1") -> "BasicA...
    method from_url (line 168) | def from_url(cls, url: URL, *, encoding: str = "latin1") -> Optional["...
    method encode (line 178) | def encode(self) -> str:
  function strip_auth_from_url (line 184) | def strip_auth_from_url(url: URL) -> tuple[URL, BasicAuth | None]:
  function netrc_from_env (line 193) | def netrc_from_env() -> netrc.netrc | None:
  class ProxyInfo (line 239) | class ProxyInfo:
  function basicauth_from_netrc (line 244) | def basicauth_from_netrc(netrc_obj: netrc.netrc | None, host: str) -> Ba...
  function proxies_from_env (line 273) | def proxies_from_env() -> dict[str, ProxyInfo]:
  function get_env_proxy_for_url (line 299) | def get_env_proxy_for_url(url: URL) -> tuple[URL, BasicAuth | None]:
  class MimeType (line 314) | class MimeType:
  function parse_mimetype (line 322) | def parse_mimetype(mimetype: str) -> MimeType:
  class EnsureOctetStream (line 361) | class EnsureOctetStream(EmailMessage):
    method __init__ (line 362) | def __init__(self) -> None:
    method get_content_type (line 367) | def get_content_type(self) -> str:
  function parse_content_type (line 387) | def parse_content_type(raw: str) -> tuple[str, MappingProxyType[str, str]]:
  function guess_filename (line 401) | def guess_filename(obj: Any, default: str | None = None) -> str | None:
  function quoted_string (line 412) | def quoted_string(content: str) -> str:
  function content_disposition_header (line 425) | def content_disposition_header(
  function is_expected_content_type (line 479) | def is_expected_content_type(
  function is_ip_address (line 491) | def is_ip_address(host: str | None) -> bool:
  function rfc822_formatted_time (line 508) | def rfc822_formatted_time() -> str:
  function _weakref_handle (line 548) | def _weakref_handle(info: "tuple[weakref.ref[object], str]") -> None:
  function weakref_handle (line 556) | def weakref_handle(
  function call_later (line 572) | def call_later(
  function calculate_timeout_when (line 585) | def calculate_timeout_when(
  class TimeoutHandle (line 597) | class TimeoutHandle:
    method __init__ (line 602) | def __init__(
    method register (line 615) | def register(
    method close (line 620) | def close(self) -> None:
    method start (line 623) | def start(self) -> asyncio.TimerHandle | None:
    method timer (line 633) | def timer(self) -> "BaseTimerContext":
    method __call__ (line 641) | def __call__(self) -> None:
  class BaseTimerContext (line 649) | class BaseTimerContext(ContextManager["BaseTimerContext"]):
    method assert_timeout (line 653) | def assert_timeout(self) -> None:
  class TimerNoop (line 657) | class TimerNoop(BaseTimerContext):
    method __enter__ (line 661) | def __enter__(self) -> BaseTimerContext:
    method __exit__ (line 664) | def __exit__(
  class TimerContext (line 673) | class TimerContext(BaseTimerContext):
    method __init__ (line 678) | def __init__(self, loop: asyncio.AbstractEventLoop) -> None:
    method assert_timeout (line 684) | def assert_timeout(self) -> None:
    method __enter__ (line 689) | def __enter__(self) -> BaseTimerContext:
    method __exit__ (line 706) | def __exit__(
    method timeout (line 730) | def timeout(self) -> None:
  function ceil_timeout (line 738) | def ceil_timeout(
  class HeadersMixin (line 752) | class HeadersMixin:
    method _parse_content_type (line 760) | def _parse_content_type(self, raw: str | None) -> None:
    method content_type (line 773) | def content_type(self) -> str:
    method charset (line 782) | def charset(self) -> str | None:
    method content_length (line 791) | def content_length(self) -> int | None:
  function set_result (line 797) | def set_result(fut: "asyncio.Future[_T]", result: _T) -> None:
  class ErrorableProtocol (line 805) | class ErrorableProtocol(Protocol):
    method set_exception (line 806) | def set_exception(
  function set_exception (line 813) | def set_exception(
  class BaseKey (line 837) | class BaseKey(Generic[_T]):
    method __init__ (line 851) | def __init__(self, name: str, t: type[_T] | None = None):
    method __lt__ (line 866) | def __lt__(self, other: object) -> bool:
    method __repr__ (line 871) | def __repr__(self) -> str:
  class AppKey (line 890) | class AppKey(BaseKey[_T]):
  class RequestKey (line 894) | class RequestKey(BaseKey[_T]):
  class ResponseKey (line 898) | class ResponseKey(BaseKey[_T]):
  class ChainMapProxy (line 903) | class ChainMapProxy(Mapping[str | AppKey[Any], Any]):
    method __init__ (line 906) | def __init__(self, maps: Iterable[Mapping[str | AppKey[Any], Any]]) ->...
    method __init_subclass__ (line 909) | def __init_subclass__(cls) -> None:
    method __getitem__ (line 915) | def __getitem__(self, key: AppKey[_T]) -> _T: ...
    method __getitem__ (line 918) | def __getitem__(self, key: str) -> Any: ...
    method __getitem__ (line 920) | def __getitem__(self, key: str | AppKey[_T]) -> Any:
    method get (line 929) | def get(self, key: AppKey[_T], default: _S) -> _T | _S: ...
    method get (line 932) | def get(self, key: AppKey[_T], default: None = ...) -> _T | None: ...
    method get (line 935) | def get(self, key: str, default: Any = ...) -> Any: ...
    method get (line 937) | def get(self, key: str | AppKey[_T], default: Any = None) -> Any:
    method __len__ (line 943) | def __len__(self) -> int:
    method __iter__ (line 947) | def __iter__(self) -> Iterator[str | AppKey[Any]]:
    method __contains__ (line 954) | def __contains__(self, key: object) -> bool:
    method __bool__ (line 957) | def __bool__(self) -> bool:
    method __repr__ (line 960) | def __repr__(self) -> str:
  class CookieMixin (line 965) | class CookieMixin:
    method cookies (line 971) | def cookies(self) -> SimpleCookie:
    method set_cookie (line 976) | def set_cookie(
    method del_cookie (line 1035) | def del_cookie(
  function populate_with_cookies (line 1065) | def populate_with_cookies(headers: "CIMultiDict[str]", cookies: SimpleCo...
  class ETag (line 1082) | class ETag:
  function validate_etag_value (line 1087) | def validate_etag_value(value: str) -> None:
  function parse_http_date (line 1094) | def parse_http_date(date_str: str | None) -> datetime.datetime | None:
  function must_be_empty_body (line 1105) | def must_be_empty_body(method: str, code: int) -> bool:
  function should_remove_content_length (line 1114) | def should_remove_content_length(method: str, code: int) -> bool:

FILE: aiohttp/http_exceptions.py
  class HttpProcessingError (line 10) | class HttpProcessingError(Exception):
    method __init__ (line 24) | def __init__(
    method __str__ (line 36) | def __str__(self) -> str:
    method __repr__ (line 40) | def __repr__(self) -> str:
  class BadHttpMessage (line 44) | class BadHttpMessage(HttpProcessingError):
    method __init__ (line 48) | def __init__(
  class HttpBadRequest (line 55) | class HttpBadRequest(BadHttpMessage):
  class PayloadEncodingError (line 60) | class PayloadEncodingError(BadHttpMessage):
  class ContentEncodingError (line 64) | class ContentEncodingError(PayloadEncodingError):
  class TransferEncodingError (line 68) | class TransferEncodingError(PayloadEncodingError):
  class ContentLengthError (line 72) | class ContentLengthError(PayloadEncodingError):
  class DecompressSizeError (line 76) | class DecompressSizeError(PayloadEncodingError):
  class LineTooLong (line 80) | class LineTooLong(BadHttpMessage):
    method __init__ (line 81) | def __init__(self, line: bytes, limit: int) -> None:
  class InvalidHeader (line 86) | class InvalidHeader(BadHttpMessage):
    method __init__ (line 87) | def __init__(self, hdr: bytes | str) -> None:
  class BadStatusLine (line 94) | class BadStatusLine(BadHttpMessage):
    method __init__ (line 95) | def __init__(self, line: str = "", error: str | None = None) -> None:
  class BadHttpMethod (line 101) | class BadHttpMethod(BadStatusLine):
    method __init__ (line 104) | def __init__(self, line: str = "", error: str | None = None) -> None:
  class InvalidURLError (line 108) | class InvalidURLError(BadHttpMessage):

FILE: aiohttp/http_parser.py
  class RawRequestMessage (line 79) | class RawRequestMessage(NamedTuple):
  class RawResponseMessage (line 92) | class RawResponseMessage(NamedTuple):
  class ParseState (line 107) | class ParseState(IntEnum):
  class ChunkState (line 114) | class ChunkState(IntEnum):
  class HeadersParser (line 121) | class HeadersParser:
    method __init__ (line 122) | def __init__(self, max_field_size: int = 8190, lax: bool = False) -> N...
    method parse_headers (line 126) | def parse_headers(
  function _is_supported_upgrade (line 203) | def _is_supported_upgrade(headers: CIMultiDictProxy[str]) -> bool:
  class HttpParser (line 210) | class HttpParser(abc.ABC, Generic[_MsgT]):
    method __init__ (line 213) | def __init__(
    method parse_message (line 251) | def parse_message(self, lines: list[bytes]) -> _MsgT: ...
    method _is_chunked_te (line 254) | def _is_chunked_te(self, te: str) -> bool: ...
    method feed_eof (line 256) | def feed_eof(self) -> _MsgT | None:
    method feed_data (line 272) | def feed_data(
    method parse_headers (line 489) | def parse_headers(
    method set_upgraded (line 561) | def set_upgraded(self, val: bool) -> None:
  class HttpRequestParser (line 569) | class HttpRequestParser(HttpParser[RawRequestMessage]):
    method parse_message (line 577) | def parse_message(self, lines: list[bytes]) -> RawRequestMessage:
    method _is_chunked_te (line 657) | def _is_chunked_te(self, te: str) -> bool:
  class HttpResponseParser (line 673) | class HttpResponseParser(HttpParser[RawResponseMessage]):
    method feed_data (line 683) | def feed_data(
    method parse_message (line 694) | def parse_message(self, lines: list[bytes]) -> RawResponseMessage:
    method _is_chunked_te (line 752) | def _is_chunked_te(self, te: str) -> bool:
  class HttpPayloadParser (line 757) | class HttpPayloadParser:
    method __init__ (line 758) | def __init__(
    method feed_eof (line 814) | def feed_eof(self) -> None:
    method feed_data (line 826) | def feed_data(
  class DeflateBuffer (line 963) | class DeflateBuffer:
    method __init__ (line 966) | def __init__(
    method set_exception (line 998) | def set_exception(
    method feed_data (line 1005) | def feed_data(self, chunk: bytes) -> None:
    method feed_eof (line 1048) | def feed_eof(self) -> None:
    method begin_http_chunk_receiving (line 1059) | def begin_http_chunk_receiving(self) -> None:
    method end_http_chunk_receiving (line 1062) | def end_http_chunk_receiving(self) -> None:

FILE: aiohttp/http_writer.py
  class HttpVersion (line 39) | class HttpVersion(NamedTuple):
  class StreamWriter (line 57) | class StreamWriter(AbstractStreamWriter):
    method __init__ (line 64) | def __init__(
    method transport (line 79) | def transport(self) -> asyncio.Transport | None:
    method protocol (line 83) | def protocol(self) -> BaseProtocol:
    method enable_chunking (line 86) | def enable_chunking(self) -> None:
    method enable_compression (line 89) | def enable_compression(
    method _write (line 94) | def _write(
    method _writelines (line 105) | def _writelines(
    method _write_chunked_payload (line 124) | def _write_chunked_payload(
    method _send_headers_with_payload (line 131) | def _send_headers_with_payload(
    method write (line 167) | async def write(
    method write_headers (line 222) | async def write_headers(
    method send_headers (line 233) | def send_headers(self) -> None:
    method set_eof (line 248) | def set_eof(self) -> None:
    method write_eof (line 275) | async def write_eof(self, chunk: bytes = b"") -> None:
    method drain (line 353) | async def drain(self) -> None:
  function _safe_header (line 366) | def _safe_header(string: str) -> str:
  function _py_serialize_headers (line 375) | def _py_serialize_headers(status_line: str, headers: "CIMultiDict[str]")...

FILE: aiohttp/multipart.py
  class BadContentDispositionHeader (line 66) | class BadContentDispositionHeader(RuntimeWarning):
  class BadContentDispositionParam (line 70) | class BadContentDispositionParam(RuntimeWarning):
  function parse_content_disposition (line 74) | def parse_content_disposition(
  function content_disposition_filename (line 177) | def content_disposition_filename(
  class MultipartResponseWrapper (line 210) | class MultipartResponseWrapper:
    method __init__ (line 217) | def __init__(
    method __aiter__ (line 225) | def __aiter__(self) -> "MultipartResponseWrapper":
    method __anext__ (line 228) | async def __anext__(
    method at_eof (line 236) | def at_eof(self) -> bool:
    method next (line 240) | async def next(
    method release (line 249) | async def release(self) -> None:
  class BodyPartReader (line 257) | class BodyPartReader:
    method __init__ (line 262) | def __init__(
    method __aiter__ (line 289) | def __aiter__(self) -> Self:
    method __anext__ (line 292) | async def __anext__(self) -> bytes:
    method next (line 298) | async def next(self) -> bytes | None:
    method read (line 304) | async def read(self, *, decode: bool = False) -> bytes:
    method read_chunk (line 324) | async def read_chunk(self, size: int = chunk_size) -> bytes:
    method _read_chunk_from_length (line 368) | async def _read_chunk_from_length(self, size: int) -> bytes:
    method _read_chunk_from_stream (line 378) | async def _read_chunk_from_stream(self, size: int) -> bytes:
    method readline (line 423) | async def readline(self) -> bytes:
    method release (line 452) | async def release(self) -> None:
    method text (line 459) | async def text(self, *, encoding: str | None = None) -> str:
    method json (line 467) | async def json(self, *, encoding: str | None = None) -> dict[str, Any]...
    method form (line 475) | async def form(self, *, encoding: str | None = None) -> list[tuple[str...
    method at_eof (line 495) | def at_eof(self) -> bool:
    method _apply_content_transfer_decoding (line 499) | def _apply_content_transfer_decoding(self, data: bytes) -> bytes:
    method _needs_content_decoding (line 505) | def _needs_content_decoding(self) -> bool:
    method decode (line 510) | def decode(self, data: bytes) -> bytes:
    method decode_iter (line 524) | async def decode_iter(self, data: bytes) -> AsyncIterator[bytes]:
    method _decode_content (line 540) | def _decode_content(self, data: bytes) -> bytes:
    method _decode_content_async (line 552) | async def _decode_content_async(self, data: bytes) -> AsyncIterator[by...
    method _decode_content_transfer (line 565) | def _decode_content_transfer(self, data: bytes) -> bytes:
    method get_charset (line 577) | def get_charset(self, default: str) -> str:
    method name (line 584) | def name(self) -> str | None:
    method filename (line 593) | def filename(self) -> str | None:
  class BodyPartReaderPayload (line 603) | class BodyPartReaderPayload(Payload):
    method __init__ (line 607) | def __init__(self, value: BodyPartReader, *args: Any, **kwargs: Any) -...
    method decode (line 619) | def decode(self, encoding: str = "utf-8", errors: str = "strict") -> str:
    method as_bytes (line 622) | async def as_bytes(self, encoding: str = "utf-8", errors: str = "stric...
    method write (line 632) | async def write(self, writer: AbstractStreamWriter) -> None:
  class MultipartReader (line 639) | class MultipartReader:
    method __init__ (line 650) | def __init__(
    method __aiter__ (line 676) | def __aiter__(self) -> Self:
    method __anext__ (line 679) | async def __anext__(
    method from_response (line 688) | def from_response(
    method at_eof (line 701) | def at_eof(self) -> bool:
    method next (line 705) | async def next(
    method release (line 741) | async def release(self) -> None:
    method fetch_next_part (line 749) | async def fetch_next_part(
    method _get_part_reader (line 756) | def _get_part_reader(
    method _get_boundary (line 787) | def _get_boundary(self) -> str:
    method _readline (line 794) | async def _readline(self) -> bytes:
    method _read_until_first_boundary (line 799) | async def _read_until_first_boundary(self) -> None:
    method _read_boundary (line 811) | async def _read_boundary(self) -> None:
    method _read_headers (line 834) | async def _read_headers(self) -> "CIMultiDictProxy[str]":
    method _maybe_release_last_part (line 848) | async def _maybe_release_last_part(self) -> None:
  class MultipartWriter (line 860) | class MultipartWriter(Payload):
    method __init__ (line 867) | def __init__(self, subtype: str = "mixed", boundary: str | None = None...
    method __enter__ (line 889) | def __enter__(self) -> "MultipartWriter":
    method __exit__ (line 892) | def __exit__(
    method __iter__ (line 900) | def __iter__(self) -> Iterator[_Part]:
    method __len__ (line 903) | def __len__(self) -> int:
    method __bool__ (line 906) | def __bool__(self) -> bool:
    method _boundary_value (line 913) | def _boundary_value(self) -> str:
    method boundary (line 945) | def boundary(self) -> str:
    method append (line 948) | def append(self, obj: Any, headers: Mapping[str, str] | None = None) -...
    method append_payload (line 963) | def append_payload(self, payload: Payload) -> Payload:
    method append_json (line 1001) | def append_json(
    method append_form (line 1010) | def append_form(
    method size (line 1032) | def size(self) -> int | None:
    method decode (line 1052) | def decode(self, encoding: str = "utf-8", errors: str = "strict") -> str:
    method as_bytes (line 1067) | async def as_bytes(self, encoding: str = "utf-8", errors: str = "stric...
    method write (line 1094) | async def write(
    method close (line 1123) | async def close(self) -> None:
  class MultipartPayloadWriter (line 1149) | class MultipartPayloadWriter:
    method __init__ (line 1150) | def __init__(self, writer: AbstractStreamWriter) -> None:
    method enable_encoding (line 1156) | def enable_encoding(self, encoding: str) -> None:
    method enable_compression (line 1163) | def enable_compression(
    method write_eof (line 1172) | async def write_eof(self) -> None:
    method write (line 1183) | async def write(self, chunk: bytes) -> None:

FILE: aiohttp/payload.py
  class LookupError (line 50) | class LookupError(Exception):
  class Order (line 54) | class Order(str, enum.Enum):
  function get_payload (line 60) | def get_payload(data: Any, *args: Any, **kwargs: Any) -> "Payload":
  function register_payload (line 64) | def register_payload(
  class payload_type (line 70) | class payload_type:
    method __init__ (line 71) | def __init__(self, type: Any, *, order: Order = Order.normal) -> None:
    method __call__ (line 75) | def __call__(self, factory: type["Payload"]) -> type["Payload"]:
  class PayloadRegistry (line 84) | class PayloadRegistry:
    method __init__ (line 92) | def __init__(self) -> None:
    method get (line 98) | def get(
    method register (line 121) | def register(
  class Payload (line 139) | class Payload(ABC):
    method __init__ (line 145) | def __init__(
    method size (line 178) | def size(self) -> int | None:
    method filename (line 188) | def filename(self) -> str | None:
    method headers (line 193) | def headers(self) -> CIMultiDict[str]:
    method _binary_headers (line 198) | def _binary_headers(self) -> bytes:
    method encoding (line 207) | def encoding(self) -> str | None:
    method content_type (line 212) | def content_type(self) -> str:
    method consumed (line 217) | def consumed(self) -> bool:
    method autoclose (line 222) | def autoclose(self) -> bool:
    method set_content_disposition (line 231) | def set_content_disposition(
    method decode (line 244) | def decode(self, encoding: str = "utf-8", errors: str = "strict") -> str:
    method write (line 252) | async def write(self, writer: AbstractStreamWriter) -> None:
    method write_with_length (line 273) | async def write_with_length(
    method as_bytes (line 296) | async def as_bytes(self, encoding: str = "utf-8", errors: str = "stric...
    method _close (line 307) | def _close(self) -> None:
    method close (line 325) | async def close(self) -> None:
  class BytesPayload (line 338) | class BytesPayload(Payload):
    method __init__ (line 343) | def __init__(
    method decode (line 367) | def decode(self, encoding: str = "utf-8", errors: str = "strict") -> str:
    method as_bytes (line 370) | async def as_bytes(self, encoding: str = "utf-8", errors: str = "stric...
    method write (line 379) | async def write(self, writer: AbstractStreamWriter) -> None:
    method write_with_length (line 396) | async def write_with_length(
  class StringPayload (line 417) | class StringPayload(BytesPayload):
    method __init__ (line 418) | def __init__(
  class StringIOPayload (line 447) | class StringIOPayload(StringPayload):
    method __init__ (line 448) | def __init__(self, value: IO[str], *args: Any, **kwargs: Any) -> None:
  class IOBasePayload (line 452) | class IOBasePayload(Payload):
    method __init__ (line 458) | def __init__(
    method _set_or_restore_start_position (line 470) | def _set_or_restore_start_position(self) -> None:
    method _read_and_available_len (line 484) | def _read_and_available_len(
    method _read (line 510) | def _read(self, remaining_content_len: int | None) -> bytes:
    method size (line 529) | def size(self) -> int | None:
    method write (line 556) | async def write(self, writer: AbstractStreamWriter) -> None:
    method write_with_length (line 574) | async def write_with_length(
    method _should_stop_writing (line 635) | def _should_stop_writing(
    method _close (line 659) | def _close(self) -> None:
    method close (line 681) | async def close(self) -> None:
    method decode (line 691) | def decode(self, encoding: str = "utf-8", errors: str = "strict") -> str:
    method _read_all (line 699) | def _read_all(self) -> bytes:
    method as_bytes (line 705) | async def as_bytes(self, encoding: str = "utf-8", errors: str = "stric...
  class TextIOPayload (line 717) | class TextIOPayload(IOBasePayload):
    method __init__ (line 721) | def __init__(
    method _read_and_available_len (line 748) | def _read_and_available_len(
    method _read (line 779) | def _read(self, remaining_content_len: int | None) -> bytes:
    method decode (line 800) | def decode(self, encoding: str = "utf-8", errors: str = "strict") -> str:
    method as_bytes (line 809) | async def as_bytes(self, encoding: str = "utf-8", errors: str = "stric...
  class BytesIOPayload (line 830) | class BytesIOPayload(IOBasePayload):
    method __init__ (line 835) | def __init__(self, value: io.BytesIO, *args: Any, **kwargs: Any) -> None:
    method size (line 841) | def size(self) -> int:
    method decode (line 849) | def decode(self, encoding: str = "utf-8", errors: str = "strict") -> str:
    method write (line 853) | async def write(self, writer: AbstractStreamWriter) -> None:
    method write_with_length (line 856) | async def write_with_length(
    method as_bytes (line 897) | async def as_bytes(self, encoding: str = "utf-8", errors: str = "stric...
    method close (line 907) | async def close(self) -> None:
  class BufferedReaderPayload (line 915) | class BufferedReaderPayload(IOBasePayload):
    method decode (line 919) | def decode(self, encoding: str = "utf-8", errors: str = "strict") -> str:
  class JsonPayload (line 924) | class JsonPayload(BytesPayload):
    method __init__ (line 925) | def __init__(
  class JsonBytesPayload (line 943) | class JsonBytesPayload(BytesPayload):
    method __init__ (line 950) | def __init__(
  class AsyncIterablePayload (line 966) | class AsyncIterablePayload(Payload):
    method __init__ (line 973) | def __init__(self, value: AsyncIterable[bytes], *args: Any, **kwargs: ...
    method write (line 988) | async def write(self, writer: AbstractStreamWriter) -> None:
    method write_with_length (line 1005) | async def write_with_length(
    method decode (line 1061) | def decode(self, encoding: str = "utf-8", errors: str = "strict") -> str:
    method as_bytes (line 1067) | async def as_bytes(self, encoding: str = "utf-8", errors: str = "stric...
  class StreamReaderPayload (line 1095) | class StreamReaderPayload(AsyncIterablePayload):
    method __init__ (line 1096) | def __init__(self, value: StreamReader, *args: Any, **kwargs: Any) -> ...

FILE: aiohttp/pytest_plugin.py
  class AiohttpClient (line 31) | class AiohttpClient(Protocol):
    method __call__ (line 34) | async def __call__(
    method __call__ (line 42) | async def __call__(
  class AiohttpServer (line 51) | class AiohttpServer(Protocol):
    method __call__ (line 52) | def __call__(
  class AiohttpRawServer (line 57) | class AiohttpRawServer(Protocol):
    method __call__ (line 58) | def __call__(
  function pytest_addoption (line 67) | def pytest_addoption(parser):  # type: ignore[no-untyped-def]
  function pytest_fixture_setup (line 88) | def pytest_fixture_setup(fixturedef):  # type: ignore[no-untyped-def]
  function fast (line 146) | def fast(request: pytest.FixtureRequest) -> bool:
  function loop_debug (line 152) | def loop_debug(request: pytest.FixtureRequest) -> bool:
  function _runtime_warning_context (line 158) | def _runtime_warning_context() -> Iterator[None]:
  function _passthrough_loop_context (line 188) | def _passthrough_loop_context(
  function pytest_pycollect_makeitem (line 206) | def pytest_pycollect_makeitem(collector, name, obj):  # type: ignore[no-...
  function pytest_pyfunc_call (line 212) | def pytest_pyfunc_call(pyfuncitem):  # type: ignore[no-untyped-def]
  function pytest_generate_tests (line 234) | def pytest_generate_tests(metafunc):  # type: ignore[no-untyped-def]
  function loop (line 267) | def loop(
  function proactor_loop (line 281) | def proactor_loop() -> Iterator[asyncio.AbstractEventLoop]:
  function aiohttp_unused_port (line 290) | def aiohttp_unused_port() -> Callable[[], int]:
  function aiohttp_server (line 296) | def aiohttp_server(loop: asyncio.AbstractEventLoop) -> Iterator[AiohttpS...
  function aiohttp_raw_server (line 325) | def aiohttp_raw_server(loop: asyncio.AbstractEventLoop) -> Iterator[Aioh...
  function aiohttp_client_cls (line 353) | def aiohttp_client_cls() -> type[TestClient[Any, Any]]:
  function aiohttp_client (line 380) | def aiohttp_client(

FILE: aiohttp/resolver.py
  class ThreadedResolver (line 27) | class ThreadedResolver(AbstractResolver):
    method __init__ (line 34) | def __init__(self) -> None:
    method resolve (line 37) | async def resolve(
    method close (line 81) | async def close(self) -> None:
  class AsyncResolver (line 85) | class AsyncResolver(AbstractResolver):
    method __init__ (line 88) | def __init__(self, *args: Any, **kwargs: Any) -> None:
    method resolve (line 104) | async def resolve(
    method close (line 154) | async def close(self) -> None:
  class _DNSResolverManager (line 167) | class _DNSResolverManager:
    method __new__ (line 176) | def __new__(cls) -> "_DNSResolverManager":
    method _init (line 182) | def _init(self) -> None:
    method get_resolver (line 189) | def get_resolver(
    method release_resolver (line 212) | def release_resolver(

FILE: aiohttp/streams.py
  class EofStream (line 28) | class EofStream(Exception):
  class AsyncStreamIterator (line 32) | class AsyncStreamIterator(Generic[_T]):
    method __init__ (line 36) | def __init__(self, read_func: Callable[[], Awaitable[_T]]) -> None:
    method __aiter__ (line 39) | def __aiter__(self) -> "AsyncStreamIterator[_T]":
    method __anext__ (line 42) | async def __anext__(self) -> _T:
  class ChunkTupleAsyncStreamIterator (line 52) | class ChunkTupleAsyncStreamIterator:
    method __init__ (line 56) | def __init__(self, stream: "StreamReader") -> None:
    method __aiter__ (line 59) | def __aiter__(self) -> "ChunkTupleAsyncStreamIterator":
    method __anext__ (line 62) | async def __anext__(self) -> tuple[bytes, bool]:
  class AsyncStreamReaderMixin (line 69) | class AsyncStreamReaderMixin:
    method __aiter__ (line 73) | def __aiter__(self) -> AsyncStreamIterator[bytes]:
    method iter_chunked (line 76) | def iter_chunked(self, n: int) -> AsyncStreamIterator[bytes]:
    method iter_any (line 80) | def iter_any(self) -> AsyncStreamIterator[bytes]:
    method iter_chunks (line 84) | def iter_chunks(self) -> ChunkTupleAsyncStreamIterator:
  class StreamReader (line 93) | class StreamReader(AsyncStreamReaderMixin):
    method __init__ (line 130) | def __init__(
    method __repr__ (line 162) | def __repr__(self) -> str:
    method get_read_buffer_limits (line 176) | def get_read_buffer_limits(self) -> tuple[int, int]:
    method exception (line 179) | def exception(self) -> type[BaseException] | BaseException | None:
    method set_exception (line 182) | def set_exception(
    method on_eof (line 200) | def on_eof(self, callback: Callable[[], None]) -> None:
    method feed_eof (line 209) | def feed_eof(self) -> None:
    method is_eof (line 233) | def is_eof(self) -> bool:
    method at_eof (line 237) | def at_eof(self) -> bool:
    method wait_eof (line 241) | async def wait_eof(self) -> None:
    method total_raw_bytes (line 253) | def total_raw_bytes(self) -> int:
    method unread_data (line 258) | def unread_data(self, data: bytes) -> None:
    method feed_data (line 277) | def feed_data(self, data: bytes) -> None:
    method begin_http_chunk_receiving (line 296) | def begin_http_chunk_receiving(self) -> None:
    method end_http_chunk_receiving (line 304) | def end_http_chunk_receiving(self) -> None:
    method _wait (line 343) | async def _wait(self, func_name: str) -> None:
    method readline (line 364) | async def readline(self, *, max_line_length: int | None = None) -> bytes:
    method readuntil (line 367) | async def readuntil(
    method read (line 406) | async def read(self, n: int = -1) -> bytes:
    method readany (line 434) | async def readany(self) -> bytes:
    method readchunk (line 446) | async def readchunk(self) -> tuple[bytes, bool]:
    method readexactly (line 480) | async def readexactly(self, n: int) -> bytes:
    method read_nowait (line 495) | def read_nowait(self, n: int = -1) -> bytes:
    method _read_nowait_chunk (line 510) | def _read_nowait_chunk(self, n: int) -> bytes:
    method _read_nowait (line 545) | def _read_nowait(self, n: int) -> bytes:
  class EmptyStreamReader (line 561) | class EmptyStreamReader(StreamReader):  # lgtm [py/missing-call-to-init]
    method __init__ (line 565) | def __init__(self) -> None:
    method __repr__ (line 569) | def __repr__(self) -> str:
    method exception (line 572) | def exception(self) -> BaseException | None:
    method set_exception (line 575) | def set_exception(
    method on_eof (line 582) | def on_eof(self, callback: Callable[[], None]) -> None:
    method feed_eof (line 588) | def feed_eof(self) -> None:
    method is_eof (line 591) | def is_eof(self) -> bool:
    method at_eof (line 594) | def at_eof(self) -> bool:
    method wait_eof (line 597) | async def wait_eof(self) -> None:
    method feed_data (line 600) | def feed_data(self, data: bytes) -> None:
    method readline (line 603) | async def readline(self, *, max_line_length: int | None = None) -> bytes:
    method read (line 606) | async def read(self, n: int = -1) -> bytes:
    method readany (line 611) | async def readany(self) -> bytes:
    method readchunk (line 614) | async def readchunk(self) -> tuple[bytes, bool]:
    method readexactly (line 621) | async def readexactly(self, n: int) -> bytes:
    method read_nowait (line 624) | def read_nowait(self, n: int = -1) -> bytes:
  class DataQueue (line 631) | class DataQueue(Generic[_T]):
    method __init__ (line 634) | def __init__(self, loop: asyncio.AbstractEventLoop) -> None:
    method __len__ (line 641) | def __len__(self) -> int:
    method is_eof (line 644) | def is_eof(self) -> bool:
    method at_eof (line 647) | def at_eof(self) -> bool:
    method exception (line 650) | def exception(self) -> type[BaseException] | BaseException | None:
    method set_exception (line 653) | def set_exception(
    method feed_data (line 664) | def feed_data(self, data: _T) -> None:
    method feed_eof (line 670) | def feed_eof(self) -> None:
    method read (line 676) | async def read(self) -> _T:
    method __aiter__ (line 691) | def __aiter__(self) -> AsyncStreamIterator[_T]:

FILE: aiohttp/tcp_helpers.py
  function tcp_keepalive (line 12) | def tcp_keepalive(transport: asyncio.Transport) -> None:
  function tcp_keepalive (line 19) | def tcp_keepalive(transport: asyncio.Transport) -> None:
  function tcp_nodelay (line 23) | def tcp_nodelay(transport: asyncio.Transport, value: bool) -> None:

FILE: aiohttp/test_utils.py
  function get_unused_port_socket (line 68) | def get_unused_port_socket(
  function get_port_socket (line 74) | def get_port_socket(
  function unused_port (line 87) | def unused_port() -> int:
  class BaseTestServer (line 94) | class BaseTestServer(ABC, Generic[_Request]):
    method __init__ (line 97) | def __init__(
    method start_server (line 118) | async def start_server(self, **kwargs: Any) -> None:
    method _make_runner (line 146) | async def _make_runner(self, **kwargs: Any) -> BaseRunner[_Request]:
    method make_url (line 150) | def make_url(self, path: StrOrURL) -> URL:
    method started (line 160) | def started(self) -> bool:
    method closed (line 164) | def closed(self) -> bool:
    method handler (line 168) | def handler(self) -> Server[_Request]:
    method close (line 176) | async def close(self) -> None:
    method __aenter__ (line 195) | async def __aenter__(self) -> Self:
    method __aexit__ (line 199) | async def __aexit__(
  class TestServer (line 208) | class TestServer(BaseTestServer[Request]):
    method __init__ (line 209) | def __init__(
    method _make_runner (line 221) | async def _make_runner(self, **kwargs: Any) -> AppRunner:
  class RawTestServer (line 226) | class RawTestServer(BaseTestServer[BaseRequest]):
    method __init__ (line 227) | def __init__(
    method _make_runner (line 239) | async def _make_runner(self, **kwargs: Any) -> ServerRunner:
  class TestClient (line 245) | class TestClient(Generic[_Request, _ApplicationNone]):
    method __init__ (line 256) | def __init__(
    method __init__ (line 264) | def __init__(
    method __init__ (line 271) | def __init__(  # type: ignore[misc]
    method start_server (line 292) | async def start_server(self) -> None:
    method scheme (line 296) | def scheme(self) -> str | object:
    method host (line 300) | def host(self) -> str:
    method port (line 304) | def port(self) -> int:
    method server (line 308) | def server(self) -> BaseTestServer[_Request]:
    method app (line 312) | def app(self) -> _ApplicationNone:
    method session (line 316) | def session(self) -> ClientSession:
    method make_url (line 326) | def make_url(self, path: StrOrURL) -> URL:
    method _request (line 329) | async def _request(
    method request (line 339) | def request(
    method get (line 343) | def get(
    method options (line 349) | def options(
    method head (line 355) | def head(
    method post (line 361) | def post(
    method put (line 367) | def put(
    method patch (line 373) | def patch(
    method delete (line 379) | def delete(
    method request (line 387) | def request(
    method get (line 399) | def get(self, path: StrOrURL, **kwargs: Any) -> _RequestContextManager:
    method post (line 403) | def post(self, path: StrOrURL, **kwargs: Any) -> _RequestContextManager:
    method options (line 407) | def options(self, path: StrOrURL, **kwargs: Any) -> _RequestContextMan...
    method head (line 413) | def head(self, path: StrOrURL, **kwargs: Any) -> _RequestContextManager:
    method put (line 417) | def put(self, path: StrOrURL, **kwargs: Any) -> _RequestContextManager:
    method patch (line 421) | def patch(self, path: StrOrURL, **kwargs: Any) -> _RequestContextManager:
    method delete (line 427) | def delete(self, path: StrOrURL, **kwargs: Any) -> _RequestContextMana...
    method ws_connect (line 434) | def ws_connect(
    method ws_connect (line 439) | def ws_connect(
    method ws_connect (line 444) | def ws_connect(
    method ws_connect (line 448) | def ws_connect(
    method _ws_connect (line 461) | async def _ws_connect(
    method _ws_connect (line 466) | async def _ws_connect(
    method _ws_connect (line 471) | async def _ws_connect(
    method _ws_connect (line 475) | async def _ws_connect(
    method close (line 484) | async def close(self) -> None:
    method __aenter__ (line 505) | async def __aenter__(self) -> Self:
    method __aexit__ (line 509) | async def __aexit__(
  class AioHTTPTestCase (line 518) | class AioHTTPTestCase(IsolatedAsyncioTestCase, ABC):
    method get_application (line 532) | async def get_application(self) -> Application:
    method asyncSetUp (line 539) | async def asyncSetUp(self) -> None:
    method asyncTearDown (line 546) | async def asyncTearDown(self) -> None:
    method get_server (line 549) | async def get_server(self, app: Application) -> TestServer:
    method get_client (line 553) | async def get_client(self, server: TestServer) -> TestClient[Request, ...
  function loop_context (line 562) | def loop_context(
  function setup_test_loop (line 574) | def setup_test_loop(
  function teardown_test_loop (line 587) | def teardown_test_loop(loop: asyncio.AbstractEventLoop, fast: bool = Fal...
  function _create_app_mock (line 601) | def _create_app_mock() -> mock.MagicMock:
  function _create_transport (line 618) | def _create_transport(sslcontext: SSLContext | None = None) -> mock.Mock:
  function make_mocked_request (line 631) | def make_mocked_request(

FILE: aiohttp/tracing.py
  class _Factory (line 40) | class _Factory(Protocol[_T]):
    method __call__ (line 41) | def __call__(self, **kwargs: Any) -> _T: ...
  class TraceConfig (line 44) | class TraceConfig(Generic[_T]):
    method __init__ (line 48) | def __init__(self: "TraceConfig[SimpleNamespace]") -> None: ...
    method __init__ (line 50) | def __init__(self, trace_config_ctx_factory: _Factory[_T]) -> None: ...
    method __init__ (line 51) | def __init__(
    method trace_config_ctx (line 103) | def trace_config_ctx(self, trace_request_ctx: Any = None) -> _T:
    method freeze (line 107) | def freeze(self) -> None:
    method on_request_start (line 126) | def on_request_start(self) -> "_TracingSignal[_T, TraceRequestStartPar...
    method on_request_chunk_sent (line 130) | def on_request_chunk_sent(
    method on_response_chunk_received (line 136) | def on_response_chunk_received(
    method on_request_end (line 142) | def on_request_end(self) -> "_TracingSignal[_T, TraceRequestEndParams]":
    method on_request_exception (line 146) | def on_request_exception(
    method on_request_redirect (line 152) | def on_request_redirect(
    method on_connection_queued_start (line 158) | def on_connection_queued_start(
    method on_connection_queued_end (line 164) | def on_connection_queued_end(
    method on_connection_create_start (line 170) | def on_connection_create_start(
    method on_connection_create_end (line 176) | def on_connection_create_end(
    method on_connection_reuseconn (line 182) | def on_connection_reuseconn(
    method on_dns_resolvehost_start (line 188) | def on_dns_resolvehost_start(
    method on_dns_resolvehost_end (line 194) | def on_dns_resolvehost_end(
    method on_dns_cache_hit (line 200) | def on_dns_cache_hit(self) -> "_TracingSignal[_T, TraceDnsCacheHitPara...
    method on_dns_cache_miss (line 204) | def on_dns_cache_miss(self) -> "_TracingSignal[_T, TraceDnsCacheMissPa...
    method on_request_headers_sent (line 208) | def on_request_headers_sent(
  class TraceRequestStartParams (line 215) | class TraceRequestStartParams:
  class TraceRequestChunkSentParams (line 224) | class TraceRequestChunkSentParams:
  class TraceResponseChunkReceivedParams (line 233) | class TraceResponseChunkReceivedParams:
  class TraceRequestEndParams (line 242) | class TraceRequestEndParams:
  class TraceRequestExceptionParams (line 252) | class TraceRequestExceptionParams:
  class TraceRequestRedirectParams (line 262) | class TraceRequestRedirectParams:
  class TraceConnectionQueuedStartParams (line 272) | class TraceConnectionQueuedStartParams:
  class TraceConnectionQueuedEndParams (line 277) | class TraceConnectionQueuedEndParams:
  class TraceConnectionCreateStartParams (line 282) | class TraceConnectionCreateStartParams:
  class TraceConnectionCreateEndParams (line 287) | class TraceConnectionCreateEndParams:
  class TraceConnectionReuseconnParams (line 292) | class TraceConnectionReuseconnParams:
  class TraceDnsResolveHostStartParams (line 297) | class TraceDnsResolveHostStartParams:
  class TraceDnsResolveHostEndParams (line 304) | class TraceDnsResolveHostEndParams:
  class TraceDnsCacheHitParams (line 311) | class TraceDnsCacheHitParams:
  class TraceDnsCacheMissParams (line 318) | class TraceDnsCacheMissParams:
  class TraceRequestHeadersSentParams (line 325) | class TraceRequestHeadersSentParams:
  class Trace (line 333) | class Trace:
    method __init__ (line 340) | def __init__(
    method send_request_start (line 350) | async def send_request_start(
    method send_request_chunk_sent (line 359) | async def send_request_chunk_sent(
    method send_response_chunk_received (line 368) | async def send_response_chunk_received(
    method send_request_end (line 377) | async def send_request_end(
    method send_request_exception (line 390) | async def send_request_exception(
    method send_request_redirect (line 403) | async def send_request_redirect(
    method send_connection_queued_start (line 416) | async def send_connection_queued_start(self) -> None:
    method send_connection_queued_end (line 421) | async def send_connection_queued_end(self) -> None:
    method send_connection_create_start (line 426) | async def send_connection_create_start(self) -> None:
    method send_connection_create_end (line 431) | async def send_connection_create_end(self) -> None:
    method send_connection_reuseconn (line 436) | async def send_connection_reuseconn(self) -> None:
    method send_dns_resolvehost_start (line 441) | async def send_dns_resolvehost_start(self, host: str) -> None:
    method send_dns_resolvehost_end (line 446) | async def send_dns_resolvehost_end(self, host: str) -> None:
    method send_dns_cache_hit (line 451) | async def send_dns_cache_hit(self, host: str) -> None:
    method send_dns_cache_miss (line 456) | async def send_dns_cache_miss(self, host: str) -> None:
    method send_request_headers (line 461) | async def send_request_headers(

FILE: aiohttp/typedefs.py
  class Middleware (line 37) | class Middleware(Protocol):
    method __call__ (line 38) | def __call__(

FILE: aiohttp/web.py
  function _run_app (line 279) | async def _run_app(
  function _cancel_tasks (line 402) | def _cancel_tasks(
  function run_app (line 426) | def run_app(
  function main (line 501) | def main(argv: list[str]) -> None:

FILE: aiohttp/web_app.py
  function _build_middlewares (line 54) | def _build_middlewares(
  class Application (line 71) | class Application(MutableMapping[str | AppKey[Any], Any]):
    method __init__ (line 92) | def __init__(
    method __init_subclass__ (line 132) | def __init_subclass__(cls: type["Application"]) -> None:
    method __eq__ (line 139) | def __eq__(self, other: object) -> bool:
    method __getitem__ (line 143) | def __getitem__(self, key: AppKey[_T]) -> _T: ...
    method __getitem__ (line 146) | def __getitem__(self, key: str) -> Any: ...
    method __getitem__ (line 148) | def __getitem__(self, key: str | AppKey[_T]) -> Any:
    method _check_frozen (line 151) | def _check_frozen(self) -> None:
    method __setitem__ (line 158) | def __setitem__(self, key: AppKey[_T], value: _T) -> None: ...
    method __setitem__ (line 161) | def __setitem__(self, key: str, value: Any) -> None: ...
    method __setitem__ (line 163) | def __setitem__(self, key: str | AppKey[_T], value: Any) -> None:
    method __delitem__ (line 175) | def __delitem__(self, key: str | AppKey[_T]) -> None:
    method __len__ (line 179) | def __len__(self) -> int:
    method __iter__ (line 182) | def __iter__(self) -> Iterator[str | AppKey[Any]]:
    method __hash__ (line 185) | def __hash__(self) -> int:
    method get (line 189) | def get(self, key: AppKey[_T], default: None = ...) -> _T | None: ...
    method get (line 192) | def get(self, key: AppKey[_T], default: _U) -> _T | _U: ...
    method get (line 195) | def get(self, key: str, default: Any = ...) -> Any: ...
    method get (line 197) | def get(self, key: str | AppKey[_T], default: Any = None) -> Any:
    method _set_loop (line 201) | def _set_loop(self, loop: asyncio.AbstractEventLoop | None) -> None:
    method pre_frozen (line 209) | def pre_frozen(self) -> bool:
    method pre_freeze (line 212) | def pre_freeze(self) -> None:
    method frozen (line 238) | def frozen(self) -> bool:
    method freeze (line 241) | def freeze(self) -> None:
    method debug (line 251) | def debug(self) -> bool:
    method _reg_subapp_signals (line 259) | def _reg_subapp_signals(self, subapp: "Application") -> None:
    method add_subapp (line 273) | def add_subapp(self, prefix: str, subapp: "Application") -> PrefixedSu...
    method _add_subapp (line 282) | def _add_subapp(
    method add_domain (line 296) | def add_domain(self, domain: str, subapp: "Application") -> MatchedSub...
    method add_routes (line 306) | def add_routes(self, routes: Iterable[AbstractRouteDef]) -> list[Abstr...
    method on_response_prepare (line 310) | def on_response_prepare(self) -> _RespPrepareSignal:
    method on_startup (line 314) | def on_startup(self) -> _AppSignal:
    method on_shutdown (line 318) | def on_shutdown(self) -> _AppSignal:
    method on_cleanup (line 322) | def on_cleanup(self) -> _AppSignal:
    method cleanup_ctx (line 326) | def cleanup_ctx(self) -> "CleanupContext":
    method router (line 330) | def router(self) -> UrlDispatcher:
    method middlewares (line 334) | def middlewares(self) -> _Middlewares:
    method startup (line 337) | async def startup(self) -> None:
    method shutdown (line 344) | async def shutdown(self) -> None:
    method cleanup (line 351) | async def cleanup(self) -> None:
    method _prepare_middleware (line 362) | def _prepare_middleware(self) -> Iterator[Middleware]:
    method _handle (line 366) | async def _handle(self, request: Request) -> StreamResponse:
    method __call__ (line 392) | def __call__(self) -> "Application":
    method __repr__ (line 396) | def __repr__(self) -> str:
    method __bool__ (line 399) | def __bool__(self) -> bool:
  class CleanupError (line 403) | class CleanupError(RuntimeError):
    method exceptions (line 405) | def exceptions(self) -> list[BaseException]:
  class CleanupContext (line 415) | class CleanupContext(FrozenList[_CleanupContextCallable]):
    method __init__ (line 416) | def __init__(self) -> None:
    method _on_startup (line 420) | async def _on_startup(self, app: Application) -> None:
    method _on_cleanup (line 430) | async def _on_cleanup(self, app: Application) -> None:

FILE: aiohttp/web_exceptions.py
  class NotAppKeyWarning (line 75) | class NotAppKeyWarning(UserWarning):
  class HTTPException (line 84) | class HTTPException(CookieMixin, Exception):
    method __init__ (line 92) | def __init__(
    method __bool__ (line 141) | def __bool__(self) -> bool:
    method status (line 145) | def status(self) -> int:
    method reason (line 149) | def reason(self) -> str:
    method text (line 153) | def text(self) -> str | None:
    method headers (line 157) | def headers(self) -> "CIMultiDict[str]":
    method __str__ (line 160) | def __str__(self) -> str:
    method __repr__ (line 163) | def __repr__(self) -> str:
    method __getnewargs__ (line 168) | def __getnewargs__(self) -> tuple[Any, ...]:
  class HTTPError (line 172) | class HTTPError(HTTPException):
  class HTTPRedirection (line 176) | class HTTPRedirection(HTTPException):
  class HTTPSuccessful (line 180) | class HTTPSuccessful(HTTPException):
  class HTTPOk (line 184) | class HTTPOk(HTTPSuccessful):
  class HTTPCreated (line 188) | class HTTPCreated(HTTPSuccessful):
  class HTTPAccepted (line 192) | class HTTPAccepted(HTTPSuccessful):
  class HTTPNonAuthoritativeInformation (line 196) | class HTTPNonAuthoritativeInformation(HTTPSuccessful):
  class HTTPNoContent (line 200) | class HTTPNoContent(HTTPSuccessful):
  class HTTPResetContent (line 205) | class HTTPResetContent(HTTPSuccessful):
  class HTTPPartialContent (line 210) | class HTTPPartialContent(HTTPSuccessful):
  class HTTPMove (line 219) | class HTTPMove(HTTPRedirection):
    method __init__ (line 220) | def __init__(
    method location (line 238) | def location(self) -> URL:
  class HTTPMultipleChoices (line 242) | class HTTPMultipleChoices(HTTPMove):
  class HTTPMovedPermanently (line 246) | class HTTPMovedPermanently(HTTPMove):
  class HTTPFound (line 250) | class HTTPFound(HTTPMove):
  class HTTPSeeOther (line 256) | class HTTPSeeOther(HTTPMove):
  class HTTPNotModified (line 260) | class HTTPNotModified(HTTPRedirection):
  class HTTPUseProxy (line 266) | class HTTPUseProxy(HTTPMove):
  class HTTPTemporaryRedirect (line 271) | class HTTPTemporaryRedirect(HTTPMove):
  class HTTPPermanentRedirect (line 275) | class HTTPPermanentRedirect(HTTPMove):
  class HTTPClientError (line 284) | class HTTPClientError(HTTPError):
  class HTTPBadRequest (line 288) | class HTTPBadRequest(HTTPClientError):
  class HTTPUnauthorized (line 292) | class HTTPUnauthorized(HTTPClientError):
  class HTTPPaymentRequired (line 296) | class HTTPPaymentRequired(HTTPClientError):
  class HTTPForbidden (line 300) | class HTTPForbidden(HTTPClientError):
  class HTTPNotFound (line 304) | class HTTPNotFound(HTTPClientError):
  class HTTPMethodNotAllowed (line 308) | class HTTPMethodNotAllowed(HTTPClientError):
    method __init__ (line 311) | def __init__(
    method allowed_methods (line 330) | def allowed_methods(self) -> set[str]:
    method method (line 334) | def method(self) -> str:
  class HTTPNotAcceptable (line 338) | class HTTPNotAcceptable(HTTPClientError):
  class HTTPProxyAuthenticationRequired (line 342) | class HTTPProxyAuthenticationRequired(HTTPClientError):
  class HTTPRequestTimeout (line 346) | class HTTPRequestTimeout(HTTPClientError):
  class HTTPConflict (line 350) | class HTTPConflict(HTTPClientError):
  class HTTPGone (line 354) | class HTTPGone(HTTPClientError):
  class HTTPLengthRequired (line 358) | class HTTPLengthRequired(HTTPClientError):
  class HTTPPreconditionFailed (line 362) | class HTTPPreconditionFailed(HTTPClientError):
  class HTTPRequestEntityTooLarge (line 366) | class HTTPRequestEntityTooLarge(HTTPClientError):
    method __init__ (line 369) | def __init__(self, max_size: int, actual_size: int, **kwargs: Any) -> ...
  class HTTPRequestURITooLong (line 378) | class HTTPRequestURITooLong(HTTPClientError):
  class HTTPUnsupportedMediaType (line 382) | class HTTPUnsupportedMediaType(HTTPClientError):
  class HTTPRequestRangeNotSatisfiable (line 386) | class HTTPRequestRangeNotSatisfiable(HTTPClientError):
  class HTTPExpectationFailed (line 390) | class HTTPExpectationFailed(HTTPClientError):
  class HTTPMisdirectedRequest (line 394) | class HTTPMisdirectedRequest(HTTPClientError):
  class HTTPUnprocessableEntity (line 398) | class HTTPUnprocessableEntity(HTTPClientError):
  class HTTPFailedDependency (line 402) | class HTTPFailedDependency(HTTPClientError):
  class HTTPUpgradeRequired (line 406) | class HTTPUpgradeRequired(HTTPClientError):
  class HTTPPreconditionRequired (line 410) | class HTTPPreconditionRequired(HTTPClientError):
  class HTTPTooManyRequests (line 414) | class HTTPTooManyRequests(HTTPClientError):
  class HTTPRequestHeaderFieldsTooLarge (line 418) | class HTTPRequestHeaderFieldsTooLarge(HTTPClientError):
  class HTTPUnavailableForLegalReasons (line 422) | class HTTPUnavailableForLegalReasons(HTTPClientError):
    method __init__ (line 425) | def __init__(
    method link (line 443) | def link(self) -> URL | None:
  class HTTPServerError (line 459) | class HTTPServerError(HTTPError):
  class HTTPInternalServerError (line 463) | class HTTPInternalServerError(HTTPServerError):
  class HTTPNotImplemented (line 467) | class HTTPNotImplemented(HTTPServerError):
  class HTTPBadGateway (line 471) | class HTTPBadGateway(HTTPServerError):
  class HTTPServiceUnavailable (line 475) | class HTTPServiceUnavailable(HTTPServerError):
  class HTTPGatewayTimeout (line 479) | class HTTPGatewayTimeout(HTTPServerError):
  class HTTPVersionNotSupported (line 483) | class HTTPVersionNotSupported(HTTPServerError):
  class HTTPVariantAlsoNegotiates (line 487) | class HTTPVariantAlsoNegotiates(HTTPServerError):
  class HTTPInsufficientStorage (line 491) | class HTTPInsufficientStorage(HTTPServerError):
  class HTTPNotExtended (line 495) | class HTTPNotExtended(HTTPServerError):
  class HTTPNetworkAuthenticationRequired (line 499) | class HTTPNetworkAuthenticationRequired(HTTPServerError):
  function _initialize_default_reason (line 503) | def _initialize_default_reason() -> None:

FILE: aiohttp/web_fileresponse.py
  class _FileResponseResult (line 61) | class _FileResponseResult(Enum):
  class FileResponse (line 79) | class FileResponse(StreamResponse):
    method __init__ (line 82) | def __init__(
    method _seek_and_read (line 95) | def _seek_and_read(self, fobj: IO[Any], offset: int, chunk_size: int) ...
    method _sendfile_fallback (line 99) | async def _sendfile_fallback(
    method _sendfile (line 120) | async def _sendfile(
    method _etag_match (line 142) | def _etag_match(etag_value: str, etags: tuple[ETag, ...], *, weak: boo...
    method _not_modified (line 149) | async def _not_modified(
    method _precondition_failed (line 160) | async def _precondition_failed(
    method _make_response (line 167) | def _make_response(
    method _get_file_path_stat_encoding (line 223) | def _get_file_path_stat_encoding(
    method prepare (line 242) | async def prepare(self, request: "BaseRequest") -> AbstractStreamWrite...
    method _prepare_open_file (line 287) | async def _prepare_open_file(

FILE: aiohttp/web_log.py
  class AccessLogger (line 18) | class AccessLogger(AbstractAccessLogger):
    method __init__ (line 67) | def __init__(self, logger: logging.Logger, log_format: str = LOG_FORMA...
    method compile_format (line 83) | def compile_format(self, log_format: str) -> tuple[str, list[KeyMethod]]:
    method _format_i (line 125) | def _format_i(
    method _format_o (line 132) | def _format_o(
    method _format_a (line 139) | def _format_a(request: BaseRequest, response: StreamResponse, time: fl...
    method _get_local_time (line 144) | def _get_local_time(cls) -> datetime.datetime:
    method _format_t (line 159) | def _format_t(request: BaseRequest, response: StreamResponse, time: fl...
    method _format_P (line 165) | def _format_P(request: BaseRequest, response: StreamResponse, time: fl...
    method _format_r (line 169) | def _format_r(request: BaseRequest, response: StreamResponse, time: fl...
    method _format_s (line 173) | def _format_s(request: BaseRequest, response: StreamResponse, time: fl...
    method _format_b (line 177) | def _format_b(request: BaseRequest, response: StreamResponse, time: fl...
    method _format_T (line 181) | def _format_T(request: BaseRequest, response: StreamResponse, time: fl...
    method _format_Tf (line 185) | def _format_Tf(request: BaseRequest, response: StreamResponse, time: f...
    method _format_D (line 189) | def _format_D(request: BaseRequest, response: StreamResponse, time: fl...
    method _format_line (line 192) | def _format_line(
    method enabled (line 198) | def enabled(self) -> bool:
    method log (line 203) | def log(self, request: BaseRequest, response: StreamResponse, time: fl...

FILE: aiohttp/web_middlewares.py
  function _check_request_resolves (line 22) | async def _check_request_resolves(request: Request, path: str) -> tuple[...
  function middleware (line 34) | def middleware(f: _Func) -> _Func:
  function normalize_path_middleware (line 45) | def normalize_path_middleware(
  function _fix_request_current_app (line 116) | def _fix_request_current_app(app: "Application") -> Middleware:

FILE: aiohttp/web_protocol.py
  class RequestPayloadError (line 75) | class RequestPayloadError(Exception):
  class PayloadAccessError (line 79) | class PayloadAccessError(Exception):
  class AccessLoggerWrapper (line 86) | class AccessLoggerWrapper(AbstractAsyncAccessLogger):
    method __init__ (line 91) | def __init__(
    method log (line 98) | async def log(
    method enabled (line 104) | def enabled(self) -> bool:
  class _ErrInfo (line 110) | class _ErrInfo:
  class RequestHandler (line 119) | class RequestHandler(BaseProtocol, Generic[_Request]):
    method __init__ (line 190) | def __init__(
    method __repr__ (line 285) | def __repr__(self) -> str:
    method ssl_context (line 292) | def ssl_context(self) -> Optional["ssl.SSLContext"]:
    method peername (line 301) | def peername(
    method keepalive_timeout (line 312) | def keepalive_timeout(self) -> float:
    method shutdown (line 315) | async def shutdown(self, timeout: float | None = 15.0) -> None:
    method connection_made (line 365) | def connection_made(self, transport: asyncio.BaseTransport) -> None:
    method connection_lost (line 382) | def connection_lost(self, exc: BaseException | None) -> None:
    method set_parser (line 414) | def set_parser(
    method eof_received (line 427) | def eof_received(self) -> None:
    method data_received (line 430) | def data_received(self, data: bytes) -> None:
    method keep_alive (line 471) | def keep_alive(self, val: bool) -> None:
    method close (line 481) | def close(self) -> None:
    method force_close (line 491) | def force_close(self) -> None:
    method log_access (line 500) | async def log_access(
    method log_debug (line 511) | def log_debug(self, *args: Any, **kw: Any) -> None:
    method log_exception (line 515) | def log_exception(self, *args: Any, **kw: Any) -> None:
    method _process_keepalive (line 518) | def _process_keepalive(self) -> None:
    method _handle_request (line 535) | async def _handle_request(
    method start (line 572) | async def start(self) -> None:
    method finish_response (line 711) | async def finish_response(
    method handle_error (line 752) | def handle_error(
    method _make_error_handler (line 814) | def _make_error_handler(

FILE: aiohttp/web_request.py
  class FileField (line 73) | class FileField:
  class BaseRequest (line 109) | class BaseRequest(MutableMapping[str | RequestKey[Any], Any], HeadersMix...
    method __init__ (line 121) | def __init__(
    method clone (line 176) | def clone(
    method task (line 236) | def task(self) -> "asyncio.Task[None]":
    method protocol (line 240) | def protocol(self) -> "RequestHandler[Self]":
    method transport (line 244) | def transport(self) -> asyncio.Transport | None:
    method writer (line 248) | def writer(self) -> AbstractStreamWriter:
    method client_max_size (line 252) | def client_max_size(self) -> int:
    method rel_url (line 256) | def rel_url(self) -> URL:
    method __getitem__ (line 262) | def __getitem__(self, key: RequestKey[_T]) -> _T: ...
    method __getitem__ (line 265) | def __getitem__(self, key: str) -> Any: ...
    method __getitem__ (line 267) | def __getitem__(self, key: str | RequestKey[_T]) -> Any:
    method __setitem__ (line 271) | def __setitem__(self, key: RequestKey[_T], value: _T) -> None: ...
    method __setitem__ (line 274) | def __setitem__(self, key: str, value: Any) -> None: ...
    method __setitem__ (line 276) | def __setitem__(self, key: str | RequestKey[_T], value: Any) -> None:
    method __delitem__ (line 279) | def __delitem__(self, key: str | RequestKey[_T]) -> None:
    method __len__ (line 282) | def __len__(self) -> int:
    method __iter__ (line 285) | def __iter__(self) -> Iterator[str | RequestKey[Any]]:
    method secure (line 291) | def secure(self) -> bool:
    method forwarded (line 296) | def forwarded(self) -> tuple[Mapping[str, str], ...]:
    method scheme (line 357) | def scheme(self) -> str:
    method method (line 373) | def method(self) -> str:
    method version (line 381) | def version(self) -> HttpVersion:
    method host (line 389) | def host(self) -> str:
    method remote (line 408) | def remote(self) -> str | None:
    method url (line 423) | def url(self) -> URL:
    method path (line 430) | def path(self) -> str:
    method path_qs (line 438) | def path_qs(self) -> str:
    method raw_path (line 446) | def raw_path(self) -> str:
    method query (line 456) | def query(self) -> MultiDictProxy[str]:
    method query_string (line 461) | def query_string(self) -> str:
    method headers (line 469) | def headers(self) -> CIMultiDictProxy[str]:
    method raw_headers (line 474) | def raw_headers(self) -> RawHeaders:
    method if_modified_since (line 479) | def if_modified_since(self) -> datetime.datetime | None:
    method if_unmodified_since (line 487) | def if_unmodified_since(self) -> datetime.datetime | None:
    method _etag_values (line 495) | def _etag_values(etag_header: str) -> Iterator[ETag]:
    method _if_match_or_none_impl (line 516) | def _if_match_or_none_impl(
    method if_match (line 525) | def if_match(self) -> tuple[ETag, ...] | None:
    method if_none_match (line 533) | def if_none_match(self) -> tuple[ETag, ...] | None:
    method if_range (line 541) | def if_range(self) -> datetime.datetime | None:
    method keep_alive (line 549) | def keep_alive(self) -> bool:
    method cookies (line 554) | def cookies(self) -> Mapping[str, str]:
    method http_range (line 566) | def http_range(self) -> "slice[int, int, int]":
    method content (line 602) | def content(self) -> StreamReader:
    method can_read_body (line 607) | def can_read_body(self) -> bool:
    method body_exists (line 612) | def body_exists(self) -> bool:
    method release (line 616) | async def release(self) -> None:
    method read (line 624) | async def read(self) -> bytes:
    method text (line 645) | async def text(self) -> str:
    method json (line 654) | async def json(
    method multipart (line 673) | async def multipart(self) -> MultipartReader:
    method post (line 682) | async def post(self) -> "MultiDictProxy[str | bytes | FileField]":
    method get_extra_info (line 787) | def get_extra_info(self, name: str, default: Any = None) -> Any:
    method __repr__ (line 795) | def __repr__(self) -> str:
    method __eq__ (line 801) | def __eq__(self, other: object) -> bool:
    method __bool__ (line 804) | def __bool__(self) -> bool:
    method _prepare_hook (line 807) | async def _prepare_hook(self, response: StreamResponse) -> None:
    method _cancel (line 810) | def _cancel(self, exc: BaseException) -> None:
    method _finish (line 813) | def _finish(self) -> None:
  class Request (line 826) | class Request(BaseRequest):
    method clone (line 830) | def clone(
    method match_info (line 855) | def match_info(self) -> "UrlMappingMatchInfo":
    method app (line 862) | def app(self) -> "Application":
    method config_dict (line 869) | def config_dict(self) -> ChainMapProxy:
    method _prepare_hook (line 878) | async def _prepare_hook(self, response: StreamResponse) -> None:

FILE: aiohttp/web_response.py
  class ContentCoding (line 57) | class ContentCoding(enum.Enum):
  class StreamResponse (line 74) | class StreamResponse(
    method __init__ (line 93) | def __init__(
    method prepared (line 120) | def prepared(self) -> bool:
    method task (line 124) | def task(self) -> "asyncio.Task[None] | None":
    method status (line 131) | def status(self) -> int:
    method chunked (line 135) | def chunked(self) -> bool:
    method compression (line 139) | def compression(self) -> bool:
    method reason (line 143) | def reason(self) -> str:
    method set_status (line 146) | def set_status(
    method _set_status (line 156) | def _set_status(self, status: int, reason: str | None) -> None:
    method keep_alive (line 165) | def keep_alive(self) -> bool | None:
    method force_close (line 168) | def force_close(self) -> None:
    method body_length (line 172) | def body_length(self) -> int:
    method enable_chunked_encoding (line 175) | def enable_chunked_encoding(self) -> None:
    method enable_compression (line 183) | def enable_compression(
    method headers (line 201) | def headers(self) -> "CIMultiDict[str]":
    method content_length (line 205) | def content_length(self) -> int | None:
    method content_length (line 210) | def content_length(self, value: int | None) -> None:
    method content_type (line 222) | def content_type(self) -> str:
    method content_type (line 227) | def content_type(self, value: str) -> None:
    method charset (line 233) | def charset(self) -> str | None:
    method charset (line 238) | def charset(self, value: str | None) -> None:
    method last_modified (line 253) | def last_modified(self) -> datetime.datetime | None:
    method last_modified (line 261) | def last_modified(
    method etag (line 281) | def etag(self) -> ETag | None:
    method etag (line 297) | def etag(self, value: ETag | str | None) -> None:
    method _generate_content_type_header (line 317) | def _generate_content_type_header(
    method _do_start_compression (line 329) | async def _do_start_compression(self, coding: ContentCoding) -> None:
    method _start_compression (line 341) | async def _start_compression(self, request: "BaseRequest") -> None:
    method prepare (line 353) | async def prepare(self, request: "BaseRequest") -> AbstractStreamWrite...
    method _start (line 361) | async def _start(self, request: "BaseRequest") -> AbstractStreamWriter:
    method _prepare_headers (line 371) | async def _prepare_headers(self) -> None:
    method _write_headers (line 434) | async def _write_headers(self) -> None:
    method write (line 448) | async def write(
    method drain (line 462) | async def drain(self) -> None:
    method write_eof (line 472) | async def write_eof(self, data: bytes = b"") -> None:
    method __repr__ (line 488) | def __repr__(self) -> str:
    method __getitem__ (line 499) | def __getitem__(self, key: ResponseKey[_T]) -> _T: ...
    method __getitem__ (line 502) | def __getitem__(self, key: str) -> Any: ...
    method __getitem__ (line 504) | def __getitem__(self, key: str | ResponseKey[_T]) -> Any:
    method __setitem__ (line 508) | def __setitem__(self, key: ResponseKey[_T], value: _T) -> None: ...
    method __setitem__ (line 511) | def __setitem__(self, key: str, value: Any) -> None: ...
    method __setitem__ (line 513) | def __setitem__(self, key: str | ResponseKey[_T], value: Any) -> None:
    method __delitem__ (line 516) | def __delitem__(self, key: str | ResponseKey[_T]) -> None:
    method __len__ (line 519) | def __len__(self) -> int:
    method __iter__ (line 522) | def __iter__(self) -> Iterator[str | ResponseKey[Any]]:
    method __hash__ (line 525) | def __hash__(self) -> int:
    method __eq__ (line 528) | def __eq__(self, other: object) -> bool:
    method __bool__ (line 531) | def __bool__(self) -> bool:
  class Response (line 535) | class Response(StreamResponse):
    method __init__ (line 540) | def __init__(
    method body (line 606) | def body(self) -> bytes | bytearray | Payload | None:
    method body (line 610) | def body(self, body: Any) -> None:
    method text (line 636) | def text(self) -> str | None:
    method text (line 645) | def text(self, text: str) -> None:
    method content_length (line 657) | def content_length(self) -> int | None:
    method content_length (line 676) | def content_length(self, value: int | None) -> None:
    method write_eof (line 679) | async def write_eof(self, data: bytes = b"") -> None:
    method _start (line 698) | async def _start(self, request: "BaseRequest") -> AbstractStreamWriter:
    method _do_start_compression (line 716) | async def _do_start_compression(self, coding: ContentCoding) -> None:
  function json_response (line 743) | def json_response(
  function json_bytes_response (line 769) | def json_bytes_response(

FILE: aiohttp/web_routedef.py
  class AbstractRouteDef (line 36) | class AbstractRouteDef(abc.ABC):
    method register (line 38) | def register(self, router: UrlDispatcher) -> list[AbstractRoute]:
  class RouteDef (line 46) | class RouteDef(AbstractRouteDef):
    method __repr__ (line 52) | def __repr__(self) -> str:
    method register (line 60) | def register(self, router: UrlDispatcher) -> list[AbstractRoute]:
  class StaticDef (line 71) | class StaticDef(AbstractRouteDef):
    method __repr__ (line 76) | def __repr__(self) -> str:
    method register (line 84) | def register(self, router: UrlDispatcher) -> list[AbstractRoute]:
  function route (line 90) | def route(method: str, path: str, handler: _HandlerType, **kwargs: Any) ...
  function head (line 94) | def head(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef:
  function options (line 98) | def options(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef:
  function get (line 102) | def get(
  function post (line 115) | def post(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef:
  function put (line 119) | def put(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef:
  function patch (line 123) | def patch(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef:
  function delete (line 127) | def delete(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef:
  function view (line 131) | def view(path: str, handler: type[AbstractView], **kwargs: Any) -> Route...
  function static (line 135) | def static(prefix: str, path: PathLike, **kwargs: Any) -> StaticDef:
  class RouteTableDef (line 142) | class RouteTableDef(Sequence[AbstractRouteDef]):
    method __init__ (line 145) | def __init__(self) -> None:
    method __repr__ (line 148) | def __repr__(self) -> str:
    method __getitem__ (line 152) | def __getitem__(self, index: int) -> AbstractRouteDef: ...
    method __getitem__ (line 155) | def __getitem__(self, index: "slice[int, int, int]") -> list[AbstractR...
    method __getitem__ (line 157) | def __getitem__(
    method __iter__ (line 162) | def __iter__(self) -> Iterator[AbstractRouteDef]:
    method __len__ (line 165) | def __len__(self) -> int:
    method __contains__ (line 168) | def __contains__(self, item: object) -> bool:
    method route (line 171) | def route(self, method: str, path: str, **kwargs: Any) -> _Deco:
    method head (line 178) | def head(self, path: str, **kwargs: Any) -> _Deco:
    method get (line 181) | def get(self, path: str, **kwargs: Any) -> _Deco:
    method post (line 184) | def post(self, path: str, **kwargs: Any) -> _Deco:
    method put (line 187) | def put(self, path: str, **kwargs: Any) -> _Deco:
    method patch (line 190) | def patch(self, path: str, **kwargs: Any) -> _Deco:
    method delete (line 193) | def delete(self, path: str, **kwargs: Any) -> _Deco:
    method options (line 196) | def options(self, path: str, **kwargs: Any) -> _Deco:
    method view (line 199) | def view(self, path: str, **kwargs: Any) -> _Deco:
    method static (line 202) | def static(self, prefix: str, path: PathLike, **kwargs: Any) -> None:

FILE: aiohttp/web_runner.py
  class GracefulExit (line 39) | class GracefulExit(SystemExit):
  function _raise_graceful_exit (line 43) | def _raise_graceful_exit() -> None:
  class BaseSite (line 47) | class BaseSite(ABC):
    method __init__ (line 50) | def __init__(
    method name (line 66) | def name(self) -> str:
    method start (line 70) | async def start(self) -> None:
    method stop (line 73) | async def stop(self) -> None:
  class TCPSite (line 81) | class TCPSite(BaseSite):
    method __init__ (line 84) | def __init__(
    method port (line 109) | def port(self) -> int:
    method name (line 123) | def name(self) -> str:
    method start (line 128) | async def start(self) -> None:
  class UnixSite (line 148) | class UnixSite(BaseSite):
    method __init__ (line 151) | def __init__(
    method name (line 167) | def name(self) -> str:
    method start (line 171) | async def start(self) -> None:
  class NamedPipeSite (line 184) | class NamedPipeSite(BaseSite):
    method __init__ (line 187) | def __init__(self, runner: "BaseRunner[Any]", path: str) -> None:
    method name (line 199) | def name(self) -> str:
    method start (line 202) | async def start(self) -> None:
  class SockSite (line 213) | class SockSite(BaseSite):
    method __init__ (line 216) | def __init__(
    method name (line 239) | def name(self) -> str:
    method start (line 242) | async def start(self) -> None:
  class BaseRunner (line 252) | class BaseRunner(ABC, Generic[_Request]):
    method __init__ (line 255) | def __init__(
    method server (line 269) | def server(self) -> Server[_Request] | None:
    method addresses (line 273) | def addresses(self) -> list[Any]:
    method sites (line 285) | def sites(self) -> set[BaseSite]:
    method setup (line 288) | async def setup(self) -> None:
    method shutdown (line 302) | async def shutdown(self) -> None:
    method cleanup (line 305) | async def cleanup(self) -> None:
    method _make_server (line 333) | async def _make_server(self) -> Server[_Request]:
    method _cleanup_server (line 337) | async def _cleanup_server(self) -> None:
    method _reg_site (line 340) | def _reg_site(self, site: BaseSite) -> None:
    method _check_site (line 345) | def _check_site(self, site: BaseSite) -> None:
    method _unreg_site (line 349) | def _unreg_site(self, site: BaseSite) -> None:
  class ServerRunner (line 355) | class ServerRunner(BaseRunner[BaseRequest]):
    method __init__ (line 360) | def __init__(
    method shutdown (line 370) | async def shutdown(self) -> None:
    method _make_server (line 373) | async def _make_server(self) -> Server[BaseRequest]:
    method _cleanup_server (line 376) | async def _cleanup_server(self) -> None:
  class AppRunner (line 380) | class AppRunner(BaseRunner[Request]):
    method __init__ (line 385) | def __init__(
    method app (line 415) | def app(self) -> Application:
    method shutdown (line 418) | async def shutdown(self) -> None:
    method _make_server (line 421) | async def _make_server(self) -> Server[Request]:
    method _make_request (line 432) | def _make_request(
    method _cleanup_server (line 452) | async def _cleanup_server(self) -> None:

FILE: aiohttp/web_server.py
  class Server (line 30) | class Server(Generic[_Request]):
    method __init__ (line 34) | def __init__(
    method __init__ (line 43) | def __init__(
    method __init__ (line 52) | def __init__(
    method connections (line 78) | def connections(self) -> list[RequestHandler[_Request]]:
    method connection_made (line 81) | def connection_made(
    method connection_lost (line 86) | def connection_lost(
    method _make_request (line 97) | def _make_request(
    method pre_shutdown (line 107) | def pre_shutdown(self) -> None:
    method shutdown (line 111) | async def shutdown(self, timeout: float | None = None) -> None:
    method __call__ (line 116) | def __call__(self) -> RequestHandler[_Request]:

FILE: aiohttp/web_urldispatcher.py
  class _InfoDict (line 82) | class _InfoDict(TypedDict, total=False):
  class AbstractResource (line 101) | class AbstractResource(Sized, Iterable["AbstractRoute"]):
    method __init__ (line 102) | def __init__(self, *, name: str | None = None) -> None:
    method name (line 106) | def name(self) -> str | None:
    method canonical (line 111) | def canonical(self) -> str:
    method url_for (line 119) | def url_for(self, **kwargs: str) -> URL:
    method resolve (line 123) | async def resolve(self, request: Request) -> _Resolve:
    method add_prefix (line 130) | def add_prefix(self, prefix: str) -> None:
    method get_info (line 137) | def get_info(self) -> _InfoDict:
    method freeze (line 140) | def freeze(self) -> None:
    method raw_match (line 144) | def raw_match(self, path: str) -> bool:
  class AbstractRoute (line 148) | class AbstractRoute(abc.ABC):
    method __init__ (line 149) | def __init__(
    method method (line 185) | def method(self) -> str:
    method handler (line 189) | def handler(self) -> Handler:
    method name (line 194) | def name(self) -> str | None:
    method resource (line 198) | def resource(self) -> AbstractResource | None:
    method get_info (line 202) | def get_info(self) -> _InfoDict:
    method url_for (line 206) | def url_for(self, *args: str, **kwargs: str) -> URL:
    method handle_expect_header (line 209) | async def handle_expect_header(self, request: Request) -> StreamRespon...
  class UrlMappingMatchInfo (line 213) | class UrlMappingMatchInfo(dict[str, str], AbstractMatchInfo):
    method __init__ (line 217) | def __init__(self, match_dict: dict[str, str], route: AbstractRoute) -...
    method handler (line 225) | def handler(self) -> Handler:
    method route (line 229) | def route(self) -> AbstractRoute:
    method expect_handler (line 233) | def expect_handler(self) -> _ExpectHandler:
    method http_exception (line 237) | def http_exception(self) -> HTTPException | None:
    method get_info (line 240) | def get_info(self) -> _InfoDict:  # type: ignore[override]
    method apps (line 244) | def apps(self) -> tuple["Application", ...]:
    method add_app (line 247) | def add_app(self, app: "Application") -> None:
    method current_app (line 255) | def current_app(self) -> "Application":
    method current_app (line 261) | def current_app(self, app: "Application") -> None:
    method freeze (line 269) | def freeze(self) -> None:
    method __repr__ (line 272) | def __repr__(self) -> str:
  class MatchInfoError (line 276) | class MatchInfoError(UrlMappingMatchInfo):
    method __init__ (line 280) | def __init__(self, http_exception: HTTPException) -> None:
    method http_exception (line 285) | def http_exception(self) -> HTTPException:
    method __repr__ (line 288) | def __repr__(self) -> str:
  function _default_expect_handler (line 292) | async def _default_expect_handler(request: Request) -> None:
  class Resource (line 308) | class Resource(AbstractResource):
    method __init__ (line 309) | def __init__(self, *, name: str | None = None) -> None:
    method add_route (line 315) | def add_route(
    method register_route (line 333) | def register_route(self, route: "ResourceRoute") -> None:
    method resolve (line 342) | async def resolve(self, request: Request) -> _Resolve:
    method _match (line 350) | def _match(self, path: str) -> dict[str, str] | None:
    method __len__ (line 353) | def __len__(self) -> int:
    method __iter__ (line 356) | def __iter__(self) -> Iterator["ResourceRoute"]:
  class PlainResource (line 362) | class PlainResource(Resource):
    method __init__ (line 363) | def __init__(self, path: str, *, name: str | None = None) -> None:
    method canonical (line 369) | def canonical(self) -> str:
    method freeze (line 372) | def freeze(self) -> None:
    method add_prefix (line 376) | def add_prefix(self, prefix: str) -> None:
    method _match (line 382) | def _match(self, path: str) -> dict[str, str] | None:
    method raw_match (line 388) | def raw_match(self, path: str) -> bool:
    method get_info (line 391) | def get_info(self) -> _InfoDict:
    method url_for (line 394) | def url_for(self) -> URL:  # type: ignore[override]
    method __repr__ (line 397) | def __repr__(self) -> str:
  class DynamicResource (line 402) | class DynamicResource(Resource):
    method __init__ (line 407) | def __init__(self, path: str, *, name: str | None = None) -> None:
    method canonical (line 442) | def canonical(self) -> str:
    method add_prefix (line 445) | def add_prefix(self, prefix: str) -> None:
    method _match (line 452) | def _match(self, path: str) -> dict[str, str] | None:
    method raw_match (line 460) | def raw_match(self, path: str) -> bool:
    method get_info (line 463) | def get_info(self) -> _InfoDict:
    method url_for (line 466) | def url_for(self, **parts: str) -> URL:
    method __repr__ (line 470) | def __repr__(self) -> str:
  class PrefixResource (line 475) | class PrefixResource(AbstractResource):
    method __init__ (line 476) | def __init__(self, prefix: str, *, name: str | None = None) -> None:
    method canonical (line 484) | def canonical(self) -> str:
    method add_prefix (line 487) | def add_prefix(self, prefix: str) -> None:
    method raw_match (line 494) | def raw_match(self, prefix: str) -> bool:
  class StaticResource (line 500) | class StaticResource(PrefixResource):
    method __init__ (line 503) | def __init__(
    method url_for (line 539) | def url_for(  # type: ignore[override]
    method _get_file_hash (line 578) | def _get_file_hash(byte_array: bytes) -> str:
    method get_info (line 584) | def get_info(self) -> _InfoDict:
    method set_options_route (line 591) | def set_options_route(self, handler: Handler) -> None:
    method resolve (line 599) | async def resolve(self, request: Request) -> _Resolve:
    method __len__ (line 617) | def __len__(self) -> int:
    method __iter__ (line 620) | def __iter__(self) -> Iterator[AbstractRoute]:
    method _handle (line 623) | async def _handle(self, request: Request) -> StreamResponse:
    method _resolve_path_to_response (line 635) | def _resolve_path_to_response(self, unresolved_path: Path) -> StreamRe...
    method _directory_as_html (line 670) | def _directory_as_html(self, dir_path: Path) -> str:
    method __repr__ (line 702) | def __repr__(self) -> str:
  class PrefixedSubAppResource (line 707) | class PrefixedSubAppResource(PrefixResource):
    method __init__ (line 708) | def __init__(self, prefix: str, app: "Application") -> None:
    method add_prefix (line 713) | def add_prefix(self, prefix: str) -> None:
    method _add_prefix_to_resources (line 717) | def _add_prefix_to_resources(self, prefix: str) -> None:
    method url_for (line 726) | def url_for(self, *args: str, **kwargs: str) -> URL:
    method get_info (line 729) | def get_info(self) -> _InfoDict:
    method resolve (line 732) | async def resolve(self, request: Request) -> _Resolve:
    method __len__ (line 741) | def __len__(self) -> int:
    method __iter__ (line 744) | def __iter__(self) -> Iterator[AbstractRoute]:
    method __repr__ (line 747) | def __repr__(self) -> str:
  class AbstractRuleMatching (line 751) | class AbstractRuleMatching(abc.ABC):
    method match (line 753) | async def match(self, request: Request) -> bool:
    method get_info (line 757) | def get_info(self) -> _InfoDict:
    method canonical (line 762) | def canonical(self) -> str:
  class Domain (line 766) | class Domain(AbstractRuleMatching):
    method __init__ (line 769) | def __init__(self, domain: str) -> None:
    method canonical (line 774) | def canonical(self) -> str:
    method validation (line 777) | def validation(self, domain: str) -> str:
    method match (line 793) | async def match(self, request: Request) -> bool:
    method match_domain (line 799) | def match_domain(self, host: str) -> bool:
    method get_info (line 802) | def get_info(self) -> _InfoDict:
  class MaskDomain (line 806) | class MaskDomain(Domain):
    method __init__ (line 809) | def __init__(self, domain: str) -> None:
    method canonical (line 815) | def canonical(self) -> str:
    method match_domain (line 818) | def match_domain(self, host: str) -> bool:
  class MatchedSubAppResource (line 822) | class MatchedSubAppResource(PrefixedSubAppResource):
    method __init__ (line 823) | def __init__(self, rule: AbstractRuleMatching, app: "Application") -> ...
    method canonical (line 830) | def canonical(self) -> str:
    method get_info (line 833) | def get_info(self) -> _InfoDict:
    method resolve (line 836) | async def resolve(self, request: Request) -> _Resolve:
    method __repr__ (line 847) | def __repr__(self) -> str:
  class ResourceRoute (line 851) | class ResourceRoute(AbstractRoute):
    method __init__ (line 854) | def __init__(
    method __repr__ (line 866) | def __repr__(self) -> str:
    method name (line 870) | def name(self) -> str | None:
    method url_for (line 875) | def url_for(self, *args: str, **kwargs: str) -> URL:
    method get_info (line 880) | def get_info(self) -> _InfoDict:
  class SystemRoute (line 885) | class SystemRoute(AbstractRoute):
    method __init__ (line 886) | def __init__(self, http_exception: HTTPException) -> None:
    method url_for (line 890) | def url_for(self, *args: str, **kwargs: str) -> URL:
    method name (line 894) | def name(self) -> str | None:
    method get_info (line 897) | def get_info(self) -> _InfoDict:
    method _handle (line 900) | async def _handle(self, request: Request) -> StreamResponse:
    method status (line 904) | def status(self) -> int:
    method reason (line 908) | def reason(self) -> str:
    method __repr__ (line 911) | def __repr__(self) -> str:
  class View (line 915) | class View(AbstractView):
    method _iter (line 916) | async def _iter(self) -> StreamResponse:
    method __await__ (line 926) | def __await__(self) -> Generator[None, None, StreamResponse]:
    method _raise_allowed_methods (line 929) | def _raise_allowed_methods(self) -> NoReturn:
  class ResourcesView (line 934) | class ResourcesView(Sized, Iterable[AbstractResource], Container[Abstrac...
    method __init__ (line 935) | def __init__(self, resources: list[AbstractResource]) -> None:
    method __len__ (line 938) | def __len__(self) -> int:
    method __iter__ (line 941) | def __iter__(self) -> Iterator[AbstractResource]:
    method __contains__ (line 944) | def __contains__(self, resource: object) -> bool:
  class RoutesView (line 948) | class RoutesView(Sized, Iterable[AbstractRoute], Container[AbstractRoute]):
    method __init__ (line 949) | def __init__(self, resources: list[AbstractResource]):
    method __len__ (line 955) | def __len__(self) -> int:
    method __iter__ (line 958) | def __iter__(self) -> Iterator[AbstractRoute]:
    method __contains__ (line 961) | def __contains__(self, route: object) -> bool:
  class UrlDispatcher (line 965) | class UrlDispatcher(AbstractRouter, Mapping[str, AbstractResource]):
    method __init__ (line 969) | def __init__(self) -> None:
    method resolve (line 976) | async def resolve(self, request: Request) -> UrlMappingMatchInfo:
    method __iter__ (line 1017) | def __iter__(self) -> Iterator[str]:
    method __len__ (line 1020) | def __len__(self) -> int:
    method __contains__ (line 1023) | def __contains__(self, resource: object) -> bool:
    method __getitem__ (line 1026) | def __getitem__(self, name: str) -> AbstractResource:
    method resources (line 1029) | def resources(self) -> ResourcesView:
    method routes (line 1032) | def routes(self) -> RoutesView:
    method named_resources (line 1035) | def named_resources(self) -> Mapping[str, AbstractResource]:
    method register_resource (line 1038) | def register_resource(self, resource: AbstractResource) -> None:
    method _get_resource_index_key (line 1077) | def _get_resource_index_key(self, resource: AbstractResource) -> str:
    method index_resource (line 1088) | def index_resource(self, resource: AbstractResource) -> None:
    method unindex_resource (line 1096) | def unindex_resource(self, resource: AbstractResource) -> None:
    method add_resource (line 1101) | def add_resource(self, path: str, *, name: str | None = None) -> Resou...
    method add_route (line 1117) | def add_route(
    method add_static (line 1129) | def add_static(
    method add_head (line 1163) | def add_head(self, path: str, handler: Handler, **kwargs: Any) -> Abst...
    method add_options (line 1167) | def add_options(self, path: str, handler: Handler, **kwargs: Any) -> A...
    method add_get (line 1171) | def add_get(
    method add_post (line 1190) | def add_post(self, path: str, handler: Handler, **kwargs: Any) -> Abst...
    method add_put (line 1194) | def add_put(self, path: str, handler: Handler, **kwargs: Any) -> Abstr...
    method add_patch (line 1198) | def add_patch(self, path: str, handler: Handler, **kwargs: Any) -> Abs...
    method add_delete (line 1202) | def add_delete(self, path: str, handler: Handler, **kwargs: Any) -> Ab...
    method add_view (line 1206) | def add_view(
    method freeze (line 1212) | def freeze(self) -> None:
    method add_routes (line 1217) | def add_routes(self, routes: Iterable[AbstractRouteDef]) -> list[Abstr...
  function _quote_path (line 1230) | def _quote_path(value: str) -> str:
  function _unquote_path_safe (line 1234) | def _unquote_path_safe(value: str) -> str:
  function _requote_path (line 1240) | def _requote_path(value: str) -> str:

FILE: aiohttp/web_ws.py
  class WebSocketReady (line 70) | class WebSocketReady:
    method __bool__ (line 74) | def __bool__(self) -> bool:
  class WebSocketResponse (line 78) | class WebSocketResponse(StreamResponse, Generic[_DecodeText]):
    method __init__ (line 99) | def __init__(
    method _cancel_heartbeat (line 129) | def _cancel_heartbeat(self) -> None:
    method _cancel_pong_response_cb (line 142) | def _cancel_pong_response_cb(self) -> None:
    method _on_data_received (line 147) | def _on_data_received(self) -> None:
    method _flush_heartbeat_reset (line 157) | def _flush_heartbeat_reset(self) -> None:
    method _reset_heartbeat (line 164) | def _reset_heartbeat(self) -> None:
    method _send_heartbeat (line 185) | def _send_heartbeat(self) -> None:
    method _ping_task_done (line 226) | def _ping_task_done(self, task: "asyncio.Task[None]") -> None:
    method _pong_not_received (line 232) | def _pong_not_received(self) -> None:
    method _handle_ping_pong_exception (line 240) | def _handle_ping_pong_exception(self, exc: BaseException) -> None:
    method _set_closed (line 250) | def _set_closed(self) -> None:
    method prepare (line 258) | async def prepare(self, request: BaseRequest) -> AbstractStreamWriter:
    method _handshake (line 270) | def _handshake(
    method _pre_start (line 354) | def _pre_start(self, request: BaseRequest) -> tuple[str | None, WebSoc...
    method _post_start (line 375) | def _post_start(
    method can_prepare (line 397) | def can_prepare(self, request: BaseRequest) -> WebSocketReady:
    method prepared (line 408) | def prepared(self) -> bool:
    method closed (line 412) | def closed(self) -> bool:
    method close_code (line 416) | def close_code(self) -> int | None:
    method ws_protocol (line 420) | def ws_protocol(self) -> str | None:
    method compress (line 424) | def compress(self) -> int | bool:
    method get_extra_info (line 427) | def get_extra_info(self, name: str, default: Any = None) -> Any:
    method exception (line 437) | def exception(self) -> BaseException | None:
    method ping (line 440) | async def ping(self, message: bytes = b"") -> None:
    method pong (line 445) | async def pong(self, message: bytes = b"") -> None:
    method send_frame (line 451) | async def send_frame(
    method send_str (line 459) | async def send_str(self, data: str, compress: int | None = None) -> None:
    method send_bytes (line 468) | async def send_bytes(self, data: bytes, compress: int | None = None) -...
    method send_json (line 475) | async def send_json(
    method send_json_bytes (line 484) | async def send_json_bytes(
    method write_eof (line 498) | async def write_eof(self) -> None:  # type: ignore[override]
    method close (line 507) | async def close(
    method _set_closing (line 562) | def _set_closing(self, code: int) -> None:
    method _set_code_close_transport (line 568) | def _set_code_close_transport(self, code: int) -> None:
    method _close_transport (line 573) | def _close_transport(self) -> None:
    method receive (line 579) | async def receive(
    method receive (line 584) | async def receive(
    method receive (line 589) | async def receive(
    method receive (line 593) | async def receive(
    method receive_str (line 669) | async def receive_str(
    method receive_str (line 674) | async def receive_str(
    method receive_str (line 679) | async def receive_str(
    method receive_str (line 683) | async def receive_str(self, *, timeout: float | None = None) -> str | ...
    method receive_bytes (line 695) | async def receive_bytes(self, *, timeout: float | None = None) -> bytes:
    method receive_json (line 704) | async def receive_json(
    method receive_json (line 712) | async def receive_json(
    method receive_json (line 720) | async def receive_json(
    method receive_json (line 727) | async def receive_json(
    method write (line 736) | async def write(
    method __aiter__ (line 741) | def __aiter__(self) -> Self:
    method __anext__ (line 745) | async def __anext__(
    method __anext__ (line 750) | async def __anext__(
    method __anext__ (line 755) | async def __anext__(
    method __anext__ (line 759) | async def __anext__(self) -> WSMessageDecodeText | WSMessageNoDecodeText:
    method _cancel (line 765) | def _cancel(self, exc: BaseException) -> None:

FILE: aiohttp/worker.py
  class GunicornWebWorker (line 33) | class GunicornWebWorker(base.Worker):  # type: ignore[misc,no-any-unimpo...
    method __init__ (line 37) | def __init__(self, *args: Any, **kw: Any) -> None:
    method init_process (line 44) | def init_process(self) -> None:
    method run (line 51) | def run(self) -> None:
    method _run (line 63) | async def _run(self) -> None:
    method _wait_next_notify (line 130) | def _wait_next_notify(self) -> "asyncio.Future[bool]":
    method _notify_waiter_done (line 140) | def _notify_waiter_done(
    method init_signals (line 151) | def init_signals(self) -> None:
    method handle_quit (line 185) | def handle_quit(self, sig: int, frame: FrameType | None) -> None:
    method handle_abort (line 194) | def handle_abort(self, sig: int, frame: FrameType | None) -> None:
    method _create_ssl_context (line 201) | def _create_ssl_context(cfg: Any) -> "SSLContext":
    method _get_valid_log_format (line 218) | def _get_valid_log_format(self, source_format: str) -> str:
  class GunicornUVLoopWebWorker (line 233) | class GunicornUVLoopWebWorker(GunicornWebWorker):
    method init_process (line 234) | def init_process(self) -> None:

FILE: docs/code/client_middleware_cookbook.py
  class SSRFError (line 21) | class SSRFError(ClientError):
  function retry_middleware (line 25) | async def retry_middleware(
  function api_logging_middleware (line 35) | async def api_logging_middleware(
  class TokenRefresh401Middleware (line 46) | class TokenRefresh401Middleware:
    method __init__ (line 47) | def __init__(self, refresh_token: str, access_token: str):
    method __call__ (line 52) | async def __call__(
  class TokenRefreshExpiryMiddleware (line 72) | class TokenRefreshExpiryMiddleware:
    method __init__ (line 73) | def __init__(self, refresh_token: str):
    method __call__ (line 79) | async def __call__(
  function token_refresh_preemptively_example (line 97) | async def token_refresh_preemptively_example() -> None:
  function ssrf_middleware (line 121) | async def ssrf_middleware(
  class SSRFConnector (line 135) | class SSRFConnector(TCPConnector):
    method _resolve_host (line 136) | async def _resolve_host(

FILE: examples/background_tasks.py
  function websocket_handler (line 16) | async def websocket_handler(request: web.Request) -> web.StreamResponse:
  function on_shutdown (line 29) | async def on_shutdown(app: web.Application) -> None:
  function listen_to_valkey (line 34) | async def listen_to_valkey(app: web.Application) -> None:
  function background_tasks (line 49) | async def background_tasks(app: web.Application) -> AsyncIterator[None]:
  function init (line 60) | def init() -> web.Application:

FILE: examples/basic_auth_middleware.py
  class BasicAuthMiddleware (line 31) | class BasicAuthMiddleware:
    method __init__ (line 34) | def __init__(self, username: str, password: str) -> None:
    method _encode_credentials (line 39) | def _encode_credentials(self) -> str:
    method __call__ (line 45) | async def __call__(
  class TestServer (line 59) | class TestServer:
    method handle_basic_auth (line 62) | async def handle_basic_auth(self, request: web.Request) -> web.Response:
    method handle_protected_resource (line 100) | async def handle_protected_resource(self, request: web.Request) -> web...
  function run_test_server (line 119) | async def run_test_server() -> web.AppRunner:
  function run_tests (line 134) | async def run_tests() -> None:
  function main (line 179) | async def main() -> None:

FILE: examples/cli_app.py
  function display_message (line 24) | async def display_message(req: web.Request) -> web.StreamResponse:
  function init (line 30) | def init(argv: Sequence[str] | None) -> web.Application:

FILE: examples/client_auth.py
  function fetch (line 7) | async def fetch(session: aiohttp.ClientSession) -> None:
  function go (line 15) | async def go() -> None:

FILE: examples/client_json.py
  function fetch (line 7) | async def fetch(session: aiohttp.ClientSession) -> None:
  function go (line 15) | async def go() -> None:

FILE: examples/client_ws.py
  function start_client (line 12) | async def start_client(url: str) -> None:

FILE: examples/combined_middleware.py
  class LoggingMiddleware (line 38) | class LoggingMiddleware:
    method __call__ (line 41) | async def __call__(
  class BasicAuthMiddleware (line 66) | class BasicAuthMiddleware:
    method __init__ (line 69) | def __init__(self, username: str, password: str) -> None:
    method _encode_credentials (line 74) | def _encode_credentials(self) -> str:
    method __call__ (line 80) | async def __call__(
  class RetryMiddleware (line 104) | class RetryMiddleware:
    method __init__ (line 107) | def __init__(
    method __call__ (line 119) | async def __call__(
  class TestServer (line 159) | class TestServer:
    method __init__ (line 162) | def __init__(self) -> None:
    method handle_protected (line 166) | async def handle_protected(self, request: web.Request) -> web.Response:
    method handle_flaky (line 208) | async def handle_flaky(self, request: web.Request) -> web.Response:
    method handle_always_fail (line 228) | async def handle_always_fail(self, request: web.Request) -> web.Response:
    method handle_status (line 232) | async def handle_status(self, request: web.Request) -> web.Response:
  function run_test_server (line 238) | async def run_test_server() -> web.AppRunner:
  function run_tests (line 255) | async def run_tests() -> None:
  function main (line 308) | async def main() -> None:

FILE: examples/curl.py
  function curl (line 10) | async def curl(url: str) -> None:

FILE: examples/digest_auth_qop_auth.py
  function main (line 34) | async def main() -> None:

FILE: examples/fake_server.py
  class FakeResolver (line 12) | class FakeResolver(AbstractResolver):
    method __init__ (line 15) | def __init__(self, fakes: dict[str, int]) -> None:
    method resolve (line 20) | async def resolve(
    method close (line 41) | async def close(self) -> None:
  class FakeFacebook (line 45) | class FakeFacebook:
    method __init__ (line 46) | def __init__(self) -> None:
    method start (line 61) | async def start(self) -> dict[str, int]:
    method stop (line 69) | async def stop(self) -> None:
    method on_me (line 72) | async def on_me(self, request: web.Request) -> web.StreamResponse:
    method on_my_friends (line 75) | async def on_my_friends(self, request: web.Request) -> web.StreamRespo...
  function main (line 98) | async def main() -> None:

FILE: examples/logging_middleware.py
  class LoggingMiddleware (line 27) | class LoggingMiddleware:
    method __call__ (line 30) | async def __call__(
  class TestServer (line 59) | class TestServer:
    method handle_hello (line 62) | async def handle_hello(self, request: web.Request) -> web.Response:
    method handle_slow (line 67) | async def handle_slow(self, request: web.Request) -> web.Response:
    method handle_error (line 73) | async def handle_error(self, request: web.Request) -> web.Response:
    method handle_json_data (line 78) | async def handle_json_data(self, request: web.Request) -> web.Response:
  function run_test_server (line 87) | async def run_test_server() -> web.AppRunner:
  function run_tests (line 105) | async def run_tests() -> None:
  function main (line 157) | async def main() -> None:

FILE: examples/lowlevel_srv.py
  function handler (line 6) | async def handler(request: web_request.BaseRequest) -> web.StreamResponse:
  function main (line 10) | async def main(loop: asyncio.AbstractEventLoop) -> None:

FILE: examples/retry_middleware.py
  class RetryMiddleware (line 32) | class RetryMiddleware:
    method __init__ (line 35) | def __init__(
    method __call__ (line 47) | async def __call__(
  class TestServer (line 91) | class TestServer:
    method __init__ (line 94) | def __init__(self) -> None:
    method handle_status (line 103) | async def handle_status(self, request: web.Request) -> web.Response:
    method handle_status_sequence (line 108) | async def handle_status_sequence(self, request: web.Request) -> web.Re...
    method handle_delay (line 138) | async def handle_delay(self, request: web.Request) -> web.Response:
    method handle_reset (line 144) | async def handle_reset(self, request: web.Request) -> web.Response:
  function run_test_server (line 150) | async def run_test_server() -> web.AppRunner:
  function run_tests (line 167) | async def run_tests() -> None:
  function main (line 234) | async def main() -> None:

FILE: examples/server_simple.py
  function handle (line 5) | async def handle(request: web.Request) -> web.StreamResponse:
  function wshandle (line 11) | async def wshandle(request: web.Request) -> web.StreamResponse:

FILE: examples/token_refresh_middleware.py
  class TokenRefreshMiddleware (line 40) | class TokenRefreshMiddleware:
    method __init__ (line 43) | def __init__(self, token_endpoint: str, refresh_token: str) -> None:
    method _refresh_access_token (line 50) | async def _refresh_access_token(self, session: ClientSession) -> str:
    method __call__ (line 88) | async def __call__(
  class TestServer (line 121) | class TestServer:
    method __init__ (line 124) | def __init__(self) -> None:
    method generate_access_token (line 135) | def generate_access_token(self) -> str:
    method _process_token_refresh (line 139) | async def _process_token_refresh(self, data: dict[str, str]) -> web.Re...
    method handle_token_refresh (line 183) | async def handle_token_refresh(self, request: web.Request) -> web.Resp...
    method verify_bearer_token (line 191) | async def verify_bearer_token(
    method handle_protected_resource (line 214) | async def handle_protected_resource(self, request: web.Request) -> web...
    method handle_user_info (line 229) | async def handle_user_info(self, request: web.Request) -> web.Response:
  function run_test_server (line 246) | async def run_test_server() -> web.AppRunner:
  function run_tests (line 261) | async def run_tests() -> None:
  function main (line 326) | async def main() -> None:

FILE: examples/web_classview.py
  class MyView (line 10) | class MyView(web.View):
    method get (line 11) | async def get(self) -> web.StreamResponse:
    method post (line 21) | async def post(self) -> web.StreamResponse:
  function index (line 33) | async def index(request: web.Request) -> web.StreamResponse:
  function init (line 52) | def init() -> web.Application:

FILE: examples/web_cookies.py
  function root (line 19) | async def root(request: web.Request) -> web.StreamResponse:
  function login (line 25) | async def login(request: web.Request) -> NoReturn:
  function logout (line 31) | async def logout(request: web.Request) -> NoReturn:
  function init (line 37) | def init() -> web.Application:

FILE: examples/web_rewrite_headers_middleware.py
  function handler (line 8) | async def handler(request: web.Request) -> web.StreamResponse:
  function middleware (line 12) | async def middleware(request: web.Request, handler: Handler) -> web.Stre...
  function init (line 22) | def init() -> web.Application:

FILE: examples/web_srv.py
  function intro (line 9) | async def intro(request: web.Request) -> web.StreamResponse:
  function simple (line 23) | async def simple(request: web.Request) -> web.StreamResponse:
  function change_body (line 27) | async def change_body(request: web.Request) -> web.StreamResponse:
  function hello (line 34) | async def hello(request: web.Request) -> web.StreamResponse:
  function init (line 46) | def init() -> web.Application:

FILE: examples/web_srv_route_deco.py
  function intro (line 12) | async def intro(request: web.Request) -> web.StreamResponse:
  function simple (line 27) | async def simple(request: web.Request) -> web.StreamResponse:
  function change_body (line 32) | async def change_body(request: web.Request) -> web.StreamResponse:
  function hello (line 40) | async def hello(request: web.Request) -> web.StreamResponse:
  function init (line 52) | def init() -> web.Application:

FILE: examples/web_srv_route_table.py
  function intro (line 9) | async def intro(request: web.Request) -> web.StreamResponse:
  function simple (line 23) | async def simple(request: web.Request) -> web.StreamResponse:
  function change_body (line 27) | async def change_body(request: web.Request) -> web.StreamResponse:
  function hello (line 34) | async def hello(request: web.Request) -> web.StreamResponse:
  function init (line 46) | def init() -> web.Application:

FILE: examples/web_ws.py
  function wshandler (line 16) | async def wshandler(request: web.Request) -> web.WebSocketResponse | web...
  function on_shutdown (line 49) | async def on_shutdown(app: web.Application) -> None:
  function init (line 54) | def init() -> web.Application:

FILE: tests/autobahn/client/client.py
  function client (line 8) | async def client(url: str, name: str) -> None:

FILE: tests/autobahn/server/server.py
  function wshandler (line 10) | async def wshandler(request: web.Request) -> web.WebSocketResponse:
  function on_shutdown (line 27) | async def on_shutdown(app: web.Application) -> None:

FILE: tests/autobahn/test_autobahn.py
  function report_dir (line 23) | def report_dir(tmp_path_factory: TempPathFactory) -> Path:
  function build_autobahn_testsuite (line 28) | def build_autobahn_testsuite() -> Iterator[None]:
  function get_report (line 41) | def get_report(path: Path, result: dict[str, str]) -> dict[str, object] ...
  function get_test_results (line 47) | def get_test_results(path: Path, name: str) -> tuple[Result, ...]:
  function process_xfail (line 54) | def process_xfail(
  function test_client (line 72) | def test_client(report_dir: Path, request: pytest.FixtureRequest) -> None:
  function test_server (line 136) | def test_server(report_dir: Path, request: pytest.FixtureRequest) -> None:

FILE: tests/conftest.py
  function pytest_configure (line 43) | def pytest_configure(config: pytest.Config) -> None:
  function blockbuster (line 76) | def blockbuster(request: pytest.FixtureRequest) -> Iterator[None]:
  function tls_certificate_authority (line 115) | def tls_certificate_authority() -> trustme.CA:
  function tls_certificate (line 120) | def tls_certificate(tls_certificate_authority: trustme.CA) -> trustme.Le...
  function ssl_ctx (line 130) | def ssl_ctx(tls_certificate: trustme.LeafCert) -> ssl.SSLContext:
  function client_ssl_ctx (line 137) | def client_ssl_ctx(tls_certificate_authority: trustme.CA) -> ssl.SSLCont...
  function tls_ca_certificate_pem_path (line 144) | def tls_ca_certificate_pem_path(tls_certificate_authority: trustme.CA) -...
  function tls_certificate_pem_path (line 150) | def tls_certificate_pem_path(tls_certificate: trustme.LeafCert) -> Itera...
  function tls_certificate_pem_bytes (line 156) | def tls_certificate_pem_bytes(tls_certificate: trustme.LeafCert) -> bytes:
  function tls_certificate_fingerprint_sha256 (line 161) | def tls_certificate_fingerprint_sha256(tls_certificate_pem_bytes: bytes)...
  function pipe_name (line 167) | def pipe_name() -> str:
  function create_mocked_conn (line 173) | def create_mocked_conn(
  function unix_sockname (line 186) | def unix_sockname(
  function event_loop (line 256) | async def event_loop(loop: asyncio.AbstractEventLoop) -> asyncio.Abstrac...
  function selector_loop (line 261) | def selector_loop() -> Iterator[asyncio.AbstractEventLoop]:
  function uvloop_loop (line 269) | def uvloop_loop() -> Iterator[asyncio.AbstractEventLoop]:
  function netrc_contents (line 279) | def netrc_contents(
  function netrc_default_contents (line 301) | def netrc_default_contents(monkeypatch: pytest.MonkeyPatch, tmp_path: Pa...
  function no_netrc (line 312) | def no_netrc(monkeypatch: pytest.MonkeyPatch) -> None:
  function netrc_other_host (line 318) | def netrc_other_host(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) ->...
  function netrc_home_directory (line 329) | def netrc_home_directory(monkeypatch: pytest.MonkeyPatch, tmp_path: Path...
  function start_connection (line 346) | def start_connection() -> Iterator[mock.Mock]:
  function key_data (line 357) | def key_data() -> bytes:
  function key (line 362) | def key(key_data: bytes) -> bytes:
  function ws_key (line 367) | def ws_key(key: bytes) -> str:
  function enable_cleanup_closed (line 372) | def enable_cleanup_closed() -> Iterator[None]:
  function unused_port_socket (line 383) | def unused_port_socket() -> Iterator[socket.socket]:
  function parametrize_zlib_backend (line 398) | def parametrize_zlib_backend(
  function cleanup_payload_pending_file_closes (line 410) | async def cleanup_payload_pending_file_closes(
  function make_client_request (line 423) | async def make_client_request(
  function slow_executor (line 471) | def slow_executor() -> Iterator[ThreadPoolExecutor]:

FILE: tests/isolated/check_for_client_response_leak.py
  function main (line 13) | async def main() -> None:

FILE: tests/isolated/check_for_request_leak.py
  function main (line 13) | async def main() -> None:

FILE: tests/test_base_protocol.py
  function test_loop (line 10) | async def test_loop() -> None:
  function test_pause_writing (line 17) | async def test_pause_writing() -> None:
  function test_pause_reading_no_transport (line 27) | async def test_pause_reading_no_transport() -> None:
  function test_pause_reading_stub_transport (line 35) | async def test_pause_reading_stub_transport() -> None:
  function test_resume_reading_no_transport (line 45) | async def test_resume_reading_no_transport() -> None:
  function test_resume_reading_stub_transport (line 53) | async def test_resume_reading_stub_transport() -> None:
  function test_resume_writing_no_waiters (line 63) | async def test_resume_writing_no_waiters() -> None:
  function test_resume_writing_waiter_done (line 72) | async def test_resume_writing_waiter_done() -> None:
  function test_connection_made (line 83) | async def test_connection_made() -> None:
  function test_connection_lost_not_paused (line 92) | async def test_connection_lost_not_paused() -> None:
  function test_connection_lost_paused_without_waiter (line 103) | async def test_connection_lost_paused_without_waiter() -> None:
  function test_connection_lost_waiter_done (line 115) | async def test_connection_lost_waiter_done() -> None:
  function test_drain_lost (line 126) | async def test_drain_lost() -> None:
  function test_drain_not_paused (line 136) | async def test_drain_not_paused() -> None:
  function test_resume_drain_waited (line 146) | async def test_resume_drain_waited() -> None:
  function test_lost_drain_waited_ok (line 162) | async def test_lost_drain_waited_ok() -> None:
  function test_lost_drain_waited_exception (line 178) | async def test_lost_drain_waited_exception() -> None:
  function test_lost_drain_cancelled (line 197) | async def test_lost_drain_cancelled() -> None:
  function test_resume_drain_cancelled (line 221) | async def test_resume_drain_cancelled() -> None:
  function test_parallel_drain_race_condition (line 245) | async def test_parallel_drain_race_condition() -> None:

FILE: tests/test_benchmarks_client.py
  function test_one_hundred_simple_get_requests (line 13) | def test_one_hundred_simple_get_requests(
  function test_one_hundred_simple_get_requests_alternating_clients (line 38) | def test_one_hundred_simple_get_requests_alternating_clients(
  function test_one_hundred_simple_get_requests_no_session (line 68) | def test_one_hundred_simple_get_requests_no_session(
  function test_one_hundred_simple_get_requests_multiple_methods_route (line 94) | def test_one_hundred_simple_get_requests_multiple_methods_route(
  function test_one_hundred_get_requests_with_1024_chunked_payload (line 122) | def test_one_hundred_get_requests_with_1024_chunked_payload(
  function test_one_hundred_get_requests_with_30000_chunked_payload (line 151) | def test_one_hundred_get_requests_with_30000_chunked_payload(
  function test_one_hundred_get_requests_with_512kib_chunked_payload (line 180) | def test_one_hundred_get_requests_with_512kib_chunked_payload(
  function test_one_hundred_get_requests_iter_chunks_on_512kib_chunked_payload (line 209) | def test_one_hundred_get_requests_iter_chunks_on_512kib_chunked_payload(
  function test_get_request_with_251308_compressed_chunked_payload (line 240) | def test_get_request_with_251308_compressed_chunked_payload(
  function test_one_hundred_get_requests_with_1024_content_length_payload (line 274) | def test_one_hundred_get_requests_with_1024_content_length_payload(
  function test_one_hundred_get_requests_with_30000_content_length_payload (line 302) | def test_one_hundred_get_requests_with_30000_content_length_payload(
  function test_one_hundred_get_requests_with_512kib_content_length_payload (line 330) | def test_one_hundred_get_requests_with_512kib_content_length_payload(
  function test_one_hundred_simple_post_requests (line 358) | def test_one_hundred_simple_post_requests(
  function test_one_hundred_json_post_requests (line 383) | def test_one_hundred_json_post_requests(
  function test_ten_streamed_responses_iter_any (line 410) | def test_ten_streamed_responses_iter_any(
  function test_ten_streamed_responses_iter_chunked_4096 (line 442) | def test_ten_streamed_responses_iter_chunked_4096(
  function test_ten_streamed_responses_iter_chunked_65536 (line 474) | def test_ten_streamed_responses_iter_chunked_65536(
  function test_ten_streamed_responses_iter_chunks (line 506) | def test_ten_streamed_responses_iter_chunks(

FILE: tests/test_benchmarks_client_request.py
  function test_client_request_update_cookies (line 27) | async def test_client_request_update_cookies(
  function test_create_client_request_with_cookies (line 43) | def test_create_client_request_with_cookies(
  function test_create_client_request_with_headers (line 85) | def test_create_client_request_with_headers(
  function test_send_client_request_one_hundred (line 124) | def test_send_client_request_one_hundred(

FILE: tests/test_benchmarks_client_ws.py
  function test_one_thousand_round_trip_websocket_text_messages (line 13) | def test_one_thousand_round_trip_websocket_text_messages(
  function test_one_thousand_round_trip_websocket_binary_messages (line 45) | def test_one_thousand_round_trip_websocket_binary_messages(
  function test_one_thousand_large_round_trip_websocket_text_messages (line 78) | def test_one_thousand_large_round_trip_websocket_text_messages(
  function test_client_send_large_websocket_compressed_messages (line 111) | def test_client_send_large_websocket_compressed_messages(
  function test_client_receive_large_websocket_compressed_messages (line 144) | def test_client_receive_large_websocket_compressed_messages(

FILE: tests/test_benchmarks_cookiejar.py
  function test_load_cookies_into_temp_cookiejar (line 11) | async def test_load_cookies_into_temp_cookiejar(benchmark: BenchmarkFixt...

FILE: tests/test_benchmarks_http_websocket.py
  function test_read_large_binary_websocket_messages (line 14) | def test_read_large_binary_websocket_messages(
  function test_read_one_hundred_websocket_text_messages (line 35) | def test_read_one_hundred_websocket_text_messages(
  class MockTransport (line 55) | class MockTransport(asyncio.Transport):
    method is_closing (line 58) | def is_closing(self) -> bool:
    method write (line 62) | def write(self, data: bytes | bytearray | memoryview) -> None:
  class MockProtocol (line 66) | class MockProtocol(BaseProtocol):
    method _drain_helper (line 68) | async def _drain_helper(self) -> None:
  function test_send_one_hundred_websocket_text_messages (line 72) | def test_send_one_hundred_websocket_text_messages(
  function test_send_one_hundred_large_websocket_text_messages (line 88) | def test_send_one_hundred_large_websocket_text_messages(
  function test_send_one_hundred_websocket_text_messages_with_mask (line 104) | def test_send_one_hundred_websocket_text_messages_with_mask(
  function test_send_one_hundred_websocket_compressed_messages (line 121) | def test_send_one_hundred_websocket_compressed_messages(

FILE: tests/test_benchmarks_http_writer.py
  function test_serialize_headers (line 10) | def test_serialize_headers(benchmark: BenchmarkFixture) -> None:

FILE: tests/test_benchmarks_web_fileresponse.py
  function test_simple_web_file_response (line 13) | def test_simple_web_file_response(
  function test_simple_web_file_sendfile_fallback_response (line 39) | def test_simple_web_file_sendfile_fallback_response(
  function test_simple_web_file_response_not_modified (line 68) | def test_simple_web_file_response_not_modified(

FILE: tests/test_benchmarks_web_middleware.py
  function test_ten_web_middlewares (line 12) | def test_ten_web_middlewares(

FILE: tests/test_benchmarks_web_response.py
  function test_simple_web_response (line 8) | def test_simple_web_response(benchmark: BenchmarkFixture) -> None:
  function test_web_response_with_headers (line 18) | def test_web_response_with_headers(benchmark: BenchmarkFixture) -> None:
  function test_web_response_with_bytes_body (line 33) | def test_web_response_with_bytes_body(
  function test_web_response_with_text_body (line 45) | def test_web_response_with_text_body(benchmark: BenchmarkFixture) -> None:
  function test_simple_web_stream_response (line 55) | def test_simple_web_stream_response(benchmark: BenchmarkFixture) -> None:

FILE: tests/test_benchmarks_web_urldispatcher.py
  function github_urls (line 23) | def github_urls() -> list[str]:
  function _mock_request (line 36) | def _mock_request(method: str, path: str) -> web.Request:
  function test_resolve_root_route (line 55) | def test_resolve_root_route(
  function test_resolve_root_route_with_many_fixed_routes (line 87) | def test_resolve_root_route_with_many_fixed_routes(
  function test_resolve_static_root_route (line 125) | def test_resolve_static_root_route(
  function test_resolve_single_fixed_url_with_many_routes (line 155) | def test_resolve_single_fixed_url_with_many_routes(
  function test_resolve_multiple_fixed_url_with_many_routes (line 188) | def test_resolve_multiple_fixed_url_with_many_routes(
  function test_resolve_multiple_level_fixed_url_with_many_routes (line 223) | def test_resolve_multiple_level_fixed_url_with_many_routes(
  function test_resolve_dynamic_resource_url_with_many_static_routes (line 264) | def test_resolve_dynamic_resource_url_with_many_static_routes(
  function test_resolve_dynamic_resource_url_with_many_dynamic_routes (line 303) | def test_resolve_dynamic_resource_url_with_many_dynamic_routes(
  function test_resolve_dynamic_resource_url_with_many_dynamic_routes_with_common_prefix (line 344) | def test_resolve_dynamic_resource_url_with_many_dynamic_routes_with_comm...
  function test_resolve_gitapi (line 381) | def test_resolve_gitapi(
  function test_resolve_gitapi_subapps (line 432) | def test_resolve_gitapi_subapps(
  function test_resolve_gitapi_root (line 503) | def test_resolve_gitapi_root(
  function test_resolve_prefix_resources_many_prefix_many_plain (line 536) | def test_resolve_prefix_resources_many_prefix_many_plain(

FILE: tests/test_circular_imports.py
  function _mark_aiohttp_worker_for_skipping (line 31) | def _mark_aiohttp_worker_for_skipping(
  function _find_all_importables (line 49) | def _find_all_importables(pkg: ModuleType) -> list[str]:
  function _discover_path_importables (line 63) | def _discover_path_importables(
  function test_no_warnings (line 92) | def test_no_warnings(import_path: str) -> None:

FILE: tests/test_classbasedview.py
  function test_ctor (line 9) | def test_ctor() -> None:
  function test_render_ok (line 15) | async def test_render_ok() -> None:
  function test_render_unknown_method (line 28) | async def test_render_unknown_method() -> None:
  function test_render_unsupported_method (line 43) | async def test_render_unsupported_method() -> None:

FILE: tests/test_client_connection.py
  function key (line 14) | def key() -> object:
  function loop (line 19) | def loop() -> Any:
  function connector (line 24) | def connector() -> mock.Mock:
  function protocol (line 29) | def protocol() -> mock.Mock:
  function test_ctor (line 33) | def test_ctor(
  function test_callbacks_on_close (line 44) | def test_callbacks_on_close(
  function test_callbacks_on_release (line 62) | def test_callbacks_on_release(
  function test_callbacks_exception (line 80) | def test_callbacks_exception(
  function test_del (line 102) | def test_del(
  function test_close (line 126) | def test_close(
  function test_release (line 140) | def test_release(
  function test_release_proto_should_close (line 156) | def test_release_proto_should_close(
  function test_release_released (line 173) | def test_release_released(

FILE: tests/test_client_exceptions.py
  class TestClientResponseError (line 11) | class TestClientResponseError:
    method test_default_status (line 19) | def test_default_status(self) -> None:
    method test_status (line 23) | def test_status(self) -> None:
    method test_pickle (line 30) | def test_pickle(self) -> None:
    method test_repr (line 60) | def test_repr(self) -> None:
    method test_str (line 76) | def test_str(self) -> None:
  class TestClientConnectorError (line 87) | class TestClientConnectorError:
    method test_ctor (line 98) | def test_ctor(self) -> None:
    method test_pickle (line 111) | def test_pickle(self) -> None:
    method test_repr (line 129) | def test_repr(self) -> None:
    method test_str (line 138) | def test_str(self) -> None:
  class TestClientConnectorCertificateError (line 148) | class TestClientConnectorCertificateError:
    method test_ctor (line 159) | def test_ctor(self) -> None:
    method test_pickle (line 169) | def test_pickle(self) -> None:
    method test_repr (line 184) | def test_repr(self) -> None:
    method test_str (line 194) | def test_str(self) -> None:
    method test_oserror (line 204) | def test_oserror(self) -> None:
  class TestServerDisconnectedError (line 214) | class TestServerDisconnectedError:
    method test_ctor (line 215) | def test_ctor(self) -> None:
    method test_pickle (line 222) | def test_pickle(self) -> None:
    method test_repr (line 231) | def test_repr(self) -> None:
    method test_str (line 238) | def test_str(self) -> None:
  class TestServerFingerprintMismatch (line 246) | class TestServerFingerprintMismatch:
    method test_ctor (line 247) | def test_ctor(self) -> None:
    method test_pickle (line 256) | def test_pickle(self) -> None:
    method test_repr (line 270) | def test_repr(self) -> None:
  class TestInvalidURL (line 278) | class TestInvalidURL:
    method test_ctor (line 279) | def test_ctor(self) -> None:
    method test_pickle (line 284) | def test_pickle(self) -> None:
    method test_repr_no_description (line 293) | def test_repr_no_description(self) -> None:
    method test_repr_yarl_URL (line 298) | def test_repr_yarl_URL(self) -> None:
    method test_repr_with_description (line 302) | def test_repr_with_description(self) -> None:
    method test_str_no_description (line 306) | def test_str_no_description(self) -> None:
    method test_none_description (line 310) | def test_none_description(self) -> None:
    method test_str_with_description (line 314) | def test_str_with_description(self) -> None:

FILE: tests/test_client_fingerprint.py
  function test_fingerprint_sha256 (line 11) | def test_fingerprint_sha256() -> None:
  function test_fingerprint_sha1 (line 17) | def test_fingerprint_sha1() -> None:
  function test_fingerprint_md5 (line 23) | def test_fingerprint_md5() -> None:
  function test_fingerprint_check_no_ssl (line 29) | def test_fingerprint_check_no_ssl() -> None:

FILE: tests/test_client_functional.py
  function cleanup (line 71) | def cleanup(
  function here (line 78) | def here() -> pathlib.Path:
  function fname (line 83) | def fname(here: pathlib.Path) -> pathlib.Path:
  function headers_echo_client (line 88) | def headers_echo_client(
  function test_keepalive_two_requests_success (line 104) | async def test_keepalive_two_requests_success(aiohttp_client: AiohttpCli...
  function test_keepalive_after_head_requests_success (line 125) | async def test_keepalive_after_head_requests_success(
  function test_keepalive_after_empty_body_status (line 160) | async def test_keepalive_after_empty_body_status(
  function test_keepalive_after_empty_body_status_stream_response (line 194) | async def test_keepalive_after_empty_body_status_stream_response(
  function test_keepalive_response_released (line 227) | async def test_keepalive_response_released(aiohttp_client: AiohttpClient...
  function test_upgrade_connection_not_released_after_read (line 248) | async def test_upgrade_connection_not_released_after_read(
  function test_keepalive_server_force_close_connection (line 269) | async def test_keepalive_server_force_close_connection(
  function test_keepalive_timeout_async_sleep (line 294) | async def test_keepalive_timeout_async_sleep(unused_port_socket: socket....
  function test_keepalive_timeout_sync_sleep (line 327) | async def test_keepalive_timeout_sync_sleep(unused_port_socket: socket.s...
  function test_release_early (line 357) | async def test_release_early(aiohttp_client: AiohttpClient) -> None:
  function test_HTTP_304 (line 373) | async def test_HTTP_304(aiohttp_client: AiohttpClient) -> None:
  function test_stream_request_on_server_eof (line 389) | async def test_stream_request_on_server_eof(aiohttp_client: AiohttpClien...
  function test_stream_request_on_server_eof_nested (line 420) | async def test_stream_request_on_server_eof_nested(
  function test_HTTP_304_WITH_BODY (line 454) | async def test_HTTP_304_WITH_BODY(aiohttp_client: AiohttpClient) -> None:
  function test_auto_header_user_agent (line 470) | async def test_auto_header_user_agent(aiohttp_client: AiohttpClient) -> ...
  function test_skip_auto_headers_user_agent (line 483) | async def test_skip_auto_headers_user_agent(aiohttp_client: AiohttpClien...
  function test_skip_default_auto_headers_user_agent (line 496) | async def test_skip_default_auto_headers_user_agent(
  function test_skip_auto_headers_content_type (line 511) | async def test_skip_auto_headers_content_type(aiohttp_client: AiohttpCli...
  function test_post_data_bytesio (line 524) | async def test_post_data_bytesio(aiohttp_client: AiohttpClient) -> None:
  function test_post_data_with_bytesio_file (line 542) | async def test_post_data_with_bytesio_file(aiohttp_client: AiohttpClient...
  function test_post_data_stringio (line 562) | async def test_post_data_stringio(aiohttp_client: AiohttpClient) -> None:
  function test_post_data_textio_encoding (line 580) | async def test_post_data_textio_encoding(aiohttp_client: AiohttpClient) ...
  function test_post_data_zipfile_filelike (line 598) | async def test_post_data_zipfile_filelike(aiohttp_client: AiohttpClient)...
  function test_post_data_tarfile_filelike (line 621) | async def test_post_data_tarfile_filelike(aiohttp_client: AiohttpClient)...
  function test_post_bytes_data_content_length_from_body (line 653) | async def test_post_bytes_data_content_length_from_body(
  function test_post_custom_payload_without_content_length (line 679) | async def test_post_custom_payload_without_content_length(
  function test_ssl_client (line 708) | async def test_ssl_client(
  function test_ssl_client_shutdown_timeout (line 733) | async def test_ssl_client_shutdown_timeout(
  function test_ssl_client_alpn (line 797) | async def test_ssl_client_alpn(
  function test_tcp_connector_fingerprint_ok (line 821) | async def test_tcp_connector_fingerprint_ok(
  function test_tcp_connector_fingerprint_fail (line 842) | async def test_tcp_connector_fingerprint_fail(
  function test_format_task_get (line 867) | async def test_format_task_get(aiohttp_server: AiohttpServer) -> None:
  function test_str_params (line 882) | async def test_str_params(aiohttp_client: AiohttpClient) -> None:
  function test_params_and_query_string (line 895) | async def test_params_and_query_string(aiohttp_client: AiohttpClient) ->...
  function test_empty_params_and_query_string (line 911) | async def test_empty_params_and_query_string(
  function test_drop_params_on_redirect (line 928) | async def test_drop_params_on_redirect(aiohttp_client: AiohttpClient) ->...
  function test_drop_fragment_on_redirect (line 945) | async def test_drop_fragment_on_redirect(aiohttp_client: AiohttpClient) ...
  function test_drop_fragment (line 962) | async def test_drop_fragment(aiohttp_client: AiohttpClient) -> None:
  function test_history (line 975) | async def test_history(aiohttp_client: AiohttpClient) -> None:
  function test_keepalive_closed_by_server (line 997) | async def test_keepalive_closed_by_server(aiohttp_client: AiohttpClient)...
  function test_wait_for (line 1022) | async def test_wait_for(aiohttp_client: AiohttpClient) -> None:
  function test_raw_headers (line 1036) | async def test_raw_headers(aiohttp_client: AiohttpClient) -> None:
  function test_host_header_first (line 1054) | async def test_host_header_first(aiohttp_client: AiohttpClient) -> None:
  function test_empty_header_values (line 1066) | async def test_empty_header_values(aiohttp_client: AiohttpClient) -> None:
  function test_204_with_gzipped_content_encoding (line 1086) | async def test_204_with_gzipped_content_encoding(aiohttp_client: Aiohttp...
  function test_timeout_on_reading_headers (line 1105) | async def test_timeout_on_reading_headers(
  function test_timeout_on_conn_reading_headers (line 1120) | async def test_timeout_on_conn_reading_headers(
  function test_timeout_on_session_read_timeout (line 1139) | async def test_timeout_on_session_read_timeout(
  function test_read_timeout_between_chunks (line 1158) | async def test_read_timeout_between_chunks(
  function test_read_timeout_on_reading_chunks (line 1184) | async def test_read_timeout_on_reading_chunks(
  function test_read_timeout_on_write (line 1207) | async def test_read_timeout_on_write(aiohttp_client: AiohttpClient) -> N...
  function test_timeout_on_reading_data (line 1226) | async def test_timeout_on_reading_data(
  function test_timeout_none (line 1251) | async def test_timeout_none(
  function test_connection_timeout_error (line 1267) | async def test_connection_timeout_error(
  function test_readline_error_on_conn_close (line 1291) | async def test_readline_error_on_conn_close(aiohttp_client: AiohttpClien...
  function test_no_error_on_conn_close_if_eof (line 1324) | async def test_no_error_on_conn_close_if_eof(aiohttp_client: AiohttpClie...
  function test_error_not_overwrote_on_conn_close (line 1349) | async def test_error_not_overwrote_on_conn_close(aiohttp_client: Aiohttp...
  function test_HTTP_200_OK_METHOD (line 1367) | async def test_HTTP_200_OK_METHOD(aiohttp_client: AiohttpClient) -> None:
  function test_HTTP_200_OK_METHOD_connector (line 1392) | async def test_HTTP_200_OK_METHOD_connector(aiohttp_client: AiohttpClien...
  function test_HTTP_302_REDIRECT_GET (line 1419) | async def test_HTTP_302_REDIRECT_GET(aiohttp_client: AiohttpClient) -> N...
  function test_HTTP_302_REDIRECT_HEAD (line 1436) | async def test_HTTP_302_REDIRECT_HEAD(aiohttp_client: AiohttpClient) -> ...
  function test_HTTP_302_REDIRECT_NON_HTTP (line 1456) | async def test_HTTP_302_REDIRECT_NON_HTTP(aiohttp_client: AiohttpClient)...
  function test_HTTP_302_REDIRECT_POST (line 1468) | async def test_HTTP_302_REDIRECT_POST(aiohttp_client: AiohttpClient) -> ...
  function test_HTTP_302_REDIRECT_POST_with_content_length_hdr (line 1487) | async def test_HTTP_302_REDIRECT_POST_with_content_length_hdr(
  function test_HTTP_307_REDIRECT_POST (line 1512) | async def test_HTTP_307_REDIRECT_POST(aiohttp_client: AiohttpClient) -> ...
  function test_HTTP_308_PERMANENT_REDIRECT_POST (line 1532) | async def test_HTTP_308_PERMANENT_REDIRECT_POST(aiohttp_client: AiohttpC...
  function test_HTTP_302_max_redirects (line 1552) | async def test_HTTP_302_max_redirects(aiohttp_client: AiohttpClient) -> ...
  function test_HTTP_200_GET_WITH_PARAMS (line 1573) | async def test_HTTP_200_GET_WITH_PARAMS(aiohttp_client: AiohttpClient) -...
  function test_HTTP_200_GET_WITH_MultiDict_PARAMS (line 1589) | async def test_HTTP_200_GET_WITH_MultiDict_PARAMS(
  function test_HTTP_200_GET_WITH_MIXED_PARAMS (line 1608) | async def test_HTTP_200_GET_WITH_MIXED_PARAMS(aiohttp_client: AiohttpCli...
  function test_POST_DATA (line 1624) | async def test_POST_DATA(aiohttp_client: AiohttpClient) -> None:
  function test_POST_DATA_with_explicit_formdata (line 1639) | async def test_POST_DATA_with_explicit_formdata(aiohttp_client: AiohttpC...
  function test_POST_DATA_with_charset (line 1657) | async def test_POST_DATA_with_charset(aiohttp_client: AiohttpClient) -> ...
  function test_POST_DATA_formdats_with_charset (line 1678) | async def test_POST_DATA_formdats_with_charset(aiohttp_client: AiohttpCl...
  function test_POST_DATA_with_charset_post (line 1698) | async def test_POST_DATA_with_charset_post(aiohttp_client: AiohttpClient...
  function test_POST_MultiDict (line 1717) | async def test_POST_MultiDict(aiohttp_client: AiohttpClient) -> None:
  function test_GET_DEFLATE (line 1733) | async def test_GET_DEFLATE(aiohttp_client: AiohttpClient) -> None:
  function test_GET_DEFLATE_no_body (line 1753) | async def test_GET_DEFLATE_no_body(aiohttp_client: AiohttpClient) -> None:
  function test_POST_DATA_DEFLATE (line 1771) | async def test_POST_DATA_DEFLATE(aiohttp_client: AiohttpClient) -> None:
  function test_POST_FILES (line 1787) | async def test_POST_FILES(aiohttp_client: AiohttpClient, fname: pathlib....
  function test_POST_FILES_DEFLATE (line 1814) | async def test_POST_FILES_DEFLATE(
  function test_POST_bytes (line 1839) | async def test_POST_bytes(aiohttp_client: AiohttpClient) -> None:
  function test_POST_bytes_too_large (line 1855) | async def test_POST_bytes_too_large(aiohttp_client: AiohttpClient) -> None:
  function test_POST_FILES_STR (line 1872) | async def test_POST_FILES_STR(
  function test_POST_FILES_STR_SIMPLE (line 1892) | async def test_POST_FILES_STR_SIMPLE(
  function test_POST_FILES_LIST (line 1911) | async def test_POST_FILES_LIST(
  function test_POST_FILES_CT (line 1933) | async def test_POST_FILES_CT(
  function test_POST_FILES_SINGLE (line 1958) | async def test_POST_FILES_SINGLE(
  function test_POST_FILES_SINGLE_content_disposition (line 1986) | async def test_POST_FILES_SINGLE_content_disposition(
  function test_POST_FILES_SINGLE_BINARY (line 2018) | async def test_POST_FILES_SINGLE_BINARY(
  function test_POST_FILES_IO (line 2045) | async def test_POST_FILES_IO(aiohttp_client: AiohttpClient) -> None:
  function test_POST_FILES_IO_WITH_PARAMS (line 2064) | async def test_POST_FILES_IO_WITH_PARAMS(aiohttp_client: AiohttpClient) ...
  function test_POST_FILES_WITH_DATA (line 2089) | async def test_POST_FILES_WITH_DATA(
  function test_POST_STREAM_DATA (line 2118) | async def test_POST_STREAM_DATA(
  function test_json (line 2150) | async def test_json(aiohttp_client: AiohttpClient) -> None:
  function test_json_custom (line 2169) | async def test_json_custom(aiohttp_client: AiohttpClient) -> None:
  function test_json_serialize_bytes (line 2196) | async def test_json_serialize_bytes(aiohttp_client: AiohttpClient) -> None:
  function test_expect_continue (line 2217) | async def test_expect_continue(aiohttp_client: AiohttpClient) -> None:
  function test_expect100_with_no_body (line 2242) | async def test_expect100_with_no_body(aiohttp_client: AiohttpClient) -> ...
  function test_expect100_continue_with_none_payload (line 2258) | async def test_expect100_continue_with_none_payload(
  function test_encoding_deflate (line 2288) | async def test_encoding_deflate(
  function test_encoding_deflate_nochunk (line 2308) | async def test_encoding_deflate_nochunk(
  function test_encoding_gzip (line 2327) | async def test_encoding_gzip(
  function test_encoding_gzip_write_by_chunks (line 2347) | async def test_encoding_gzip_write_by_chunks(
  function test_encoding_gzip_nochunk (line 2369) | async def test_encoding_gzip_nochunk(
  function test_bad_payload_compression (line 2387) | async def test_bad_payload_compression(aiohttp_client: AiohttpClient) ->...
  function test_payload_decompress_size_limit (line 2404) | async def test_payload_decompress_size_limit(aiohttp_client: AiohttpClie...
  function test_payload_decompress_size_limit_brotli (line 2438) | async def test_payload_decompress_size_limit_brotli(
  function test_payload_decompress_size_limit_zstd (line 2468) | async def test_payload_decompress_size_limit_zstd(
  function test_bad_payload_chunked_encoding (line 2498) | async def test_bad_payload_chunked_encoding(aiohttp_client: AiohttpClien...
  function test_no_payload_304_with_chunked_encoding (line 2521) | async def test_no_payload_304_with_chunked_encoding(
  function test_head_request_with_chunked_encoding (line 2547) | async def test_head_request_with_chunked_encoding(
  function test_no_payload_200_with_chunked_encoding (line 2573) | async def test_no_payload_200_with_chunked_encoding(
  function test_bad_payload_content_length (line 2599) | async def test_bad_payload_content_length(aiohttp_client: AiohttpClient)...
  function test_payload_content_length_by_chunks (line 2617) | async def test_payload_content_length_by_chunks(aiohttp_client: AiohttpC...
  function test_chunked (line 2636) | async def test_chunked(aiohttp_client: AiohttpClient) -> None:
  function test_shortcuts (line 2653) | async def test_shortcuts(aiohttp_client: AiohttpClient) -> None:
  function test_cookies (line 2680) | async def test_cookies(aiohttp_client: AiohttpClient) -> None:
  function test_cookies_per_request (line 2698) | async def test_cookies_per_request(aiohttp_client: AiohttpClient) -> None:
  function test_cookies_redirect (line 2723) | async def test_cookies_redirect(aiohttp_client: AiohttpClient) -> None:
  function test_cookies_on_empty_session_jar (line 2749) | async def test_cookies_on_empty_session_jar(aiohttp_client: AiohttpClien...
  function test_cookies_is_quoted_with_special_characters (line 2763) | async def test_cookies_is_quoted_with_special_characters(
  function test_morsel_with_attributes (line 2780) | async def test_morsel_with_attributes(aiohttp_client: AiohttpClient) -> ...
  function test_set_cookies (line 2809) | async def test_set_cookies(
  function test_set_cookies_with_curly_braces (line 2837) | async def test_set_cookies_with_curly_braces(aiohttp_client: AiohttpClie...
  function test_set_cookies_expired (line 2861) | async def test_set_cookies_expired(aiohttp_client: AiohttpClient) -> None:
  function test_set_cookies_max_age (line 2882) | async def test_set_cookies_max_age(aiohttp_client: AiohttpClient) -> None:
  function test_set_cookies_max_age_overflow (line 2903) | async def test_set_cookies_max_age_overflow(aiohttp_client: AiohttpClien...
  function test_request_conn_error (line 2934) | async def test_request_conn_error() -> None:
  function test_broken_connection (line 2941) | async def test_broken_connection(aiohttp_client: AiohttpClient) -> None:
  function test_broken_connection_2 (line 2955) | async def test_broken_connection_2(aiohttp_client: AiohttpClient) -> None:
  function test_custom_headers (line 2973) | async def test_custom_headers(aiohttp_client: AiohttpClient) -> None:
  function test_redirect_to_absolute_url (line 2988) | async def test_redirect_to_absolute_url(aiohttp_client: AiohttpClient) -...
  function test_redirect_without_location_header (line 3004) | async def test_redirect_without_location_header(aiohttp_client: AiohttpC...
  function test_invalid_and_non_http_url (line 3059) | async def test_invalid_and_non_http_url(
  function test_invalid_redirect_url (line 3083) | async def test_invalid_redirect_url(
  function test_invalid_redirect_url_multiple_redirects (line 3118) | async def test_invalid_redirect_url_multiple_redirects(
  function test_ok_from_status (line 3156) | async def test_ok_from_status(
  function test_raise_for_status (line 3169) | async def test_raise_for_status(aiohttp_client: AiohttpClient) -> None:
  function test_raise_for_status_per_request (line 3181) | async def test_raise_for_status_per_request(aiohttp_client: AiohttpClien...
  function test_raise_for_status_disable_per_request (line 3193) | async def test_raise_for_status_disable_per_request(
  function test_request_raise_for_status_default (line 3207) | async def test_request_raise_for_status_default(aiohttp_server: AiohttpS...
  function test_request_raise_for_status_disabled (line 3219) | async def test_request_raise_for_status_disabled(aiohttp_server: Aiohttp...
  function test_request_raise_for_status_enabled (line 3232) | async def test_request_raise_for_status_enabled(aiohttp_server: AiohttpS...
  function test_session_raise_for_status_coro (line 3246) | async def test_session_raise_for_status_coro(aiohttp_client: AiohttpClie...
  function test_request_raise_for_status_coro (line 3270) | async def test_request_raise_for_status_coro(aiohttp_client: AiohttpClie...
  function test_invalid_idna (line 3294) | async def test_invalid_idna() -> None:
  function test_creds_in_auth_and_url (line 3300) | async def test_creds_in_auth_and_url() -> None:
  function test_creds_in_auth_and_redirect_url (line 3308) | async def test_creds_in_auth_and_redirect_url(
  function create_server_for_url_and_handler (line 3372) | def create_server_for_url_and_handler(
  function test_drop_auth_on_redirect_to_other_host (line 3409) | async def test_drop_auth_on_redirect_to_other_host(
  function test_auth_persist_on_redirect_to_other_host_with_global_auth (line 3494) | async def test_auth_persist_on_redirect_to_other_host_with_global_auth(
  function test_drop_auth_on_redirect_to_other_host_with_global_auth_and_base_url (line 3559) | async def test_drop_auth_on_redirect_to_other_host_with_global_auth_and_...
  function test_async_with_session (line 3626) | async def test_async_with_session() -> None:
  function test_session_close_awaitable (line 3633) | async def test_session_close_awaitable() -> None:
  function test_close_resp_on_error_async_with_session (line 3640) | async def test_close_resp_on_error_async_with_session(
  function test_release_resp_on_normal_exit_from_cm (line 3663) | async def test_release_resp_on_normal_exit_from_cm(
  function test_non_close_detached_session_on_error_cm (line 3681) | async def test_non_close_detached_session_on_error_cm(
  function test_close_detached_session_on_non_existing_addr (line 3704) | async def test_close_detached_session_on_non_existing_addr() -> None:
  function test_aiohttp_request_context_manager (line 3730) | async def test_aiohttp_request_context_manager(aiohttp_server: AiohttpSe...
  function test_aiohttp_request_ctx_manager_close_sess_on_error (line 3743) | async def test_aiohttp_request_ctx_manager_close_sess_on_error(
  function test_aiohttp_request_ctx_manager_not_found (line 3765) | async def test_aiohttp_request_ctx_manager_not_found() -> None:
  function test_raising_client_connector_dns_error_on_dns_failure (line 3771) | async def test_raising_client_connector_dns_error_on_dns_failure() -> None:
  function test_aiohttp_request_coroutine (line 3782) | async def test_aiohttp_request_coroutine(aiohttp_server: AiohttpServer) ...
  function test_aiohttp_request_ssl (line 3806) | async def test_aiohttp_request_ssl(
  function test_yield_from_in_session_request (line 3822) | async def test_yield_from_in_session_request(aiohttp_client: AiohttpClie...
  function test_session_auth (line 3835) | async def test_session_auth(
  function test_session_auth_override (line 3848) | async def test_session_auth_override(
  function test_session_auth_header_conflict (line 3862) | async def test_session_auth_header_conflict(aiohttp_client: AiohttpClien...
  function test_netrc_auth_from_env (line 3876) | async def test_netrc_auth_from_env(  # type: ignore[misc]
  function test_netrc_auth_skipped_without_netrc_file (line 3891) | async def test_netrc_auth_skipped_without_netrc_file(  # type: ignore[misc]
  function test_netrc_auth_from_home_directory (line 3906) | async def test_netrc_auth_from_home_directory(  # type: ignore[misc]
  function test_netrc_auth_overridden_by_explicit_auth (line 3920) | async def test_netrc_auth_overridden_by_explicit_auth(  # type: ignore[m...
  function test_session_headers (line 3940) | async def test_session_headers(
  function test_session_headers_merge (line 3953) | async def test_session_headers_merge(
  function test_multidict_headers (line 3969) | async def test_multidict_headers(aiohttp_client: AiohttpClient) -> None:
  function test_request_conn_closed (line 3987) | async def test_request_conn_closed(aiohttp_client: AiohttpClient) -> None:
  function test_dont_close_explicit_connector (line 4004) | async def test_dont_close_explicit_connector(aiohttp_client: AiohttpClie...
  function test_server_close_keepalive_connection (line 4019) | async def test_server_close_keepalive_connection() -> None:
  function test_handle_keepalive_on_closed_connection (line 4060) | async def test_handle_keepalive_on_closed_connection() -> None:
  function test_error_in_performing_request (line 4101) | async def test_error_in_performing_request(
  function test_await_after_cancelling (line 4131) | async def test_await_after_cancelling(aiohttp_client: AiohttpClient) -> ...
  function test_async_payload_generator (line 4164) | async def test_async_payload_generator(aiohttp_client: AiohttpClient) ->...
  function test_read_from_closed_response (line 4183) | async def test_read_from_closed_response(aiohttp_client: AiohttpClient) ...
  function test_read_from_closed_response2 (line 4199) | async def test_read_from_closed_response2(aiohttp_client: AiohttpClient)...
  function test_json_from_closed_response (line 4216) | async def test_json_from_closed_response(aiohttp_client: AiohttpClient) ...
  function test_text_from_closed_response (line 4234) | async def test_text_from_closed_response(aiohttp_client: AiohttpClient) ...
  function test_read_after_catch_raise_for_status (line 4252) | async def test_read_after_catch_raise_for_status(aiohttp_client: Aiohttp...
  function test_read_after_raise_outside_context (line 4270) | async def test_read_after_raise_outside_context(aiohttp_client: AiohttpC...
  function test_read_from_closed_content (line 4288) | async def test_read_from_closed_content(aiohttp_client: AiohttpClient) -...
  function test_read_timeout (line 4304) | async def test_read_timeout(aiohttp_client: AiohttpClient) -> None:
  function test_socket_timeout (line 4319) | async def test_socket_timeout(aiohttp_client: AiohttpClient) -> None:
  function test_read_timeout_closes_connection (line 4334) | async def test_read_timeout_closes_connection(aiohttp_client: AiohttpCli...
  function test_read_timeout_on_prepared_response (line 4368) | async def test_read_timeout_on_prepared_response(aiohttp_client: Aiohttp...
  function test_timeout_with_full_buffer (line 4386) | async def test_timeout_with_full_buffer(aiohttp_client: AiohttpClient) -...
  function test_read_bufsize_session_default (line 4410) | async def test_read_bufsize_session_default(aiohttp_client: AiohttpClien...
  function test_read_bufsize_explicit (line 4423) | async def test_read_bufsize_explicit(aiohttp_client: AiohttpClient) -> N...
  function test_http_empty_data_text (line 4436) | async def test_http_empty_data_text(aiohttp_client: AiohttpClient) -> None:
  function test_max_field_size_session_default (line 4455) | async def test_max_field_size_session_default(aiohttp_client: AiohttpCli...
  function test_max_field_size_session_default_fail (line 4468) | async def test_max_field_size_session_default_fail(
  function test_max_field_size_session_explicit (line 4482) | async def test_max_field_size_session_explicit(aiohttp_client: AiohttpCl...
  function test_max_headers_session_default (line 4495) | async def test_max_headers_session_default(aiohttp_client: AiohttpClient...
  function test_max_headers_session_default_fail (line 4508) | async def test_max_headers_session_default_fail(
  function test_max_headers_session_explicit (line 4522) | async def test_max_headers_session_explicit(aiohttp_client: AiohttpClien...
  function test_max_headers_request_explicit (line 4535) | async def test_max_headers_request_explicit(aiohttp_client: AiohttpClien...
  function test_max_field_size_request_explicit (line 4548) | async def test_max_field_size_request_explicit(aiohttp_client: AiohttpCl...
  function test_max_line_size_session_default (line 4561) | async def test_max_line_size_session_default(aiohttp_client: AiohttpClie...
  function test_max_line_size_session_default_fail (line 4574) | async def test_max_line_size_session_default_fail(
  function test_max_line_size_session_explicit (line 4588) | async def test_max_line_size_session_explicit(aiohttp_client: AiohttpCli...
  function test_max_line_size_request_explicit (line 4601) | async def test_max_line_size_request_explicit(aiohttp_client: AiohttpCli...
  function test_rejected_upload (line 4614) | async def test_rejected_upload(
  function test_request_with_wrong_ssl_type (line 4641) | async def test_request_with_wrong_ssl_type(aiohttp_client: AiohttpClient...
  function test_request_with_wrong_proxy (line 4653) | async def test_request_with_wrong_proxy(
  function test_raise_for_status_is_none (line 4663) | async def test_raise_for_status_is_none(aiohttp_client: AiohttpClient) -...
  function test_header_too_large_error (line 4674) | async def test_header_too_large_error(aiohttp_client: AiohttpClient) -> ...
  function test_exception_when_read_outside_of_session (line 4691) | async def test_exception_when_read_outside_of_session(
  function test_content_length_limit_enforced (line 4708) | async def test_content_length_limit_enforced(aiohttp_server: AiohttpServ...
  function test_content_length_limit_with_multiple_reads (line 4736) | async def test_content_length_limit_with_multiple_reads(
  function test_post_connection_cleanup_with_bytesio (line 4778) | async def test_post_connection_cleanup_with_bytesio(
  function test_post_connection_cleanup_with_file (line 4813) | async def test_post_connection_cleanup_with_file(
  function test_post_content_exception_connection_kept (line 4853) | async def test_post_content_exception_connection_kept(
  function test_network_error_connection_closed (line 4888) | async def test_network_error_connection_closed(
  function test_client_side_network_error_connection_closed (line 4927) | async def test_client_side_network_error_connection_closed(
  function test_empty_response_non_chunked (line 4978) | async def test_empty_response_non_chunked(aiohttp_client: AiohttpClient)...
  function test_set_eof_on_empty_response (line 4997) | async def test_set_eof_on_empty_response(aiohttp_client: AiohttpClient) ...
  function test_bytes_payload_redirect (line 5015) | async def test_bytes_payload_redirect(aiohttp_client: AiohttpClient) -> ...
  function test_string_payload_redirect (line 5047) | async def test_string_payload_redirect(aiohttp_client: AiohttpClient) ->...
  function test_async_iterable_payload_redirect (line 5079) | async def test_async_iterable_payload_redirect(aiohttp_client: AiohttpCl...
  function test_async_iterable_payload_redirect_non_post_301_302 (line 5120) | async def test_async_iterable_payload_redirect_non_post_301_302(
  function test_buffered_reader_payload_redirect (line 5154) | async def test_buffered_reader_payload_redirect(aiohttp_client: AiohttpC...
  function test_string_io_payload_redirect (line 5187) | async def test_string_io_payload_redirect(aiohttp_client: AiohttpClient)...
  function test_bytes_io_payload_redirect (line 5220) | async def test_bytes_io_payload_redirect(aiohttp_client: AiohttpClient) ...
  function test_multiple_redirects_with_bytes_payload (line 5253) | async def test_multiple_redirects_with_bytes_payload(
  function test_redirect_with_empty_payload (line 5298) | async def test_redirect_with_empty_payload(aiohttp_client: AiohttpClient...
  function test_redirect_preserves_content_type (line 5326) | async def test_redirect_preserves_content_type(aiohttp_client: AiohttpCl...
  class MockedBytesPayload (line 5355) | class MockedBytesPayload(BytesPayload):
    method __init__ (line 5358) | def __init__(self, data: bytes) -> None:
    method close (line 5362) | async def close(self) -> None:
  function test_too_many_redirects_closes_payload (line 5367) | async def test_too_many_redirects_closes_payload(aiohttp_client: Aiohttp...
  function test_invalid_url_redirect_closes_payload (line 5395) | async def test_invalid_url_redirect_closes_payload(
  function test_non_http_redirect_closes_payload (line 5428) | async def test_non_http_redirect_closes_payload(aiohttp_client: AiohttpC...
  function test_invalid_redirect_origin_closes_payload (line 5455) | async def test_invalid_redirect_origin_closes_payload(
  function test_amazon_like_cookie_scenario (line 5484) | async def test_amazon_like_cookie_scenario(aiohttp_client: AiohttpClient...
  function test_file_upload_307_308_redirect (line 5630) | async def test_file_upload_307_308_redirect(
  function test_file_upload_301_302_redirect_non_post (line 5695) | async def test_file_upload_301_302_redirect_non_post(
  function test_file_upload_307_302_redirect_chain (line 5759) | async def test_file_upload_307_302_redirect_chain(
  function test_stream_reader_total_raw_bytes (line 5854) | async def test_stream_reader_total_raw_bytes(aiohttp_client: AiohttpClie...

FILE: tests/test_client_middleware.py
  class BlockedByMiddleware (line 27) | class BlockedByMiddleware(ClientError):
  function test_client_middleware_called (line 31) | async def test_client_middleware_called(aiohttp_server: AiohttpServer) -...
  function test_client_middleware_retry (line 63) | async def test_client_middleware_retry(aiohttp_server: AiohttpServer) ->...
  function test_client_middleware_per_request (line 97) | async def test_client_middleware_per_request(aiohttp_server: AiohttpServ...
  function test_multiple_client_middlewares (line 147) | async def test_multiple_client_middlewares(aiohttp_server: AiohttpServer...
  function test_client_middleware_auth_example (line 183) | async def test_client_middleware_auth_example(aiohttp_server: AiohttpSer...
  function test_client_middleware_challenge_auth (line 217) | async def test_client_middleware_challenge_auth(aiohttp_server: AiohttpS...
  function test_client_middleware_multi_step_auth (line 285) | async def test_client_middleware_multi_step_auth(aiohttp_server: Aiohttp...
  function test_client_middleware_conditional_retry (line 370) | async def test_client_middleware_conditional_retry(
  function test_bu
Condensed preview — 437 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,274K chars).
[
  {
    "path": ".cherry_picker.toml",
    "chars": 113,
    "preview": "team = \"aio-libs\"\nrepo = \"aiohttp\"\ncheck_sha = \"f382b5ffc445e45a110734f5396728da7914aeb6\"\nfix_commit_msg = false\n"
  },
  {
    "path": ".codecov.yml",
    "chars": 705,
    "preview": "codecov:\n  branch: master\n  notify:\n    manual_trigger: true\n\ncomment:\n  require_head: false\n  require_base: false\n\ncove"
  },
  {
    "path": ".coveragerc.toml",
    "chars": 458,
    "preview": "[run]\nbranch = true\n# NOTE: `ctrace` tracing method is needed because the `sysmon` tracer\n# NOTE: which is default on Py"
  },
  {
    "path": ".editorconfig",
    "chars": 376,
    "preview": "# EditorConfig is awesome: http://EditorConfig.org\n\n# top-most EditorConfig file\nroot = true\n\n# Unix-style newlines with"
  },
  {
    "path": ".git-blame-ignore-revs",
    "chars": 1337,
    "preview": "# git hyper-blame master ignore list.\n#\n# This file contains a list of git hashes of revisions to be ignored by git\n# hy"
  },
  {
    "path": ".gitattributes",
    "chars": 58,
    "preview": "tests/data.unknown_mime_type binary\ntests/sample.* binary\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "chars": 590,
    "preview": "* @asvetlov\n/.github/* @webknjaz @asvetlov\n/.circleci/* @webknjaz @asvetlov\n/CHANGES/* @asvetlov\n/docs/* @asvetlov\n/exam"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 214,
    "preview": "---\n\ngithub:\n- asvetlov\n- webknjaz\n- Dreamsorcerer\nopen_collective: aiohttp\ntidelift: pypi/aiohttp  # A single Tidelift "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "chars": 3704,
    "preview": "---\nname: Bug Report\ndescription: Create a report to help us improve.\nlabels: [bug]\nassignees: aio-libs/triagers\nbody:\n-"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 560,
    "preview": "# Ref: https://help.github.com/en/github/building-a-strong-community/configuring-issue-templates-for-your-repository#con"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "chars": 1933,
    "preview": "---\nname: 🚀 Feature request\ndescription: Suggest an idea for this project.\nlabels: enhancement\nbody:\n- type: markdown\n  "
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "chars": 913,
    "preview": "## Long story short\n\n<!-- Please describe your problem and why the fix is important. -->\n\n## Expected behaviour\n\n<!-- Wh"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 2808,
    "preview": "<!-- Thank you for your contribution! -->\n\n## What do these changes do?\n\n<!-- Please give a short brief about these chan"
  },
  {
    "path": ".github/codeql.yml",
    "chars": 107,
    "preview": "query-filters:\n  - exclude:\n      id:\n        - py/ineffectual-statement\n        - py/unsafe-cyclic-import\n"
  },
  {
    "path": ".github/config.yml",
    "chars": 121,
    "preview": "chronographer:\n  exclude:\n    bots:\n    - dependabot-preview\n    - dependabot\n    - patchback\n    humans:\n    - pyup-bot"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 1261,
    "preview": "version: 2\nupdates:\n\n  # Maintain dependencies for GitHub Actions\n  - package-ecosystem: \"github-actions\"\n    directory:"
  },
  {
    "path": ".github/lock.yml",
    "chars": 1054,
    "preview": "# Configuration for Lock Threads - https://github.com/dessant/lock-threads\n# GitHub App - https://github.com/apps/lock\n\n"
  },
  {
    "path": ".github/workflows/auto-merge.yml",
    "chars": 604,
    "preview": "name: Dependabot auto-merge\non: pull_request_target\n\npermissions:\n  pull-requests: write\n  contents: write\n\njobs:\n  depe"
  },
  {
    "path": ".github/workflows/ci-cd.yml",
    "chars": 19096,
    "preview": "name: CI\n\non:\n  merge_group:\n  push:\n    branches:\n      - 'master'\n      - '[0-9].[0-9]+'  # matches to backport branch"
  },
  {
    "path": ".github/workflows/codeql.yml",
    "chars": 1043,
    "preview": "name: \"CodeQL\"\n\non:\n  push:\n    branches:\n      - 'master'\n      - '[0-9].[0-9]+'  # matches to backport branches, e.g. "
  },
  {
    "path": ".github/workflows/label-remove.yml",
    "chars": 481,
    "preview": "name: Clear needs-info/pr-unfinished on activity\non:\n  pull_request:\n    types: [synchronize, review_requested]\n  issue_"
  },
  {
    "path": ".github/workflows/labels.yml",
    "chars": 717,
    "preview": "name: Labels\non:\n  pull_request:\n    branches:\n      - 'master'\n    types: [labeled, opened, synchronize, reopened, unla"
  },
  {
    "path": ".github/workflows/stale.yml",
    "chars": 266,
    "preview": "name: 'Close stale issues'\non:\n  schedule:\n    - cron: '50 5 * * *'\n\npermissions:\n  issues: write\n\njobs:\n  stale:\n    ru"
  },
  {
    "path": ".gitignore",
    "chars": 760,
    "preview": "*.bak\n*.egg\n*.egg-info\n*.eggs\n*.md5\n*.pyc\n*.pyd\n*.pyo\n*.so\n*.swp\n*.tar.gz\n*~\n.DS_Store\n.Python\n.cache\n.codspeed\n.coverag"
  },
  {
    "path": ".gitmodules",
    "chars": 118,
    "preview": "[submodule \"vendor/llhttp\"]\n    path = vendor/llhttp\n    url = https://github.com/nodejs/llhttp.git\n    branch = main\n"
  },
  {
    "path": ".lgtm.yml",
    "chars": 44,
    "preview": "queries:\n- exclude: py/unsafe-cyclic-import\n"
  },
  {
    "path": ".mypy.ini",
    "chars": 1074,
    "preview": "[mypy]\nfiles = aiohttp, docs/code, examples, tests\ncheck_untyped_defs = True\nfollow_imports_for_stubs = True\ndisallow_an"
  },
  {
    "path": ".pip-tools.toml",
    "chars": 78,
    "preview": "[pip-tools]\nallow-unsafe = true\nresolver = \"backtracking\"\nstrip-extras = true\n"
  },
  {
    "path": ".pre-commit-config.yaml",
    "chars": 3074,
    "preview": "repos:\n- repo: local\n  hooks:\n  - id: changelogs-rst\n    name: changelog filenames\n    language: fail\n    entry: >-\n    "
  },
  {
    "path": ".readthedocs.yml",
    "chars": 522,
    "preview": "# Read the Docs configuration file\n# See https://docs.readthedocs.io/en/stable/config-file/v2.html\n# for details\n\n---\nve"
  },
  {
    "path": "CHANGES/.TEMPLATE.rst",
    "chars": 2391,
    "preview": "{# TOWNCRIER TEMPLATE #}\n{% for section, _ in sections.items() %}\n{% set underline = underlines[0] %}{% if section %}{{s"
  },
  {
    "path": "CHANGES/.gitignore",
    "chars": 382,
    "preview": "*\n!.TEMPLATE.rst\n!.gitignore\n!README.rst\n!*.bugfix\n!*.bugfix.rst\n!*.bugfix.*.rst\n!*.breaking\n!*.breaking.rst\n!*.breaking"
  },
  {
    "path": "CHANGES/10468.doc.rst",
    "chars": 214,
    "preview": "Added ``:canonical:`` directives to documentation reference pages, enabling\n``Intersphinx`` cross-referencing via fully-"
  },
  {
    "path": "CHANGES/10596.bugfix.rst",
    "chars": 245,
    "preview": "Fixed server hanging indefinitely when chunked transfer encoding chunk-size\ndoes not match actual data length. The serve"
  },
  {
    "path": "CHANGES/10611.bugfix.rst",
    "chars": 203,
    "preview": "Reject HTTP requests with duplicate ``chunked`` Transfer-Encoding\n(e.g. ``Transfer-Encoding: chunked, chunked``) with a\n"
  },
  {
    "path": "CHANGES/10665.feature.rst",
    "chars": 177,
    "preview": "Added :py:attr:`~aiohttp.web.TCPSite.port` accessor for dynamic port allocations in :class:`~aiohttp.web.TCPSite` -- by "
  },
  {
    "path": "CHANGES/10683.bugfix.rst",
    "chars": 243,
    "preview": "Fixed misleading TLS-in-TLS warning being emitted when sending HTTPS requests through an HTTP proxy. The warning now onl"
  },
  {
    "path": "CHANGES/10753.bugfix.rst",
    "chars": 191,
    "preview": "Widened ``trace_request_ctx`` parameter type from ``Mapping[str, Any] | None`` to ``object`` to allow passing instances "
  },
  {
    "path": "CHANGES/10795.doc.rst",
    "chars": 215,
    "preview": "Replaced the deprecated ``ujson`` library with ``orjson`` in the\nclient quickstart documentation. ``ujson`` has been put"
  },
  {
    "path": "CHANGES/11012.breaking.rst",
    "chars": 475,
    "preview": "Refactored ``ClientRequest`` class. This simplifies a lot of code and improves our type\nchecking accuracy. It also bette"
  },
  {
    "path": "CHANGES/11268.feature.rst",
    "chars": 132,
    "preview": "Updated ``_TracingSignal`` to utilize a secondary generic variable for type hinting custom context variables\n-- by :user"
  },
  {
    "path": "CHANGES/11283.bugfix.rst",
    "chars": 218,
    "preview": "Fixed access log timestamps ignoring daylight saving time (DST) changes. The\nprevious implementation used :py:data:`time"
  },
  {
    "path": "CHANGES/11601.breaking.rst",
    "chars": 60,
    "preview": "Dropped support for Python 3.9 -- by :user:`Dreamsorcerer`.\n"
  },
  {
    "path": "CHANGES/11681.feature.rst",
    "chars": 330,
    "preview": "Started accepting :term:`asynchronous context managers <asynchronous context manager>` for cleanup contexts.\nLegacy sing"
  },
  {
    "path": "CHANGES/11737.contrib.rst",
    "chars": 147,
    "preview": "The benchmark CI job now runs only in the upstream repository -- by :user:`Cycloctane`.\n\nIt used to always fail in forks"
  },
  {
    "path": "CHANGES/11763.feature.rst",
    "chars": 290,
    "preview": "Added ``decode_text`` parameter to :meth:`~aiohttp.ClientSession.ws_connect` and :class:`~aiohttp.web.WebSocketResponse`"
  },
  {
    "path": "CHANGES/11766.feature.rst",
    "chars": 206,
    "preview": "Added ``RequestKey`` and ``ResponseKey`` classes,\nwhich enable static type checking for request & response\ncontext stora"
  },
  {
    "path": "CHANGES/11776.misc.rst",
    "chars": 190,
    "preview": "The warnings emitted when using ``str`` keys in ``web.Response``/``web.Request``\nhave been removed to avoid any performa"
  },
  {
    "path": "CHANGES/11826.contrib.rst",
    "chars": 275,
    "preview": "The coverage tool is now configured using the new native\nauto-discovered :file:`.coveragerc.toml` file\n-- by :user:`webk"
  },
  {
    "path": "CHANGES/11859.bugfix.rst",
    "chars": 221,
    "preview": "Removed support for ``ClientTimeout(total=0)`` to disable timeouts. Use ``None`` instead of ``0`` to disable the total t"
  },
  {
    "path": "CHANGES/11876.misc.rst",
    "chars": 99,
    "preview": "Refactored tests to use ``create_autospec()`` for more robust mocking -- by :user:`soheil-star01`.\n"
  },
  {
    "path": "CHANGES/11898.bugfix.rst",
    "chars": 585,
    "preview": "Restored :py:meth:`~aiohttp.BodyPartReader.decode` as a synchronous method\nfor backward compatibility. The method was in"
  },
  {
    "path": "CHANGES/11937.misc.rst",
    "chars": 78,
    "preview": "Added win_arm64 to the wheels that gets pushed to PyPI\n-- by :user:`AraHaan`.\n"
  },
  {
    "path": "CHANGES/11955.feature.rst",
    "chars": 128,
    "preview": "Added ``max_headers`` parameter to limit the number of headers that should be read from a response -- by :user:`Dreamsor"
  },
  {
    "path": "CHANGES/11972.bugfix.rst",
    "chars": 189,
    "preview": "Fixed false-positive :py:class:`DeprecationWarning` for passing ``enable_cleanup_closed=True`` to :py:class:`~aiohttp.TC"
  },
  {
    "path": "CHANGES/11989.feature.rst",
    "chars": 377,
    "preview": "Added explicit APIs for bytes-returning JSON serializer:\n``JSONBytesEncoder`` type, ``JsonBytesPayload``,\n:func:`~aiohtt"
  },
  {
    "path": "CHANGES/11992.contrib.rst",
    "chars": 132,
    "preview": "Fixed flaky performance tests by using appropriate fixed thresholds that account for CI variability -- by :user:`rodrigo"
  },
  {
    "path": "CHANGES/12027.misc.rst",
    "chars": 183,
    "preview": "Fixed ``test_invalid_idna`` to work with ``idna`` 3.11 by using an invalid character (``\\u0080``) that is rejected by ``"
  },
  {
    "path": "CHANGES/12030.bugfix.rst",
    "chars": 140,
    "preview": "Reset the WebSocket heartbeat timer on inbound data to avoid false ping/pong timeouts while receiving large frames\n-- by"
  },
  {
    "path": "CHANGES/12042.doc.rst",
    "chars": 118,
    "preview": "Documented :exc:`asyncio.TimeoutError` for ``WebSocketResponse.receive()``\nand related methods -- by :user:`veeceey`.\n"
  },
  {
    "path": "CHANGES/12069.packaging.rst",
    "chars": 54,
    "preview": "Upgraded llhttp to 3.9.1 -- by :user:`Dreamsorcerer`.\n"
  },
  {
    "path": "CHANGES/12088.bugfix.rst",
    "chars": 73,
    "preview": "Fixed tests to pass when run after 2027-05-31 -- by :user:`bmwiedemann`.\n"
  },
  {
    "path": "CHANGES/12091.bugfix.rst",
    "chars": 365,
    "preview": "Switched :py:meth:`~aiohttp.CookieJar.save` to use JSON format and\n:py:meth:`~aiohttp.CookieJar.load` to try JSON first "
  },
  {
    "path": "CHANGES/12096.bugfix.rst",
    "chars": 84,
    "preview": "Fixed _sendfile_fallback over-reading beyond requested count -- by :user:`bysiber`.\n"
  },
  {
    "path": "CHANGES/12097.bugfix.rst",
    "chars": 92,
    "preview": "Fixed digest auth dropping challenge fields with empty string values -- by :user:`bysiber`.\n"
  },
  {
    "path": "CHANGES/12106.feature.rst",
    "chars": 121,
    "preview": "Added a ``dns_cache_max_size`` parameter to ``TCPConnector`` to limit the size of the cache -- by :user:`Dreamsorcerer`."
  },
  {
    "path": "CHANGES/12136.bugfix.rst",
    "chars": 110,
    "preview": "``ClientConnectorCertificateError.os_error`` no longer raises :exc:`AttributeError`\n-- by :user:`themylogin`.\n"
  },
  {
    "path": "CHANGES/12170.misc.rst",
    "chars": 111,
    "preview": "Fixed race condition in ``test_data_file`` on Python 3.14 free-threaded builds -- by :user:`rodrigobnogueira`.\n"
  },
  {
    "path": "CHANGES/12173.contrib.rst",
    "chars": 67,
    "preview": "Fixed and reworked ``autobahn`` tests -- by :user:`Dreamsorcerer`.\n"
  },
  {
    "path": "CHANGES/12195.bugfix.rst",
    "chars": 148,
    "preview": "Fixed redirects with consumed non-rewindable request bodies to raise\n:class:`aiohttp.ClientPayloadError` instead of sile"
  },
  {
    "path": "CHANGES/12231.bugfix.rst",
    "chars": 251,
    "preview": "Adjusted pure-Python request header value validation to align with RFC 9110 control-character handling, while preserving"
  },
  {
    "path": "CHANGES/12240.bugfix.rst",
    "chars": 278,
    "preview": "Rejected duplicate singleton headers (``Host``, ``Content-Type``,\n``Content-Length``, etc.) in the C extension HTTP pars"
  },
  {
    "path": "CHANGES/12249.bugfix.rst",
    "chars": 209,
    "preview": "Aligned the pure-Python HTTP request parser with the C parser by splitting\ncomma-separated and repeated ``Connection`` h"
  },
  {
    "path": "CHANGES/2174.bugfix",
    "chars": 96,
    "preview": "Raise 400 Bad Request on server-side `await request.json()` if incorrect content-type received.\n"
  },
  {
    "path": "CHANGES/2835.breaking.rst",
    "chars": 115,
    "preview": "Drop lowercased enum items of ``WSMsgType`` (text, binary, ...), use uppercased items instead (TEXT, BINARY, ...).\n"
  },
  {
    "path": "CHANGES/2977.breaking.rst",
    "chars": 25,
    "preview": "Drop aiodns<1.1 support.\n"
  },
  {
    "path": "CHANGES/3310.bugfix",
    "chars": 73,
    "preview": "Docs clarification that aiohttp client does not support HTTP Pipelining.\n"
  },
  {
    "path": "CHANGES/3462.feature",
    "chars": 91,
    "preview": "``web.HTTPException`` and derived classes are not inherited from ``web.Response`` anymore.\n"
  },
  {
    "path": "CHANGES/3463.breaking.rst",
    "chars": 123,
    "preview": "Make ``ClientSession`` slot-based class, convert debug-mode warning about a wild session modification into a strict erro"
  },
  {
    "path": "CHANGES/3482.bugfix",
    "chars": 119,
    "preview": "Do not return `None` on `await response.json()` when body is empty. Instead, raise `json.JSONDecodeError` as expected.\n"
  },
  {
    "path": "CHANGES/3538.breaking.rst",
    "chars": 68,
    "preview": "Drop ``@aiohttp.streamer`` decorator, use async generators instead.\n"
  },
  {
    "path": "CHANGES/3539.breaking.rst",
    "chars": 105,
    "preview": "Disallow creation of aiohttp objects (``ClientSession``, ``Connector`` etc.) without running event loop.\n"
  },
  {
    "path": "CHANGES/3540.feature",
    "chars": 71,
    "preview": "Make sanity check for web-handler return value working in release mode\n"
  },
  {
    "path": "CHANGES/3542.breaking.rst",
    "chars": 63,
    "preview": "Setting ``web.Application`` custom attributes is now forbidden\n"
  },
  {
    "path": "CHANGES/3545.feature",
    "chars": 27,
    "preview": "Drop custom router support\n"
  },
  {
    "path": "CHANGES/3547.breaking.rst",
    "chars": 31,
    "preview": "Remove deprecated resp.url_obj\n"
  },
  {
    "path": "CHANGES/3548.breaking.rst",
    "chars": 37,
    "preview": "Drop deprecated SSL client settings.\n"
  },
  {
    "path": "CHANGES/3559.doc",
    "chars": 68,
    "preview": "Clarified ``WebSocketResponse`` closure in the quick start example.\n"
  },
  {
    "path": "CHANGES/3562.bugfix",
    "chars": 95,
    "preview": "Raise ``web_exceptions.HTTPUnsupportedMediaType`` when invalid `Content-Type` encoding passed.\n"
  },
  {
    "path": "CHANGES/3569.feature",
    "chars": 116,
    "preview": "Make new style middleware default, deprecate the @middleware decorator and\nremove support for old-style middleware.\n"
  },
  {
    "path": "CHANGES/3580.breaking.rst",
    "chars": 407,
    "preview": "Drop explicit loop. Use ``asyncio.get_event_loop()`` instead if the loop instance is needed.\nAll aiohttp objects work wi"
  },
  {
    "path": "CHANGES/3612.bugfix",
    "chars": 43,
    "preview": "Fixed a grammatical error in documentation\n"
  },
  {
    "path": "CHANGES/3613.bugfix",
    "chars": 50,
    "preview": "Use sanitized URL as Location header in redirects\n"
  },
  {
    "path": "CHANGES/3642.doc",
    "chars": 128,
    "preview": "Modify documentation for Resolvers to make it clear that asynchronous resolver is not used by default when aiodns is ins"
  },
  {
    "path": "CHANGES/3685.doc",
    "chars": 72,
    "preview": "Add documentation regarding creating and destroying persistent session.\n"
  },
  {
    "path": "CHANGES/3721.bugfix",
    "chars": 46,
    "preview": "Add the missing `TestClient.scheme` property.\n"
  },
  {
    "path": "CHANGES/3767.feature",
    "chars": 61,
    "preview": "Add ``AbstractAsyncAccessLogger`` to allow IO while logging.\n"
  },
  {
    "path": "CHANGES/3787.feature",
    "chars": 43,
    "preview": "Added ability to use contextvars in logger\n"
  },
  {
    "path": "CHANGES/3796.feature",
    "chars": 73,
    "preview": "Add a debug argument to `web.run_app()` for enabling debug mode on loop.\n"
  },
  {
    "path": "CHANGES/3890.breaking.rst",
    "chars": 121,
    "preview": "Drop deprecated `read_timeout` and `conn_timeout` in `ClientSession` constructor, please use `timeout` argument instead."
  },
  {
    "path": "CHANGES/3901.breaking.rst",
    "chars": 62,
    "preview": "Drop sync context managers that raises ``TypeError`` already.\n"
  },
  {
    "path": "CHANGES/3929.breaking.rst",
    "chars": 65,
    "preview": "Drop processing sync web-handlers (deprecated since aiohttp 3.0)\n"
  },
  {
    "path": "CHANGES/3931.breaking.rst",
    "chars": 88,
    "preview": "Drop deprecated ``BaseRequest.message``, ``BaseRequest.loop``, ``BaseRequest.has_body``\n"
  },
  {
    "path": "CHANGES/3932.breaking.rst",
    "chars": 107,
    "preview": "Drop deprecated ``unused_port``, ``test_server``, ``raw_test_server`` and ``test_client`` pytest fixtures.\n"
  },
  {
    "path": "CHANGES/3933.breaking.rst",
    "chars": 62,
    "preview": "Forbid inheritance from ``ClientSession`` and ``Application``\n"
  },
  {
    "path": "CHANGES/3934.breaking.rst",
    "chars": 55,
    "preview": "Drop deprecated ``ClientResponseError.code`` attribute\n"
  },
  {
    "path": "CHANGES/3935.breaking.rst",
    "chars": 120,
    "preview": "Drop deprecated ``ClientSession.loop`` and ``Connection.loop``. Forbid changing ``ClientSession.requote_redirect_url``.\n"
  },
  {
    "path": "CHANGES/3939.breaking.rst",
    "chars": 47,
    "preview": "Drop deprecated ``Application.make_handler()``\n"
  },
  {
    "path": "CHANGES/3940.breaking.rst",
    "chars": 89,
    "preview": "Drop HTTP chunk size from client and server, remove deprecated `response.output_length`.\n"
  },
  {
    "path": "CHANGES/3942.breaking.rst",
    "chars": 152,
    "preview": "Make `web.BaseRequest`, `web.Request`, `web.StreamResponse`, `web.Response` and `web.WebSocketResponse` slot-based, prev"
  },
  {
    "path": "CHANGES/3948.breaking.rst",
    "chars": 39,
    "preview": "Forbid changing frozen app properties.\n"
  },
  {
    "path": "CHANGES/3994.misc",
    "chars": 75,
    "preview": "correct the names of some functions in ``tests/test_client_functional.py``\n"
  },
  {
    "path": "CHANGES/4161.doc",
    "chars": 84,
    "preview": "Update contributing guide so new contributors can successfully install dependencies\n"
  },
  {
    "path": "CHANGES/4277.feature",
    "chars": 69,
    "preview": "Added ``set_cookie`` and ``del_cookie`` methods to ``HTTPException``\n"
  },
  {
    "path": "CHANGES/4283.bugfix",
    "chars": 30,
    "preview": "Fix incorrect code in example\n"
  },
  {
    "path": "CHANGES/4299.bugfix",
    "chars": 65,
    "preview": "Delete older code in example (:file:`examples/web_classview.py`)\n"
  },
  {
    "path": "CHANGES/4302.bugfix",
    "chars": 76,
    "preview": "Fixed the support of route handlers wrapped by :py:func:`functools.partial`\n"
  },
  {
    "path": "CHANGES/4368.bugfix",
    "chars": 130,
    "preview": "Make `web.BaseRequest`, `web.Request`, `web.StreamResponse`, `web.Response` and `web.WebSocketResponse` weak referenceab"
  },
  {
    "path": "CHANGES/4452.doc",
    "chars": 47,
    "preview": "Fixed a typo in the ``client_quickstart`` doc.\n"
  },
  {
    "path": "CHANGES/4504.doc",
    "chars": 79,
    "preview": "Updated the contribution guide to reflect the automatic thread locking policy.\n"
  },
  {
    "path": "CHANGES/4526.bugfix",
    "chars": 47,
    "preview": "Ignore protocol exceptions after it is closed.\n"
  },
  {
    "path": "CHANGES/4558.bugfix",
    "chars": 63,
    "preview": "Fixed body_size comparison to client_max_size for web request.\n"
  },
  {
    "path": "CHANGES/4656.bugfix",
    "chars": 71,
    "preview": "Propagate all warnings captured in coroutine test functions to pytest.\n"
  },
  {
    "path": "CHANGES/4695.doc",
    "chars": 83,
    "preview": "Added documentation on how to patch unittest cases with decorator for python < 3.8\n"
  },
  {
    "path": "CHANGES/4706.feature",
    "chars": 125,
    "preview": "Add a fixture ``aiohttp_client_cls`` that allows usage of ``aiohttp.test_utils.TestClient`` custom implementations in te"
  },
  {
    "path": "CHANGES/5075.feature",
    "chars": 31,
    "preview": "Multidict > 5 is now supported\n"
  },
  {
    "path": "CHANGES/5191.doc",
    "chars": 60,
    "preview": "Add pytest-aiohttp-client library to third party usage list\n"
  },
  {
    "path": "CHANGES/5258.bugfix",
    "chars": 213,
    "preview": "Fixed github workflow `update-pre-commit` on forks,\nsince this workflow should run only in the main repository and also "
  },
  {
    "path": "CHANGES/5278.breaking.rst",
    "chars": 24,
    "preview": "Drop Python 3.6 support\n"
  },
  {
    "path": "CHANGES/5284.breaking.rst",
    "chars": 122,
    "preview": "``attrs`` library was replaced with ``dataclasses``.  Replace ``attr.evolve()`` with ``dataclasses.replace()`` if needed"
  },
  {
    "path": "CHANGES/5284.feature",
    "chars": 115,
    "preview": "Use ``dataclasses`` instead of ``attrs`` for ``ClientTimeout``, client signals, and other few internal structures.\n"
  },
  {
    "path": "CHANGES/5287.feature",
    "chars": 178,
    "preview": "Before ``sentinel`` was processed as either ``object`` or ``Any``, both variants are far from perfectness.\n\nNow ``sentin"
  },
  {
    "path": "CHANGES/5516.misc",
    "chars": 63,
    "preview": "Removed @unittest_run_loop. This is now the default behaviour.\n"
  },
  {
    "path": "CHANGES/5533.misc",
    "chars": 36,
    "preview": "Add regression test for 0 timeouts.\n"
  },
  {
    "path": "CHANGES/5558.bugfix",
    "chars": 72,
    "preview": "Add parsing boundary from Content-Type header while making POST request\n"
  },
  {
    "path": "CHANGES/5634.feature",
    "chars": 112,
    "preview": "A warning was added, when a cookie's length exceeds the :rfc:`6265` minimum client support -- :user:`anesabml`.\n"
  },
  {
    "path": "CHANGES/5783.feature",
    "chars": 108,
    "preview": "Started keeping the ``Authorization`` header during HTTP -> HTTPS redirects when the host remains the same.\n"
  },
  {
    "path": "CHANGES/5806.misc",
    "chars": 39,
    "preview": "Remove last remnants of attrs library.\n"
  },
  {
    "path": "CHANGES/5829.misc",
    "chars": 41,
    "preview": "Disallow untyped defs on internal tests.\n"
  },
  {
    "path": "CHANGES/5870.misc",
    "chars": 31,
    "preview": "Simplify generator expression.\n"
  },
  {
    "path": "CHANGES/5894.bugfix",
    "chars": 76,
    "preview": "Fix JSON media type suffix matching with main types other than application.\n"
  },
  {
    "path": "CHANGES/6180.bugfix",
    "chars": 133,
    "preview": "Fixed matching the JSON media type to not accept arbitrary characters after ``application/json`` or the ``+json`` media "
  },
  {
    "path": "CHANGES/6181.bugfix",
    "chars": 61,
    "preview": "Make JSON media type matching case insensitive per RFC 2045.\n"
  },
  {
    "path": "CHANGES/6193.feature",
    "chars": 28,
    "preview": "Bump async-timeout to >=4.0\n"
  },
  {
    "path": "CHANGES/6547.bugfix",
    "chars": 121,
    "preview": "Remove overlapping slots in ``RequestHandler``,\nfix broken slots inheritance in :py:class:`~aiohttp.web.StreamResponse`."
  },
  {
    "path": "CHANGES/6721.misc",
    "chars": 55,
    "preview": "Remove unused argument `max_headers` of HeadersParser.\n"
  },
  {
    "path": "CHANGES/6979.doc",
    "chars": 142,
    "preview": "Improve grammar and brevity in communication in the Policy for Backward Incompatible Changes section of ``docs/index.rst"
  },
  {
    "path": "CHANGES/6998.doc",
    "chars": 86,
    "preview": "Added documentation on client authentication and updating headers. -- by :user:`faph`\n"
  },
  {
    "path": "CHANGES/7107.breaking.rst",
    "chars": 115,
    "preview": "Removed deprecated ``.loop``, ``.setUpAsync()``, ``.tearDownAsync()`` and ``.get_app()`` from ``AioHTTPTestCase``.\n"
  },
  {
    "path": "CHANGES/7265.breaking.rst",
    "chars": 84,
    "preview": "Deleted ``size`` arg from ``StreamReader.feed_data`` -- by :user:`DavidRomanovizc`.\n"
  },
  {
    "path": "CHANGES/7319.feature.rst",
    "chars": 430,
    "preview": "Changed ``WSMessage`` to a tagged union of ``NamedTuple`` -- by :user:`Dreamsorcerer`.\n\nThis change allows type checkers"
  },
  {
    "path": "CHANGES/7677.bugfix",
    "chars": 123,
    "preview": "Changed ``AppKey`` warning to ``web.NotAppKeyWarning`` and stop it being displayed by default. -- by :user:`Dreamsorcere"
  },
  {
    "path": "CHANGES/7772.bugfix",
    "chars": 57,
    "preview": "Fix CONNECT always being treated as having an empty body\n"
  },
  {
    "path": "CHANGES/7815.bugfix",
    "chars": 92,
    "preview": "Fixed an issue where the client could go into an infinite loop. -- by :user:`Dreamsorcerer`\n"
  },
  {
    "path": "CHANGES/8048.breaking.rst",
    "chars": 70,
    "preview": "Removed deprecated support for `ssl=None` -- by :user:`Dreamsorcerer`\n"
  },
  {
    "path": "CHANGES/8139.contrib.rst",
    "chars": 193,
    "preview": "Two definitions for \"test_invalid_route_name\" existed, only one was being run. Refactored them into a single parameteriz"
  },
  {
    "path": "CHANGES/8197.doc",
    "chars": 106,
    "preview": "Fixed false behavior of base_url param for ClientSession in client documentation -- by :user:`alexis974`.\n"
  },
  {
    "path": "CHANGES/8303.breaking.rst",
    "chars": 232,
    "preview": "Removed ``content_transfer_encoding`` parameter in :py:meth:`FormData.add_field()\n<aiohttp.FormData.add_field>` and pass"
  },
  {
    "path": "CHANGES/8596.breaking.rst",
    "chars": 95,
    "preview": "Removed old async compatibility from ``ClientResponse.release()`` -- by :user:`Dreamsorcerer`.\n"
  },
  {
    "path": "CHANGES/8698.breaking.rst",
    "chars": 155,
    "preview": "Changed signature of ``content_disposition_header()`` so ``params`` is now passed as a dict, in order to reduce typing e"
  },
  {
    "path": "CHANGES/8957.breaking.rst",
    "chars": 122,
    "preview": "Removed ``version`` parameter from ``.set_cookie()`` (this shouldn't exist in cookies today) -- by :user:`Dreamsorcerer`"
  },
  {
    "path": "CHANGES/9109.breaking.rst",
    "chars": 136,
    "preview": "Changed default value to ``compress`` from ``None`` to ``False`` (``None`` is no longer an expected value) -- by :user:`"
  },
  {
    "path": "CHANGES/9212.packaging.rst",
    "chars": 81,
    "preview": "Removed remaining `make_mocked_coro` in the test suite -- by :user:`polkapolka`.\n"
  },
  {
    "path": "CHANGES/9254.breaking.rst",
    "chars": 203,
    "preview": "Stopped allowing use of ``ClientResponse.text()``/``ClientResponse.json()`` after leaving ``async with`` context.\nThis n"
  },
  {
    "path": "CHANGES/9292.breaking.rst",
    "chars": 108,
    "preview": "Started rejecting non string values in `FormData`, to avoid unexpected results -- by :user:`Dreamsorcerer`.\n"
  },
  {
    "path": "CHANGES/9413.misc.rst",
    "chars": 104,
    "preview": "Reduced memory required many small objects by adding ``__slots__`` to dataclasses -- by :user:`bdraco`.\n"
  },
  {
    "path": "CHANGES/README.rst",
    "chars": 4938,
    "preview": ".. _Adding change notes with your PRs:\n\nAdding change notes with your PRs\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nIt is very "
  },
  {
    "path": "CHANGES.rst",
    "chars": 271084,
    "preview": "..\n    You should *NOT* be adding new change log entries to this file, this\n    file is managed by towncrier. You *may* "
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 3221,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
  },
  {
    "path": "CONTRIBUTING.rst",
    "chars": 1060,
    "preview": "Contributing\n============\n\nInstructions for contributors\n-----------------------------\n\n\nIn order to make a clone of the"
  },
  {
    "path": "CONTRIBUTORS.txt",
    "chars": 6350,
    "preview": "- Contributors -\n----------------\nA. Jesse Jiryu Davis\nAbdur Rehman Ali\nAdam Bannister\nAdam Cooper\nAdam Horacek\nAdam Mil"
  },
  {
    "path": "LICENSE.txt",
    "chars": 588,
    "preview": "   Copyright aio-libs contributors.\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not u"
  },
  {
    "path": "MANIFEST.in",
    "chars": 382,
    "preview": "include LICENSE.txt\ninclude CHANGES.rst\ninclude README.rst\ninclude CONTRIBUTORS.txt\ninclude Makefile\ngraft aiohttp\ngraft"
  },
  {
    "path": "Makefile",
    "chars": 5784,
    "preview": "# Some simple testing tasks (sorry, UNIX only).\n\nto-hash-one = $(dir $1).hash/$(addsuffix .hash,$(notdir $1))\nto-hash = "
  },
  {
    "path": "README.rst",
    "chars": 5643,
    "preview": "==================================\nAsync http client/server framework\n==================================\n\n.. image:: htt"
  },
  {
    "path": "aiohttp/__init__.py",
    "chars": 6769,
    "preview": "__version__ = \"4.0.0a2.dev0\"\n\nfrom typing import TYPE_CHECKING\n\nfrom . import hdrs\nfrom .client import (\n    BaseConnect"
  },
  {
    "path": "aiohttp/_cookie_helpers.py",
    "chars": 13660,
    "preview": "\"\"\"\nInternal cookie handling helpers.\n\nThis module contains internal utilities for cookie parsing and manipulation.\nThes"
  },
  {
    "path": "aiohttp/_cparser.pxd",
    "chars": 4295,
    "preview": "from libc.stdint cimport int32_t, uint8_t, uint16_t, uint64_t\n\n\ncdef extern from \"llhttp.h\":\n\n    struct llhttp__interna"
  },
  {
    "path": "aiohttp/_find_header.h",
    "chars": 170,
    "preview": "#ifndef _FIND_HEADERS_H\n#define _FIND_HEADERS_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nint find_header(const char *str"
  },
  {
    "path": "aiohttp/_find_header.pxd",
    "chars": 68,
    "preview": "cdef extern from \"_find_header.h\":\n    int find_header(char *, int)\n"
  },
  {
    "path": "aiohttp/_http_parser.pyx",
    "chars": 29612,
    "preview": "# Based on https://github.com/MagicStack/httptools\n#\n\nfrom cpython cimport (\n    Py_buffer,\n    PyBUF_SIMPLE,\n    PyBuff"
  },
  {
    "path": "aiohttp/_http_writer.pyx",
    "chars": 4690,
    "preview": "from cpython.bytes cimport PyBytes_FromStringAndSize\nfrom cpython.exc cimport PyErr_NoMemory\nfrom cpython.mem cimport Py"
  },
  {
    "path": "aiohttp/_websocket/__init__.py",
    "chars": 44,
    "preview": "\"\"\"WebSocket protocol versions 13 and 8.\"\"\"\n"
  },
  {
    "path": "aiohttp/_websocket/helpers.py",
    "chars": 5006,
    "preview": "\"\"\"Helpers for WebSocket protocol versions 13 and 8.\"\"\"\n\nimport functools\nimport re\nfrom re import Pattern\nfrom struct i"
  },
  {
    "path": "aiohttp/_websocket/mask.pxd",
    "chars": 112,
    "preview": "\"\"\"Cython declarations for websocket masking.\"\"\"\n\ncpdef void _websocket_mask_cython(bytes mask, bytearray data)\n"
  },
  {
    "path": "aiohttp/_websocket/mask.pyx",
    "chars": 1397,
    "preview": "from cpython cimport PyBytes_AsString\n\n\n#from cpython cimport PyByteArray_AsString # cython still not exports that\ncdef "
  },
  {
    "path": "aiohttp/_websocket/models.py",
    "chars": 3991,
    "preview": "\"\"\"Models for WebSocket protocol versions 13 and 8.\"\"\"\n\nimport json\nfrom collections.abc import Callable\nfrom enum impor"
  },
  {
    "path": "aiohttp/_websocket/reader.py",
    "chars": 1010,
    "preview": "\"\"\"Reader for WebSocket protocol versions 13 and 8.\"\"\"\n\nfrom typing import TYPE_CHECKING\n\nfrom ..helpers import NO_EXTEN"
  },
  {
    "path": "aiohttp/_websocket/reader_c.pxd",
    "chars": 2816,
    "preview": "import cython\n\nfrom .mask cimport _websocket_mask_cython as websocket_mask\n\n\ncdef unsigned int READ_HEADER\ncdef unsigned"
  },
  {
    "path": "aiohttp/_websocket/reader_py.py",
    "chars": 19428,
    "preview": "\"\"\"Reader for WebSocket protocol versions 13 and 8.\"\"\"\n\nimport asyncio\nimport builtins\nfrom collections import deque\nfro"
  },
  {
    "path": "aiohttp/_websocket/writer.py",
    "chars": 11230,
    "preview": "\"\"\"WebSocket protocol versions 13 and 8.\"\"\"\n\nimport asyncio\nimport random\nimport sys\nfrom functools import partial\nfrom "
  },
  {
    "path": "aiohttp/abc.py",
    "chars": 7206,
    "preview": "import logging\nimport socket\nfrom abc import ABC, abstractmethod\nfrom collections.abc import Awaitable, Callable, Genera"
  },
  {
    "path": "aiohttp/base_protocol.py",
    "chars": 3006,
    "preview": "import asyncio\nfrom typing import cast\n\nfrom .client_exceptions import ClientConnectionResetError\nfrom .helpers import s"
  },
  {
    "path": "aiohttp/client.py",
    "chars": 58541,
    "preview": "\"\"\"HTTP Client for asyncio.\"\"\"\n\nimport asyncio\nimport base64\nimport dataclasses\nimport hashlib\nimport json\nimport os\nimp"
  },
  {
    "path": "aiohttp/client_exceptions.py",
    "chars": 10553,
    "preview": "\"\"\"HTTP related errors.\"\"\"\n\nimport asyncio\nfrom typing import TYPE_CHECKING, Union\n\nfrom multidict import MultiMapping\n\n"
  },
  {
    "path": "aiohttp/client_middleware_digest_auth.py",
    "chars": 17570,
    "preview": "\"\"\"\nDigest authentication middleware for aiohttp client.\n\nThis middleware implements HTTP Digest Authentication accordin"
  },
  {
    "path": "aiohttp/client_middlewares.py",
    "chars": 1918,
    "preview": "\"\"\"Client middleware support.\"\"\"\n\nfrom collections.abc import Awaitable, Callable, Sequence\n\nfrom .client_reqrep import "
  },
  {
    "path": "aiohttp/client_proto.py",
    "chars": 12465,
    "preview": "import asyncio\nfrom contextlib import suppress\nfrom typing import Callable, Protocol\n\nfrom ._websocket.reader import Web"
  },
  {
    "path": "aiohttp/client_reqrep.py",
    "chars": 49169,
    "preview": "import asyncio\nimport codecs\nimport contextlib\nimport functools\nimport io\nimport re\nimport sys\nimport traceback\nimport w"
  },
  {
    "path": "aiohttp/client_ws.py",
    "chars": 19469,
    "preview": "\"\"\"WebSocket client for asyncio.\"\"\"\n\nimport asyncio\nimport sys\nfrom collections.abc import Callable\nfrom types import Tr"
  }
]

// ... and 237 more files (download for full content)

About this extraction

This page contains the full source code of the aio-libs/aiohttp GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 437 files (3.9 MB), approximately 1.0M tokens, and a symbol index with 5344 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!