relay/src/routes/media.rs

43 lines
1.2 KiB
Rust
Raw Normal View History

2021-09-18 17:55:39 +00:00
use crate::{data::MediaCache, error::Error, requests::Requests};
use actix_web::{
http::header::{CacheControl, CacheDirective},
web, HttpResponse,
};
use uuid::Uuid;
2021-09-18 17:55:39 +00:00
#[tracing::instrument(name = "Media")]
2021-02-10 04:17:20 +00:00
pub(crate) async fn route(
2021-02-10 04:05:06 +00:00
media: web::Data<MediaCache>,
requests: web::Data<Requests>,
uuid: web::Path<Uuid>,
2021-09-18 17:55:39 +00:00
) -> Result<HttpResponse, Error> {
let uuid = uuid.into_inner();
2021-02-10 04:05:06 +00:00
if let Some((content_type, bytes)) = media.get_bytes(uuid).await? {
return Ok(cached(content_type, bytes));
}
if let Some(url) = media.get_url(uuid).await? {
let (content_type, bytes) = requests.fetch_bytes(url.as_str()).await?;
media
.store_bytes(uuid, content_type.clone(), bytes.clone())
2021-02-10 04:05:06 +00:00
.await?;
return Ok(cached(content_type, bytes));
}
Ok(HttpResponse::NotFound().finish())
}
fn cached(content_type: String, bytes: web::Bytes) -> HttpResponse {
HttpResponse::Ok()
2021-02-11 00:00:11 +00:00
.insert_header(CacheControl(vec![
CacheDirective::Public,
CacheDirective::MaxAge(60 * 60 * 24),
CacheDirective::Extension("immutable".to_owned(), None),
]))
.content_type(content_type)
.body(bytes)
}