2019-08-23 05:17:15 +02:00
|
|
|
extern crate base64;
|
|
|
|
|
|
|
|
use self::base64::encode;
|
2019-08-24 00:48:08 +02:00
|
|
|
|
2019-09-22 02:06:00 +02:00
|
|
|
static MAGIC: [[&[u8]; 2]; 19] = [
|
2019-08-24 00:48:08 +02:00
|
|
|
// 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"<?xml ", b"image/svg+xml"],
|
|
|
|
[b"<svg ", b"image/svg+xml"],
|
|
|
|
[b"RIFF....WEBPVP8 ", b"image/webp"],
|
|
|
|
[b"\x00\x00\x01\x00", b"image/x-icon"],
|
|
|
|
// Audio
|
|
|
|
[b"ID3", b"audio/mpeg"],
|
|
|
|
[b"\xFF\x0E", b"audio/mpeg"],
|
|
|
|
[b"\xFF\x0F", b"audio/mpeg"],
|
|
|
|
[b"OggS", b"audio/ogg"],
|
|
|
|
[b"RIFF....WAVEfmt ", b"audio/wav"],
|
|
|
|
[b"fLaC", b"audio/x-flac"],
|
|
|
|
// Video
|
|
|
|
[b"RIFF....AVI LIST", b"video/avi"],
|
|
|
|
[b"....ftyp", b"video/mp4"],
|
|
|
|
[b"\x00\x00\x01\x0B", b"video/mpeg"],
|
|
|
|
[b"....moov", b"video/quicktime"],
|
|
|
|
[b"\x1A\x45\xDF\xA3", b"video/webm"],
|
|
|
|
];
|
2019-08-23 05:17:15 +02:00
|
|
|
|
|
|
|
pub fn data_to_dataurl(mime: &str, data: &[u8]) -> String {
|
2019-08-23 20:24:45 +02:00
|
|
|
let mimetype = if mime == "" {
|
|
|
|
detect_mimetype(data)
|
2019-08-23 05:17:15 +02:00
|
|
|
} else {
|
2019-08-23 20:24:45 +02:00
|
|
|
mime.to_string()
|
|
|
|
};
|
2019-08-23 05:17:15 +02:00
|
|
|
format!("data:{};base64,{}", mimetype, encode(data))
|
|
|
|
}
|
|
|
|
|
|
|
|
fn detect_mimetype(data: &[u8]) -> String {
|
2019-08-24 00:48:08 +02:00
|
|
|
let mut re = String::new();
|
|
|
|
|
2019-09-22 02:06:00 +02:00
|
|
|
for item in MAGIC.iter() {
|
2019-08-24 00:48:08 +02:00
|
|
|
if data.starts_with(item[0]) {
|
|
|
|
re = String::from_utf8(item[1].to_vec()).unwrap();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
re
|
2019-08-23 05:17:15 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
#[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());
|
2019-08-23 10:49:29 +02:00
|
|
|
assert_eq!(
|
|
|
|
&datauri,
|
|
|
|
"data:application/javascript;base64,dmFyIHdvcmQgPSAnaGVsbG8nOwphbGVydCh3b3JkKTsK"
|
|
|
|
);
|
2019-08-23 05:17:15 +02:00
|
|
|
}
|
2019-08-24 00:48:08 +02:00
|
|
|
|
|
|
|
#[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"<?xml "), "image/svg+xml");
|
|
|
|
assert_eq!(detect_mimetype(b"<svg "), "image/svg+xml");
|
|
|
|
assert_eq!(detect_mimetype(b"RIFF....WEBPVP8 "), "image/webp");
|
|
|
|
assert_eq!(detect_mimetype(b"\x00\x00\x01\x00"), "image/x-icon");
|
|
|
|
// Audio
|
|
|
|
assert_eq!(detect_mimetype(b"ID3"), "audio/mpeg");
|
|
|
|
assert_eq!(detect_mimetype(b"\xFF\x0E"), "audio/mpeg");
|
|
|
|
assert_eq!(detect_mimetype(b"\xFF\x0F"), "audio/mpeg");
|
|
|
|
assert_eq!(detect_mimetype(b"OggS"), "audio/ogg");
|
|
|
|
assert_eq!(detect_mimetype(b"RIFF....WAVEfmt "), "audio/wav");
|
|
|
|
assert_eq!(detect_mimetype(b"fLaC"), "audio/x-flac");
|
|
|
|
// Video
|
|
|
|
assert_eq!(detect_mimetype(b"RIFF....AVI LIST"), "video/avi");
|
|
|
|
assert_eq!(detect_mimetype(b"....ftyp"), "video/mp4");
|
|
|
|
assert_eq!(detect_mimetype(b"\x00\x00\x01\x0B"), "video/mpeg");
|
|
|
|
assert_eq!(detect_mimetype(b"....moov"), "video/quicktime");
|
|
|
|
assert_eq!(detect_mimetype(b"\x1A\x45\xDF\xA3"), "video/webm");
|
|
|
|
}
|
2019-08-23 05:17:15 +02:00
|
|
|
}
|