11use std:: rc:: Rc ;
22
33use actix_service:: Service ;
4- use actix_web:: body:: BoxBody ;
4+ use actix_web:: body:: { EitherBody , MessageBody } ;
55use actix_web:: dev:: { ServiceRequest , ServiceResponse } ;
66use actix_web:: http:: header:: HeaderMap ;
77use actix_web:: http:: uri:: PathAndQuery ;
88use actix_web:: http:: { header, Method } ;
99use actix_web:: { Error , HttpResponse } ;
1010use futures_util:: future:: LocalBoxFuture ;
1111use futures_util:: TryFutureExt ;
12+ use log:: debug;
1213use reqwest:: Client ;
1314use url:: Url ;
1415
@@ -91,7 +92,7 @@ impl<S> PrerenderMiddleware<S> {
9192 let scheme = req. uri ( ) . scheme_str ( ) . unwrap_or ( "http" ) ;
9293 let url_path_query = req_uri. path_and_query ( ) . map ( PathAndQuery :: as_str) . unwrap ( ) ;
9394
94- format ! ( "{}{}://{}{}" , service_url, scheme, host, url_path_query)
95+ format ! ( "{}render?url= {}://{}{}" , service_url, scheme, host, url_path_query)
9596 }
9697
9798 pub async fn get_rendered_response ( inner : & Inner , req : ServiceRequest ) -> Result < ServiceResponse , PrerenderError > {
@@ -110,6 +111,8 @@ impl<S> PrerenderMiddleware<S> {
110111 ) ;
111112
112113 let url_to_request = Self :: prepare_build_api_url ( & inner. prerender_service_url , & req) ;
114+
115+ debug ! ( "sending request to: {}" , & url_to_request) ;
113116 let prerender_response = inner
114117 . inner_client
115118 . get ( url_to_request)
@@ -122,26 +125,32 @@ impl<S> PrerenderMiddleware<S> {
122125 }
123126}
124127
125- impl < S > Service < ServiceRequest > for PrerenderMiddleware < S >
128+ impl < S , B > Service < ServiceRequest > for PrerenderMiddleware < S >
126129where
127- S : Service < ServiceRequest , Response = ServiceResponse , Error = Error > ,
130+ S : Service < ServiceRequest , Response = ServiceResponse < B > , Error = Error > ,
128131 S :: Future : ' static ,
132+ B : MessageBody ,
129133{
130- type Response = ServiceResponse < BoxBody > ;
134+ type Response = ServiceResponse < EitherBody < B > > ;
131135 type Error = Error ;
132- type Future = LocalBoxFuture < ' static , Result < ServiceResponse < BoxBody > , Error > > ;
136+ type Future = LocalBoxFuture < ' static , Result < ServiceResponse < EitherBody < B > > , Error > > ;
133137
134138 actix_service:: forward_ready!( service) ;
135139
136140 fn call ( & self , req : ServiceRequest ) -> Self :: Future {
137141 // life goes on
138142 if !should_prerender ( & req) {
139143 let fut = self . service . call ( req) ;
140- return Box :: pin ( async move { fut. await } ) ;
144+ return Box :: pin ( async move { fut. await . map ( ServiceResponse :: map_into_left_body ) } ) ;
141145 }
142146
143147 let inner = Rc :: clone ( & self . inner ) ;
144- Box :: pin ( async move { Self :: get_rendered_response ( & inner, req) . await . map_err ( Into :: into) } )
148+ Box :: pin ( async move {
149+ Self :: get_rendered_response ( & inner, req)
150+ . await
151+ . map ( ServiceResponse :: map_into_right_body)
152+ . map_err ( Into :: into)
153+ } )
145154 }
146155}
147156
@@ -153,6 +162,7 @@ mod tests {
153162 use actix_web:: middleware:: Compat ;
154163 use actix_web:: test:: TestRequest ;
155164 use actix_web:: App ;
165+ use url:: Url ;
156166
157167 use crate :: middleware:: { prerender_url, should_prerender, PrerenderMiddleware } ;
158168
@@ -225,24 +235,24 @@ mod tests {
225235
226236 #[ actix_web:: test]
227237 async fn test_redirect_url ( ) {
228- let req_url = "http://yourserver.com/clothes/tshirts?query=xl " ;
238+ let req_url = "http://yourserver.com/clothes/tshirts/red-dotted " ;
229239
230- let req = TestRequest :: get ( )
240+ let req = TestRequest :: post ( )
231241 . insert_header ( (
232242 header:: USER_AGENT ,
233- "Mozilla/5 .0 (X11; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0 " ,
243+ "LinkedInBot/1 .0 (compatible; Mozilla/5.0; Jakarta Commons-HttpClient/3.1 +http://www.linkedin.com) " ,
234244 ) )
235245 . uri ( req_url)
236246 . to_srv_request ( ) ;
237247
238- // let middleware = create_middleware()
239- // .new_transform(test::ok_service())
240- // .into_inner()
241- // .unwrap();
242-
243248 assert_eq ! (
244249 PrerenderMiddleware :: <( ) >:: prepare_build_api_url( & prerender_url( ) , & req) ,
245- format!( "{}{}" , prerender_url( ) , req_url)
250+ format!( "{}render?url={}" , prerender_url( ) , req_url)
251+ ) ;
252+
253+ assert_eq ! (
254+ PrerenderMiddleware :: <( ) >:: prepare_build_api_url( & Url :: parse( "http://localhost:5000" ) . unwrap( ) , & req) ,
255+ format!( "http://localhost:5000/render?url={}" , req_url)
246256 ) ;
247257 }
248258}
0 commit comments