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