mirror of
https://forgejo.ellis.link/continuwuation/continuwuity.git
synced 2026-05-26 20:49:55 +00:00
fix: Remove homebrewed error mangling for correctness
This commit is contained in:
@@ -2,7 +2,7 @@ use std::{fmt::Debug, time::Duration};
|
|||||||
|
|
||||||
use conduwuit::{
|
use conduwuit::{
|
||||||
Err, Error, Result, debug_warn, err, implement,
|
Err, Error, Result, debug_warn, err, implement,
|
||||||
utils::content_disposition::make_content_disposition, warn,
|
utils::content_disposition::make_content_disposition,
|
||||||
};
|
};
|
||||||
use http::header::{CONTENT_DISPOSITION, CONTENT_TYPE, HeaderValue};
|
use http::header::{CONTENT_DISPOSITION, CONTENT_TYPE, HeaderValue};
|
||||||
use ruma::{
|
use ruma::{
|
||||||
@@ -67,7 +67,7 @@ pub async fn fetch_remote_content(
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
if let Err(Error::Request(NotFound, ..)) = &result {
|
if let Err(Error::Request(Unrecognized, ..)) = &result {
|
||||||
return self
|
return self
|
||||||
.fetch_content_unauthenticated(mxc, user, server, timeout_ms)
|
.fetch_content_unauthenticated(mxc, user, server, timeout_ms)
|
||||||
.await;
|
.await;
|
||||||
@@ -96,7 +96,7 @@ async fn fetch_thumbnail_authenticated(
|
|||||||
timeout_ms,
|
timeout_ms,
|
||||||
};
|
};
|
||||||
|
|
||||||
let Response { content, .. } = self.federation_request(mxc, user, server, request).await?;
|
let Response { content, .. } = self.federation_request(mxc, server, request).await?;
|
||||||
|
|
||||||
match content {
|
match content {
|
||||||
| FileOrLocation::File(content) =>
|
| FileOrLocation::File(content) =>
|
||||||
@@ -120,7 +120,7 @@ async fn fetch_content_authenticated(
|
|||||||
timeout_ms,
|
timeout_ms,
|
||||||
};
|
};
|
||||||
|
|
||||||
let Response { content, .. } = self.federation_request(mxc, user, server, request).await?;
|
let Response { content, .. } = self.federation_request(mxc, server, request).await?;
|
||||||
|
|
||||||
match content {
|
match content {
|
||||||
| FileOrLocation::File(content) => self.handle_content_file(mxc, user, content).await,
|
| FileOrLocation::File(content) => self.handle_content_file(mxc, user, content).await,
|
||||||
@@ -154,7 +154,7 @@ async fn fetch_thumbnail_unauthenticated(
|
|||||||
|
|
||||||
let Response {
|
let Response {
|
||||||
file, content_type, content_disposition, ..
|
file, content_type, content_disposition, ..
|
||||||
} = self.federation_request(mxc, user, server, request).await?;
|
} = self.federation_request(mxc, server, request).await?;
|
||||||
|
|
||||||
let content = Content { file, content_type, content_disposition };
|
let content = Content { file, content_type, content_disposition };
|
||||||
|
|
||||||
@@ -182,7 +182,7 @@ async fn fetch_content_unauthenticated(
|
|||||||
|
|
||||||
let Response {
|
let Response {
|
||||||
file, content_type, content_disposition, ..
|
file, content_type, content_disposition, ..
|
||||||
} = self.federation_request(mxc, user, server, request).await?;
|
} = self.federation_request(mxc, server, request).await?;
|
||||||
|
|
||||||
let content = Content { file, content_type, content_disposition };
|
let content = Content { file, content_type, content_disposition };
|
||||||
|
|
||||||
@@ -305,7 +305,6 @@ async fn location_request(&self, location: &str) -> Result<FileMeta> {
|
|||||||
async fn federation_request<Request>(
|
async fn federation_request<Request>(
|
||||||
&self,
|
&self,
|
||||||
mxc: &Mxc<'_>,
|
mxc: &Mxc<'_>,
|
||||||
user: Option<&UserId>,
|
|
||||||
server: Option<&ServerName>,
|
server: Option<&ServerName>,
|
||||||
request: Request,
|
request: Request,
|
||||||
) -> Result<Request::IncomingResponse>
|
) -> Result<Request::IncomingResponse>
|
||||||
@@ -316,32 +315,6 @@ where
|
|||||||
.sending
|
.sending
|
||||||
.send_federation_request(server.unwrap_or(mxc.server_name), request)
|
.send_federation_request(server.unwrap_or(mxc.server_name), request)
|
||||||
.await
|
.await
|
||||||
.map_err(|error| handle_federation_error(mxc, user, server, error))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handles and adjusts the error for the caller to determine if they should
|
|
||||||
// request the fallback endpoint or give up.
|
|
||||||
fn handle_federation_error(
|
|
||||||
mxc: &Mxc<'_>,
|
|
||||||
user: Option<&UserId>,
|
|
||||||
server: Option<&ServerName>,
|
|
||||||
error: Error,
|
|
||||||
) -> Error {
|
|
||||||
let fallback = || {
|
|
||||||
err!(Request(NotFound(
|
|
||||||
debug_error!(%mxc, ?user, ?server, ?error, "Remote media not found")
|
|
||||||
)))
|
|
||||||
};
|
|
||||||
|
|
||||||
// Matrix server responses for fallback always taken.
|
|
||||||
if error.kind() == Unrecognized {
|
|
||||||
return fallback();
|
|
||||||
}
|
|
||||||
|
|
||||||
warn!(%mxc, ?user, ?server, ?error, "Remote media fetch failed");
|
|
||||||
// Reached for 5xx errors. This is where we don't fallback given the likelihood
|
|
||||||
// the other endpoint will also be a 5xx and we're wasting time.
|
|
||||||
error
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[implement(super::Service)]
|
#[implement(super::Service)]
|
||||||
|
|||||||
Reference in New Issue
Block a user