From 612e983576bafb44f616d866ed8430bc3d8ecb2b Mon Sep 17 00:00:00 2001 From: imgurbot12 Date: Wed, 30 Jul 2025 20:53:18 -0700 Subject: [PATCH] fix(awc): some methods incorrectly send body & body-headers --- awc/CHANGES.md | 2 ++ awc/src/any_body.rs | 14 +++++++++++--- awc/src/sender.rs | 18 ++++++++---------- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/awc/CHANGES.md b/awc/CHANGES.md index 092239719..9cf01ccd4 100644 --- a/awc/CHANGES.md +++ b/awc/CHANGES.md @@ -2,6 +2,8 @@ ## Unreleased +- `GET/HEAD/OPTIONS/TRACE` methods no longer send a request body on request. + ## 3.7.0 - Update `brotli` dependency to `8`. diff --git a/awc/src/any_body.rs b/awc/src/any_body.rs index ef0edfb9e..d38533ea0 100644 --- a/awc/src/any_body.rs +++ b/awc/src/any_body.rs @@ -4,8 +4,12 @@ use std::{ task::{Context, Poll}, }; -use actix_http::body::{BodySize, BoxBody, MessageBody}; +use actix_http::{ + body::{BodySize, BoxBody, MessageBody}, + RequestHead, +}; use bytes::Bytes; +use http::Method; use pin_project_lite::pin_project; pin_project! { @@ -75,11 +79,15 @@ where /// Converts a [`MessageBody`] type into the best possible representation. /// /// Checks size for `None` and tries to convert to `Bytes`. Otherwise, uses the `Body` variant. - pub fn from_message_body(body: B) -> Self + pub fn from_message_body(head: &RequestHead, body: B) -> Self where B: MessageBody, { - if matches!(body.size(), BodySize::None) { + if matches!( + head.method, + Method::GET | Method::HEAD | Method::OPTIONS | Method::TRACE + ) || matches!(body.size(), BodySize::None) + { return Self::None; } diff --git a/awc/src/sender.rs b/awc/src/sender.rs index 0015743bd..de563a798 100644 --- a/awc/src/sender.rs +++ b/awc/src/sender.rs @@ -189,16 +189,14 @@ impl RequestSender { body: impl MessageBody + 'static, ) -> SendClientRequest { let req = match self { - RequestSender::Owned(head) => ConnectRequest::Client( - RequestHeadType::Owned(head), - AnyBody::from_message_body(body).into_boxed(), - addr, - ), - RequestSender::Rc(head, extra_headers) => ConnectRequest::Client( - RequestHeadType::Rc(head, extra_headers), - AnyBody::from_message_body(body).into_boxed(), - addr, - ), + RequestSender::Owned(head) => { + let body = AnyBody::from_message_body(&head, body).into_boxed(); + ConnectRequest::Client(RequestHeadType::Owned(head), body, addr) + } + RequestSender::Rc(head, extra_headers) => { + let body = AnyBody::from_message_body(&head, body).into_boxed(); + ConnectRequest::Client(RequestHeadType::Rc(head, extra_headers), body, addr) + } }; let fut = config.connector.call(req);