aboutsummaryrefslogtreecommitdiffstats
path: root/components/net/file_loader.rs
diff options
context:
space:
mode:
authorRavi Shankar <wafflespeanut@gmail.com>2015-11-07 18:48:37 +0530
committerRavi Shankar <wafflespeanut@gmail.com>2015-11-12 14:02:59 +0530
commit10f5584f78faac769f5b6807eaf683b79554a27f (patch)
treeb17e947ba5bd5b79709ffba7c9cd7d77c0c66110 /components/net/file_loader.rs
parent92f9e58310f1b7c3925882979ae9352967866b66 (diff)
downloadservo-10f5584f78faac769f5b6807eaf683b79554a27f.tar.gz
servo-10f5584f78faac769f5b6807eaf683b79554a27f.zip
Implement cancellation listener for cancelling network requests
Diffstat (limited to 'components/net/file_loader.rs')
-rw-r--r--components/net/file_loader.rs35
1 files changed, 28 insertions, 7 deletions
diff --git a/components/net/file_loader.rs b/components/net/file_loader.rs
index c41f382f949..a4348049d78 100644
--- a/components/net/file_loader.rs
+++ b/components/net/file_loader.rs
@@ -5,7 +5,8 @@
use mime_classifier::MIMEClassifier;
use net_traits::ProgressMsg::{Done, Payload};
use net_traits::{LoadConsumer, LoadData, Metadata};
-use resource_task::{ProgressSender, send_error, start_sending_sniffed, start_sending_sniffed_opt};
+use resource_task::{CancellationListener, ProgressSender};
+use resource_task::{send_error, start_sending_sniffed, start_sending_sniffed_opt};
use std::borrow::ToOwned;
use std::error::Error;
use std::fs::File;
@@ -21,6 +22,11 @@ enum ReadStatus {
EOF,
}
+enum LoadResult {
+ Cancelled,
+ Finished,
+}
+
fn read_block(reader: &mut File) -> Result<ReadStatus, String> {
let mut buf = vec![0; READ_SIZE];
match reader.read(&mut buf) {
@@ -33,17 +39,24 @@ fn read_block(reader: &mut File) -> Result<ReadStatus, String> {
}
}
-fn read_all(reader: &mut File, progress_chan: &ProgressSender)
- -> Result<(), String> {
+fn read_all(reader: &mut File, progress_chan: &ProgressSender, cancel_listener: &CancellationListener)
+ -> Result<LoadResult, String> {
loop {
+ if cancel_listener.is_cancelled() {
+ return Ok(LoadResult::Cancelled);
+ }
+
match try!(read_block(reader)) {
ReadStatus::Partial(buf) => progress_chan.send(Payload(buf)).unwrap(),
- ReadStatus::EOF => return Ok(()),
+ ReadStatus::EOF => return Ok(LoadResult::Finished),
}
}
}
-pub fn factory(load_data: LoadData, senders: LoadConsumer, classifier: Arc<MIMEClassifier>) {
+pub fn factory(load_data: LoadData,
+ senders: LoadConsumer,
+ classifier: Arc<MIMEClassifier>,
+ cancel_listener: CancellationListener) {
let url = load_data.url;
assert!(&*url.scheme == "file");
spawn_named("file_loader".to_owned(), move || {
@@ -52,14 +65,22 @@ pub fn factory(load_data: LoadData, senders: LoadConsumer, classifier: Arc<MIMEC
Ok(file_path) => {
match File::open(&file_path) {
Ok(ref mut reader) => {
+ if cancel_listener.is_cancelled() {
+ return;
+ }
match read_block(reader) {
Ok(ReadStatus::Partial(buf)) => {
let metadata = Metadata::default(url);
let progress_chan = start_sending_sniffed(senders, metadata,
classifier, &buf);
progress_chan.send(Payload(buf)).unwrap();
- let res = read_all(reader, &progress_chan);
- let _ = progress_chan.send(Done(res));
+ let read_result = read_all(reader, &progress_chan, &cancel_listener);
+ if let Ok(load_result) = read_result {
+ match load_result {
+ LoadResult::Cancelled => return,
+ LoadResult::Finished => progress_chan.send(Done(Ok(()))).unwrap(),
+ }
+ }
}
Ok(ReadStatus::EOF) => {
let metadata = Metadata::default(url);