Newer
Older
hyper::{
header::{CONTENT_TYPE, EXPIRES},
Body,
},
async fn handle_request(
req: FullPath,
blog: Arc<RwLock<RenderedBlog>>,
) -> Result<impl warp::Reply, warp::Rejection> {
let blog = blog.read().await;
let (status, content) = blog.get(req.as_str());
let headers = reply.headers_mut();
headers.insert(CONTENT_TYPE, HeaderValue::from_static(content.content_type));
if let Some(expires) = content.expiry.header_value() {
// TODO log a metric (statsd) if this fails)
if let Ok(hv) = HeaderValue::from_str(&expires) {
headers.insert(EXPIRES, hv);
}
}
let blog: RenderedBlog = Blog::new(
config.name,
config.description,
&PathBuf::from(config.path),
config.logo,
)
.unwrap()
.try_into()
.unwrap();
let blog = Arc::new(RwLock::new(blog));
let blog_filter = warp::any().map(move || blog.clone());
warp::serve(
warp::filters::path::full()
.and(blog_filter.clone())
.and_then(handle_request),
)
.run(([0, 0, 0, 0], 3030))
.await;
}