2021-02-10 04:05:06 +00:00
|
|
|
use crate::{data::MediaCache, error::MyError, requests::Requests};
|
2020-05-21 23:51:11 +00:00
|
|
|
use actix_web::{
|
|
|
|
http::header::{CacheControl, CacheDirective},
|
|
|
|
web, HttpResponse,
|
|
|
|
};
|
2020-03-26 03:26:45 +00:00
|
|
|
use uuid::Uuid;
|
|
|
|
|
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>,
|
2020-03-26 03:26:45 +00:00
|
|
|
requests: web::Data<Requests>,
|
|
|
|
uuid: web::Path<Uuid>,
|
|
|
|
) -> Result<HttpResponse, MyError> {
|
|
|
|
let uuid = uuid.into_inner();
|
|
|
|
|
2021-02-10 04:05:06 +00:00
|
|
|
if let Some((content_type, bytes)) = media.get_bytes(uuid).await? {
|
2020-05-21 23:51:11 +00:00
|
|
|
return Ok(cached(content_type, bytes));
|
2020-03-26 03:26:45 +00:00
|
|
|
}
|
|
|
|
|
2020-03-26 18:21:05 +00:00
|
|
|
if let Some(url) = media.get_url(uuid).await? {
|
2020-03-26 03:26:45 +00:00
|
|
|
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?;
|
2020-03-26 03:26:45 +00:00
|
|
|
|
2020-05-21 23:51:11 +00:00
|
|
|
return Ok(cached(content_type, bytes));
|
2020-03-26 03:26:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
Ok(HttpResponse::NotFound().finish())
|
|
|
|
}
|
2020-05-21 23:51:11 +00:00
|
|
|
|
2020-12-29 17:27:14 +00:00
|
|
|
fn cached(content_type: String, bytes: web::Bytes) -> HttpResponse {
|
2020-05-21 23:51:11 +00:00
|
|
|
HttpResponse::Ok()
|
|
|
|
.set(CacheControl(vec![
|
|
|
|
CacheDirective::Public,
|
|
|
|
CacheDirective::MaxAge(60 * 60 * 24),
|
|
|
|
CacheDirective::Extension("immutable".to_owned(), None),
|
|
|
|
]))
|
|
|
|
.content_type(content_type)
|
|
|
|
.body(bytes)
|
|
|
|
}
|