From a838238a639c7ac1646d0f3656075df376b7de4d Mon Sep 17 00:00:00 2001 From: marin postma Date: Wed, 23 Jun 2021 14:56:02 +0200 Subject: [PATCH] move payload to own module --- meilisearch-http/src/data/updates.rs | 3 +- meilisearch-http/src/extractors/mod.rs | 1 + meilisearch-http/src/extractors/payload.rs | 69 ++++++++++++++++++ meilisearch-http/src/index_controller/mod.rs | 2 +- meilisearch-http/src/lib.rs | 76 ++------------------ meilisearch-http/src/routes/document.rs | 3 +- 6 files changed, 79 insertions(+), 75 deletions(-) create mode 100644 meilisearch-http/src/extractors/mod.rs create mode 100644 meilisearch-http/src/extractors/payload.rs diff --git a/meilisearch-http/src/data/updates.rs b/meilisearch-http/src/data/updates.rs index e729340a3..4e38294e9 100644 --- a/meilisearch-http/src/data/updates.rs +++ b/meilisearch-http/src/data/updates.rs @@ -1,8 +1,9 @@ use milli::update::{IndexDocumentsMethod, UpdateFormat}; +use crate::extractors::payload::Payload; use crate::index::{Checked, Settings}; use crate::index_controller::{error::Result, IndexMetadata, IndexSettings, UpdateStatus}; -use crate::{Data, Payload}; +use crate::Data; impl Data { pub async fn add_documents( diff --git a/meilisearch-http/src/extractors/mod.rs b/meilisearch-http/src/extractors/mod.rs new file mode 100644 index 000000000..fbb091fe2 --- /dev/null +++ b/meilisearch-http/src/extractors/mod.rs @@ -0,0 +1 @@ +pub mod payload; diff --git a/meilisearch-http/src/extractors/payload.rs b/meilisearch-http/src/extractors/payload.rs new file mode 100644 index 000000000..260561e40 --- /dev/null +++ b/meilisearch-http/src/extractors/payload.rs @@ -0,0 +1,69 @@ +use std::pin::Pin; +use std::task::{Context, Poll}; + +use actix_http::error::PayloadError; +use actix_web::{dev, web, FromRequest, HttpRequest}; +use futures::future::{ready, Ready}; +use futures::Stream; + +pub struct Payload { + payload: dev::Payload, + limit: usize, +} + +pub struct PayloadConfig { + limit: usize, +} + +impl PayloadConfig { + pub fn new(limit: usize) -> Self { + Self { limit } + } +} + +impl Default for PayloadConfig { + fn default() -> Self { + Self { limit: 256 * 1024 } + } +} + +impl FromRequest for Payload { + type Config = PayloadConfig; + + type Error = PayloadError; + + type Future = Ready>; + + #[inline] + fn from_request(req: &HttpRequest, payload: &mut dev::Payload) -> Self::Future { + let limit = req + .app_data::() + .map(|c| c.limit) + .unwrap_or(Self::Config::default().limit); + ready(Ok(Payload { + payload: payload.take(), + limit, + })) + } +} + +impl Stream for Payload { + type Item = Result; + + #[inline] + fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + match Pin::new(&mut self.payload).poll_next(cx) { + Poll::Ready(Some(result)) => match result { + Ok(bytes) => match self.limit.checked_sub(bytes.len()) { + Some(new_limit) => { + self.limit = new_limit; + Poll::Ready(Some(Ok(bytes))) + } + None => Poll::Ready(Some(Err(PayloadError::Overflow))), + }, + x => Poll::Ready(Some(x)), + }, + otherwise => otherwise, + } + } +} diff --git a/meilisearch-http/src/index_controller/mod.rs b/meilisearch-http/src/index_controller/mod.rs index b7dba1a8a..c223ead76 100644 --- a/meilisearch-http/src/index_controller/mod.rs +++ b/meilisearch-http/src/index_controller/mod.rs @@ -22,9 +22,9 @@ use update_actor::UpdateActorHandle; pub use updates::*; use uuid_resolver::{error::UuidResolverError, UuidResolverHandle}; +use crate::extractors::payload::Payload; use crate::index::{Checked, Document, SearchQuery, SearchResult, Settings}; use crate::option::Opt; -use crate::Payload; use error::Result; use self::dump_actor::load_dump; diff --git a/meilisearch-http/src/lib.rs b/meilisearch-http/src/lib.rs index 0ca09234c..de30e1782 100644 --- a/meilisearch-http/src/lib.rs +++ b/meilisearch-http/src/lib.rs @@ -1,6 +1,7 @@ pub mod data; #[macro_use] pub mod error; +pub mod extractors; pub mod helpers; mod index; mod index_controller; @@ -10,19 +11,12 @@ pub mod routes; #[cfg(all(not(debug_assertions), feature = "analytics"))] pub mod analytics; -use std::{ - pin::Pin, - task::{Context, Poll}, -}; - pub use self::data::Data; -use futures::{ - future::{ready, Ready}, - Stream, -}; pub use option::Opt; -use actix_web::{dev, error::PayloadError, web, FromRequest, HttpRequest}; +use actix_web::web; + +use extractors::payload::PayloadConfig; pub fn configure_data(config: &mut web::ServiceConfig, data: Data) { let http_payload_size_limit = data.http_payload_size_limit(); @@ -114,65 +108,3 @@ macro_rules! create_app { )) }}; } - -pub struct Payload { - payload: dev::Payload, - limit: usize, -} - -pub struct PayloadConfig { - limit: usize, -} - -impl PayloadConfig { - pub fn new(limit: usize) -> Self { - Self { limit } - } -} - -impl Default for PayloadConfig { - fn default() -> Self { - Self { limit: 256 * 1024 } - } -} - -impl FromRequest for Payload { - type Config = PayloadConfig; - - type Error = PayloadError; - - type Future = Ready>; - - #[inline] - fn from_request(req: &HttpRequest, payload: &mut dev::Payload) -> Self::Future { - let limit = req - .app_data::() - .map(|c| c.limit) - .unwrap_or(Self::Config::default().limit); - ready(Ok(Payload { - payload: payload.take(), - limit, - })) - } -} - -impl Stream for Payload { - type Item = Result; - - #[inline] - fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - match Pin::new(&mut self.payload).poll_next(cx) { - Poll::Ready(Some(result)) => match result { - Ok(bytes) => match self.limit.checked_sub(bytes.len()) { - Some(new_limit) => { - self.limit = new_limit; - Poll::Ready(Some(Ok(bytes))) - } - None => Poll::Ready(Some(Err(PayloadError::Overflow))), - }, - x => Poll::Ready(Some(x)), - }, - otherwise => otherwise, - } - } -} diff --git a/meilisearch-http/src/routes/document.rs b/meilisearch-http/src/routes/document.rs index 3cc483334..a9d6c0db8 100644 --- a/meilisearch-http/src/routes/document.rs +++ b/meilisearch-http/src/routes/document.rs @@ -7,9 +7,10 @@ use serde::Deserialize; use serde_json::Value; use crate::error::ResponseError; +use crate::extractors::payload::Payload; use crate::helpers::Authentication; use crate::routes::IndexParam; -use crate::{Data, Payload}; +use crate::Data; const DEFAULT_RETRIEVE_DOCUMENTS_OFFSET: usize = 0; const DEFAULT_RETRIEVE_DOCUMENTS_LIMIT: usize = 20;