geventhttpclient 2.5.0__tar.gz → 2.6.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. geventhttpclient-2.6.0/.github/workflows/publish.yml +107 -0
  2. geventhttpclient-2.6.0/.github/workflows/test.yml +75 -0
  3. geventhttpclient-2.6.0/.gitignore +20 -0
  4. geventhttpclient-2.6.0/.gitmodules +3 -0
  5. geventhttpclient-2.6.0/.pre-commit-config.yaml +48 -0
  6. geventhttpclient-2.6.0/CHANGELOG.md +155 -0
  7. {geventhttpclient-2.5.0 → geventhttpclient-2.6.0}/MANIFEST.in +3 -2
  8. geventhttpclient-2.6.0/PKG-INFO +372 -0
  9. geventhttpclient-2.6.0/README.md +336 -0
  10. geventhttpclient-2.6.0/RELEASING.md +65 -0
  11. geventhttpclient-2.6.0/SECURITY.md +18 -0
  12. geventhttpclient-2.6.0/benchmarks/README.md +79 -0
  13. geventhttpclient-2.6.0/benchmarks/benchmark.py +162 -0
  14. geventhttpclient-2.6.0/benchmarks/geventhttpclient_bench.py +36 -0
  15. geventhttpclient-2.6.0/benchmarks/httplib2_patched_bench.py +40 -0
  16. geventhttpclient-2.6.0/benchmarks/httpx_async_bench.py +44 -0
  17. geventhttpclient-2.6.0/benchmarks/httpx_bench.py +36 -0
  18. geventhttpclient-2.6.0/benchmarks/requests_bench.py +29 -0
  19. geventhttpclient-2.6.0/benchmarks/urllib3_bench.py +29 -0
  20. geventhttpclient-2.6.0/examples/download.py +23 -0
  21. geventhttpclient-2.6.0/examples/download_raw.py +27 -0
  22. geventhttpclient-2.6.0/examples/facebook.py +50 -0
  23. geventhttpclient-2.6.0/examples/httplib2_patched.py +26 -0
  24. geventhttpclient-2.6.0/examples/oauth2.py +54 -0
  25. geventhttpclient-2.6.0/examples/urllib_patched.py +12 -0
  26. {geventhttpclient-2.5.0 → geventhttpclient-2.6.0}/ext/_parser.c +3 -31
  27. geventhttpclient-2.6.0/llhttp/.gitignore +1 -0
  28. geventhttpclient-2.6.0/llhttp/CMakeLists.txt +135 -0
  29. geventhttpclient-2.6.0/llhttp/LICENSE +22 -0
  30. geventhttpclient-2.6.0/llhttp/README.md +518 -0
  31. geventhttpclient-2.6.0/llhttp/cmake/llhttpConfig.cmake.in +19 -0
  32. geventhttpclient-2.6.0/llhttp/common.gypi +46 -0
  33. geventhttpclient-2.6.0/llhttp/libllhttp.pc.in +10 -0
  34. geventhttpclient-2.6.0/llhttp/llhttp.gyp +22 -0
  35. geventhttpclient-2.6.0/pyproject.toml +143 -0
  36. geventhttpclient-2.6.0/src/geventhttpclient/__init__.py +33 -0
  37. geventhttpclient-2.6.0/src/geventhttpclient/_parser.pyi +12 -0
  38. geventhttpclient-2.6.0/src/geventhttpclient/_version.py +24 -0
  39. {geventhttpclient-2.5.0 → geventhttpclient-2.6.0}/src/geventhttpclient/api.py +13 -8
  40. geventhttpclient-2.6.0/src/geventhttpclient/auth.py +92 -0
  41. {geventhttpclient-2.5.0 → geventhttpclient-2.6.0}/src/geventhttpclient/client.py +107 -36
  42. {geventhttpclient-2.5.0 → geventhttpclient-2.6.0}/src/geventhttpclient/connectionpool.py +37 -20
  43. {geventhttpclient-2.5.0 → geventhttpclient-2.6.0}/src/geventhttpclient/header.py +143 -65
  44. geventhttpclient-2.6.0/src/geventhttpclient/httplib.py +358 -0
  45. {geventhttpclient-2.5.0 → geventhttpclient-2.6.0}/src/geventhttpclient/httplib2.py +19 -8
  46. geventhttpclient-2.6.0/src/geventhttpclient/httpx.py +539 -0
  47. geventhttpclient-2.6.0/src/geventhttpclient/py.typed +0 -0
  48. geventhttpclient-2.6.0/src/geventhttpclient/requests.py +521 -0
  49. {geventhttpclient-2.5.0 → geventhttpclient-2.6.0}/src/geventhttpclient/response.py +52 -10
  50. {geventhttpclient-2.5.0 → geventhttpclient-2.6.0}/src/geventhttpclient/url.py +160 -24
  51. geventhttpclient-2.6.0/src/geventhttpclient/useragent.py +1000 -0
  52. geventhttpclient-2.6.0/src/geventhttpclient.egg-info/PKG-INFO +372 -0
  53. geventhttpclient-2.6.0/src/geventhttpclient.egg-info/SOURCES.txt +91 -0
  54. {geventhttpclient-2.5.0 → geventhttpclient-2.6.0}/src/geventhttpclient.egg-info/requires.txt +1 -10
  55. geventhttpclient-2.6.0/src/geventhttpclient.egg-info/scm_file_list.json +87 -0
  56. geventhttpclient-2.6.0/src/geventhttpclient.egg-info/scm_version.json +8 -0
  57. geventhttpclient-2.6.0/tests/__init__.py +2 -0
  58. geventhttpclient-2.6.0/tests/common.py +86 -0
  59. geventhttpclient-2.6.0/tests/conftest.py +17 -0
  60. geventhttpclient-2.6.0/tests/gevent_only/__init__.py +0 -0
  61. geventhttpclient-2.6.0/tests/gevent_only/conftest.py +7 -0
  62. geventhttpclient-2.6.0/tests/gevent_only/test_httplib2.py +31 -0
  63. geventhttpclient-2.6.0/tests/gevent_only/test_httplib2_compat.py +133 -0
  64. geventhttpclient-2.6.0/tests/gevent_only/test_proxy.py +75 -0
  65. geventhttpclient-2.6.0/tests/gevent_only/test_ssl.py +43 -0
  66. geventhttpclient-2.6.0/tests/oncert.pem +20 -0
  67. geventhttpclient-2.6.0/tests/server.crt +22 -0
  68. geventhttpclient-2.6.0/tests/server.key +28 -0
  69. geventhttpclient-2.6.0/tests/test_auth.py +93 -0
  70. {geventhttpclient-2.5.0 → geventhttpclient-2.6.0}/tests/test_client.py +233 -1
  71. {geventhttpclient-2.5.0 → geventhttpclient-2.6.0}/tests/test_headers.py +83 -0
  72. geventhttpclient-2.6.0/tests/test_httplib.py +141 -0
  73. geventhttpclient-2.6.0/tests/test_httpx.py +176 -0
  74. {geventhttpclient-2.5.0 → geventhttpclient-2.6.0}/tests/test_keep_alive.py +2 -6
  75. {geventhttpclient-2.5.0 → geventhttpclient-2.6.0}/tests/test_parser.py +17 -0
  76. geventhttpclient-2.6.0/tests/test_requests.py +536 -0
  77. {geventhttpclient-2.5.0 → geventhttpclient-2.6.0}/tests/test_ssl.py +170 -1
  78. geventhttpclient-2.6.0/tests/test_url.py +361 -0
  79. geventhttpclient-2.6.0/tests/test_useragent.py +798 -0
  80. geventhttpclient-2.6.0/uv.lock +950 -0
  81. geventhttpclient-2.5.0/PKG-INFO +0 -296
  82. geventhttpclient-2.5.0/README.md +0 -255
  83. geventhttpclient-2.5.0/ext/Python_compat.h +0 -5
  84. geventhttpclient-2.5.0/pyproject.toml +0 -108
  85. geventhttpclient-2.5.0/src/geventhttpclient/__init__.py +0 -9
  86. geventhttpclient-2.5.0/src/geventhttpclient/httplib.py +0 -244
  87. geventhttpclient-2.5.0/src/geventhttpclient/requests.py +0 -250
  88. geventhttpclient-2.5.0/src/geventhttpclient/useragent.py +0 -699
  89. geventhttpclient-2.5.0/src/geventhttpclient.egg-info/PKG-INFO +0 -296
  90. geventhttpclient-2.5.0/src/geventhttpclient.egg-info/SOURCES.txt +0 -40
  91. geventhttpclient-2.5.0/tests/test_httplib.py +0 -73
  92. geventhttpclient-2.5.0/tests/test_requests.py +0 -14
  93. geventhttpclient-2.5.0/tests/test_url.py +0 -173
  94. geventhttpclient-2.5.0/tests/test_useragent.py +0 -364
  95. {geventhttpclient-2.5.0 → geventhttpclient-2.6.0}/LICENSE-MIT +0 -0
  96. {geventhttpclient-2.5.0 → geventhttpclient-2.6.0}/llhttp/LICENSE-MIT +0 -0
  97. {geventhttpclient-2.5.0 → geventhttpclient-2.6.0}/llhttp/include/llhttp.h +0 -0
  98. {geventhttpclient-2.5.0 → geventhttpclient-2.6.0}/llhttp/src/api.c +0 -0
  99. {geventhttpclient-2.5.0 → geventhttpclient-2.6.0}/llhttp/src/http.c +0 -0
  100. {geventhttpclient-2.5.0 → geventhttpclient-2.6.0}/llhttp/src/llhttp.c +0 -0
  101. {geventhttpclient-2.5.0 → geventhttpclient-2.6.0}/setup.cfg +0 -0
  102. {geventhttpclient-2.5.0 → geventhttpclient-2.6.0}/setup.py +0 -0
  103. {geventhttpclient-2.5.0 → geventhttpclient-2.6.0}/src/geventhttpclient.egg-info/dependency_links.txt +0 -0
  104. {geventhttpclient-2.5.0 → geventhttpclient-2.6.0}/src/geventhttpclient.egg-info/top_level.txt +0 -0
  105. {geventhttpclient-2.5.0 → geventhttpclient-2.6.0}/tests/test_continue.py +0 -0
  106. {geventhttpclient-2.5.0 → geventhttpclient-2.6.0}/tests/test_network_failures.py +0 -0
  107. {geventhttpclient-2.5.0 → geventhttpclient-2.6.0}/tests/test_proxy.py +0 -0
@@ -0,0 +1,107 @@
1
+ name: Publish
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ release:
6
+ types:
7
+ - published
8
+
9
+ jobs:
10
+ build-wheels:
11
+ name: Build wheels (${{ matrix.label }})
12
+ runs-on: ${{ matrix.os }}
13
+ timeout-minutes: ${{ matrix.timeout || 45 }}
14
+ strategy:
15
+ fail-fast: false
16
+ matrix:
17
+ include:
18
+ - {label: linux-x86_64, os: ubuntu-24.04, archs: x86_64}
19
+ - {label: linux-aarch64, os: ubuntu-24.04-arm, archs: aarch64}
20
+ - {label: linux-ppc64le, os: ubuntu-24.04, archs: ppc64le, skip: "cp3*-musllinux_*", qemu: true, timeout: 60}
21
+ - {label: macos, os: macos-latest}
22
+ - {label: windows-x86, os: windows-latest}
23
+ - {label: windows-arm64, os: windows-11-arm}
24
+ steps:
25
+ - uses: actions/checkout@v6
26
+ with:
27
+ fetch-depth: 0
28
+ submodules: recursive
29
+ - uses: actions/setup-python@v6
30
+ with:
31
+ python-version: '3.14'
32
+ - uses: docker/setup-qemu-action@v3
33
+ if: ${{ matrix.qemu }}
34
+ name: Set up QEMU
35
+ - name: Install uv
36
+ uses: astral-sh/setup-uv@v10.2.0
37
+ - run: |
38
+ args=(--output-dir wheelhouse)
39
+ if [ -n "${{ matrix.archs }}" ]; then
40
+ args+=(--archs "${{ matrix.archs }}")
41
+ fi
42
+ if [ -n "${{ matrix.skip }}" ]; then
43
+ export CIBW_SKIP="${{ matrix.skip }}"
44
+ fi
45
+ uvx cibuildwheel==4.2.1 "${args[@]}"
46
+ shell: bash
47
+ name: Run build wheel
48
+ - uses: actions/upload-artifact@v4
49
+ with:
50
+ name: dist-wheels-${{ matrix.label }}
51
+ path: ./wheelhouse/*.whl
52
+ if-no-files-found: error
53
+
54
+ build-sdist:
55
+ name: Build source distribution
56
+ runs-on: ubuntu-latest
57
+ steps:
58
+ - uses: actions/checkout@v6
59
+ with:
60
+ fetch-depth: 0
61
+ submodules: recursive
62
+ - name: Install uv
63
+ uses: astral-sh/setup-uv@v10.2.0
64
+ - run: uv build --sdist
65
+ name: Build source tarball
66
+ - name: Refuse to publish unless the sdist version matches the ref name
67
+ run: |
68
+ test "$(ls dist/*.tar.gz | wc -l)" = 1
69
+ test "geventhttpclient-${GITHUB_REF_NAME}.tar.gz" = "$(basename dist/*.tar.gz)"
70
+ - uses: actions/upload-artifact@v4
71
+ with:
72
+ name: dist-source
73
+ path: dist/*.tar.gz
74
+ if-no-files-found: error
75
+
76
+ test-publish:
77
+ if: github.repository == 'geventhttpclient/geventhttpclient'
78
+ runs-on: ubuntu-latest
79
+ needs: [build-wheels, build-sdist]
80
+ steps:
81
+ - uses: actions/download-artifact@v4
82
+ with:
83
+ pattern: dist-*
84
+ path: dist
85
+ merge-multiple: true
86
+ - uses: pypa/gh-action-pypi-publish@release/v1
87
+ name: Publish package to TestPyPI
88
+ with:
89
+ password: ${{ secrets.TEST_PYPI_API_TOKEN }}
90
+ repository-url: https://test.pypi.org/legacy/
91
+ skip-existing: true
92
+
93
+ publish:
94
+ if: github.repository == 'geventhttpclient/geventhttpclient'
95
+ runs-on: ubuntu-latest
96
+ needs: test-publish
97
+ steps:
98
+ - uses: actions/download-artifact@v4
99
+ with:
100
+ pattern: dist-*
101
+ path: dist
102
+ merge-multiple: true
103
+ - uses: pypa/gh-action-pypi-publish@release/v1
104
+ name: Publish package to PyPI
105
+ with:
106
+ password: ${{ secrets.PYPI_API_TOKEN }}
107
+ skip-existing: true
@@ -0,0 +1,75 @@
1
+ name: Tests
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ mypy:
7
+ name: mypy
8
+ runs-on: ubuntu-latest
9
+ steps:
10
+ - uses: actions/checkout@v6
11
+ with:
12
+ fetch-depth: 0
13
+ submodules: recursive
14
+ - name: Install uv
15
+ uses: astral-sh/setup-uv@v10.2.0
16
+ with:
17
+ python-version: '3.12'
18
+ enable-cache: true
19
+ - name: Install project and dependencies
20
+ run: uv sync
21
+ - name: Run mypy
22
+ run: uv run mypy
23
+
24
+ tests:
25
+ name: ${{ matrix.name }}
26
+ runs-on: ${{ matrix.os }}
27
+
28
+ strategy:
29
+ fail-fast: false
30
+ matrix:
31
+ include:
32
+ - {name: Windows, python: '3.14', os: windows-latest}
33
+ # Windows ARM64 disabled: the windows-11-arm runner is chronically
34
+ # flaky (spurious test timeouts and socket permission errors on
35
+ # otherwise green runs). Re-enable once the runner is stable.
36
+ - {name: Mac, python: '3.14', os: macos-latest}
37
+ - {name: '3.14', python: '3.14', os: ubuntu-latest}
38
+ - {name: '3.13', python: '3.13', os: ubuntu-latest}
39
+ - {name: '3.12', python: '3.12', os: ubuntu-latest}
40
+ - {name: '3.11', python: '3.11', os: ubuntu-latest}
41
+
42
+ steps:
43
+ - uses: actions/checkout@v6
44
+ with:
45
+ fetch-depth: 0
46
+ submodules: recursive
47
+ - name: Install uv
48
+ uses: astral-sh/setup-uv@v10.2.0
49
+ with:
50
+ python-version: ${{ matrix.python }}
51
+ enable-cache: true
52
+ - name: Install project and dependencies
53
+ run: uv sync
54
+ - name: Run tests
55
+ run: uv run pytest
56
+
57
+ tests-nongevent:
58
+ name: non-gevent (3.14)
59
+ runs-on: ubuntu-latest
60
+ steps:
61
+ - uses: actions/checkout@v6
62
+ with:
63
+ fetch-depth: 0
64
+ submodules: recursive
65
+ - name: Install uv
66
+ uses: astral-sh/setup-uv@v10.2.0
67
+ with:
68
+ python-version: '3.14'
69
+ enable-cache: true
70
+ - name: Install project and dependencies
71
+ run: uv sync
72
+ - name: Run tests without monkey patching
73
+ env:
74
+ NON_GEVENT: '1'
75
+ run: uv run pytest
@@ -0,0 +1,20 @@
1
+ *.o
2
+ *.so
3
+ *.pyc
4
+ *.egg-info
5
+ src/geventhttpclient/_version.py
6
+
7
+ .Python
8
+ build/
9
+ lib/
10
+ include/
11
+ bin/
12
+ .project
13
+ .pydevproject
14
+ .idea
15
+ .settings/
16
+ dist/
17
+ .tox
18
+ .cache
19
+ .venv
20
+ wheelhouse
@@ -0,0 +1,3 @@
1
+ [submodule "llhttp"]
2
+ path = llhttp
3
+ url = https://github.com/nodejs/llhttp
@@ -0,0 +1,48 @@
1
+ repos:
2
+ - repo: https://github.com/pre-commit/pre-commit-hooks
3
+ rev: v6.0.0
4
+ hooks:
5
+ - id: end-of-file-fixer
6
+ - id: trailing-whitespace
7
+ - id: debug-statements
8
+ - id: detect-private-key
9
+ exclude: ^tests/(server\.key|oncert\.pem)$
10
+ - id: check-builtin-literals
11
+ - id: check-case-conflict
12
+ - id: check-executables-have-shebangs
13
+ - id: check-json
14
+ - id: check-merge-conflict
15
+ - id: check-symlinks
16
+ - id: check-toml
17
+ - id: check-xml
18
+ - id: check-yaml
19
+ exclude: (.pre-commit-config\.yaml)
20
+
21
+ - repo: https://github.com/astral-sh/ruff-pre-commit
22
+ rev: v0.16.10
23
+ hooks:
24
+ - id: ruff
25
+ - id: ruff-format
26
+
27
+ - repo: local
28
+ hooks:
29
+ - id: mypy
30
+ name: mypy (via uv)
31
+ entry: uv run mypy
32
+ language: system
33
+ types: [python]
34
+ pass_filenames: false
35
+ files: ^src/
36
+
37
+ - repo: https://github.com/codespell-project/codespell
38
+ rev: v2.4.3
39
+ hooks:
40
+ - id: codespell
41
+
42
+ - repo: https://github.com/rvben/rumdl-pre-commit
43
+ rev: v0.2.78
44
+ hooks:
45
+ - id: rumdl-check
46
+ # llhttp is a git submodule (upstream files). pre-commit never traverses
47
+ # submodules, so this is belt-and-braces for hand-run configs.
48
+ exclude: ^llhttp/
@@ -0,0 +1,155 @@
1
+ # Changelog
2
+
3
+ API changes, deprecations and notable fixes. CI and packaging noise is
4
+ left out unless it affects users of the package.
5
+
6
+ ## 2.6.0 (2026-10-05)
7
+
8
+ ### Added
9
+
10
+ - Type annotations across the package, with a `py.typed` marker
11
+ - Basic auth added: `BasicAuth("user", "pass")`, or the `requests`-style
12
+ `("user", "pass")` tuple, on a `Session` or a single request
13
+ - `geventhttpclient.httpx`, an httpx-compatible client on the same engine
14
+ - Requests compatibility improved: `history`, `elapsed`, `cookies`,
15
+ `links`, `encoding`, `iter_content()`, `iter_lines()`, `json()`,
16
+ `bool()`, `close()` and `raise_for_status` with the response attached
17
+ - `insecure` on `UserAgent`, for TLS targets without a verified chain
18
+ - `CompatRequest` derives from `urllib.request.Request`, so cookie jars
19
+ work without workarounds
20
+
21
+ ### Changed
22
+
23
+ - Header field names and values are `str` instead of `bytes`
24
+ - Multi-value headers send one field line per element (RFC 9110)
25
+ - Redirect resolution follows RFC 3986; other schemes raise
26
+ `UnsupportedRedirectSchemeError`
27
+ - Retries after a transmission error are limited to idempotent methods
28
+ - Empty bodies on POST, PUT and PATCH send `Content-Length: 0`
29
+ - `check_hostname`, `cert_file` and `key_file` are deprecated in favour of
30
+ a custom SSL context; `check_hostname` now defaults to `True`
31
+ - Require `gevent>=25.9`
32
+
33
+ ### Fixed
34
+
35
+ - The request head is validated and encoded as latin-1, like
36
+ `http.client`, instead of allowing header smuggling
37
+ - `requests` and `urllib3` work again through the `httplib` shim
38
+ - Error statuses and redirects come through the httplib2 wrapper
39
+ - 307/308 redirects resend the body, and `Authorization` is dropped when
40
+ a redirect leaves the origin
41
+ - `URL.redirect` keeps the base path and query
42
+ - Requests retain semicolon path parameters, including after redirects
43
+ - `follow_redirects=False` is honoured by the `httpx.Client` shortcuts
44
+
45
+ ### Removed
46
+
47
+ - `Headers.iteroriginal()` and `Headers.iget()`; use `items()` and
48
+ `getlist()`
49
+ - The unmaintained `oauth2` extra
50
+
51
+ ## 2.5.1 (2026-09-30)
52
+
53
+ ### Fixed
54
+
55
+ - Requests with `body=None` sent an empty chunked body
56
+
57
+ ## 2.5.0 (2026-09-28)
58
+
59
+ ### Added
60
+
61
+ - Type annotations for the core modules, checked by `mypy` in CI
62
+
63
+ ### Changed
64
+
65
+ - Require Python 3.11 or newer and a working `ssl` module; `urllib3` is
66
+ no longer a dependency
67
+ - `read()` and `readline()` return `bytes` instead of `bytearray`,
68
+ `readline()` on a released response raises `HTTPConnectionClosed`
69
+ - Header fragments decode as latin-1; the previous UTF-8 decoding
70
+ crashed the interpreter on non-UTF-8 header bytes
71
+
72
+ ### Fixed
73
+
74
+ - The body parameter of `delete()` and `trace()` works again
75
+
76
+ ## 2.4.0 (2026-09-28)
77
+
78
+ ### Added
79
+
80
+ - `Expect: 100-continue` handling and interim 1xx responses
81
+ - CONNECT tunneling with Basic proxy authentication via `proxy_user` and
82
+ `proxy_password`
83
+ - Chunked transfer encoding for request bodies, used automatically for
84
+ bodies of unknown length
85
+ - 308 redirects
86
+
87
+ ### Changed
88
+
89
+ - The llhttp parser moved to v9.4.3, including the CVE-2024-27982 fix
90
+
91
+ ## 2.3.9 (2026-03-03)
92
+
93
+ ### Fixed
94
+
95
+ - Stale-connection validation works with the stdlib SSL implementation
96
+
97
+ ## 2.3.8 (2026-02-22)
98
+
99
+ ### Added
100
+
101
+ - Connection validation before reuse, so pooled connections closed by
102
+ the server are no longer handed out
103
+
104
+ ## 2.3.6 (2025-12-07)
105
+
106
+ ### Changed
107
+
108
+ - Python 3.13 and 3.14 are supported explicitly
109
+
110
+ ## 2.3.5 (2025-10-26)
111
+
112
+ ### Fixed
113
+
114
+ - `Headers.extend()` overwrote values of duplicate fields instead of
115
+ appending them
116
+
117
+ ## 2.3.4 (2025-06-11)
118
+
119
+ ### Fixed
120
+
121
+ - URL quoting for path and query components
122
+
123
+ ## 2.3.3 (2024-11-24)
124
+
125
+ ### Fixed
126
+
127
+ - `ssl_options` handling in the connection pool
128
+
129
+ ## 2.3.1 (2024-04-18)
130
+
131
+ ### Fixed
132
+
133
+ - Backwards compatibility with locust after the 2.3.0 restructuring
134
+
135
+ ## 2.3.0 (2024-04-18)
136
+
137
+ ### Added
138
+
139
+ - A thin `requests` compatibility layer (`geventhttpclient.requests`)
140
+ with a `Session` speaking the requests-style API subset
141
+
142
+ ## 2.2.1 (2024-04-16)
143
+
144
+ ### Changed
145
+
146
+ - URL parsing is delegated to the standard library
147
+ - `max_retries` and `max_redirects` no longer count the initial attempt
148
+
149
+ ## 2.2.0 (2024-04-12)
150
+
151
+ ### Fixed
152
+
153
+ - `Headers` preserves the original case even for headers with duplicate
154
+ field names
155
+ - Patching `http.client` worked only partially
@@ -1,7 +1,8 @@
1
1
  include src/geventhttpclient/*.py
2
+ include src/geventhttpclient/py.typed
2
3
  include ext/*.c
3
- include ext/*.h
4
- recursive-include llhttp *.h *.c LICENSE-MIT
4
+ recursive-include llhttp *.h *.c LICENSE LICENSE-MIT
5
+ graft tests
5
6
  global-exclude __pycache__
6
7
  global-exclude *.py[co]
7
8
  include pyproject.toml