about summary refs log tree commit diff
path: root/kittybox-rs/src/media/mod.rs
blob: 0d46e0c1ec3614d9a5f34dcc314844a92a04c042 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
use futures_util::StreamExt;
use bytes::buf::Buf;
use warp::{Filter, Rejection, Reply, multipart::{FormData, Part}};

pub fn query() -> impl Filter<Extract = (impl Reply,), Error = Rejection> + Clone {
    warp::get()
        .and(crate::util::require_host())
        .map(|host| "media endpoint query...")
}

pub fn options() -> impl Filter<Extract = (impl Reply,), Error = Rejection> + Clone {
    warp::options()
        .map(|| warp::reply::json::<Option<()>>(&None))
        .with(warp::reply::with::header("Allow", "GET, POST"))
}

pub fn upload() -> impl Filter<Extract = (impl Reply,), Error = Rejection> + Clone {
    warp::post()
        .and(crate::util::require_host())
        .and(warp::multipart::form().max_length(1024*1024*150/*mb*/))
        .and_then(|host, mut form: FormData| async move {
            // TODO get rid of the double unwrap() here
            let file: Part = form.next().await.unwrap().unwrap();
            log::debug!("Uploaded: {:?}, type: {:?}", file.filename(), file.content_type());

            let mut data = file.stream();
            while let Some(buf) = data.next().await {
                // TODO save it into a file
                log::debug!("buffer length: {:?}", buf.map(|b| b.remaining()));
            }
            Ok::<_, warp::Rejection>(warp::reply::with_header(
                warp::reply::with_status(
                    "",
                    warp::http::StatusCode::CREATED
                ),
                "Location",
                "./awoo.png"
            ))
        })
}

pub fn media() -> impl Filter<Extract = (impl Reply,), Error = Rejection> + Clone {
    upload()
        .or(query())
        .or(options())
}