Skip to content

Commit c9c0d05

Browse files
Render in threadpool for cpu intensive rendering pages
1 parent dfd7086 commit c9c0d05

File tree

1 file changed

+33
-26
lines changed

1 file changed

+33
-26
lines changed

src/web/page/web_page.rs

Lines changed: 33 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::web::{csp::Csp, error::AxumNope};
1+
use crate::web::{csp::Csp, error::AxumNope, TemplateData};
22
use axum::{
33
body::Body,
44
extract::Request as AxumRequest,
@@ -96,46 +96,47 @@ macro_rules! impl_axum_webpage {
9696
#[derive(Clone)]
9797
pub(crate) struct DelayedTemplateRender {
9898
pub template: Arc<Box<dyn AddCspNonce + Send + Sync>>,
99-
#[allow(dead_code)]
10099
pub cpu_intensive_rendering: bool,
101100
}
102101

103102
fn render_response(
104103
mut response: AxumResponse,
104+
templates: Arc<TemplateData>,
105105
csp_nonce: String,
106106
) -> BoxFuture<'static, AxumResponse> {
107107
async move {
108108
if let Some(render) = response.extensions_mut().remove::<DelayedTemplateRender>() {
109-
let DelayedTemplateRender { template, .. } = render;
110-
111-
// let rendered = if cpu_intensive_rendering {
112-
// templates
113-
// .render_in_threadpool(move |templates| {
114-
// templates
115-
// .templates
116-
// .render(&template, &context)
117-
// .map_err(Into::into)
118-
// })
119-
// .await
120-
// } else {
121-
// templates
122-
// .templates
123-
// .render(&template, &context)
124-
// .map_err(Error::new)
125-
// };
126-
127-
let rendered = match Arc::into_inner(template)
128-
.unwrap()
129-
.render_with_csp_nonce(csp_nonce.clone())
130-
{
109+
let DelayedTemplateRender {
110+
template,
111+
cpu_intensive_rendering,
112+
} = render;
113+
let mut template = Arc::into_inner(template).unwrap();
114+
let csp_nonce_clone = csp_nonce.clone();
115+
116+
let result: Result<String, anyhow::Error> = if cpu_intensive_rendering {
117+
templates
118+
.render_in_threadpool(move || {
119+
template
120+
.render_with_csp_nonce(csp_nonce_clone)
121+
.map_err(|err| err.into())
122+
})
123+
.await
124+
} else {
125+
template
126+
.render_with_csp_nonce(csp_nonce_clone)
127+
.map_err(|err| err.into())
128+
};
129+
130+
let rendered = match result {
131131
Ok(content) => content,
132132
Err(err) => {
133133
if response.status().is_server_error() {
134134
// avoid infinite loop if error.html somehow fails to load
135135
panic!("error while serving error page: {err:?}");
136136
} else {
137137
return render_response(
138-
AxumNope::InternalError(err.into()).into_response(),
138+
AxumNope::InternalError(err).into_response(),
139+
templates,
139140
csp_nonce,
140141
)
141142
.await;
@@ -156,6 +157,12 @@ fn render_response(
156157
}
157158

158159
pub(crate) async fn render_templates_middleware(req: AxumRequest, next: Next) -> AxumResponse {
160+
let templates: Arc<TemplateData> = req
161+
.extensions()
162+
.get::<Arc<TemplateData>>()
163+
.expect("template data request extension not found")
164+
.clone();
165+
159166
let csp_nonce = req
160167
.extensions()
161168
.get::<Arc<Csp>>()
@@ -165,5 +172,5 @@ pub(crate) async fn render_templates_middleware(req: AxumRequest, next: Next) ->
165172

166173
let response = next.run(req).await;
167174

168-
render_response(response, csp_nonce).await
175+
render_response(response, templates, csp_nonce).await
169176
}

0 commit comments

Comments
 (0)