1 #![deny(warnings)]
2 use bytes::BufMut;
3 use futures::{TryFutureExt, TryStreamExt};
4 use warp::{multipart, Filter};
5
6 #[tokio::test]
form_fields()7 async fn form_fields() {
8 let _ = pretty_env_logger::try_init();
9
10 let route = multipart::form().and_then(|form: multipart::FormData| {
11 async {
12 // Collect the fields into (name, value): (String, Vec<u8>)
13 let part: Result<Vec<(String, Vec<u8>)>, warp::Rejection> = form
14 .and_then(|part| {
15 let name = part.name().to_string();
16 let value = part.stream().try_fold(Vec::new(), |mut vec, data| {
17 vec.put(data);
18 async move { Ok(vec) }
19 });
20 value.map_ok(move |vec| (name, vec))
21 })
22 .try_collect()
23 .await
24 .map_err(|e| {
25 panic!("multipart error: {:?}", e);
26 });
27 part
28 }
29 });
30
31 let boundary = "--abcdef1234--";
32 let body = format!(
33 "\
34 --{0}\r\n\
35 content-disposition: form-data; name=\"foo\"\r\n\r\n\
36 bar\r\n\
37 --{0}--\r\n\
38 ",
39 boundary
40 );
41
42 let req = warp::test::request()
43 .method("POST")
44 .header("content-length", body.len())
45 .header(
46 "content-type",
47 format!("multipart/form-data; boundary={}", boundary),
48 )
49 .body(body);
50
51 let vec = req.filter(&route).await.unwrap();
52 assert_eq!(&vec[0].0, "foo");
53 assert_eq!(&vec[0].1, b"bar");
54 }
55