mirror of
https://git.asonix.dog/asonix/pict-rs
synced 2024-12-22 19:31:35 +00:00
Add Last-Modified header, extend MaxAge cache
This commit is contained in:
parent
070b308f8b
commit
04e5d45679
1 changed files with 27 additions and 7 deletions
34
src/main.rs
34
src/main.rs
|
@ -2,13 +2,13 @@ use actix_form_data::{Field, Form, Value};
|
||||||
use actix_web::{
|
use actix_web::{
|
||||||
client::Client,
|
client::Client,
|
||||||
guard,
|
guard,
|
||||||
http::header::{CacheControl, CacheDirective},
|
http::header::{CacheControl, CacheDirective, LastModified},
|
||||||
middleware::{Compress, Logger},
|
middleware::{Compress, Logger},
|
||||||
web, App, HttpResponse, HttpServer,
|
web, App, HttpResponse, HttpServer,
|
||||||
};
|
};
|
||||||
use futures::stream::{Stream, TryStreamExt};
|
use futures::stream::{Stream, TryStreamExt};
|
||||||
use once_cell::sync::Lazy;
|
use once_cell::sync::Lazy;
|
||||||
use std::{collections::HashSet, path::PathBuf, sync::Once};
|
use std::{collections::HashSet, path::PathBuf, sync::Once, time::SystemTime};
|
||||||
use structopt::StructOpt;
|
use structopt::StructOpt;
|
||||||
use tracing::{debug, error, info, instrument, Span};
|
use tracing::{debug, error, info, instrument, Span};
|
||||||
use tracing_subscriber::EnvFilter;
|
use tracing_subscriber::EnvFilter;
|
||||||
|
@ -31,7 +31,9 @@ use self::{
|
||||||
};
|
};
|
||||||
|
|
||||||
const MEGABYTES: usize = 1024 * 1024;
|
const MEGABYTES: usize = 1024 * 1024;
|
||||||
const HOURS: u32 = 60 * 60;
|
const MINUTES: u32 = 60;
|
||||||
|
const HOURS: u32 = 60 * MINUTES;
|
||||||
|
const DAYS: u32 = 24 * HOURS;
|
||||||
|
|
||||||
static CONFIG: Lazy<Config> = Lazy::new(|| Config::from_args());
|
static CONFIG: Lazy<Config> = Lazy::new(|| Config::from_args());
|
||||||
static MAGICK_INIT: Once = Once::new();
|
static MAGICK_INIT: Once = Once::new();
|
||||||
|
@ -356,12 +358,19 @@ async fn process(
|
||||||
Ok(img_bytes) as Result<_, UploadError>
|
Ok(img_bytes) as Result<_, UploadError>
|
||||||
})),
|
})),
|
||||||
content_type,
|
content_type,
|
||||||
|
7 * DAYS,
|
||||||
|
SystemTime::now(),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
let stream = actix_fs::read_to_stream(path).await?;
|
let stream = actix_fs::read_to_stream(path).await?;
|
||||||
|
|
||||||
Ok(srv_response(stream, content_type))
|
Ok(srv_response(
|
||||||
|
stream,
|
||||||
|
content_type,
|
||||||
|
7 * DAYS,
|
||||||
|
SystemTime::now(),
|
||||||
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Serve files
|
/// Serve files
|
||||||
|
@ -377,19 +386,30 @@ async fn serve(
|
||||||
|
|
||||||
let stream = actix_fs::read_to_stream(path).await?;
|
let stream = actix_fs::read_to_stream(path).await?;
|
||||||
|
|
||||||
Ok(srv_response(stream, content_type))
|
Ok(srv_response(
|
||||||
|
stream,
|
||||||
|
content_type,
|
||||||
|
7 * DAYS,
|
||||||
|
SystemTime::now(),
|
||||||
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
// A helper method to produce responses with proper cache headers
|
// A helper method to produce responses with proper cache headers
|
||||||
fn srv_response<S, E>(stream: S, ext: mime::Mime) -> HttpResponse
|
fn srv_response<S, E>(
|
||||||
|
stream: S,
|
||||||
|
ext: mime::Mime,
|
||||||
|
expires: u32,
|
||||||
|
modified: SystemTime,
|
||||||
|
) -> HttpResponse
|
||||||
where
|
where
|
||||||
S: Stream<Item = Result<bytes::Bytes, E>> + Unpin + 'static,
|
S: Stream<Item = Result<bytes::Bytes, E>> + Unpin + 'static,
|
||||||
E: Into<UploadError>,
|
E: Into<UploadError>,
|
||||||
{
|
{
|
||||||
HttpResponse::Ok()
|
HttpResponse::Ok()
|
||||||
|
.set(LastModified(modified.into()))
|
||||||
.set(CacheControl(vec![
|
.set(CacheControl(vec![
|
||||||
CacheDirective::Public,
|
CacheDirective::Public,
|
||||||
CacheDirective::MaxAge(24 * HOURS),
|
CacheDirective::MaxAge(expires),
|
||||||
CacheDirective::Extension("immutable".to_owned(), None),
|
CacheDirective::Extension("immutable".to_owned(), None),
|
||||||
]))
|
]))
|
||||||
.content_type(ext.to_string())
|
.content_type(ext.to_string())
|
||||||
|
|
Loading…
Reference in a new issue