Skip to content

Commit 35b6c83

Browse files
authored
fix(redirect): Using tower-http patch to fix invalid content-length header (#2709)
Fixes #2705
1 parent a54c4cf commit 35b6c83

File tree

2 files changed

+64
-1
lines changed

2 files changed

+64
-1
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ mime = "0.3.16"
130130
percent-encoding = "2.3"
131131
tokio = { version = "1.0", default-features = false, features = ["net", "time"] }
132132
tower = { version = "0.5.2", default-features = false, features = ["timeout", "util"] }
133-
tower-http = { version = "0.6.4", default-features = false, features = ["follow-redirect"] }
133+
tower-http = { version = "0.6.5", default-features = false, features = ["follow-redirect"] }
134134
pin-project-lite = "0.2.11"
135135
ipnet = "2.3"
136136

tests/redirect.rs

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -478,3 +478,66 @@ async fn test_scheme_only_check_after_policy_return_follow() {
478478
assert!(res.is_err());
479479
assert!(res.unwrap_err().is_builder());
480480
}
481+
482+
#[tokio::test]
483+
async fn test_redirect_301_302_303_empty_payload_headers() {
484+
let client = reqwest::Client::new();
485+
let codes = [301u16, 302, 303];
486+
for &code in &codes {
487+
let redirect = server::http(move |mut req| async move {
488+
if req.method() == "POST" {
489+
let data = req
490+
.body_mut()
491+
.frame()
492+
.await
493+
.unwrap()
494+
.unwrap()
495+
.into_data()
496+
.unwrap();
497+
498+
assert_eq!(&*data, b"Hello");
499+
if req.headers().get(reqwest::header::CONTENT_LENGTH).is_some() {
500+
assert_eq!(req.headers()[reqwest::header::CONTENT_LENGTH], "5");
501+
}
502+
assert_eq!(req.uri(), &*format!("/{code}"));
503+
504+
http::Response::builder()
505+
.header("location", "/dst")
506+
.header("server", "test-dst")
507+
.status(code)
508+
.body(Body::default())
509+
.unwrap()
510+
} else {
511+
assert_eq!(req.method(), "GET");
512+
assert!(req.headers().get(reqwest::header::CONTENT_TYPE).is_none());
513+
assert!(req.headers().get(reqwest::header::CONTENT_LENGTH).is_none());
514+
assert!(req
515+
.headers()
516+
.get(reqwest::header::CONTENT_ENCODING)
517+
.is_none());
518+
http::Response::builder()
519+
.header("server", "test-dst")
520+
.body(Body::default())
521+
.unwrap()
522+
}
523+
});
524+
525+
let url = format!("http://{}/{}", redirect.addr(), code);
526+
let dst = format!("http://{}/{}", redirect.addr(), "dst");
527+
let res = client
528+
.post(&url)
529+
.body("Hello")
530+
.header(reqwest::header::CONTENT_TYPE, "text/plain")
531+
.header(reqwest::header::CONTENT_LENGTH, "5")
532+
.header(reqwest::header::CONTENT_ENCODING, "identity")
533+
.send()
534+
.await
535+
.unwrap();
536+
assert_eq!(res.url().as_str(), dst);
537+
assert_eq!(res.status(), 200);
538+
assert_eq!(
539+
res.headers().get(reqwest::header::SERVER).unwrap(),
540+
&"test-dst"
541+
);
542+
}
543+
}

0 commit comments

Comments
 (0)