mirror of
https://github.com/modrinth/code.git
synced 2026-07-31 21:26:40 +00:00
fix: gracefully handle shared instance icons 404ing (#6928)
* fix: icon handling * fix: cleanup impl * fix: fmt
This commit is contained in:
@@ -55,8 +55,12 @@ pub(crate) async fn create_instance(
|
|||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|
||||||
let icon_path =
|
let icon_path = resolve_icon_path(
|
||||||
resolve_icon_path(input.icon_path.as_deref(), state).await?;
|
input.icon_path.as_deref(),
|
||||||
|
matches!(&input.link, InstanceLink::SharedInstance { .. }),
|
||||||
|
state,
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
let now = Utc::now();
|
let now = Utc::now();
|
||||||
let instance_id = format!("local:{}", Uuid::new_v4());
|
let instance_id = format!("local:{}", Uuid::new_v4());
|
||||||
let content_set_id = format!("content-set:{}", Uuid::new_v4());
|
let content_set_id = format!("content-set:{}", Uuid::new_v4());
|
||||||
@@ -168,6 +172,7 @@ async fn path_available(
|
|||||||
|
|
||||||
async fn resolve_icon_path(
|
async fn resolve_icon_path(
|
||||||
icon_path: Option<&str>,
|
icon_path: Option<&str>,
|
||||||
|
ignore_missing_remote_icon: bool,
|
||||||
state: &State,
|
state: &State,
|
||||||
) -> crate::Result<Option<String>> {
|
) -> crate::Result<Option<String>> {
|
||||||
let Some(icon) = icon_path else {
|
let Some(icon) = icon_path else {
|
||||||
@@ -175,7 +180,7 @@ async fn resolve_icon_path(
|
|||||||
};
|
};
|
||||||
|
|
||||||
let file = if icon.starts_with("https://") || icon.starts_with("http://") {
|
let file = if icon.starts_with("https://") || icon.starts_with("http://") {
|
||||||
let bytes = fetch::fetch(
|
let bytes = match fetch::fetch(
|
||||||
icon,
|
icon,
|
||||||
None,
|
None,
|
||||||
None,
|
None,
|
||||||
@@ -183,7 +188,16 @@ async fn resolve_icon_path(
|
|||||||
&state.fetch_semaphore,
|
&state.fetch_semaphore,
|
||||||
&state.pool,
|
&state.pool,
|
||||||
)
|
)
|
||||||
.await?;
|
.await
|
||||||
|
{
|
||||||
|
Ok(bytes) => bytes,
|
||||||
|
Err(error)
|
||||||
|
if ignore_missing_remote_icon && is_not_found_error(&error) =>
|
||||||
|
{
|
||||||
|
return Ok(None);
|
||||||
|
}
|
||||||
|
Err(error) => return Err(error),
|
||||||
|
};
|
||||||
crate::api::instance::cache_icon(bytes, state).await?
|
crate::api::instance::cache_icon(bytes, state).await?
|
||||||
} else {
|
} else {
|
||||||
crate::api::instance::cache_icon_from_path(
|
crate::api::instance::cache_icon_from_path(
|
||||||
@@ -196,6 +210,18 @@ async fn resolve_icon_path(
|
|||||||
Ok(Some(file.to_string_lossy().to_string()))
|
Ok(Some(file.to_string_lossy().to_string()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn is_not_found_error(error: &crate::Error) -> bool {
|
||||||
|
match error.raw.as_ref() {
|
||||||
|
crate::ErrorKind::FetchError(error) => {
|
||||||
|
error.status() == Some(reqwest::StatusCode::NOT_FOUND)
|
||||||
|
}
|
||||||
|
crate::ErrorKind::LabrinthError(error) => {
|
||||||
|
error.status == Some(reqwest::StatusCode::NOT_FOUND.as_u16())
|
||||||
|
}
|
||||||
|
_ => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn content_source_kind(link: &InstanceLink) -> ContentSourceKind {
|
fn content_source_kind(link: &InstanceLink) -> ContentSourceKind {
|
||||||
match link {
|
match link {
|
||||||
InstanceLink::Unmanaged => ContentSourceKind::Local,
|
InstanceLink::Unmanaged => ContentSourceKind::Local,
|
||||||
|
|||||||
Reference in New Issue
Block a user