Properly handle Content-Type

This commit is contained in:
Alex Auvolat 2023-05-12 16:11:29 +02:00
parent 20fa2cacf4
commit 24d3b289da
3 changed files with 29 additions and 21 deletions

View file

@ -294,6 +294,8 @@ impl Media {
#[cfg(feature = "s3")]
{
use rocket::http::ContentType;
let dest = determine_mirror_s3_path(&remote_url);
let media = request::get(
@ -301,18 +303,22 @@ impl Media {
User::get_sender(),
CONFIG.proxy().cloned(),
)?;
let content_type = media.headers().get(reqwest::header::CONTENT_TYPE).cloned();
let content_type = media
.headers()
.get(reqwest::header::CONTENT_TYPE)
.and_then(|x| x.to_str().ok())
.and_then(ContentType::parse_flexible)
.unwrap_or(ContentType::Binary);
let bytes = media.bytes()?;
let bucket = CONFIG.s3.as_ref().unwrap().get_bucket();
match content_type.as_ref().and_then(|x| x.to_str().ok()) {
Some(ct) => {
bucket.put_object_with_content_type_blocking(&dest, &bytes, ct)?;
}
None => {
bucket.put_object_blocking(&dest, &bytes)?;
}
}
bucket.put_object_with_content_type_blocking(
&dest,
&bytes,
&content_type.to_string()
)?;
dest
}

View file

@ -131,14 +131,14 @@ fn save_uploaded_file(file: &SavedField) -> Result<Option<String>, plume_models:
};
let bucket = CONFIG.s3.as_ref().unwrap().get_bucket();
match &file.headers.content_type {
Some(ct) => {
bucket.put_object_with_content_type_blocking(&dest, &bytes, &ct.to_string())?;
}
None => {
bucket.put_object_blocking(&dest, &bytes)?;
}
}
let content_type = match &file.headers.content_type {
Some(ct) => ct.to_string(),
None => ContentType::from_extension(&ext)
.unwrap_or(ContentType::Binary)
.to_string(),
};
bucket.put_object_with_content_type_blocking(&dest, &bytes, &content_type)?;
Ok(Some(dest))
}

View file

@ -269,13 +269,15 @@ pub fn plume_media_files(file: PathBuf) -> Option<CachedFile> {
#[cfg(feature="s3")]
{
let ct = file.extension()
.and_then(|ext| ContentType::from_extension(&ext.to_string_lossy()))
.unwrap_or(ContentType::Binary);
let data = CONFIG.s3.as_ref().unwrap().get_bucket()
.get_object_blocking(format!("static/media/{}", file.to_string_lossy())).ok()?;
let ct = data.headers().get("content-type")
.and_then(|x| ContentType::parse_flexible(&x))
.or_else(|| file.extension()
.and_then(|ext| ContentType::from_extension(&ext.to_string_lossy())))
.unwrap_or(ContentType::Binary);
Some(CachedFile {
inner: FileKind::S3 ( data.to_vec(), ct),
cache_control: CacheControl(vec![CacheDirective::MaxAge(60 * 60 * 24 * 30)]),