diff --git a/Cargo.toml b/Cargo.toml index febca7ce..3dfc3d37 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,37 +17,38 @@ readme = "README.md" default = ["bson", "url", "chrono-tz"] [dependencies] -async-graphql-parser = { path = "parser", version = "1.17.3" } async-graphql-derive = { path = "derive", version = "1.17.21" } -anyhow = "1.0.26" -thiserror = "1.0.11" -async-trait = "0.1.30" -serde = { version = "1.0.104", features = ["derive"] } -serde_json = "1.0.48" -bytes = "0.5.4" +async-graphql-parser = { path = "parser", version = "1.17.3" } + Inflector = "0.11.4" +anyhow = "1.0.26" +async-stream = "0.2.1" +async-trait = "0.1.30" base64 = "0.12.0" byteorder = "1.3.4" -futures = "0.3.0" -parking_lot = "0.10.0" +bytes = "0.5.4" chrono = "0.4.10" -slab = "0.4.2" -once_cell = "1.3.1" -itertools = "0.9.0" -tempfile = "3.1.0" -httparse = "1.3.4" -mime = "0.3.16" -http = "0.2.1" fnv = "1.0.6" -regex = "1.3.5" -tracing = "0.1.13" +futures = "0.3.5" +http = "0.2.1" +httparse = "1.3.4" indexmap = "1.3.2" -async-stream = "0.2.1" -multer = "1.2.0" +itertools = "0.9.0" log = "0.4.8" +multer = "1.2.2" +once_cell = "1.3.1" +parking_lot = "0.10.0" +regex = "1.3.5" +serde = { version = "1.0.104", features = ["derive"] } +serde_json = "1.0.48" +slab = "0.4.2" spin = "0.5.2" -bson = { version = "1.0.0", optional = true } +tempfile = "3.1.0" +thiserror = "1.0.11" +tracing = "0.1.13" uuid = { version = "0.8.1", features = ["v4", "serde"] } + +bson = { version = "1.0.0", optional = true } url = { version = "2.1.1", optional = true } chrono-tz = { version = "0.5.1", optional = true } diff --git a/src/http/into_query_builder.rs b/src/http/into_query_builder.rs index 7e600c2e..31af0ded 100644 --- a/src/http/into_query_builder.rs +++ b/src/http/into_query_builder.rs @@ -2,11 +2,12 @@ use crate::http::GQLRequest; use crate::query::{IntoQueryBuilder, IntoQueryBuilderOpts}; use crate::{ParseRequestError, QueryBuilder}; use bytes::Bytes; -use futures::{AsyncRead, AsyncReadExt, Stream}; -use mime::Mime; +use futures::{stream, AsyncRead, AsyncReadExt, Stream}; use multer::{Constraints, Multipart, SizeLimit}; use std::collections::HashMap; -use std::io::{Seek, SeekFrom, Write}; +use std::io::{self, Seek, SeekFrom, Write}; +use std::pin::Pin; +use std::task::Poll; impl From for ParseRequestError { fn from(err: multer::Error) -> Self { @@ -29,23 +30,10 @@ where mut self, opts: &IntoQueryBuilderOpts, ) -> std::result::Result { - if let Some(boundary) = self - .0 - .and_then(|value| value.as_ref().parse::().ok()) - .and_then(|ct| { - if ct.essence_str() == mime::MULTIPART_FORM_DATA { - ct.get_param("boundary") - .map(|boundary| boundary.to_string()) - } else { - None - } - }) - { + if let Some(boundary) = self.0.and_then(|ct| multer::parse_boundary(ct).ok()) { // multipart - let stream = reader_stream(self.1); - let mut multipart = Multipart::new_with_constraints( - stream, + reader_stream(self.1), boundary, Constraints::new().size_limit({ let mut limit = SizeLimit::new(); @@ -98,14 +86,8 @@ where } } - let mut builder = match builder { - Some(builder) => builder, - None => return Err(ParseRequestError::MissingOperatorsPart), - }; - let map = match &mut map { - Some(map) => map, - None => return Err(ParseRequestError::MissingMapPart), - }; + let mut builder = builder.ok_or(ParseRequestError::MissingOperatorsPart)?; + let map = map.as_mut().ok_or(ParseRequestError::MissingMapPart)?; for (name, filename, content_type, file) in files { if let Some(var_paths) = map.remove(&name) { @@ -139,15 +121,16 @@ where } fn reader_stream( - mut r: impl AsyncRead + Send + Unpin + 'static, -) -> impl Stream> + 'static { - async_stream::try_stream! { - let mut buf = [0u8; 2048]; - while let size = r.read(&mut buf[..]).await? { - if size == 0 { - return; - } - yield Bytes::from(buf[..size].to_vec()); - } - } + mut reader: impl AsyncRead + Unpin + Send + 'static, +) -> impl Stream> + Unpin + Send + 'static { + let mut buf = [0u8; 2048]; + + stream::poll_fn(move |cx| { + Poll::Ready( + match futures::ready!(Pin::new(&mut reader).poll_read(cx, &mut buf)?) { + 0 => None, + size => Some(Ok(Bytes::copy_from_slice(&buf[..size]))), + }, + ) + }) }