diff options
Diffstat (limited to 'src/components/net/file_loader.rs')
-rw-r--r-- | src/components/net/file_loader.rs | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/src/components/net/file_loader.rs b/src/components/net/file_loader.rs index 379cd3e5ffb..7225fe8606f 100644 --- a/src/components/net/file_loader.rs +++ b/src/components/net/file_loader.rs @@ -2,34 +2,47 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use resource_task::{Metadata, Payload, Done, LoaderTask, start_sending}; -use servo_util::io::ignoring_eof; +use resource_task::{ProgressMsg, Metadata, Payload, Done, LoaderTask, start_sending}; +use servo_util::io::result; -use std::rt::io; -use std::rt::io::Reader; +use std::comm::Chan; +use std::rt::io::file; +use std::rt::io::{FileStream, Reader, EndOfFile, Open, Read, ignore_io_error}; use std::task; static READ_SIZE: uint = 1024; +fn read_all(reader: &mut FileStream, progress_chan: &Chan<ProgressMsg>) + -> Result<(), ()> { + loop { + match (do result { + let data = reader.read_bytes(READ_SIZE); + progress_chan.send(Payload(data)); + }) { + Ok(()) => (), + Err(e) => match e.kind { + EndOfFile => return Ok(()), + _ => return Err(()), + } + } + } +} + pub fn factory() -> LoaderTask { let f: LoaderTask = |url, start_chan| { assert!("file" == url.scheme); let progress_chan = start_sending(start_chan, Metadata::default(url.clone())); do task::spawn { - match io::file::open(&url.path.as_slice(), io::Open, io::Read) { - Some(mut reader) => { - while !reader.eof() { - do ignoring_eof { - let data = reader.read_bytes(READ_SIZE); - progress_chan.send(Payload(data)); - } - } - progress_chan.send(Done(Ok(()))); + // ignore_io_error causes us to get None instead of a task failure. + match ignore_io_error(|| file::open(&url.path.as_slice(), Open, Read)) { + Some(ref mut reader) => { + let res = read_all(reader, &progress_chan); + progress_chan.send(Done(res)); } None => { progress_chan.send(Done(Err(()))); } - }; + } } }; f |