Skip to content

Commit

Permalink
use the rc-u8-reader crate to prevent cloning u8 data
Browse files Browse the repository at this point in the history
  • Loading branch information
magiclen committed May 26, 2019
1 parent d22bfef commit a53b2a9
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 10 deletions.
3 changes: 2 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rocket-include-static-resources"
version = "0.8.2"
version = "0.8.3"
authors = ["Magic Len <len@magiclen.org>"]
repository = "https://github.com/magiclen/rocket-include-static-resources"
homepage = "https://magiclen.org/rocket-include-static-resources"
Expand All @@ -18,5 +18,6 @@ rocket = "0.4"
mime = "0.3.12"
mime_guess = " 2.0.0-alpha.6"
crc-any = "1.0.0"
rc-u8-reader = "2.0.0"

rocket-etag-if-none-match = "0.3"
15 changes: 8 additions & 7 deletions src/file_resources.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,15 @@ use std::path::PathBuf;
use std::time::SystemTime;
use std::fs;
use std::io::{self, ErrorKind};
use std::sync::Arc;

use crate::{Mime, EntityTag};
use crate::functions::{compute_data_etag, guess_mime};

#[derive(Debug)]
/// Reloadable file resources.
pub struct FileResources {
resources: HashMap<&'static str, (PathBuf, Mime, Vec<u8>, EntityTag, Option<SystemTime>)>
resources: HashMap<&'static str, (PathBuf, Mime, Arc<Vec<u8>>, EntityTag, Option<SystemTime>)>
}

impl FileResources {
Expand All @@ -37,7 +38,7 @@ impl FileResources {

let mtime = metadata.modified().ok();

self.resources.insert(name, (file_path, mime, data, etag, mtime));
self.resources.insert(name, (file_path, mime, Arc::new(data), etag, mtime));

Ok(())
}
Expand Down Expand Up @@ -91,7 +92,7 @@ impl FileResources {

let new_etag = compute_data_etag(&new_data);

*data = new_data;
*data = Arc::new(new_data);

*etag = new_etag;

Expand All @@ -104,7 +105,7 @@ impl FileResources {

#[inline]
/// Get the specific resource.
pub fn get_resource<S: AsRef<str>>(&mut self, name: S, reload_if_needed: bool) -> Result<(&Mime, &[u8], &EntityTag), io::Error> {
pub fn get_resource<S: AsRef<str>>(&mut self, name: S, reload_if_needed: bool) -> Result<(&Mime, Arc<Vec<u8>>, &EntityTag), io::Error> {
let name = name.as_ref();

if reload_if_needed {
Expand Down Expand Up @@ -140,16 +141,16 @@ impl FileResources {

let new_etag = compute_data_etag(&new_data);

*data = new_data;
*data = Arc::new(new_data);

*etag = new_etag;

*mtime = new_mtime;
}

Ok((mime, data, etag))
Ok((mime, data.clone(), etag))
} else {
self.resources.get(name).map(|(_, mime, data, etag, _)| (mime, data.as_slice(), etag)).ok_or(io::Error::new(ErrorKind::NotFound, format!("The name `{}` is not found.", name)))
self.resources.get(name).map(|(_, mime, data, etag, _)| (mime, data.clone(), etag)).ok_or(io::Error::new(ErrorKind::NotFound, format!("The name `{}` is not found.", name)))
}
}
}
8 changes: 6 additions & 2 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,16 +65,20 @@ mod macros;
extern crate mime;
extern crate mime_guess;
extern crate crc_any;
extern crate rc_u8_reader;

extern crate rocket;

extern crate rocket_etag_if_none_match;

#[cfg(not(debug_assertions))]
use std::io::Cursor;
#[cfg(debug_assertions)]
use std::sync::MutexGuard;

use mime::Mime;
#[cfg(debug_assertions)]
use rc_u8_reader::ArcU8Reader;

use rocket::State;
use rocket::request::Request;
Expand Down Expand Up @@ -150,7 +154,7 @@ impl<'a> Responder<'a> for StaticResponse {
} else {
let etag = self.etag.map(|etag| etag.to_string()).unwrap_or(etag.to_string());

(mime.to_string(), data.to_vec(), etag)
(mime.to_string(), data.clone(), etag)
}
}
Err(_) => {
Expand All @@ -164,7 +168,7 @@ impl<'a> Responder<'a> for StaticResponse {
response
.raw_header("ETag", etag)
.raw_header("Content-Type", mime)
.sized_body(Cursor::new(data));
.sized_body(ArcU8Reader::new(data));

response.ok()
}
Expand Down

0 comments on commit a53b2a9

Please sign in to comment.