fix(fetch): retain cookie reports for manual raw redirects

This commit is contained in:
ldm0
2026-10-05 00:16:01 +08:00
committed by Donough Liu
parent 4944ea15b2
commit ec4eda38d7
2 changed files with 30 additions and 28 deletions
+2 -6
View File
@@ -2302,18 +2302,14 @@ impl RuntimeOwner {
}
job.cancel_handle.mark_response_terminal();
let (started_tx, cookie_set_reports, cache_body_writer) = {
let (started_tx, cache_body_writer) = {
let streaming = easy
.get_mut()
.raw_streaming_mut()
.expect("raw streaming request should use raw streaming collector");
streaming.finish_streaming_body();
let (started_tx, _) = streaming.take_response_channels();
(
started_tx,
streaming.take_cookie_set_reports(),
streaming.take_cache_body_writer(),
)
(started_tx, streaming.take_cache_body_writer())
};
if let Some(cache_body_writer) = cache_body_writer
&& let Err(error) = finish_streaming_cached_response(
+28 -22
View File
@@ -146,29 +146,35 @@ async fn header_eof_processes_cookies_before_following_redirects() -> Result<()>
#[tokio::test]
async fn header_eof_keeps_manual_raw_redirects_unfollowed() -> Result<()> {
let listener = TcpListener::bind("127.0.0.1:0").await?;
let url = format!("http://{}/start", listener.local_addr()?);
let server = tokio::spawn(serve_responses(
listener,
vec![
for headers_terminated in [false, true] {
let listener = TcpListener::bind("127.0.0.1:0").await?;
let url = format!("http://{}/start", listener.local_addr()?);
let mut response =
b"HTTP/1.1 302 Found\r\nLocation: /final\r\nSet-Cookie: redirect=one; Path=/\r\n"
.to_vec(),
],
));
let client = FetchClient::new(&FetchConfig::default(), new_shared_browser_cookie_store());
let (head, body) = fetch_in_mode(
&client,
Request::get(&url)?.with_follow_redirects(false),
"raw",
)
.await?;
assert_eq!(head.status, 302);
assert_eq!(head.final_url.path(), "/start");
assert!(!head.redirected);
assert_eq!(head.cookie_set_reports.len(), 1);
assert!(body.is_empty());
assert_eq!(server.await??.len(), 1);
assert!(client.shutdown().is_clean());
.to_vec();
if headers_terminated {
response.extend_from_slice(b"\r\n");
}
let server = tokio::spawn(serve_responses(listener, vec![response]));
let client = FetchClient::new(&FetchConfig::default(), new_shared_browser_cookie_store());
let (head, body) = fetch_in_mode(
&client,
Request::get(&url)?.with_follow_redirects(false),
"raw",
)
.await?;
assert_eq!(head.status, 302);
assert_eq!(head.final_url.path(), "/start");
assert!(!head.redirected);
assert_eq!(
head.cookie_set_reports.len(),
1,
"headers_terminated={headers_terminated}"
);
assert!(body.is_empty());
assert_eq!(server.await??.len(), 1);
assert!(client.shutdown().is_clean());
}
Ok(())
}