aboutsummaryrefslogtreecommitdiffstats
path: root/components/shared/net/blob_url_store.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/shared/net/blob_url_store.rs')
-rw-r--r--components/shared/net/blob_url_store.rs75
1 files changed, 75 insertions, 0 deletions
diff --git a/components/shared/net/blob_url_store.rs b/components/shared/net/blob_url_store.rs
new file mode 100644
index 00000000000..ab853b702c9
--- /dev/null
+++ b/components/shared/net/blob_url_store.rs
@@ -0,0 +1,75 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+use std::str::FromStr;
+
+use serde::{Deserialize, Serialize};
+use servo_url::ServoUrl;
+use url::Url;
+use uuid::Uuid;
+
+use crate::filemanager_thread::FileOrigin;
+
+/// Errors returned to Blob URL Store request
+#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
+pub enum BlobURLStoreError {
+ /// Invalid File UUID
+ InvalidFileID,
+ /// Invalid URL origin
+ InvalidOrigin,
+ /// Invalid entry content
+ InvalidEntry,
+ /// Invalid range
+ InvalidRange,
+ /// External error, from like file system, I/O etc.
+ External(String),
+}
+
+/// Standalone blob buffer object
+#[derive(Clone, Debug, Deserialize, Serialize)]
+pub struct BlobBuf {
+ pub filename: Option<String>,
+ /// MIME type string
+ pub type_string: String,
+ /// Size of content in bytes
+ pub size: u64,
+ /// Content of blob
+ pub bytes: Vec<u8>,
+}
+
+/// Parse URL as Blob URL scheme's definition
+///
+/// <https://w3c.github.io/FileAPI/#DefinitionOfScheme>
+pub fn parse_blob_url(url: &ServoUrl) -> Result<(Uuid, FileOrigin), ()> {
+ let url_inner = Url::parse(url.path()).map_err(|_| ())?;
+ let segs = url_inner
+ .path_segments()
+ .map(|c| c.collect::<Vec<_>>())
+ .ok_or(())?;
+
+ if url.query().is_some() || segs.len() > 1 {
+ return Err(());
+ }
+
+ let id = {
+ let id = segs.first().ok_or(())?;
+ Uuid::from_str(id).map_err(|_| ())?
+ };
+ Ok((id, get_blob_origin(&ServoUrl::from_url(url_inner))))
+}
+
+/// Given an URL, returning the Origin that a Blob created under this
+/// URL should have.
+///
+/// HACK(izgzhen): Not well-specified on spec, and it is a bit a hack
+/// both due to ambiguity of spec and that we have to serialization the
+/// Origin here.
+pub fn get_blob_origin(url: &ServoUrl) -> FileOrigin {
+ if url.scheme() == "file" {
+ // NOTE: by default this is "null" (Opaque), which is not ideal
+ "file://".to_string()
+ } else {
+ url.origin().ascii_serialization()
+ }
+}