mirror of
https://github.com/lexmount/moli.git
synced 2026-10-06 08:00:59 +00:00
fix(fetch): retain cookie reports for manual raw redirects
This commit is contained in:
@@ -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(
|
||||
|
||||
@@ -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(())
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user