net_traits/
blob_url_store.rs1use std::str::FromStr;
6
7use serde::{Deserialize, Serialize};
8use servo_url::ServoUrl;
9use url::Url;
10use uuid::Uuid;
11
12use crate::filemanager_thread::FileOrigin;
13
14#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
16pub enum BlobURLStoreError {
17 InvalidFileID,
19 InvalidOrigin,
21 InvalidEntry,
23 InvalidRange,
25 External(String),
27}
28
29#[derive(Clone, Debug, Deserialize, Serialize)]
31pub struct BlobBuf {
32 pub filename: Option<String>,
33 pub type_string: String,
35 pub size: u64,
37 pub bytes: Vec<u8>,
39}
40
41pub fn parse_blob_url(url: &ServoUrl) -> Result<(Uuid, FileOrigin), &'static str> {
45 let url_inner = Url::parse(url.path()).map_err(|_| "Failed to parse URL path")?;
46 let segs = url_inner
47 .path_segments()
48 .map(|c| c.collect::<Vec<_>>())
49 .ok_or("URL has no path segments")?;
50
51 if url.query().is_some() {
52 return Err("URL should not contain a query");
53 }
54
55 if segs.len() > 1 {
56 return Err("URL should not have more than one path segment");
57 }
58
59 let id = {
60 let id = segs.first().ok_or("URL has no path segments")?;
61 Uuid::from_str(id).map_err(|_| "Failed to parse UUID from path segment")?
62 };
63 Ok((id, get_blob_origin(&ServoUrl::from_url(url_inner))))
64}
65
66pub fn get_blob_origin(url: &ServoUrl) -> FileOrigin {
73 if url.scheme() == "file" {
74 "file://".to_string()
76 } else {
77 url.origin().ascii_serialization()
78 }
79}