1
- use crate :: web:: { csp:: Csp , error:: AxumNope } ;
1
+ use crate :: web:: { csp:: Csp , error:: AxumNope , TemplateData } ;
2
2
use axum:: {
3
3
body:: Body ,
4
4
extract:: Request as AxumRequest ,
@@ -96,46 +96,47 @@ macro_rules! impl_axum_webpage {
96
96
#[ derive( Clone ) ]
97
97
pub ( crate ) struct DelayedTemplateRender {
98
98
pub template : Arc < Box < dyn AddCspNonce + Send + Sync > > ,
99
- #[ allow( dead_code) ]
100
99
pub cpu_intensive_rendering : bool ,
101
100
}
102
101
103
102
fn render_response (
104
103
mut response : AxumResponse ,
104
+ templates : Arc < TemplateData > ,
105
105
csp_nonce : String ,
106
106
) -> BoxFuture < ' static , AxumResponse > {
107
107
async move {
108
108
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 {
131
131
Ok ( content) => content,
132
132
Err ( err) => {
133
133
if response. status ( ) . is_server_error ( ) {
134
134
// avoid infinite loop if error.html somehow fails to load
135
135
panic ! ( "error while serving error page: {err:?}" ) ;
136
136
} else {
137
137
return render_response (
138
- AxumNope :: InternalError ( err. into ( ) ) . into_response ( ) ,
138
+ AxumNope :: InternalError ( err) . into_response ( ) ,
139
+ templates,
139
140
csp_nonce,
140
141
)
141
142
. await ;
@@ -156,6 +157,12 @@ fn render_response(
156
157
}
157
158
158
159
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
+
159
166
let csp_nonce = req
160
167
. extensions ( )
161
168
. get :: < Arc < Csp > > ( )
@@ -165,5 +172,5 @@ pub(crate) async fn render_templates_middleware(req: AxumRequest, next: Next) ->
165
172
166
173
let response = next. run ( req) . await ;
167
174
168
- render_response ( response, csp_nonce) . await
175
+ render_response ( response, templates , csp_nonce) . await
169
176
}
0 commit comments