From 7c0f300d8836fc7aea1718aabde1a2b3421fe56e Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Fri, 14 Nov 2025 07:31:16 +0900 Subject: [PATCH] feat: improve `HttpResponseBuilder::streaming` with SizedStream --- actix-web/src/response/builder.rs | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/actix-web/src/response/builder.rs b/actix-web/src/response/builder.rs index b81ce3568..6ea23b42e 100644 --- a/actix-web/src/response/builder.rs +++ b/actix-web/src/response/builder.rs @@ -11,7 +11,7 @@ use futures_core::Stream; use serde::Serialize; use crate::{ - body::{BodyStream, BoxBody, MessageBody}, + body::{BodyStream, BoxBody, MessageBody, SizedStream}, dev::Extensions, error::{Error, JsonPayloadError}, http::{ @@ -335,17 +335,18 @@ impl HttpResponseBuilder { } } - if let Some(parts) = self.inner() { - if let Some(length) = parts.headers.get(header::CONTENT_LENGTH) { - if let Ok(length) = length.to_str() { - if let Ok(length) = length.parse::() { - self.no_chunking(length); - } - } - } - } + let content_length = self + .inner() + .and_then(|parts| parts.headers.get(header::CONTENT_LENGTH)) + .and_then(|value| value.to_str().ok()) + .and_then(|value| value.parse::().ok()); - self.body(BodyStream::new(stream)) + if let Some(len) = content_length { + self.no_chunking(len); + self.body(SizedStream::new(len, stream)) + } else { + self.body(BodyStream::new(stream)) + } } /// Set a JSON body and build the `HttpResponse`.