Skip to content

Commit 45275ee

Browse files
fix(clients): remove invalid Access-Control-Expose-Headers request header
The x402-fetch, x402-axios, and Python (httpx, requests) clients were setting Access-Control-Expose-Headers as a REQUEST header. This is incorrect - Access-Control-Expose-Headers is a RESPONSE header that only makes sense when set by the server, not the client. Setting this header in a request has no effect on CORS behavior. The server-side middlewares are responsible for setting this header in their responses to allow browser clients to access the X-PAYMENT-RESPONSE header.
1 parent aff487f commit 45275ee

File tree

8 files changed

+0
-14
lines changed

8 files changed

+0
-14
lines changed

python/x402/src/x402/clients/httpx.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ async def on_response(self, response: Response) -> Response:
5656
request = response.request
5757

5858
request.headers["X-Payment"] = payment_header
59-
request.headers["Access-Control-Expose-Headers"] = "X-Payment-Response"
6059

6160
# Retry the request
6261
async with AsyncClient() as client:

python/x402/src/x402/clients/requests.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ def send(self, request, **kwargs):
6666
# Mark as retry and add payment header
6767
self._is_retry = True
6868
request.headers["X-Payment"] = payment_header
69-
request.headers["Access-Control-Expose-Headers"] = "X-Payment-Response"
7069

7170
retry_response = super().send(request, **kwargs)
7271

python/x402/tests/clients/test_httpx.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,10 +124,6 @@ async def test_on_response_payment_flow(hooks, payment_requirements):
124124
assert mock_client.send.called
125125
retry_request = mock_client.send.call_args[0][0]
126126
assert retry_request.headers["X-Payment"] == mock_header
127-
assert (
128-
retry_request.headers["Access-Control-Expose-Headers"]
129-
== "X-Payment-Response"
130-
)
131127

132128
# Verify the mocked methods were called with correct arguments
133129
hooks.client.select_payment_requirements.assert_called_once_with(

python/x402/tests/clients/test_requests.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -200,10 +200,6 @@ def mock_send_impl(req, **kwargs):
200200
retry_call = mock_send.call_args_list[1]
201201
retry_request = retry_call[0][0]
202202
assert retry_request.headers["X-Payment"] == mock_header
203-
assert (
204-
retry_request.headers["Access-Control-Expose-Headers"]
205-
== "X-Payment-Response"
206-
)
207203

208204

209205
def test_adapter_payment_error(adapter, payment_requirements):

typescript/packages/x402-axios/src/index.test.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,6 @@ describe("withPaymentInterceptor()", () => {
141141
...error.config,
142142
headers: new AxiosHeaders({
143143
"X-PAYMENT": paymentHeader,
144-
"Access-Control-Expose-Headers": "X-PAYMENT-RESPONSE",
145144
}),
146145
__is402Retry: true,
147146
});

typescript/packages/x402-axios/src/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,6 @@ export function withPaymentInterceptor(
9999
(originalConfig as { __is402Retry?: boolean }).__is402Retry = true;
100100

101101
originalConfig.headers["X-PAYMENT"] = paymentHeader;
102-
originalConfig.headers["Access-Control-Expose-Headers"] = "X-PAYMENT-RESPONSE";
103102

104103
const secondResponse = await axiosClient.request(originalConfig);
105104
return secondResponse;

typescript/packages/x402-fetch/src/index.test.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,6 @@ describe("fetchWithPayment()", () => {
102102
headers: {
103103
"Content-Type": "application/json",
104104
"X-PAYMENT": paymentHeader,
105-
"Access-Control-Expose-Headers": "X-PAYMENT-RESPONSE",
106105
},
107106
__is402Retry: true,
108107
} as RequestInitWithRetry);

typescript/packages/x402-fetch/src/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,6 @@ export function wrapFetchWithPayment(
106106
headers: {
107107
...(init?.headers || {}),
108108
"X-PAYMENT": paymentHeader,
109-
"Access-Control-Expose-Headers": "X-PAYMENT-RESPONSE",
110109
},
111110
__is402Retry: true,
112111
};

0 commit comments

Comments
 (0)