|
|
|
@ -292,15 +292,15 @@ async fn serve_file (
|
|
|
|
|
None
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
f.seek (SeekFrom::Start (range.start)).await.unwrap ();
|
|
|
|
|
|
|
|
|
|
info! ("Serving range {}-{}", range.start, range.end);
|
|
|
|
|
|
|
|
|
|
let content_length = range.end - range.start;
|
|
|
|
|
|
|
|
|
|
let seek = SeekFrom::Start (range.start);
|
|
|
|
|
|
|
|
|
|
if should_send_body {
|
|
|
|
|
tokio::spawn (async move {
|
|
|
|
|
//println! ("Opening file {:?}", path);
|
|
|
|
|
f.seek (seek).await.unwrap ();
|
|
|
|
|
|
|
|
|
|
let mut tx = tx;
|
|
|
|
|
let mut bytes_sent = 0;
|
|
|
|
@ -341,21 +341,21 @@ async fn serve_file (
|
|
|
|
|
|
|
|
|
|
response.header (String::from ("accept-ranges"), b"bytes".to_vec ());
|
|
|
|
|
|
|
|
|
|
if should_send_body {
|
|
|
|
|
if range_requested {
|
|
|
|
|
response.status_code (StatusCode::PartialContent);
|
|
|
|
|
response.header (String::from ("content-range"), format! ("bytes {}-{}/{}", range.start, range.end - 1, range.end).into_bytes ());
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
response.status_code (StatusCode::Ok);
|
|
|
|
|
response.header (String::from ("content-length"), range.end.to_string ().into_bytes ());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
response.content_length = Some (content_length);
|
|
|
|
|
if range_requested {
|
|
|
|
|
response.status_code (StatusCode::PartialContent);
|
|
|
|
|
response.header (String::from ("content-range"), format! ("bytes {}-{}/{}", range.start, range.end - 1, range.end).into_bytes ());
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
response.status_code (StatusCode::Ok);
|
|
|
|
|
response.header (String::from ("content-length"), range.end.to_string ().into_bytes ());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ! should_send_body {
|
|
|
|
|
response.status_code (StatusCode::NoContent);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
response.content_length = Some (content_length);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if let Some (body) = body {
|
|
|
|
|
response.body (body);
|
|
|
|
@ -759,6 +759,21 @@ mod tests {
|
|
|
|
|
).await;
|
|
|
|
|
|
|
|
|
|
assert_eq! (resp, RangeNotSatisfiable (1_048_576));
|
|
|
|
|
|
|
|
|
|
let resp = internal_serve_all (
|
|
|
|
|
&file_server_root,
|
|
|
|
|
Method::Head,
|
|
|
|
|
"/files/src/bad_passwords.txt",
|
|
|
|
|
&headers,
|
|
|
|
|
None
|
|
|
|
|
).await;
|
|
|
|
|
|
|
|
|
|
assert_eq! (resp, ServeFile (ServeFileParams {
|
|
|
|
|
send_body: false,
|
|
|
|
|
range: 0..1_048_576,
|
|
|
|
|
range_requested: false,
|
|
|
|
|
file: AlwaysEqual::testing_blank (),
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|