diff --git a/Cargo.toml b/Cargo.toml index 489a8526e..80d3c7f2a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -108,7 +108,7 @@ codegen-units = 1 [patch.crates-io] actix-web = { path = "." } -#actix-http = { path = "actix-http" } +actix-http = { path = "actix-http" } actix-http-test = { path = "test-server" } actix-web-codegen = { path = "actix-web-codegen" } actix-cors = { path = "actix-cors" } diff --git a/actix-http/tests/test_ws.rs b/actix-http/tests/test_ws.rs index 2f2a28e2f..7152fee48 100644 --- a/actix-http/tests/test_ws.rs +++ b/actix-http/tests/test_ws.rs @@ -81,9 +81,6 @@ async fn service(msg: ws::Frame) -> Result { Ok(msg) } -/* -Temporarily commented out due to dependency on actix-http-test - #[actix_rt::test] async fn test_simple() { let ws_service = WsService::new(); @@ -195,5 +192,3 @@ async fn test_simple() { assert!(ws_service.was_polled()); } - -*/ \ No newline at end of file diff --git a/src/middleware/logger.rs b/src/middleware/logger.rs index d692132ce..e40fe648a 100644 --- a/src/middleware/logger.rs +++ b/src/middleware/logger.rs @@ -238,15 +238,20 @@ where } } +use pin_project::{pin_project, pinned_drop}; + +#[pin_project(PinnedDrop)] pub struct StreamLog { + #[pin] body: ResponseBody, format: Option, size: usize, time: OffsetDateTime, } -impl Drop for StreamLog { - fn drop(&mut self) { +#[pinned_drop] +impl PinnedDrop for StreamLog { + fn drop(self: Pin<&mut Self>) { if let Some(ref format) = self.format { let render = |fmt: &mut Formatter<'_>| { for unit in &format.0 { @@ -259,15 +264,17 @@ impl Drop for StreamLog { } } + impl MessageBody for StreamLog { fn size(&self) -> BodySize { self.body.size() } - fn poll_next(&mut self, cx: &mut Context<'_>) -> Poll>> { - match self.body.poll_next(cx) { + fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll>> { + let this = self.project(); + match this.body.poll_next(cx) { Poll::Ready(Some(Ok(chunk))) => { - self.size += chunk.len(); + *this.size += chunk.len(); Poll::Ready(Some(Ok(chunk))) } val => val, diff --git a/src/test.rs b/src/test.rs index 6a6ef27c5..0eb02ff7c 100644 --- a/src/test.rs +++ b/src/test.rs @@ -150,7 +150,7 @@ where pub async fn read_response(app: &mut S, req: Request) -> Bytes where S: Service, Error = Error>, - B: MessageBody, + B: MessageBody + Unpin, { let mut resp = app .call(req) @@ -193,7 +193,7 @@ where /// ``` pub async fn read_body(mut res: ServiceResponse) -> Bytes where - B: MessageBody, + B: MessageBody + Unpin, { let mut body = res.take_body(); let mut bytes = BytesMut::new(); @@ -251,7 +251,7 @@ where pub async fn read_response_json(app: &mut S, req: Request) -> T where S: Service, Error = Error>, - B: MessageBody, + B: MessageBody + Unpin, T: DeserializeOwned, { let body = read_response(app, req).await;