Skip to content

Commit e70ca00

Browse files
authored
Invalid TokenUri Handling (#188)
1 parent b5809d8 commit e70ca00

File tree

2 files changed

+41
-2
lines changed

2 files changed

+41
-2
lines changed

metadata-retriever/src/routes/token/metadata/data_url.rs

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::routes::token::metadata::{ipfs::IpfsPath, util::TryFromStr, FetchedMetadata};
2-
use anyhow::{anyhow, Result};
2+
use anyhow::Result;
33
use data_url::{forgiving_base64::InvalidBase64, DataUrl, DataUrlError};
44
use serde_json::{Error as SerdeError, Value};
55
use std::{error::Error, fmt, str::FromStr};
@@ -48,6 +48,8 @@ pub enum UriType {
4848
Url(Url),
4949
Ipfs(IpfsPath),
5050
Data(String),
51+
InvalidUrl(String),
52+
Json(Value),
5153
}
5254

5355
impl FromStr for UriType {
@@ -74,7 +76,13 @@ impl FromStr for UriType {
7476
}
7577
Ok(Self::Url(url))
7678
}
77-
Err(err) => Err(anyhow!("failed to parse as url: {s} with error {err:?}")),
79+
Err(err) => {
80+
// Try to parse as JSON:
81+
match serde_json::from_str::<Value>(s) {
82+
Ok(value) => Ok(Self::Json(value)),
83+
Err(_) => Ok(Self::InvalidUrl(err.to_string())),
84+
}
85+
}
7886
}
7987
}
8088
}
@@ -286,6 +294,24 @@ mod tests {
286294
assert!(FetchedMetadata::from_str(data).is_ok());
287295
}
288296

297+
#[test]
298+
fn json_uri() {
299+
let data = r#"{"name": "WHO404 NFT#1","external_url":"https://who404.wtf/"}"#;
300+
301+
assert_eq!(
302+
UriType::from_str(data).unwrap(),
303+
UriType::Json(serde_json::from_str(data).unwrap())
304+
);
305+
}
306+
307+
#[test]
308+
fn invalid_url() {
309+
assert_eq!(
310+
UriType::from_str("1234.json").unwrap(),
311+
UriType::InvalidUrl("relative URL without a base".into())
312+
);
313+
}
314+
289315
#[test]
290316
fn test_data_parsing() {
291317
let data_uris = [

metadata-retriever/src/routes/token/metadata/homebrew.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,19 @@ impl MetadataFetching for Homebrew {
7070
tracing::debug!("Data Type for {token}");
7171
Ok(FetchedMetadata::from_str(&content)?)
7272
}
73+
UriType::Json(value) => Ok(FetchedMetadata {
74+
hash: md5::compute(value.to_string().as_bytes()).to_vec(),
75+
raw: None,
76+
json: Some(value),
77+
}),
78+
UriType::InvalidUrl(err) => {
79+
let message = format!("invalid tokenUri ({}) do not retry", err);
80+
Ok(FetchedMetadata {
81+
hash: md5::compute(message.as_bytes()).to_vec(),
82+
raw: Some(message),
83+
json: None,
84+
})
85+
}
7386
};
7487
}
7588
}

0 commit comments

Comments
 (0)