From d25dca2f6a971f80e7f2675ca8218c8c6e5a234f Mon Sep 17 00:00:00 2001 From: shuofengzhang Date: Thu, 5 Mar 2026 02:37:08 +0800 Subject: [PATCH] fix: preserve request extensions on x402 retries --- src/x402_openai/_transport.py | 1 + tests/test_transport.py | 39 +++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 tests/test_transport.py diff --git a/src/x402_openai/_transport.py b/src/x402_openai/_transport.py index 5ab054c..397113a 100644 --- a/src/x402_openai/_transport.py +++ b/src/x402_openai/_transport.py @@ -32,6 +32,7 @@ def _clone_request_with_headers( url=original.url, headers=headers, content=original.content, + extensions=dict(original.extensions), ) diff --git a/tests/test_transport.py b/tests/test_transport.py new file mode 100644 index 0000000..075799a --- /dev/null +++ b/tests/test_transport.py @@ -0,0 +1,39 @@ +from __future__ import annotations + +import httpx + +from x402_openai._transport import _clone_request_with_headers + + +def test_clone_request_merges_headers() -> None: + original = httpx.Request( + "POST", + "https://example.com/v1/chat", + headers={"authorization": "Bearer old-token", "x-trace": "abc"}, + content=b'{"prompt":"hello"}', + ) + + cloned = _clone_request_with_headers( + original, + { + "authorization": "Bearer new-token", + "x-payment": "signed", + }, + ) + + assert cloned.headers["authorization"] == "Bearer new-token" + assert cloned.headers["x-trace"] == "abc" + assert cloned.headers["x-payment"] == "signed" + assert cloned.content == original.content + + +def test_clone_request_preserves_extensions() -> None: + original = httpx.Request( + "GET", + "https://example.com/v1/models", + extensions={"timeout": {"connect": 1.0, "read": 2.0}}, + ) + + cloned = _clone_request_with_headers(original, {"x-payment": "signed"}) + + assert cloned.extensions == original.extensions