Reduce right drift in scheme_fetch

This commit is contained in:
Pyfisch 2018-11-03 16:15:48 +01:00
parent 2481ad25f8
commit f512e262a5

View file

@ -528,11 +528,13 @@ fn scheme_fetch(
}, },
"file" => { "file" => {
if request.method == Method::GET { if request.method != Method::GET {
match url.to_file_path() { return Response::network_error(NetworkError::Internal(
Ok(file_path) => { "Unexpected method for file".into(),
match File::open(file_path.clone()) { ));
Ok(mut file) => { }
if let Ok(file_path) = url.to_file_path() {
if let Ok(file) = File::open(file_path.clone()) {
let mime = guess_mime_type(file_path); let mime = guess_mime_type(file_path);
let mut response = Response::new(url); let mut response = Response::new(url);
@ -546,17 +548,14 @@ fn scheme_fetch(
let cancellation_listener = context.cancellation_listener.clone(); let cancellation_listener = context.cancellation_listener.clone();
let (start, end) = if let Some(ref range) = let (start, end) = if let Some(ref range) = request.headers.typed_get::<Range>()
request.headers.typed_get::<Range>()
{ {
match range match range
.iter() .iter()
.collect::<Vec<(Bound<u64>, Bound<u64>)>>() .collect::<Vec<(Bound<u64>, Bound<u64>)>>()
.first() .first()
{ {
Some(&(Bound::Included(start), Bound::Unbounded)) => { Some(&(Bound::Included(start), Bound::Unbounded)) => (start, None),
(start, None)
},
Some(&(Bound::Included(start), Bound::Included(end))) => { Some(&(Bound::Included(start), Bound::Included(end))) => {
// `end` should be less or equal to `start`. // `end` should be less or equal to `start`.
(start, Some(u64::max(start, end))) (start, Some(u64::max(start, end)))
@ -564,11 +563,7 @@ fn scheme_fetch(
Some(&(Bound::Unbounded, Bound::Included(offset))) => { Some(&(Bound::Unbounded, Bound::Included(offset))) => {
if let Ok(metadata) = file.metadata() { if let Ok(metadata) = file.metadata() {
// `offset` cannot be bigger than the file size. // `offset` cannot be bigger than the file size.
( (metadata.len() - u64::min(metadata.len(), offset), None)
metadata.len() -
u64::min(metadata.len(), offset),
None,
)
} else { } else {
(0, None) (0, None)
} }
@ -582,22 +577,19 @@ fn scheme_fetch(
thread::Builder::new() thread::Builder::new()
.name("fetch file worker thread".to_string()) .name("fetch file worker thread".to_string())
.spawn(move || { .spawn(move || {
let mut reader = let mut reader = BufReader::with_capacity(FILE_CHUNK_SIZE, file);
BufReader::with_capacity(FILE_CHUNK_SIZE, file);
if reader.seek(SeekFrom::Start(start)).is_err() { if reader.seek(SeekFrom::Start(start)).is_err() {
warn!("Fetch - could not seek to {:?}", start); warn!("Fetch - could not seek to {:?}", start);
} }
loop { loop {
if cancellation_listener.lock().unwrap().cancelled() { if cancellation_listener.lock().unwrap().cancelled() {
*res_body.lock().unwrap() = *res_body.lock().unwrap() = ResponseBody::Done(vec![]);
ResponseBody::Done(vec![]);
let _ = done_sender.send(Data::Cancelled); let _ = done_sender.send(Data::Cancelled);
return; return;
} }
let length = { let length = {
let mut buffer = let mut buffer = reader.fill_buf().unwrap().to_vec();
reader.fill_buf().unwrap().to_vec();
let mut buffer_len = buffer.len(); let mut buffer_len = buffer.len();
if let ResponseBody::Receiving(ref mut body) = if let ResponseBody::Receiving(ref mut body) =
*res_body.lock().unwrap() *res_body.lock().unwrap()
@ -605,14 +597,11 @@ fn scheme_fetch(
let offset = usize::min( let offset = usize::min(
{ {
if let Some(end) = end { if let Some(end) = end {
let remaining_bytes = end as usize - let remaining_bytes =
start as usize - end as usize - start as usize - body.len();
body.len(); if remaining_bytes <= FILE_CHUNK_SIZE {
if remaining_bytes <= // This is the last chunk so we set buffer
FILE_CHUNK_SIZE // len to 0 to break the reading loop.
{
// This is the last chunk so we set buffer len to 0 to break
// the reading loop.
buffer_len = 0; buffer_len = 0;
remaining_bytes remaining_bytes
} else { } else {
@ -646,18 +635,13 @@ fn scheme_fetch(
}) })
.expect("Failed to create fetch file worker thread"); .expect("Failed to create fetch file worker thread");
response response
}, } else {
_ => Response::network_error(NetworkError::Internal( Response::network_error(NetworkError::Internal("Opening file failed".into()))
"Opening file failed".into(),
)),
}
},
_ => Response::network_error(NetworkError::Internal(
"Constructing file path failed".into(),
)),
} }
} else { } else {
Response::network_error(NetworkError::Internal("Unexpected method for file".into())) Response::network_error(NetworkError::Internal(
"Constructing file path failed".into(),
))
} }
}, },