From 053f5a5c939dde38cb93404b579854bc8f2fad88 Mon Sep 17 00:00:00 2001 From: moumar Date: Wed, 9 Mar 2022 21:09:25 +0100 Subject: [PATCH] fix content-length calculation on range requests (#228) * fix content-length calculation on range requests * changelog Co-authored-by: David Pedersen --- tower-http/CHANGELOG.md | 4 +++- tower-http/src/services/fs/serve_dir.rs | 10 ++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/tower-http/CHANGELOG.md b/tower-http/CHANGELOG.md index 18ee63fc..27f55daa 100644 --- a/tower-http/CHANGELOG.md +++ b/tower-http/CHANGELOG.md @@ -21,7 +21,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Fixed -- None. +- Fix content-length calculation on range requests ([#228]) + +[#228]: https://github.com/tower-rs/tower-http/pull/228 # 0.2.4 (March 5, 2022) diff --git a/tower-http/src/services/fs/serve_dir.rs b/tower-http/src/services/fs/serve_dir.rs index cc5d2f3e..0e6a31ca 100644 --- a/tower-http/src/services/fs/serve_dir.rs +++ b/tower-http/src/services/fs/serve_dir.rs @@ -512,8 +512,7 @@ impl Future for ResponseFuture { }; let mut builder = Response::builder() .header(header::CONTENT_TYPE, file_request.mime_header_value) - .header(header::ACCEPT_RANGES, "bytes") - .header(header::CONTENT_LENGTH, size.to_string()); + .header(header::ACCEPT_RANGES, "bytes"); if let Some(encoding) = file_request.maybe_encoding { builder = builder .header(header::CONTENT_ENCODING, encoding.into_header_value()); @@ -597,6 +596,7 @@ fn handle_file_request( header::CONTENT_RANGE, format!("bytes {}-{}/{}", range.start(), range.end(), size), ) + .header(header::CONTENT_LENGTH, range.end() - range.start() + 1) .status(StatusCode::PARTIAL_CONTENT) .body(body) } @@ -621,7 +621,9 @@ fn handle_file_request( } else { empty_body() }; - builder.body(body) + builder + .header(header::CONTENT_LENGTH, size.to_string()) + .body(body) } } } @@ -1083,7 +1085,7 @@ mod tests { assert_eq!(res.status(), StatusCode::PARTIAL_CONTENT); assert_eq!( res.headers()["content-length"], - file_contents.len().to_string() + (bytes_end_incl - bytes_start_incl + 1).to_string() ); assert!(res.headers()["content-range"] .to_str()