diff --git a/src/api/client_server/media.rs b/src/api/client_server/media.rs index c2778294c7eea2e2b67924eab7bfe4b790a8ebcd..e8fe0b695d01fb1697c120043c524854e0fcd2e4 100644 --- a/src/api/client_server/media.rs +++ b/src/api/client_server/media.rs @@ -42,21 +42,33 @@ pub async fn get_media_preview_route( return Err(Error::BadRequest(ErrorKind::Forbidden, "URL is not allowed to be previewed")); } - if let Ok(preview) = get_url_preview(url).await { - let res = serde_json::value::to_raw_value(&preview).map_err(|e| { - error!("Failed to convert UrlPreviewData into a serde json value: {}", e); - Error::BadRequest(ErrorKind::Unknown, "Unknown error occurred parsing URL preview") - })?; - - return Ok(get_media_preview::v3::Response::from_raw_value(res)); - } + match get_url_preview(url).await { + Ok(preview) => { + let res = serde_json::value::to_raw_value(&preview).map_err(|e| { + error!("Failed to convert UrlPreviewData into a serde json value: {}", e); + Error::BadRequest( + ErrorKind::LimitExceeded { + retry_after_ms: Some(Duration::from_secs(5)), + }, + "Failed to generate a URL preview, try again later.", + ) + })?; + + Ok(get_media_preview::v3::Response::from_raw_value(res)) + }, + Err(e) => { + warn!("Failed to generate a URL preview: {e}"); - Err(Error::BadRequest( - ErrorKind::LimitExceeded { - retry_after_ms: Some(Duration::from_secs(5)), + // there doesn't seem to be an agreed-upon error code in the spec. + // the only response codes in the preview_url spec page are 200 and 429. + Err(Error::BadRequest( + ErrorKind::LimitExceeded { + retry_after_ms: Some(Duration::from_secs(5)), + }, + "Failed to generate a URL preview, try again later.", + )) }, - "Retry later", - )) + } } /// # `POST /_matrix/media/v3/upload`