| 127 | } |
| 128 | |
| 129 | async fn extract_image( |
| 130 | mime: Mime, |
| 131 | body: impl Stream<Item = Result<impl Buf, rweb::Error>>, |
| 132 | ) -> Result<Image, Rejection> { |
| 133 | if mime == mime::IMAGE_STAR { |
| 134 | let mut buf = Vec::with_capacity(1024 * 1024 * 3); |
| 135 | pin_mut!(body); |
| 136 | while let Some(inner) = body.next().await { |
| 137 | let inner = inner.map_err(reject_cause)?; |
| 138 | buf.write_all(inner.chunk()).await.map_err(reject_cause)?; |
| 139 | } |
| 140 | |
| 141 | use image::io::Reader as ImageReader; |
| 142 | let reader = ImageReader::new(Cursor::new(buf)) |
| 143 | .with_guessed_format() |
| 144 | .map_err(reject_cause)?; |
| 145 | let image = Image(reader.decode().map_err(reject_cause)?); |
| 146 | Ok(image) |
| 147 | } else { |
| 148 | Err(rweb::reject::reject()) |
| 149 | } |
| 150 | } |