1
1
//! Multipart/form-data types.
2
2
//!
3
+ //! # Specifications
4
+ //!
5
+ //! [RFC 2046, section 5.1: Multipart Media Type](https://tools.ietf.org/html/rfc2046#section-5.1)
6
+ //! [RFC 2388: Returning Values from Forms: multipart/form-data](https://tools.ietf.org/html/rfc2388)
7
+ //! [RFC 7578: Returning Values from Forms: multipart/form-data](https://tools.ietf.org/html/rfc7578)
8
+ //!
3
9
//! # Examples
4
10
//!
5
11
//! Request:
12
+ //!
6
13
//! ```
7
14
//! use http_types::multipart::{Multipart, Entry};
8
15
//!
27
34
//! let mut entries = res.body_multipart();
28
35
//! while let Some(entry) = entries.await {
29
36
//! println!("name: {}", entry.name());
30
- //! println!("data: {}", entry.into_string()?);
37
+ //! println!("data: {}", entry.into_string().await ?);
31
38
//! }
32
39
//! ```
33
40
@@ -38,7 +45,6 @@ use std::{fmt::Debug, pin::Pin, str::FromStr};
38
45
39
46
use futures_core:: stream:: Stream ;
40
47
use futures_lite:: { io, prelude:: * } ;
41
- use futures_util:: stream:: TryStreamExt ;
42
48
use multipart:: server:: Multipart as Parser ;
43
49
44
50
use crate :: mime;
@@ -133,7 +139,9 @@ impl Stream for Multipart {
133
139
if let Some ( mime) = mime {
134
140
entry. set_mime ( mime) ;
135
141
} else {
136
- // https://tools.ietf.org/html/rfc7578#section-4.4
142
+ // Each part MAY have an (optional) "Content-Type" header
143
+ // field, which defaults to "text/plain".
144
+ // src: https://tools.ietf.org/html/rfc7578#section-4.4
137
145
entry. set_mime ( mime:: PLAIN ) ;
138
146
}
139
147
@@ -149,83 +157,35 @@ impl Stream for Multipart {
149
157
}
150
158
}
151
159
152
- // struct MultipartReader {
153
- // entry_iter: Box<dyn Iterator<Item = Entry>>,
154
- // }
155
-
156
- // impl From<Multipart> for MultipartReader {
157
- // fn from(multipart: Multipart) -> Self {
158
- // Self {
159
- // entry_iter: Box::new(multipart.entries.into_iter())
160
- // }
161
- // }
162
- // }
163
-
164
- // impl AsyncRead for MultipartReader {
165
- // #[allow(missing_doc_code_examples)]
166
- // fn poll_read(
167
- // mut self: Pin<&mut Self>,
168
- // cx: &mut Context<'_>,
169
- // buf: &mut [u8],
170
- // ) -> Poll<io::Result<usize>> {
171
- // if let Some(entry) = self.entry_iter.next() {
172
- // Pin::new(&mut entry).poll_read(cx, buf)
173
- // } else {
174
- // Poll::Ready()
175
- // }
176
- // }
177
- // }
178
-
179
- // impl AsyncBufRead for MultipartReader {
180
- // #[allow(missing_doc_code_examples)]
181
- // fn poll_fill_buf(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<&'_ [u8]>> {
182
- // let this = self.project();
183
- // this.reader.poll_fill_buf(cx)
184
- // }
185
-
186
- // fn consume(mut self: Pin<&mut Self>, amt: usize) {
187
- // Pin::new(&mut self.reader).consume(amt)
188
- // }
189
- // }
190
-
191
- // We need AsRef<[u8]> on BufReader for TryStreamExt (into_async_read) so... wrap and patch it in ourselves, for now.
192
- #[ doc( hidden) ]
193
- #[ derive( Debug ) ]
194
- pub struct BufReader < R : AsyncRead > {
195
- inner : io:: BufReader < R > ,
160
+ struct MultipartReader {
161
+ entry_iter : Box < dyn Iterator < Item = Entry > > ,
196
162
}
197
163
198
- #[ doc( hidden) ]
199
- impl < R : AsyncRead > BufReader < R > {
200
- #[ allow( missing_doc_code_examples) ]
201
- #[ doc( hidden) ]
202
- pub fn new ( inner : R ) -> Self {
164
+ impl From < Multipart > for MultipartReader {
165
+ fn from ( multipart : Multipart ) -> Self {
203
166
Self {
204
- inner : io :: BufReader :: new ( inner ) ,
167
+ entry_iter : Box :: new ( multipart . entries . into_iter ( ) ) ,
205
168
}
206
169
}
207
170
}
208
171
209
- #[ doc( hidden) ]
210
- impl < R : AsyncRead > AsRef < [ u8 ] > for BufReader < R > {
172
+ impl AsyncRead for MultipartReader {
211
173
#[ allow( missing_doc_code_examples) ]
212
- #[ doc( hidden) ]
213
- fn as_ref ( & self ) -> & [ u8 ] {
214
- self . inner . buffer ( )
174
+ fn poll_read (
175
+ mut self : Pin < & mut Self > ,
176
+ cx : & mut Context < ' _ > ,
177
+ buf : & mut [ u8 ] ,
178
+ ) -> Poll < io:: Result < usize > > {
179
+ if let Some ( mut entry) = self . entry_iter . next ( ) {
180
+ Pin :: new ( & mut entry) . poll_read ( cx, buf)
181
+ } else {
182
+ todo ! ( ) ;
183
+ }
215
184
}
216
185
}
217
186
218
187
impl From < Multipart > for Body {
219
- fn from ( multipart : Multipart ) -> Self {
220
- let stream = multipart. map ( |maybe_entry| {
221
- maybe_entry
222
- . map ( BufReader :: new)
223
- . map_err ( |err| {
224
- std:: io:: Error :: new ( std:: io:: ErrorKind :: Other , err. to_string ( ) )
225
- } )
226
- } ) ;
227
- let mut body = Body :: from_reader ( io:: BufReader :: new ( stream. into_async_read ( ) ) , None ) ;
228
- body. set_mime ( mime:: MULTIPART_FORM ) ;
229
- body
188
+ fn from ( _multipart : Multipart ) -> Self {
189
+ todo ! ( ) ;
230
190
}
231
191
}
0 commit comments