Skip to content

Commit 584d996

Browse files
committed
Add upstream fork request headers
1 parent 147be6a commit 584d996

File tree

3 files changed

+42
-0
lines changed

3 files changed

+42
-0
lines changed

docs/userguides/forking_networks.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ Some options are:
77
1. [ApeWorX/ape-foundry](https://github.com/ApeWorX/ape-foundry)
88
2. [ApeWorX/ape-hardhat](https://github.com/ApeWorX/ape-hardhat)
99

10+
If your upstream RPC requires custom HTTP headers, such as an `Authorization: Bearer ...`
11+
token, configure them using Ape's standard `request_headers` settings on the upstream
12+
ecosystem, network, or provider. Ape forwards those headers in the fork configuration so
13+
fork-capable provider plugins can pass them through to their backend process.
14+
1015
You can install one of these plugins by doing:
1116

1217
```shell

src/ape/managers/networks.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,11 @@ def fork(
399399

400400
if uri := self.provider.connection_str:
401401
fork_settings["upstream_provider"] = uri
402+
headers = self.get_request_headers(
403+
self.ecosystem.name, self.network.name, self.provider.name
404+
)
405+
if headers:
406+
fork_settings["upstream_provider_request_headers"] = dict(headers)
402407

403408
_dict_overlay(
404409
provider_settings,

tests/functional/geth/test_network_manager.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,38 @@ def test_fork_upstream_provider(networks, mock_geth_sepolia, geth_provider, mock
3939
del geth_provider.provider_settings["uri"]
4040

4141

42+
@geth_process_test
43+
def test_fork_upstream_provider_request_headers(
44+
project, networks, mock_geth_sepolia, mock_fork_provider
45+
):
46+
config = {
47+
"request_headers": {"X-Top-Level": "base"},
48+
"ethereum": {
49+
"request_headers": {"X-Ecosystem": "ethereum"},
50+
"sepolia": {
51+
"request_headers": {
52+
"Authorization": "Bearer test-token",
53+
"X-Network": "sepolia",
54+
}
55+
},
56+
},
57+
"node": {"request_headers": {"X-Provider": "node"}},
58+
}
59+
with project.temp_config(**config):
60+
with networks.fork():
61+
call = mock_fork_provider.partial_call
62+
63+
settings = call[1]["provider_settings"]["fork"]["ethereum"]["sepolia"]
64+
headers = settings["upstream_provider_request_headers"]
65+
assert headers["Authorization"] == "Bearer test-token"
66+
assert headers["X-Top-Level"] == "base"
67+
assert headers["X-Ecosystem"] == "ethereum"
68+
assert headers["X-Network"] == "sepolia"
69+
assert headers["X-Provider"] == "node"
70+
assert headers["Content-Type"] == "application/json"
71+
assert headers["User-Agent"].startswith("Ape/")
72+
73+
4274
# NOTE: Test is flakey because random URLs may be offline when test runs; avoid CI failure.
4375
@pytest.mark.flaky(reruns=5)
4476
@geth_process_test

0 commit comments

Comments
 (0)