1
use std::{collections::HashMap, sync::Mutex};
2

            
3
use actix_web::{
4
    get, middleware, post, web, App, HttpRequest, HttpResponse, HttpServer, Responder,
5
};
6

            
7
struct AppState {
8
    programs: Mutex<HashMap<String, Vec<u8>>>,
9
}
10

            
11
#[post("/{name}")]
12
async fn receive_bytes(
13
    _req: HttpRequest,
14
    name: web::Path<String>,
15
    data: web::Data<AppState>,
16
    payload: web::Payload,
17
) -> impl Responder {
18
    let bytes = payload.to_bytes().await.unwrap();
19
    let mut programs = data.programs.lock().unwrap();
20
    programs.insert(name.to_string(), bytes.to_vec());
21
    println!("Received {} bytes for {}", bytes.len(), name);
22

            
23
    HttpResponse::Ok()
24
}
25

            
26
#[get("/{name}")]
27
async fn send_bytes(
28
    _req: HttpRequest,
29
    name: web::Path<String>,
30
    data: web::Data<AppState>,
31
) -> impl Responder {
32
    let programs = data.programs.lock().unwrap();
33
    let bytes = programs.get(name.as_str()).unwrap();
34
    println!("Sent {} bytes for {}", bytes.len(), name);
35

            
36
    HttpResponse::Ok().body(bytes.clone())
37
}
38

            
39
#[actix_web::main]
40
async fn main() -> std::io::Result<()> {
41
    let bind_address = "0.0.0.0:8080";
42
    let shared_state = web::Data::new(AppState {
43
        programs: Mutex::new(HashMap::new()),
44
    });
45
    let server = HttpServer::new(move || {
46
        App::new()
47
            .app_data(shared_state.clone())
48
            .wrap(middleware::DefaultHeaders::new().add(("X-Version", "0.2")))
49
            .wrap(middleware::Compress::default())
50
            .wrap(middleware::Logger::default().log_target("http_log"))
51
            .service(receive_bytes)
52
            .service(send_bytes)
53
    })
54
    .workers(1)
55
    .bind(bind_address)?
56
    .run();
57

            
58
    println!("Server is running on {}", bind_address);
59

            
60
    server.await
61
}