Skip to content

Commit 6882c07

Browse files
committed
fix: now working properly by changing BoxBody -> EitherBody
Signed-off-by: Martin <martin@hotmail.com.br>
1 parent e44643b commit 6882c07

File tree

2 files changed

+33
-21
lines changed

2 files changed

+33
-21
lines changed

src/builder.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::{middleware, PrerenderError, PrerenderMiddleware};
33
use actix_service::{Service, Transform};
44
use actix_utils::future;
55
use actix_utils::future::Ready;
6-
use actix_web::body::BoxBody;
6+
use actix_web::body::{EitherBody, MessageBody};
77
use actix_web::dev::{ServiceRequest, ServiceResponse};
88
use actix_web::Error;
99
use reqwest::Client;
@@ -81,12 +81,14 @@ impl Prerender {
8181
}
8282
}
8383

84-
impl<S> Transform<S, ServiceRequest> for Prerender
84+
impl<S, B> Transform<S, ServiceRequest> for Prerender
8585
where
86-
S: Service<ServiceRequest, Response = ServiceResponse, Error = Error>,
86+
S: Service<ServiceRequest, Response = ServiceResponse<B>, Error = Error>,
8787
S::Future: 'static,
88+
89+
B: MessageBody + 'static,
8890
{
89-
type Response = ServiceResponse<BoxBody>;
91+
type Response = ServiceResponse<EitherBody<B>>;
9092
type Error = Error;
9193
type Transform = PrerenderMiddleware<S>;
9294
type InitError = ();

src/middleware.rs

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
use std::rc::Rc;
22

33
use actix_service::Service;
4-
use actix_web::body::BoxBody;
4+
use actix_web::body::{EitherBody, MessageBody};
55
use actix_web::dev::{ServiceRequest, ServiceResponse};
66
use actix_web::http::header::HeaderMap;
77
use actix_web::http::uri::PathAndQuery;
88
use actix_web::http::{header, Method};
99
use actix_web::{Error, HttpResponse};
1010
use futures_util::future::LocalBoxFuture;
1111
use futures_util::TryFutureExt;
12+
use log::debug;
1213
use reqwest::Client;
1314
use 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>
126129
where
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

Comments
 (0)