diff --git a/src/stream.rs b/src/stream.rs index bb3f8d3..45b6686 100644 --- a/src/stream.rs +++ b/src/stream.rs @@ -28,6 +28,42 @@ impl Multipart { } } +impl Multipart { + fn write_multipart_frame( + obj: T, + boundary: Vec, + headers: HeaderMap, + first: bool, + ) -> Result, axum::Error> + where + T: IntoIterator, + { + let mut frame_vec = Vec::new(); + if first { + frame_vec.extend_from_slice(b"--"); + } else { + frame_vec.extend_from_slice(b"\r\n--"); + } + frame_vec.extend(boundary); + frame_vec.extend_from_slice(b"\r\n"); + for (header_name, header_value) in headers { + match header_name { + Some(header) => { + frame_vec.extend_from_slice(header.as_str().as_bytes()); + frame_vec.extend_from_slice(b": "); + frame_vec.extend_from_slice(header_value.as_bytes()); + frame_vec.extend_from_slice(b"\r\n"); + } + None => todo!(), + } + } + frame_vec.extend_from_slice(b"\r\n"); + frame_vec.extend(obj); + + Ok(frame_vec) + } +} + impl StreamingFormat for Multipart where T: Send + Sync + IntoIterator + 'static, @@ -37,40 +73,6 @@ where stream: futures::stream::BoxStream<'b, Result>, _options: &'a axum_streams::StreamBodyAsOptions, ) -> futures::stream::BoxStream<'b, Result> { - fn write_multipart_frame( - obj: T, - boundary: Vec, - headers: HeaderMap, - first: bool, - ) -> Result, axum::Error> - where - T: IntoIterator, - { - let mut frame_vec = Vec::new(); - if first { - frame_vec.extend_from_slice(b"--"); - } else { - frame_vec.extend_from_slice(b"\r\n--"); - } - frame_vec.extend(boundary); - frame_vec.extend_from_slice(b"\r\n"); - for (header_name, header_value) in headers { - match header_name { - Some(header) => { - frame_vec.extend_from_slice(header.as_str().as_bytes()); - frame_vec.extend_from_slice(b": "); - frame_vec.extend_from_slice(header_value.as_bytes()); - frame_vec.extend_from_slice(b"\r\n"); - } - None => todo!(), - } - } - frame_vec.extend_from_slice(b"\r\n"); - frame_vec.extend(obj); - - Ok(frame_vec) - } - let boundary = self.boundary.clone(); let headers = self.headers.clone(); let first = self.first; @@ -79,8 +81,12 @@ where stream.map(move |obj_res| match obj_res { Err(e) => Err(e), Ok(obj) => { - let picture_framed = - write_multipart_frame(obj, boundary.clone(), headers.clone(), first); + let picture_framed = Multipart::write_multipart_frame( + obj, + boundary.clone(), + headers.clone(), + first, + ); picture_framed.map(axum::body::Bytes::from) }