use crate::config::MAX_PAYLOAD_SIZE; use actix_web::web; use flowy_net::errors::{ErrorCode, ServerError}; use futures::StreamExt; use protobuf::{Message, ProtobufResult}; pub async fn parse_from_payload(payload: web::Payload) -> Result { let bytes = poll_payload(payload).await?; parse_from_bytes(&bytes) } pub fn parse_from_bytes(bytes: &[u8]) -> Result { let result: ProtobufResult = Message::parse_from_bytes(&bytes); match result { Ok(data) => Ok(data), Err(e) => Err(e.into()), } } pub async fn poll_payload(mut payload: web::Payload) -> Result { let mut body = web::BytesMut::new(); while let Some(chunk) = payload.next().await { let chunk = chunk.map_err(|err| ServerError::internal().context(err))?; if (body.len() + chunk.len()) > MAX_PAYLOAD_SIZE { return Err(ServerError::new( "Payload overflow".to_string(), ErrorCode::PayloadOverflow, )); } body.extend_from_slice(&chunk); } Ok(body) }