1- use crate :: web:: { csp:: Csp , error:: AxumNope } ;
1+ use crate :: web:: { csp:: Csp , error:: AxumNope , TemplateData } ;
22use axum:: {
33 body:: Body ,
44 extract:: Request as AxumRequest ,
@@ -96,46 +96,47 @@ macro_rules! impl_axum_webpage {
9696#[ derive( Clone ) ]
9797pub ( crate ) struct DelayedTemplateRender {
9898 pub template : Arc < Box < dyn AddCspNonce + Send + Sync > > ,
99- #[ allow( dead_code) ]
10099 pub cpu_intensive_rendering : bool ,
101100}
102101
103102fn 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
158159pub ( 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