Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions py/src/braintrust/devserver/cors.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
"x-bt-project-id",
"x-bt-stream-fmt",
"x-bt-use-cache",
"x-bt-use-gateway",
"x-stainless-os",
"x-stainless-lang",
"x-stainless-package-version",
Expand Down
22 changes: 22 additions & 0 deletions py/src/braintrust/devserver/test_server_integration.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,28 @@ def test_devserver_health_check(client):
assert response.text == "Hello, world!"


def test_cors_preflight_allows_gateway_header(client):
"""Test that CORS preflight accepts x-bt-use-gateway header.

The Braintrust Playground sends this header when gateway routing is
enabled. If it is missing from the devserver's allowed-headers list
the browser blocks the actual request with a CORS error.
"""
response = client.options(
"/eval",
headers={
"origin": "https://www.braintrust.dev",
"access-control-request-method": "POST",
"access-control-request-headers": "x-bt-use-gateway",
},
)
assert response.status_code == 200
allowed = response.headers.get("access-control-allow-headers", "")
assert "x-bt-use-gateway" in allowed, (
f"x-bt-use-gateway not found in access-control-allow-headers: {allowed}"
)


@pytest.mark.vcr
def test_devserver_list_evaluators(client, api_key, org_name):
"""Test listing evaluators endpoint."""
Expand Down
Loading