mirror of https://github.com/fafhrd91/actix-web
fix(files): handle `bytes=0-` nicely
This commit is contained in:
parent
41e4863748
commit
6eff474f74
|
|
@ -3,6 +3,7 @@
|
||||||
## Unreleased
|
## Unreleased
|
||||||
|
|
||||||
- Add `Files::try_compressed()` to support serving pre-compressed static files [#2615]
|
- Add `Files::try_compressed()` to support serving pre-compressed static files [#2615]
|
||||||
|
- Fix handling of `bytes=0-`
|
||||||
|
|
||||||
[#2615]: https://github.com/actix/actix-web/pull/2615
|
[#2615]: https://github.com/actix/actix-web/pull/2615
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -513,6 +513,30 @@ mod tests {
|
||||||
assert_eq!(content_range.to_str().unwrap(), "bytes */100");
|
assert_eq!(content_range.to_str().unwrap(), "bytes */100");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[actix_rt::test]
|
||||||
|
async fn test_named_file_range_header_from_zero_to_end_returns_partial_content() {
|
||||||
|
let srv = actix_test::start(|| App::new().service(Files::new("/", ".")));
|
||||||
|
|
||||||
|
let response = srv
|
||||||
|
.get("/tests/test.binary")
|
||||||
|
.insert_header((header::RANGE, "bytes=0-"))
|
||||||
|
.send()
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
assert_eq!(response.status(), StatusCode::PARTIAL_CONTENT);
|
||||||
|
|
||||||
|
let content_range = response.headers().get(header::CONTENT_RANGE).unwrap();
|
||||||
|
assert_eq!(content_range.to_str().unwrap(), "bytes 0-99/100");
|
||||||
|
|
||||||
|
let content_length = response.headers().get(header::CONTENT_LENGTH).unwrap();
|
||||||
|
assert_eq!(content_length.to_str().unwrap(), "100");
|
||||||
|
|
||||||
|
// Should be no transfer-encoding
|
||||||
|
let transfer_encoding = response.headers().get(header::TRANSFER_ENCODING);
|
||||||
|
assert!(transfer_encoding.is_none());
|
||||||
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_named_file_content_length_headers() {
|
async fn test_named_file_content_length_headers() {
|
||||||
let srv = actix_test::start(|| App::new().service(Files::new("/", ".")));
|
let srv = actix_test::start(|| App::new().service(Files::new("/", ".")));
|
||||||
|
|
|
||||||
|
|
@ -550,6 +550,7 @@ impl NamedFile {
|
||||||
|
|
||||||
let mut length = self.md.len();
|
let mut length = self.md.len();
|
||||||
let mut offset = 0;
|
let mut offset = 0;
|
||||||
|
let mut ranged_req = false;
|
||||||
|
|
||||||
// check for range header
|
// check for range header
|
||||||
if let Some(ranges) = req.headers().get(header::RANGE) {
|
if let Some(ranges) = req.headers().get(header::RANGE) {
|
||||||
|
|
@ -558,6 +559,7 @@ impl NamedFile {
|
||||||
.ok()
|
.ok()
|
||||||
.and_then(|ranges| ranges.first().copied())
|
.and_then(|ranges| ranges.first().copied())
|
||||||
{
|
{
|
||||||
|
ranged_req = true;
|
||||||
length = range.length;
|
length = range.length;
|
||||||
offset = range.start;
|
offset = range.start;
|
||||||
|
|
||||||
|
|
@ -606,7 +608,7 @@ impl NamedFile {
|
||||||
|
|
||||||
let reader = chunked::new_chunked_read(length, offset, self.file, self.read_mode_threshold);
|
let reader = chunked::new_chunked_read(length, offset, self.file, self.read_mode_threshold);
|
||||||
|
|
||||||
if offset != 0 || length != self.md.len() {
|
if ranged_req {
|
||||||
res.status(StatusCode::PARTIAL_CONTENT);
|
res.status(StatusCode::PARTIAL_CONTENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue