Reorder dependencies and remove dependency on mime
This commit is contained in:
parent
a1bcfd8d70
commit
45a08e9b00
43
Cargo.toml
43
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 }
|
||||
|
||||
|
|
|
@ -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<multer::Error> for ParseRequestError {
|
||||
fn from(err: multer::Error) -> Self {
|
||||
|
@ -29,23 +30,10 @@ where
|
|||
mut self,
|
||||
opts: &IntoQueryBuilderOpts,
|
||||
) -> std::result::Result<QueryBuilder, ParseRequestError> {
|
||||
if let Some(boundary) = self
|
||||
.0
|
||||
.and_then(|value| value.as_ref().parse::<Mime>().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<Item = std::io::Result<Bytes>> + '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<Item = io::Result<Bytes>> + 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]))),
|
||||
},
|
||||
)
|
||||
})
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue