extern crate base64; use self::base64::encode; static MAGIC: [[&[u8]; 2]; 19] = [ // Image [b"GIF87a", b"image/gif"], [b"GIF89a", b"image/gif"], [b"\xFF\xD8\xFF", b"image/jpeg"], [b"\x89PNG\x0D\x0A\x1A\x0A", b"image/png"], [b" String { let mimetype = if mime == "" { detect_mimetype(data) } else { mime.to_string() }; format!("data:{};base64,{}", mimetype, encode(data)) } fn detect_mimetype(data: &[u8]) -> String { let mut re = String::new(); for item in MAGIC.iter() { if data.starts_with(item[0]) { re = String::from_utf8(item[1].to_vec()).unwrap(); break; } } re } #[cfg(test)] mod tests { use super::*; #[test] fn test_data_to_dataurl() { let mime = "application/javascript"; let data = "var word = 'hello';\nalert(word);\n"; let datauri = data_to_dataurl(mime, data.as_bytes()); assert_eq!( &datauri, "data:application/javascript;base64,dmFyIHdvcmQgPSAnaGVsbG8nOwphbGVydCh3b3JkKTsK" ); } #[test] fn test_detect_mimetype() { // Image assert_eq!(detect_mimetype(b"GIF87a"), "image/gif"); assert_eq!(detect_mimetype(b"GIF89a"), "image/gif"); assert_eq!(detect_mimetype(b"\xFF\xD8\xFF"), "image/jpeg"); assert_eq!(detect_mimetype(b"\x89PNG\x0D\x0A\x1A\x0A"), "image/png"); assert_eq!(detect_mimetype(b"