Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-httpcore2 for
openSUSE:Factory checked in at 2026-09-28 10:36:25
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-httpcore2 (Old)
and /work/SRC/openSUSE:Factory/.python-httpcore2.new.383539 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-httpcore2"
Mon Sep 28 10:36:25 2026 rev:4 rq:1380301 version:2.13.1
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-httpcore2/python-httpcore2.changes
2026-08-27 18:53:14.884475761 +0200
+++
/work/SRC/openSUSE:Factory/.python-httpcore2.new.383539/python-httpcore2.changes
2026-09-28 10:37:03.526346233 +0200
@@ -1,0 +2,14 @@
+Fri Sep 25 04:47:18 UTC 2026 - Steve Kowalik <[email protected]>
+
+- Update to 2.13.1:
+ ## Changed
+ * Require Trio 0.34.0 or later for the trio extra.
+ ## Fixed
+ * Honor the sni_hostname extension for TLS inside HTTP proxy tunnels
+ without applying it to the proxy's TLS connection.
+ * Prefer HTTP/2 during TLS protocol negotiation when enabled, and stop
+ advertising HTTP/1.1 when it is disabled.
+ * Avoid nested async generator finalization errors when streamed responses
+ are abandoned early.
+
+-------------------------------------------------------------------
Old:
----
httpcore2-2.12.0.tar.gz
New:
----
httpcore2-2.13.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-httpcore2.spec ++++++
--- /var/tmp/diff_new_pack.xY25Ht/_old 2026-09-28 10:37:04.254376749 +0200
+++ /var/tmp/diff_new_pack.xY25Ht/_new 2026-09-28 10:37:04.255376791 +0200
@@ -17,7 +17,7 @@
Name: python-httpcore2
-Version: 2.12.0
+Version: 2.13.1
Release: 0
Summary: A minimal low-level HTTP client
License: BSD-3-Clause
@@ -37,7 +37,7 @@
Requires: python-truststore >= 0.10
Suggests: python-h2 >= 3
Suggests: python-socksio >= 1.0
-Suggests: python-trio >= 0.33.0
+Suggests: python-trio >= 0.34.0
Suggests: python-anyio >= 4.5
BuildArch: noarch
%python_subpackages
++++++ httpcore2-2.12.0.tar.gz -> httpcore2-2.13.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/httpcore2-2.12.0/CHANGELOG.md
new/httpcore2-2.13.1/CHANGELOG.md
--- old/httpcore2-2.12.0/CHANGELOG.md 2020-02-02 01:00:00.000000000 +0100
+++ new/httpcore2-2.13.1/CHANGELOG.md 2020-02-02 01:00:00.000000000 +0100
@@ -4,6 +4,27 @@
The format is based on [Keep a
Changelog](https://keepachangelog.com/en/1.0.0/).
+## 2.13.1 (September 23rd, 2026)
+
+### Fixed
+
+* Honor the `sni_hostname` extension for TLS inside HTTP proxy tunnels without
applying it to the proxy's TLS connection.
+ ([#1223](https://github.com/pydantic/httpx2/pull/1223))
+* Prefer HTTP/2 during TLS protocol negotiation when enabled, and stop
advertising HTTP/1.1 when it is disabled.
+ ([#1155](https://github.com/pydantic/httpx2/pull/1155))
+
+## 2.13.0 (September 14th, 2026)
+
+### Changed
+
+* Require Trio 0.34.0 or later for the `trio` extra.
+ ([#1179](https://github.com/pydantic/httpx2/pull/1179))
+
+### Fixed
+
+* Avoid nested async generator finalization errors when streamed responses are
abandoned early.
+ ([#1204](https://github.com/pydantic/httpx2/pull/1204))
+
## 2.12.0 (August 18th, 2026)
No changes since `2.11.0`. Version bumped to stay in lockstep with `httpx2`.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/httpcore2-2.12.0/PKG-INFO
new/httpcore2-2.13.1/PKG-INFO
--- old/httpcore2-2.12.0/PKG-INFO 2020-02-02 01:00:00.000000000 +0100
+++ new/httpcore2-2.13.1/PKG-INFO 2020-02-02 01:00:00.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.5
Name: httpcore2
-Version: 2.12.0
+Version: 2.13.1
Summary: A minimal low-level HTTP client.
Project-URL: Changelog,
https://github.com/pydantic/httpx2/blob/main/src/httpcore2/CHANGELOG.md
Project-URL: Homepage, https://github.com/pydantic/httpx2
@@ -36,7 +36,7 @@
Provides-Extra: socks
Requires-Dist: socksio==1.*; extra == 'socks'
Provides-Extra: trio
-Requires-Dist: trio<1.0,>=0.33.0; extra == 'trio'
+Requires-Dist: trio<1.0,>=0.34.0; extra == 'trio'
Description-Content-Type: text/markdown
# HTTPCore 2
@@ -152,6 +152,27 @@
The format is based on [Keep a
Changelog](https://keepachangelog.com/en/1.0.0/).
+## 2.13.1 (September 23rd, 2026)
+
+### Fixed
+
+* Honor the `sni_hostname` extension for TLS inside HTTP proxy tunnels without
applying it to the proxy's TLS connection.
+ ([#1223](https://github.com/pydantic/httpx2/pull/1223))
+* Prefer HTTP/2 during TLS protocol negotiation when enabled, and stop
advertising HTTP/1.1 when it is disabled.
+ ([#1155](https://github.com/pydantic/httpx2/pull/1155))
+
+## 2.13.0 (September 14th, 2026)
+
+### Changed
+
+* Require Trio 0.34.0 or later for the `trio` extra.
+ ([#1179](https://github.com/pydantic/httpx2/pull/1179))
+
+### Fixed
+
+* Avoid nested async generator finalization errors when streamed responses are
abandoned early.
+ ([#1204](https://github.com/pydantic/httpx2/pull/1204))
+
## 2.12.0 (August 18th, 2026)
No changes since `2.11.0`. Version bumped to stay in lockstep with `httpx2`.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/httpcore2-2.12.0/httpcore2/_async/connection.py
new/httpcore2-2.13.1/httpcore2/_async/connection.py
--- old/httpcore2-2.12.0/httpcore2/_async/connection.py 2020-02-02
01:00:00.000000000 +0100
+++ new/httpcore2-2.13.1/httpcore2/_async/connection.py 2020-02-02
01:00:00.000000000 +0100
@@ -128,7 +128,7 @@
if self._origin.scheme in (b"https", b"wss"):
ssl_context = default_ssl_context() if self._ssl_context
is None else self._ssl_context
- alpn_protocols = ["http/1.1", "h2"] if self._http2 else
["http/1.1"]
+ alpn_protocols = (["h2", "http/1.1"] if self._http1 else
["h2"]) if self._http2 else ["http/1.1"]
ssl_context.set_alpn_protocols(alpn_protocols)
kwargs = {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/httpcore2-2.12.0/httpcore2/_async/http_proxy.py
new/httpcore2-2.13.1/httpcore2/_async/http_proxy.py
--- old/httpcore2-2.12.0/httpcore2/_async/http_proxy.py 2020-02-02
01:00:00.000000000 +0100
+++ new/httpcore2-2.13.1/httpcore2/_async/http_proxy.py 2020-02-02
01:00:00.000000000 +0100
@@ -191,7 +191,7 @@
url=url,
headers=headers,
content=request.stream,
- extensions=request.extensions,
+ extensions={key: value for key, value in
request.extensions.items() if key != "sni_hostname"},
)
return await self._connection.handle_async_request(proxy_request)
@@ -274,7 +274,7 @@
method=b"CONNECT",
url=connect_url,
headers=connect_headers,
- extensions=request.extensions,
+ extensions={key: value for key, value in
request.extensions.items() if key != "sni_hostname"},
)
connect_response = await
self._connection.handle_async_request(connect_request)
@@ -289,12 +289,13 @@
# Upgrade the stream to SSL
ssl_context = default_ssl_context() if self._ssl_context is
None else self._ssl_context
- alpn_protocols = ["http/1.1", "h2"] if self._http2 else
["http/1.1"]
+ alpn_protocols = (["h2", "http/1.1"] if self._http1 else
["h2"]) if self._http2 else ["http/1.1"]
ssl_context.set_alpn_protocols(alpn_protocols)
+ server_hostname = request.extensions.get("sni_hostname") or
self._remote_origin.host.decode("ascii")
kwargs = {
"ssl_context": ssl_context,
- "server_hostname":
self._remote_origin.host.decode("ascii"),
+ "server_hostname": server_hostname,
"timeout": timeout,
}
async with Trace("start_tls", logger, request, kwargs) as
trace:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/httpcore2-2.12.0/httpcore2/_async/socks_proxy.py
new/httpcore2-2.13.1/httpcore2/_async/socks_proxy.py
--- old/httpcore2-2.12.0/httpcore2/_async/socks_proxy.py 2020-02-02
01:00:00.000000000 +0100
+++ new/httpcore2-2.13.1/httpcore2/_async/socks_proxy.py 2020-02-02
01:00:00.000000000 +0100
@@ -242,7 +242,9 @@
# Upgrade the stream to SSL
if self._remote_origin.scheme in (b"https", b"wss"):
ssl_context = default_ssl_context() if
self._ssl_context is None else self._ssl_context
- alpn_protocols = ["http/1.1", "h2"] if self._http2
else ["http/1.1"]
+ alpn_protocols = (
+ (["h2", "http/1.1"] if self._http1 else ["h2"]) if
self._http2 else ["http/1.1"]
+ )
ssl_context.set_alpn_protocols(alpn_protocols)
kwargs = {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/httpcore2-2.12.0/httpcore2/_sync/connection.py
new/httpcore2-2.13.1/httpcore2/_sync/connection.py
--- old/httpcore2-2.12.0/httpcore2/_sync/connection.py 2020-02-02
01:00:00.000000000 +0100
+++ new/httpcore2-2.13.1/httpcore2/_sync/connection.py 2020-02-02
01:00:00.000000000 +0100
@@ -128,7 +128,7 @@
if self._origin.scheme in (b"https", b"wss"):
ssl_context = default_ssl_context() if self._ssl_context
is None else self._ssl_context
- alpn_protocols = ["http/1.1", "h2"] if self._http2 else
["http/1.1"]
+ alpn_protocols = (["h2", "http/1.1"] if self._http1 else
["h2"]) if self._http2 else ["http/1.1"]
ssl_context.set_alpn_protocols(alpn_protocols)
kwargs = {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/httpcore2-2.12.0/httpcore2/_sync/http_proxy.py
new/httpcore2-2.13.1/httpcore2/_sync/http_proxy.py
--- old/httpcore2-2.12.0/httpcore2/_sync/http_proxy.py 2020-02-02
01:00:00.000000000 +0100
+++ new/httpcore2-2.13.1/httpcore2/_sync/http_proxy.py 2020-02-02
01:00:00.000000000 +0100
@@ -191,7 +191,7 @@
url=url,
headers=headers,
content=request.stream,
- extensions=request.extensions,
+ extensions={key: value for key, value in
request.extensions.items() if key != "sni_hostname"},
)
return self._connection.handle_request(proxy_request)
@@ -274,7 +274,7 @@
method=b"CONNECT",
url=connect_url,
headers=connect_headers,
- extensions=request.extensions,
+ extensions={key: value for key, value in
request.extensions.items() if key != "sni_hostname"},
)
connect_response =
self._connection.handle_request(connect_request)
@@ -289,12 +289,13 @@
# Upgrade the stream to SSL
ssl_context = default_ssl_context() if self._ssl_context is
None else self._ssl_context
- alpn_protocols = ["http/1.1", "h2"] if self._http2 else
["http/1.1"]
+ alpn_protocols = (["h2", "http/1.1"] if self._http1 else
["h2"]) if self._http2 else ["http/1.1"]
ssl_context.set_alpn_protocols(alpn_protocols)
+ server_hostname = request.extensions.get("sni_hostname") or
self._remote_origin.host.decode("ascii")
kwargs = {
"ssl_context": ssl_context,
- "server_hostname":
self._remote_origin.host.decode("ascii"),
+ "server_hostname": server_hostname,
"timeout": timeout,
}
with Trace("start_tls", logger, request, kwargs) as trace:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/httpcore2-2.12.0/httpcore2/_sync/socks_proxy.py
new/httpcore2-2.13.1/httpcore2/_sync/socks_proxy.py
--- old/httpcore2-2.12.0/httpcore2/_sync/socks_proxy.py 2020-02-02
01:00:00.000000000 +0100
+++ new/httpcore2-2.13.1/httpcore2/_sync/socks_proxy.py 2020-02-02
01:00:00.000000000 +0100
@@ -242,7 +242,9 @@
# Upgrade the stream to SSL
if self._remote_origin.scheme in (b"https", b"wss"):
ssl_context = default_ssl_context() if
self._ssl_context is None else self._ssl_context
- alpn_protocols = ["http/1.1", "h2"] if self._http2
else ["http/1.1"]
+ alpn_protocols = (
+ (["h2", "http/1.1"] if self._http1 else ["h2"]) if
self._http2 else ["http/1.1"]
+ )
ssl_context.set_alpn_protocols(alpn_protocols)
kwargs = {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/httpcore2-2.12.0/httpcore2/_utils.py
new/httpcore2-2.13.1/httpcore2/_utils.py
--- old/httpcore2-2.12.0/httpcore2/_utils.py 2020-02-02 01:00:00.000000000
+0100
+++ new/httpcore2-2.13.1/httpcore2/_utils.py 2020-02-02 01:00:00.000000000
+0100
@@ -5,15 +5,14 @@
import sys
import typing
from collections.abc import (
- AsyncGenerator,
AsyncIterable,
AsyncIterator,
Generator,
Iterable,
Iterator,
)
-from contextlib import asynccontextmanager, contextmanager
-from inspect import isasyncgen
+from contextlib import AbstractAsyncContextManager, aclosing, contextmanager,
nullcontext
+from types import AsyncGeneratorType
T = typing.TypeVar("T")
@@ -48,18 +47,15 @@
return bool(p.poll(0))
-@asynccontextmanager
-async def safe_async_iterate(
+def safe_async_iterate(
iterable_or_iterator: AsyncIterable[T] | AsyncIterator[T], /
-) -> AsyncGenerator[AsyncIterator[T]]:
+) -> AbstractAsyncContextManager[AsyncIterator[T]]:
iterator = (
iterable_or_iterator if isinstance(iterable_or_iterator,
AsyncIterator) else iterable_or_iterator.__aiter__()
)
- try:
- yield iterator
- finally:
- if isasyncgen(iterator):
- await iterator.aclose()
+ if isinstance(iterator, AsyncGeneratorType):
+ return aclosing(iterator)
+ return nullcontext(iterator)
@contextmanager
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/httpcore2-2.12.0/pyproject.toml
new/httpcore2-2.13.1/pyproject.toml
--- old/httpcore2-2.12.0/pyproject.toml 2020-02-02 01:00:00.000000000 +0100
+++ new/httpcore2-2.13.1/pyproject.toml 2020-02-02 01:00:00.000000000 +0100
@@ -2,7 +2,7 @@
requires = [
"hatchling",
"hatch-fancy-pypi-readme",
- "uv-dynamic-versioning>=0.14.0",
+ "uv-dynamic-versioning>=0.14.1",
]
build-backend = "hatchling.build"
@@ -49,7 +49,7 @@
[project.optional-dependencies]
http2 = ["h2>=3,<5"]
socks = ["socksio==1.*"]
-trio = ["trio>=0.33.0,<1.0"]
+trio = ["trio>=0.34.0,<1.0"]
asyncio = ["anyio>=4.5.0,<5.0"]
[project.urls]