@@ -190,6 +190,8 @@ def test_browser_request_uses_curl_raw() -> None:
190190 request = cast (httpx .Request , cast (Any , route .calls [0 ]).request )
191191 assert "curl/raw" in str (request .url )
192192 assert request .url .params .get ("jwt" ) == "token-abc"
193+ assert request .headers .get ("Authorization" ) is None
194+ assert request .headers .get ("x-kernel-direct-vm-request" ) is None
193195
194196
195197@respx .mock
@@ -344,6 +346,8 @@ async def test_async_raw_browser_create_warms_route_cache() -> None:
344346 assert routed .content == b"ok"
345347 request = cast (httpx .Request , cast (Any , routed_request .calls [0 ]).request )
346348 assert request .url .params .get ("jwt" ) == "token-abc"
349+ assert request .headers .get ("Authorization" ) is None
350+ assert request .headers .get ("x-kernel-direct-vm-request" ) is None
347351
348352
349353@respx .mock
@@ -1727,9 +1731,15 @@ async def handle_async_request(self, request: httpx.Request) -> httpx.Response:
17271731
17281732
17291733@pytest .mark .parametrize ("origin_first" , [True , False ])
1730- def test_direct_vm_redirect_evicts_originating_cache_when_http_client_is_shared (
1734+ @pytest .mark .parametrize (
1735+ ("status_code" , "expected_error" ),
1736+ [(307 , APIConnectionError ), (401 , AuthenticationError )],
1737+ )
1738+ def test_direct_vm_failure_evicts_originating_cache_when_http_client_is_shared (
17311739 monkeypatch : pytest .MonkeyPatch ,
17321740 origin_first : bool ,
1741+ status_code : int ,
1742+ expected_error : type [Exception ],
17331743) -> None :
17341744 monkeypatch .delenv ("KERNEL_BROWSER_ROUTING_SUBRESOURCES" , raising = False )
17351745 requests : list [tuple [httpx .URL , bytes ]] = []
@@ -1740,7 +1750,7 @@ def handle_request(self, request: httpx.Request) -> httpx.Response:
17401750 body = b"" .join (cast (Iterator [bytes ], request .stream ))
17411751 requests .append ((request .url , body ))
17421752 return httpx .Response (
1743- 307 ,
1753+ status_code ,
17441754 headers = {"location" : "http://other-vm.test/browser/kernel/fs/write_file" },
17451755 )
17461756
@@ -1760,8 +1770,9 @@ def make_client() -> Kernel:
17601770 other_client , client = make_client (), make_client ()
17611771
17621772 try :
1773+ assert len (http_client .event_hooks ["response" ]) == 1
17631774 _cache_browser (client )
1764- with pytest .raises (APIConnectionError ):
1775+ with pytest .raises (expected_error ):
17651776 client .browsers .fs .write_file ("sess-1" , _UnseekableFile (b"payload" ), path = "/tmp/x" )
17661777 assert client .browser_route_cache .get ("sess-1" ) is None
17671778 assert other_client .browser_route_cache .get ("sess-1" ) is None
@@ -1778,9 +1789,15 @@ def make_client() -> Kernel:
17781789
17791790@pytest .mark .asyncio
17801791@pytest .mark .parametrize ("origin_first" , [True , False ])
1781- async def test_async_direct_vm_redirect_evicts_originating_cache_when_http_client_is_shared (
1792+ @pytest .mark .parametrize (
1793+ ("status_code" , "expected_error" ),
1794+ [(308 , APIConnectionError ), (403 , PermissionDeniedError )],
1795+ )
1796+ async def test_async_direct_vm_failure_evicts_originating_cache_when_http_client_is_shared (
17821797 monkeypatch : pytest .MonkeyPatch ,
17831798 origin_first : bool ,
1799+ status_code : int ,
1800+ expected_error : type [Exception ],
17841801) -> None :
17851802 monkeypatch .delenv ("KERNEL_BROWSER_ROUTING_SUBRESOURCES" , raising = False )
17861803 requests : list [tuple [httpx .URL , bytes ]] = []
@@ -1791,7 +1808,7 @@ async def handle_async_request(self, request: httpx.Request) -> httpx.Response:
17911808 body = b"" .join ([chunk async for chunk in cast (AsyncIterator [bytes ], request .stream )])
17921809 requests .append ((request .url , body ))
17931810 return httpx .Response (
1794- 308 ,
1811+ status_code ,
17951812 headers = {"location" : "http://other-vm.test/browser/kernel/fs/write_file" },
17961813 )
17971814
@@ -1811,10 +1828,11 @@ def make_client() -> AsyncKernel:
18111828 other_client , client = make_client (), make_client ()
18121829
18131830 try :
1831+ assert len (http_client .event_hooks ["response" ]) == 1
18141832 route = browser_route_from_browser (_fake_browser ())
18151833 assert route is not None
18161834 client .browser_route_cache .set (route )
1817- with pytest .raises (APIConnectionError ):
1835+ with pytest .raises (expected_error ):
18181836 await client .browsers .fs .write_file (
18191837 "sess-1" ,
18201838 cast (Any , _UnreplayableAsyncBody (b"payload" )),
0 commit comments